From 26a9168bf4cb05d71339e27e5f4c87df03bb55cf Mon Sep 17 00:00:00 2001 From: Matas Ubarevicius Date: Wed, 24 Dec 2025 15:04:14 +0200 Subject: [PATCH 01/36] new twisted polygon decoration tutorial --- .../modeling/festive-decor/frost-flower.md | 4 +- .../festive-decor/frozen-snowflake.md | 6 +- .../modeling/festive-decor/tree-decoration.md | 4 +- .../festive-decor/twisted-polygon-ornament.md | 82 +++++++++++++++++++ .../full/simple-all-kernels/index.html | 2 +- 5 files changed, 90 insertions(+), 8 deletions(-) create mode 100644 docs/learn/code/common/occt/modeling/festive-decor/twisted-polygon-ornament.md diff --git a/docs/learn/code/common/occt/modeling/festive-decor/frost-flower.md b/docs/learn/code/common/occt/modeling/festive-decor/frost-flower.md index f2bd3e64..5116a728 100644 --- a/docs/learn/code/common/occt/modeling/festive-decor/frost-flower.md +++ b/docs/learn/code/common/occt/modeling/festive-decor/frost-flower.md @@ -41,14 +41,14 @@ The algorithm: sizebranchWirecombinedWireouterWireinnerWirehollowFacesnowflakesize0.8branchWire0000.3MULTIPLY1.5size0-0.2MULTIPLY2.5size00.4MULTIPLY3.5size00MULTIPLY4size0FALSE0.00001combinedWirebranchWirebranchWire001180outerWirecombinedWire0.40.1innerWirecombinedWire0.20.1hollowFaceouterWireinnerWireTRUEsnowflakehollowFacehollowFace00130hollowFace00160hollowFace00190hollowFace001120hollowFace001150FALSEsnowflake000.20.01Ice Material#aed6f1#5dade20.10.31FALSE2FALSE#ffffff2","version":"0.20.12","type":"blockly"}} + script={{"script":"sizebranchWirecombinedWireouterWireinnerWirehollowFacesnowflakesize0.8branchWire0000.3MULTIPLY1.5size0-0.2MULTIPLY2.5size00.4MULTIPLY3.5size00MULTIPLY4size0FALSE0.00001combinedWirebranchWirebranchWire001180outerWirecombinedWire0.40.1innerWirecombinedWire0.20.1hollowFaceouterWireinnerWireTRUEsnowflakehollowFacehollowFace00130hollowFace00160hollowFace00190hollowFace001120hollowFace001150FALSEsnowflake000.20.01Ice Material#aed6f1#5dade20.10.31FALSE2FALSE#ffffff2","version":"0.20.14","type":"blockly"}} title="Star ornament with hanging hole" /> {\n const size = 0.8;\n\n const branchPoints: Point3[] = [\n [0, 0, 0],\n [0.3, 1.5 * size, 0],\n [-0.2, 2.5 * size, 0],\n [0.4, 3.5 * size, 0],\n [0, 4 * size, 0],\n ];\n\n const interpolation = new InterpolationDto();\n interpolation.points = branchPoints;\n interpolation.periodic = false;\n interpolation.tolerance = 0.00001;\n const branchWire = await wire.interpolatePoints(interpolation);\n\n const rotate180 = new RotateDto();\n rotate180.shape = branchWire;\n rotate180.axis = [0, 0, 1];\n rotate180.angle = 180;\n const branchWireRotated = await transforms.rotate(rotate180);\n\n const combine = new ShapesDto();\n combine.shapes = [branchWire, branchWireRotated];\n const combinedWire = await wire.combineEdgesAndWiresIntoAWire(combine);\n\n const offsetOuter = new OffsetDto();\n offsetOuter.shape = combinedWire;\n offsetOuter.distance = 0.4;\n offsetOuter.tolerance = 0.1;\n const outerWire = (await operations.offset(offsetOuter)) as unknown as TopoDSWirePointer;\n\n const offsetInner = new OffsetDto();\n offsetInner.shape = combinedWire;\n offsetInner.distance = 0.2;\n offsetInner.tolerance = 0.1;\n const innerWireRaw = (await operations.offset(offsetInner)) as unknown as TopoDSWirePointer;\n\n const reverse = new ShapeDto();\n reverse.shape = innerWireRaw;\n const innerWire = await wire.reversedWire(reverse);\n\n const faceFromWires = new FaceFromWiresDto();\n faceFromWires.shapes = [outerWire, innerWire];\n faceFromWires.planar = true;\n const hollowFace = await face.createFaceFromWires(faceFromWires);\n\n const angles = [0, 30, 60, 90, 120, 150];\n const rotatedFaces: TopoDSShapePointer[] = [];\n\n for (const angle of angles) {\n if (angle === 0) {\n rotatedFaces.push(hollowFace);\n continue;\n }\n const rotate = new RotateDto();\n rotate.shape = hollowFace;\n rotate.axis = [0, 0, 1];\n rotate.angle = angle;\n rotatedFaces.push(await transforms.rotate(rotate));\n }\n\n const union = new UnionDto();\n union.shapes = rotatedFaces;\n union.keepEdges = false;\n const snowflakeFace = await booleans.union(union);\n\n const extrude = new ExtrudeDto();\n extrude.shape = snowflakeFace;\n extrude.direction = [0, 0, 0.2];\n const snowflakeSolid = await operations.extrude(extrude);\n\n const materialOptions = new PBRMetallicRoughnessDto();\n materialOptions.name = 'Ice Material';\n materialOptions.baseColor = '#aed6f1';\n materialOptions.emissiveColor = '#5dade2';\n materialOptions.metallic = 0.1;\n materialOptions.roughness = 0.3;\n materialOptions.alpha = 1;\n materialOptions.backFaceCulling = false;\n materialOptions.zOffset = 2;\n const material = bitbybit.babylon.material.pbrMetallicRoughness.create(materialOptions);\n\n const drawOptions = new DrawOcctShapeOptions();\n drawOptions.precision = 0.01;\n drawOptions.drawEdges = false;\n drawOptions.edgeColour = '#ffffff';\n drawOptions.edgeWidth = 2;\n drawOptions.faceMaterial = material;\n\n const starMesh = await bitbybit.draw.drawAnyAsync({\n entity: snowflakeSolid,\n options: drawOptions,\n });\n\n const options = new ZoomOnDto();\n options.meshes = [starMesh];\n bitbybit.advanced.navigation.zoomOn(options);\n};\n\nstart();","version":"0.20.12","type":"typescript"}} + script={{"script":"const { InterpolationDto, RotateDto, ShapesDto, OffsetDto, FaceFromWiresDto, ExtrudeDto, UnionDto, ShapeDto } = Bit.Inputs.OCCT;\nconst { PBRMetallicRoughnessDto } = Bit.Inputs.BabylonMaterial;\nconst { DrawOcctShapeOptions } = Bit.Inputs.Draw;\nconst { ZoomOnDto } = Bit.Advanced.Navigation;\n\ntype Point3 = Bit.Inputs.Base.Point3;\ntype TopoDSWirePointer = Bit.Inputs.OCCT.TopoDSWirePointer;\ntype TopoDSFacePointer = Bit.Inputs.OCCT.TopoDSFacePointer;\ntype TopoDSShapePointer = Bit.Inputs.OCCT.TopoDSShapePointer;\n\nconst { wire, face } = bitbybit.occt.shapes;\nconst { operations, transforms, booleans } = bitbybit.occt;\n\nconst start = async () => {\n const size = 0.8;\n\n const branchPoints: Point3[] = [\n [0, 0, 0],\n [0.3, 1.5 * size, 0],\n [-0.2, 2.5 * size, 0],\n [0.4, 3.5 * size, 0],\n [0, 4 * size, 0],\n ];\n\n const interpolation = new InterpolationDto();\n interpolation.points = branchPoints;\n interpolation.periodic = false;\n interpolation.tolerance = 0.00001;\n const branchWire = await wire.interpolatePoints(interpolation);\n\n const rotate180 = new RotateDto();\n rotate180.shape = branchWire;\n rotate180.axis = [0, 0, 1];\n rotate180.angle = 180;\n const branchWireRotated = await transforms.rotate(rotate180);\n\n const combine = new ShapesDto();\n combine.shapes = [branchWire, branchWireRotated];\n const combinedWire = await wire.combineEdgesAndWiresIntoAWire(combine);\n\n const offsetOuter = new OffsetDto();\n offsetOuter.shape = combinedWire;\n offsetOuter.distance = 0.4;\n offsetOuter.tolerance = 0.1;\n const outerWire = (await operations.offset(offsetOuter)) as unknown as TopoDSWirePointer;\n\n const offsetInner = new OffsetDto();\n offsetInner.shape = combinedWire;\n offsetInner.distance = 0.2;\n offsetInner.tolerance = 0.1;\n const innerWireRaw = (await operations.offset(offsetInner)) as unknown as TopoDSWirePointer;\n\n const reverse = new ShapeDto();\n reverse.shape = innerWireRaw;\n const innerWire = await wire.reversedWire(reverse);\n\n const faceFromWires = new FaceFromWiresDto();\n faceFromWires.shapes = [outerWire, innerWire];\n faceFromWires.planar = true;\n const hollowFace = await face.createFaceFromWires(faceFromWires);\n\n const angles = [0, 30, 60, 90, 120, 150];\n const rotatedFaces: TopoDSShapePointer[] = [];\n\n for (const angle of angles) {\n if (angle === 0) {\n rotatedFaces.push(hollowFace);\n continue;\n }\n const rotate = new RotateDto();\n rotate.shape = hollowFace;\n rotate.axis = [0, 0, 1];\n rotate.angle = angle;\n rotatedFaces.push(await transforms.rotate(rotate));\n }\n\n const union = new UnionDto();\n union.shapes = rotatedFaces;\n union.keepEdges = false;\n const snowflakeFace = await booleans.union(union);\n\n const extrude = new ExtrudeDto();\n extrude.shape = snowflakeFace;\n extrude.direction = [0, 0, 0.2];\n const snowflakeSolid = await operations.extrude(extrude);\n\n const materialOptions = new PBRMetallicRoughnessDto();\n materialOptions.name = 'Ice Material';\n materialOptions.baseColor = '#aed6f1';\n materialOptions.emissiveColor = '#5dade2';\n materialOptions.metallic = 0.1;\n materialOptions.roughness = 0.3;\n materialOptions.alpha = 1;\n materialOptions.backFaceCulling = false;\n materialOptions.zOffset = 2;\n const material = bitbybit.babylon.material.pbrMetallicRoughness.create(materialOptions);\n\n const drawOptions = new DrawOcctShapeOptions();\n drawOptions.precision = 0.01;\n drawOptions.drawEdges = false;\n drawOptions.edgeColour = '#ffffff';\n drawOptions.edgeWidth = 2;\n drawOptions.faceMaterial = material;\n\n const starMesh = await bitbybit.draw.drawAnyAsync({\n entity: snowflakeSolid,\n options: drawOptions,\n });\n\n const options = new ZoomOnDto();\n options.meshes = [starMesh];\n bitbybit.advanced.navigation.zoomOn(options);\n};\n\nstart();","version":"0.20.14","type":"typescript"}} title="Star ornament with hanging hole" /> diff --git a/docs/learn/code/common/occt/modeling/festive-decor/frozen-snowflake.md b/docs/learn/code/common/occt/modeling/festive-decor/frozen-snowflake.md index 5d35e5bf..da37170b 100644 --- a/docs/learn/code/common/occt/modeling/festive-decor/frozen-snowflake.md +++ b/docs/learn/code/common/occt/modeling/festive-decor/frozen-snowflake.md @@ -33,21 +33,21 @@ The algorithm: nrZigZagsinnerHex1outerHex1zigzag1zigzag1ScaledinnerHex2outerHex2zigzag2zigzag2Scaledloft1loft2loft2Translatedloft3faces1everySecondMaineverySecondEnd1faces2everySecondEnd2faces3facesListForExtrusioncurrentFaceallExtrudedFacesextrudedFaceallExtrudedFaces2currentFace2compound1compound2'city'10000.10.7TRUEnrZigZags5innerHex100.2001063outerHex100.2001063.7zigzag1innerHex1outerHex1nrZigZagsFALSEFALSETRUEzigzag1Scaledzigzag13innerHex200001062outerHex200001062.5zigzag2innerHex2outerHex2nrZigZagsFALSEFALSETRUEzigzag2Scaledzigzag26loft1zigzag2zigzag1zigzag1Scaledzigzag2ScaledFALSEFALSEFALSETRUE10FALSE31e-7approxCentripetalloft2zigzag2Scaledzigzag1ScaledFALSEFALSEFALSETRUE10FALSE31e-7approxCentripetalloft2Translatedloft200.30loft3zigzag2zigzag1FALSEFALSEFALSETRUE10FALSE31e-7approxCentripetalfaces1loft1everySecondMainfaces121TRUEeverySecondEnd1loft2Translatedfaces2everySecondEnd120TRUEeverySecondEnd2loft3faces3everySecondEnd220TRUEfacesListForExtrusioncurrentFacefaces2INSERTLASTfacesListForExtrusioncurrentFacecurrentFacefaces3INSERTLASTfacesListForExtrusioncurrentFaceallExtrudedFacescurrentFacefacesListForExtrusionextrudedFacecurrentFace00.30INSERTLASTallExtrudedFacesextrudedFaceallExtrudedFaces2currentFace2everySecondMainextrudedFacecurrentFace200.30INSERTLASTallExtrudedFaces2extrudedFacecompound1allExtrudedFaces2compound2allExtrudedFacescompound10.01Material 1#94b4ff#0000000.80.21FALSE2FALSE#ffffff4compound20.01Material 2#33ffc2#0000000.80.21FALSE0FALSE#ffffff2","version":"0.20.12","type":"blockly"}} + script={{"script":"nrZigZagsinnerHex1outerHex1zigzag1zigzag1ScaledinnerHex2outerHex2zigzag2zigzag2Scaledloft1loft2loft2Translatedloft3faces1everySecondMaineverySecondEnd1faces2everySecondEnd2faces3facesListForExtrusioncurrentFaceallExtrudedFacesextrudedFaceallExtrudedFaces2currentFace2compound1compound2'city'10000.10.7TRUEnrZigZags5innerHex100.2001063outerHex100.2001063.7zigzag1innerHex1outerHex1nrZigZagsFALSEFALSETRUEzigzag1Scaledzigzag13innerHex200001062outerHex200001062.5zigzag2innerHex2outerHex2nrZigZagsFALSEFALSETRUEzigzag2Scaledzigzag26loft1zigzag2zigzag1zigzag1Scaledzigzag2ScaledFALSEFALSEFALSETRUE10FALSE31e-7approxCentripetalloft2zigzag2Scaledzigzag1ScaledFALSEFALSEFALSETRUE10FALSE31e-7approxCentripetalloft2Translatedloft200.30loft3zigzag2zigzag1FALSEFALSEFALSETRUE10FALSE31e-7approxCentripetalfaces1loft1everySecondMainfaces121TRUEeverySecondEnd1loft2Translatedfaces2everySecondEnd120TRUEeverySecondEnd2loft3faces3everySecondEnd220TRUEfacesListForExtrusioncurrentFacefaces2INSERTLASTfacesListForExtrusioncurrentFacecurrentFacefaces3INSERTLASTfacesListForExtrusioncurrentFaceallExtrudedFacescurrentFacefacesListForExtrusionextrudedFacecurrentFace00.30INSERTLASTallExtrudedFacesextrudedFaceallExtrudedFaces2currentFace2everySecondMainextrudedFacecurrentFace200.30INSERTLASTallExtrudedFaces2extrudedFacecompound1allExtrudedFaces2compound2allExtrudedFacescompound10.01Material 1#94b4ff#0000000.80.21FALSE2FALSE#ffffff4compound20.01Material 2#33ffc2#0000000.80.21FALSE0FALSE#ffffff2","version":"0.20.14","type":"blockly"}} title="Frozen Snowflake" /> {\n const skyboxOpt = new SkyboxDto();\n skyboxOpt.skybox = skyboxEnum.city;\n skyboxOpt.hideSkybox = true;\n bitbybit.babylon.scene.enableSkybox(skyboxOpt);\n\n const nrZigZags = 5;\n\n // Create first set of hexagon wires\n const innerHex1Dto = new NGonWireDto();\n innerHex1Dto.center = [0, 0.2, 0];\n innerHex1Dto.direction = [0, 1, 0];\n innerHex1Dto.nrCorners = 6;\n innerHex1Dto.radius = 3;\n const innerHex1 = await wire.createNGonWire(innerHex1Dto);\n\n const outerHex1Dto = new NGonWireDto();\n outerHex1Dto.center = [0, 0.2, 0];\n outerHex1Dto.direction = [0, 1, 0];\n outerHex1Dto.nrCorners = 6;\n outerHex1Dto.radius = 3.7;\n const outerHex1 = await wire.createNGonWire(outerHex1Dto);\n\n const innerHex2Dto = new NGonWireDto();\n innerHex2Dto.center = [0, 0, 0];\n innerHex2Dto.direction = [0, 1, 0];\n innerHex2Dto.nrCorners = 6;\n innerHex2Dto.radius = 2;\n const innerHex2 = await wire.createNGonWire(innerHex2Dto);\n\n const outerHex2Dto = new NGonWireDto();\n outerHex2Dto.center = [0, 0, 0];\n outerHex2Dto.direction = [0, 1, 0];\n outerHex2Dto.nrCorners = 6;\n outerHex2Dto.radius = 2.5;\n const outerHex2 = await wire.createNGonWire(outerHex2Dto);\n\n // Create zigzag wires between hexagons\n const zigzag1Dto = new ZigZagBetweenTwoWiresDto();\n zigzag1Dto.wire1 = innerHex1;\n zigzag1Dto.wire2 = outerHex1;\n zigzag1Dto.nrZigZags = nrZigZags;\n zigzag1Dto.inverse = false;\n zigzag1Dto.divideByEqualDistance = false;\n zigzag1Dto.zigZagsPerEdge = true;\n const zigzag1 = await wire.createZigZagBetweenTwoWires(zigzag1Dto);\n\n const scale1Dto = new ScaleDto();\n scale1Dto.shape = zigzag1;\n scale1Dto.factor = 3;\n const zigzag1Scaled = await transforms.scale(scale1Dto);\n\n const zigzag2Dto = new ZigZagBetweenTwoWiresDto();\n zigzag2Dto.wire1 = innerHex2;\n zigzag2Dto.wire2 = outerHex2;\n zigzag2Dto.nrZigZags = nrZigZags;\n zigzag2Dto.inverse = false;\n zigzag2Dto.divideByEqualDistance = false;\n zigzag2Dto.zigZagsPerEdge = true;\n const zigzag2 = await wire.createZigZagBetweenTwoWires(zigzag2Dto);\n\n const scale2Dto = new ScaleDto();\n scale2Dto.shape = zigzag2;\n scale2Dto.factor = 6;\n const zigzag2Scaled = await transforms.scale(scale2Dto);\n\n // Create loft surfaces\n const loft1Dto = new LoftAdvancedDto();\n loft1Dto.shapes = [zigzag2, zigzag1, zigzag1Scaled, zigzag2Scaled];\n loft1Dto.makeSolid = false;\n loft1Dto.closed = false;\n loft1Dto.periodic = false;\n loft1Dto.straight = true;\n loft1Dto.nrPeriodicSections = 10;\n loft1Dto.useSmoothing = false;\n loft1Dto.maxUDegree = 3;\n loft1Dto.tolerance = 1e-7;\n loft1Dto.parType = approxParametrizationTypeEnum.approxCentripetal;\n const loft1 = await operations.loftAdvanced(loft1Dto);\n\n const loft2Dto = new LoftAdvancedDto();\n loft2Dto.shapes = [zigzag2Scaled, zigzag1Scaled];\n loft2Dto.makeSolid = false;\n loft2Dto.closed = false;\n loft2Dto.periodic = false;\n loft2Dto.straight = true;\n loft2Dto.nrPeriodicSections = 10;\n loft2Dto.useSmoothing = false;\n loft2Dto.maxUDegree = 3;\n loft2Dto.tolerance = 1e-7;\n loft1Dto.parType = approxParametrizationTypeEnum.approxCentripetal;\n const loft2 = await operations.loftAdvanced(loft2Dto);\n\n const translateDto = new TranslateDto();\n translateDto.shape = loft2;\n translateDto.translation = [0, 0.3, 0];\n const loft2Translated = await transforms.translate(translateDto);\n\n const loft3Dto = new LoftAdvancedDto();\n loft3Dto.shapes = [zigzag2, zigzag1];\n loft3Dto.makeSolid = false;\n loft3Dto.closed = false;\n loft3Dto.periodic = false;\n loft3Dto.straight = true;\n loft3Dto.nrPeriodicSections = 10;\n loft3Dto.useSmoothing = false;\n loft3Dto.maxUDegree = 3;\n loft3Dto.tolerance = 1e-7;\n loft1Dto.parType = approxParametrizationTypeEnum.approxCentripetal;\n const loft3 = await operations.loftAdvanced(loft3Dto);\n\n // Extract and filter faces\n const faces1All = await face.getFaces({ shape: loft1 });\n const everySecondMain = bitbybit.lists.getNthItem({\n list: faces1All,\n nth: 2,\n offset: 1,\n clone: true\n });\n\n const faces2All = await face.getFaces({ shape: loft2Translated });\n const everySecondEnd1 = bitbybit.lists.getNthItem({\n list: faces2All,\n nth: 2,\n offset: 0,\n clone: true\n });\n\n const faces3All = await face.getFaces({ shape: loft3 });\n const everySecondEnd2 = bitbybit.lists.getNthItem({\n list: faces3All,\n nth: 2,\n offset: 0,\n clone: true\n });\n\n // Combine faces for extrusion\n const facesForExtrusion: TopoDSFacePointer[] = [\n ...everySecondEnd1,\n ...everySecondEnd2\n ];\n\n // Extrude all faces\n const extrudedFaces: TopoDSShapePointer[] = [];\n for (const faceToExtrude of facesForExtrusion) {\n const extrudeDto = new ExtrudeDto();\n extrudeDto.shape = faceToExtrude;\n extrudeDto.direction = [0, 0.3, 0];\n const extruded = await operations.extrude(extrudeDto);\n extrudedFaces.push(extruded);\n }\n\n const extrudedFacesMain: TopoDSShapePointer[] = [];\n for (const faceToExtrude of everySecondMain) {\n const extrudeDto = new ExtrudeDto();\n extrudeDto.shape = faceToExtrude;\n extrudeDto.direction = [0, 0.3, 0];\n const extruded = await operations.extrude(extrudeDto);\n extrudedFacesMain.push(extruded);\n }\n\n // Create compounds\n const compoundDto1 = new ShapesDto();\n compoundDto1.shapes = extrudedFacesMain;\n const compound1 = await compound.makeCompound(compoundDto1);\n\n const compoundDto2 = new ShapesDto();\n compoundDto2.shapes = extrudedFaces;\n const compound2 = await compound.makeCompound(compoundDto2);\n\n // Create materials\n const material1Dto = new PBRMetallicRoughnessDto();\n material1Dto.name = 'Material 1';\n material1Dto.baseColor = '#94b4ff';\n material1Dto.emissiveColor = '#000000';\n material1Dto.metallic = 0.8;\n material1Dto.roughness = 0.2;\n material1Dto.alpha = 1;\n material1Dto.backFaceCulling = false;\n material1Dto.zOffset = 2;\n const material1 = bitbybit.babylon.material.pbrMetallicRoughness.create(material1Dto);\n\n const material2Dto = new PBRMetallicRoughnessDto();\n material2Dto.name = 'Material 2';\n material2Dto.baseColor = '#33ffc2';\n material2Dto.emissiveColor = '#000000';\n material2Dto.metallic = 0.8;\n material2Dto.roughness = 0.2;\n material2Dto.alpha = 1;\n material2Dto.backFaceCulling = false;\n material2Dto.zOffset = 0;\n const material2 = bitbybit.babylon.material.pbrMetallicRoughness.create(material2Dto);\n\n // Draw the compounds\n const drawOptions1 = new DrawOcctShapeOptions();\n drawOptions1.precision = 0.01;\n drawOptions1.faceMaterial = material1;\n drawOptions1.drawEdges = false;\n drawOptions1.edgeColour = '#ffffff';\n drawOptions1.edgeWidth = 4;\n\n await bitbybit.draw.drawAnyAsync({\n entity: compound1,\n options: drawOptions1\n });\n\n const drawOptions2 = new DrawOcctShapeOptions();\n drawOptions2.precision = 0.01;\n drawOptions2.faceMaterial = material2;\n drawOptions2.drawEdges = false;\n drawOptions2.edgeColour = '#ffffff';\n drawOptions2.edgeWidth = 2;\n\n const drawnMesh = await bitbybit.draw.drawAnyAsync({\n entity: compound2,\n options: drawOptions2\n });\n\n const zoomOnOptions = new ZoomOnDto();\n zoomOnOptions.offset = -0.1;\n zoomOnOptions.meshes = [drawnMesh];\n bitbybit.advanced.navigation.zoomOn(zoomOnOptions);\n};\n\nstart();","version":"0.20.12","type":"typescript"}} + script={{"script":"const { NGonWireDto, ZigZagBetweenTwoWiresDto, ShapesDto, ExtrudeDto, approxParametrizationTypeEnum } = Bit.Inputs.OCCT;\nconst { LoftAdvancedDto } = Bit.Inputs.OCCT;\nconst { TranslateDto, ScaleDto } = Bit.Inputs.OCCT;\nconst { PBRMetallicRoughnessDto } = Bit.Inputs.BabylonMaterial;\nconst { DrawOcctShapeOptions } = Bit.Inputs.Draw;\nconst { SkyboxDto } = Bit.Inputs.BabylonScene;\nconst { skyboxEnum } = Bit.Inputs.Base;\nconst { ZoomOnDto } = Bit.Advanced.Navigation;\n\ntype Point3 = Bit.Inputs.Base.Point3;\ntype TopoDSWirePointer = Bit.Inputs.OCCT.TopoDSWirePointer;\ntype TopoDSFacePointer = Bit.Inputs.OCCT.TopoDSFacePointer;\ntype TopoDSShapePointer = Bit.Inputs.OCCT.TopoDSShapePointer;\n\nconst { wire, face, compound } = bitbybit.occt.shapes;\nconst { operations, transforms } = bitbybit.occt;\n\nconst start = async () => {\n const skyboxOpt = new SkyboxDto();\n skyboxOpt.skybox = skyboxEnum.city;\n skyboxOpt.hideSkybox = true;\n bitbybit.babylon.scene.enableSkybox(skyboxOpt);\n\n const nrZigZags = 5;\n\n // Create first set of hexagon wires\n const innerHex1Dto = new NGonWireDto();\n innerHex1Dto.center = [0, 0.2, 0];\n innerHex1Dto.direction = [0, 1, 0];\n innerHex1Dto.nrCorners = 6;\n innerHex1Dto.radius = 3;\n const innerHex1 = await wire.createNGonWire(innerHex1Dto);\n\n const outerHex1Dto = new NGonWireDto();\n outerHex1Dto.center = [0, 0.2, 0];\n outerHex1Dto.direction = [0, 1, 0];\n outerHex1Dto.nrCorners = 6;\n outerHex1Dto.radius = 3.7;\n const outerHex1 = await wire.createNGonWire(outerHex1Dto);\n\n const innerHex2Dto = new NGonWireDto();\n innerHex2Dto.center = [0, 0, 0];\n innerHex2Dto.direction = [0, 1, 0];\n innerHex2Dto.nrCorners = 6;\n innerHex2Dto.radius = 2;\n const innerHex2 = await wire.createNGonWire(innerHex2Dto);\n\n const outerHex2Dto = new NGonWireDto();\n outerHex2Dto.center = [0, 0, 0];\n outerHex2Dto.direction = [0, 1, 0];\n outerHex2Dto.nrCorners = 6;\n outerHex2Dto.radius = 2.5;\n const outerHex2 = await wire.createNGonWire(outerHex2Dto);\n\n // Create zigzag wires between hexagons\n const zigzag1Dto = new ZigZagBetweenTwoWiresDto();\n zigzag1Dto.wire1 = innerHex1;\n zigzag1Dto.wire2 = outerHex1;\n zigzag1Dto.nrZigZags = nrZigZags;\n zigzag1Dto.inverse = false;\n zigzag1Dto.divideByEqualDistance = false;\n zigzag1Dto.zigZagsPerEdge = true;\n const zigzag1 = await wire.createZigZagBetweenTwoWires(zigzag1Dto);\n\n const scale1Dto = new ScaleDto();\n scale1Dto.shape = zigzag1;\n scale1Dto.factor = 3;\n const zigzag1Scaled = await transforms.scale(scale1Dto);\n\n const zigzag2Dto = new ZigZagBetweenTwoWiresDto();\n zigzag2Dto.wire1 = innerHex2;\n zigzag2Dto.wire2 = outerHex2;\n zigzag2Dto.nrZigZags = nrZigZags;\n zigzag2Dto.inverse = false;\n zigzag2Dto.divideByEqualDistance = false;\n zigzag2Dto.zigZagsPerEdge = true;\n const zigzag2 = await wire.createZigZagBetweenTwoWires(zigzag2Dto);\n\n const scale2Dto = new ScaleDto();\n scale2Dto.shape = zigzag2;\n scale2Dto.factor = 6;\n const zigzag2Scaled = await transforms.scale(scale2Dto);\n\n // Create loft surfaces\n const loft1Dto = new LoftAdvancedDto();\n loft1Dto.shapes = [zigzag2, zigzag1, zigzag1Scaled, zigzag2Scaled];\n loft1Dto.makeSolid = false;\n loft1Dto.closed = false;\n loft1Dto.periodic = false;\n loft1Dto.straight = true;\n loft1Dto.nrPeriodicSections = 10;\n loft1Dto.useSmoothing = false;\n loft1Dto.maxUDegree = 3;\n loft1Dto.tolerance = 1e-7;\n loft1Dto.parType = approxParametrizationTypeEnum.approxCentripetal;\n const loft1 = await operations.loftAdvanced(loft1Dto);\n\n const loft2Dto = new LoftAdvancedDto();\n loft2Dto.shapes = [zigzag2Scaled, zigzag1Scaled];\n loft2Dto.makeSolid = false;\n loft2Dto.closed = false;\n loft2Dto.periodic = false;\n loft2Dto.straight = true;\n loft2Dto.nrPeriodicSections = 10;\n loft2Dto.useSmoothing = false;\n loft2Dto.maxUDegree = 3;\n loft2Dto.tolerance = 1e-7;\n loft1Dto.parType = approxParametrizationTypeEnum.approxCentripetal;\n const loft2 = await operations.loftAdvanced(loft2Dto);\n\n const translateDto = new TranslateDto();\n translateDto.shape = loft2;\n translateDto.translation = [0, 0.3, 0];\n const loft2Translated = await transforms.translate(translateDto);\n\n const loft3Dto = new LoftAdvancedDto();\n loft3Dto.shapes = [zigzag2, zigzag1];\n loft3Dto.makeSolid = false;\n loft3Dto.closed = false;\n loft3Dto.periodic = false;\n loft3Dto.straight = true;\n loft3Dto.nrPeriodicSections = 10;\n loft3Dto.useSmoothing = false;\n loft3Dto.maxUDegree = 3;\n loft3Dto.tolerance = 1e-7;\n loft1Dto.parType = approxParametrizationTypeEnum.approxCentripetal;\n const loft3 = await operations.loftAdvanced(loft3Dto);\n\n // Extract and filter faces\n const faces1All = await face.getFaces({ shape: loft1 });\n const everySecondMain = bitbybit.lists.getNthItem({\n list: faces1All,\n nth: 2,\n offset: 1,\n clone: true\n });\n\n const faces2All = await face.getFaces({ shape: loft2Translated });\n const everySecondEnd1 = bitbybit.lists.getNthItem({\n list: faces2All,\n nth: 2,\n offset: 0,\n clone: true\n });\n\n const faces3All = await face.getFaces({ shape: loft3 });\n const everySecondEnd2 = bitbybit.lists.getNthItem({\n list: faces3All,\n nth: 2,\n offset: 0,\n clone: true\n });\n\n // Combine faces for extrusion\n const facesForExtrusion: TopoDSFacePointer[] = [\n ...everySecondEnd1,\n ...everySecondEnd2\n ];\n\n // Extrude all faces\n const extrudedFaces: TopoDSShapePointer[] = [];\n for (const faceToExtrude of facesForExtrusion) {\n const extrudeDto = new ExtrudeDto();\n extrudeDto.shape = faceToExtrude;\n extrudeDto.direction = [0, 0.3, 0];\n const extruded = await operations.extrude(extrudeDto);\n extrudedFaces.push(extruded);\n }\n\n const extrudedFacesMain: TopoDSShapePointer[] = [];\n for (const faceToExtrude of everySecondMain) {\n const extrudeDto = new ExtrudeDto();\n extrudeDto.shape = faceToExtrude;\n extrudeDto.direction = [0, 0.3, 0];\n const extruded = await operations.extrude(extrudeDto);\n extrudedFacesMain.push(extruded);\n }\n\n // Create compounds\n const compoundDto1 = new ShapesDto();\n compoundDto1.shapes = extrudedFacesMain;\n const compound1 = await compound.makeCompound(compoundDto1);\n\n const compoundDto2 = new ShapesDto();\n compoundDto2.shapes = extrudedFaces;\n const compound2 = await compound.makeCompound(compoundDto2);\n\n // Create materials\n const material1Dto = new PBRMetallicRoughnessDto();\n material1Dto.name = 'Material 1';\n material1Dto.baseColor = '#94b4ff';\n material1Dto.emissiveColor = '#000000';\n material1Dto.metallic = 0.8;\n material1Dto.roughness = 0.2;\n material1Dto.alpha = 1;\n material1Dto.backFaceCulling = false;\n material1Dto.zOffset = 2;\n const material1 = bitbybit.babylon.material.pbrMetallicRoughness.create(material1Dto);\n\n const material2Dto = new PBRMetallicRoughnessDto();\n material2Dto.name = 'Material 2';\n material2Dto.baseColor = '#33ffc2';\n material2Dto.emissiveColor = '#000000';\n material2Dto.metallic = 0.8;\n material2Dto.roughness = 0.2;\n material2Dto.alpha = 1;\n material2Dto.backFaceCulling = false;\n material2Dto.zOffset = 0;\n const material2 = bitbybit.babylon.material.pbrMetallicRoughness.create(material2Dto);\n\n // Draw the compounds\n const drawOptions1 = new DrawOcctShapeOptions();\n drawOptions1.precision = 0.01;\n drawOptions1.faceMaterial = material1;\n drawOptions1.drawEdges = false;\n drawOptions1.edgeColour = '#ffffff';\n drawOptions1.edgeWidth = 4;\n\n await bitbybit.draw.drawAnyAsync({\n entity: compound1,\n options: drawOptions1\n });\n\n const drawOptions2 = new DrawOcctShapeOptions();\n drawOptions2.precision = 0.01;\n drawOptions2.faceMaterial = material2;\n drawOptions2.drawEdges = false;\n drawOptions2.edgeColour = '#ffffff';\n drawOptions2.edgeWidth = 2;\n\n const drawnMesh = await bitbybit.draw.drawAnyAsync({\n entity: compound2,\n options: drawOptions2\n });\n\n const zoomOnOptions = new ZoomOnDto();\n zoomOnOptions.offset = -0.1;\n zoomOnOptions.meshes = [drawnMesh];\n bitbybit.advanced.navigation.zoomOn(zoomOnOptions);\n};\n\nstart();","version":"0.20.14","type":"typescript"}} title="Star ornament with hanging hole" /> diff --git a/docs/learn/code/common/occt/modeling/festive-decor/tree-decoration.md b/docs/learn/code/common/occt/modeling/festive-decor/tree-decoration.md index 62a9eb27..c801ea79 100644 --- a/docs/learn/code/common/occt/modeling/festive-decor/tree-decoration.md +++ b/docs/learn/code/common/occt/modeling/festive-decor/tree-decoration.md @@ -1,5 +1,5 @@ --- -sidebar_position: 5 +sidebar_position: 6 title: Tree Decoration sidebar_label: Tree Decoration description: Create a 3D printable Christmas tree decoration. @@ -81,7 +81,7 @@ All controls use observable listeners to trigger geometry regeneration when valu {\\n // ADD YOUR CODE HERE\\n if (inputs === true) {\\n window.open(\\\"https://bitbybit.dev/app/bitbybit/KtIymkYFZ8Qty9h8mhew/Y7NQIgaXLy0dqffnc825?editor=rete\\\", '_blank').focus();\\n }\\n return inputs;\\n}\"}},\"inputs\":{\"inputs\":{\"connections\":[{\"node\":\"fbe1705ff510913a\",\"output\":\"isA\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"fbe1705ff510913a\",\"output\":\"execA\",\"data\":{}},{\"node\":\"fbe1705ff510913a\",\"output\":\"execB\",\"data\":{}}]}},\"position\":[1749.7763306366996,10636.786904135595]},\"af7350efdb0b85b3\":{\"id\":\"af7350efdb0b85b3\",\"name\":\"bitbybit.babylon.gui.control.createControlObservableSelector\",\"customName\":\"control observable selector\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"selector\":\"onPointerUpObservable\"},\"inputs\":{},\"position\":[686.4715121547069,8508.681235887017]},\"f2e18ffd18566787\":{\"id\":\"f2e18ffd18566787\",\"name\":\"bitbybit.flow.babylon.observableListener\",\"customName\":\"babylon observable listener\",\"data\":{},\"inputs\":{\"object\":{\"connections\":[{\"node\":\"22b0aaced3db29ad\",\"output\":\"result\",\"data\":{}}]},\"observableSelector\":{\"connections\":[{\"node\":\"af7350efdb0b85b3\",\"output\":\"result\",\"data\":{}}]}},\"position\":[1453.070365919411,8258.538315404885]},\"70259fc69f3db105\":{\"id\":\"70259fc69f3db105\",\"name\":\"bitbybit.flow.time.delay\",\"customName\":\"delay\",\"data\":{\"timeout\":0},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"f2e18ffd18566787\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[1987.6045976314351,8437.042718662588]},\"291c95f88aae5725\":{\"id\":\"291c95f88aae5725\",\"name\":\"bitbybit.flow.logic.flipFlop\",\"customName\":\"flip flop\",\"data\":{},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"70259fc69f3db105\",\"output\":\"exec\",\"data\":{}},{\"node\":\"f2e18ffd18566787\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[2323.4070267726706,8288.053843144928]},\"ac5f02670de06852\":{\"id\":\"ac5f02670de06852\",\"name\":\"bitbybit.code.typeScriptEditor\",\"customName\":\"typescript editor\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":true},\"code\":{\"code\":\"// DO NOT REMOVE THIS FUNCTION\\nconst startac5f02670de06852 = async (inputs: any, index: number) => {\\n // ADD YOUR CODE HERE\\n if (inputs === true) {\\n window.open(\\\"https://bitbybit.dev/auth/sign-up\\\", '_blank').focus();\\n }\\n return inputs;\\n}\"}},\"inputs\":{\"inputs\":{\"connections\":[{\"node\":\"291c95f88aae5725\",\"output\":\"isA\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"291c95f88aae5725\",\"output\":\"execA\",\"data\":{}},{\"node\":\"291c95f88aae5725\",\"output\":\"execB\",\"data\":{}}]}},\"position\":[2681.990286952205,8287.587249893892]},\"b5af9279ffdd84e5\":{\"id\":\"b5af9279ffdd84e5\",\"name\":\"bitbybit.babylon.scene.enableSkybox\",\"customName\":\"enable skybox\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"skybox\":\"city\",\"size\":1000,\"blur\":0.5,\"environmentIntensity\":0.7,\"hideSkybox\":false},\"inputs\":{},\"position\":[2884.1306675480555,-186.0490873535386]},\"9dca219fedacecca\":{\"id\":\"9dca219fedacecca\",\"name\":\"bitbybit.flow.babylon.observableListener\",\"customName\":\"babylon observable listener\",\"data\":{},\"inputs\":{\"observableSelector\":{\"connections\":[{\"node\":\"f1f8cf3eadfa0ebb\",\"output\":\"result\",\"data\":{}}]},\"object\":{\"connections\":[{\"node\":\"71fbc1ccee37d577\",\"output\":\"result\",\"data\":{}}]}},\"position\":[385.9268891419183,10329.874563653837]},\"bb201b1ec9f17a1e\":{\"id\":\"bb201b1ec9f17a1e\",\"name\":\"bitbybit.flow.babylon.observableListener\",\"customName\":\"babylon observable listener\",\"data\":{},\"inputs\":{\"observableSelector\":{\"connections\":[{\"node\":\"f1f8cf3eadfa0ebb\",\"output\":\"result\",\"data\":{}}]},\"object\":{\"connections\":[{\"node\":\"fc36f702c3f8146e\",\"output\":\"result\",\"data\":{}}]}},\"position\":[394.16500271911553,10076.96114156523]},\"4a5d1c196a0b447e\":{\"id\":\"4a5d1c196a0b447e\",\"name\":\"bitbybit.flow.time.delay\",\"customName\":\"delay\",\"data\":{\"timeout\":0},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"9dca219fedacecca\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[936.4095297912264,10457.862715124222]},\"4fd171db189ad173\":{\"id\":\"4fd171db189ad173\",\"name\":\"bitbybit.flow.logic.flipFlop\",\"customName\":\"flip flop\",\"data\":{},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"9dca219fedacecca\",\"output\":\"exec\",\"data\":{}},{\"node\":\"4a5d1c196a0b447e\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[1273.654131279585,10355.281487174021]},\"94b6dd1354940df2\":{\"id\":\"94b6dd1354940df2\",\"name\":\"bitbybit.flow.time.delay\",\"customName\":\"delay\",\"data\":{\"timeout\":0},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"bb201b1ec9f17a1e\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[926.4956949832613,10212.522265939324]},\"27eac850201a9701\":{\"id\":\"27eac850201a9701\",\"name\":\"bitbybit.flow.logic.flipFlop\",\"customName\":\"flip flop\",\"data\":{},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"bb201b1ec9f17a1e\",\"output\":\"exec\",\"data\":{}},{\"node\":\"94b6dd1354940df2\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[1272.0778730255988,10103.055278248028]},\"9190095ec9cfd394\":{\"id\":\"9190095ec9cfd394\",\"name\":\"bitbybit.logic.valueGate\",\"customName\":\"value gate\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"boolean\":false},\"inputs\":{\"value\":{\"connections\":[{\"node\":\"73ee3cd6670755bb\",\"output\":\"result\",\"data\":{}}]},\"boolean\":{\"connections\":[{\"node\":\"27eac850201a9701\",\"output\":\"isA\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"27eac850201a9701\",\"output\":\"execA\",\"data\":{}},{\"node\":\"27eac850201a9701\",\"output\":\"execB\",\"data\":{}}]}},\"position\":[2098.7596218076405,9630.876889007699]},\"73ee3cd6670755bb\":{\"id\":\"73ee3cd6670755bb\",\"name\":\"bitbybit.text.create\",\"customName\":\"create\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"bitbybit-toy.step\"},\"inputs\":{},\"position\":[1701.8222304032442,9540.575618331815]},\"f9a87606405961ae\":{\"id\":\"f9a87606405961ae\",\"name\":\"bitbybit.text.create\",\"customName\":\"create\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"bitbybit-toy.stl\"},\"inputs\":{},\"position\":[1934.0481177357838,10057.705993169464]},\"f8db44954a566616\":{\"id\":\"f8db44954a566616\",\"name\":\"bitbybit.logic.valueGate\",\"customName\":\"value gate\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"boolean\":false},\"inputs\":{\"value\":{\"connections\":[{\"node\":\"f9a87606405961ae\",\"output\":\"result\",\"data\":{}}]},\"boolean\":{\"connections\":[{\"node\":\"4fd171db189ad173\",\"output\":\"isA\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"4fd171db189ad173\",\"output\":\"execA\",\"data\":{}},{\"node\":\"4fd171db189ad173\",\"output\":\"execB\",\"data\":{}}]}},\"position\":[2360.5651787274305,10179.991268481712]},\"7ae3f1f373ab7ce8\":{\"id\":\"7ae3f1f373ab7ce8\",\"name\":\"bitbybit.occt.io.saveShapeSTEPAndReturn\",\"customName\":\"save shape step and return\",\"async\":true,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"fileName\":\"\",\"adjustYtoZ\":true,\"fromRightHanded\":false,\"tryDownload\":true},\"inputs\":{\"shape\":{\"connections\":[{\"node\":\"ff3a5dfe26c1203f\",\"output\":\"result\",\"data\":{}}]},\"fileName\":{\"connections\":[{\"node\":\"9190095ec9cfd394\",\"output\":\"result\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"9190095ec9cfd394\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[4105.580503617983,9860.933809645778]},\"b358af77da1782cf\":{\"id\":\"b358af77da1782cf\",\"name\":\"bitbybit.occt.io.saveShapeStl\",\"customName\":\"save shape stl\",\"async\":true,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"fileName\":\"shape.stl\",\"precision\":0.01,\"adjustYtoZ\":true,\"tryDownload\":true,\"binary\":true},\"inputs\":{\"fileName\":{\"connections\":[{\"node\":\"f8db44954a566616\",\"output\":\"result\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"f8db44954a566616\",\"output\":\"exec\",\"data\":{}}]},\"shape\":{\"connections\":[{\"node\":\"ff3a5dfe26c1203f\",\"output\":\"result\",\"data\":{}}]}},\"position\":[4097.343815578738,10313.986149668373]},\"feef4ec0e40282e7\":{\"id\":\"feef4ec0e40282e7\",\"name\":\"bitbybit.math.number\",\"customName\":\"number\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"number\":0.5},\"inputs\":{},\"position\":[2389.4392361815517,2241.565476619029]},\"03303a3d3cb2a6b5\":{\"id\":\"03303a3d3cb2a6b5\",\"name\":\"bitbybit.json.parse\",\"customName\":\"parse\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"[true,false,true,true]\"},\"inputs\":{},\"position\":[2389.302212365796,2597.6283579746796]},\"f39c312f7e1e1bef\":{\"id\":\"f39c312f7e1e1bef\",\"name\":\"bitbybit.flow.babylon.observableListener\",\"customName\":\"babylon observable listener\",\"data\":{},\"inputs\":{\"observableSelector\":{\"connections\":[{\"node\":\"19dd5abb3a2ed30a\",\"output\":\"result\",\"data\":{}}]},\"object\":{\"connections\":[{\"node\":\"dda72ba4bc855075\",\"output\":\"result\",\"data\":{}}]}},\"position\":[634.3045048773648,6411.35023828563]},\"19dd5abb3a2ed30a\":{\"id\":\"19dd5abb3a2ed30a\",\"name\":\"bitbybit.babylon.gui.slider.createSliderObservableSelector\",\"customName\":\"slider observable selector\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"selector\":\"onValueChangedObservable\"},\"inputs\":{},\"position\":[119.33402358269528,6252.634270289916]},\"3f3e9efb919889cb\":{\"id\":\"3f3e9efb919889cb\",\"name\":\"bitbybit.flow.babylon.observableListener\",\"customName\":\"babylon observable listener\",\"data\":{},\"inputs\":{\"observableSelector\":{\"connections\":[{\"node\":\"19dd5abb3a2ed30a\",\"output\":\"result\",\"data\":{}}]},\"object\":{\"connections\":[{\"node\":\"eb164cb9f2c3d0b2\",\"output\":\"result\",\"data\":{}}]}},\"position\":[626.2393558517689,6035.026931379336]},\"b85e303f418ea094\":{\"id\":\"b85e303f418ea094\",\"name\":\"bitbybit.flow.babylon.getEventDataFromObservedResult\",\"customName\":\"get event data\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false}},\"inputs\":{\"json\":{\"connections\":[{\"node\":\"3f3e9efb919889cb\",\"output\":\"result\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"3f3e9efb919889cb\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[1213.8284182083087,6031.8004190176025]},\"0ae184887b347212\":{\"id\":\"0ae184887b347212\",\"name\":\"bitbybit.flow.babylon.getEventDataFromObservedResult\",\"customName\":\"get event data\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false}},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"f39c312f7e1e1bef\",\"output\":\"exec\",\"data\":{}}]},\"json\":{\"connections\":[{\"node\":\"f39c312f7e1e1bef\",\"output\":\"result\",\"data\":{}}]}},\"position\":[1212.113699374194,6401.279001431719]},\"ffecd6164df0c288\":{\"id\":\"ffecd6164df0c288\",\"name\":\"bitbybit.logic.firstDefinedValueGate\",\"customName\":\"first defined value gate\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false}},\"inputs\":{\"value1\":{\"connections\":[{\"node\":\"b85e303f418ea094\",\"output\":\"result\",\"data\":{}}]},\"value2\":{\"connections\":[{\"node\":\"6e51a85f13ab5259\",\"output\":\"result\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"b85e303f418ea094\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[1795.1547936226411,6012.662361553964]},\"d90e74b18631a7e7\":{\"id\":\"d90e74b18631a7e7\",\"name\":\"bitbybit.logic.firstDefinedValueGate\",\"customName\":\"first defined value gate\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false}},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"0ae184887b347212\",\"output\":\"exec\",\"data\":{}}]},\"value2\":{\"connections\":[{\"node\":\"dc27ec58598933e4\",\"output\":\"result\",\"data\":{}}]},\"value1\":{\"connections\":[{\"node\":\"0ae184887b347212\",\"output\":\"result\",\"data\":{}}]}},\"position\":[1827.0393870782336,6490.834733956343]},\"9ed742a672a607ce\":{\"id\":\"9ed742a672a607ce\",\"name\":\"bitbybit.lists.createList\",\"customName\":\"create list\",\"data\":{},\"inputs\":{\"listElements\":{\"connections\":[{\"node\":\"ffecd6164df0c288\",\"output\":\"result\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"ffecd6164df0c288\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[2408.212815313349,6050.3207511429555]},\"48046af83dbc9299\":{\"id\":\"48046af83dbc9299\",\"name\":\"bitbybit.lists.createList\",\"customName\":\"create list\",\"data\":{},\"inputs\":{\"listElements\":{\"connections\":[{\"node\":\"d90e74b18631a7e7\",\"output\":\"result\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"d90e74b18631a7e7\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[2407.3069815807094,6523.841211518347]},\"46f99a9e9cfc9152\":{\"id\":\"46f99a9e9cfc9152\",\"name\":\"bitbybit.text.format\",\"customName\":\"format\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"Number Of Rays - {0}\",\"values\":[\"World\"]},\"inputs\":{\"values\":{\"connections\":[{\"node\":\"9ed742a672a607ce\",\"output\":\"list\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"9ed742a672a607ce\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[2774.3846965928947,5974.2361780617475]},\"ced830dd20fb5b02\":{\"id\":\"ced830dd20fb5b02\",\"name\":\"bitbybit.text.format\",\"customName\":\"format\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"Vertical Divsions - {0}\",\"values\":[\"World\"]},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"48046af83dbc9299\",\"output\":\"exec\",\"data\":{}}]},\"values\":{\"connections\":[{\"node\":\"48046af83dbc9299\",\"output\":\"list\",\"data\":{}}]}},\"position\":[2794.9763891153702,6450.397669292677]},\"af2cb4893a5bc1cb\":{\"id\":\"af2cb4893a5bc1cb\",\"name\":\"bitbybit.babylon.gui.textBlock.setText\",\"customName\":\"set text\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"\"},\"inputs\":{\"text\":{\"connections\":[{\"node\":\"46f99a9e9cfc9152\",\"output\":\"result\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"46f99a9e9cfc9152\",\"output\":\"exec\",\"data\":{}}]},\"textBlock\":{\"connections\":[{\"node\":\"f80263a3d6977ea4\",\"output\":\"result\",\"data\":{}}]}},\"position\":[3408.9286383465733,6175.853417797766]},\"bb5fa4b16d910cb5\":{\"id\":\"bb5fa4b16d910cb5\",\"name\":\"bitbybit.babylon.gui.textBlock.setText\",\"customName\":\"set text\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"\"},\"inputs\":{\"textBlock\":{\"connections\":[{\"node\":\"a3006cf7f5041ef6\",\"output\":\"result\",\"data\":{}}]},\"text\":{\"connections\":[{\"node\":\"ced830dd20fb5b02\",\"output\":\"result\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"ced830dd20fb5b02\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[3443.5303027369487,6538.552534619226]},\"8ecfa2d91d973882\":{\"id\":\"8ecfa2d91d973882\",\"name\":\"bitbybit.babylon.gui.control.createControlObservableSelector\",\"customName\":\"control observable selector\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"selector\":\"onPointerUpObservable\"},\"inputs\":{},\"position\":[112.53197228874697,7216.911800887681]},\"8478c18af95701d2\":{\"id\":\"8478c18af95701d2\",\"name\":\"bitbybit.flow.babylon.observableListener\",\"customName\":\"babylon observable listener\",\"data\":{},\"inputs\":{\"observableSelector\":{\"connections\":[{\"node\":\"8ecfa2d91d973882\",\"output\":\"result\",\"data\":{}}]},\"object\":{\"connections\":[{\"node\":\"dda72ba4bc855075\",\"output\":\"result\",\"data\":{}}]}},\"position\":[666.0061734678349,7042.204203322666]},\"fa5a486b0621317a\":{\"id\":\"fa5a486b0621317a\",\"name\":\"bitbybit.flow.babylon.observableListener\",\"customName\":\"babylon observable listener\",\"data\":{},\"inputs\":{\"observableSelector\":{\"connections\":[{\"node\":\"8ecfa2d91d973882\",\"output\":\"result\",\"data\":{}}]},\"object\":{\"connections\":[{\"node\":\"eb164cb9f2c3d0b2\",\"output\":\"result\",\"data\":{}}]}},\"position\":[667.4427756519425,6826.609623951564]},\"7299a501c8e860c5\":{\"id\":\"7299a501c8e860c5\",\"name\":\"bitbybit.lists.passThrough\",\"customName\":\"pass through\",\"data\":{},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"fa5a486b0621317a\",\"output\":\"exec\",\"data\":{}},{\"node\":\"8478c18af95701d2\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[6778.4019145441225,6945.999036012015]},\"68fc3da5a920f715\":{\"id\":\"68fc3da5a920f715\",\"name\":\"bitbybit.babylon.scene.adjustActiveArcRotateCamera\",\"customName\":\"adjust active arc rotate camera\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"position\":[10,10,10],\"lookAt\":[0,0,0],\"lowerBetaLimit\":1,\"upperBetaLimit\":179,\"angularSensibilityX\":1000,\"angularSensibilityY\":1000,\"maxZ\":1000,\"panningSensibility\":1000,\"wheelPrecision\":3},\"inputs\":{\"position\":{\"connections\":[{\"node\":\"2c23a73974610198\",\"output\":\"result\",\"data\":{}}]},\"lookAt\":{\"connections\":[{\"node\":\"4b908f56b3ed505c\",\"output\":\"result\",\"data\":{}}]}},\"position\":[2457.6836534900826,-2687.8751308577216]},\"2c23a73974610198\":{\"id\":\"2c23a73974610198\",\"name\":\"bitbybit.vector.vectorXYZ\",\"customName\":\"vector xyz\",\"async\":false,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"x\":30,\"y\":25,\"z\":0},\"inputs\":{},\"position\":[2028.1960653764377,-2763.197379436671]},\"4b908f56b3ed505c\":{\"id\":\"4b908f56b3ed505c\",\"name\":\"bitbybit.vector.vectorXYZ\",\"customName\":\"vector xyz\",\"async\":false,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"x\":0,\"y\":4,\"z\":0},\"inputs\":{},\"position\":[2033.62438677469,-2317.355175655833]}}}","version":"0.20.12","type":"rete"}} + script={{"script":"{\"id\":\"rete-v2-json\",\"nodes\":{\"4534540d6856552d\":{\"id\":\"4534540d6856552d\",\"name\":\"bitbybit.occt.shapes.wire.createStarWire\",\"customName\":\"star wire\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"center\":[0,0,0],\"direction\":[0,1,0],\"numRays\":12,\"outerRadius\":20,\"innerRadius\":12,\"offsetOuterEdges\":0,\"half\":false},\"inputs\":{\"numRays\":{\"connections\":[{\"node\":\"ffecd6164df0c288\",\"output\":\"result\",\"data\":{}}]}},\"position\":[29.498322548778063,508.0780203076317]},\"b983a207fda22099\":{\"id\":\"b983a207fda22099\",\"name\":\"bitbybit.occt.transforms.translate\",\"customName\":\"translate\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"translation\":[0,0,0]},\"inputs\":{\"translation\":{\"connections\":[{\"node\":\"76bf07ac6376dd9d\",\"output\":\"result\",\"data\":{}}]},\"shape\":{\"connections\":[{\"node\":\"892079e9447f3eae\",\"output\":\"result\",\"data\":{}}]}},\"position\":[1421.0202335352003,1035.739426279123]},\"76bf07ac6376dd9d\":{\"id\":\"76bf07ac6376dd9d\",\"name\":\"bitbybit.vector.vectorXYZ\",\"customName\":\"vector xyz\",\"async\":false,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"x\":0,\"y\":20,\"z\":0},\"inputs\":{},\"position\":[4.113044262054515,1088.1382664289113]},\"892079e9447f3eae\":{\"id\":\"892079e9447f3eae\",\"name\":\"bitbybit.occt.transforms.scale\",\"customName\":\"scale\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"factor\":0.15},\"inputs\":{\"shape\":{\"connections\":[{\"node\":\"4534540d6856552d\",\"output\":\"result\",\"data\":{}}]}},\"position\":[1039.174244697755,869.9580356533191]},\"11549f1b45ea9b19\":{\"id\":\"11549f1b45ea9b19\",\"name\":\"bitbybit.occt.transforms.translate\",\"customName\":\"translate\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"translation\":[0,0,0]},\"inputs\":{\"translation\":{\"connections\":[{\"node\":\"ed8b1944898e2ce1\",\"output\":\"result\",\"data\":{}}]},\"shape\":{\"connections\":[{\"node\":\"cb6929579b17268b\",\"output\":\"result\",\"data\":{}}]}},\"position\":[843.9071289289463,1724.0141995434674]},\"ed8b1944898e2ce1\":{\"id\":\"ed8b1944898e2ce1\",\"name\":\"bitbybit.vector.vectorXYZ\",\"customName\":\"vector xyz\",\"async\":false,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"x\":0,\"y\":-5,\"z\":0},\"inputs\":{},\"position\":[407.2814628248683,1768.0222128529601]},\"c7bdc15abbc2ba7d\":{\"id\":\"c7bdc15abbc2ba7d\",\"name\":\"bitbybit.occt.operations.loft\",\"customName\":\"loft\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"makeSolid\":false},\"inputs\":{\"shapes\":{\"connections\":[{\"node\":\"875673f0ab1bb510\",\"output\":\"list\",\"data\":{}}]}},\"position\":[2071.471395598051,848.4908460058068]},\"875673f0ab1bb510\":{\"id\":\"875673f0ab1bb510\",\"name\":\"bitbybit.lists.createList\",\"customName\":\"create list\",\"data\":{},\"inputs\":{\"listElements\":{\"connections\":[{\"node\":\"47f69e3aabe06071\",\"output\":\"result\",\"data\":{}},{\"node\":\"b983a207fda22099\",\"output\":\"result\",\"data\":{}},{\"node\":\"4534540d6856552d\",\"output\":\"result\",\"data\":{}}]}},\"position\":[1782.785359527408,889.106870548469]},\"47f69e3aabe06071\":{\"id\":\"47f69e3aabe06071\",\"name\":\"bitbybit.occt.transforms.translate\",\"customName\":\"translate\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"translation\":[0,0,0]},\"inputs\":{\"translation\":{\"connections\":[{\"node\":\"a15b2d55874ba400\",\"output\":\"result\",\"data\":{}}]},\"shape\":{\"connections\":[{\"node\":\"f360184ff5aba2df\",\"output\":\"result\",\"data\":{}}]}},\"position\":[1245.2288399130869,247.04605010960086]},\"f360184ff5aba2df\":{\"id\":\"f360184ff5aba2df\",\"name\":\"bitbybit.occt.transforms.scale\",\"customName\":\"scale\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"factor\":0.25},\"inputs\":{\"shape\":{\"connections\":[{\"node\":\"4534540d6856552d\",\"output\":\"result\",\"data\":{}}]}},\"position\":[793.2018829015179,318.06376415603927]},\"a15b2d55874ba400\":{\"id\":\"a15b2d55874ba400\",\"name\":\"bitbybit.vector.vectorXYZ\",\"customName\":\"vector xyz\",\"async\":false,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"x\":0,\"y\":30,\"z\":0},\"inputs\":{},\"position\":[794.3690505014016,-54.119980109301466]},\"16e58d428c0abb1e\":{\"id\":\"16e58d428c0abb1e\",\"name\":\"bitbybit.babylon.scene.drawDirectionalLight\",\"customName\":\"draw directional light\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"direction\":[-100,-100,-100],\"intensity\":3,\"diffuse\":\"#ffffff\",\"specular\":\"#ffffff\",\"shadowGeneratorMapSize\":1024,\"enableShadows\":true,\"shadowDarkness\":0,\"shadowUsePercentageCloserFiltering\":true,\"shadowContactHardeningLightSizeUVRatio\":0.2,\"shadowBias\":0.0001,\"shadowNormalBias\":0.002,\"shadowMaxZ\":1000,\"shadowMinZ\":0},\"inputs\":{\"direction\":{\"connections\":[{\"node\":\"fa96ae89f95b4b18\",\"output\":\"result\",\"data\":{}}]}},\"position\":[2410.2001319497786,-1854.3247886875574]},\"cb6929579b17268b\":{\"id\":\"cb6929579b17268b\",\"name\":\"bitbybit.occt.transforms.scale\",\"customName\":\"scale\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"factor\":0.3},\"inputs\":{\"shape\":{\"connections\":[{\"node\":\"4534540d6856552d\",\"output\":\"result\",\"data\":{}}]}},\"position\":[457.0402990348086,1405.480031322518]},\"e9b4d2a7926e953f\":{\"id\":\"e9b4d2a7926e953f\",\"name\":\"bitbybit.occt.operations.loftAdvanced\",\"customName\":\"loft advanced\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"makeSolid\":false,\"closed\":false,\"periodic\":false,\"straight\":false,\"nrPeriodicSections\":10,\"useSmoothing\":false,\"maxUDegree\":3,\"tolerance\":1e-7,\"parType\":\"approxCentripetal\"},\"inputs\":{\"shapes\":{\"connections\":[{\"node\":\"570ca0cbda09cb78\",\"output\":\"list\",\"data\":{}}]},\"startVertex\":{\"connections\":[{\"node\":\"294942bd7a13ef3b\",\"output\":\"result\",\"data\":{}}]}},\"position\":[1793.6009797350105,1402.1120964226682]},\"570ca0cbda09cb78\":{\"id\":\"570ca0cbda09cb78\",\"name\":\"bitbybit.lists.createList\",\"customName\":\"create list\",\"data\":{},\"inputs\":{\"listElements\":{\"connections\":[{\"node\":\"11549f1b45ea9b19\",\"output\":\"result\",\"data\":{}},{\"node\":\"4534540d6856552d\",\"output\":\"result\",\"data\":{}}]}},\"position\":[1321.0103546184212,1396.929370018355]},\"294942bd7a13ef3b\":{\"id\":\"294942bd7a13ef3b\",\"name\":\"bitbybit.vector.vectorXYZ\",\"customName\":\"vector xyz\",\"async\":false,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"x\":0,\"y\":-10,\"z\":0},\"inputs\":{},\"position\":[1348.5723772315805,1760.5007306049315]},\"14ff0cda52cd7ce0\":{\"id\":\"14ff0cda52cd7ce0\",\"name\":\"bitbybit.occt.shapes.face.createFaceFromWire\",\"customName\":\"face from wire\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"planar\":true},\"inputs\":{\"shape\":{\"connections\":[{\"node\":\"47f69e3aabe06071\",\"output\":\"result\",\"data\":{}}]}},\"position\":[1836.8581524949377,110.6324723551911]},\"a153773318fd229a\":{\"id\":\"a153773318fd229a\",\"name\":\"bitbybit.lists.createList\",\"customName\":\"create list\",\"data\":{},\"inputs\":{\"listElements\":{\"connections\":[{\"node\":\"fda5ede008aae952\",\"output\":\"result\",\"data\":{}},{\"node\":\"e5331e883d23938e\",\"output\":\"result\",\"data\":{}},{\"node\":\"3bc9cf346fc8ef2a\",\"output\":\"result\",\"data\":{}},{\"node\":\"5a762f02bed474cd\",\"output\":\"result\",\"data\":{}},{\"node\":\"e9b4d2a7926e953f\",\"output\":\"result\",\"data\":{}},{\"node\":\"ed8dca56f5a8e402\",\"output\":\"result\",\"data\":{}},{\"node\":\"14ff0cda52cd7ce0\",\"output\":\"result\",\"data\":{}}]}},\"position\":[7499.583074067741,153.2312211535806]},\"ec6a4cb0d7105988\":{\"id\":\"ec6a4cb0d7105988\",\"name\":\"bitbybit.occt.shapes.shell.sewFaces\",\"customName\":\"sew faces\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"tolerance\":1e-7},\"inputs\":{\"shapes\":{\"connections\":[{\"node\":\"a153773318fd229a\",\"output\":\"list\",\"data\":{}}]}},\"position\":[7778.252945194093,116.96317643777269]},\"d533f9b2b358e932\":{\"id\":\"d533f9b2b358e932\",\"name\":\"bitbybit.occt.shapes.solid.fromClosedShell\",\"customName\":\"from closed shell\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false}},\"inputs\":{\"shape\":{\"connections\":[{\"node\":\"ec6a4cb0d7105988\",\"output\":\"result\",\"data\":{}}]}},\"position\":[8740.894126518644,641.4684856178552]},\"65118a904f1bcadd\":{\"id\":\"65118a904f1bcadd\",\"name\":\"bitbybit.draw.drawAnyAsync\",\"customName\":\"draw any async\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false}},\"inputs\":{\"options\":{\"connections\":[{\"node\":\"9d5759bf6abda9ea\",\"output\":\"result\",\"data\":{}}]},\"entity\":{\"connections\":[{\"node\":\"ff3a5dfe26c1203f\",\"output\":\"result\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"7299a501c8e860c5\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[10417.684603457687,1646.8416215802954]},\"9d5759bf6abda9ea\":{\"id\":\"9d5759bf6abda9ea\",\"name\":\"bitbybit.draw.optionsOcctShape\",\"customName\":\"options occt shape\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"faceOpacity\":1,\"edgeOpacity\":1,\"edgeColour\":\"#005e99\",\"faceColour\":\"#ffffff\",\"vertexColour\":\"#ff00ff\",\"edgeWidth\":1,\"vertexSize\":0.03,\"drawEdges\":true,\"drawFaces\":true,\"drawVertices\":false,\"precision\":0.005,\"drawEdgeIndexes\":false,\"edgeIndexHeight\":0.06,\"edgeIndexColour\":\"#ff00ff\",\"drawFaceIndexes\":false,\"faceIndexHeight\":0.06,\"faceIndexColour\":\"#0000ff\"},\"inputs\":{\"faceMaterial\":{\"connections\":[{\"node\":\"9cd68061ec4fd9e0\",\"output\":\"result\",\"data\":{}}]}},\"position\":[9991.876413478969,2364.565814067178]},\"825b687b6334e027\":{\"id\":\"825b687b6334e027\",\"name\":\"bitbybit.occt.shapes.face.getFaces\",\"customName\":\"get faces\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false}},\"inputs\":{\"shape\":{\"connections\":[{\"node\":\"c7bdc15abbc2ba7d\",\"output\":\"result\",\"data\":{}}]}},\"position\":[2383.6709076575817,1519.6762847896136]},\"74d09b8bdb4c5048\":{\"id\":\"74d09b8bdb4c5048\",\"name\":\"bitbybit.occt.shapes.face.subdivideToRectangleHoles\",\"customName\":\"subdivide to rectangle holes\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"nrRectanglesU\":1,\"nrRectanglesV\":1,\"holesToFaces\":true,\"offsetFromBorderU\":0,\"offsetFromBorderV\":0.02},\"inputs\":{\"shape\":{\"connections\":[{\"node\":\"db2f29c28fce9a44\",\"output\":\"result\",\"data\":{}}]},\"scalePatternV\":{\"connections\":[{\"node\":\"6f4928a56906774a\",\"output\":\"list\",\"data\":{}}]},\"inclusionPattern\":{\"connections\":[{\"node\":\"03303a3d3cb2a6b5\",\"output\":\"result\",\"data\":{}}]},\"nrRectanglesV\":{\"connections\":[{\"node\":\"d90e74b18631a7e7\",\"output\":\"result\",\"data\":{}}]}},\"position\":[3092.608348037154,1633.6879372044598]},\"db2f29c28fce9a44\":{\"id\":\"db2f29c28fce9a44\",\"name\":\"bitbybit.lists.flatten\",\"customName\":\"flatten\",\"data\":{\"nrLevels\":1},\"inputs\":{\"list\":{\"connections\":[{\"node\":\"825b687b6334e027\",\"output\":\"result\",\"data\":{}}]}},\"position\":[2676.745386245579,1557.1555615832751]},\"ed8dca56f5a8e402\":{\"id\":\"ed8dca56f5a8e402\",\"name\":\"bitbybit.occt.shapes.shell.sewFaces\",\"customName\":\"sew faces\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"tolerance\":1e-7},\"inputs\":{\"shapes\":{\"connections\":[{\"node\":\"f3620701c3c1ae55\",\"output\":\"list\",\"data\":{}}]}},\"position\":[4717.860180433169,974.4537366731146]},\"f3620701c3c1ae55\":{\"id\":\"f3620701c3c1ae55\",\"name\":\"bitbybit.lists.createList\",\"customName\":\"create list\",\"data\":{},\"inputs\":{\"listElements\":{\"connections\":[{\"node\":\"7ea739c655493f9b\",\"output\":\"result\",\"data\":{}}]}},\"position\":[4391.51664332526,1126.3749180224165]},\"5a31954b0015e697\":{\"id\":\"5a31954b0015e697\",\"name\":\"bitbybit.lists.getItem\",\"customName\":\"get item\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"index\":0,\"clone\":true},\"inputs\":{\"list\":{\"connections\":[{\"node\":\"74d09b8bdb4c5048\",\"output\":\"result\",\"data\":{}}]}},\"position\":[3583.928722911858,1609.7248549515402]},\"198a03b80b487592\":{\"id\":\"198a03b80b487592\",\"name\":\"bitbybit.math.number\",\"customName\":\"number\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"number\":0.75},\"inputs\":{},\"position\":[2390.350829226262,1944.6338134400619]},\"6f4928a56906774a\":{\"id\":\"6f4928a56906774a\",\"name\":\"bitbybit.lists.createList\",\"customName\":\"create list\",\"data\":{},\"inputs\":{\"listElements\":{\"connections\":[{\"node\":\"198a03b80b487592\",\"output\":\"result\",\"data\":{}},{\"node\":\"feef4ec0e40282e7\",\"output\":\"result\",\"data\":{}}]}},\"position\":[2699.5900851326587,1981.4990347629055]},\"b14378ceb8bf7fc5\":{\"id\":\"b14378ceb8bf7fc5\",\"name\":\"bitbybit.occt.transforms.scale3d\",\"customName\":\"scale 3d\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"scale\":[1,1,1],\"center\":[0,0,0]},\"inputs\":{\"center\":{\"connections\":[{\"node\":\"719d567df8fbd349\",\"output\":\"result\",\"data\":{}}]},\"scale\":{\"connections\":[{\"node\":\"efb0980b63aa8487\",\"output\":\"result\",\"data\":{}}]},\"shape\":{\"connections\":[{\"node\":\"a385c2492e4ef6f1\",\"output\":\"result\",\"data\":{}}]}},\"position\":[4341.167538667826,2759.8646823683453]},\"719d567df8fbd349\":{\"id\":\"719d567df8fbd349\",\"name\":\"bitbybit.vector.vectorXYZ\",\"customName\":\"vector xyz\",\"async\":false,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"x\":0,\"y\":0,\"z\":0},\"inputs\":{},\"position\":[3112.9806205260847,3674.4933141041506]},\"efb0980b63aa8487\":{\"id\":\"efb0980b63aa8487\",\"name\":\"bitbybit.vector.vectorXYZ\",\"customName\":\"vector xyz\",\"async\":false,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"x\":2,\"y\":1,\"z\":2},\"inputs\":{\"x\":{\"connections\":[{\"node\":\"80d8c2210e2c8ada\",\"output\":\"result\",\"data\":{}}]},\"z\":{\"connections\":[{\"node\":\"80d8c2210e2c8ada\",\"output\":\"result\",\"data\":{}}]}},\"position\":[3116.886056928245,2953.518975707273]},\"e5331e883d23938e\":{\"id\":\"e5331e883d23938e\",\"name\":\"bitbybit.occt.transforms.scale3d\",\"customName\":\"scale 3d\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"scale\":[1,1,1],\"center\":[0,0,0]},\"inputs\":{\"scale\":{\"connections\":[{\"node\":\"efb0980b63aa8487\",\"output\":\"result\",\"data\":{}}]},\"center\":{\"connections\":[{\"node\":\"719d567df8fbd349\",\"output\":\"result\",\"data\":{}}]},\"shape\":{\"connections\":[{\"node\":\"5a31954b0015e697\",\"output\":\"result\",\"data\":{}}]}},\"position\":[4356.028359232859,1903.9072650668625]},\"0a8bd4a673a282d0\":{\"id\":\"0a8bd4a673a282d0\",\"name\":\"bitbybit.lists.createList\",\"customName\":\"create list\",\"data\":{},\"inputs\":{\"listElements\":{\"connections\":[{\"node\":\"b6dab3ff34eb97a4\",\"output\":\"list\",\"data\":{}},{\"node\":\"a2a0a302a67ae9ff\",\"output\":\"list\",\"data\":{}}]}},\"position\":[5446.717449196535,2603.210206102196]},\"b6dab3ff34eb97a4\":{\"id\":\"b6dab3ff34eb97a4\",\"name\":\"bitbybit.lists.createList\",\"customName\":\"create list\",\"data\":{},\"inputs\":{\"listElements\":{\"connections\":[{\"node\":\"dd44e69c6aba7a0d\",\"output\":\"result\",\"data\":{}}]}},\"position\":[5014.862418857628,2443.6518849559025]},\"a2a0a302a67ae9ff\":{\"id\":\"a2a0a302a67ae9ff\",\"name\":\"bitbybit.lists.createList\",\"customName\":\"create list\",\"data\":{},\"inputs\":{\"listElements\":{\"connections\":[{\"node\":\"f9fb91cec187f7f0\",\"output\":\"result\",\"data\":{}}]}},\"position\":[5008.316988126108,2795.910343024419]},\"82d90ff3973291d4\":{\"id\":\"82d90ff3973291d4\",\"name\":\"bitbybit.lists.flipLists\",\"customName\":\"flip lists\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"clone\":true},\"inputs\":{\"list\":{\"connections\":[{\"node\":\"0a8bd4a673a282d0\",\"output\":\"list\",\"data\":{}}]}},\"position\":[5738.875610128508,2566.2260951248236]},\"9df5fcaa8f7c02cc\":{\"id\":\"9df5fcaa8f7c02cc\",\"name\":\"bitbybit.lists.flatten\",\"customName\":\"flatten\",\"data\":{\"nrLevels\":1},\"inputs\":{\"list\":{\"connections\":[{\"node\":\"82d90ff3973291d4\",\"output\":\"result\",\"data\":{}}]}},\"position\":[6058.59415221766,2603.0978039381016]},\"5a762f02bed474cd\":{\"id\":\"5a762f02bed474cd\",\"name\":\"bitbybit.occt.operations.loft\",\"customName\":\"loft\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"makeSolid\":false},\"inputs\":{\"shapes\":{\"connections\":[{\"node\":\"9df5fcaa8f7c02cc\",\"output\":\"result\",\"data\":{}}]}},\"position\":[6404.947065733184,2560.232098026223]},\"80d8c2210e2c8ada\":{\"id\":\"80d8c2210e2c8ada\",\"name\":\"bitbybit.math.number\",\"customName\":\"number\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"number\":1.2},\"inputs\":{},\"position\":[2535.8992541451094,3162.3018861132055]},\"fa96ae89f95b4b18\":{\"id\":\"fa96ae89f95b4b18\",\"name\":\"bitbybit.vector.vectorXYZ\",\"customName\":\"vector xyz\",\"async\":false,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"x\":-100,\"y\":-100,\"z\":-100},\"inputs\":{},\"position\":[1862.3555027829957,-1849.8844786271547]},\"9cd68061ec4fd9e0\":{\"id\":\"9cd68061ec4fd9e0\",\"name\":\"bitbybit.babylon.material.pbrMetallicRoughness.create\",\"customName\":\"pbr metallic roughness\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"name\":\"Custom Material\",\"baseColor\":\"#94c2ff\",\"emissiveColor\":\"#3b77b0\",\"metallic\":0.8,\"roughness\":0.29,\"alpha\":1,\"backFaceCulling\":false,\"zOffset\":2},\"inputs\":{},\"position\":[9605.741806654112,2831.949431044085]},\"3901011d12c76eef\":{\"id\":\"3901011d12c76eef\",\"name\":\"bitbybit.occt.transforms.scale3d\",\"customName\":\"scale 3d\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"scale\":[1,1,1],\"center\":[0,0,0]},\"inputs\":{\"shape\":{\"connections\":[{\"node\":\"47f69e3aabe06071\",\"output\":\"result\",\"data\":{}}]},\"scale\":{\"connections\":[{\"node\":\"efb0980b63aa8487\",\"output\":\"result\",\"data\":{}}]},\"center\":{\"connections\":[{\"node\":\"719d567df8fbd349\",\"output\":\"result\",\"data\":{}}]}},\"position\":[4364.581071106104,1476.346832014063]},\"3bc9cf346fc8ef2a\":{\"id\":\"3bc9cf346fc8ef2a\",\"name\":\"bitbybit.occt.transforms.scale3d\",\"customName\":\"scale 3d\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"scale\":[1,1,1],\"center\":[0,0,0]},\"inputs\":{\"shape\":{\"connections\":[{\"node\":\"e9b4d2a7926e953f\",\"output\":\"result\",\"data\":{}}]},\"center\":{\"connections\":[{\"node\":\"719d567df8fbd349\",\"output\":\"result\",\"data\":{}}]},\"scale\":{\"connections\":[{\"node\":\"43f2efdf3003002e\",\"output\":\"result\",\"data\":{}}]}},\"position\":[4345.11797828289,3210.3573065763057]},\"b313faa82fc7f582\":{\"id\":\"b313faa82fc7f582\",\"name\":\"bitbybit.lists.createList\",\"customName\":\"create list\",\"data\":{},\"inputs\":{\"listElements\":{\"connections\":[{\"node\":\"3901011d12c76eef\",\"output\":\"result\",\"data\":{}}]}},\"position\":[4860.068544678273,1517.2274588686575]},\"fda5ede008aae952\":{\"id\":\"fda5ede008aae952\",\"name\":\"bitbybit.occt.operations.loftAdvanced\",\"customName\":\"loft advanced\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"makeSolid\":false,\"closed\":false,\"periodic\":false,\"straight\":false,\"nrPeriodicSections\":10,\"useSmoothing\":false,\"maxUDegree\":3,\"tolerance\":1e-7,\"parType\":\"approxCentripetal\"},\"inputs\":{\"shapes\":{\"connections\":[{\"node\":\"b313faa82fc7f582\",\"output\":\"list\",\"data\":{}}]},\"startVertex\":{\"connections\":[{\"node\":\"cbacaf56751f477c\",\"output\":\"result\",\"data\":{}}]}},\"position\":[5327.662487993239,1465.5007248302118]},\"cbacaf56751f477c\":{\"id\":\"cbacaf56751f477c\",\"name\":\"bitbybit.vector.vectorXYZ\",\"customName\":\"vector xyz\",\"async\":false,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"x\":0,\"y\":32,\"z\":0},\"inputs\":{},\"position\":[4910.618536230501,1875.6153539025163]},\"43f2efdf3003002e\":{\"id\":\"43f2efdf3003002e\",\"name\":\"bitbybit.vector.vectorXYZ\",\"customName\":\"vector xyz\",\"async\":false,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"x\":2,\"y\":1,\"z\":2},\"inputs\":{\"x\":{\"connections\":[{\"node\":\"80d8c2210e2c8ada\",\"output\":\"result\",\"data\":{}}]},\"y\":{\"connections\":[{\"node\":\"80d8c2210e2c8ada\",\"output\":\"result\",\"data\":{}}]},\"z\":{\"connections\":[{\"node\":\"80d8c2210e2c8ada\",\"output\":\"result\",\"data\":{}}]}},\"position\":[3110.961471038728,3310.5951164909416]},\"7ea739c655493f9b\":{\"id\":\"7ea739c655493f9b\",\"name\":\"bitbybit.occt.shapes.face.reversedFace\",\"customName\":\"reversed face\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false}},\"inputs\":{\"shape\":{\"connections\":[{\"node\":\"5a31954b0015e697\",\"output\":\"result\",\"data\":{}}]}},\"position\":[4008.2380004947863,1087.5384630463477]},\"ff3a5dfe26c1203f\":{\"id\":\"ff3a5dfe26c1203f\",\"name\":\"bitbybit.occt.transforms.scale\",\"customName\":\"scale\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"factor\":0.5},\"inputs\":{\"shape\":{\"connections\":[{\"node\":\"d533f9b2b358e932\",\"output\":\"result\",\"data\":{}}]}},\"position\":[9189.222022342807,640.7663938760614]},\"36d87d3e5dda7cfb\":{\"id\":\"36d87d3e5dda7cfb\",\"name\":\"bitbybit.babylon.scene.drawDirectionalLight\",\"customName\":\"draw directional light\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"direction\":[-100,-100,-100],\"intensity\":3,\"diffuse\":\"#0084ff\",\"specular\":\"#ffffff\",\"shadowGeneratorMapSize\":1024,\"enableShadows\":true,\"shadowDarkness\":0,\"shadowUsePercentageCloserFiltering\":true,\"shadowContactHardeningLightSizeUVRatio\":0.2,\"shadowBias\":0.0001,\"shadowNormalBias\":0.002,\"shadowMaxZ\":1000,\"shadowMinZ\":0},\"inputs\":{\"direction\":{\"connections\":[{\"node\":\"9c598c3fd358e209\",\"output\":\"result\",\"data\":{}}]}},\"position\":[2410.492548455645,-1108.187459661422]},\"9c598c3fd358e209\":{\"id\":\"9c598c3fd358e209\",\"name\":\"bitbybit.vector.vectorXYZ\",\"customName\":\"vector xyz\",\"async\":false,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"x\":-100,\"y\":50,\"z\":-100},\"inputs\":{},\"position\":[1866.1241234045078,-1104.6216865423542]},\"dd44e69c6aba7a0d\":{\"id\":\"dd44e69c6aba7a0d\",\"name\":\"bitbybit.occt.shapes.wire.getWires\",\"customName\":\"get wires\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":1,\"forceExecution\":false}},\"inputs\":{\"shape\":{\"connections\":[{\"node\":\"a385c2492e4ef6f1\",\"output\":\"result\",\"data\":{}}]}},\"position\":[4354.892794420823,2367.2120176828043]},\"f9fb91cec187f7f0\":{\"id\":\"f9fb91cec187f7f0\",\"name\":\"bitbybit.occt.shapes.wire.getWires\",\"customName\":\"get wires\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":1,\"forceExecution\":false}},\"inputs\":{\"shape\":{\"connections\":[{\"node\":\"b14378ceb8bf7fc5\",\"output\":\"result\",\"data\":{}}]}},\"position\":[4682.071021905679,2782.246685007575]},\"ca83297771d11aa5\":{\"id\":\"ca83297771d11aa5\",\"name\":\"bitbybit.lists.removeItemAtIndex\",\"customName\":\"remove item at index\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"index\":0,\"clone\":true},\"inputs\":{\"list\":{\"connections\":[{\"node\":\"74d09b8bdb4c5048\",\"output\":\"result\",\"data\":{}}]}},\"position\":[3558.8739387013798,1967.9824675636294]},\"a385c2492e4ef6f1\":{\"id\":\"a385c2492e4ef6f1\",\"name\":\"bitbybit.lists.flatten\",\"customName\":\"flatten\",\"data\":{\"nrLevels\":1},\"inputs\":{\"list\":{\"connections\":[{\"node\":\"ca83297771d11aa5\",\"output\":\"result\",\"data\":{}}]}},\"position\":[4016.6293284317,2616.607395641203]},\"42f74d68d23d3247\":{\"id\":\"42f74d68d23d3247\",\"name\":\"bitbybit.babylon.scene.fog\",\"customName\":\"fog\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"mode\":\"linear\",\"color\":\"#c9c9c9\",\"density\":0.1,\"start\":35,\"end\":100},\"inputs\":{\"color\":{\"connections\":[{\"node\":\"7b75db43179570c8\",\"output\":\"result\",\"data\":{}}]}},\"position\":[2442.8735698720834,-42.14590401627983]},\"7b75db43179570c8\":{\"id\":\"7b75db43179570c8\",\"name\":\"bitbybit.color.hexColor\",\"customName\":\"hex color\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"color\":\"#8397aa\"},\"inputs\":{},\"position\":[2098.232163729327,-306.933632265146]},\"8f5c08c8c98f4eb6\":{\"id\":\"8f5c08c8c98f4eb6\",\"name\":\"bitbybit.babylon.gui.advancedDynamicTexture.createFullScreenUI\",\"customName\":\"full screen ui\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"name\":\"fullscreen\",\"foreground\":true,\"adaptiveScaling\":false},\"inputs\":{},\"position\":[-1056.7184739683328,2836.232260686571]},\"62013821226fbd05\":{\"id\":\"62013821226fbd05\",\"name\":\"bitbybit.babylon.gui.container.addControls\",\"customName\":\"add controls\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"clearControlsFirst\":true},\"inputs\":{\"controls\":{\"connections\":[{\"node\":\"5d70cbf01bf83e55\",\"output\":\"list\",\"data\":{}}]},\"container\":{\"connections\":[{\"node\":\"8f5c08c8c98f4eb6\",\"output\":\"result\",\"data\":{}}]}},\"position\":[1051.4522897911515,2825.729196003556]},\"5d70cbf01bf83e55\":{\"id\":\"5d70cbf01bf83e55\",\"name\":\"bitbybit.lists.createList\",\"customName\":\"create list\",\"data\":{},\"inputs\":{\"listElements\":{\"connections\":[{\"node\":\"d7157cf9080bd8c5\",\"output\":\"result\",\"data\":{}}]}},\"position\":[779.1858107406395,3260.0028960769355]},\"6ea6f5c19d2c3679\":{\"id\":\"6ea6f5c19d2c3679\",\"name\":\"bitbybit.babylon.gui.stackPanel.createStackPanel\",\"customName\":\"stack panel\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"name\":\"stackPanel\",\"isVertical\":true,\"spacing\":25,\"color\":\"#00000000\",\"background\":\"#00000000\"},\"inputs\":{\"width\":{\"connections\":[{\"node\":\"1c3567b107487ab7\",\"output\":\"result\",\"data\":{}}]},\"height\":{\"connections\":[{\"node\":\"2cfa0a89722e88ad\",\"output\":\"result\",\"data\":{}}]}},\"position\":[-644.7439786868175,3305.091365601621]},\"1c3567b107487ab7\":{\"id\":\"1c3567b107487ab7\",\"name\":\"bitbybit.text.create\",\"customName\":\"create\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"740px\"},\"inputs\":{},\"position\":[-1005.9218465842323,3360.972335833377]},\"2cfa0a89722e88ad\":{\"id\":\"2cfa0a89722e88ad\",\"name\":\"bitbybit.text.create\",\"customName\":\"create\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"850px\"},\"inputs\":{},\"position\":[-1015.568499809784,3636.3340536899586]},\"7256842476045eb7\":{\"id\":\"7256842476045eb7\",\"name\":\"bitbybit.babylon.gui.control.changeControlAlignment\",\"customName\":\"change control alignment\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"horizontalAlignment\":\"left\",\"verticalAlignment\":\"bottom\"},\"inputs\":{\"control\":{\"connections\":[{\"node\":\"6ea6f5c19d2c3679\",\"output\":\"result\",\"data\":{}}]}},\"position\":[-55.86693666910121,3469.4026625427564]},\"d7157cf9080bd8c5\":{\"id\":\"d7157cf9080bd8c5\",\"name\":\"bitbybit.babylon.gui.control.changeControlPadding\",\"customName\":\"change control padding\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false}},\"inputs\":{\"control\":{\"connections\":[{\"node\":\"7256842476045eb7\",\"output\":\"result\",\"data\":{}}]},\"paddingLeft\":{\"connections\":[{\"node\":\"2e27ec0382325605\",\"output\":\"result\",\"data\":{}}]},\"paddingRight\":{\"connections\":[{\"node\":\"2e27ec0382325605\",\"output\":\"result\",\"data\":{}}]},\"paddingTop\":{\"connections\":[{\"node\":\"2e27ec0382325605\",\"output\":\"result\",\"data\":{}}]},\"paddingBottom\":{\"connections\":[{\"node\":\"2e27ec0382325605\",\"output\":\"result\",\"data\":{}}]}},\"position\":[374.0302769524635,3524.3010854904096]},\"2e27ec0382325605\":{\"id\":\"2e27ec0382325605\",\"name\":\"bitbybit.text.create\",\"customName\":\"create\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"35px\"},\"inputs\":{},\"position\":[38.94193286015155,3917.4311588521]},\"bbd88144625e447e\":{\"id\":\"bbd88144625e447e\",\"name\":\"bitbybit.babylon.gui.container.addControls\",\"customName\":\"add controls\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"clearControlsFirst\":true},\"inputs\":{\"container\":{\"connections\":[{\"node\":\"d7157cf9080bd8c5\",\"output\":\"result\",\"data\":{}}]},\"controls\":{\"connections\":[{\"node\":\"688df756a4d3edd8\",\"output\":\"list\",\"data\":{}}]}},\"position\":[1117.0240712398745,3999.2649441995045]},\"688df756a4d3edd8\":{\"id\":\"688df756a4d3edd8\",\"name\":\"bitbybit.lists.createList\",\"customName\":\"create list\",\"data\":{},\"inputs\":{\"listElements\":{\"connections\":[{\"node\":\"a67fb013d25c1008\",\"output\":\"result\",\"data\":{}}]}},\"position\":[808.172430927605,4141.539962993023]},\"a67fb013d25c1008\":{\"id\":\"a67fb013d25c1008\",\"name\":\"bitbybit.babylon.gui.control.changeControlPadding\",\"customName\":\"change control padding\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false}},\"inputs\":{\"paddingLeft\":{\"connections\":[{\"node\":\"2e27ec0382325605\",\"output\":\"result\",\"data\":{}}]},\"paddingRight\":{\"connections\":[{\"node\":\"2e27ec0382325605\",\"output\":\"result\",\"data\":{}}]},\"paddingTop\":{\"connections\":[{\"node\":\"2e27ec0382325605\",\"output\":\"result\",\"data\":{}}]},\"paddingBottom\":{\"connections\":[{\"node\":\"2e27ec0382325605\",\"output\":\"result\",\"data\":{}}]},\"control\":{\"connections\":[{\"node\":\"8019c3f4a93360fc\",\"output\":\"result\",\"data\":{}}]}},\"position\":[381.53080329328145,4124.938450095269]},\"8019c3f4a93360fc\":{\"id\":\"8019c3f4a93360fc\",\"name\":\"bitbybit.babylon.gui.stackPanel.createStackPanel\",\"customName\":\"stack panel\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"name\":\"stackPanel\",\"isVertical\":true,\"spacing\":32,\"color\":\"#00000000\",\"background\":\"#00000055\"},\"inputs\":{\"width\":{\"connections\":[{\"node\":\"c7771b05bfece223\",\"output\":\"result\",\"data\":{}}]},\"height\":{\"connections\":[{\"node\":\"c7771b05bfece223\",\"output\":\"result\",\"data\":{}}]}},\"position\":[-634.5679617178588,4122.829976185915]},\"c7771b05bfece223\":{\"id\":\"c7771b05bfece223\",\"name\":\"bitbybit.math.number\",\"customName\":\"number\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"number\":1},\"inputs\":{},\"position\":[-1030.5012301905765,4255.332320202711]},\"3cdac0a2da52d477\":{\"id\":\"3cdac0a2da52d477\",\"name\":\"bitbybit.babylon.gui.textBlock.createTextBlock\",\"customName\":\"text block\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"name\":\"textBlockName\",\"text\":\"❄️❄️❄️🎄 TOY 🎄❄️❄️❄️\",\"color\":\"#f0cebb\",\"fontSize\":43},\"inputs\":{\"color\":{\"connections\":[{\"node\":\"14ea460327313f84\",\"output\":\"result\",\"data\":{}}]},\"height\":{\"connections\":[{\"node\":\"8fdac6b820e66385\",\"output\":\"result\",\"data\":{}}]}},\"position\":[-853.8406515994363,5107.457479372801]},\"4c68d9ac771b698a\":{\"id\":\"4c68d9ac771b698a\",\"name\":\"bitbybit.babylon.gui.container.addControls\",\"customName\":\"add controls\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"clearControlsFirst\":true},\"inputs\":{\"container\":{\"connections\":[{\"node\":\"a67fb013d25c1008\",\"output\":\"result\",\"data\":{}}]},\"controls\":{\"connections\":[{\"node\":\"40ad5c91b680fe5b\",\"output\":\"list\",\"data\":{}}]}},\"position\":[1081.1735221113568,4989.645601752394]},\"40ad5c91b680fe5b\":{\"id\":\"40ad5c91b680fe5b\",\"name\":\"bitbybit.lists.createList\",\"customName\":\"create list\",\"data\":{},\"inputs\":{\"listElements\":{\"connections\":[{\"node\":\"3cdac0a2da52d477\",\"output\":\"result\",\"data\":{}},{\"node\":\"eb164cb9f2c3d0b2\",\"output\":\"result\",\"data\":{}},{\"node\":\"f80263a3d6977ea4\",\"output\":\"result\",\"data\":{}},{\"node\":\"dda72ba4bc855075\",\"output\":\"result\",\"data\":{}},{\"node\":\"a3006cf7f5041ef6\",\"output\":\"result\",\"data\":{}},{\"node\":\"22b0aaced3db29ad\",\"output\":\"result\",\"data\":{}},{\"node\":\"9de26dfa0b6980e6\",\"output\":\"result\",\"data\":{}}]}},\"position\":[131.27159201850196,6807.45958474214]},\"14ea460327313f84\":{\"id\":\"14ea460327313f84\",\"name\":\"bitbybit.color.hexColor\",\"customName\":\"hex color\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"color\":\"#75a3ff\"},\"inputs\":{},\"position\":[-2524.347102647334,9183.15923769915]},\"be55efccc9dd82ed\":{\"id\":\"be55efccc9dd82ed\",\"name\":\"bitbybit.babylon.gui.control.changeControlPadding\",\"customName\":\"change control padding\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false}},\"inputs\":{\"control\":{\"connections\":[{\"node\":\"3cdac0a2da52d477\",\"output\":\"result\",\"data\":{}}]},\"paddingTop\":{\"connections\":[{\"node\":\"96b4e817c4c14f20\",\"output\":\"result\",\"data\":{}}]},\"paddingBottom\":{\"connections\":[{\"node\":\"f6b793e8e89edda0\",\"output\":\"result\",\"data\":{}}]}},\"position\":[310.06370891276634,5361.812652019315]},\"96b4e817c4c14f20\":{\"id\":\"96b4e817c4c14f20\",\"name\":\"bitbybit.text.create\",\"customName\":\"create\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"25px\"},\"inputs\":{},\"position\":[-216.81270824516469,5476.663754188035]},\"8fdac6b820e66385\":{\"id\":\"8fdac6b820e66385\",\"name\":\"bitbybit.text.create\",\"customName\":\"create\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"105px\"},\"inputs\":{},\"position\":[-1181.045524940636,5460.547434196808]},\"eb164cb9f2c3d0b2\":{\"id\":\"eb164cb9f2c3d0b2\",\"name\":\"bitbybit.babylon.gui.slider.createSlider\",\"customName\":\"slider\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"name\":\"rays\",\"minimum\":3,\"maximum\":12,\"value\":6,\"step\":1,\"isVertical\":false,\"color\":\"#f0cebb\",\"background\":\"black\",\"displayThumb\":true},\"inputs\":{\"value\":{\"connections\":[{\"node\":\"6e51a85f13ab5259\",\"output\":\"result\",\"data\":{}}]},\"color\":{\"connections\":[{\"node\":\"14ea460327313f84\",\"output\":\"result\",\"data\":{}}]}},\"position\":[-821.5978737310934,5908.02843885303]},\"6e51a85f13ab5259\":{\"id\":\"6e51a85f13ab5259\",\"name\":\"bitbybit.math.numberSlider\",\"customName\":\"number slider\",\"data\":{\"options\":{\"min\":3,\"max\":12,\"step\":1,\"width\":350,\"updateOnDrag\":false},\"number\":5},\"inputs\":{},\"position\":[-1455.2743568834462,6056.45799565296]},\"f80263a3d6977ea4\":{\"id\":\"f80263a3d6977ea4\",\"name\":\"bitbybit.babylon.gui.textBlock.createTextBlock\",\"customName\":\"text block\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"name\":\"textBlockName\",\"text\":\"Number Of Rays\",\"color\":\"#f0cebb\",\"fontSize\":32},\"inputs\":{\"color\":{\"connections\":[{\"node\":\"14ea460327313f84\",\"output\":\"result\",\"data\":{}}]}},\"position\":[-853.88650164059,6570.290388610167]},\"dda72ba4bc855075\":{\"id\":\"dda72ba4bc855075\",\"name\":\"bitbybit.babylon.gui.slider.createSlider\",\"customName\":\"slider\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"name\":\"verticalOpeningsSlider\",\"minimum\":1,\"maximum\":25,\"value\":6,\"step\":1,\"isVertical\":false,\"color\":\"#f0cebb\",\"background\":\"black\",\"displayThumb\":true},\"inputs\":{\"value\":{\"connections\":[{\"node\":\"dc27ec58598933e4\",\"output\":\"result\",\"data\":{}}]},\"color\":{\"connections\":[{\"node\":\"14ea460327313f84\",\"output\":\"result\",\"data\":{}}]}},\"position\":[-831.8855421151479,7040.183968957487]},\"dc27ec58598933e4\":{\"id\":\"dc27ec58598933e4\",\"name\":\"bitbybit.math.numberSlider\",\"customName\":\"number slider\",\"data\":{\"options\":{\"min\":1,\"max\":25,\"step\":1,\"width\":350,\"updateOnDrag\":false},\"number\":5},\"inputs\":{},\"position\":[-1548.5643926124947,7215.153436337072]},\"a3006cf7f5041ef6\":{\"id\":\"a3006cf7f5041ef6\",\"name\":\"bitbybit.babylon.gui.textBlock.createTextBlock\",\"customName\":\"text block\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"name\":\"textBlockName\",\"text\":\"Vertical Divisions\",\"color\":\"#f0cebb\",\"fontSize\":32},\"inputs\":{\"color\":{\"connections\":[{\"node\":\"14ea460327313f84\",\"output\":\"result\",\"data\":{}}]}},\"position\":[-829.5105024166364,7718.522342332688]},\"22b0aaced3db29ad\":{\"id\":\"22b0aaced3db29ad\",\"name\":\"bitbybit.babylon.gui.button.createSimpleButton\",\"customName\":\"simple button\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"name\":\"buttonName\",\"label\":\"S I G N U P F O R M O R E !\",\"color\":\"white\",\"background\":\"#f0cebb\",\"fontSize\":32},\"inputs\":{\"background\":{\"connections\":[{\"node\":\"14ea460327313f84\",\"output\":\"result\",\"data\":{}}]},\"height\":{\"connections\":[{\"node\":\"b5ab513337ea1f9c\",\"output\":\"result\",\"data\":{}}]}},\"position\":[-846.86829904502,8223.84317108378]},\"b5ab513337ea1f9c\":{\"id\":\"b5ab513337ea1f9c\",\"name\":\"bitbybit.text.create\",\"customName\":\"create\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"95px\"},\"inputs\":{},\"position\":[-1211.515140544501,8409.866247193688]},\"3d74af9c8a8b1dd3\":{\"id\":\"3d74af9c8a8b1dd3\",\"name\":\"bitbybit.babylon.gui.control.changeControlPadding\",\"customName\":\"change control padding\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false}},\"inputs\":{\"control\":{\"connections\":[{\"node\":\"22b0aaced3db29ad\",\"output\":\"result\",\"data\":{}}]},\"paddingLeft\":{\"connections\":[{\"node\":\"f49f0b323ff33034\",\"output\":\"result\",\"data\":{}}]},\"paddingRight\":{\"connections\":[{\"node\":\"f49f0b323ff33034\",\"output\":\"result\",\"data\":{}}]}},\"position\":[147.85415967299022,8465.334888215139]},\"f49f0b323ff33034\":{\"id\":\"f49f0b323ff33034\",\"name\":\"bitbybit.text.create\",\"customName\":\"create\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"32px\"},\"inputs\":{},\"position\":[-351.90583473376483,8527.624810198047]},\"9de26dfa0b6980e6\":{\"id\":\"9de26dfa0b6980e6\",\"name\":\"bitbybit.babylon.gui.stackPanel.createStackPanel\",\"customName\":\"stack panel\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"name\":\"actions\",\"isVertical\":false,\"spacing\":20,\"color\":\"#00000000\",\"background\":\"#00000055\"},\"inputs\":{\"height\":{\"connections\":[{\"node\":\"94be48fa3d341e2f\",\"output\":\"result\",\"data\":{}}]}},\"position\":[-860.4566955224043,8845.655587065246]},\"94be48fa3d341e2f\":{\"id\":\"94be48fa3d341e2f\",\"name\":\"bitbybit.text.create\",\"customName\":\"create\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"150px\"},\"inputs\":{},\"position\":[-1243.8502616502608,8996.109487316298]},\"386aa0fba070069e\":{\"id\":\"386aa0fba070069e\",\"name\":\"bitbybit.lists.createList\",\"customName\":\"create list\",\"data\":{},\"inputs\":{\"listElements\":{\"connections\":[{\"node\":\"fc36f702c3f8146e\",\"output\":\"result\",\"data\":{}},{\"node\":\"71fbc1ccee37d577\",\"output\":\"result\",\"data\":{}},{\"node\":\"dfd5ec0585a0e37f\",\"output\":\"result\",\"data\":{}}]}},\"position\":[86.09946070310812,9675.048597360192]},\"fc36f702c3f8146e\":{\"id\":\"fc36f702c3f8146e\",\"name\":\"bitbybit.babylon.gui.button.createSimpleButton\",\"customName\":\"simple button\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"name\":\"getStep\",\"label\":\"Get STEP\",\"color\":\"white\",\"background\":\"black\",\"fontSize\":24},\"inputs\":{\"width\":{\"connections\":[{\"node\":\"9627abcea218d31f\",\"output\":\"result\",\"data\":{}}]},\"height\":{\"connections\":[{\"node\":\"5189291d4a0b99c3\",\"output\":\"result\",\"data\":{}}]},\"color\":{\"connections\":[{\"node\":\"14ea460327313f84\",\"output\":\"result\",\"data\":{}}]}},\"position\":[-906.5263779292032,9503.72186483339]},\"9627abcea218d31f\":{\"id\":\"9627abcea218d31f\",\"name\":\"bitbybit.text.create\",\"customName\":\"create\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"186px\"},\"inputs\":{},\"position\":[-1280.2041644956794,9443.521680268339]},\"5189291d4a0b99c3\":{\"id\":\"5189291d4a0b99c3\",\"name\":\"bitbybit.math.number\",\"customName\":\"number\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"number\":0.5},\"inputs\":{},\"position\":[-1336.124164455853,9763.964706483723]},\"b42caf22b316e228\":{\"id\":\"b42caf22b316e228\",\"name\":\"bitbybit.babylon.gui.container.addControls\",\"customName\":\"add controls\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"clearControlsFirst\":true},\"inputs\":{\"controls\":{\"connections\":[{\"node\":\"386aa0fba070069e\",\"output\":\"list\",\"data\":{}}]},\"container\":{\"connections\":[{\"node\":\"9de5622b3e543a8a\",\"output\":\"result\",\"data\":{}}]}},\"position\":[1052.8239083530739,9110.88729112261]},\"27161889f007dc04\":{\"id\":\"27161889f007dc04\",\"name\":\"bitbybit.babylon.gui.control.changeControlAlignment\",\"customName\":\"change control alignment\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"horizontalAlignment\":\"center\",\"verticalAlignment\":\"center\"},\"inputs\":{\"control\":{\"connections\":[{\"node\":\"9de26dfa0b6980e6\",\"output\":\"result\",\"data\":{}}]}},\"position\":[-269.69695321588506,8927.379602739795]},\"71fbc1ccee37d577\":{\"id\":\"71fbc1ccee37d577\",\"name\":\"bitbybit.babylon.gui.button.createSimpleButton\",\"customName\":\"simple button\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"name\":\"getStl\",\"label\":\"Get STL\",\"color\":\"white\",\"background\":\"black\",\"fontSize\":24},\"inputs\":{\"width\":{\"connections\":[{\"node\":\"9627abcea218d31f\",\"output\":\"result\",\"data\":{}}]},\"height\":{\"connections\":[{\"node\":\"5189291d4a0b99c3\",\"output\":\"result\",\"data\":{}}]},\"color\":{\"connections\":[{\"node\":\"14ea460327313f84\",\"output\":\"result\",\"data\":{}}]}},\"position\":[-906.6855973027857,10056.533240815332]},\"dfd5ec0585a0e37f\":{\"id\":\"dfd5ec0585a0e37f\",\"name\":\"bitbybit.babylon.gui.button.createSimpleButton\",\"customName\":\"simple button\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"name\":\"sourceCode\",\"label\":\"Source Code\",\"color\":\"white\",\"background\":\"black\",\"fontSize\":24},\"inputs\":{\"color\":{\"connections\":[{\"node\":\"14ea460327313f84\",\"output\":\"result\",\"data\":{}}]},\"height\":{\"connections\":[{\"node\":\"5189291d4a0b99c3\",\"output\":\"result\",\"data\":{}}]},\"width\":{\"connections\":[{\"node\":\"9627abcea218d31f\",\"output\":\"result\",\"data\":{}}]}},\"position\":[-906.7686354515675,10569.423308562755]},\"9de5622b3e543a8a\":{\"id\":\"9de5622b3e543a8a\",\"name\":\"bitbybit.babylon.gui.control.changeControlPadding\",\"customName\":\"change control padding\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false}},\"inputs\":{\"paddingTop\":{\"connections\":[{\"node\":\"ce084356ce41072e\",\"output\":\"result\",\"data\":{}}]},\"control\":{\"connections\":[{\"node\":\"27161889f007dc04\",\"output\":\"result\",\"data\":{}}]},\"paddingLeft\":{\"connections\":[{\"node\":\"ce084356ce41072e\",\"output\":\"result\",\"data\":{}}]},\"paddingRight\":{\"connections\":[{\"node\":\"ce084356ce41072e\",\"output\":\"result\",\"data\":{}}]},\"paddingBottom\":{\"connections\":[{\"node\":\"ce084356ce41072e\",\"output\":\"result\",\"data\":{}}]}},\"position\":[386.5736003150091,9022.420560407636]},\"ce084356ce41072e\":{\"id\":\"ce084356ce41072e\",\"name\":\"bitbybit.text.create\",\"customName\":\"create\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"0px\"},\"inputs\":{},\"position\":[-150.892111299047,9269.41326836467]},\"3b1402c27d9aa4d9\":{\"id\":\"3b1402c27d9aa4d9\",\"name\":\"bitbybit.babylon.gui.control.changeControlPadding\",\"customName\":\"change control padding\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false}},\"inputs\":{\"paddingTop\":{\"connections\":[{\"node\":\"7c43fbf3b4039859\",\"output\":\"result\",\"data\":{}}]},\"control\":{\"connections\":[{\"node\":\"22b0aaced3db29ad\",\"output\":\"result\",\"data\":{}}]}},\"position\":[468.6889889862706,7806.3724958885105]},\"7c43fbf3b4039859\":{\"id\":\"7c43fbf3b4039859\",\"name\":\"bitbybit.text.create\",\"customName\":\"create\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"40px\"},\"inputs\":{},\"position\":[38.94985237381003,8082.178454308819]},\"bf021b750fd00e30\":{\"id\":\"bf021b750fd00e30\",\"name\":\"bitbybit.text.create\",\"customName\":\"create\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"45px\"},\"inputs\":{},\"position\":[-26.956821924678025,4278.492442388621]},\"f6b793e8e89edda0\":{\"id\":\"f6b793e8e89edda0\",\"name\":\"bitbybit.text.create\",\"customName\":\"create\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"35px\"},\"inputs\":{},\"position\":[-204.24116761177675,5756.856375833485]},\"f1f8cf3eadfa0ebb\":{\"id\":\"f1f8cf3eadfa0ebb\",\"name\":\"bitbybit.babylon.gui.control.createControlObservableSelector\",\"customName\":\"control observable selector\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"selector\":\"onPointerUpObservable\"},\"inputs\":{},\"position\":[-284.4470112110814,10728.8905088672]},\"43441120529c36e3\":{\"id\":\"43441120529c36e3\",\"name\":\"bitbybit.flow.babylon.observableListener\",\"customName\":\"babylon observable listener\",\"data\":{},\"inputs\":{\"observableSelector\":{\"connections\":[{\"node\":\"f1f8cf3eadfa0ebb\",\"output\":\"result\",\"data\":{}}]},\"object\":{\"connections\":[{\"node\":\"dfd5ec0585a0e37f\",\"output\":\"result\",\"data\":{}}]}},\"position\":[379.3161481874706,10607.903050757823]},\"38f701184db60233\":{\"id\":\"38f701184db60233\",\"name\":\"bitbybit.flow.time.delay\",\"customName\":\"delay\",\"data\":{\"timeout\":0},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"43441120529c36e3\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[933.2062286858425,10749.580736333644]},\"fbe1705ff510913a\":{\"id\":\"fbe1705ff510913a\",\"name\":\"bitbybit.flow.logic.flipFlop\",\"customName\":\"flip flop\",\"data\":{},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"43441120529c36e3\",\"output\":\"exec\",\"data\":{}},{\"node\":\"38f701184db60233\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[1286.7786245546422,10638.06142237177]},\"83ffa041662302e3\":{\"id\":\"83ffa041662302e3\",\"name\":\"bitbybit.code.typeScriptEditor\",\"customName\":\"typescript editor\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":true},\"code\":{\"code\":\"// DO NOT REMOVE THIS FUNCTION\\nconst start83ffa041662302e3 = async (inputs: any, index: number) => {\\n // ADD YOUR CODE HERE\\n if (inputs === true) {\\n window.open(\\\"https://bitbybit.dev/app/bitbybit/KtIymkYFZ8Qty9h8mhew/Y7NQIgaXLy0dqffnc825?editor=rete\\\", '_blank').focus();\\n }\\n return inputs;\\n}\"}},\"inputs\":{\"inputs\":{\"connections\":[{\"node\":\"fbe1705ff510913a\",\"output\":\"isA\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"fbe1705ff510913a\",\"output\":\"execA\",\"data\":{}},{\"node\":\"fbe1705ff510913a\",\"output\":\"execB\",\"data\":{}}]}},\"position\":[1749.7763306366996,10636.786904135595]},\"af7350efdb0b85b3\":{\"id\":\"af7350efdb0b85b3\",\"name\":\"bitbybit.babylon.gui.control.createControlObservableSelector\",\"customName\":\"control observable selector\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"selector\":\"onPointerUpObservable\"},\"inputs\":{},\"position\":[686.4715121547069,8508.681235887017]},\"f2e18ffd18566787\":{\"id\":\"f2e18ffd18566787\",\"name\":\"bitbybit.flow.babylon.observableListener\",\"customName\":\"babylon observable listener\",\"data\":{},\"inputs\":{\"object\":{\"connections\":[{\"node\":\"22b0aaced3db29ad\",\"output\":\"result\",\"data\":{}}]},\"observableSelector\":{\"connections\":[{\"node\":\"af7350efdb0b85b3\",\"output\":\"result\",\"data\":{}}]}},\"position\":[1453.070365919411,8258.538315404885]},\"70259fc69f3db105\":{\"id\":\"70259fc69f3db105\",\"name\":\"bitbybit.flow.time.delay\",\"customName\":\"delay\",\"data\":{\"timeout\":0},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"f2e18ffd18566787\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[1987.6045976314351,8437.042718662588]},\"291c95f88aae5725\":{\"id\":\"291c95f88aae5725\",\"name\":\"bitbybit.flow.logic.flipFlop\",\"customName\":\"flip flop\",\"data\":{},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"70259fc69f3db105\",\"output\":\"exec\",\"data\":{}},{\"node\":\"f2e18ffd18566787\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[2323.4070267726706,8288.053843144928]},\"ac5f02670de06852\":{\"id\":\"ac5f02670de06852\",\"name\":\"bitbybit.code.typeScriptEditor\",\"customName\":\"typescript editor\",\"async\":true,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":true},\"code\":{\"code\":\"// DO NOT REMOVE THIS FUNCTION\\nconst startac5f02670de06852 = async (inputs: any, index: number) => {\\n // ADD YOUR CODE HERE\\n if (inputs === true) {\\n window.open(\\\"https://bitbybit.dev/auth/sign-up\\\", '_blank').focus();\\n }\\n return inputs;\\n}\"}},\"inputs\":{\"inputs\":{\"connections\":[{\"node\":\"291c95f88aae5725\",\"output\":\"isA\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"291c95f88aae5725\",\"output\":\"execA\",\"data\":{}},{\"node\":\"291c95f88aae5725\",\"output\":\"execB\",\"data\":{}}]}},\"position\":[2681.990286952205,8287.587249893892]},\"b5af9279ffdd84e5\":{\"id\":\"b5af9279ffdd84e5\",\"name\":\"bitbybit.babylon.scene.enableSkybox\",\"customName\":\"enable skybox\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"skybox\":\"city\",\"size\":1000,\"blur\":0.5,\"environmentIntensity\":0.7,\"hideSkybox\":false},\"inputs\":{},\"position\":[2884.1306675480555,-186.0490873535386]},\"9dca219fedacecca\":{\"id\":\"9dca219fedacecca\",\"name\":\"bitbybit.flow.babylon.observableListener\",\"customName\":\"babylon observable listener\",\"data\":{},\"inputs\":{\"observableSelector\":{\"connections\":[{\"node\":\"f1f8cf3eadfa0ebb\",\"output\":\"result\",\"data\":{}}]},\"object\":{\"connections\":[{\"node\":\"71fbc1ccee37d577\",\"output\":\"result\",\"data\":{}}]}},\"position\":[385.9268891419183,10329.874563653837]},\"bb201b1ec9f17a1e\":{\"id\":\"bb201b1ec9f17a1e\",\"name\":\"bitbybit.flow.babylon.observableListener\",\"customName\":\"babylon observable listener\",\"data\":{},\"inputs\":{\"observableSelector\":{\"connections\":[{\"node\":\"f1f8cf3eadfa0ebb\",\"output\":\"result\",\"data\":{}}]},\"object\":{\"connections\":[{\"node\":\"fc36f702c3f8146e\",\"output\":\"result\",\"data\":{}}]}},\"position\":[394.16500271911553,10076.96114156523]},\"4a5d1c196a0b447e\":{\"id\":\"4a5d1c196a0b447e\",\"name\":\"bitbybit.flow.time.delay\",\"customName\":\"delay\",\"data\":{\"timeout\":0},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"9dca219fedacecca\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[936.4095297912264,10457.862715124222]},\"4fd171db189ad173\":{\"id\":\"4fd171db189ad173\",\"name\":\"bitbybit.flow.logic.flipFlop\",\"customName\":\"flip flop\",\"data\":{},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"9dca219fedacecca\",\"output\":\"exec\",\"data\":{}},{\"node\":\"4a5d1c196a0b447e\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[1273.654131279585,10355.281487174021]},\"94b6dd1354940df2\":{\"id\":\"94b6dd1354940df2\",\"name\":\"bitbybit.flow.time.delay\",\"customName\":\"delay\",\"data\":{\"timeout\":0},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"bb201b1ec9f17a1e\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[926.4956949832613,10212.522265939324]},\"27eac850201a9701\":{\"id\":\"27eac850201a9701\",\"name\":\"bitbybit.flow.logic.flipFlop\",\"customName\":\"flip flop\",\"data\":{},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"bb201b1ec9f17a1e\",\"output\":\"exec\",\"data\":{}},{\"node\":\"94b6dd1354940df2\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[1272.0778730255988,10103.055278248028]},\"9190095ec9cfd394\":{\"id\":\"9190095ec9cfd394\",\"name\":\"bitbybit.logic.valueGate\",\"customName\":\"value gate\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"boolean\":false},\"inputs\":{\"value\":{\"connections\":[{\"node\":\"73ee3cd6670755bb\",\"output\":\"result\",\"data\":{}}]},\"boolean\":{\"connections\":[{\"node\":\"27eac850201a9701\",\"output\":\"isA\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"27eac850201a9701\",\"output\":\"execA\",\"data\":{}},{\"node\":\"27eac850201a9701\",\"output\":\"execB\",\"data\":{}}]}},\"position\":[2098.7596218076405,9630.876889007699]},\"73ee3cd6670755bb\":{\"id\":\"73ee3cd6670755bb\",\"name\":\"bitbybit.text.create\",\"customName\":\"create\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"bitbybit-toy.step\"},\"inputs\":{},\"position\":[1701.8222304032442,9540.575618331815]},\"f9a87606405961ae\":{\"id\":\"f9a87606405961ae\",\"name\":\"bitbybit.text.create\",\"customName\":\"create\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"bitbybit-toy.stl\"},\"inputs\":{},\"position\":[1934.0481177357838,10057.705993169464]},\"f8db44954a566616\":{\"id\":\"f8db44954a566616\",\"name\":\"bitbybit.logic.valueGate\",\"customName\":\"value gate\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"boolean\":false},\"inputs\":{\"value\":{\"connections\":[{\"node\":\"f9a87606405961ae\",\"output\":\"result\",\"data\":{}}]},\"boolean\":{\"connections\":[{\"node\":\"4fd171db189ad173\",\"output\":\"isA\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"4fd171db189ad173\",\"output\":\"execA\",\"data\":{}},{\"node\":\"4fd171db189ad173\",\"output\":\"execB\",\"data\":{}}]}},\"position\":[2360.5651787274305,10179.991268481712]},\"7ae3f1f373ab7ce8\":{\"id\":\"7ae3f1f373ab7ce8\",\"name\":\"bitbybit.occt.io.saveShapeSTEPAndReturn\",\"customName\":\"save shape step and return\",\"async\":true,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"fileName\":\"\",\"adjustYtoZ\":true,\"fromRightHanded\":false,\"tryDownload\":true},\"inputs\":{\"shape\":{\"connections\":[{\"node\":\"ff3a5dfe26c1203f\",\"output\":\"result\",\"data\":{}}]},\"fileName\":{\"connections\":[{\"node\":\"9190095ec9cfd394\",\"output\":\"result\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"9190095ec9cfd394\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[4105.580503617983,9860.933809645778]},\"b358af77da1782cf\":{\"id\":\"b358af77da1782cf\",\"name\":\"bitbybit.occt.io.saveShapeStl\",\"customName\":\"save shape stl\",\"async\":true,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"fileName\":\"shape.stl\",\"precision\":0.01,\"adjustYtoZ\":true,\"tryDownload\":true,\"binary\":true},\"inputs\":{\"fileName\":{\"connections\":[{\"node\":\"f8db44954a566616\",\"output\":\"result\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"f8db44954a566616\",\"output\":\"exec\",\"data\":{}}]},\"shape\":{\"connections\":[{\"node\":\"ff3a5dfe26c1203f\",\"output\":\"result\",\"data\":{}}]}},\"position\":[4097.343815578738,10313.986149668373]},\"feef4ec0e40282e7\":{\"id\":\"feef4ec0e40282e7\",\"name\":\"bitbybit.math.number\",\"customName\":\"number\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"number\":0.5},\"inputs\":{},\"position\":[2389.4392361815517,2241.565476619029]},\"03303a3d3cb2a6b5\":{\"id\":\"03303a3d3cb2a6b5\",\"name\":\"bitbybit.json.parse\",\"customName\":\"parse\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"[true,false,true,true]\"},\"inputs\":{},\"position\":[2389.302212365796,2597.6283579746796]},\"f39c312f7e1e1bef\":{\"id\":\"f39c312f7e1e1bef\",\"name\":\"bitbybit.flow.babylon.observableListener\",\"customName\":\"babylon observable listener\",\"data\":{},\"inputs\":{\"observableSelector\":{\"connections\":[{\"node\":\"19dd5abb3a2ed30a\",\"output\":\"result\",\"data\":{}}]},\"object\":{\"connections\":[{\"node\":\"dda72ba4bc855075\",\"output\":\"result\",\"data\":{}}]}},\"position\":[634.3045048773648,6411.35023828563]},\"19dd5abb3a2ed30a\":{\"id\":\"19dd5abb3a2ed30a\",\"name\":\"bitbybit.babylon.gui.slider.createSliderObservableSelector\",\"customName\":\"slider observable selector\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"selector\":\"onValueChangedObservable\"},\"inputs\":{},\"position\":[119.33402358269528,6252.634270289916]},\"3f3e9efb919889cb\":{\"id\":\"3f3e9efb919889cb\",\"name\":\"bitbybit.flow.babylon.observableListener\",\"customName\":\"babylon observable listener\",\"data\":{},\"inputs\":{\"observableSelector\":{\"connections\":[{\"node\":\"19dd5abb3a2ed30a\",\"output\":\"result\",\"data\":{}}]},\"object\":{\"connections\":[{\"node\":\"eb164cb9f2c3d0b2\",\"output\":\"result\",\"data\":{}}]}},\"position\":[626.2393558517689,6035.026931379336]},\"b85e303f418ea094\":{\"id\":\"b85e303f418ea094\",\"name\":\"bitbybit.flow.babylon.getEventDataFromObservedResult\",\"customName\":\"get event data\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false}},\"inputs\":{\"json\":{\"connections\":[{\"node\":\"3f3e9efb919889cb\",\"output\":\"result\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"3f3e9efb919889cb\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[1213.8284182083087,6031.8004190176025]},\"0ae184887b347212\":{\"id\":\"0ae184887b347212\",\"name\":\"bitbybit.flow.babylon.getEventDataFromObservedResult\",\"customName\":\"get event data\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false}},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"f39c312f7e1e1bef\",\"output\":\"exec\",\"data\":{}}]},\"json\":{\"connections\":[{\"node\":\"f39c312f7e1e1bef\",\"output\":\"result\",\"data\":{}}]}},\"position\":[1212.113699374194,6401.279001431719]},\"ffecd6164df0c288\":{\"id\":\"ffecd6164df0c288\",\"name\":\"bitbybit.logic.firstDefinedValueGate\",\"customName\":\"first defined value gate\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false}},\"inputs\":{\"value1\":{\"connections\":[{\"node\":\"b85e303f418ea094\",\"output\":\"result\",\"data\":{}}]},\"value2\":{\"connections\":[{\"node\":\"6e51a85f13ab5259\",\"output\":\"result\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"b85e303f418ea094\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[1795.1547936226411,6012.662361553964]},\"d90e74b18631a7e7\":{\"id\":\"d90e74b18631a7e7\",\"name\":\"bitbybit.logic.firstDefinedValueGate\",\"customName\":\"first defined value gate\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false}},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"0ae184887b347212\",\"output\":\"exec\",\"data\":{}}]},\"value2\":{\"connections\":[{\"node\":\"dc27ec58598933e4\",\"output\":\"result\",\"data\":{}}]},\"value1\":{\"connections\":[{\"node\":\"0ae184887b347212\",\"output\":\"result\",\"data\":{}}]}},\"position\":[1827.0393870782336,6490.834733956343]},\"9ed742a672a607ce\":{\"id\":\"9ed742a672a607ce\",\"name\":\"bitbybit.lists.createList\",\"customName\":\"create list\",\"data\":{},\"inputs\":{\"listElements\":{\"connections\":[{\"node\":\"ffecd6164df0c288\",\"output\":\"result\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"ffecd6164df0c288\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[2408.212815313349,6050.3207511429555]},\"48046af83dbc9299\":{\"id\":\"48046af83dbc9299\",\"name\":\"bitbybit.lists.createList\",\"customName\":\"create list\",\"data\":{},\"inputs\":{\"listElements\":{\"connections\":[{\"node\":\"d90e74b18631a7e7\",\"output\":\"result\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"d90e74b18631a7e7\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[2407.3069815807094,6523.841211518347]},\"46f99a9e9cfc9152\":{\"id\":\"46f99a9e9cfc9152\",\"name\":\"bitbybit.text.format\",\"customName\":\"format\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"Number Of Rays - {0}\",\"values\":[\"World\"]},\"inputs\":{\"values\":{\"connections\":[{\"node\":\"9ed742a672a607ce\",\"output\":\"list\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"9ed742a672a607ce\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[2774.3846965928947,5974.2361780617475]},\"ced830dd20fb5b02\":{\"id\":\"ced830dd20fb5b02\",\"name\":\"bitbybit.text.format\",\"customName\":\"format\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"Vertical Divsions - {0}\",\"values\":[\"World\"]},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"48046af83dbc9299\",\"output\":\"exec\",\"data\":{}}]},\"values\":{\"connections\":[{\"node\":\"48046af83dbc9299\",\"output\":\"list\",\"data\":{}}]}},\"position\":[2794.9763891153702,6450.397669292677]},\"af2cb4893a5bc1cb\":{\"id\":\"af2cb4893a5bc1cb\",\"name\":\"bitbybit.babylon.gui.textBlock.setText\",\"customName\":\"set text\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"\"},\"inputs\":{\"text\":{\"connections\":[{\"node\":\"46f99a9e9cfc9152\",\"output\":\"result\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"46f99a9e9cfc9152\",\"output\":\"exec\",\"data\":{}}]},\"textBlock\":{\"connections\":[{\"node\":\"f80263a3d6977ea4\",\"output\":\"result\",\"data\":{}}]}},\"position\":[3408.9286383465733,6175.853417797766]},\"bb5fa4b16d910cb5\":{\"id\":\"bb5fa4b16d910cb5\",\"name\":\"bitbybit.babylon.gui.textBlock.setText\",\"customName\":\"set text\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"text\":\"\"},\"inputs\":{\"textBlock\":{\"connections\":[{\"node\":\"a3006cf7f5041ef6\",\"output\":\"result\",\"data\":{}}]},\"text\":{\"connections\":[{\"node\":\"ced830dd20fb5b02\",\"output\":\"result\",\"data\":{}}]},\"exec\":{\"connections\":[{\"node\":\"ced830dd20fb5b02\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[3443.5303027369487,6538.552534619226]},\"8ecfa2d91d973882\":{\"id\":\"8ecfa2d91d973882\",\"name\":\"bitbybit.babylon.gui.control.createControlObservableSelector\",\"customName\":\"control observable selector\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"selector\":\"onPointerUpObservable\"},\"inputs\":{},\"position\":[112.53197228874697,7216.911800887681]},\"8478c18af95701d2\":{\"id\":\"8478c18af95701d2\",\"name\":\"bitbybit.flow.babylon.observableListener\",\"customName\":\"babylon observable listener\",\"data\":{},\"inputs\":{\"observableSelector\":{\"connections\":[{\"node\":\"8ecfa2d91d973882\",\"output\":\"result\",\"data\":{}}]},\"object\":{\"connections\":[{\"node\":\"dda72ba4bc855075\",\"output\":\"result\",\"data\":{}}]}},\"position\":[666.0061734678349,7042.204203322666]},\"fa5a486b0621317a\":{\"id\":\"fa5a486b0621317a\",\"name\":\"bitbybit.flow.babylon.observableListener\",\"customName\":\"babylon observable listener\",\"data\":{},\"inputs\":{\"observableSelector\":{\"connections\":[{\"node\":\"8ecfa2d91d973882\",\"output\":\"result\",\"data\":{}}]},\"object\":{\"connections\":[{\"node\":\"eb164cb9f2c3d0b2\",\"output\":\"result\",\"data\":{}}]}},\"position\":[667.4427756519425,6826.609623951564]},\"7299a501c8e860c5\":{\"id\":\"7299a501c8e860c5\",\"name\":\"bitbybit.lists.passThrough\",\"customName\":\"pass through\",\"data\":{},\"inputs\":{\"exec\":{\"connections\":[{\"node\":\"fa5a486b0621317a\",\"output\":\"exec\",\"data\":{}},{\"node\":\"8478c18af95701d2\",\"output\":\"exec\",\"data\":{}}]}},\"position\":[6778.4019145441225,6945.999036012015]},\"68fc3da5a920f715\":{\"id\":\"68fc3da5a920f715\",\"name\":\"bitbybit.babylon.scene.adjustActiveArcRotateCamera\",\"customName\":\"adjust active arc rotate camera\",\"async\":false,\"drawable\":false,\"data\":{\"genericNodeData\":{\"hide\":false,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"position\":[10,10,10],\"lookAt\":[0,0,0],\"lowerBetaLimit\":1,\"upperBetaLimit\":179,\"angularSensibilityX\":1000,\"angularSensibilityY\":1000,\"maxZ\":1000,\"panningSensibility\":1000,\"wheelPrecision\":3},\"inputs\":{\"position\":{\"connections\":[{\"node\":\"2c23a73974610198\",\"output\":\"result\",\"data\":{}}]},\"lookAt\":{\"connections\":[{\"node\":\"4b908f56b3ed505c\",\"output\":\"result\",\"data\":{}}]}},\"position\":[2457.6836534900826,-2687.8751308577216]},\"2c23a73974610198\":{\"id\":\"2c23a73974610198\",\"name\":\"bitbybit.vector.vectorXYZ\",\"customName\":\"vector xyz\",\"async\":false,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"x\":30,\"y\":25,\"z\":0},\"inputs\":{},\"position\":[2028.1960653764377,-2763.197379436671]},\"4b908f56b3ed505c\":{\"id\":\"4b908f56b3ed505c\",\"name\":\"bitbybit.vector.vectorXYZ\",\"customName\":\"vector xyz\",\"async\":false,\"drawable\":true,\"data\":{\"genericNodeData\":{\"hide\":true,\"oneOnOne\":false,\"flatten\":0,\"forceExecution\":false},\"x\":0,\"y\":4,\"z\":0},\"inputs\":{},\"position\":[2033.62438677469,-2317.355175655833]}}}","version":"0.20.14","type":"rete"}} title="Christmas tree ornament" /> diff --git a/docs/learn/code/common/occt/modeling/festive-decor/twisted-polygon-ornament.md b/docs/learn/code/common/occt/modeling/festive-decor/twisted-polygon-ornament.md new file mode 100644 index 00000000..26b4f52a --- /dev/null +++ b/docs/learn/code/common/occt/modeling/festive-decor/twisted-polygon-ornament.md @@ -0,0 +1,82 @@ +--- +sidebar_position: 5 +title: Twisted Polygon Ornament +sidebar_label: Twisted Polygon Ornament +description: Learn how to create an elegant twisted polygon ornament by transforming and lofting hexagonal wires - perfect for 3D printing decorative pieces. +tags: [code, occt, rete, blockly, typescript] +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import BitByBitRenderCanvas from '@site/src/components/BitByBitRenderCanvas'; + +OCCT category icon with a stylized logo representation + +Create an elegant twisted ornament by systematically rotating and scaling hexagonal wire profiles, then connecting them with a lofting operation. This produces a sophisticated spiraling form from simple geometric transformations. + + + + + + + nrCornerswire1wire2wire3wire4list1list2ianglefactortempShapefinalListitemloftShapeunifiedShape'city'10000.230.7TRUEnrCorners6wire1000010nrCorners1wire200.10010nrCorners1wire300.20010nrCorners1wire400.30010nrCorners1list1list2i0101angleMULTIPLYi9factorADDi1tempShapewire1001angletempShapetempShapefactorINSERTLASTlist1tempShapetempShapewire2001angletempShapetempShapefactorINSERTLASTlist1tempShapetempShapewire4001angletempShapetempShapefactorINSERTLASTlist2tempShapetempShapewire3001angletempShapetempShapefactorINSERTLASTlist2tempShapelist1list1TRUElist2list2TRUETRUEfinalListitemlist2INSERTLASTfinalListitemitemlist1INSERTLASTfinalListitemfinalListfinalListTRUEloftShapefinalListFALSETRUEFALSETRUE10FALSE31e-7approxCentripetalunifiedShapeloftShapeTRUETRUETRUEunifiedShape0.01Custom Material#94ffd1#0000000.90.31FALSE2TRUE#ffffff2","version":"0.20.14","type":"blockly"}} + title="Twisted Polygon Ornament" + /> + + + {\n\n const skyboxOpt = new SkyboxDto();\n skyboxOpt.skybox = skyboxEnum.city;\n skyboxOpt.hideSkybox = true;\n bitbybit.babylon.scene.enableSkybox(skyboxOpt);\n\n const nrCorners = 6;\n\n // 1. Create Base Wires\n const ngonDto = new NGonWireDto();\n ngonDto.nrCorners = nrCorners;\n ngonDto.direction = [0, 1, 0];\n ngonDto.radius = 1;\n\n ngonDto.center = [0, 0, 0];\n const wire1 = await wire.createNGonWire(ngonDto);\n\n ngonDto.center = [0, 0.1, 0];\n const wire2 = await wire.createNGonWire(ngonDto);\n\n ngonDto.center = [0, 0.2, 0];\n const wire3 = await wire.createNGonWire(ngonDto);\n\n ngonDto.center = [0, 0.3, 0];\n const wire4 = await wire.createNGonWire(ngonDto);\n\n // 2. Generate Lists of Transformed Wires\n const list1: TopoDSShapePointer[] = [];\n const list2: TopoDSShapePointer[] = [];\n\n for (let i = 0; i <= 10; i++) {\n const angle = i * 9;\n const factor = i + 1;\n\n // Helper to rotate and scale\n const transform = async (w: TopoDSShapePointer) => {\n const rotDto = new RotateDto();\n rotDto.shape = w;\n rotDto.axis = [0, 0, 1];\n rotDto.angle = angle;\n const rotated = await transforms.rotate(rotDto);\n\n const scaleDto = new ScaleDto();\n scaleDto.shape = rotated;\n scaleDto.factor = factor;\n return await transforms.scale(scaleDto);\n };\n\n list1.push(await transform(wire1));\n list1.push(await transform(wire2));\n list2.push(await transform(wire3));\n list2.push(await transform(wire4));\n }\n\n // 3. Process Lists\n // Remove first item from list1\n list1.shift();\n // Reverse list2 and remove last item\n list2.reverse();\n list2.shift();\n list2.pop();\n\n // 4. Merge and Reverse Final List\n // Merge: list2 items then list1 items\n let finalList = [...list2, ...list1];\n\n // Reverse the final list for the loft direction\n finalList.reverse();\n\n // 5. Loft\n const loftDto = new LoftAdvancedDto();\n loftDto.shapes = finalList;\n loftDto.makeSolid = false;\n loftDto.closed = true;\n loftDto.periodic = false;\n loftDto.straight = true;\n loftDto.nrPeriodicSections = 10;\n loftDto.useSmoothing = false;\n loftDto.maxUDegree = 3;\n loftDto.tolerance = 1e-7;\n loftDto.parType = approxParametrizationTypeEnum.approxCentripetal;\n const loftShape = await operations.loftAdvanced(loftDto);\n\n // 6. Unify Domain\n const unifyDto = new UnifySameDomainDto();\n unifyDto.shape = loftShape;\n unifyDto.unifyEdges = true;\n unifyDto.unifyFaces = true;\n unifyDto.concatBSplines = true;\n const unifiedShape = await shape.unifySameDomain(unifyDto);\n\n // 7. Draw\n const materialOptions = new PBRMetallicRoughnessDto();\n materialOptions.name = 'Custom Material';\n materialOptions.baseColor = '#94ffd1';\n materialOptions.emissiveColor = '#000000';\n materialOptions.metallic = 0.9;\n materialOptions.roughness = 0.3;\n materialOptions.alpha = 1;\n materialOptions.backFaceCulling = false;\n materialOptions.zOffset = 2;\n const material = bitbybit.babylon.material.pbrMetallicRoughness.create(materialOptions);\n\n const drawOptions = new DrawOcctShapeOptions();\n drawOptions.precision = 0.01;\n drawOptions.drawEdges = true;\n drawOptions.edgeColour = '#ffffff';\n drawOptions.edgeWidth = 2;\n drawOptions.faceMaterial = material;\n\n const drawnMesh = await bitbybit.draw.drawAnyAsync({\n entity: unifiedShape,\n options: drawOptions,\n });\n\n const zoomDto = new ZoomOnDto();\n zoomDto.meshes = [drawnMesh];\n bitbybit.advanced.navigation.zoomOn(zoomDto);\n};\n\nstart();","version":"0.20.14","type":"typescript"}} +title="Twisted Polygon Ornament" +/> + + + +## How It Works + +The algorithm creates a twisted ornament by stacking transformed hexagonal profiles. We start with four base hexagons at different heights, then generate eleven iterations where each step rotates by 9 degrees and scales progressively larger. This creates a smooth spiraling form that expands outward as it rises. + +The technique uses two separate lists to control the twist direction. After transforming all profiles, we carefully arrange and reverse these lists before connecting them with a lofting operation. The loft creates smooth surfaces between profiles using straight transitions, maintaining crisp edges while achieving an organic twisted appearance. Finally, a unification step cleans up the geometry by merging adjacent faces and edges. + +## Algorithm Steps + +``` +1. Create four base hexagon wires at heights: 0, 0.1, 0.2, 0.3 + +2. For each iteration i from 0 to 10: + - Calculate angle = i × 9 degrees + - Calculate scale factor = i + 1 + - Transform wires 1 and 2 → add to list1 + - Transform wires 3 and 4 → add to list2 + +3. Process lists: + - Remove first item from list1 + - Reverse list2, then remove first and last items + +4. Combine lists: + - Merge list2 + list1 → finalList + - Reverse finalList + +5. Loft profiles: + - Connect all profiles with straight transitions + - Create closed, non-periodic surface + +6. Unify geometry: + - Merge coplanar faces + - Combine adjacent edges + +7. Render with metallic material and visible edges +``` + +Experiment with the number of polygon corners or rotation angle to create unique variations of this twisted form. + diff --git a/examples/runner/babylon/full/simple-all-kernels/index.html b/examples/runner/babylon/full/simple-all-kernels/index.html index d920e84b..da95eb3d 100644 --- a/examples/runner/babylon/full/simple-all-kernels/index.html +++ b/examples/runner/babylon/full/simple-all-kernels/index.html @@ -34,7 +34,7 @@ // This function simply outputs the script that was exported from the Rete editor by clicking "Export to Runner" and selecting Minify option. function exportedScript() { - return '{\"type\":\"rete\",\"version\":\"0.20.12\",\"script\":\"async function(t,e,n,i,s){let a={};a={radius:[1],circularSegments:[32],...a};const y=[{result:await t.HS.executeBasedOnTypeAsync(a,!1,(t=>e.manifold.manifold.shapes.sphere(t))),transformers:[]}],r={entity:[void 0],options:[void 0],babylonMesh:[void 0]};let u={};u.entity=y,t.HS.updateListInputs(u),u={...r,...u};await t.HS.executeBasedOnTypeAsync(u,!1,(t=>e.draw.drawAnyAsync(t)))}(BitByBit,bitbybit,bitbybitRunnerResult,bitbybitRunnerInputs,Bit);\"}' + return '{\"type\":\"rete\",\"version\":\"0.20.14\",\"script\":\"async function(t,e,n,i,s){let a={};a={radius:[1],circularSegments:[32],...a};const y=[{result:await t.HS.executeBasedOnTypeAsync(a,!1,(t=>e.manifold.manifold.shapes.sphere(t))),transformers:[]}],r={entity:[void 0],options:[void 0],babylonMesh:[void 0]};let u={};u.entity=y,t.HS.updateListInputs(u),u={...r,...u};await t.HS.executeBasedOnTypeAsync(u,!1,(t=>e.draw.drawAnyAsync(t)))}(BitByBit,bitbybit,bitbybitRunnerResult,bitbybitRunnerInputs,Bit);\"}' }; + + + +
+ +

Runner Example - Inline Rete Script Embed Via PlayCanvas

+
+ +
+ + Embed string generated by using the "Rete Script Alloy Wheel CAD Model but we removed some BabylonJS specific logic like skybox to make it run". + +
+ + + \ No newline at end of file diff --git a/examples/runner/playcanvas/full/simple/index.html b/examples/runner/playcanvas/full/simple/index.html new file mode 100644 index 00000000..d0e6f073 --- /dev/null +++ b/examples/runner/playcanvas/full/simple/index.html @@ -0,0 +1,174 @@ + + + + + Bitbybit Runner PlayCanvas Full Coding Example - Initiate Scene & Camera In Runner + + + + + + + + + + + +
+ +

Bitbybit Runner PlayCanvas Full Coding Example - Initiate Scene & Camera In Runner

+
+ +
+

+ This example shows how to import Full version of bitbybit runner for playcanvas and initiate scene with a + single call to runner. This full version does not require PlayCanvas to be loaded separately. Full version + of + bitbybit-dev bundle is larger. +

+
+ + + \ No newline at end of file diff --git a/examples/runner/playcanvas/lite/index.html b/examples/runner/playcanvas/lite/index.html new file mode 100644 index 00000000..20849ecb --- /dev/null +++ b/examples/runner/playcanvas/lite/index.html @@ -0,0 +1,178 @@ + + + + + Bitbybit Runner PlayCanvas Lite Coding Example - Initiate Scene & Camera In Runner + + + + + + + + + + + + + + +
+ +

Bitbybit Runner PlayCanvas Lite Coding Example - Initiate Scene & Camera In Runner

+
+ +
+

+ This example shows how to import Lite version of bitbybit runner for PlayCanvas and initiate scene with a + single call to runner. This lite version requires PlayCanvas to be loaded separately. Lite version of + bitbybit-dev bundle is smaller than non-lite. +

+
+ + + \ No newline at end of file diff --git a/examples/runner/threejs/full/inline-include/index.html b/examples/runner/threejs/full/inline-include/index.html index 82981e31..ea72425c 100644 --- a/examples/runner/threejs/full/inline-include/index.html +++ b/examples/runner/threejs/full/inline-include/index.html @@ -34,7 +34,7 @@ // This function simply outputs the script that was exported from the Rete editor by clicking "Export to Runner" and selecting Minify option. function exportedScript() { - return '{\"type\":\"rete\",\"version\":\"0.20.14\",\"script\":\"async function(e,t,s,n,r){let a={};a={x:[0],y:[0],z:[1],...a};const o=[{result:e.HS.executeBasedOnType(a,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let i={};i={text:[\\"[true,false]\\"],...i};const p=[{result:e.HS.executeBasedOnType(i,!1,(e=>t.json.parse(e))),transformers:[]}];let c={};c={text:[\\"[false,true]\\"],...c};const u=[{result:e.HS.executeBasedOnType(c,!1,(e=>t.json.parse(e))),transformers:[]}],l=[{result:[5],transformers:[]}];let d={};d={x:[1],y:[0],z:[0],...d};const m=[{result:e.HS.executeBasedOnType(d,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}],y=[{result:[12],transformers:[]}],S=[{result:[7],transformers:[]}];let H={};H={x:[0],y:[1],z:[0],...H};const f=[{result:e.HS.executeBasedOnType(H,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let h={};h={x:[0],y:[0],z:[1],...h};const x=[{result:e.HS.executeBasedOnType(h,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let v={};v={number:[.4],...v};const O=[{result:e.HS.executeBasedOnType(v,!1,(e=>t.math.number(e))),transformers:[]}];let I={};I={x:[0],y:[0],z:[-1],...I};const L=[{result:e.HS.executeBasedOnType(I,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let B={};B={x:[0],y:[0],z:[-2],...B};const T=[{result:e.HS.executeBasedOnType(B,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let w={};w={x:[0],y:[0],z:[1],...w};const A=[{result:e.HS.executeBasedOnType(w,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let E={};E={x:[0],y:[1.5],z:[0],...E};const g=[{result:e.HS.executeBasedOnType(E,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let b={};b={...{faceOpacity:[.5],edgeOpacity:[.5],edgeColour:[\\"#000000\\"],faceColour:[\\"#212121\\"],vertexColour:[\\"#ff00ff\\"],faceMaterial:[void 0],edgeWidth:[2],vertexSize:[.03],drawEdges:[!0],drawFaces:[!0],drawVertices:[!1],precision:[.02],drawEdgeIndexes:[!1],edgeIndexHeight:[.06],edgeIndexColour:[\\"ff00ff\\"],drawFaceIndexes:[!1],faceIndexHeight:[.06],faceIndexColour:[\\"#0000ff\\"]},...b};const W=[{result:e.HS.executeBasedOnType(b,!1,(e=>t.draw.optionsOcctShape(e))),transformers:[]}];let z={};z={x:[0],y:[0],z:[-1],...z};const P=[{result:e.HS.executeBasedOnType(z,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let X={};X={x:[0],y:[0],z:[-1.5],...X};const Y=[{result:e.HS.executeBasedOnType(X,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let Z={};Z={x:[0],y:[0],z:[1],...Z};const N=[{result:e.HS.executeBasedOnType(Z,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let C={number:[{result:[20],transformers:[]}]};e.HS.updateListInputs(C),C={number:[20],...C};const k=[{result:e.HS.executeBasedOnType(C,!1,(e=>t.math.number(e))),transformers:[]}];let D={};D.y=y,e.HS.updateListInputs(D),D={x:[0],y:[0],z:[0],...D};const F=[{result:e.HS.executeBasedOnType(D,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let M={};M.item=y,e.HS.updateListInputs(M),M={...M};const R=[{result:M.item}];let j={};j.first=S,e.HS.updateListInputs(j),j={first:[1],second:[-2],operation:[\\"divide\\"],...j};const q=[{result:e.HS.executeBasedOnType(j,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let V={};V.first=S,e.HS.updateListInputs(V),V={first:[1],second:[-4],operation:[\\"divide\\"],...V};const G=[{result:e.HS.executeBasedOnType(V,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let J={};J.first=y,J.second=O,e.HS.updateListInputs(J),J={first:[1],second:[.4],operation:[\\"add\\"],...J};const K=[{result:e.HS.executeBasedOnType(J,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let Q={};Q.item=S,e.HS.updateListInputs(Q),Q={...Q};const U=[{result:Q.item}];let $={};$.center=Y,$.direction=P,e.HS.updateListInputs($),$={radius:[3],height:[1.9],center:[[0,0,0]],direction:[[0,1,0]],...$};const _=[{result:await e.HS.executeBasedOnTypeAsync($,!1,(e=>t.occt.shapes.solid.createCylinder(e))),transformers:[]}];let ee={};ee.y=K,e.HS.updateListInputs(ee),ee={x:[0],y:[12],z:[0],...ee};const te=[{result:e.HS.executeBasedOnType(ee,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let se={};se.first=k,e.HS.updateListInputs(se),se={first:[1],second:[3],operation:[\\"multiply\\"],...se};const ne=[{result:e.HS.executeBasedOnType(se,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let re={};re.first=R,re.second=O,e.HS.updateListInputs(re),re={first:[1],second:[.4],operation:[\\"add\\"],...re};const ae=[{result:e.HS.executeBasedOnType(re,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let oe={};oe.first=R,oe.second=O,e.HS.updateListInputs(oe),oe={first:[1],second:[.4],operation:[\\"subtract\\"],...oe};const ie=[{result:e.HS.executeBasedOnType(oe,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let pe={};pe.first=U,e.HS.updateListInputs(pe),pe={first:[1],second:[-.2],operation:[\\"multiply\\"],...pe};const ce=[{result:e.HS.executeBasedOnType(pe,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let ue={};ue.second=k,e.HS.updateListInputs(ue),ue={first:[360],second:[1],operation:[\\"divide\\"],...ue};const le=[{result:e.HS.executeBasedOnType(ue,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}],de={shape:[void 0],radius:[.3],radiusList:[void 0],indexes:[void 0]};let me={};me.shape=_,e.HS.updateListInputs(me),me={...de,...me};const ye=[{result:await e.HS.executeBasedOnTypeAsync(me,!1,(e=>t.occt.fillets.filletEdges(e))),transformers:[]}];let Se={};Se.start=L,Se.end=te,e.HS.updateListInputs(Se),Se={start:[[0,0,0]],end:[[0,1,0]],...Se};const He=[{result:await e.HS.executeBasedOnTypeAsync(Se,!1,(e=>t.occt.shapes.wire.createLineWire(e))),transformers:[]}];let fe={};fe.second=ne,e.HS.updateListInputs(fe),fe={first:[360],second:[1],operation:[\\"divide\\"],...fe};const he=[{result:e.HS.executeBasedOnType(fe,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let xe={};xe.start=T,xe.end=te,e.HS.updateListInputs(xe),xe={start:[[0,0,0]],end:[[0,1,0]],...xe};const ve=[{result:await e.HS.executeBasedOnTypeAsync(xe,!1,(e=>t.occt.shapes.wire.createLineWire(e))),transformers:[]}];let Oe={};Oe.y=ae,e.HS.updateListInputs(Oe),Oe={x:[0],y:[0],z:[.05],...Oe};const Ie=[{result:e.HS.executeBasedOnType(Oe,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let Le={};Le.y=ie,Le.z=G,e.HS.updateListInputs(Le),Le={x:[0],y:[0],z:[-1],...Le};const Be=[{result:e.HS.executeBasedOnType(Le,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let Te={};Te.y=ie,Te.z=q,e.HS.updateListInputs(Te),Te={x:[0],y:[0],z:[0],...Te};const we=[{result:e.HS.executeBasedOnType(Te,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let Ae={};Ae.z=ce,e.HS.updateListInputs(Ae),Ae={x:[0],y:[0],z:[0],...Ae};const Ee=[{result:e.HS.executeBasedOnType(Ae,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let ge={};ge.step=le,e.HS.updateListInputs(ge),ge={step:[.1],min:[0],max:[360],...ge};const be=e.HS.executeBasedOnType(ge,!1,(e=>t.vector.span(e))),We=[];for(let e=0;e<1;e++)We.push({type:\\"flat\\"});const ze=[{result:be,transformers:We}];let Pe={};Pe.first=ce,e.HS.updateListInputs(Pe),Pe={first:[2],second:[-2],operation:[\\"multiply\\"],...Pe};e.HS.executeBasedOnType(Pe,!1,(e=>t.math.twoNrOperation(e)));let Xe={};Xe.listElements=ye,e.HS.updateListInputs(Xe),Xe={...Xe};const Ye=[{result:[Xe.listElements?Xe.listElements:[]]}],Ze={shape:[void 0],axis:[[0,0,1]],angle:[0]};let Ne={};Ne.shape=He,Ne.axis=o,Ne.angle=he,e.HS.updateListInputs(Ne),Ne={...Ze,...Ne};const Ce=[{result:await e.HS.executeBasedOnTypeAsync(Ne,!1,(e=>t.occt.transforms.rotate(e))),transformers:[]}];let ke={};ke.first=he,e.HS.updateListInputs(ke),ke={first:[1],second:[.4],operation:[\\"multiply\\"],...ke};const De=[{result:e.HS.executeBasedOnType(ke,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let Fe={};Fe.first=he,e.HS.updateListInputs(Fe),Fe={first:[1],second:[.6],operation:[\\"multiply\\"],...Fe};const Me=[{result:e.HS.executeBasedOnType(Fe,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let Re={};Re.listElements=[Ie[0],F[0],Be[0],we[0]],e.HS.updateListInputs(Re),Re={...Re};const je=[{result:[Re.listElements?Re.listElements:[]]}];let qe={};qe.item=ze,e.HS.updateListInputs(qe),qe={...qe};const Ve=[{result:qe.item}],Ge={shape:[void 0],nrOfDivisions:[11],removeStartPoint:[!1],removeEndPoint:[!1]};let Je={};Je.shape=Ce,Je.nrOfDivisions=l,e.HS.updateListInputs(Je),Je={...Ge,...Je};const Ke=[{result:await e.HS.executeBasedOnTypeAsync(Je,!1,(e=>t.occt.shapes.wire.divideWireByEqualDistanceToPoints(e))),transformers:[]}],Qe={shape:[void 0],axis:[[0,0,1]],angle:[0]};let Ue={};Ue.shape=ve,Ue.axis=o,Ue.angle=[De[0],Me[0]],e.HS.updateListInputs(Ue),Ue={...Qe,...Ue};const $e=[{result:await e.HS.executeBasedOnTypeAsync(Ue,!1,(e=>t.occt.transforms.rotate(e))),transformers:[]}];let _e={};_e.number=De,e.HS.updateListInputs(_e),_e={number:[1],operation:[\\"negate\\"],..._e};const et=[{result:e.HS.executeBasedOnType(_e,!1,(e=>t.math.oneNrOperation(e))),transformers:[]}],tt={points:[void 0]};let st={};st.points=je,e.HS.updateListInputs(st),st={...tt,...st};const nt=[{result:await e.HS.executeBasedOnTypeAsync(st,!1,(e=>t.occt.shapes.wire.createPolylineWire(e))),transformers:[]}],rt={list:[void 0],pattern:[[!0,!0,!1]]};let at={};at.list=Ke,at.pattern=u,e.HS.updateListInputs(at),at={...rt,...at};const ot=[{result:e.HS.executeBasedOnType(at,!0,(e=>t.lists.getByPattern(e))),transformers:[]}];let it={};it.listElements=$e,e.HS.updateListInputs(it),it={...it};const pt=[{result:[it.listElements?it.listElements:[]]}],ct={shape:[void 0],origin:[[0,0,0]],direction:[[0,0,1]]};let ut={};ut.shape=nt,ut.origin=we,ut.direction=f,e.HS.updateListInputs(ut),ut={...ct,...ut};const lt=[{result:await e.HS.executeBasedOnTypeAsync(ut,!1,(e=>t.occt.transforms.mirror(e))),transformers:[]}],dt={shape:[void 0]};let mt={};mt.shape=nt,e.HS.updateListInputs(mt),mt={...dt,...mt};const yt=await e.HS.executeBasedOnTypeAsync(mt,!1,(e=>t.occt.shapes.edge.getCornerPointsOfEdgesForShape(e))),St=[];for(let e=0;e<1;e++)St.push({type:\\"flat\\"});const Ht=[{result:yt,transformers:St}],ft={list:[void 0],index:[0],clone:[!0]};let ht={};ht.list=pt,e.HS.updateListInputs(ht),ht={...ft,...ht};const xt=[{result:e.HS.executeBasedOnType(ht,!1,(e=>t.lists.getItem(e))),transformers:[]}],vt={shape:[void 0]};let Ot={};Ot.shape=lt,e.HS.updateListInputs(Ot),Ot={...vt,...Ot};const It=[{result:await e.HS.executeBasedOnTypeAsync(Ot,!1,(e=>t.occt.shapes.edge.getCornerPointsOfEdgesForShape(e))),transformers:[]}],Lt={shape:[void 0],nrOfDivisions:[11],removeStartPoint:[!1],removeEndPoint:[!1]};let Bt={};Bt.shape=xt,Bt.nrOfDivisions=l,e.HS.updateListInputs(Bt),Bt={...Lt,...Bt};const Tt=[{result:await e.HS.executeBasedOnTypeAsync(Bt,!1,(e=>t.occt.shapes.wire.divideWireByEqualDistanceToPoints(e))),transformers:[]}],wt={list:[void 0],index:[3],clone:[!0]};let At={};At.list=It,e.HS.updateListInputs(At),At={...wt,...At};const Et=[{result:e.HS.executeBasedOnType(At,!1,(e=>t.lists.removeItemAtIndex(e))),transformers:[]}],gt={list:[void 0],pattern:[[!0,!0,!1]]};let bt={};bt.list=Tt,bt.pattern=p,e.HS.updateListInputs(bt),bt={...gt,...bt};const Wt=[{result:e.HS.executeBasedOnType(bt,!1,(e=>t.lists.getByPattern(e))),transformers:[]}],zt={list:[void 0],clone:[!0]};let Pt={};Pt.list=Et,e.HS.updateListInputs(Pt),Pt={...zt,...Pt};const Xt=e.HS.executeBasedOnType(Pt,!1,(e=>t.lists.reverse(e))),Yt=[];for(let e=0;e<1;e++)Yt.push({type:\\"flat\\"});const Zt=[{result:Xt,transformers:Yt}];let Nt={};Nt.listElements=[Wt[0],ot[0]],e.HS.updateListInputs(Nt),Nt={...Nt};const Ct=[{result:[Nt.listElements?Nt.listElements:[]]}];let kt={};kt.listElements=[Ht[0],Zt[0]],e.HS.updateListInputs(kt),kt={...kt};const Dt=[{result:[kt.listElements?kt.listElements:[]]}],Ft={list:[void 0],clone:[!0]};let Mt={};Mt.list=Ct,e.HS.updateListInputs(Mt),Mt={...Ft,...Mt};const Rt=e.HS.executeBasedOnType(Mt,!1,(e=>t.lists.flipLists(e))),jt=[];for(let e=0;e<2;e++)jt.push({type:\\"flat\\"});const qt=[{result:Rt,transformers:jt}],Vt={points:[void 0]};let Gt={};Gt.points=Dt,e.HS.updateListInputs(Gt),Gt={...Vt,...Gt};const Jt=[{result:await e.HS.executeBasedOnTypeAsync(Gt,!1,(e=>t.occt.shapes.wire.createPolylineWire(e))),transformers:[]}];let Kt={};Kt.listElements=qt,e.HS.updateListInputs(Kt),Kt={...Kt};const Qt=[{result:[Kt.listElements?Kt.listElements:[]]}],Ut={shape:[void 0],radius:[.3],radiusList:[void 0],indexes:[void 0]};let $t={};$t.shape=Jt,e.HS.updateListInputs($t),$t={...Ut,...$t};const _t=[{result:await e.HS.executeBasedOnTypeAsync($t,!1,(e=>t.occt.fillets.fillet2d(e))),transformers:[]}],es={points:[void 0]};let ts={};ts.points=Qt,e.HS.updateListInputs(ts),ts={...es,...ts};const ss=[{result:await e.HS.executeBasedOnTypeAsync(ts,!1,(e=>t.occt.shapes.wire.createPolylineWire(e))),transformers:[]}],ns={shape:[void 0],angle:[360],direction:[[0,1,0]],copy:[!1]};let rs={};rs.shape=_t,rs.direction=x,e.HS.updateListInputs(rs),rs={...ns,...rs};const as=[{result:await e.HS.executeBasedOnTypeAsync(rs,!1,(e=>t.occt.operations.revolve(e))),transformers:[]}],os={shape:[void 0]};let is={};is.shape=_t,e.HS.updateListInputs(is),is={...os,...is};const ps=[{result:await e.HS.executeBasedOnTypeAsync(is,!1,(e=>t.occt.shapes.wire.startPointOnWire(e))),transformers:[]}],cs={shape:[void 0]};let us={};us.shape=_t,e.HS.updateListInputs(us),us={...cs,...us};const ls=[{result:await e.HS.executeBasedOnTypeAsync(us,!1,(e=>t.occt.shapes.wire.endPointOnWire(e))),transformers:[]}],ds={shape:[void 0]};let ms={};ms.shape=_t,e.HS.updateListInputs(ms),ms={...ds,...ms};const ys=[{result:await e.HS.executeBasedOnTypeAsync(ms,!1,(e=>t.occt.shapes.wire.closeOpenWire(e))),transformers:[]}],Ss={shape:[void 0],angle:[360],direction:[[0,1,0]],copy:[!1]};let Hs={};Hs.shape=ys,Hs.direction=x,e.HS.updateListInputs(Hs),Hs={...Ss,...Hs};const fs=[{result:await e.HS.executeBasedOnTypeAsync(Hs,!1,(e=>t.occt.operations.revolve(e))),transformers:[]}],hs={shape:[void 0],radius:[1],radiusList:[void 0],indexes:[void 0],direction:[[0,1,0]]};let xs={};xs.shape=ss,xs.direction=A,e.HS.updateListInputs(xs),xs={...hs,...xs};const vs=[{result:await e.HS.executeBasedOnTypeAsync(xs,!1,(e=>t.occt.fillets.fillet3DWire(e))),transformers:[]}],Os={shape:[void 0],face:[void 0],distance:[-.2],tolerance:[.1]};let Is={};Is.shape=as,e.HS.updateListInputs(Is),Is={...Os,...Is};const Ls=[{result:await e.HS.executeBasedOnTypeAsync(Is,!1,(e=>t.occt.operations.offset(e))),transformers:[]}],Bs={shape:[void 0],index:[0]};let Ts={};Ts.shape=as,e.HS.updateListInputs(Ts),Ts={...Bs,...Ts};const ws=[{result:await e.HS.executeBasedOnTypeAsync(Ts,!1,(e=>t.occt.shapes.wire.getWire(e))),transformers:[]}];let As={};As.item=ps,e.HS.updateListInputs(As),As={...As};const Es=[{result:As.item}];let gs={};gs.item=ls,e.HS.updateListInputs(gs),gs={...gs};const bs=[{result:gs.item}];let Ws={};Ws.start=ls,Ws.end=ps,e.HS.updateListInputs(Ws),Ws={start:[[0,0,0]],end:[[0,1,0]],...Ws};const zs=[{result:await e.HS.executeBasedOnTypeAsync(Ws,!1,(e=>t.occt.shapes.wire.createLineWire(e))),transformers:[]}],Ps={shape:[void 0],angle:[360],direction:[[0,1,0]],copy:[!1]};let Xs={};Xs.shape=vs,Xs.angle=et,Xs.direction=o,e.HS.updateListInputs(Xs),Xs={...Ps,...Xs};const Ys=[{result:await e.HS.executeBasedOnTypeAsync(Xs,!1,(e=>t.occt.operations.revolve(e))),transformers:[]}],Zs={shape:[void 0]};let Ns={};Ns.shape=fs,e.HS.updateListInputs(Ns),Ns={...Zs,...Ns};const Cs=[{result:await e.HS.executeBasedOnTypeAsync(Ns,!1,(e=>t.occt.shapes.solid.fromClosedShell(e))),transformers:[]}],ks={shape:[void 0],index:[1]};let Ds={};Ds.shape=ws,e.HS.updateListInputs(Ds),Ds={...ks,...Ds};const Fs=[{result:await e.HS.executeBasedOnTypeAsync(Ds,!1,(e=>t.occt.shapes.edge.getEdge(e))),transformers:[]}],Ms={shape:[void 0],index:[0]};let Rs={};Rs.shape=Ls,e.HS.updateListInputs(Rs),Rs={...Ms,...Rs};const js=[{result:await e.HS.executeBasedOnTypeAsync(Rs,!1,(e=>t.occt.shapes.wire.getWire(e))),transformers:[]}],qs={shape:[void 0],translation:[[0,0,0]]};let Vs={};Vs.shape=zs,Vs.translation=g,e.HS.updateListInputs(Vs),Vs={...qs,...Vs};const Gs=[{result:await e.HS.executeBasedOnTypeAsync(Vs,!1,(e=>t.occt.transforms.translate(e))),transformers:[]}],Js={shape:[void 0],direction:[[0,1,0]]};let Ks={};Ks.shape=Ys,Ks.direction=Ee,e.HS.updateListInputs(Ks),Ks={...Js,...Ks};const Qs=[{result:await e.HS.executeBasedOnTypeAsync(Ks,!1,(e=>t.occt.operations.extrude(e))),transformers:[]}];let Us={};Us.listElements=Cs,e.HS.updateListInputs(Us),Us={...Us};const $s=[{result:[Us.listElements?Us.listElements:[]]}],_s={shape:[void 0],index:[1]};let en={};en.shape=js,e.HS.updateListInputs(en),en={..._s,...en};const tn=[{result:await e.HS.executeBasedOnTypeAsync(en,!1,(e=>t.occt.shapes.edge.getEdge(e))),transformers:[]}];let sn={};sn.listElements=Fs,e.HS.updateListInputs(sn),sn={...sn};const nn=[{result:[sn.listElements?sn.listElements:[]]}],rn={shape:[void 0]};let an={};an.shape=Gs,e.HS.updateListInputs(an),an={...rn,...an};const on=[{result:await e.HS.executeBasedOnTypeAsync(an,!1,(e=>t.occt.shapes.wire.startPointOnWire(e))),transformers:[]}],pn={shape:[void 0]};let cn={};cn.shape=Gs,e.HS.updateListInputs(cn),cn={...pn,...cn};const un=[{result:await e.HS.executeBasedOnTypeAsync(cn,!1,(e=>t.occt.shapes.wire.endPointOnWire(e))),transformers:[]}],ln={shapes:[void 0]};let dn={};dn.shapes=nn,e.HS.updateListInputs(dn),dn={...ln,...dn};const mn=[{result:await e.HS.executeBasedOnTypeAsync(dn,!1,(e=>t.occt.shapes.wire.combineEdgesAndWiresIntoAWire(e))),transformers:[]}];let yn={};yn.listElements=tn,e.HS.updateListInputs(yn),yn={...yn};const Sn=[{result:[yn.listElements?yn.listElements:[]]}],Hn={shape:[void 0],shapes:[void 0],keepEdges:[!1]};let fn={};fn.shape=Qs,fn.shapes=Ye,e.HS.updateListInputs(fn),fn={...Hn,...fn};const hn=[{result:await e.HS.executeBasedOnTypeAsync(fn,!1,(e=>t.occt.booleans.difference(e))),transformers:[]}];let xn={};xn.item=un,e.HS.updateListInputs(xn),xn={...xn};const vn=[{result:xn.item}];let On={};On.item=on,e.HS.updateListInputs(On),On={...On};const In=[{result:On.item}],Ln={shape:[void 0],shapes:[void 0],keepEdges:[!1]};let Bn={};Bn.shape=hn,Bn.shapes=$s,e.HS.updateListInputs(Bn),Bn={...Ln,...Bn};const Tn=[{result:await e.HS.executeBasedOnTypeAsync(Bn,!1,(e=>t.occt.booleans.difference(e))),transformers:[]}],wn={shapes:[void 0]};let An={};An.shapes=Sn,e.HS.updateListInputs(An),An={...wn,...An};const En=[{result:await e.HS.executeBasedOnTypeAsync(An,!1,(e=>t.occt.shapes.wire.combineEdgesAndWiresIntoAWire(e))),transformers:[]}];let gn={};gn.listElements=[Es[0],vn[0],In[0],bs[0]],e.HS.updateListInputs(gn),gn={...gn};const bn=[{result:[gn.listElements?gn.listElements:[]]}],Wn={shape:[void 0],origin:[[0,0,0]],normal:[[0,0,1]]};let zn={};zn.shape=Tn,zn.normal=m,e.HS.updateListInputs(zn),zn={...Wn,...zn};const Pn=[{result:await e.HS.executeBasedOnTypeAsync(zn,!1,(e=>t.occt.transforms.mirrorAlongNormal(e))),transformers:[]}];let Xn={};Xn.listElements=[mn[0],En[0]],e.HS.updateListInputs(Xn),Xn={...Xn};const Yn=[{result:[Xn.listElements?Xn.listElements:[]]}],Zn={points:[void 0]};let Nn={};Nn.points=bn,e.HS.updateListInputs(Nn),Nn={...Zn,...Nn};const Cn=[{result:await e.HS.executeBasedOnTypeAsync(Nn,!1,(e=>t.occt.shapes.wire.createPolylineWire(e))),transformers:[]}];let kn={};kn.listElements=[Pn[0],Tn[0]],e.HS.updateListInputs(kn),kn={...kn};const Dn=[{result:[kn.listElements?kn.listElements:[]]}],Fn={shapes:[void 0],makeSolid:[!1]};let Mn={};Mn.shapes=Yn,e.HS.updateListInputs(Mn),Mn={...Fn,...Mn};const Rn=[{result:await e.HS.executeBasedOnTypeAsync(Mn,!1,(e=>t.occt.operations.loft(e))),transformers:[]}],jn={shape:[void 0],radius:[.5],radiusList:[void 0],indexes:[void 0]};let qn={};qn.shape=Cn,e.HS.updateListInputs(qn),qn={...jn,...qn};const Vn=[{result:await e.HS.executeBasedOnTypeAsync(qn,!1,(e=>t.occt.fillets.fillet2d(e))),transformers:[]}],Gn={shapes:[void 0]};let Jn={};Jn.shapes=Dn,e.HS.updateListInputs(Jn),Jn={...Gn,...Jn};const Kn=[{result:await e.HS.executeBasedOnTypeAsync(Jn,!1,(e=>t.occt.shapes.compound.makeCompound(e))),transformers:[]}],Qn={shape:[void 0],origin:[[0,0,0]],direction:[[0,0,1]]};let Un={};Un.shape=Rn,Un.origin=we,Un.direction=f,e.HS.updateListInputs(Un),Un={...Qn,...Un};const $n=[{result:await e.HS.executeBasedOnTypeAsync(Un,!1,(e=>t.occt.transforms.mirror(e))),transformers:[]}],_n={shape:[void 0],angle:[360],direction:[[0,1,0]],copy:[!1]};let er={};er.shape=Vn,er.direction=x,e.HS.updateListInputs(er),er={..._n,...er};const tr=[{result:await e.HS.executeBasedOnTypeAsync(er,!1,(e=>t.occt.operations.revolve(e))),transformers:[]}];let sr={};sr.listElements=[as[0],Ls[0],Rn[0],$n[0]],e.HS.updateListInputs(sr),sr={...sr};const nr=[{result:[sr.listElements?sr.listElements:[]]}],rr={shape:[void 0],offset:[-.1]};let ar={};ar.shape=tr,e.HS.updateListInputs(ar),ar={...rr,...ar};const or=[{result:await e.HS.executeBasedOnTypeAsync(ar,!1,(e=>t.occt.operations.makeThickSolidSimple(e))),transformers:[]}],ir={shape:[void 0],angle:[0],center:[[0,0,0]],axis:[[0,0,1]]};let pr={};pr.shape=Kn,pr.angle=Ve,pr.axis=N,e.HS.updateListInputs(pr),pr={...ir,...pr};const cr=[{result:await e.HS.executeBasedOnTypeAsync(pr,!1,(e=>t.occt.transforms.rotateAroundCenter(e))),transformers:[]}],ur={shapes:[void 0],tolerance:[1e-7]};let lr={};lr.shapes=nr,e.HS.updateListInputs(lr),lr={...ur,...lr};const dr=[{result:await e.HS.executeBasedOnTypeAsync(lr,!1,(e=>t.occt.shapes.shell.sewFaces(e))),transformers:[]}],mr={entity:[void 0],options:[void 0],babylonMesh:[void 0]};let yr={};yr.entity=or,yr.options=W,e.HS.updateListInputs(yr),yr={...mr,...yr};await e.HS.executeBasedOnTypeAsync(yr,!1,(e=>t.draw.drawAnyAsync(e)));let Sr={};Sr.listElements=cr,e.HS.updateListInputs(Sr),Sr={...Sr};const Hr=[{result:[Sr.listElements?Sr.listElements:[]]}],fr={shapes:[void 0]};let hr={};hr.shapes=Hr,e.HS.updateListInputs(hr),hr={...fr,...hr};const xr=[{result:await e.HS.executeBasedOnTypeAsync(hr,!1,(e=>t.occt.shapes.compound.makeCompound(e))),transformers:[]}];let vr={};vr.listElements=[dr[0],ye[0],xr[0]],e.HS.updateListInputs(vr),vr={...vr};const Or=[{result:[vr.listElements?vr.listElements:[]]}],Ir={shapes:[void 0]};let Lr={};Lr.shapes=Or,e.HS.updateListInputs(Lr),Lr={...Ir,...Lr};const Br=[{result:await e.HS.executeBasedOnTypeAsync(Lr,!1,(e=>t.occt.shapes.compound.makeCompound(e))),transformers:[]}],Tr={entity:[void 0],options:[void 0],babylonMesh:[void 0]};let wr={};wr.entity=Br,e.HS.updateListInputs(wr),wr={...Tr,...wr};await e.HS.executeBasedOnTypeAsync(wr,!1,(e=>t.draw.drawAnyAsync(e)))}(BitByBit,bitbybit,bitbybitRunnerResult,bitbybitRunnerInputs,Bit);\"}' + return '{\"type\":\"rete\",\"version\":\"0.21.0\",\"script\":\"async function(e,t,s,n,r){let a={};a={x:[0],y:[0],z:[1],...a};const o=[{result:e.HS.executeBasedOnType(a,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let i={};i={text:[\\"[true,false]\\"],...i};const p=[{result:e.HS.executeBasedOnType(i,!1,(e=>t.json.parse(e))),transformers:[]}];let c={};c={text:[\\"[false,true]\\"],...c};const u=[{result:e.HS.executeBasedOnType(c,!1,(e=>t.json.parse(e))),transformers:[]}],l=[{result:[5],transformers:[]}];let d={};d={x:[1],y:[0],z:[0],...d};const m=[{result:e.HS.executeBasedOnType(d,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}],y=[{result:[12],transformers:[]}],S=[{result:[7],transformers:[]}];let H={};H={x:[0],y:[1],z:[0],...H};const f=[{result:e.HS.executeBasedOnType(H,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let h={};h={x:[0],y:[0],z:[1],...h};const x=[{result:e.HS.executeBasedOnType(h,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let v={};v={number:[.4],...v};const O=[{result:e.HS.executeBasedOnType(v,!1,(e=>t.math.number(e))),transformers:[]}];let I={};I={x:[0],y:[0],z:[-1],...I};const L=[{result:e.HS.executeBasedOnType(I,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let B={};B={x:[0],y:[0],z:[-2],...B};const T=[{result:e.HS.executeBasedOnType(B,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let w={};w={x:[0],y:[0],z:[1],...w};const A=[{result:e.HS.executeBasedOnType(w,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let E={};E={x:[0],y:[1.5],z:[0],...E};const g=[{result:e.HS.executeBasedOnType(E,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let b={};b={...{faceOpacity:[.5],edgeOpacity:[.5],edgeColour:[\\"#000000\\"],faceColour:[\\"#212121\\"],vertexColour:[\\"#ff00ff\\"],faceMaterial:[void 0],edgeWidth:[2],vertexSize:[.03],drawEdges:[!0],drawFaces:[!0],drawVertices:[!1],precision:[.02],drawEdgeIndexes:[!1],edgeIndexHeight:[.06],edgeIndexColour:[\\"ff00ff\\"],drawFaceIndexes:[!1],faceIndexHeight:[.06],faceIndexColour:[\\"#0000ff\\"]},...b};const W=[{result:e.HS.executeBasedOnType(b,!1,(e=>t.draw.optionsOcctShape(e))),transformers:[]}];let z={};z={x:[0],y:[0],z:[-1],...z};const P=[{result:e.HS.executeBasedOnType(z,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let X={};X={x:[0],y:[0],z:[-1.5],...X};const Y=[{result:e.HS.executeBasedOnType(X,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let Z={};Z={x:[0],y:[0],z:[1],...Z};const N=[{result:e.HS.executeBasedOnType(Z,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let C={number:[{result:[20],transformers:[]}]};e.HS.updateListInputs(C),C={number:[20],...C};const k=[{result:e.HS.executeBasedOnType(C,!1,(e=>t.math.number(e))),transformers:[]}];let D={};D.y=y,e.HS.updateListInputs(D),D={x:[0],y:[0],z:[0],...D};const F=[{result:e.HS.executeBasedOnType(D,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let M={};M.item=y,e.HS.updateListInputs(M),M={...M};const R=[{result:M.item}];let j={};j.first=S,e.HS.updateListInputs(j),j={first:[1],second:[-2],operation:[\\"divide\\"],...j};const q=[{result:e.HS.executeBasedOnType(j,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let V={};V.first=S,e.HS.updateListInputs(V),V={first:[1],second:[-4],operation:[\\"divide\\"],...V};const G=[{result:e.HS.executeBasedOnType(V,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let J={};J.first=y,J.second=O,e.HS.updateListInputs(J),J={first:[1],second:[.4],operation:[\\"add\\"],...J};const K=[{result:e.HS.executeBasedOnType(J,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let Q={};Q.item=S,e.HS.updateListInputs(Q),Q={...Q};const U=[{result:Q.item}];let $={};$.center=Y,$.direction=P,e.HS.updateListInputs($),$={radius:[3],height:[1.9],center:[[0,0,0]],direction:[[0,1,0]],...$};const _=[{result:await e.HS.executeBasedOnTypeAsync($,!1,(e=>t.occt.shapes.solid.createCylinder(e))),transformers:[]}];let ee={};ee.y=K,e.HS.updateListInputs(ee),ee={x:[0],y:[12],z:[0],...ee};const te=[{result:e.HS.executeBasedOnType(ee,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let se={};se.first=k,e.HS.updateListInputs(se),se={first:[1],second:[3],operation:[\\"multiply\\"],...se};const ne=[{result:e.HS.executeBasedOnType(se,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let re={};re.first=R,re.second=O,e.HS.updateListInputs(re),re={first:[1],second:[.4],operation:[\\"add\\"],...re};const ae=[{result:e.HS.executeBasedOnType(re,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let oe={};oe.first=R,oe.second=O,e.HS.updateListInputs(oe),oe={first:[1],second:[.4],operation:[\\"subtract\\"],...oe};const ie=[{result:e.HS.executeBasedOnType(oe,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let pe={};pe.first=U,e.HS.updateListInputs(pe),pe={first:[1],second:[-.2],operation:[\\"multiply\\"],...pe};const ce=[{result:e.HS.executeBasedOnType(pe,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let ue={};ue.second=k,e.HS.updateListInputs(ue),ue={first:[360],second:[1],operation:[\\"divide\\"],...ue};const le=[{result:e.HS.executeBasedOnType(ue,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}],de={shape:[void 0],radius:[.3],radiusList:[void 0],indexes:[void 0]};let me={};me.shape=_,e.HS.updateListInputs(me),me={...de,...me};const ye=[{result:await e.HS.executeBasedOnTypeAsync(me,!1,(e=>t.occt.fillets.filletEdges(e))),transformers:[]}];let Se={};Se.start=L,Se.end=te,e.HS.updateListInputs(Se),Se={start:[[0,0,0]],end:[[0,1,0]],...Se};const He=[{result:await e.HS.executeBasedOnTypeAsync(Se,!1,(e=>t.occt.shapes.wire.createLineWire(e))),transformers:[]}];let fe={};fe.second=ne,e.HS.updateListInputs(fe),fe={first:[360],second:[1],operation:[\\"divide\\"],...fe};const he=[{result:e.HS.executeBasedOnType(fe,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let xe={};xe.start=T,xe.end=te,e.HS.updateListInputs(xe),xe={start:[[0,0,0]],end:[[0,1,0]],...xe};const ve=[{result:await e.HS.executeBasedOnTypeAsync(xe,!1,(e=>t.occt.shapes.wire.createLineWire(e))),transformers:[]}];let Oe={};Oe.y=ae,e.HS.updateListInputs(Oe),Oe={x:[0],y:[0],z:[.05],...Oe};const Ie=[{result:e.HS.executeBasedOnType(Oe,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let Le={};Le.y=ie,Le.z=G,e.HS.updateListInputs(Le),Le={x:[0],y:[0],z:[-1],...Le};const Be=[{result:e.HS.executeBasedOnType(Le,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let Te={};Te.y=ie,Te.z=q,e.HS.updateListInputs(Te),Te={x:[0],y:[0],z:[0],...Te};const we=[{result:e.HS.executeBasedOnType(Te,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let Ae={};Ae.z=ce,e.HS.updateListInputs(Ae),Ae={x:[0],y:[0],z:[0],...Ae};const Ee=[{result:e.HS.executeBasedOnType(Ae,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let ge={};ge.step=le,e.HS.updateListInputs(ge),ge={step:[.1],min:[0],max:[360],...ge};const be=e.HS.executeBasedOnType(ge,!1,(e=>t.vector.span(e))),We=[];for(let e=0;e<1;e++)We.push({type:\\"flat\\"});const ze=[{result:be,transformers:We}];let Pe={};Pe.first=ce,e.HS.updateListInputs(Pe),Pe={first:[2],second:[-2],operation:[\\"multiply\\"],...Pe};e.HS.executeBasedOnType(Pe,!1,(e=>t.math.twoNrOperation(e)));let Xe={};Xe.listElements=ye,e.HS.updateListInputs(Xe),Xe={...Xe};const Ye=[{result:[Xe.listElements?Xe.listElements:[]]}],Ze={shape:[void 0],axis:[[0,0,1]],angle:[0]};let Ne={};Ne.shape=He,Ne.axis=o,Ne.angle=he,e.HS.updateListInputs(Ne),Ne={...Ze,...Ne};const Ce=[{result:await e.HS.executeBasedOnTypeAsync(Ne,!1,(e=>t.occt.transforms.rotate(e))),transformers:[]}];let ke={};ke.first=he,e.HS.updateListInputs(ke),ke={first:[1],second:[.4],operation:[\\"multiply\\"],...ke};const De=[{result:e.HS.executeBasedOnType(ke,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let Fe={};Fe.first=he,e.HS.updateListInputs(Fe),Fe={first:[1],second:[.6],operation:[\\"multiply\\"],...Fe};const Me=[{result:e.HS.executeBasedOnType(Fe,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let Re={};Re.listElements=[Ie[0],F[0],Be[0],we[0]],e.HS.updateListInputs(Re),Re={...Re};const je=[{result:[Re.listElements?Re.listElements:[]]}];let qe={};qe.item=ze,e.HS.updateListInputs(qe),qe={...qe};const Ve=[{result:qe.item}],Ge={shape:[void 0],nrOfDivisions:[11],removeStartPoint:[!1],removeEndPoint:[!1]};let Je={};Je.shape=Ce,Je.nrOfDivisions=l,e.HS.updateListInputs(Je),Je={...Ge,...Je};const Ke=[{result:await e.HS.executeBasedOnTypeAsync(Je,!1,(e=>t.occt.shapes.wire.divideWireByEqualDistanceToPoints(e))),transformers:[]}],Qe={shape:[void 0],axis:[[0,0,1]],angle:[0]};let Ue={};Ue.shape=ve,Ue.axis=o,Ue.angle=[De[0],Me[0]],e.HS.updateListInputs(Ue),Ue={...Qe,...Ue};const $e=[{result:await e.HS.executeBasedOnTypeAsync(Ue,!1,(e=>t.occt.transforms.rotate(e))),transformers:[]}];let _e={};_e.number=De,e.HS.updateListInputs(_e),_e={number:[1],operation:[\\"negate\\"],..._e};const et=[{result:e.HS.executeBasedOnType(_e,!1,(e=>t.math.oneNrOperation(e))),transformers:[]}],tt={points:[void 0]};let st={};st.points=je,e.HS.updateListInputs(st),st={...tt,...st};const nt=[{result:await e.HS.executeBasedOnTypeAsync(st,!1,(e=>t.occt.shapes.wire.createPolylineWire(e))),transformers:[]}],rt={list:[void 0],pattern:[[!0,!0,!1]]};let at={};at.list=Ke,at.pattern=u,e.HS.updateListInputs(at),at={...rt,...at};const ot=[{result:e.HS.executeBasedOnType(at,!0,(e=>t.lists.getByPattern(e))),transformers:[]}];let it={};it.listElements=$e,e.HS.updateListInputs(it),it={...it};const pt=[{result:[it.listElements?it.listElements:[]]}],ct={shape:[void 0],origin:[[0,0,0]],direction:[[0,0,1]]};let ut={};ut.shape=nt,ut.origin=we,ut.direction=f,e.HS.updateListInputs(ut),ut={...ct,...ut};const lt=[{result:await e.HS.executeBasedOnTypeAsync(ut,!1,(e=>t.occt.transforms.mirror(e))),transformers:[]}],dt={shape:[void 0]};let mt={};mt.shape=nt,e.HS.updateListInputs(mt),mt={...dt,...mt};const yt=await e.HS.executeBasedOnTypeAsync(mt,!1,(e=>t.occt.shapes.edge.getCornerPointsOfEdgesForShape(e))),St=[];for(let e=0;e<1;e++)St.push({type:\\"flat\\"});const Ht=[{result:yt,transformers:St}],ft={list:[void 0],index:[0],clone:[!0]};let ht={};ht.list=pt,e.HS.updateListInputs(ht),ht={...ft,...ht};const xt=[{result:e.HS.executeBasedOnType(ht,!1,(e=>t.lists.getItem(e))),transformers:[]}],vt={shape:[void 0]};let Ot={};Ot.shape=lt,e.HS.updateListInputs(Ot),Ot={...vt,...Ot};const It=[{result:await e.HS.executeBasedOnTypeAsync(Ot,!1,(e=>t.occt.shapes.edge.getCornerPointsOfEdgesForShape(e))),transformers:[]}],Lt={shape:[void 0],nrOfDivisions:[11],removeStartPoint:[!1],removeEndPoint:[!1]};let Bt={};Bt.shape=xt,Bt.nrOfDivisions=l,e.HS.updateListInputs(Bt),Bt={...Lt,...Bt};const Tt=[{result:await e.HS.executeBasedOnTypeAsync(Bt,!1,(e=>t.occt.shapes.wire.divideWireByEqualDistanceToPoints(e))),transformers:[]}],wt={list:[void 0],index:[3],clone:[!0]};let At={};At.list=It,e.HS.updateListInputs(At),At={...wt,...At};const Et=[{result:e.HS.executeBasedOnType(At,!1,(e=>t.lists.removeItemAtIndex(e))),transformers:[]}],gt={list:[void 0],pattern:[[!0,!0,!1]]};let bt={};bt.list=Tt,bt.pattern=p,e.HS.updateListInputs(bt),bt={...gt,...bt};const Wt=[{result:e.HS.executeBasedOnType(bt,!1,(e=>t.lists.getByPattern(e))),transformers:[]}],zt={list:[void 0],clone:[!0]};let Pt={};Pt.list=Et,e.HS.updateListInputs(Pt),Pt={...zt,...Pt};const Xt=e.HS.executeBasedOnType(Pt,!1,(e=>t.lists.reverse(e))),Yt=[];for(let e=0;e<1;e++)Yt.push({type:\\"flat\\"});const Zt=[{result:Xt,transformers:Yt}];let Nt={};Nt.listElements=[Wt[0],ot[0]],e.HS.updateListInputs(Nt),Nt={...Nt};const Ct=[{result:[Nt.listElements?Nt.listElements:[]]}];let kt={};kt.listElements=[Ht[0],Zt[0]],e.HS.updateListInputs(kt),kt={...kt};const Dt=[{result:[kt.listElements?kt.listElements:[]]}],Ft={list:[void 0],clone:[!0]};let Mt={};Mt.list=Ct,e.HS.updateListInputs(Mt),Mt={...Ft,...Mt};const Rt=e.HS.executeBasedOnType(Mt,!1,(e=>t.lists.flipLists(e))),jt=[];for(let e=0;e<2;e++)jt.push({type:\\"flat\\"});const qt=[{result:Rt,transformers:jt}],Vt={points:[void 0]};let Gt={};Gt.points=Dt,e.HS.updateListInputs(Gt),Gt={...Vt,...Gt};const Jt=[{result:await e.HS.executeBasedOnTypeAsync(Gt,!1,(e=>t.occt.shapes.wire.createPolylineWire(e))),transformers:[]}];let Kt={};Kt.listElements=qt,e.HS.updateListInputs(Kt),Kt={...Kt};const Qt=[{result:[Kt.listElements?Kt.listElements:[]]}],Ut={shape:[void 0],radius:[.3],radiusList:[void 0],indexes:[void 0]};let $t={};$t.shape=Jt,e.HS.updateListInputs($t),$t={...Ut,...$t};const _t=[{result:await e.HS.executeBasedOnTypeAsync($t,!1,(e=>t.occt.fillets.fillet2d(e))),transformers:[]}],es={points:[void 0]};let ts={};ts.points=Qt,e.HS.updateListInputs(ts),ts={...es,...ts};const ss=[{result:await e.HS.executeBasedOnTypeAsync(ts,!1,(e=>t.occt.shapes.wire.createPolylineWire(e))),transformers:[]}],ns={shape:[void 0],angle:[360],direction:[[0,1,0]],copy:[!1]};let rs={};rs.shape=_t,rs.direction=x,e.HS.updateListInputs(rs),rs={...ns,...rs};const as=[{result:await e.HS.executeBasedOnTypeAsync(rs,!1,(e=>t.occt.operations.revolve(e))),transformers:[]}],os={shape:[void 0]};let is={};is.shape=_t,e.HS.updateListInputs(is),is={...os,...is};const ps=[{result:await e.HS.executeBasedOnTypeAsync(is,!1,(e=>t.occt.shapes.wire.startPointOnWire(e))),transformers:[]}],cs={shape:[void 0]};let us={};us.shape=_t,e.HS.updateListInputs(us),us={...cs,...us};const ls=[{result:await e.HS.executeBasedOnTypeAsync(us,!1,(e=>t.occt.shapes.wire.endPointOnWire(e))),transformers:[]}],ds={shape:[void 0]};let ms={};ms.shape=_t,e.HS.updateListInputs(ms),ms={...ds,...ms};const ys=[{result:await e.HS.executeBasedOnTypeAsync(ms,!1,(e=>t.occt.shapes.wire.closeOpenWire(e))),transformers:[]}],Ss={shape:[void 0],angle:[360],direction:[[0,1,0]],copy:[!1]};let Hs={};Hs.shape=ys,Hs.direction=x,e.HS.updateListInputs(Hs),Hs={...Ss,...Hs};const fs=[{result:await e.HS.executeBasedOnTypeAsync(Hs,!1,(e=>t.occt.operations.revolve(e))),transformers:[]}],hs={shape:[void 0],radius:[1],radiusList:[void 0],indexes:[void 0],direction:[[0,1,0]]};let xs={};xs.shape=ss,xs.direction=A,e.HS.updateListInputs(xs),xs={...hs,...xs};const vs=[{result:await e.HS.executeBasedOnTypeAsync(xs,!1,(e=>t.occt.fillets.fillet3DWire(e))),transformers:[]}],Os={shape:[void 0],face:[void 0],distance:[-.2],tolerance:[.1]};let Is={};Is.shape=as,e.HS.updateListInputs(Is),Is={...Os,...Is};const Ls=[{result:await e.HS.executeBasedOnTypeAsync(Is,!1,(e=>t.occt.operations.offset(e))),transformers:[]}],Bs={shape:[void 0],index:[0]};let Ts={};Ts.shape=as,e.HS.updateListInputs(Ts),Ts={...Bs,...Ts};const ws=[{result:await e.HS.executeBasedOnTypeAsync(Ts,!1,(e=>t.occt.shapes.wire.getWire(e))),transformers:[]}];let As={};As.item=ps,e.HS.updateListInputs(As),As={...As};const Es=[{result:As.item}];let gs={};gs.item=ls,e.HS.updateListInputs(gs),gs={...gs};const bs=[{result:gs.item}];let Ws={};Ws.start=ls,Ws.end=ps,e.HS.updateListInputs(Ws),Ws={start:[[0,0,0]],end:[[0,1,0]],...Ws};const zs=[{result:await e.HS.executeBasedOnTypeAsync(Ws,!1,(e=>t.occt.shapes.wire.createLineWire(e))),transformers:[]}],Ps={shape:[void 0],angle:[360],direction:[[0,1,0]],copy:[!1]};let Xs={};Xs.shape=vs,Xs.angle=et,Xs.direction=o,e.HS.updateListInputs(Xs),Xs={...Ps,...Xs};const Ys=[{result:await e.HS.executeBasedOnTypeAsync(Xs,!1,(e=>t.occt.operations.revolve(e))),transformers:[]}],Zs={shape:[void 0]};let Ns={};Ns.shape=fs,e.HS.updateListInputs(Ns),Ns={...Zs,...Ns};const Cs=[{result:await e.HS.executeBasedOnTypeAsync(Ns,!1,(e=>t.occt.shapes.solid.fromClosedShell(e))),transformers:[]}],ks={shape:[void 0],index:[1]};let Ds={};Ds.shape=ws,e.HS.updateListInputs(Ds),Ds={...ks,...Ds};const Fs=[{result:await e.HS.executeBasedOnTypeAsync(Ds,!1,(e=>t.occt.shapes.edge.getEdge(e))),transformers:[]}],Ms={shape:[void 0],index:[0]};let Rs={};Rs.shape=Ls,e.HS.updateListInputs(Rs),Rs={...Ms,...Rs};const js=[{result:await e.HS.executeBasedOnTypeAsync(Rs,!1,(e=>t.occt.shapes.wire.getWire(e))),transformers:[]}],qs={shape:[void 0],translation:[[0,0,0]]};let Vs={};Vs.shape=zs,Vs.translation=g,e.HS.updateListInputs(Vs),Vs={...qs,...Vs};const Gs=[{result:await e.HS.executeBasedOnTypeAsync(Vs,!1,(e=>t.occt.transforms.translate(e))),transformers:[]}],Js={shape:[void 0],direction:[[0,1,0]]};let Ks={};Ks.shape=Ys,Ks.direction=Ee,e.HS.updateListInputs(Ks),Ks={...Js,...Ks};const Qs=[{result:await e.HS.executeBasedOnTypeAsync(Ks,!1,(e=>t.occt.operations.extrude(e))),transformers:[]}];let Us={};Us.listElements=Cs,e.HS.updateListInputs(Us),Us={...Us};const $s=[{result:[Us.listElements?Us.listElements:[]]}],_s={shape:[void 0],index:[1]};let en={};en.shape=js,e.HS.updateListInputs(en),en={..._s,...en};const tn=[{result:await e.HS.executeBasedOnTypeAsync(en,!1,(e=>t.occt.shapes.edge.getEdge(e))),transformers:[]}];let sn={};sn.listElements=Fs,e.HS.updateListInputs(sn),sn={...sn};const nn=[{result:[sn.listElements?sn.listElements:[]]}],rn={shape:[void 0]};let an={};an.shape=Gs,e.HS.updateListInputs(an),an={...rn,...an};const on=[{result:await e.HS.executeBasedOnTypeAsync(an,!1,(e=>t.occt.shapes.wire.startPointOnWire(e))),transformers:[]}],pn={shape:[void 0]};let cn={};cn.shape=Gs,e.HS.updateListInputs(cn),cn={...pn,...cn};const un=[{result:await e.HS.executeBasedOnTypeAsync(cn,!1,(e=>t.occt.shapes.wire.endPointOnWire(e))),transformers:[]}],ln={shapes:[void 0]};let dn={};dn.shapes=nn,e.HS.updateListInputs(dn),dn={...ln,...dn};const mn=[{result:await e.HS.executeBasedOnTypeAsync(dn,!1,(e=>t.occt.shapes.wire.combineEdgesAndWiresIntoAWire(e))),transformers:[]}];let yn={};yn.listElements=tn,e.HS.updateListInputs(yn),yn={...yn};const Sn=[{result:[yn.listElements?yn.listElements:[]]}],Hn={shape:[void 0],shapes:[void 0],keepEdges:[!1]};let fn={};fn.shape=Qs,fn.shapes=Ye,e.HS.updateListInputs(fn),fn={...Hn,...fn};const hn=[{result:await e.HS.executeBasedOnTypeAsync(fn,!1,(e=>t.occt.booleans.difference(e))),transformers:[]}];let xn={};xn.item=un,e.HS.updateListInputs(xn),xn={...xn};const vn=[{result:xn.item}];let On={};On.item=on,e.HS.updateListInputs(On),On={...On};const In=[{result:On.item}],Ln={shape:[void 0],shapes:[void 0],keepEdges:[!1]};let Bn={};Bn.shape=hn,Bn.shapes=$s,e.HS.updateListInputs(Bn),Bn={...Ln,...Bn};const Tn=[{result:await e.HS.executeBasedOnTypeAsync(Bn,!1,(e=>t.occt.booleans.difference(e))),transformers:[]}],wn={shapes:[void 0]};let An={};An.shapes=Sn,e.HS.updateListInputs(An),An={...wn,...An};const En=[{result:await e.HS.executeBasedOnTypeAsync(An,!1,(e=>t.occt.shapes.wire.combineEdgesAndWiresIntoAWire(e))),transformers:[]}];let gn={};gn.listElements=[Es[0],vn[0],In[0],bs[0]],e.HS.updateListInputs(gn),gn={...gn};const bn=[{result:[gn.listElements?gn.listElements:[]]}],Wn={shape:[void 0],origin:[[0,0,0]],normal:[[0,0,1]]};let zn={};zn.shape=Tn,zn.normal=m,e.HS.updateListInputs(zn),zn={...Wn,...zn};const Pn=[{result:await e.HS.executeBasedOnTypeAsync(zn,!1,(e=>t.occt.transforms.mirrorAlongNormal(e))),transformers:[]}];let Xn={};Xn.listElements=[mn[0],En[0]],e.HS.updateListInputs(Xn),Xn={...Xn};const Yn=[{result:[Xn.listElements?Xn.listElements:[]]}],Zn={points:[void 0]};let Nn={};Nn.points=bn,e.HS.updateListInputs(Nn),Nn={...Zn,...Nn};const Cn=[{result:await e.HS.executeBasedOnTypeAsync(Nn,!1,(e=>t.occt.shapes.wire.createPolylineWire(e))),transformers:[]}];let kn={};kn.listElements=[Pn[0],Tn[0]],e.HS.updateListInputs(kn),kn={...kn};const Dn=[{result:[kn.listElements?kn.listElements:[]]}],Fn={shapes:[void 0],makeSolid:[!1]};let Mn={};Mn.shapes=Yn,e.HS.updateListInputs(Mn),Mn={...Fn,...Mn};const Rn=[{result:await e.HS.executeBasedOnTypeAsync(Mn,!1,(e=>t.occt.operations.loft(e))),transformers:[]}],jn={shape:[void 0],radius:[.5],radiusList:[void 0],indexes:[void 0]};let qn={};qn.shape=Cn,e.HS.updateListInputs(qn),qn={...jn,...qn};const Vn=[{result:await e.HS.executeBasedOnTypeAsync(qn,!1,(e=>t.occt.fillets.fillet2d(e))),transformers:[]}],Gn={shapes:[void 0]};let Jn={};Jn.shapes=Dn,e.HS.updateListInputs(Jn),Jn={...Gn,...Jn};const Kn=[{result:await e.HS.executeBasedOnTypeAsync(Jn,!1,(e=>t.occt.shapes.compound.makeCompound(e))),transformers:[]}],Qn={shape:[void 0],origin:[[0,0,0]],direction:[[0,0,1]]};let Un={};Un.shape=Rn,Un.origin=we,Un.direction=f,e.HS.updateListInputs(Un),Un={...Qn,...Un};const $n=[{result:await e.HS.executeBasedOnTypeAsync(Un,!1,(e=>t.occt.transforms.mirror(e))),transformers:[]}],_n={shape:[void 0],angle:[360],direction:[[0,1,0]],copy:[!1]};let er={};er.shape=Vn,er.direction=x,e.HS.updateListInputs(er),er={..._n,...er};const tr=[{result:await e.HS.executeBasedOnTypeAsync(er,!1,(e=>t.occt.operations.revolve(e))),transformers:[]}];let sr={};sr.listElements=[as[0],Ls[0],Rn[0],$n[0]],e.HS.updateListInputs(sr),sr={...sr};const nr=[{result:[sr.listElements?sr.listElements:[]]}],rr={shape:[void 0],offset:[-.1]};let ar={};ar.shape=tr,e.HS.updateListInputs(ar),ar={...rr,...ar};const or=[{result:await e.HS.executeBasedOnTypeAsync(ar,!1,(e=>t.occt.operations.makeThickSolidSimple(e))),transformers:[]}],ir={shape:[void 0],angle:[0],center:[[0,0,0]],axis:[[0,0,1]]};let pr={};pr.shape=Kn,pr.angle=Ve,pr.axis=N,e.HS.updateListInputs(pr),pr={...ir,...pr};const cr=[{result:await e.HS.executeBasedOnTypeAsync(pr,!1,(e=>t.occt.transforms.rotateAroundCenter(e))),transformers:[]}],ur={shapes:[void 0],tolerance:[1e-7]};let lr={};lr.shapes=nr,e.HS.updateListInputs(lr),lr={...ur,...lr};const dr=[{result:await e.HS.executeBasedOnTypeAsync(lr,!1,(e=>t.occt.shapes.shell.sewFaces(e))),transformers:[]}],mr={entity:[void 0],options:[void 0],babylonMesh:[void 0]};let yr={};yr.entity=or,yr.options=W,e.HS.updateListInputs(yr),yr={...mr,...yr};await e.HS.executeBasedOnTypeAsync(yr,!1,(e=>t.draw.drawAnyAsync(e)));let Sr={};Sr.listElements=cr,e.HS.updateListInputs(Sr),Sr={...Sr};const Hr=[{result:[Sr.listElements?Sr.listElements:[]]}],fr={shapes:[void 0]};let hr={};hr.shapes=Hr,e.HS.updateListInputs(hr),hr={...fr,...hr};const xr=[{result:await e.HS.executeBasedOnTypeAsync(hr,!1,(e=>t.occt.shapes.compound.makeCompound(e))),transformers:[]}];let vr={};vr.listElements=[dr[0],ye[0],xr[0]],e.HS.updateListInputs(vr),vr={...vr};const Or=[{result:[vr.listElements?vr.listElements:[]]}],Ir={shapes:[void 0]};let Lr={};Lr.shapes=Or,e.HS.updateListInputs(Lr),Lr={...Ir,...Lr};const Br=[{result:await e.HS.executeBasedOnTypeAsync(Lr,!1,(e=>t.occt.shapes.compound.makeCompound(e))),transformers:[]}],Tr={entity:[void 0],options:[void 0],babylonMesh:[void 0]};let wr={};wr.entity=Br,e.HS.updateListInputs(wr),wr={...Tr,...wr};await e.HS.executeBasedOnTypeAsync(wr,!1,(e=>t.draw.drawAnyAsync(e)))}(BitByBit,bitbybit,bitbybitRunnerResult,bitbybitRunnerInputs,Bit);\"}' };