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)