choc buttons take 1
This commit is contained in:
parent
dca0f13ed3
commit
f962f4604b
|
@ -0,0 +1,89 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/deadsy/sdfx/sdf"
|
||||||
|
v2 "github.com/deadsy/sdfx/vec/v2"
|
||||||
|
v3 "github.com/deadsy/sdfx/vec/v3"
|
||||||
|
)
|
||||||
|
|
||||||
|
// button interface impliments the 3 seperate sections of a choc keycap
|
||||||
|
type button interface {
|
||||||
|
Rim2D(size float64) sdf.SDF2
|
||||||
|
Top2D(size float64) sdf.SDF2
|
||||||
|
Size() float64
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3D
|
||||||
|
|
||||||
|
// create combines all the 2d parts of a choc buttons and creates a 3d model of the button
|
||||||
|
func create(b button) sdf.SDF3 {
|
||||||
|
top, err := sdf.ExtrudeRounded3D(b.Top2D(b.Size()-ROUND*2), TOP_Z, ROUND)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
mid, err := sdf.ExtrudeRounded3D(b.Rim2D(b.Size()-ROUND*2), MID_Z, ROUND)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
stem := stem()
|
||||||
|
|
||||||
|
button := sdf.Union3D(
|
||||||
|
sdf.Transform3D(top, sdf.Translate3d(v3.Vec{X: 0, Y: 0, Z: -STEM_Z/2 + TOP_Z/2})),
|
||||||
|
sdf.Transform3D(mid, sdf.Translate3d(v3.Vec{X: 0, Y: 0, Z: -STEM_Z/2 + MID_Z/2})),
|
||||||
|
sdf.Transform3D(stem, sdf.Translate3d(v3.Vec{X: 0, Y: 0, Z: TOP_Z / 3})),
|
||||||
|
)
|
||||||
|
|
||||||
|
//button = sdf.Transform3D(button, sdf.RotateX(sdf.DtoR(180)))
|
||||||
|
return button
|
||||||
|
}
|
||||||
|
|
||||||
|
// stem is the 2d stem of the button
|
||||||
|
func stem() sdf.SDF3 {
|
||||||
|
stem2D := stem2D()
|
||||||
|
stem := sdf.Extrude3D(stem2D, STEM_Z)
|
||||||
|
// this was intended to make it easier to print vertically, but i later gave up on the idea.
|
||||||
|
// you can use this to narrow the stem towards the end so that its a smaller surface area that is easier to remove from supports
|
||||||
|
/* cutoutDiameter := 1.0
|
||||||
|
cutout2D, err := sdf.Circle2D(cutoutDiameter / 2)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
cutout2D = sdf.Union2D(
|
||||||
|
sdf.Transform2D(cutout2D, sdf.Translate2d(v2.Vec{X: stem2D.BoundingBox().Size().Y / 2, Y: -stem2D.BoundingBox().Size().Y - (-cutoutDiameter / 4)})),
|
||||||
|
sdf.Transform2D(cutout2D, sdf.Translate2d(v2.Vec{X: -stem2D.BoundingBox().Size().Y / 2, Y: -stem2D.BoundingBox().Size().Y - (-cutoutDiameter / 4)})),
|
||||||
|
)
|
||||||
|
|
||||||
|
cutout := sdf.Extrude3D(cutout2D, stem2D.BoundingBox().Size().X*2)
|
||||||
|
cutout = sdf.Transform3D(cutout, sdf.RotateY(sdf.DtoR(90)))
|
||||||
|
cutout = sdf.Transform3D(cutout, sdf.RotateX(sdf.DtoR(90)))
|
||||||
|
|
||||||
|
cutout = sdf.Union3D(
|
||||||
|
sdf.Transform3D(cutout, sdf.Translate3d(v3.Vec{X: 0, Y: stem2D.BoundingBox().Size().X / 2, Z: 0})),
|
||||||
|
sdf.Transform3D(cutout, sdf.Translate3d(v3.Vec{X: 0, Y: -stem2D.BoundingBox().Size().X / 2, Z: 0})),
|
||||||
|
)
|
||||||
|
stem = sdf.Difference3D(stem, cutout) */
|
||||||
|
return stem
|
||||||
|
}
|
||||||
|
|
||||||
|
//2D
|
||||||
|
|
||||||
|
// stem2D is a top down view of the keycap's stem, it has cutouts to make it easier to remove/insert the keycap from the stem.
|
||||||
|
// This is supposed to make it less likely you'll break the stem removing it.
|
||||||
|
func stem2D() sdf.SDF2 {
|
||||||
|
x, y := 1.1, 2.8
|
||||||
|
spacing := 5.8
|
||||||
|
cutout := sdf.Box2D(v2.Vec{X: x / 1.8, Y: y / 1.5}, 0)
|
||||||
|
stem := sdf.Box2D(v2.Vec{X: x, Y: y}, 0)
|
||||||
|
cutout = sdf.Union2D(
|
||||||
|
sdf.Transform2D(cutout, sdf.Translate2d(v2.Vec{X: -x / 2, Y: 0})),
|
||||||
|
sdf.Transform2D(cutout, sdf.Translate2d(v2.Vec{X: x / 2, Y: 0})),
|
||||||
|
)
|
||||||
|
stem = sdf.Difference2D(stem, cutout)
|
||||||
|
stems := sdf.Union2D(
|
||||||
|
sdf.Transform2D(stem, sdf.Translate2d(v2.Vec{X: -spacing / 2, Y: 0})),
|
||||||
|
sdf.Transform2D(stem, sdf.Translate2d(v2.Vec{X: spacing / 2, Y: 0})),
|
||||||
|
)
|
||||||
|
return sdf.Center2D(stems)
|
||||||
|
}
|
Binary file not shown.
|
@ -0,0 +1,43 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/deadsy/sdfx/sdf"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Circle struct {
|
||||||
|
size float64
|
||||||
|
rimSize float64
|
||||||
|
}
|
||||||
|
|
||||||
|
// member functions
|
||||||
|
|
||||||
|
func (c Circle) Top2D(size float64) sdf.SDF2 {
|
||||||
|
circle, err := sdf.Circle2D(size / 2)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
return circle
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Circle) Rim2D(size float64) sdf.SDF2 {
|
||||||
|
rimNegative, err := sdf.Circle2D((size - c.rimSize) / 2)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
return sdf.Difference2D(c.Top2D(size), rimNegative)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Circle) Size() float64 {
|
||||||
|
return c.size
|
||||||
|
}
|
||||||
|
|
||||||
|
// new
|
||||||
|
|
||||||
|
func circleNew(size, rimSize float64) Circle {
|
||||||
|
var c Circle
|
||||||
|
c.size = size
|
||||||
|
c.rimSize = rimSize
|
||||||
|
return c
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
module git.jade.moe/oct2pus/arcade/choc-caps
|
||||||
|
|
||||||
|
go 1.19
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b // indirect
|
||||||
|
github.com/deadsy/sdfx v0.0.0-20230124001612-cfdc46c611ed // indirect
|
||||||
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
|
||||||
|
github.com/hpinc/go3mf v0.24.1 // indirect
|
||||||
|
github.com/llgcode/draw2d v0.0.0-20210904075650-80aa0a2a901d // indirect
|
||||||
|
github.com/qmuntal/opc v0.7.10 // indirect
|
||||||
|
github.com/yofu/dxf v0.0.0-20190710012328-5a6d1e83f16c // indirect
|
||||||
|
golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 // indirect
|
||||||
|
gonum.org/v1/gonum v0.12.0 // indirect
|
||||||
|
)
|
|
@ -0,0 +1,135 @@
|
||||||
|
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||||
|
gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
|
||||||
|
git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=
|
||||||
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
|
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||||
|
github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=
|
||||||
|
github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=
|
||||||
|
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
|
||||||
|
github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b h1:slYM766cy2nI3BwyRiyQj/Ud48djTMtMebDqepE95rw=
|
||||||
|
github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=
|
||||||
|
github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
|
||||||
|
github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/deadsy/sdfx v0.0.0-20230124001612-cfdc46c611ed h1:ICCc8L4udEjvRqcWYiiE3REieslesgeB30qUHfcn7QM=
|
||||||
|
github.com/deadsy/sdfx v0.0.0-20230124001612-cfdc46c611ed/go.mod h1:yqeU6qWfzYX7lxp9/60IuMWropG47IWaq+hPXZndVwQ=
|
||||||
|
github.com/dhconnelly/rtreego v1.1.0/go.mod h1:SDozu0Fjy17XH1svEXJgdYq8Tah6Zjfa/4Q33Z80+KM=
|
||||||
|
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
|
||||||
|
github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
|
||||||
|
github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=
|
||||||
|
github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=
|
||||||
|
github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=
|
||||||
|
github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=
|
||||||
|
github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=
|
||||||
|
github.com/go-gl/gl v0.0.0-20180407155706-68e253793080/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk=
|
||||||
|
github.com/go-gl/glfw v0.0.0-20180426074136-46a8d530c326/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||||
|
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||||
|
github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=
|
||||||
|
github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=
|
||||||
|
github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=
|
||||||
|
github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=
|
||||||
|
github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8=
|
||||||
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
|
||||||
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
||||||
|
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
|
||||||
|
github.com/hpinc/go3mf v0.24.1 h1:DPZ0bSlvMuqaCcmzjt5DxryV42zTZ+S+Rfv+dcBE/lA=
|
||||||
|
github.com/hpinc/go3mf v0.24.1/go.mod h1:QtHqY8cmfyaSuT4J+fi6UTIQPzqxBdvlSwWzcLlmeQI=
|
||||||
|
github.com/hschendel/stl v1.0.4/go.mod h1:XQFFLKrq9YTaBpmouDui4JSaxMyAYkpD7elGSSj/y3M=
|
||||||
|
github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
|
||||||
|
github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
|
||||||
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
|
github.com/llgcode/draw2d v0.0.0-20210904075650-80aa0a2a901d h1:4/ycg+VrwjGurTqiHv2xM/h6Qm81qSra+KbfT4FH2FA=
|
||||||
|
github.com/llgcode/draw2d v0.0.0-20210904075650-80aa0a2a901d/go.mod h1:mVa0dA29Db2S4LVqDYLlsePDzRJLDfdhVZiI15uY0FA=
|
||||||
|
github.com/llgcode/ps v0.0.0-20150911083025-f1443b32eedb/go.mod h1:1l8ky+Ew27CMX29uG+a2hNOKpeNYEQjjtiALiBlFQbY=
|
||||||
|
github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=
|
||||||
|
github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
|
||||||
|
github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
|
||||||
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/qmuntal/opc v0.7.10 h1:zbUhx7/qDcgJCQahz2SHV9HHLBKgtaaFWNxEMmXPKAs=
|
||||||
|
github.com/qmuntal/opc v0.7.10/go.mod h1:jYcgCT/xuTl5oMYeS/nSrfRe9gNrrsAPPeOFE2oRVaQ=
|
||||||
|
github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=
|
||||||
|
github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/yofu/dxf v0.0.0-20190710012328-5a6d1e83f16c h1:qgsxLgTXCVH8Dxar36HI5af2ZfinVz5vF8erPpyzM+A=
|
||||||
|
github.com/yofu/dxf v0.0.0-20190710012328-5a6d1e83f16c/go.mod h1:gnT4GQzgKW8+TLI0xheUgdmNV4dsAN0WJUVnztRZkfI=
|
||||||
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
|
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
|
golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
|
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
|
golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=
|
||||||
|
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
|
||||||
|
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||||
|
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
|
golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
|
golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
|
golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
|
golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
|
golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
|
golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
|
golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
|
||||||
|
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
|
||||||
|
golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
|
||||||
|
golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
|
||||||
|
golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 h1:Lj6HJGCSn5AjxRAH2+r35Mir4icalbqku+CLUtjnvXY=
|
||||||
|
golang.org/x/image v0.0.0-20220902085622-e7cb96979f69/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY=
|
||||||
|
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
||||||
|
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
|
||||||
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
|
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
|
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
|
||||||
|
golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
|
||||||
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
|
||||||
|
gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=
|
||||||
|
gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=
|
||||||
|
gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o=
|
||||||
|
gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=
|
||||||
|
gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
|
||||||
|
gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
|
||||||
|
gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=
|
||||||
|
gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
|
||||||
|
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
|
|
@ -0,0 +1,48 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/deadsy/sdfx/render"
|
||||||
|
"github.com/deadsy/sdfx/render/dc"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// these values are designed to fit into the default flatbox,
|
||||||
|
// tinker with the values to find the size you need.
|
||||||
|
// as a note, buttons come out 0.75 mm wider than expected, size yours accordingly.
|
||||||
|
OCTOGON_SIZE_SMALL = 20.25
|
||||||
|
OCTOGON_SIZE_LARGE = 25.75
|
||||||
|
CIRCLE_SIZE_SMALL = 22.5
|
||||||
|
CIRCLE_SIZE_LARGE = 28.5
|
||||||
|
// A larger value equals a wider rim, this is subtractive.
|
||||||
|
RIM_SIZE = 1.0
|
||||||
|
// These control how tall each individual element is. Keep in mind these values are absolute,
|
||||||
|
// not relative. For example, the default MID_Z extends 2.0mm past the TOP_Z.
|
||||||
|
TOP_Z = 1.5
|
||||||
|
MID_Z = 3.5
|
||||||
|
STEM_Z = 5
|
||||||
|
// ROUND determines the radius of curves, 0 is sharp edges.
|
||||||
|
// WARNING: this will mess with your size values as well. the 0.75mm wider models as a result
|
||||||
|
// of the 0.5 round.
|
||||||
|
// keep that in mind if you're modifying this program.
|
||||||
|
// each individual Z height *must* be greater than round * 2.
|
||||||
|
ROUND = 0.5
|
||||||
|
)
|
||||||
|
|
||||||
|
// Larger values in render.ToSTL will produce higher quality models, but also larger filesizes
|
||||||
|
// the larger you make it, the more computationally intensive it is.
|
||||||
|
// this model uses dc.NewDualContouringDefault
|
||||||
|
// this renders very slowly and is more computationally intensive
|
||||||
|
// than two other renderers. i find it has the best visual clarity when 300 or above
|
||||||
|
// which produces a smaller filesize that I can actually share online
|
||||||
|
// the other two renderers are render.NewMarchingCubesOctree and NewMarchingCubesUniform
|
||||||
|
// they compile faster but need significantly higher values for acceptable clarity,
|
||||||
|
// which in turn creates significantly larger file sizes.
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
oS, oL := octogonNew(OCTOGON_SIZE_SMALL, RIM_SIZE), octogonNew(OCTOGON_SIZE_LARGE, RIM_SIZE)
|
||||||
|
cS, cL := circleNew(CIRCLE_SIZE_SMALL, RIM_SIZE), circleNew(CIRCLE_SIZE_LARGE, RIM_SIZE)
|
||||||
|
render.ToSTL(create(cS), "circularSmall.stl", dc.NewDualContouringDefault(300))
|
||||||
|
render.ToSTL(create(cL), "circularLarge.stl", dc.NewDualContouringDefault(300))
|
||||||
|
render.ToSTL(create(oS), "octogonalSmall.stl", dc.NewDualContouringDefault(300))
|
||||||
|
render.ToSTL(create(oL), "octogonalLarge.stl", dc.NewDualContouringDefault(300))
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/deadsy/sdfx/sdf"
|
||||||
|
v2 "github.com/deadsy/sdfx/vec/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Octogon impliments the button interface, which is designed to create an octogonal button.
|
||||||
|
type Octogon struct {
|
||||||
|
size float64
|
||||||
|
rimSize float64
|
||||||
|
}
|
||||||
|
|
||||||
|
// member functions
|
||||||
|
|
||||||
|
// Top2D is a topdown view of the top of a keycap.
|
||||||
|
func (o Octogon) Top2D(size float64) sdf.SDF2 {
|
||||||
|
return octogon(size, size)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rim2D is a topdown view of the sides of a keycap.
|
||||||
|
func (o Octogon) Rim2D(size float64) sdf.SDF2 {
|
||||||
|
rimNegative := octogon(size-o.rimSize, size-o.rimSize)
|
||||||
|
return sdf.Difference2D(o.Top2D(size), rimNegative)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Size returns the size value of the Octogon struct.
|
||||||
|
func (o Octogon) Size() float64 {
|
||||||
|
return o.size
|
||||||
|
}
|
||||||
|
|
||||||
|
// new
|
||||||
|
|
||||||
|
// octogonNew creates an Octogon struct, which impliments the button interface.
|
||||||
|
func octogonNew(size, rimSize float64) Octogon {
|
||||||
|
var o Octogon
|
||||||
|
o.size = size
|
||||||
|
o.rimSize = rimSize
|
||||||
|
|
||||||
|
return o
|
||||||
|
}
|
||||||
|
|
||||||
|
// helper functions
|
||||||
|
|
||||||
|
// octogon draws an octogon in a 2D plane with a given X and Y value.
|
||||||
|
func octogon(X, Y float64) sdf.SDF2 {
|
||||||
|
dimensions := []v2.Vec{
|
||||||
|
{X: -X / 4, Y: -Y / 2},
|
||||||
|
{X: -X / 2, Y: -Y / 4},
|
||||||
|
{X: -X / 2, Y: Y / 4},
|
||||||
|
{X: -X / 4, Y: Y / 2},
|
||||||
|
{X: X / 4, Y: Y / 2},
|
||||||
|
{X: X / 2, Y: Y / 4},
|
||||||
|
{X: X / 2, Y: -Y / 4},
|
||||||
|
{X: X / 4, Y: -Y / 2},
|
||||||
|
}
|
||||||
|
octogon, err := sdf.Polygon2D(dimensions)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
return sdf.Center2D(octogon)
|
||||||
|
}
|
Loading…
Reference in New Issue