packages feed

hcad-0.1: HCad/Nuts.hs

{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeInType #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RebindableSyntax #-}
module HCad.Nuts where

import Algebra.Linear
import Algebra.Classes
import Prelude hiding (Num(..),(/),divMod,div,recip,fromRational)
import Data.Foldable
import GHC.TypeLits
import Data.List (intercalate)
import Data.Kind (Type)
import Data.Type.Equality
import Unsafe.Coerce
import Data.Char (toLower)
import HCad.Part

data MNut a = MNut { mSize :: a
                   , mThreadPitch :: a
                   , mMaxFlatsDist :: a
                   , mMinFlatsDist :: a
                   , mMaxThickness :: a
                   , mMinThickness :: a}
m1_6,m2, m2_5, m3, m4, m5, m6, m8, m10, m12, m14, m16, m20, m24, m30, m36, m42, m48, m56, m64 :: Field a => MNut a 

m1_6  = MNut 1.6    0.35    3.2     3.02     1.3     1.05
m2    = MNut 2      0.4     4       3.82     1.6     1.35
m2_5  = MNut 2.5    0.45    5       4.82     2       1.75
m3    = MNut 3      0.5     5.5     5.32     2.4     2.15
m4    = MNut 4      0.7     7       6.78     3.2     2.9
m5    = MNut 5      0.8     8       7.78     4.7     4.4
m6    = MNut 6      1       10      9.78     5.2     4.9
m8    = MNut 8      1.25    13      12.73    6.8     6.44
m10   = MNut 10     1.5     16      15.73    8.4     8.04
m12   = MNut 12     1.75    18      17.73    10.8    10.37
m14   = MNut 14     2       21      20.67    12.8    12.1
m16   = MNut 16     2       24      23.67    14.8    14.1
m20   = MNut 20     2.5     30      29.16    18      16.9
m24   = MNut 24     3       36      35       21.5    20.2
m30   = MNut 30     3.5     46      45       25.6    24.3
m36   = MNut 36     4       55      53.8     31      29.4
m42   = MNut 42     4.5     65      63.1     34      32.4
m48   = MNut 48     5       75      73.1     38      36.4
m56   = MNut 56     5.5     85      82.8     45      43.4
m64   = MNut 64     6       95      92.8     51      49.1



metricNutProfile :: Floating a => Module a a => Show a => Field a => MNut a -> a -> Part '[] V2' a
metricNutProfile nut tol = scale flat2flat $ regularPolygonO 6
  where flat2flat = mMaxFlatsDist nut + tol

metricBoltProfile :: Floating a => Module a a => Show a => Field a => MNut a -> a -> Part '[] V2' a
metricBoltProfile m tol = scale (mSize m + tol) $ circle

metricNutSocket :: (Floating a, Show a, Module a a, Field a) => MNut a -> a -> a -> a -> Part3 xs a -> Part3 xs a
metricNutSocket m tol recess depth = push recess (metricNutProfile m tol) . push depth (metricBoltProfile m tol)