{
   "code" : "(\r\n~drawCogs= {|radius= 100, numCogs= 7, outer= 0.8, inner= 0.6, center= 0.3,\r\n\tcogOutsideShape= #[-0.2, 0.2], cogInsideShape= #[-0.1, 0.1], offset= 0|\r\n\tvar cogs= [\r\n\t\tPoint(1, cogOutsideShape[0])*outer,\r\n\t\tPoint(1, cogOutsideShape[1])*outer,\r\n\t\tPoint(1, cogInsideShape[0])*inner,\r\n\t\tPoint(1, cogInsideShape[1])*inner\r\n\t]*radius;\r\n\tPen.strokeOval(Rect.aboutPoint(Point(0, 0), center*radius, center*radius));\r\n\tnumCogs.do{\r\n\t\tPen.moveTo(cogs[0]);\r\n\t\tPen.lineTo(cogs[1]);\r\n\t\tcogs= cogs.collect{|p| p.rotate(pi/numCogs+offset)};\r\n\t\tPen.lineTo(cogs[2]);\r\n\t\tPen.lineTo(cogs[3]);\r\n\t\tcogs= cogs.collect{|p| p.rotate(pi/numCogs+offset)};\r\n\t\tPen.lineTo(cogs[0]);\r\n\t\tPen.lineTo(cogs[1]);\r\n\t\tPen.stroke;\r\n\t};\r\n};\r\n)\r\n\r\n\r\n//--used as a button 'settings' icon\r\n(\r\nvar size= Size(22, 22);\r\nvar button;\r\nWindow().front.view.layout_(\r\n\tStackLayout(\r\n\t\tUserView().drawFunc_{|usr|\r\n\t\t\tPen.strokeColor= Color.black;\r\n\t\t\tPen.width= 1;\r\n\t\t\tPen.translate(size.width/2, size.height/2);\r\n\t\t\t~drawCogs.value(size.height/2, 8);\r\n\t\t}.acceptsMouse_(false).fixedSize_(size),\r\n\t\tbutton= Button().states_([]).fixedSize_(size)\r\n\t).mode_(\\stackAll)\r\n);\r\nbutton.action= {|view|\r\n\t\"bang\".postln;\r\n};\r\n)\r\n\r\n\r\n//--explorer\r\n(\r\nvar win= Window(\"cog wheel generator\", Rect(100, 100, 500, 500));\r\nvar usr;\r\nvar penWidthSlider, penWidthSpec= ControlSpec(0.1, 100, 'exp', 0, 10);\r\nvar numCogsSlider, numCogsSpec= ControlSpec(0, 20, 'lin', 1, 7);\r\nvar outerSlider, outerSpec= ControlSpec(0, 1, 'lin', 0, 0.8);\r\nvar innerSlider, innerSpec= ControlSpec(0, 1, 'lin', 0, 0.6);\r\nvar centerSlider, centerSpec= ControlSpec(0, 1, 'lin', 0, 0.3);\r\nvar outsideSlider, outsideSpec= ControlSpec(-1, 1, 'lin', 0, 0.2);\r\nvar insideSlider, insideSpec= ControlSpec(-1, 1, 'lin', 0, 0.1);\r\nvar offsetSlider, offsetSpec= ControlSpec(0, 2pi, 'lin', 0, 0);\r\nvar penJoinPopup, postButton, automateButton, autoRoutine;\r\nwin.view.layout_(VLayout(\r\n\tusr= UserView().fixedSize_(win.bounds.width, win.bounds.height*0.5).background_(Color.grey(0.9)),\r\n\tHLayout(penWidthSlider= Slider().orientation_(\\horizontal), StaticText().string_(\"penWidth\")),\r\n\tHLayout(numCogsSlider= Slider().orientation_(\\horizontal), StaticText().string_(\"numCogs\")),\r\n\tHLayout(outerSlider= Slider().orientation_(\\horizontal), StaticText().string_(\"outerRadius\")),\r\n\tHLayout(innerSlider= Slider().orientation_(\\horizontal), StaticText().string_(\"innerRadius\")),\r\n\tHLayout(centerSlider= Slider().orientation_(\\horizontal), StaticText().string_(\"centerRadius\")),\r\n\tHLayout(outsideSlider= RangeSlider().orientation_(\\horizontal), StaticText().string_(\"outsideShape\")),\r\n\tHLayout(insideSlider= RangeSlider().orientation_(\\horizontal), StaticText().string_(\"insideShape\")),\r\n\tHLayout(offsetSlider= Slider().orientation_(\\horizontal), StaticText().string_(\"offset\")),\r\n\tHLayout(penJoinPopup= PopUpMenu().items_([\"miter\", \"round\", \"bevel\"]), StaticText().string_(\"penJoin\")),\r\n\tHLayout(\r\n\t\tpostButton= Button().states_([[\"post\", Color.black]]),\r\n\t\tautomateButton= Button().states_([[\"auto\", Color.black], [\"auto\", Color.black, Color.white]])\r\n\t)\r\n));\r\nusr.drawFunc= {|usr|\r\n\tPen.width= penWidthSpec.map(penWidthSlider.value);\r\n\tPen.joinStyle= penJoinPopup.value;  //0, 1 or 2\r\n\tPen.strokeColor= Color.black;\r\n\tPen.translate(usr.bounds.width*0.5, usr.bounds.height*0.5);\r\n\t~drawCogs.value(\r\n\t\tusr.bounds.height*0.5,\r\n\t\tnumCogsSpec.map(numCogsSlider.value),\r\n\t\touterSpec.map(outerSlider.value),\r\n\t\tinnerSpec.map(innerSlider.value),\r\n\t\tcenterSpec.map(centerSlider.value),\r\n\t\t[outsideSpec.map(outsideSlider.lo), outsideSpec.map(outsideSlider.hi)],\r\n\t\t[insideSpec.map(insideSlider.lo), insideSpec.map(insideSlider.hi)],\r\n\t\toffsetSpec.map(offsetSlider.value)\r\n\t);\r\n};\r\nwin.view.allChildren.do{|view|\r\n\tif([Slider, RangeSlider, PopUpMenu].includes(view.class), {\r\n\t\tview.action_{usr.refresh}.fixedWidth_(win.bounds.width*0.8);\r\n\t});\r\n};\r\npenJoinPopup.value= 1;\r\npenWidthSlider.value= penWidthSpec.unmap(penWidthSpec.default);\r\nnumCogsSlider.value= numCogsSpec.unmap(numCogsSpec.default);\r\nouterSlider.value= outerSpec.unmap(outerSpec.default);\r\ninnerSlider.value= innerSpec.unmap(innerSpec.default);\r\ncenterSlider.value= centerSpec.unmap(centerSpec.default);\r\noutsideSlider.setSpan(*outsideSpec.unmap(outsideSpec.default*#[-1, 1]));\r\ninsideSlider.setSpan(*insideSpec.unmap(insideSpec.default*#[-1, 1]));\r\npostButton.action= {\r\n\t\"settings...\".postln;\r\n\t[\r\n\t\t[\\penJoin, penJoinPopup.value],\r\n\t\t[\\penWidth, penWidthSpec.map(penWidthSlider.value)],\r\n\t\t[\\numCogs, numCogsSpec.map(numCogsSlider.value)],\r\n\t\t[\\outer, outerSpec.map(outerSlider.value)],\r\n\t\t[\\inner, innerSpec.map(innerSlider.value)],\r\n\t\t[\\center, centerSpec.map(centerSlider.value)],\r\n\t\t[\\outside, outsideSpec.map([outsideSlider.lo, outsideSlider.hi])],\r\n\t\t[\\inside, insideSpec.map([insideSlider.lo, insideSlider.hi])],\r\n\t\t[\\offset, offsetSpec.map(offsetSlider.value)],\r\n\t].do{|x| x.postln};\r\n};\r\nautomateButton.action= {|view|\r\n\tif(view.value==1, {\r\n\t\tautoRoutine= Routine({\r\n\t\t\tusr.animate= true;\r\n\t\t\tinf.do{|i|\r\n\t\t\t\tpenWidthSlider.value= sin(i*0.01)/3+0.5;\r\n\t\t\t\tif(0.001.coin, {numCogsSlider.value= 1.0.linrand});\r\n\t\t\t\touterSlider.value= sin(i*0.024)/3+0.5;\r\n\t\t\t\tinnerSlider.value= sin(i*0.021)/3+0.4;\r\n\t\t\t\tcenterSlider.value= sin(i*0.0019)/3+0.3;\r\n\t\t\t\toutsideSlider.setSpan(sin(i*0.0017), sin(i*0.0015));\r\n\t\t\t\tinsideSlider.setSpan(sin(i*0.0014), sin(i*0.0013));\r\n\t\t\t\t60.reciprocal.wait;\r\n\t\t\t};\r\n\t\t}).play(AppClock);\r\n\t}, {\r\n\t\tusr.animate= false;\r\n\t\tautoRoutine.stop;\r\n\t});\r\n};\r\nCmdPeriod.doOnce({win.close});\r\nwin.front;\r\n)",
   "is_private" : null,
   "id" : "1-5bR",
   "labels" : [
      "gui",
      "animation",
      "icon"
   ],
   "description" : "for drawing cogwheel icons",
   "ancestor_list" : [],
   "author" : "redFrik",
   "name" : "cog wheels"
}
