// Do not edit this file; automatically generated by build.py. 'use strict'; /* Visual Blocks Language Copyright 2012 Google Inc. https://blockly.googlecode.com/ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ Blockly.OpenSCAD=new Blockly.Generator("OpenSCAD");Blockly.OpenSCAD.addReservedWords("Blockly,break,delete,for,function,if,return,intersection_for,union,difference,intersection,module,rotate,translate,mirror,minkowski,scale,resize,hull,use,assign,color,linear_extrude,rotate_extrude,twist-rotate-extrudeimport,sphere,cylinder,cube,square,circle,torus,twistytorus,null,true,false,undefapplicationCache,closed,Components,content,_content,controllers,crypto,defaultStatus,dialogArguments,directories,document,frameElement,frames,fullScreen,globalStorage,history,innerHeight,innerWidth,length,location,locationbar,localStorage,menubar,messageManager,mozAnimationStartTime,mozInnerScreenX,mozInnerScreenY,mozPaintCount,name,navigator,opener,outerHeight,outerWidth,pageXOffset,pageYOffset,parent,performance,personalbar,pkcs11,returnValue,screen,screenX,screenY,scrollbars,scrollMaxX,scrollMaxY,scrollX,scrollY,self,sessionStorage,sidebar,status,statusbar,toolbar,top,URL,window,addEventListener,alert,atob,back,blur,btoa,captureEvents,clearImmediate,clearInterval,clearTimeout,close,confirm,disableExternalCapture,dispatchEvent,dump,enableExternalCapture,escape,find,focus,forward,GeckoActiveXObject,getAttention,getAttentionWithCycleCount,getComputedStyle,getSelection,home,matchMedia,maximize,minimize,moveBy,moveTo,mozRequestAnimationFrame,open,openDialog,postMessage,print,prompt,QueryInterface,releaseEvents,removeEventListener,resizeBy,resizeTo,restore,routeEvent,scroll,scrollBy,scrollByLines,scrollByPages,scrollTo,setCursor,setImmediate,setInterval,setResizable,setTimeout,showModalDialog,sizeToContent,stop,unescape,updateCommands,XPCNativeWrapper,XPCSafeJSObjectWrapper,onabort,onbeforeunload,onblur,onchange,onclick,onclose,oncontextmenu,ondevicemotion,ondeviceorientation,ondragdrop,onerror,onfocus,onhashchange,onkeydown,onkeypress,onkeyup,onload,onmousedown,onmousemove,onmouseout,onmouseover,onmouseup,onmozbeforepaint,onpaint,onpopstate,onreset,onresize,onscroll,onselect,onsubmit,onunload,onpageshow,onpagehide,Image,Option,Worker,Event,Range,File,FileReader,Blob,BlobBuilder,Attr,CDATASection,CharacterData,Comment,console,DocumentFragment,DocumentType,DomConfiguration,DOMError,DOMErrorHandler,DOMException,DOMImplementation,DOMImplementationList,DOMImplementationRegistry,DOMImplementationSource,DOMLocator,DOMObject,DOMString,DOMStringList,DOMTimeStamp,DOMUserData,Entity,EntityReference,MediaQueryList,MediaQueryListListener,NameList,NamedNodeMap,Node,NodeFilter,NodeIterator,NodeList,Notation,Plugin,PluginArray,ProcessingInstruction,SharedWorker,Text,TimeRanges,Treewalker,TypeInfo,UserDataHandler,Worker,WorkerGlobalScope,HTMLDocument,HTMLElement,HTMLAnchorElement,HTMLAppletElement,HTMLAudioElement,HTMLAreaElement,HTMLBaseElement,HTMLBaseFontElement,HTMLBodyElement,HTMLBRElement,HTMLButtonElement,HTMLCanvasElement,HTMLDirectoryElement,HTMLDivElement,HTMLDListElement,HTMLEmbedElement,HTMLFieldSetElement,HTMLFontElement,HTMLFormElement,HTMLFrameElement,HTMLFrameSetElement,HTMLHeadElement,HTMLHeadingElement,HTMLHtmlElement,HTMLHRElement,HTMLIFrameElement,HTMLImageElement,HTMLInputElement,HTMLKeygenElement,HTMLLabelElement,HTMLLIElement,HTMLLinkElement,HTMLMapElement,HTMLMenuElement,HTMLMetaElement,HTMLModElement,HTMLObjectElement,HTMLOListElement,HTMLOptGroupElement,HTMLOptionElement,HTMLOutputElement,HTMLParagraphElement,HTMLParamElement,HTMLPreElement,HTMLQuoteElement,HTMLScriptElement,HTMLSelectElement,HTMLSourceElement,HTMLSpanElement,HTMLStyleElement,HTMLTableElement,HTMLTableCaptionElement,HTMLTableCellElement,HTMLTableDataCellElement,HTMLTableHeaderCellElement,HTMLTableColElement,HTMLTableRowElement,HTMLTableSectionElement,HTMLTextAreaElement,HTMLTimeElement,HTMLTitleElement,HTMLTrackElement,HTMLUListElement,HTMLUnknownElement,HTMLVideoElement,HTMLCanvasElement,CanvasRenderingContext2D,CanvasGradient,CanvasPattern,TextMetrics,ImageData,CanvasPixelArray,HTMLAudioElement,HTMLVideoElement,NotifyAudioAvailableEvent,HTMLCollection,HTMLAllCollection,HTMLFormControlsCollection,HTMLOptionsCollection,HTMLPropertiesCollection,DOMTokenList,DOMSettableTokenList,DOMStringMap,RadioNodeList,SVGDocument,SVGElement,SVGAElement,SVGAltGlyphElement,SVGAltGlyphDefElement,SVGAltGlyphItemElement,SVGAnimationElement,SVGAnimateElement,SVGAnimateColorElement,SVGAnimateMotionElement,SVGAnimateTransformElement,SVGSetElement,SVGCircleElement,SVGClipPathElement,SVGColorProfileElement,SVGCursorElement,SVGDefsElement,SVGDescElement,SVGEllipseElement,SVGFilterElement,SVGFilterPrimitiveStandardAttributes,SVGFEBlendElement,SVGFEColorMatrixElement,SVGFEComponentTransferElement,SVGFECompositeElement,SVGFEConvolveMatrixElement,SVGFEDiffuseLightingElement,SVGFEDisplacementMapElement,SVGFEDistantLightElement,SVGFEFloodElement,SVGFEGaussianBlurElement,SVGFEImageElement,SVGFEMergeElement,SVGFEMergeNodeElement,SVGFEMorphologyElement,SVGFEOffsetElement,SVGFEPointLightElement,SVGFESpecularLightingElement,SVGFESpotLightElement,SVGFETileElement,SVGFETurbulenceElement,SVGComponentTransferFunctionElement,SVGFEFuncRElement,SVGFEFuncGElement,SVGFEFuncBElement,SVGFEFuncAElement,SVGFontElement,SVGFontFaceElement,SVGFontFaceFormatElement,SVGFontFaceNameElement,SVGFontFaceSrcElement,SVGFontFaceUriElement,SVGForeignObjectElement,SVGGElement,SVGGlyphElement,SVGGlyphRefElement,SVGGradientElement,SVGLinearGradientElement,SVGRadialGradientElement,SVGHKernElement,SVGImageElement,SVGLineElement,SVGMarkerElement,SVGMaskElement,SVGMetadataElement,SVGMissingGlyphElement,SVGMPathElement,SVGPathElement,SVGPatternElement,SVGPolylineElement,SVGPolygonElement,SVGRectElement,SVGScriptElement,SVGStopElement,SVGStyleElement,SVGSVGElement,SVGSwitchElement,SVGSymbolElement,SVGTextElement,SVGTextPathElement,SVGTitleElement,SVGTRefElement,SVGTSpanElement,SVGUseElement,SVGViewElement,SVGVKernElement,SVGAngle,SVGColor,SVGICCColor,SVGElementInstance,SVGElementInstanceList,SVGLength,SVGLengthList,SVGMatrix,SVGNumber,SVGNumberList,SVGPaint,SVGPoint,SVGPointList,SVGPreserveAspectRatio,SVGRect,SVGStringList,SVGTransform,SVGTransformList,SVGAnimatedAngle,SVGAnimatedBoolean,SVGAnimatedEnumeration,SVGAnimatedInteger,SVGAnimatedLength,SVGAnimatedLengthList,SVGAnimatedNumber,SVGAnimatedNumberList,SVGAnimatedPreserveAspectRatio,SVGAnimatedRect,SVGAnimatedString,SVGAnimatedTransformList,SVGPathSegList,SVGPathSeg,SVGPathSegArcAbs,SVGPathSegArcRel,SVGPathSegClosePath,SVGPathSegCurvetoCubicAbs,SVGPathSegCurvetoCubicRel,SVGPathSegCurvetoCubicSmoothAbs,SVGPathSegCurvetoCubicSmoothRel,SVGPathSegCurvetoQuadraticAbs,SVGPathSegCurvetoQuadraticRel,SVGPathSegCurvetoQuadraticSmoothAbs,SVGPathSegCurvetoQuadraticSmoothRel,SVGPathSegLinetoAbs,SVGPathSegLinetoHorizontalAbs,SVGPathSegLinetoHorizontalRel,SVGPathSegLinetoRel,SVGPathSegLinetoVerticalAbs,SVGPathSegLinetoVerticalRel,SVGPathSegMovetoAbs,SVGPathSegMovetoRel,ElementTimeControl,TimeEvent,SVGAnimatedPathData,SVGAnimatedPoints,SVGColorProfileRule,SVGCSSRule,SVGExternalResourcesRequired,SVGFitToViewBox,SVGLangSpace,SVGLocatable,SVGRenderingIntent,SVGStylable,SVGTests,SVGTextContentElement,SVGTextPositioningElement,SVGTransformable,SVGUnitTypes,SVGURIReference,SVGViewSpec,SVGZoomAndPan"); Blockly.OpenSCAD.ORDER_ATOMIC=0;Blockly.OpenSCAD.ORDER_MEMBER=1;Blockly.OpenSCAD.ORDER_NEW=1;Blockly.OpenSCAD.ORDER_FUNCTION_CALL=2;Blockly.OpenSCAD.ORDER_INCREMENT=3;Blockly.OpenSCAD.ORDER_DECREMENT=3;Blockly.OpenSCAD.ORDER_LOGICAL_NOT=4;Blockly.OpenSCAD.ORDER_BITWISE_NOT=4;Blockly.OpenSCAD.ORDER_UNARY_PLUS=4;Blockly.OpenSCAD.ORDER_UNARY_NEGATION=4;Blockly.OpenSCAD.ORDER_TYPEOF=4;Blockly.OpenSCAD.ORDER_VOID=4;Blockly.OpenSCAD.ORDER_DELETE=4;Blockly.OpenSCAD.ORDER_MULTIPLICATION=5; Blockly.OpenSCAD.ORDER_DIVISION=5;Blockly.OpenSCAD.ORDER_MODULUS=5;Blockly.OpenSCAD.ORDER_ADDITION=6;Blockly.OpenSCAD.ORDER_SUBTRACTION=6;Blockly.OpenSCAD.ORDER_BITWISE_SHIFT=7;Blockly.OpenSCAD.ORDER_RELATIONAL=8;Blockly.OpenSCAD.ORDER_IN=8;Blockly.OpenSCAD.ORDER_INSTANCEOF=8;Blockly.OpenSCAD.ORDER_EQUALITY=9;Blockly.OpenSCAD.ORDER_BITWISE_AND=10;Blockly.OpenSCAD.ORDER_BITWISE_XOR=11;Blockly.OpenSCAD.ORDER_BITWISE_OR=12;Blockly.OpenSCAD.ORDER_LOGICAL_AND=13;Blockly.OpenSCAD.ORDER_LOGICAL_OR=14; Blockly.OpenSCAD.ORDER_CONDITIONAL=15;Blockly.OpenSCAD.ORDER_ASSIGNMENT=16;Blockly.OpenSCAD.ORDER_COMMA=17;Blockly.OpenSCAD.ORDER_NONE=99;Blockly.OpenSCAD.INFINITE_LOOP_TRAP=null; Blockly.OpenSCAD.init=function(a){Blockly.OpenSCAD.definitions_=Object.create(null);Blockly.OpenSCAD.functionNames_=Object.create(null);Blockly.OpenSCAD.variableDB_?Blockly.OpenSCAD.variableDB_.reset():Blockly.OpenSCAD.variableDB_=new Blockly.Names(Blockly.OpenSCAD.RESERVED_WORDS_);Blockly.Variables.allVariables(a);Blockly.OpenSCAD.definitions_.variables=""}; Blockly.OpenSCAD.finish=function(a){var b=[],c;for(c in Blockly.OpenSCAD.definitions_)b.push(Blockly.OpenSCAD.definitions_[c]);return"//!OpenSCAD\n\n"+b.join("\n")+"\n\n\n"+a};Blockly.OpenSCAD.scrubNakedValue=function(a){return a+";\n"};Blockly.OpenSCAD.quote_=function(a){a=a.replace(/\\/g,"\\\\").replace(/\n/g,"\\\n").replace(/"/g,'\\"');return'"'+a+'"'}; Blockly.OpenSCAD.scrub_=function(a,b){if(null===b)return"";var c="";if(!a.outputConnection||!a.outputConnection.targetConnection){var d=a.getCommentText();d&&(c+=this.prefixLines(d,"// ")+"\n");for(var e=0;e",GTE:">="}[a.getFieldValue("OP")],c="=="==b||"!="==b?Blockly.OpenSCAD.ORDER_EQUALITY:Blockly.OpenSCAD.ORDER_RELATIONAL,d=Blockly.OpenSCAD.valueToCode(a,"A",c)||"0",e=Blockly.OpenSCAD.valueToCode(a,"B",c)||"0",b=d+" "+b+" "+e;return a.getParent()?[b,c]:["//"+b,c]}; Blockly.OpenSCAD.logic_operation=function(a){var b="AND"==a.getFieldValue("OP")?"&&":"||",c="&&"==b?Blockly.OpenSCAD.ORDER_LOGICAL_AND:Blockly.OpenSCAD.ORDER_LOGICAL_OR,d=Blockly.OpenSCAD.valueToCode(a,"A",c),e=Blockly.OpenSCAD.valueToCode(a,"B",c);if(d||e){var g="&&"==b?"true":"false";d||(d=g);e||(e=g)}else e=d="false";b=d+" "+b+" "+e;return a.getParent()?[b,c]:["//"+b,c]}; Blockly.OpenSCAD.logic_negate=function(a){var b=Blockly.OpenSCAD.ORDER_LOGICAL_NOT,c="!"+(Blockly.OpenSCAD.valueToCode(a,"BOOL",b)||"true");return a.getParent()?[c,b]:["//"+c,b]};Blockly.OpenSCAD.logic_boolean=function(a){var b="TRUE"==a.getFieldValue("BOOL")?"true":"false";return a.getParent()?[b,Blockly.OpenSCAD.ORDER_ATOMIC]:["//"+b,Blockly.OpenSCAD.ORDER_ATOMIC]};Blockly.OpenSCAD.logic_null=function(a){return a.getParent()?["null",Blockly.OpenSCAD.ORDER_ATOMIC]:["//null",Blockly.OpenSCAD.ORDER_ATOMIC]}; Blockly.OpenSCAD.logic_ternary=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"IF",Blockly.OpenSCAD.ORDER_CONDITIONAL)||"false",c=Blockly.OpenSCAD.valueToCode(a,"THEN",Blockly.OpenSCAD.ORDER_CONDITIONAL)||"null",d=Blockly.OpenSCAD.valueToCode(a,"ELSE",Blockly.OpenSCAD.ORDER_CONDITIONAL)||"null",b=b+" ? "+c+" : "+d;return a.getParent()?[b,Blockly.OpenSCAD.ORDER_CONDITIONAL]:["//"+b,Blockly.OpenSCAD.ORDER_CONDITIONAL]};Blockly.OpenSCAD.loops={}; Blockly.OpenSCAD.controls_repeat_ext=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"TIMES",Blockly.OpenSCAD.ORDER_ASSIGNMENT)||"0",c=Blockly.OpenSCAD.statementToCode(a,"DO");Blockly.OpenSCAD.INFINITE_LOOP_TRAP&&(c=Blockly.OpenSCAD.INFINITE_LOOP_TRAP.replace(/%1/g,"'"+a.id+"'")+c);a="";var d=Blockly.OpenSCAD.variableDB_.getDistinctName("count",Blockly.Variables.NAME_TYPE),e=b-1;b.match(/^\w+$/)||Blockly.isNumber(b)||(e=Blockly.OpenSCAD.variableDB_.getDistinctName("repeat_end",Blockly.Variables.NAME_TYPE), a+="var "+e+" = "+b+";\n");return a+"union() { //end assign\n"+("for ("+d+" = [0 : "+e+"]) {\n"+c+"}\n")+"} //end assign\n"}; Blockly.OpenSCAD.controls_for=function(a){var b=Blockly.OpenSCAD.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.OpenSCAD.valueToCode(a,"FROM",Blockly.OpenSCAD.ORDER_ASSIGNMENT),d=Blockly.OpenSCAD.valueToCode(a,"TO",Blockly.OpenSCAD.ORDER_ASSIGNMENT),e=Blockly.OpenSCAD.valueToCode(a,"BY",Blockly.OpenSCAD.ORDER_ASSIGNMENT),g=Blockly.OpenSCAD.statementToCode(a,"DO"),f=a.getFieldValue("HULL"),h=0;c||(c="0",h=1);d||(d="0",h=1);e||(e="1",h=1);Blockly.OpenSCAD.INFINITE_LOOP_TRAP&& (g=Blockly.OpenSCAD.INFINITE_LOOP_TRAP.replace(/%1/g,"'"+a.id+"'")+g);h&&Blockscad.missingFields.push(a.id);var h="",k=Blockly.OpenSCAD.returnVarCode(a);a=k[0];k=k[1];"FALSE"==f?h=h+"union() { //end assign\n"+("for ("+b+" = ["+c+" : abs("+e+") : "+d+"]")+(") {\n"+a+g+"\n"+k+"}\n"):(f=g.replace(new RegExp("([^a-z|A-Z])"+b+"(?![a-z|A-Z])","g"),"$1"+("("+b+" + "+e+")")),h="// chain hull\nunion() { //end assign\n"+("for ("+b+" = ["+c+" : abs("+e+") : "+d+" - "+e+"]")+(") {\n"+a+" hull() {\n"+g+"\n"+ f+"\n } // end hull (in loop)\n "+k+"} // end loop\n"));return h+"} //end assign\n"}; Blockly.OpenSCAD.controls_for_chainhull=function(a){var b=Blockly.OpenSCAD.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.OpenSCAD.valueToCode(a,"FROM",Blockly.OpenSCAD.ORDER_ASSIGNMENT),d=Blockly.OpenSCAD.valueToCode(a,"TO",Blockly.OpenSCAD.ORDER_ASSIGNMENT),e=Blockly.OpenSCAD.valueToCode(a,"BY",Blockly.OpenSCAD.ORDER_ASSIGNMENT),g=Blockly.OpenSCAD.statementToCode(a,"DO"),f=0;c||(c="0",f=1);d||(d="0",f=1);e||(e="1",f=1);var h=g.replace(new RegExp("([^a-z|A-Z])"+ b+"(?![a-z|A-Z])","g"),"$1"+("("+b+" + "+e+")"));Blockly.OpenSCAD.INFINITE_LOOP_TRAP&&(g=Blockly.OpenSCAD.INFINITE_LOOP_TRAP.replace(/%1/g,"'"+a.id+"'")+g);f&&Blockscad.missingFields.push(a.id);return"for ("+b+" = ["+c+" : abs("+e+") : "+d+" - "+e+"]"+(") {\n hull() {\n"+g+"\n"+h+"\n }\n}")};Blockly.OpenSCAD.math={};Blockly.OpenSCAD.math_number=function(a){var b=parseFloat(a.getFieldValue("NUM"));return a.getParent()?[b,Blockly.OpenSCAD.ORDER_ATOMIC]:["//"+b,Blockly.OpenSCAD.ORDER_ATOMIC]};Blockly.OpenSCAD.math_angle=function(a){var b=parseFloat(a.getFieldValue("NUM"));return a.getParent()?[b,Blockly.OpenSCAD.ORDER_ATOMIC]:["//"+b,Blockly.OpenSCAD.ORDER_ATOMIC]}; Blockly.OpenSCAD.math_arithmetic=function(a){var b={ADD:[" + ",Blockly.OpenSCAD.ORDER_ADDITION],MINUS:[" - ",Blockly.OpenSCAD.ORDER_SUBTRACTION],MULTIPLY:[" * ",Blockly.OpenSCAD.ORDER_MULTIPLICATION],DIVIDE:[" / ",Blockly.OpenSCAD.ORDER_DIVISION],POWER:[null,Blockly.OpenSCAD.ORDER_COMMA]}[a.getFieldValue("OP")],c=b[0],b=b[1],d=Blockly.OpenSCAD.valueToCode(a,"A",b)||"0",e=Blockly.OpenSCAD.valueToCode(a,"B",b)||"0";if(!c)return c="pow("+d+", "+e+")",a.getParent()?[c,Blockly.OpenSCAD.ORDER_FUNCTION_CALL]: ["//"+c,Blockly.OpenSCAD.ORDER_FUNCTION_CALL];c=d+c+e;return a.getParent()?[c,b]:["//"+c,b]}; Blockly.OpenSCAD.math_single=function(a){var b=a.getFieldValue("OP"),c,d;if("NEG"==b)return d=Blockly.OpenSCAD.valueToCode(a,"NUM",Blockly.OpenSCAD.ORDER_UNARY_NEGATION)||"0","-"==d[0]&&(d=" "+d),c="-"+d,a.getParent()?[c,Blockly.OpenSCAD.ORDER_UNARY_NEGATION]:["//"+c,Blockly.OpenSCAD.ORDER_UNARY_NEGATION];d="SIN"==b||"COS"==b||"TAN"==b?Blockly.OpenSCAD.valueToCode(a,"NUM",Blockly.OpenSCAD.ORDER_DIVISION)||"0":Blockly.OpenSCAD.valueToCode(a,"NUM",Blockly.OpenSCAD.ORDER_NONE)||"0";switch(b){case "ABS":c= "abs("+d+")";break;case "ROOT":c="sqrt("+d+")";break;case "LN":c="ln("+d+")";break;case "EXP":c="exp("+d+")";break;case "POW10":c="pow(10,"+d+")";break;case "ROUND":c="round("+d+")";break;case "ROUNDUP":c="ceil("+d+")";break;case "ROUNDDOWN":c="floor("+d+")";break;case "SIN":c="sin("+d+")";break;case "COS":c="cos("+d+")";break;case "TAN":c="tan("+d+")"}if(c)return a.getParent()?[c,Blockly.OpenSCAD.ORDER_FUNCTION_CALL]:["//"+c,Blockly.OpenSCAD.ORDER_FUNCTION_CALL];switch(b){case "LOG10":c="log("+d+ ")";break;case "ASIN":c="asin("+d+")";break;case "ACOS":c="acos("+d+")";break;case "ATAN":c="atan("+d+")";break;default:throw"Unknown math operator: "+b;}return a.getParent()?[c,Blockly.OpenSCAD.ORDER_DIVISION]:["//"+c,Blockly.OpenSCAD.ORDER_DIVISION]}; Blockly.OpenSCAD.math_constant_bs=function(a){var b={PI:["3.14159",Blockly.OpenSCAD.ORDER_MEMBER],E:["2.71828",Blockly.OpenSCAD.ORDER_MEMBER],GOLDEN_RATIO:["(1 + sqrt(5)) / 2",Blockly.OpenSCAD.ORDER_DIVISION],SQRT2:["sqrt(2)",Blockly.OpenSCAD.ORDER_MEMBER],SQRT1_2:["sqrt(1/2)",Blockly.OpenSCAD.ORDER_MEMBER]};return a.getParent()?b[a.getFieldValue("CONSTANT")]:"//"+b[a.getFieldValue("CONSTANT")]}; Blockly.OpenSCAD.math_constant=function(a){var b={PI:["3.14159",Blockly.OpenSCAD.ORDER_MEMBER],E:["2.71828",Blockly.OpenSCAD.ORDER_MEMBER],GOLDEN_RATIO:["(1 + sqrt(5)) / 2",Blockly.OpenSCAD.ORDER_DIVISION],SQRT2:["sqrt(2)",Blockly.OpenSCAD.ORDER_MEMBER],SQRT1_2:["sqrt(1/2)",Blockly.OpenSCAD.ORDER_MEMBER]};return a.getParent()?b[a.getFieldValue("CONSTANT")]:"//"+b[a.getFieldValue("CONSTANT")]}; Blockly.OpenSCAD.math_number_property=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"NUMBER_TO_CHECK",Blockly.OpenSCAD.ORDER_MODULUS)||"0",c=a.getFieldValue("PROPERTY"),d;if("PRIME"==c)return[Blockly.OpenSCAD.provideFunction_("math_isPrime",["function "+Blockly.OpenSCAD.FUNCTION_NAME_PLACEHOLDER_+"(n) ="," // https://en.wikipedia.org/wiki/Primality_test#Naive_methods"," if (n == 2 || n == 3) {"," 1;"," }"," // False if n is NaN, negative, is 1, or not whole."," // And false if n is divisible by 2 or 3.", " // Cant check for NaN in openscad."," if ( n <= 1 || n % 1 != 0 || n % 2 == 0 || n % 3 == 0) {"," 0"," }"," // Check all the numbers of form 6k +/- 1, up to sqrt(n)."," for (x = [6:6:sqrt(n)]) {"," if (n % (x - 1) == 0 || n % (x + 1) == 0) {"," 0;"," }"," }"," 1;","}"])+"("+b+")",Blockly.OpenSCAD.ORDER_FUNCTION_CALL];switch(c){case "EVEN":d=b+" % 2 == 0";break;case "ODD":d=b+" % 2 == 1";break;case "WHOLE":d=b+" % 1 == 0";break;case "POSITIVE":d=b+" > 0";break;case "NEGATIVE":d= b+" < 0";break;case "DIVISIBLE_BY":c=Blockly.OpenSCAD.valueToCode(a,"DIVISOR",Blockly.OpenSCAD.ORDER_MODULUS)||"0",d=b+" % "+c+" == 0"}return a.getParent()?[d,Blockly.OpenSCAD.ORDER_EQUALITY]:["//"+d,Blockly.OpenSCAD.ORDER_EQUALITY]}; Blockly.OpenSCAD.math_change=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"DELTA",Blockly.OpenSCAD.ORDER_ADDITION)||"0";a=Blockly.OpenSCAD.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE);return a+" = (typeof "+a+" == 'number' ? "+a+" : 0) + "+b+";\n"};Blockly.OpenSCAD.math_round=Blockly.OpenSCAD.math_single;Blockly.OpenSCAD.math_trig=Blockly.OpenSCAD.math_single; Blockly.OpenSCAD.math_on_list=function(a){var b=a.getFieldValue("OP");switch(b){case "SUM":b=Blockly.OpenSCAD.valueToCode(a,"LIST",Blockly.OpenSCAD.ORDER_MEMBER)||"[]";b+=".reduce(function(x, y) {return x + y;})";break;case "MIN":b=Blockly.OpenSCAD.valueToCode(a,"LIST",Blockly.OpenSCAD.ORDER_COMMA)||"[]";b="Math.min.apply(null, "+b+")";break;case "MAX":b=Blockly.OpenSCAD.valueToCode(a,"LIST",Blockly.OpenSCAD.ORDER_COMMA)||"[]";b="Math.max.apply(null, "+b+")";break;case "AVERAGE":var c=Blockly.OpenSCAD.provideFunction_("math_mean", ["function "+Blockly.OpenSCAD.FUNCTION_NAME_PLACEHOLDER_+"(myList) {"," return myList.reduce(function(x, y) {return x + y;}) / myList.length;","}"]),b=Blockly.OpenSCAD.valueToCode(a,"LIST",Blockly.OpenSCAD.ORDER_NONE)||"[]",b=c+"("+b+")";break;case "MEDIAN":c=Blockly.OpenSCAD.provideFunction_("math_median",["function "+Blockly.OpenSCAD.FUNCTION_NAME_PLACEHOLDER_+"(myList) {"," var localList = myList.filter(function (x) {return typeof x == 'number';});"," if (!localList.length) return null;"," localList.sort(function(a, b) {return b - a;});", " if (localList.length % 2 == 0) {"," return (localList[localList.length / 2 - 1] + localList[localList.length / 2]) / 2;"," } else {"," return localList[(localList.length - 1) / 2];"," }","}"]);b=Blockly.OpenSCAD.valueToCode(a,"LIST",Blockly.OpenSCAD.ORDER_NONE)||"[]";b=c+"("+b+")";break;case "MODE":c=Blockly.OpenSCAD.provideFunction_("math_modes",["function "+Blockly.OpenSCAD.FUNCTION_NAME_PLACEHOLDER_+"(values) {"," var modes = [];"," var counts = [];"," var maxCount = 0;"," for (var i = 0; i < values.length; i++) {", " var value = values[i];"," var found = false;"," var thisCount;"," for (var j = 0; j < counts.length; j++) {"," if (counts[j][0] === value) {"," thisCount = ++counts[j][1];"," found = true;"," break;"," }"," }"," if (!found) {"," counts.push([value, 1]);"," thisCount = 1;"," }"," maxCount = Math.max(thisCount, maxCount);"," }"," for (var j = 0; j < counts.length; j++) {"," if (counts[j][1] == maxCount) {"," modes.push(counts[j][0]);", " }"," }"," return modes;","}"]);b=Blockly.OpenSCAD.valueToCode(a,"LIST",Blockly.OpenSCAD.ORDER_NONE)||"[]";b=c+"("+b+")";break;case "STD_DEV":c=Blockly.OpenSCAD.provideFunction_("math_standard_deviation",["function "+Blockly.OpenSCAD.FUNCTION_NAME_PLACEHOLDER_+"(numbers) {"," var n = numbers.length;"," if (!n) return null;"," var mean = numbers.reduce(function(x, y) {return x + y;}) / n;"," var variance = 0;"," for (var j = 0; j < n; j++) {"," variance += Math.pow(numbers[j] - mean, 2);", " }"," variance = variance / n;"," return Math.sqrt(variance);","}"]);b=Blockly.OpenSCAD.valueToCode(a,"LIST",Blockly.OpenSCAD.ORDER_NONE)||"[]";b=c+"("+b+")";break;case "RANDOM":c=Blockly.OpenSCAD.provideFunction_("math_random_list",["function "+Blockly.OpenSCAD.FUNCTION_NAME_PLACEHOLDER_+"(list) {"," var x = Math.floor(Math.random() * list.length);"," return list[x];","}"]);b=Blockly.OpenSCAD.valueToCode(a,"LIST",Blockly.OpenSCAD.ORDER_NONE)||"[]";b=c+"("+b+")";break;default:throw"Unknown operator: "+ b;}return a.getParent()?[b,Blockly.OpenSCAD.ORDER_FUNCTION_CALL]:["//"+b,Blockly.OpenSCAD.ORDER_FUNCTION_CALL]};Blockly.OpenSCAD.math_modulo=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"DIVIDEND",Blockly.OpenSCAD.ORDER_MODULUS)||"0",c=Blockly.OpenSCAD.valueToCode(a,"DIVISOR",Blockly.OpenSCAD.ORDER_MODULUS)||"0",b=b+" % "+c;return a.getParent()?[b,Blockly.OpenSCAD.ORDER_MODULUS]:["//"+b,Blockly.OpenSCAD.ORDER_MODULUS]}; Blockly.OpenSCAD.math_constrain=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"VALUE",Blockly.OpenSCAD.ORDER_COMMA)||"0",c=Blockly.OpenSCAD.valueToCode(a,"LOW",Blockly.OpenSCAD.ORDER_COMMA)||"0",d=Blockly.OpenSCAD.valueToCode(a,"HIGH",Blockly.OpenSCAD.ORDER_COMMA)||"Infinity",b="min(max("+b+", "+c+"), "+d+")";return a.getParent()?[b,Blockly.OpenSCAD.ORDER_FUNCTION_CALL]:["//"+b,Blockly.OpenSCAD.ORDER_FUNCTION_CALL]}; Blockly.OpenSCAD.math_random_int=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"FROM",Blockly.OpenSCAD.ORDER_COMMA)||"0",c=Blockly.OpenSCAD.valueToCode(a,"TO",Blockly.OpenSCAD.ORDER_COMMA)||"0",b="round(rands("+b+","+c+",1)[0])";return a.getParent()?[b,Blockly.OpenSCAD.ORDER_FUNCTION_CALL]:["//"+b,Blockly.OpenSCAD.ORDER_FUNCTION_CALL]};Blockly.OpenSCAD.math_random_float=function(a){return a.getParent()?["rands(0,1,1)[0]",Blockly.OpenSCAD.ORDER_FUNCTION_CALL]:["//rands(0,1,1)[0]",Blockly.OpenSCAD.ORDER_FUNCTION_CALL]};Blockly.OpenSCAD.primitives={};Blockly.OpenSCAD.sphere=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"RAD",Blockly.OpenSCAD.ORDER_ATOMIC);b||Blockscad.missingFields.push(a.id);b&&0>=b&&Blockscad.illegalValue.push(a.inputList[1].connection.targetBlock().id);return"sphere(r="+b+");"}; Blockly.OpenSCAD.cylinder=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"RAD1",Blockly.OpenSCAD.ORDER_ATOMIC),c=Blockly.OpenSCAD.valueToCode(a,"RAD2",Blockly.OpenSCAD.ORDER_ATOMIC),d=Blockly.OpenSCAD.valueToCode(a,"HEIGHT",Blockly.OpenSCAD.ORDER_ATOMIC),e=a.getFieldValue("CENTERDROPDOWN");b&&c&&d||Blockscad.missingFields.push(a.id);var g=!1,f=!1;b&&0>b&&(Blockscad.illegalValue.push(a.inputList[1].connection.targetBlock().id),g=!0);c&&0>c&&(Blockscad.illegalValue.push(a.inputList[3].connection.targetBlock().id), f=!0);!g&&!f&&b&&0==b&&c&&0==c&&(Blockscad.illegalValue.push(a.inputList[1].connection.targetBlock().id),Blockscad.illegalValue.push(a.inputList[3].connection.targetBlock().id));d&&0>=d&&Blockscad.illegalValue.push(a.inputList[4].connection.targetBlock().id);return"cylinder(r1="+b+", r2="+c+", h="+d+", center="+e+");"}; Blockly.OpenSCAD.simple_cylinder=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"RAD1",Blockly.OpenSCAD.ORDER_ATOMIC),c=Blockly.OpenSCAD.valueToCode(a,"HEIGHT",Blockly.OpenSCAD.ORDER_ATOMIC),d=a.getFieldValue("CENTERDROPDOWN");b&&c||Blockscad.missingFields.push(a.id);b&&0>=b&&Blockscad.illegalValue.push(a.inputList[1].connection.targetBlock().id);c&&0>=c&&Blockscad.illegalValue.push(a.inputList[3].connection.targetBlock().id);return"cylinder(r="+b+", h="+c+", center="+d+");"}; Blockly.OpenSCAD.cube=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"XVAL",Blockly.OpenSCAD.ORDER_ATOMIC),c=Blockly.OpenSCAD.valueToCode(a,"YVAL",Blockly.OpenSCAD.ORDER_ATOMIC),d=Blockly.OpenSCAD.valueToCode(a,"ZVAL",Blockly.OpenSCAD.ORDER_ATOMIC),e=a.getFieldValue("CENTERDROPDOWN");b&&c&&d||Blockscad.missingFields.push(a.id);b&&0>=b&&Blockscad.illegalValue.push(a.inputList[1].connection.targetBlock().id);c&&0>=c&&Blockscad.illegalValue.push(a.inputList[2].connection.targetBlock().id);d&&0>=d&& Blockscad.illegalValue.push(a.inputList[3].connection.targetBlock().id);return"cube(["+b+", "+c+", "+d+"], center="+e+");"}; Blockly.OpenSCAD.torus=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"RAD1",Blockly.OpenSCAD.ORDER_ATOMIC),c=Blockly.OpenSCAD.valueToCode(a,"RAD2",Blockly.OpenSCAD.ORDER_ATOMIC),d=Blockly.OpenSCAD.valueToCode(a,"SIDES",Blockly.OpenSCAD.ORDER_ATOMIC),e=Blockly.OpenSCAD.valueToCode(a,"FACES",Blockly.OpenSCAD.ORDER_ATOMIC);b&&c&&d&&e||Blockscad.missingFields.push(a.id);b&&0>=b&&Blockscad.illegalValue.push(a.inputList[1].connection.targetBlock().id);c&&0>=c&&Blockscad.illegalValue.push(a.inputList[2].connection.targetBlock().id); 3>d&&(d=3);3>e&&(e=3);return"// torus \nrotate_extrude($fn="+d+") {\n translate(["+b+(", 0, 0]) {\n circle(r="+c+", $fn="+e+");\n }\n}")}; Blockly.OpenSCAD.twistytorus=function(a){console.log("in generator for twistytorus");var b=Blockly.OpenSCAD.valueToCode(a,"RAD1",Blockly.OpenSCAD.ORDER_ATOMIC),c=Blockly.OpenSCAD.valueToCode(a,"RAD2",Blockly.OpenSCAD.ORDER_ATOMIC),d=Blockly.OpenSCAD.valueToCode(a,"SIDES",Blockly.OpenSCAD.ORDER_ATOMIC),e=Blockly.OpenSCAD.valueToCode(a,"FACES",Blockly.OpenSCAD.ORDER_ATOMIC),g=Blockly.OpenSCAD.valueToCode(a,"TWIST",Blockly.OpenSCAD.ORDER_ATOMIC);console.log("value_twist is : ",g);b&&c&&d&&e||Blockscad.missingFields.push(a.id); b&&0>=b&&Blockscad.illegalValue.push(a.inputList[1].connection.targetBlock().id);c&&0>=c&&Blockscad.illegalValue.push(a.inputList[2].connection.targetBlock().id);3>d&&(d=3);3>e&&(e=3);return"// torus \n"+("rotate_extrude($fn="+d+",twist="+g+") {\n translate(["+b)+(", 0, 0]) {\n circle(r="+c+", $fn="+e+");\n }\n}")}; Blockly.OpenSCAD.scale=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"XVAL",Blockly.OpenSCAD.ORDER_ATOMIC),c=Blockly.OpenSCAD.valueToCode(a,"YVAL",Blockly.OpenSCAD.ORDER_ATOMIC),d=a.previousConnection.check_[0],e=Blockly.OpenSCAD.valueToCode(a,"ZVAL",Blockly.OpenSCAD.ORDER_ATOMIC),g=Blockly.OpenSCAD.statementToCode(a,"A");b&&c&&(e||"CSG"!=d)||Blockscad.missingFields.push(a.id);""!=g&&(g+="\n");for(var f=0;f<=a.plusCount_;f++){var h=Blockly.OpenSCAD.statementToCode(a,"PLUS"+f);""!=h&&(g+=h+"\n")}f= Blockly.OpenSCAD.returnVarCode(a);a=f[0];f=f[1];return"CAG"!=d?"scale(["+b+", "+c+", "+e+"]){\n"+a+g+f+"}":"scale(["+b+", "+c+", 1]){\n"+a+g+f+"}"}; Blockly.OpenSCAD.translate=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"XVAL",Blockly.OpenSCAD.ORDER_ATOMIC),c=Blockly.OpenSCAD.valueToCode(a,"YVAL",Blockly.OpenSCAD.ORDER_ATOMIC),d=Blockly.OpenSCAD.valueToCode(a,"ZVAL",Blockly.OpenSCAD.ORDER_ATOMIC),e=a.previousConnection.check_[0],g=Blockly.OpenSCAD.statementToCode(a,"A");b&&c&&(d||"CSG"!=e)||Blockscad.missingFields.push(a.id);""!=g&&(g+="\n");for(var f=0;f<=a.plusCount_;f++){var h=Blockly.OpenSCAD.statementToCode(a,"PLUS"+f);""!=h&&(g+=h+ "\n")}f=Blockly.OpenSCAD.returnVarCode(a);a=f[0];f=f[1];return"CAG"!=e?"translate(["+b+", "+c+", "+d+"]){\n"+a+g+f+"}":"translate(["+b+", "+c+", 0]){\n"+a+g+f+"}"}; Blockly.OpenSCAD.color=function(a){var b=Blockly.OpenSCAD.statementToCode(a,"A");""!=b&&(b+="\n");for(var c=0;c<=a.plusCount_;c++){var d=Blockly.OpenSCAD.statementToCode(a,"PLUS"+c);""!=d&&(b+=d+"\n")}c=Blockly.OpenSCAD.valueToCode(a,"COLOR",Blockly.OpenSCAD.ORDER_ATOMIC);!c&&Blockscad.stackIsShape(a)&&Blockscad.missingFields.push(a.id);d=Blockly.OpenSCAD.returnVarCode(a);a=d[0];var d=d[1],e="";if(c)var g=hexToR(c),f=hexToG(c),c=hexToB(c),e=e+("color(["+g+","+f+","+c+"]) ");return e+("{\n"+a+b+d+ "}")}; Blockly.OpenSCAD.color_rgb=function(a){var b=Blockly.OpenSCAD.statementToCode(a,"A"),c=a.getFieldValue("SCHEME"),d=Blockly.OpenSCAD.valueToCode(a,"RED",Blockly.OpenSCAD.ORDER_COMMA)||0,e=Blockly.OpenSCAD.valueToCode(a,"GREEN",Blockly.OpenSCAD.ORDER_COMMA)||0,g=Blockly.OpenSCAD.valueToCode(a,"BLUE",Blockly.OpenSCAD.ORDER_COMMA)||0;""!=b&&(b+="\n");for(var f=0;f<=a.plusCount_;f++){var h=Blockly.OpenSCAD.statementToCode(a,"PLUS"+f);""!=h&&(b+=h+"\n")}f=Blockly.OpenSCAD.returnVarCode(a);a=f[0];f=f[1]; h="";"RGB"==c?($.isNumeric(d)&&(0>d&&(d=0),100g&&(g=0),100e&&(e=0),1001?1:s,v<0?0:v>1?1:v,v*(1-s),v*(1-s*((h%1)*6-floor((h%1)*6))),v*(1-s*(1-((h%1)*6-floor((h%1)*6)))),a);\n"]),h=h+("color(hsv(.01 * ("+d+"), .01 * ("+e+"), .01 * ("+g+")))")+("{\n"+a+b+f+"}")):console.log("got weirdo color scheme?");return h}; Blockly.OpenSCAD.$fn=function(a){var b=Blockly.OpenSCAD.statementToCode(a,"A");""!=b&&(b+="\n");for(var c=0;c<=a.plusCount_;c++){var d=Blockly.OpenSCAD.statementToCode(a,"PLUS"+c);""!=d&&(b+=d+"\n")}c=Blockly.OpenSCAD.valueToCode(a,"SIDES",Blockly.OpenSCAD.ORDER_ATOMIC);c?isNaN(c)||(c=Math.floor(c),3>c&&(c=3)):Blockscad.missingFields.push(a.id);a=Blockly.OpenSCAD.returnVarCode(a);return"assign($fn="+c+"){ //set sides to "+c+"\n"+a[0]+b+a[1]+"}"}; Blockly.OpenSCAD.assign=function(a){var b=Blockly.OpenSCAD.statementToCode(a,"A");""!=b&&(b+="\n");for(var c=0;c<=a.plusCount_;c++){var d=Blockly.OpenSCAD.statementToCode(a,"PLUS"+c);""!=d&&(b+=d+"\n")}c=Blockly.OpenSCAD.valueToCode(a,"NAME",Blockly.OpenSCAD.ORDER_ATOMIC);d=Blockly.OpenSCAD.valueToCode(a,"VALUE",Blockly.OpenSCAD.ORDER_ATOMIC);a=Blockly.OpenSCAD.returnVarCode(a);return"assign("+c+"="+d+"){\n"+a[0]+b+a[1]+"}"}; Blockly.OpenSCAD.fancymirror=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"XVAL",Blockly.OpenSCAD.ORDER_ATOMIC),c=Blockly.OpenSCAD.valueToCode(a,"YVAL",Blockly.OpenSCAD.ORDER_ATOMIC),d=Blockly.OpenSCAD.valueToCode(a,"ZVAL",Blockly.OpenSCAD.ORDER_ATOMIC),e=Blockly.OpenSCAD.statementToCode(a,"A");""!=e&&(e+="\n");for(var g=0;g<=a.plusCount_;g++){var f=Blockly.OpenSCAD.statementToCode(a,"PLUS"+g);""!=f&&(e+=f+"\n")}b&&c&&d||Blockscad.missingFields.push(a.id);a=Blockly.OpenSCAD.returnVarCode(a);return"mirror(["+ b+", "+c+", "+d+"]){\n"+a[0]+e+a[1]+"}"}; Blockly.OpenSCAD.simplerotate=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"XVAL",Blockly.OpenSCAD.ORDER_ATOMIC),c=Blockly.OpenSCAD.valueToCode(a,"YVAL",Blockly.OpenSCAD.ORDER_ATOMIC),d=Blockly.OpenSCAD.valueToCode(a,"ZVAL",Blockly.OpenSCAD.ORDER_ATOMIC),e=Blockly.OpenSCAD.statementToCode(a,"A");""!=e&&(e+="\n");for(var g=0;g<=a.plusCount_;g++){var f=Blockly.OpenSCAD.statementToCode(a,"PLUS"+g);""!=f&&(e+=f+"\n")}b&&c&&d||Blockscad.missingFields.push(a.id);a=Blockly.OpenSCAD.returnVarCode(a); return"rotate(["+b+", "+c+", "+d+"]){\n"+a[0]+e+a[1]+"}"}; Blockly.OpenSCAD.fancyrotate=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"AVAL",Blockly.OpenSCAD.ORDER_ATOMIC),c=Blockly.OpenSCAD.valueToCode(a,"XVAL",Blockly.OpenSCAD.ORDER_ATOMIC),d=Blockly.OpenSCAD.valueToCode(a,"YVAL",Blockly.OpenSCAD.ORDER_ATOMIC),e=Blockly.OpenSCAD.valueToCode(a,"ZVAL",Blockly.OpenSCAD.ORDER_ATOMIC),g=a.previousConnection.check_[0],f=Blockly.OpenSCAD.statementToCode(a,"A");""!=f&&(f+="\n");for(var h=0;h<=a.plusCount_;h++){var k=Blockly.OpenSCAD.statementToCode(a,"PLUS"+ h);""!=k&&(f+=k+"\n")}b&&(c&&d&&e||"CSG"!=g)||Blockscad.missingFields.push(a.id);h=Blockly.OpenSCAD.returnVarCode(a);a=h[0];h=h[1];return"CAG"!=g?"rotate(a="+b+", v=["+c+", "+d+", "+e+"]){\n"+a+f+h+"}":"rotate([0, 0, "+b+"]){\n"+a+f+h+"}"}; Blockly.OpenSCAD.simplemirror_new=function(a){var b=Blockly.OpenSCAD.statementToCode(a,"A");""!=b&&(b+="\n");for(var c=0;c<=a.plusCount_;c++){var d=Blockly.OpenSCAD.statementToCode(a,"PLUS"+c);""!=d&&(b+=d+"\n")}var c=a.getFieldValue("mirrorplane"),d=a.getFieldValue("mirrorplane_cag"),e,g=a.previousConnection.check_[0],f=Blockly.OpenSCAD.returnVarCode(a);a=f[0];f=f[1];"CAG"!=g?"XY"==c?e="[0,0,1]":"YZ"==c?e="[1,0,0]":"XZ"==c&&(e="[0,1,0]"):"YZ"==d?e="[1,0,0]":"XZ"==d&&(e="[0,1,0]");return b="mirror("+ e+"){\n"+a+b+f+"}"}; Blockly.OpenSCAD.taper=function(a){var b=Blockly.OpenSCAD.statementToCode(a,"A");""!=b&&(b+="\n");for(var c=0;c<=a.plusCount_;c++){var d=Blockly.OpenSCAD.statementToCode(a,"PLUS"+c);""!=d&&(b+=d+"\n")}var c=a.getFieldValue("taperaxis"),d=a.getFieldValue("taperaxis_cag"),e,g=Blockly.OpenSCAD.valueToCode(a,"FACTOR",Blockly.OpenSCAD.ORDER_ATOMIC),f=a.previousConnection.check_[0],h=Blockly.OpenSCAD.returnVarCode(a);a=h[0];h=h[1];g||(g=1);"CAG"!=f?"Z"==c?e="[0,0,1]":"X"==c?e="[1,0,0]":"Y"==c&&(e="[0,1,0]"): "X"==d?e="[1,0,0]":"Y"==d&&(e="[0,1,0]");return b="taper("+e+", "+g+"){\n"+a+b+h+"}"};Blockly.OpenSCAD.simplemirror=function(a){var b=Blockly.OpenSCAD.statementToCode(a,"A");""!=b&&(b+="\n");var c=a.getFieldValue("sign"),d=a.getFieldValue("mirrorplane"),e;"XY"==d?e="pos"==c?"[0,0,1]":"[0,0,-1]":"YZ"==d?e="pos"==c?"[1,0,0]":"[-1,0,0]":"XZ"==d&&(e="pos"==c?"[0,1,0]":"[0,-1,0]");a=Blockly.OpenSCAD.returnVarCode(a);return"mirror("+e+"){\n"+a[0]+b+a[1]+"}"}; Blockly.OpenSCAD.circle=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"RAD",Blockly.OpenSCAD.ORDER_ATOMIC);b||Blockscad.missingFields.push(a.id);b&&0>=b&&Blockscad.illegalValue.push(a.inputList[1].connection.targetBlock().id);return"circle(r="+b+");"}; Blockly.OpenSCAD.square=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"XVAL",Blockly.OpenSCAD.ORDER_ATOMIC),c=Blockly.OpenSCAD.valueToCode(a,"YVAL",Blockly.OpenSCAD.ORDER_ATOMIC),d=a.getFieldValue("CENTERDROPDOWN");b&&c||Blockscad.missingFields.push(a.id);b&&0>=b&&Blockscad.illegalValue.push(a.inputList[1].connection.targetBlock().id);c&&0>=c&&Blockscad.illegalValue.push(a.inputList[2].connection.targetBlock().id);return"square(["+b+", "+c+"], center="+d+");"}; Blockly.OpenSCAD.linearextrude=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"HEIGHT",Blockly.OpenSCAD.ORDER_ATOMIC),c=Blockly.OpenSCAD.valueToCode(a,"TWIST",Blockly.OpenSCAD.ORDER_ATOMIC),d=Blockly.OpenSCAD.valueToCode(a,"XSCALE",Blockly.OpenSCAD.ORDER_ATOMIC),e=Blockly.OpenSCAD.valueToCode(a,"YSCALE",Blockly.OpenSCAD.ORDER_ATOMIC),g=a.getFieldValue("CENTERDROPDOWN"),f=Blockly.OpenSCAD.statementToCode(a,"A");""!=f&&(f+="\n");for(var h=0;h<=a.plusCount_;h++){var k=Blockly.OpenSCAD.statementToCode(a, "PLUS"+h);""!=k&&(f+=k+"\n")}b&&c||Blockscad.missingFields.push(a.id);b&&0>=b&&Blockscad.illegalValue.push(a.inputList[1].connection.targetBlock().id);d||(d=1);e||(e=1);a=Blockly.OpenSCAD.returnVarCode(a);return"linear_extrude( height="+b+", twist="+c+", scale=["+d+", "+e+"], center="+g+"){\n"+a[0]+f+a[1]+"}"}; Blockly.OpenSCAD.rotateextrude=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"FACES",Blockly.OpenSCAD.ORDER_ATOMIC),c=Blockly.OpenSCAD.statementToCode(a,"A");""!=c&&(c+="\n");for(var d=0;d<=a.plusCount_;d++){var e=Blockly.OpenSCAD.statementToCode(a,"PLUS"+d);""!=e&&(c+=e+"\n")}b||Blockscad.missingFields.push(a.id);a=Blockly.OpenSCAD.returnVarCode(a);return"rotate_extrude($fn="+b+"){\n"+a[0]+c+a[1]+"}"}; Blockly.OpenSCAD.rotateextrudetwist=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"FACES",Blockly.OpenSCAD.ORDER_ATOMIC),c=Blockly.OpenSCAD.valueToCode(a,"RAD",Blockly.OpenSCAD.ORDER_ATOMIC),d=Blockly.OpenSCAD.valueToCode(a,"TWIST",Blockly.OpenSCAD.ORDER_ATOMIC),e=Blockly.OpenSCAD.valueToCode(a,"TSTEPS",Blockly.OpenSCAD.ORDER_ATOMIC),g=Blockly.OpenSCAD.statementToCode(a,"A");""!=g&&(g+="\n");for(var f=0;f<=a.plusCount_;f++){var h=Blockly.OpenSCAD.statementToCode(a,"PLUS"+f);""!=h&&(g+=h+"\n")}b&& c||Blockscad.missingFields.push(a.id);c&&0>c&&Blockscad.illegalValue.push(a.inputList[1].connection.targetBlock().id);b&&3>b&&(b=3);a=Blockly.OpenSCAD.returnVarCode(a);return"rotate_extrude($fn="+b+",radius="+c+",twist="+d+",tsteps="+e+"){\n"+a[0]+g+a[1]+"}"};Blockly.OpenSCAD.stl_import=function(a){return'import("'+a.getFieldValue("STL_FILENAME")+'");\n'}; Blockly.OpenSCAD.bs_text=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"TEXT",Blockly.OpenSCAD.ORDER_ATOMIC),c=Blockscad.fontName[parseInt(a.getFieldValue("FONT"))],d=Blockly.OpenSCAD.valueToCode(a,"SIZE",Blockly.OpenSCAD.ORDER_ATOMIC);d&&b||Blockscad.missingFields.push(a.id);d&&0>=d&&Blockscad.illegalValue.push(a.inputList[2].connection.targetBlock().id);!b||'"'==b[0]&&'"'==b[b.length-1]||(b="str("+b+")");return"// size is multiplied by 0.75 because openScad fonts size is in points, not pixels\n"+ ("text("+b+', font = "'+c+'", size = '+d+"* 0.75);\n")}; Blockly.OpenSCAD.bs_3dtext=function(a){var b=Blockly.OpenSCAD.valueToCode(a,"TEXT",Blockly.OpenSCAD.ORDER_ATOMIC),c=Blockscad.fontName[parseInt(a.getFieldValue("FONT"))],d=Blockly.OpenSCAD.valueToCode(a,"SIZE",Blockly.OpenSCAD.ORDER_ATOMIC),e=Blockly.OpenSCAD.valueToCode(a,"THICKNESS",Blockly.OpenSCAD.ORDER_ATOMIC);d&&e&&b||Blockscad.missingFields.push(a.id);d&&0>=d&&Blockscad.illegalValue.push(a.inputList[2].connection.targetBlock().id);e&&0>=e&&Blockscad.illegalValue.push(a.inputList[4].connection.targetBlock().id); !b||'"'==b[0]&&'"'==b[b.length-1]||(b="str("+b+")");return"// size is multiplied by 0.75 because openScad fonts size is in points, not pixels\n"+("linear_extrude( height="+e+", twist=0, center=false){\n text("+b+', font = "'+c+'", size = '+d+"*0.75);\n}\n")};Blockly.OpenSCAD.text=function(a){var b=Blockly.OpenSCAD.quote_(a.getFieldValue("TEXT"));return a.getParent()?[b,Blockly.OpenSCAD.ORDER_ATOMIC]:["//"+b,Blockly.OpenSCAD.ORDER_ATOMIC]}; Blockly.OpenSCAD.bs_text_length=function(a){var b="len("+(Blockly.OpenSCAD.valueToCode(a,"VALUE",Blockly.OpenSCAD.ORDER_FUNCTION_CALL)||"''")+")";return a.getParent()?[b,Blockly.OpenSCAD.ORDER_ATOMIC]:["//"+b,Blockly.OpenSCAD.ORDER_ATOMIC]};function hexToR(a){return Math.round(100*parseInt(a.substring(2,4),16)/255)/100}function hexToG(a){return Math.round(100*parseInt(a.substring(4,6),16)/255)/100}function hexToB(a){return Math.round(100*parseInt(a.substring(6,8),16)/255)/100} Blockly.OpenSCAD.returnVarCode=function(a){a=Blockly.OpenSCAD.getVariableCode(a);var b="",c="";if(a.length){b+=" assign(";for(c=0;c