From 0c57dd1600f748afb9151696caa7d3e229d3ceb9 Mon Sep 17 00:00:00 2001 From: Matas Ubarevicius Date: Wed, 4 Jun 2025 12:13:59 +0300 Subject: [PATCH 01/18] added documentation for how to code in monaco editor. It's important to have this explained in more detail with examples. --- .../typescript/hello-world.mdx | 2 +- .../typescript/how-to-code-in-monaco.md | 215 ++++++++++++++++++ .../typescript/parametric-cube.mdx | 2 +- 3 files changed, 217 insertions(+), 2 deletions(-) create mode 100644 docs/learn/getting-started/typescript/how-to-code-in-monaco.md diff --git a/docs/learn/getting-started/typescript/hello-world.mdx b/docs/learn/getting-started/typescript/hello-world.mdx index c492821e..1b7ac19b 100644 --- a/docs/learn/getting-started/typescript/hello-world.mdx +++ b/docs/learn/getting-started/typescript/hello-world.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 2 +sidebar_position: 3 title: Your First 3D "Hello World" with TypeScript sidebar_label: Hello World (TypeScript) description: Learn how to create your first 3D "Hello World" program using the Bitbybit Monaco programming editor. diff --git a/docs/learn/getting-started/typescript/how-to-code-in-monaco.md b/docs/learn/getting-started/typescript/how-to-code-in-monaco.md new file mode 100644 index 00000000..557cb230 --- /dev/null +++ b/docs/learn/getting-started/typescript/how-to-code-in-monaco.md @@ -0,0 +1,215 @@ +--- +sidebar_position: 2 +title: How To Code In Monaco? +sidebar_label: How To Code In Monaco? +description: Learn about our use of Monaco editor for TypeScript, understand the global context and how you should code in it. +tags: [getting-started, typescript] +--- + +import BitByBitRenderCanvas from '@site/src/components/BitByBitRenderCanvas'; + +## [The Monaco Editor: Your Interactive Coding Canvas](https://bitbybit.dev/app?editor=typescript) + +The Monaco Editor, developed by Microsoft, is the powerful open-source code editor that powers VS Code. In the context of `bitbybit`, it provides a rich, browser-based environment for you to write TypeScript code and interact directly with the `bitbybit` API. This allows for rapid prototyping, learning, and development of 3D models and geometric algorithms. + +**Key Features Leveraged by `bitbybit`:** + +* **IntelliSense and Autocompletion:** As you type, Monaco offers smart suggestions for `bitbybit` functions, modules, and the `Bit` type definitions. This significantly speeds up development and reduces the likelihood of typos or incorrect API usage. +* **Error Checking:** Real-time syntax highlighting and type checking (thanks to TypeScript integration) help you catch mistakes early in the development process, directly in the editor. +* **Familiar Interface:** If you've used VS Code or other modern code editors, Monaco's interface will feel intuitive and user-friendly. +* **Direct Execution:** Code written in the Monaco editor within the `bitbybit` platform can be executed immediately, allowing you to see the results of your geometric operations or visualizations, fostering an interactive and iterative workflow. + +Within this Monaco environment, `bitbybit` exposes two crucial global elements that are fundamental to its usage: the `bitbybit` constant and the `Bit` type namespace. Understanding these is key to effectively using the platform. + +## The `bitbybit` Global Constant: Your Gateway to CAD/CAM Algorithms + +The `bitbybit` global constant is the heart of the platform. It's a comprehensive JavaScript object that provides access to **all** `bitbybit` functionalities, which are neatly organized into modules and submodules. Think of it as your extensive toolkit for computational design, 3D modeling, and Computer-Aided Manufacturing (CAM) preparations. + +**Structure and Usage:** + +All functionalities within `bitbybit` are exposed as functions. Each function is designed to perform a specific operation—such as creating a 3D shape, performing a boolean operation between shapes, applying a fillet, or exporting a model. Crucially, each function typically expects a single JavaScript object as its argument. This object, often referred to as an `input` or a `DTO` (Data Transfer Object), contains all the parameters and data required for the function to perform its task. + +The `bitbybit` constant is structured hierarchically, making it easy to navigate and find the functions you need. For example: + +* `bitbybit.occt.*`: This namespace groups functions related to OpenCASCADE Technology (OCCT), a powerful open-source CAD kernel. + * `bitbybit.occt.shapes.solid.*`: Functions for creating solid 3D shapes like cubes, spheres, cylinders, etc. + * `bitbybit.occt.booleans.*`: Functions for performing boolean operations (union, difference, intersection) on shapes. + * `bitbybit.occt.fillets.*`: Functions for creating fillets (rounded edges) and chamfers on shapes. + * `bitbybit.occt.io.*`: Functions for importing and exporting CAD file formats like STEP and STL. +* `bitbybit.babylon.*`: This namespace groups functions related to BabylonJS, a real-time 3D engine used by `bitbybit` for visualization. + * `bitbybit.babylon.scene.*`: Functions for managing elements of the 3D scene, such as lights, cameras, and background settings. +* `bitbybit.draw.*`: This namespace contains versatile functions for drawing various entities (OCCT shapes, lines, points, etc.) as BabylonJS meshes in the 3D viewer. + +**Example: Accessing `bitbybit` functionalities** + +You can call functions directly: +`bitbybit.occt.shapes.solid.createCube(cubeInputDto);` + +For cleaner and more concise code, especially when using multiple functions from the same module, you can use destructuring assignment: + +```typescript title="destructuring" +// Destructure specific modules or functions for easier access +const { solid } = bitbybit.occt.shapes; // Now you can use: solid.createCube() +const { booleans, fillets, io } = bitbybit.occt; // Access: booleans.difference(), fillets.filletEdges(), io.saveShapeSTEP() +const { draw } = bitbybit; // Access: draw.drawAnyAsync() +const { scene } = bitbybit.babylon; // Access: scene.drawDirectionalLight() +``` + +## The `Bit` Global Type Namespace: Ensuring Type Safety and Clarity + +Alongside the `bitbybit` constant, the Monaco environment provides a global `Bit` namespace. This namespace is indispensable for TypeScript users because it contains all the type definitions for the input objects (`DTOs`) that `bitbybit` functions expect, as well as for the shapes and other entities manipulated by the API. + +**Purpose of `Bit`:** + +* **Type Safety:** By using types from the `Bit.Inputs` namespace (e.g., `Bit.Inputs.OCCT.CubeDto`), you instruct the TypeScript compiler (and thus Monaco's IntelliSense) on the expected structure and data types of your input objects. This helps prevent runtime errors by catching type mismatches during development. +* **Enhanced Autocompletion:** The Monaco editor leverages these type definitions to provide highly accurate autocompletion for the properties of your input objects. As you type `yourInputObject.`, Monaco will suggest available properties (e.g., `size`, `radius`, `center`), making it easier to discover and use the correct parameters. +* **Code Clarity and Maintainability:** Explicitly typing your inputs and variables makes your code more readable, understandable, and easier to maintain or refactor in the future. + +**Structure and Usage:** + +The most frequently used part of the `Bit` namespace is `Bit.Inputs`. This sub-namespace generally mirrors the structure of the `bitbybit` constant, providing type definitions (often as classes that you can instantiate) for each function's input `DTO`. + +* `Bit.Inputs.OCCT.Dto`: Types for OCCT shape creation and operation inputs (e.g., `Bit.Inputs.OCCT.CubeDto`, `Bit.Inputs.OCCT.SphereDto`, `Bit.Inputs.OCCT.DifferenceDto`). +* `Bit.Inputs.OCCT.TopoDSShapePointer`: A common type alias representing an OCCT shape. Many OCCT functions will return or expect shapes of this type. +* `Bit.Inputs.Draw.`: Types for configuring drawing options (e.g., `Bit.Inputs.Draw.DrawOcctShapeOptions`). +* `Bit.Inputs.BabylonScene.Dto`: Types for BabylonJS scene elements (e.g., `Bit.Inputs.BabylonScene.DirectionalLightDto`). + +### Example: Using `Bit` types + +```typescript +// Optionally, define type aliases for frequently used complex types like OCCT shapes +type TopoDSShapePointer = Bit.Inputs.OCCT.TopoDSShapePointer; + +// Import DTO classes for creating input objects. +// These are typically classes that you instantiate using 'new'. +const { CubeDto, SphereDto, FilletDto, DifferenceDto, SaveStepDto, SaveStlDto } = Bit.Inputs.OCCT; + +// Some specific DTOs or options classes might be directly accessible from their module path within Bit.Inputs +const DrawOcctShapeOptions = Bit.Inputs.Draw.DrawOcctShapeOptions; // Assuming DrawOcctShapeOptions is a class +const DirectionalLightDto = Bit.Inputs.BabylonScene.DirectionalLightDto; // Assuming DirectionalLightDto is a class + +// How to use them: +const myCubeOptions = new CubeDto(); +myCubeOptions.size = 10; +// myCubeOptions. // IntelliSense will now suggest 'size', 'center', etc. + +const drawingSettings = new DrawOcctShapeOptions(); +drawingSettings.faceColour = "#FF0000"; // Red +// drawingSettings. // IntelliSense will suggest 'faceColour', 'edgeColour', 'edgeWidth', etc. +``` + +## BabylonJS Context + +Inside the Monaco editor for TypeScript that you can use on our website, we already have an initialized BabylonJS context with the scene, engine, arc rotate camera and single hemispheric light. This context is optimized for scripting and does not require you to set all of those initialization functions. You can start coding right away. + +If you need to access this context, `bitbybit.babylon` will be your friend - you can use `bitbybit.babylon.scene.getScene()` to access the BabylonJS Scene object for example. + +## Coding with `bitbybit`: A Practical Example + +In the `bitbybit` Monaco editor, your script will typically be wrapped in an `async` function, often named `start`. This is because many `bitbybit` operations (especially complex geometric calculations, file I/O, or operations that might take some time) are asynchronous. Using the `async`/`await` syntax allows you to write asynchronous code that looks and behaves a bit more like synchronous code, making it easier to read and manage. + +Let's walk through a comprehensive example demonstrating common `bitbybit` operations: + +```typescript +// Step 1: (Optional but Recommended) Destructure for convenience +// This makes your code less verbose and easier to read. +const { solid } = bitbybit.occt.shapes; +const { booleans, fillets, io } = bitbybit.occt; // Added 'io' for export functions +const { draw } = bitbybit; +const { scene } = bitbybit.babylon; + +// Step 2: Import type definitions for input objects and shapes +// This enables type checking and autocompletion. +type TopoDSShapePointer = Bit.Inputs.OCCT.TopoDSShapePointer; // Represents an OCCT shape + +const { CubeDto, SphereDto, FilletDto, DifferenceDto, SaveStepDto, SaveStlDto } = Bit.Inputs.OCCT; +const DrawOcctShapeOptions = Bit.Inputs.Draw.DrawOcctShapeOptions; +const DirectionalLightDto = Bit.Inputs.BabylonScene.DirectionalLightDto; + +// Step 3: Define your main logic within an async function +const start = async () => { + // Step 3a: Create input objects (DTOs) and set their properties for a cube + const cubeOptions = new CubeDto(); // Instantiate the DTO + cubeOptions.size = 6; // Set the cube's size + // Call the bitbybit function to create the cube, awaiting its promise + const cube: TopoDSShapePointer = await solid.createCube(cubeOptions); + + // Step 3b: Create input objects (DTOs) for a sphere + const sphereOptions = new SphereDto(); + sphereOptions.radius = 3; + sphereOptions.center = [3, 3, -3]; // Define center as [x, y, z] coordinates + const sphere: TopoDSShapePointer = await solid.createSphere(sphereOptions); + + // Step 4: Perform geometric operations + // Example: Boolean difference (subtract sphere from cube) + const diffOptions = new DifferenceDto(); // Generic type for the shapes involved + diffOptions.shape = cube; // The base shape + diffOptions.shapes = [sphere]; // An array of shapes to subtract + const diff: TopoDSShapePointer = await booleans.difference(diffOptions); + + // Example: Apply fillets (round edges) to the result of the difference + const roundingOptions = new FilletDto(); + roundingOptions.shape = diff; // The shape to fillet + roundingOptions.radius = 1; // The radius of the fillet + // Note: Some operations might have specific methods like 'filletEdges' for common tasks + const solidRoundedCorners: TopoDSShapePointer = await fillets.filletEdges(roundingOptions); + + // Step 5: Visualize the result in the 3D viewer + // Prepare drawing options to customize appearance + const occtDrawOptions = new DrawOcctShapeOptions(); + occtDrawOptions.faceColour = "#0000ff"; // Blue faces + occtDrawOptions.edgeColour = "#ff00ff"; // Magenta edges + occtDrawOptions.edgeWidth = 5; // Width of the edges + occtDrawOptions.precision = 0.001; // Rendering precision for complex shapes (lower is finer) + // Draw the final shape. 'drawAnyAsync' is a versatile function for drawing various entity types. + draw.drawAnyAsync({ entity: solidRoundedCorners, options: occtDrawOptions }); + + // Step 6: (Optional) Adjust scene elements like lighting for better visualization + const dirLight = new DirectionalLightDto(); + dirLight.shadowGeneratorMapSize = 2000; // Higher values for better shadow quality + dirLight.intensity = 3; // Light intensity + scene.drawDirectionalLight(dirLight); // Adds or updates a directional light in the scene + + // Step 7: (Optional) Export your model to common CAD file formats + // Export as STEP file (a common format for solid models) + const stepExportOptions = new SaveStepDto(); + stepExportOptions.shape = solidRoundedCorners; + stepExportOptions.adjustYtoZ = true; // Optional: Adjusts coordinate system (Y-up to Z-up) if needed + stepExportOptions.fileName = "cube_with_sphere_cutout.step"; + stepExportOptions.tryDownload = true; // Attempts to trigger a browser download of the file + await io.saveShapeSTEP(stepExportOptions); // Use the destructured 'io' + + // Export as STL file (a common format for 3D printing) + const stlExportOptions = new SaveStlDto(); + stlExportOptions.shape = solidRoundedCorners; + stlExportOptions.adjustYtoZ = true; + stlExportOptions.fileName = "cube_with_sphere_cutout.stl"; + stlExportOptions.precision = 0.001; // Affects STL mesh quality (smaller values for finer mesh) + stlExportOptions.tryDownload = true; + await io.saveShapeStl(stlExportOptions); // Use the destructured 'io' +}; + +// Step 8: Call the start function to execute your script +start(); +``` + +## Experience Live Example in Monaco Editor Here + + {\n // Step 3a: Create input objects (DTOs) and set their properties for a cube\n const cubeOptions = new CubeDto(); // Instantiate the DTO\n cubeOptions.size = 6; // Set the cube's size\n // Call the bitbybit function to create the cube, awaiting its promise\n const cube: TopoDSShapePointer = await solid.createCube(cubeOptions);\n\n // Step 3b: Create input objects (DTOs) for a sphere\n const sphereOptions = new SphereDto();\n sphereOptions.radius = 3;\n sphereOptions.center = [3, 3, -3]; // Define center as [x, y, z] coordinates\n const sphere: TopoDSShapePointer = await solid.createSphere(sphereOptions);\n\n // Step 4: Perform geometric operations\n // Example: Boolean difference (subtract sphere from cube)\n const diffOptions = new DifferenceDto(); // Generic type for the shapes involved\n diffOptions.shape = cube; // The base shape\n diffOptions.shapes = [sphere]; // An array of shapes to subtract\n const diff: TopoDSShapePointer = await booleans.difference(diffOptions);\n\n // Example: Apply fillets (round edges) to the result of the difference\n const roundingOptions = new FilletDto();\n roundingOptions.shape = diff; // The shape to fillet\n roundingOptions.radius = 1; // The radius of the fillet\n // Note: Some operations might have specific methods like 'filletEdges' for common tasks\n const solidRoundedCorners: TopoDSShapePointer = await fillets.filletEdges(roundingOptions);\n\n // Step 5: Visualize the result in the 3D viewer\n // Prepare drawing options to customize appearance\n const occtDrawOptions = new DrawOcctShapeOptions();\n occtDrawOptions.faceColour = \"#0000ff\"; // Blue faces\n occtDrawOptions.edgeColour = \"#ff00ff\"; // Magenta edges\n occtDrawOptions.edgeWidth = 5; // Width of the edges\n occtDrawOptions.precision = 0.001; // Rendering precision for complex shapes (lower is finer)\n // Draw the final shape. 'drawAnyAsync' is a versatile function for drawing various entity types.\n draw.drawAnyAsync({ entity: solidRoundedCorners, options: occtDrawOptions });\n\n // Step 6: (Optional) Adjust scene elements like lighting for better visualization\n const dirLight = new DirectionalLightDto();\n dirLight.shadowGeneratorMapSize = 2000; // Higher values for better shadow quality\n dirLight.intensity = 3; // Light intensity\n scene.drawDirectionalLight(dirLight); // Adds or updates a directional light in the scene\n\n // Step 7: (Optional) Export your model to common CAD file formats\n // Export as STEP file (a common format for solid models)\n const stepExportOptions = new SaveStepDto();\n stepExportOptions.shape = solidRoundedCorners;\n stepExportOptions.adjustYtoZ = true; // Optional: Adjusts coordinate system (Y-up to Z-up) if needed\n stepExportOptions.fileName = \"cube_with_sphere_cutout.step\";\n stepExportOptions.tryDownload = true; // Attempts to trigger a browser download of the file\n await io.saveShapeSTEP(stepExportOptions); // Use the destructured 'io'\n\n // Export as STL file (a common format for 3D printing)\n const stlExportOptions = new SaveStlDto();\n stlExportOptions.shape = solidRoundedCorners;\n stlExportOptions.adjustYtoZ = true;\n stlExportOptions.fileName = \"cube_with_sphere_cutout.stl\";\n stlExportOptions.precision = 0.001; // Affects STL mesh quality (smaller values for finer mesh)\n stlExportOptions.tryDownload = true;\n await io.saveShapeStl(stlExportOptions); // Use the destructured 'io'\n};\n\n// Step 8: Call the start function to execute your script\nstart();","version":"0.20.4","type":"typescript"}} + title="Create And Download STEP & STL 3D Models" + description="Contains example code that can be executed directly inside the editor by clicking Run button." +/> + +## Key Points from the Example: + +* **Asynchronous Operations:** Notice the widespread use of `await`. Most `bitbybit` functions that perform significant computations or I/O return `Promises`. `await` pauses the execution of the `start` function until the `Promise` resolves, making asynchronous operations easier to manage. +* **DTOs for Inputs:** Each `bitbybit` function takes a single `DTO` object as its argument. You first create an instance of the appropriate `DTO` class (e.g., `new CubeDto()`) and then set its properties to configure the operation. +* **Type Annotations:** Using TypeScript types like `TopoDSShapePointer` for variables holding shapes, and relying on type inference for `DTOs` (e.g., `const cubeOptions = new CubeDto();`), enhances code robustness and leverages Monaco's IntelliSense. +* **Modularity and Clarity:** The `bitbybit` API is organized into logical modules (e.g., `solid` for shape creation, `booleans` for set operations, `fillets` for edge modifications, `draw` for visualization, `io` for export). Destructuring these modules makes the code cleaner. +* **Chaining Operations:** The output of one operation (e.g., `diff` from `booleans.difference`) can be used as input for subsequent operations (e.g., `fillets.filletEdges(roundingOptions)` where `roundingOptions.shape` is `diff`). + +## Conclusion + +The Monaco editor, when combined with the globally available `bitbybit` constant and the `Bit` type definitions, creates a potent and highly accessible environment for scripting 3D models and automating CAD/CAM workflows directly within your browser. By grasping these core components—Monaco as the interactive editor, `bitbybit` as the functional toolkit, and `Bit` as the type-safe guide—you are well-equipped to explore and harness the full capabilities of the `bitbybit` platform. Happy coding! \ No newline at end of file diff --git a/docs/learn/getting-started/typescript/parametric-cube.mdx b/docs/learn/getting-started/typescript/parametric-cube.mdx index 188c82f8..0513ad27 100644 --- a/docs/learn/getting-started/typescript/parametric-cube.mdx +++ b/docs/learn/getting-started/typescript/parametric-cube.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 3 +sidebar_position: 4 title: Creating a Parametric Cube in TypeScript sidebar_label: Parametric Cube Tutorial description: Learn to create a parametric 3D cube using OpenCascade (OCCT) and TypeScript in the Bitbybit environment. From ff5f9695d8f62d4f541da93d203ecc2ba2564d11 Mon Sep 17 00:00:00 2001 From: Matas Ubarevicius Date: Thu, 5 Jun 2025 13:22:24 +0300 Subject: [PATCH 02/18] update to docs, including ai category with explanation how to set up Bitbybit with context7. Also added additional OCCT Loft documentation. --- .../common/occt/operations/_category_.json | 10 ++ .../common/occt/operations/simple-loft.md | 63 ++++++++++ .../rete/typescript-editor-component.md | 5 +- docs/learn/tags.yml | 5 + .../using-ai-with-bitbybit/_category_.json | 10 ++ docs/learn/using-ai-with-bitbybit/intro.md | 29 +++++ .../mcp/_category_.json | 10 ++ .../using-ai-with-bitbybit/mcp/context-7.md | 108 ++++++++++++++++++ 8 files changed, 236 insertions(+), 4 deletions(-) create mode 100644 docs/learn/code/common/occt/operations/_category_.json create mode 100644 docs/learn/code/common/occt/operations/simple-loft.md create mode 100644 docs/learn/using-ai-with-bitbybit/_category_.json create mode 100644 docs/learn/using-ai-with-bitbybit/intro.md create mode 100644 docs/learn/using-ai-with-bitbybit/mcp/_category_.json create mode 100644 docs/learn/using-ai-with-bitbybit/mcp/context-7.md diff --git a/docs/learn/code/common/occt/operations/_category_.json b/docs/learn/code/common/occt/operations/_category_.json new file mode 100644 index 00000000..f19a0e58 --- /dev/null +++ b/docs/learn/code/common/occt/operations/_category_.json @@ -0,0 +1,10 @@ +{ + "label": "Occt", + "position": 1, + "link": { + "type": "generated-index", + "title": "OCCT Operations", + "description": "There are quite a few operations that can be performed on OCCT shapes. This section will cover the most common ones, such as extrusions, lofts, and more.", + "slug": "/code/common/occt/operations" + } +} \ No newline at end of file diff --git a/docs/learn/code/common/occt/operations/simple-loft.md b/docs/learn/code/common/occt/operations/simple-loft.md new file mode 100644 index 00000000..388f4b3f --- /dev/null +++ b/docs/learn/code/common/occt/operations/simple-loft.md @@ -0,0 +1,63 @@ +--- +sidebar_position: 2 +title: Creating a Simple Loft +sidebar_label: Simple Loft Tutorial +description: Learn how to create a surface by lofting between several wire shapes. +tags: [code, occt, rete, blockly, typescript] +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import BitByBitRenderCanvas from '@site/src/components/BitByBitRenderCanvas'; + +# Creating a Simple Loft + +OCCT category icon with a stylized logo representation + + +A loft operation is a fundamental technique in 3D modeling that allows you to create complex surfaces by defining a series of 2D profiles (cross-sections) in space. The software then generates a smooth transitional surface that connects these profiles. This is incredibly useful for modeling organic shapes, aerodynamic bodies, or any object with a varying cross-section. + +In this tutorial, we'll walk through the process of creating a simple lofted shape. We will define three distinct elliptical wires at different positions and then use the loft operation to generate a surface that smoothly interpolates between them. We'll demonstrate how to achieve this using Rete, Blockly, and TypeScript, providing a clear understanding of the underlying logic and its implementation in different environments. + + The power of lofting comes from its versatility. You can: + +* **Use different shapes**: Combine circles, rectangles, polygons, or even more complex custom curves. +* **Vary the number of profiles**: More profiles can lead to more detailed and controlled surfaces. +* **Adjust profile orientation and scale**: Tilting or resizing profiles can dramatically alter the resulting shape. +* **Create solids**: By setting the `makeSolid` option to `true` (where applicable), you can create volumetric bodies instead of just surfaces. +* **Nr of wire edges**: For loft to work correctly in most situations you must ensure that you loft wires that contain the same amount of edges to form topologically coherent faces. +* **Order of wires matter**: If you reverse the order of wires in the list your loft faces will point to different direction. +* **Wire direction matters**: If you reverse directions of wires and their edges, your loft faces will point to different direction. + + + + + + + ellipse1ellipse2ellipse3ellipsesloftellipse100001048ellipse203001014ellipse307001026ellipsesellipse1ellipse2ellipse3loftellipsesFALSEloft0.001TRUE#6600ccTRUE#ffffff2","version":"0.20.4","type":"blockly"}} + title="Simple Loft Operation" + /> + + + {\n\n // Create an instance of EllipseDto to define the properties of the first ellipse.\n const ellipseOpt = new EllipseDto();\n // Set the minor radius of the ellipse.\n ellipseOpt.radiusMinor = 4;\n // Set the major radius of the ellipse.\n ellipseOpt.radiusMajor = 8;\n // Create the first elliptical wire. The center defaults to [0,0,0] and direction to [0,1,0] if not specified.\n // 'await' is used because shape creation is an asynchronous operation.\n const ellipse1 = await shapes.wire.createEllipseWire(ellipseOpt);\n\n // Modify the ellipseOpt for the second ellipse.\n // Set the center of the second ellipse.\n ellipseOpt.center = [0, 3, 0];\n // Set the minor radius for the second ellipse.\n ellipseOpt.radiusMinor = 1;\n // Set the major radius for the second ellipse.\n ellipseOpt.radiusMajor = 4;\n // Create the second elliptical wire with the updated options.\n const ellipse2 = await shapes.wire.createEllipseWire(ellipseOpt);\n\n // Modify the ellipseOpt for the third ellipse.\n // Set the center of the third ellipse.\n ellipseOpt.center = [0, 7, 0];\n // Set the minor radius for the third ellipse.\n ellipseOpt.radiusMinor = 2;\n // Set the major radius for the third ellipse.\n ellipseOpt.radiusMajor = 6;\n // Create the third elliptical wire with the updated options.\n const ellipse3 = await shapes.wire.createEllipseWire(ellipseOpt);\n\n // Create an instance of LoftDto to define the parameters for the loft operation.\n // The generic type TopoDSShapePointer indicates the type of shapes to be lofted.\n const loftOpt = new LoftDto();\n // Assign an array of the created ellipse wires to the 'shapes' property of loftOpt.\n // These are the profiles that will be connected by the loft.\n loftOpt.shapes = [ellipse1, ellipse2, ellipse3];\n // Perform the loft operation using the defined options.\n // This will create a surface (or shell) connecting the three ellipses.\n // 'makeSolid' defaults to false, creating a shell.\n const loft = await operations.loft(loftOpt);\n\n // Create an instance of DrawOcctShapeSimpleOptions to define how the lofted shape will be displayed.\n const drawOpt = new DrawOcctShapeSimpleOptions();\n // Set the precision for drawing the shape. This affects the tessellation quality.\n drawOpt.precision = 0.001;\n // Set the color of the faces of the lofted shape.\n drawOpt.faceColour = \"#ff00ff\"; // Magenta\n // Draw the lofted shape asynchronously using the specified entity and drawing options.\n draw.drawAnyAsync({ entity: loft, options: drawOpt });\n\n}\n\n// Call the start function to execute the script.\nstart();","version":"0.20.4","type":"typescript"}} + title="Simple Loft Operation" + /> + + + +With these examples, you've learned the basics of creating a lofted surface from a series of wire profiles. + + +Experiment with these parameters to explore the wide range of forms you can achieve with the loft operation. Happy modeling! \ No newline at end of file diff --git a/docs/learn/getting-started/rete/typescript-editor-component.md b/docs/learn/getting-started/rete/typescript-editor-component.md index e1628371..f79feda4 100644 --- a/docs/learn/getting-started/rete/typescript-editor-component.md +++ b/docs/learn/getting-started/rete/typescript-editor-component.md @@ -47,10 +47,7 @@ While visual components cover a vast range of functionalities, there are times w 3. **Prototype and Extend:** * If you find yourself repeatedly writing the same custom script, it might be a candidate for a new, reusable Rete component. The script editor is a great place to prototype this logic. If the idea proves to be generic and useful, we might even incorporate it as a new official component in a future release. -4. **Debug and Understand:** - * Sometimes, seeing the underlying data or a snippet of code can help you understand why a visual graph isn't behaving as expected. The JSON editor can be useful for inspecting the raw structure of your Rete graph. - -5. **Overcome Limitations and Avoid Getting Stuck:** +4. **Overcome Limitations and Avoid Getting Stuck:** * One of the most powerful aspects of this hybrid approach is that you're rarely truly "stuck." If a visual approach hits a wall, you have an alternative. This flexibility is crucial for more complex projects and continuous development. ## A Pathway for Growth: From Explorer to Developer diff --git a/docs/learn/tags.yml b/docs/learn/tags.yml index b3286c8d..d0f6e4fc 100644 --- a/docs/learn/tags.yml +++ b/docs/learn/tags.yml @@ -182,3 +182,8 @@ licensing: label: Licensing permalink: /licensing description: Licensing refers to the legal permissions and restrictions associated with using, modifying, and distributing software. + +ai: + label: AI + permalink: /ai + description: AI refers to artificial intelligence technologies and applications, including machine learning and natural language processing. \ No newline at end of file diff --git a/docs/learn/using-ai-with-bitbybit/_category_.json b/docs/learn/using-ai-with-bitbybit/_category_.json new file mode 100644 index 00000000..c64decfc --- /dev/null +++ b/docs/learn/using-ai-with-bitbybit/_category_.json @@ -0,0 +1,10 @@ +{ + "label": "Using AI With Bitbybit", + "position": 10, + "link": { + "type": "generated-index", + "title": "Using AI With Bitbybit", + "description": "Bitbybit is relatively large coding and design web platform and AI can help you use it more effectively. In these tutorials we will explore how to use AI to enhance your Bitbybit experience.", + "slug": "/using-ai-with-bitbybit" + } +} \ No newline at end of file diff --git a/docs/learn/using-ai-with-bitbybit/intro.md b/docs/learn/using-ai-with-bitbybit/intro.md new file mode 100644 index 00000000..a25d83e4 --- /dev/null +++ b/docs/learn/using-ai-with-bitbybit/intro.md @@ -0,0 +1,29 @@ +--- +sidebar_position: 1 +title: Introduction to AI with Bitbybit +sidebar_label: Introduction +description: Learn how to leverage Artificial Intelligence within the Bitbybit platform for enhanced coding and design workflows. +tags: [ai] +--- + +# Leveraging AI with Bitbybit: Enhancing Your Design and Coding Workflow + +Bitbybit is an extensive web platform for parametric coding and design, offering a wide array of tools and functionalities. Given its breadth, Artificial Intelligence (AI) can serve as a powerful co-pilot, helping you navigate its features, accelerate your development process, and unlock new creative possibilities. It's important to note that Bitbybit itself **does not provide proprietary Large Language Models (LLMs)**. Instead, we focus on seamless integration with leading third-party AI services and models, allowing you to leverage the best available technologies. + +The landscape of AI technology is in a state of constant and rapid evolution. At Bitbybit, we are committed to integrating the latest and most impactful advancements. This includes exploring and incorporating: + +* **Cutting-Edge Models:** Primarily LLMs from various providers that can understand and generate human-like text and code. These assist with tasks ranging from script generation and autocompletion to documentation and conceptual brainstorming. The open-source nature of many Bitbybit components and its extensive documentation also plays a crucial role here, as it provides a rich dataset for these foundation models to learn about Bitbybit's core APIs and functionalities, leading to more accurate and relevant AI assistance. Read more about [Our Approach to Open Source](/learn/open-source-approach). +* **Model Context Protocol (MCPs):** an open standard that standardizes how AI applications, like large language models (LLMs), interact with external data sources and tools. It essentially acts as a "universal translator" allowing AI models to communicate with various systems and services. MCP facilitates seamless integration and context sharing, enabling AI models to access information and take actions beyond simple text generation. [Learn More](https://modelcontextprotocol.io/introduction) +* **Specialized Coding Agents:** AI agents fine-tuned for specific programming languages or tasks, such as generating boilerplate code, debugging, or even suggesting more efficient algorithms for your Bitbybit scripts. + +While our "Getting Started" guides and detailed coding documentation provide the foundational knowledge for using Bitbybit, this section focuses specifically on the practical application of AI within the platform. We will explore various ways AI models can be utilized, from simple code completion and generation to more advanced collaborative design processes. We'll also provide guidance on setting up and configuring these AI tools to work with your Bitbybit environment. + +**Key Concepts You'll Encounter:** + +* **Prompt Engineering:** The art and science of crafting effective inputs (prompts) to guide AI models to produce the desired outputs. This involves being clear, concise, and providing sufficient context. +* **Contextual Awareness:** How AI can leverage the context of your current project, active code files, or design intent within Bitbybit to provide more relevant and useful assistance. +* **Iterative Refinement:** Using AI as a partner in an iterative process. You might generate initial ideas or code snippets with AI and then progressively refine them based on your expertise and specific project requirements. +* **Vibe Coding:** An emerging concept where developers communicate their intent to an AI coding assistant in a more natural, high-level, or even abstract way—expressing the "vibe" or desired outcome rather than precise algorithmic steps. The AI then attempts to translate this "vibe" into functional code. This can speed up prototyping and exploration of ideas. +* **Ethical Considerations:** Understanding the limitations, potential biases, and responsible use of AI models in your creative and technical work. This includes data privacy, intellectual property, and the reliability of AI-generated content. + +It is crucial to remember that AI is a field characterized by its incredibly fast pace of innovation. Information, tools, and best practices can become outdated quickly. Therefore, we encourage you to approach these guides with an understanding of this dynamic environment and to check back regularly for updates and new insights. Think of this section as a living document, evolving alongside the AI technologies it describes. diff --git a/docs/learn/using-ai-with-bitbybit/mcp/_category_.json b/docs/learn/using-ai-with-bitbybit/mcp/_category_.json new file mode 100644 index 00000000..a4e0ea56 --- /dev/null +++ b/docs/learn/using-ai-with-bitbybit/mcp/_category_.json @@ -0,0 +1,10 @@ +{ + "label": "Model Context Protocol (MCP)", + "position": 10, + "link": { + "type": "generated-index", + "title": "Model Context Protocol (MCP)", + "description": "Learn about the Model Context Protocol (MCP), a powerful way for integrating AI models with Bitbybit. This protocol allows you to define and manage the context in which AI models operate, enhancing their effectiveness in various applications.", + "slug": "/using-ai-with-bitbybit/mcp" + } +} \ No newline at end of file diff --git a/docs/learn/using-ai-with-bitbybit/mcp/context-7.md b/docs/learn/using-ai-with-bitbybit/mcp/context-7.md new file mode 100644 index 00000000..cc6cb821 --- /dev/null +++ b/docs/learn/using-ai-with-bitbybit/mcp/context-7.md @@ -0,0 +1,108 @@ +--- +id: context-7 +title: Using Context7 MCP with Bitbybit +sidebar_label: Context7 Integration +description: Learn how to connect your AI coding assistant to up-to-date Bitbybit documentation and examples using Context7 and the Model Context Protocol (MCP). +tags: [ai] +--- + +# Using Context7 MCP with Bitbybit + +We are pleased to announce that Bitbybit documentation and example applications are now available via Context7 MCP servers. +You can explore our [GitHub Monorepo](https://github.com/bitbybit-dev/bitbybit) or [find Bitbybit on Context7](https://context7.com/bitbybit-dev/bitbybit). + +--- + +## What is Context7? + +Modern AI coding assistants, such as large language models (LLMs), often rely on outdated or generic information about the libraries you use. +Context7 addresses this by providing up-to-date, version-specific documentation and real code examples directly from the source. + +With Context7, you can insert accurate and relevant documentation into tools like Cursor, Claude, GitHub Copilot or other LLMs. This leads to better answers, fewer inaccuracies, and an AI that actually understands your technology stack. + +### Why Use Context7? + +**Without Context7:** +- Documentation may be outdated due to old training data +- Code examples might not work as expected +- Answers are often generic and not tailored to your version +- Extra time is spent verifying AI-generated responses +- The process can be inefficient and frustrating + +**With Context7:** +- Documentation is always current and matches your version +- Code examples are real and sourced directly from the project +- Information is concise and directly relevant to your needs +- Free access is available for personal use +- Easily integrates with your MCP server and development tools + +--- + +## Important + +MCP works only in agent mode. + +## How to Set Up Context7 with MCP in VS Code + +You can connect your AI coding assistant in VS Code to Context7 for the latest Bitbybit documentation and examples. + +### 1. Add `mcp.json` to Your Project + +Create a `.vscode` folder in your project root (if it doesn’t exist), and add a file named `mcp.json` with the following content: + +```json title="connecting locally (seems to work better)" +{ + "servers": [ + { + "command": "npx", + "args": [ + "-y", + "@upstash/context7-mcp@latest" + ], + "env": { + "DEFAULT_MINIMUM_TOKENS": "10000" + } + } + ] +} +``` + +```json title="connecting via http" +{ + "servers": { + "context7": { + "type": "http", + "url": "https://mcp.context7.com/mcp" + } + } +} +``` + +### 2. Enable MCP in Your Coding Assistant + +- Ensure your coding assistant (such as GitHub Copilot) is configured to use MCP. +- In VS Code, check your settings for an option like `chat.mcp.enabled` and make sure it is enabled. +- If you use an Enterprise edition, your organization may need to enable this feature. + +### 3. Benefit from Improved AI Assistance + +Once set up, your AI assistant will have access to the latest Bitbybit documentation and examples, resulting in more accurate and helpful suggestions. + +--- + +## Caution + +Our docs are not yet complete - thus there might be topics that Context7 may not know about. Making docs cover majority of use cases and features is our current priorty, thus results will only improve. At the end this isn't really about AI, it's about our users having access to better and more convenient information sources. + +While Context7 is aware of Bitbybit and can provide helpful information, it is not guaranteed to always give you fully accurate answers even if it would have all the information. The quality of responses still depends on the underlying language model, which may sometimes generate incorrect or misleading information (a phenomenon known as "hallucination"). + +Also, Context7 primarily loads documentation entries that include code snippets. Since it is a third-party service, we cannot guarantee its performance in every situation or that the server will always be available. + +Additionally, the Context7 repository scraping process tries to optimize for token limits, which means that some relevant information might be accidentally omitted. Please keep these limitations in mind when using Context7. + +## Additional Notes + +- For detailed instructions on setting up MCP with other editors or AI tools, refer to their official documentation. +- MCP is an open standard, so most modern editors and AI providers support it. + +By integrating Context7 with MCP, you ensure your AI tools always have the most relevant and up-to-date information about Bitbybit, making your coding experience more efficient and productive. \ No newline at end of file From 11dbaebd10340a63d79c68faf388b99e7da327bc Mon Sep 17 00:00:00 2001 From: Matas Ubarevicius Date: Thu, 5 Jun 2025 14:47:35 +0300 Subject: [PATCH 03/18] update doc category for occt operations --- docs/learn/code/common/occt/operations/_category_.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/learn/code/common/occt/operations/_category_.json b/docs/learn/code/common/occt/operations/_category_.json index f19a0e58..bd061b30 100644 --- a/docs/learn/code/common/occt/operations/_category_.json +++ b/docs/learn/code/common/occt/operations/_category_.json @@ -1,6 +1,6 @@ { - "label": "Occt", - "position": 1, + "label": "Operations", + "position": 5, "link": { "type": "generated-index", "title": "OCCT Operations", From c6500aee6d2ff19ad9414804eb5329b39f3df974 Mon Sep 17 00:00:00 2001 From: Matas Ubarevicius Date: Thu, 5 Jun 2025 23:21:18 +0300 Subject: [PATCH 04/18] advanced loft examples added --- .../common/occt/operations/advanced-loft.md | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 docs/learn/code/common/occt/operations/advanced-loft.md diff --git a/docs/learn/code/common/occt/operations/advanced-loft.md b/docs/learn/code/common/occt/operations/advanced-loft.md new file mode 100644 index 00000000..a900e4b9 --- /dev/null +++ b/docs/learn/code/common/occt/operations/advanced-loft.md @@ -0,0 +1,77 @@ +--- +sidebar_position: 2 +title: Creating a Advanded Loft +sidebar_label: Advanced Loft Tutorial +description: Learn how to create a surface by lofting between several wire shapes and use various advanced options that help you make more intricate shapes. +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 + +The file explains how to create complex 3D shapes using an advanced lofting operation. This operation generates a surface or solid by connecting a series of 2D wire profiles, offering more control than a simple loft. + +Here's a breakdown of the process described: + +1. **Profile Creation**: The script begins by creating three distinct n-sided polygonal wires (using `createNGonWire`). These wires serve as the cross-sections for the loft. Each wire can be customized with a different number of corners, radius, and spatial position. +2. **Profile Refinement**: To achieve smoother transitions, 2D fillets (using `fillet2d`) are applied to the corners of these polygonal wires. +3. **Advanced Loft Operation**: The core of the script is the `loftAdvanced` function. This function takes the refined wire profiles and a set of parameters to generate the final 3D shape. + +### Key Parameters for `loftAdvanced` + +* `shapes`: This is the list of 2D wire profiles that the loft will pass through. +* `startVertex` and `endVertex`: These optional parameters allow the loft to begin or end at a single point, creating a tapered or pointed shape. +* `makeSolid`: A boolean that determines whether the output is a hollow shell (surface) or a solid object. +* `closed`: If set to true, the loft connects the last profile back to the first, forming a closed loop. +* `periodic`: Useful for creating smooth, continuous surfaces when the input profiles form a repeating pattern. +* `straight`: When true, the loft creates ruled surfaces, meaning it uses straight lines to connect corresponding points on adjacent profiles. +* `useSmoothing`: Applies a smoothing algorithm to the generated surface for a more organic look. +* `maxUDegree`: Controls the maximum degree of the resulting BSpline surface in the U direction. +* `tolerance`: Defines the geometric precision for the lofting operation. +* `parType`: Specifies the method used for parameterizing the surface along the path of the loft (e.g., `approxCentripetal`, `approxChordLength`). + +### Overlap with Simple Loft + +* **Fundamental Principle**: Both simple and advanced lofting share the core concept of creating a 3D form by sweeping through a sequence of 2D profiles. The basic input of a list of shapes (wires) is common to both. + + + + + + + nrCornerswire1wire2wire3nrCorners10151515030117910001000100010003wire1000010nrCorners31wire2030010nrCorners10.3wire3070010nrCorners60.5wire3wire2wire1FALSEFALSEFALSEFALSE10FALSE31e-7'approxChordLength'01000-300.01TRUE#cc33ccTRUE#ffffff2","version":"0.20.4","type":"blockly"}} + title="Advanced Loft Operation" + /> + + + {\n\n const arcCameraOptions = new CameraConfigurationDto();\n arcCameraOptions.position = [15, 15, 15];\n arcCameraOptions.lookAt = [0, 3, 0];\n scene.adjustActiveArcRotateCamera(arcCameraOptions);\n\n const nrCorners = 10;\n\n const ngonOpt = new NGonWireDto();\n ngonOpt.nrCorners = nrCorners;\n ngonOpt.radius = 3;\n const wire1 = await wire.createNGonWire(ngonOpt);\n const filletOpt = new FilletDto();\n filletOpt.radius = 0.3;\n filletOpt.shape = wire1;\n const filletedWire1 = await fillets.fillet2d(filletOpt);\n\n ngonOpt.center = [0, 3, 0];\n ngonOpt.radius = 1;\n const wire2 = await wire.createNGonWire(ngonOpt);\n filletOpt.radius = 0.3;\n filletOpt.shape = wire2;\n const filletedWire2 = await fillets.fillet2d(filletOpt);\n\n ngonOpt.center = [0, 7, 0];\n ngonOpt.radius = 6;\n const wire3 = await wire.createNGonWire(ngonOpt);\n filletOpt.radius = 0.5;\n filletOpt.shape = wire3;\n const filletedWire3 = await fillets.fillet2d(filletOpt);\n\n const loftAdvancedOptions = new LoftAdvancedDto();\n loftAdvancedOptions.startVertex = [0, 10, 0];\n loftAdvancedOptions.endVertex = [0, -3, 0];\n loftAdvancedOptions.shapes = [filletedWire3, filletedWire2, filletedWire1];\n const loftedShape = await operations.loftAdvanced(loftAdvancedOptions)\n\n const drawOptions = new DrawOcctShapeSimpleOptions();\n drawOptions.faceColour = \"#ff00ff\";\n \n bitbybit.draw.drawAnyAsync({\n entity: loftedShape,\n options: drawOptions\n });\n\n}\n\n\nstart();","version":"0.20.4","type":"typescript"}} + title="Advanced Loft Operation" + /> + + + +### Conclusions + +The advanced loft operation provides a much richer set of tools for controlling the lofting process compared to a basic loft. While a simple loft typically connects profiles in a straightforward manner, `loftAdvanced` allows for: + +* The creation of either solid bodies or open surfaces (shells). +* The ability to close the loft into a continuous loop or make it periodic. +* The option to taper the loft to a specific start or end point. +* Fine-grained control over the surface's smoothness, straightness (ruled surfaces), and mathematical definition (degree, parameterization). + +This makes the advanced loft operation highly versatile for generating complex, precise, and aesthetically refined 3D geometries. The example demonstrates this by creating a shape from three filleted n-gon wires, with the added capability of defining specific start and end vertices for the loft. From 082684995877c26dac5c5fde3f3293d31dce67f1 Mon Sep 17 00:00:00 2001 From: Matas Ubarevicius Date: Fri, 6 Jun 2025 08:53:54 +0300 Subject: [PATCH 05/18] updated typescript code to use additional comments --- docs/learn/code/common/occt/operations/advanced-loft.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/learn/code/common/occt/operations/advanced-loft.md b/docs/learn/code/common/occt/operations/advanced-loft.md index a900e4b9..55500513 100644 --- a/docs/learn/code/common/occt/operations/advanced-loft.md +++ b/docs/learn/code/common/occt/operations/advanced-loft.md @@ -59,7 +59,7 @@ Here's a breakdown of the process described: {\n\n const arcCameraOptions = new CameraConfigurationDto();\n arcCameraOptions.position = [15, 15, 15];\n arcCameraOptions.lookAt = [0, 3, 0];\n scene.adjustActiveArcRotateCamera(arcCameraOptions);\n\n const nrCorners = 10;\n\n const ngonOpt = new NGonWireDto();\n ngonOpt.nrCorners = nrCorners;\n ngonOpt.radius = 3;\n const wire1 = await wire.createNGonWire(ngonOpt);\n const filletOpt = new FilletDto();\n filletOpt.radius = 0.3;\n filletOpt.shape = wire1;\n const filletedWire1 = await fillets.fillet2d(filletOpt);\n\n ngonOpt.center = [0, 3, 0];\n ngonOpt.radius = 1;\n const wire2 = await wire.createNGonWire(ngonOpt);\n filletOpt.radius = 0.3;\n filletOpt.shape = wire2;\n const filletedWire2 = await fillets.fillet2d(filletOpt);\n\n ngonOpt.center = [0, 7, 0];\n ngonOpt.radius = 6;\n const wire3 = await wire.createNGonWire(ngonOpt);\n filletOpt.radius = 0.5;\n filletOpt.shape = wire3;\n const filletedWire3 = await fillets.fillet2d(filletOpt);\n\n const loftAdvancedOptions = new LoftAdvancedDto();\n loftAdvancedOptions.startVertex = [0, 10, 0];\n loftAdvancedOptions.endVertex = [0, -3, 0];\n loftAdvancedOptions.shapes = [filletedWire3, filletedWire2, filletedWire1];\n const loftedShape = await operations.loftAdvanced(loftAdvancedOptions)\n\n const drawOptions = new DrawOcctShapeSimpleOptions();\n drawOptions.faceColour = \"#ff00ff\";\n \n bitbybit.draw.drawAnyAsync({\n entity: loftedShape,\n options: drawOptions\n });\n\n}\n\n\nstart();","version":"0.20.4","type":"typescript"}} + script={{"script":"\n// Import DTOs for configuring various operations. DTOs are objects used to pass data.\n// Import camera configuration for setting up the scene view.\nconst { CameraConfigurationDto } = Bit.Inputs.BabylonScene;\n// Import DTOs for OpenCASCADE (OCCT) geometric modeling: creating polygons, fillets, and lofts.\nconst { NGonWireDto, FilletDto, LoftAdvancedDto } = Bit.Inputs.OCCT;\n// Import DTO for specifying drawing options, like color and opacity.\nconst { DrawOcctShapeSimpleOptions } = Bit.Inputs.Draw;\n// Import a specific type for an OCCT wire, ensuring type safety in our code.\ntype TopoDSWirePointer = Bit.Inputs.OCCT.TopoDSWirePointer;\n\n// Destructure the bitbybit API to get direct access to its main modules.\n// 'scene' provides access to Babylon.js scene controls.\nconst { scene } = bitbybit.babylon;\n// 'wire', 'fillets', and 'operations' are part of the OCCT module for creating and manipulating shapes.\nconst { wire } = bitbybit.occt.shapes;\nconst { fillets, operations } = bitbybit.occt;\n\n// Define an asynchronous function to execute the main logic.\n// Using async/await is necessary because geometry creation and drawing are non-blocking operations.\nconst start = async () => {\n\n // --- 1. Camera Configuration ---\n // Create a new configuration object for the scene's Arc Rotate Camera.\n const arcCameraOptions = new CameraConfigurationDto();\n // Set the camera's position in 3D space (x, y, z).\n arcCameraOptions.position = [15, 15, 15];\n // Set the point the camera will look at.\n arcCameraOptions.lookAt = [0, 3, 0];\n // Apply these settings to the active camera in the scene.\n scene.adjustActiveArcRotateCamera(arcCameraOptions);\n\n // Define the number of corners for the polygonal profiles.\n const nrCorners = 10;\n\n // --- 2. Create the First Profile (Bottom) ---\n // Create a DTO to define an n-sided polygon wire.\n const ngonOpt = new NGonWireDto();\n ngonOpt.nrCorners = nrCorners;\n ngonOpt.radius = 3;\n // Asynchronously create the first polygon wire shape at the default center [0,0,0].\n const wire1 = await wire.createNGonWire(ngonOpt);\n\n // Create a DTO for a 2D fillet operation to round the corners of a wire.\n const filletOpt = new FilletDto();\n filletOpt.radius = 0.3; // The radius of the rounded corners.\n filletOpt.shape = wire1; // Specify that the fillet should be applied to wire1.\n // Asynchronously apply the fillet and store the new, smoothed wire.\n const filletedWire1 = await fillets.fillet2d(filletOpt);\n\n // --- 3. Create the Second Profile (Middle) ---\n // Reuse the ngonOpt DTO but modify its properties for the next shape.\n ngonOpt.center = [0, 3, 0]; // Move the center up along the Y-axis.\n ngonOpt.radius = 1; // Make this polygon smaller.\n const wire2 = await wire.createNGonWire(ngonOpt);\n\n // Reuse the filletOpt DTO to apply the same fillet radius to the new wire.\n filletOpt.shape = wire2;\n const filletedWire2 = await fillets.fillet2d(filletOpt);\n\n // --- 4. Create the Third Profile (Top) ---\n // Reuse and modify the DTOs again for the third and final profile.\n ngonOpt.center = [0, 7, 0]; // Move this one even higher.\n ngonOpt.radius = 6; // Make this polygon the largest.\n const wire3 = await wire.createNGonWire(ngonOpt);\n\n // Use a larger fillet radius for this larger wire.\n filletOpt.radius = 0.5;\n filletOpt.shape = wire3;\n const filletedWire3 = await fillets.fillet2d(filletOpt);\n\n // --- 5. Perform the Loft Operation ---\n // A loft creates a 3D solid by connecting a series of 2D profiles.\n const loftAdvancedOptions = new LoftAdvancedDto();\n // Specify a single point where the loft should begin, creating a pointed top.\n loftAdvancedOptions.startVertex = [0, 10, 0];\n // Specify a single point where the loft should end, creating a pointed bottom.\n loftAdvancedOptions.endVertex = [0, -3, 0];\n // Provide the array of profiles to connect. The order matters.\n loftAdvancedOptions.shapes = [filletedWire3, filletedWire2, filletedWire1];\n // Asynchronously execute the loft operation to create the final 3D shape.\n const loftedShape = await operations.loftAdvanced(loftAdvancedOptions)\n\n // --- 6. Draw the Final Shape ---\n // Create a DTO to define how the shape should be drawn.\n const drawOptions = new DrawOcctShapeSimpleOptions();\n // Set the color of the shape's faces to magenta.\n drawOptions.faceColour = \"#ff00ff\";\n\n // Call the generic drawing function to render the OCCT shape in the scene.\n bitbybit.draw.drawAnyAsync({\n entity: loftedShape, // The shape to draw.\n options: drawOptions // The drawing options to apply.\n });\n\n}\n\n// Execute the main function to start the script.\nstart();","version":"0.20.4","type":"typescript"}} title="Advanced Loft Operation" /> From 7cb2dfb1f8cffb3f06e73eaa30b5f221ed6f9297 Mon Sep 17 00:00:00 2001 From: Matas Ubarevicius Date: Sat, 7 Jun 2025 12:00:24 +0300 Subject: [PATCH 06/18] update to docs, made DivideDto shape optional param in constructor --- .../common/occt/operations/advanced-loft.md | 2 +- .../code/common/occt/operations/extrusions.md | 96 +++++++++++++++++++ .../occt/operations/rotated-extrusions.md | 92 ++++++++++++++++++ .../common/occt/operations/simple-loft.md | 2 +- .../dev/occt/lib/api/inputs/occ-inputs.ts | 10 +- 5 files changed, 195 insertions(+), 7 deletions(-) create mode 100644 docs/learn/code/common/occt/operations/extrusions.md create mode 100644 docs/learn/code/common/occt/operations/rotated-extrusions.md diff --git a/docs/learn/code/common/occt/operations/advanced-loft.md b/docs/learn/code/common/occt/operations/advanced-loft.md index 55500513..ade039f4 100644 --- a/docs/learn/code/common/occt/operations/advanced-loft.md +++ b/docs/learn/code/common/occt/operations/advanced-loft.md @@ -1,6 +1,6 @@ --- sidebar_position: 2 -title: Creating a Advanded Loft +title: Creating Advanded Loft sidebar_label: Advanced Loft Tutorial description: Learn how to create a surface by lofting between several wire shapes and use various advanced options that help you make more intricate shapes. tags: [code, occt, rete, blockly, typescript] diff --git a/docs/learn/code/common/occt/operations/extrusions.md b/docs/learn/code/common/occt/operations/extrusions.md new file mode 100644 index 00000000..b1a68a9a --- /dev/null +++ b/docs/learn/code/common/occt/operations/extrusions.md @@ -0,0 +1,96 @@ +--- +sidebar_position: 3 +title: Extruding Wires And Faces +sidebar_label: Extrude Wire And Face +description: Learn how to create a 3D shape by extruding a 2D wire profile or face. +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 + +## Extruding a Wire + +Extrusion is a fundamental 3D modeling operation that creates a three-dimensional shape by extending a profile (a wire) along a specified vector. Imagine taking a flat shape and pushing it through space to give it depth; that's the essence of extrusion. This technique is widely used for creating a vast array of objects, from simple geometric solids to complex mechanical parts and architectural elements. + +In this tutorial, we'll guide you through the process of creating an extruded shape. We will start by defining a 2D star-shaped wire, apply a 2D fillet to round its corners, and then extrude this modified wire along a vector to form a 3D object. We'll demonstrate this process using Rete, Blockly, and TypeScript, providing clear examples for each environment. + +The key parameters for an extrusion operation typically include: + +* **The Profile (Wire)**: This is the shape that will be extruded. It can be any closed or open wire, such as a circle, polygon, or a custom-defined curve or polyline. +* **The Extrusion Vector**: This defines the direction and distance (magnitude) of the extrusion. The profile is swept along this vector. +* **Solid or Shell**: When you extrude the wire you create a shell shape. If you extrude face you create solid. + +By understanding extrusion, you gain a powerful tool for your 3D modeling toolkit. + + + + + + + + heightheight40000107740FALSE0.50height0","version":"0.20.4","type":"blockly"}} + title="Extrude the wire into shell kind of shape" + /> + + + {\n\n // Define a constant 'height' for the extrusion operation.\n const height = 4;\n\n // Create a new StarDto instance to configure the properties of a star-shaped wire.\n const starOpt = new StarDto();\n // Set the inner radius of the star.\n starOpt.innerRadius = 4;\n // Set the outer radius of the star.\n starOpt.outerRadius = 7;\n // Asynchronously create the star-shaped wire using the configured options.\n // The 'await' keyword pauses execution until the wire creation is complete.\n // Bitbybit runs such CAD operations in the worker thread, which doesn't block UI\n // and is usually faster.\n const star = await wire.createStarWire(starOpt);\n\n // Create a new FilletDto instance to configure a 2D fillet operation.\n // The generic type specifies that this fillet will be applied to a wire.\n const filletOpt = new FilletDto();\n // Set the shape to be filleted to the previously created star wire.\n filletOpt.shape = star;\n // Set the radius for the fillet (rounding of corners).\n filletOpt.radius = 0.5;\n // Asynchronously apply the 2D fillet to the star wire.\n const roundedStar = await fillets.fillet2d(filletOpt);\n\n // Create a new ExtrudeDto instance to configure an extrusion operation.\n // The generic type specifies that a wire will be extruded.\n const extrudeOpt = new ExtrudeDto();\n // Set the shape to be extruded to the previously created rounded star wire.\n extrudeOpt.shape = roundedStar;\n // Set the direction and magnitude of the extrusion as a 3D vector [x, y, z].\n // Here, it extrudes along the Y-axis by the value of 'height'.\n extrudeOpt.direction = [0, height, 0];\n // Asynchronously perform the extrusion operation on the rounded star wire.\n const extrudedRoundStar = await operations.extrude(extrudeOpt);\n\n // Asynchronously draw the final extruded shape in the 3D scene.\n // 'entity' specifies the shape to be drawn.\n bitbybit.draw.drawAnyAsync({ entity: extrudedRoundStar });\n\n}\n\n// Call the 'start' function to execute the script.\nstart();","version":"0.20.4","type":"typescript"}} + title="Extrude the wire into shell kind of shape" + /> + + + +## Extruding a Face + +In addition to extruding wires (which typically create shells or open-ended shapes), you can also extrude faces. A face in this context is a bounded 2D surface, often created from one or more closed wires. When a face is extruded, the operation effectively sweeps this surface along the extrusion vector, creating a closed volumetric body, or a solid. + +This is a crucial distinction: +* **Wire Extrusion**: Generally results in a shell (a collection of connected faces without volume, like a pipe). +* **Face Extrusion**: Results in a solid (a shape with enclosed volume, like a solid bar). + +In the following examples, we first construct a complex wire, then create a planar face from this wire, and finally extrude this face to produce a solid 3D object. This demonstrates a common workflow: defining a 2D profile as a face and then giving it depth to create a solid part. + + + + + + + heightheight4000010070000100520FALSEFALSETRUETRUE0height0","version":"0.20.4","type":"blockly"}} + title="Extrude the face into solid shape" + /> + + + {\n\n const height = 4;\n\n const heartOpt = new Heart2DDto();\n heartOpt.sizeApprox = 7;\n const heart1 = await wire.createHeartWire(heartOpt);\n\n heartOpt.sizeApprox = 5;\n const heart2 = await wire.createHeartWire(heartOpt);\n\n const zigZagOpt = new ZigZagBetweenTwoWiresDto(heart1, heart2, 31);\n const zigZagWire = await wire.createZigZagBetweenTwoWires(zigZagOpt);\n\n const faceFromWireOpt = new FaceFromWireDto(zigZagWire, true);\n const zigZagFace = await face.createFaceFromWire(faceFromWireOpt);\n \n const extrudeOpt = new ExtrudeDto();\n extrudeOpt.shape = zigZagFace;\n extrudeOpt.direction = [0, height, 0];\n const extrudedZigZag = await operations.extrude(extrudeOpt);\n\n bitbybit.draw.drawAnyAsync({ entity: extrudedZigZag });\n\n}\n\nstart();","version":"0.20.4","type":"typescript"}} + title="Extrude the face into solid shape" + /> + + + +With these examples, you've learned the basics of creating extruded 3D shapes from both 2D wire profiles (resulting in shells) and 2D faces (resulting in solids). This operation is a cornerstone of many CAD workflows, allowing for the creation of diverse geometries. + +You can also extrude shells (shapes consisting out of multiple faces). + +Feel free to experiment with different base wire and face shapes (e.g., circles, rectangles, polygons, or more complex custom profiles) and vary the extrusion vector (both direction and magnitude). You can also explore combining extrusion with other operations to create even more intricate designs. Happy modeling! \ No newline at end of file diff --git a/docs/learn/code/common/occt/operations/rotated-extrusions.md b/docs/learn/code/common/occt/operations/rotated-extrusions.md new file mode 100644 index 00000000..5e6c66ca --- /dev/null +++ b/docs/learn/code/common/occt/operations/rotated-extrusions.md @@ -0,0 +1,92 @@ +--- +sidebar_position: 4 +title: Rotated Extrude +sidebar_label: Rotated Extrusion +description: Learn how to create 3D spiral or helical shapes by extruding a 2D wire profile along an axis while rotating it. +tags: [code, occt, rete, blockly, typescript] +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import BitByBitRenderCanvas from '@site/src/components/BitByBitRenderCanvas'; + +# Creating Shapes with Rotated Extrusion + +OCCT category icon with a stylized logo representation + +Rotated extrusion is a powerful 3D modeling technique used to create spiral-like or helical shapes. It works by taking a 2D profile (an open or closed wire) and sweeping it along a vertical axis while simultaneously rotating the profile around that same axis. This is distinct from a simple revolution (which creates axially symmetric objects) as it involves both linear extrusion and rotation occurring concurrently over the length of the extrusion. This method can be used for generating objects like springs, threads, spiral staircases, or decorative twisted elements. + +## How Rotated Extrusion Works +The process of creating a shape through rotated extrusion involves several key elements: + +1. **The Profile Shape (Wire)**: This is the initial 2D wire (which can be open, like a line or an arc, or closed, like a rectangle or a circle) that will be extruded and rotated. The geometry of this profile dictates the cross-section of the resulting spiral or helical 3D object. +3. **The Extrusion Height (or Length)**: This scalar value specifies the distance the profile travels along the [0, 1, 0] vector. +4. **The Total Angle of Rotation (Twist)**: This defines how much the profile rotates around the [0, 1, 0] axis as it travels the full **Extrusion Height**. For example, a 360-degree angle means the profile completes one full twist. +5. **Make Solid Option**: If the input profile is a closed wire, setting the `makeSolid` option to `true` (as seen in the Rete example's `rotatedExtrude` node and TypeScript's `rotatedExtrudeOpt.makeSolid = true`) will attempt to create a volumetric, solid helical shape. If the wire is open, or if `makeSolid` is `false`, the result will typically be a helical shell or ribbon-like surface. + +In the examples below, we will demonstrate how to create a simple solid 3D helical shape by taking a 2D rectangular wire, defining an extrusion height, a rotation angle, and performing a rotated extrusion. + + + + + + + 130000104360TRUE","version":"0.20.4","type":"blockly"}} + title="Extrude the wire into shell kind of shape" + /> + + + {\n\n const recOpt = new Bit.Inputs.OCCT.RectangleDto(1, 3);\n const rectangle = await bitbybit.occt.shapes.wire.createRectangleWire(recOpt);\n const rotatedExtrudeOpt = new Bit.Inputs.OCCT.RotationExtrudeDto(rectangle, 4);\n const rotatedExtrude = await bitbybit.occt.operations.rotatedExtrude(rotatedExtrudeOpt)\n\n bitbybit.draw.drawAnyAsync({ entity: rotatedExtrude });\n\n}\n\nstart();","version":"0.20.4","type":"typescript"}} + title="Extrude the wire into shell kind of shape" + /> + + + +## Profiles Further From The Center + +When the profile is further from the center it will form a helix like shape. This can be quite powerful and create beautiful looking aesthetics. Check these scripts below. + + + + + + + pointPromisespointsngonRotationPromisesi3050300150117910001000100010003pointPromises00001061012FALSETRUEpointspointPromisesngonRotationPromisesipointsINSERTLASTngonRotationPromisesi01061.530270TRUEngonRotationPromises","version":"0.20.4","type":"blockly"}} + title="Extrude the wire into shell kind of shape" + /> + + + {\n\n // Adjust the default camera position to face the object\n const cameraOptions = new CameraConfigurationDto();\n cameraOptions.position = [30, 50, 50];\n cameraOptions.lookAt = [0, 15, 0];\n scene.adjustActiveArcRotateCamera(cameraOptions);\n\n // This ellipse will be used to derive origins for ngons on the ground plane\n const ellipseOptions = new EllipseDto();\n ellipseOptions.radiusMinor = 6;\n ellipseOptions.radiusMajor = 10;\n const ellipse = await wire.createEllipseWire(ellipseOptions);\n\n // We divide the wire into 12 segments and return the points\n const divideOptions = new DivideDto(ellipse);\n divideOptions.removeEndPoint = true;\n divideOptions.nrOfDivisions = 12;\n const points = await wire.divideWireByEqualDistanceToPoints(divideOptions);\n\n // Create ngons on these points\n const ngonOptions = new NGonWireDto();\n ngonOptions.radius = 1.5;\n const ngonPromises = points.map(point => {\n ngonOptions.center = point;\n return wire.createNGonWire(ngonOptions);\n });\n\n const ngons = await Promise.all(ngonPromises);\n\n // Form rotated extrusions on all of the points\n const rotatedExtrudeOptions = new RotationExtrudeDto();\n rotatedExtrudeOptions.angle = 270;\n rotatedExtrudeOptions.height = 30;\n const rotatedExtrusionPromises = ngons.map(ngon => {\n rotatedExtrudeOptions.shape = ngon;\n return operations.rotatedExtrude(rotatedExtrudeOptions);\n });\n\n const rotatedExtrusions = await Promise.all(rotatedExtrusionPromises);\n\n // Compounding multiple shapes will generally deliver much better rendering performance\n // as it will form a single mesh for all of the geometries involved in compound\n const compoundOptions = new CompoundShapesDto(rotatedExtrusions);\n const ngonCompound = await compound.makeCompound(compoundOptions);\n\n // As a last step we draw the ngon with default occt settings (defualt because we omit specifying options property)\n bitbybit.draw.drawAnyAsync({ entity: ngonCompound });\n\n}\n\n// Let's not forget to execute the start function, otherwise nothing will happen.\nstart();","version":"0.20.4","type":"typescript"}} + title="Extrude the wire into shell kind of shape" + /> + + + +### [Current Limitations](https://github.com/bitbybit-dev/bitbybit/issues/85) +Currently algorithm is intended to work with flat profiles on the ground plane (normal [0, 1, 0]). + +## Conclusion + +Rotated extrusion is a versatile tool for creating complex helical and spiral geometries from simple 2D wire profiles. By carefully controlling the profile shape, extrusion height, and total rotation angle, you can generate a wide array of interesting and functional 3D models. + +Experiment with different 2D wire profiles (open lines, arcs, closed circles, polygons, custom splines), adjust the extrusion height, and vary the rotation angle (try values greater than 360 for multiple twists!). Observe how the `makeSolid` parameter behaves with open versus closed wires. Happy modeling! \ No newline at end of file diff --git a/docs/learn/code/common/occt/operations/simple-loft.md b/docs/learn/code/common/occt/operations/simple-loft.md index 388f4b3f..c91e5f4d 100644 --- a/docs/learn/code/common/occt/operations/simple-loft.md +++ b/docs/learn/code/common/occt/operations/simple-loft.md @@ -1,5 +1,5 @@ --- -sidebar_position: 2 +sidebar_position: 1 title: Creating a Simple Loft sidebar_label: Simple Loft Tutorial description: Learn how to create a surface by lofting between several wire shapes. diff --git a/packages/dev/occt/lib/api/inputs/occ-inputs.ts b/packages/dev/occt/lib/api/inputs/occ-inputs.ts index 6c5f6801..5f311afd 100644 --- a/packages/dev/occt/lib/api/inputs/occ-inputs.ts +++ b/packages/dev/occt/lib/api/inputs/occ-inputs.ts @@ -3257,7 +3257,7 @@ export namespace OCCT { returnCompound = false; } export class DivideDto { - constructor(shape: T, nrOfDivisions?: number, removeStartPoint?: boolean, removeEndPoint?: boolean) { + constructor(shape?: T, nrOfDivisions?: number, removeStartPoint?: boolean, removeEndPoint?: boolean) { if (shape !== undefined) { this.shape = shape; } if (nrOfDivisions !== undefined) { this.nrOfDivisions = nrOfDivisions; } if (removeStartPoint !== undefined) { this.removeStartPoint = removeStartPoint; } @@ -3267,7 +3267,7 @@ export namespace OCCT { * Shape representing a wire * @default undefined */ - shape: T; + shape?: T; /** * The number of divisions that will be performed on the curve * @default 10 @@ -3275,17 +3275,17 @@ export namespace OCCT { * @maximum Infinity * @step 1 */ - nrOfDivisions = 10; + nrOfDivisions? = 10; /** * Indicates if algorithm should remove start point * @default false */ - removeStartPoint = false; + removeStartPoint? = false; /** * Indicates if algorithm should remove end point * @default false */ - removeEndPoint = false; + removeEndPoint? = false; } export class ProjectWireDto { From 75c622225c923ee64998b3f85b0885a92e53994d Mon Sep 17 00:00:00 2001 From: Matas Ubarevicius Date: Sat, 7 Jun 2025 21:57:25 +0300 Subject: [PATCH 07/18] removed 2d parts --- docs/learn/code/common/occt/operations/extrusions.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/learn/code/common/occt/operations/extrusions.md b/docs/learn/code/common/occt/operations/extrusions.md index b1a68a9a..518c3243 100644 --- a/docs/learn/code/common/occt/operations/extrusions.md +++ b/docs/learn/code/common/occt/operations/extrusions.md @@ -57,13 +57,13 @@ By understanding extrusion, you gain a powerful tool for your 3D modeling toolki ## Extruding a Face -In addition to extruding wires (which typically create shells or open-ended shapes), you can also extrude faces. A face in this context is a bounded 2D surface, often created from one or more closed wires. When a face is extruded, the operation effectively sweeps this surface along the extrusion vector, creating a closed volumetric body, or a solid. +In addition to extruding wires (which typically create shells or open-ended shapes), you can also extrude faces. A face in this context is a bounded surface, often created from one or more closed wires. When a face is extruded, the operation effectively sweeps this surface along the extrusion vector, creating a closed volumetric body, or a solid. This is a crucial distinction: * **Wire Extrusion**: Generally results in a shell (a collection of connected faces without volume, like a pipe). * **Face Extrusion**: Results in a solid (a shape with enclosed volume, like a solid bar). -In the following examples, we first construct a complex wire, then create a planar face from this wire, and finally extrude this face to produce a solid 3D object. This demonstrates a common workflow: defining a 2D profile as a face and then giving it depth to create a solid part. +In the following examples, we first construct a complex wire, then create a planar face from this wire, and finally extrude this face to produce a solid 3D object. This demonstrates a common workflow: defining a profile as a face and then giving it depth to create a solid part. From ee1814e4a372592bdadc8e7243bdbdeb3e13fe1f Mon Sep 17 00:00:00 2001 From: Matas Ubarevicius Date: Mon, 16 Jun 2025 17:46:54 +0300 Subject: [PATCH 08/18] update docs with pro plan additions --- docs/learn/3d-bits/subscription-plans.md | 102 +++++++++ .../theme-app-extensions/bitbybit-apps.md | 214 ++++++++++++++++++ .../theme-app-extensions/bitbybit-preview.md | 2 +- .../theme-app-extensions/bitbybit-runner.md | 2 +- .../theme-app-extensions/bitbybit-viewer.md | 2 +- 5 files changed, 319 insertions(+), 3 deletions(-) create mode 100644 docs/learn/3d-bits/subscription-plans.md create mode 100644 docs/learn/3d-bits/theme-app-extensions/bitbybit-apps.md diff --git a/docs/learn/3d-bits/subscription-plans.md b/docs/learn/3d-bits/subscription-plans.md new file mode 100644 index 00000000..2440d5ff --- /dev/null +++ b/docs/learn/3d-bits/subscription-plans.md @@ -0,0 +1,102 @@ +--- +sidebar_position: 3 +title: "Subscription Plans" +sidebar_label: Subscription Plans +description: 3D Bits app for shopify includes 2 plan offerings - one is meant for basic 3D product pages & configurator setups, the other is meant for stores who are managed by professional development teams working on larger applications. +tags: [shopify, 3d-bits] +--- + +3D Bits offers two comprehensive subscription plans designed to meet different business needs. Whether you're just getting started with 3D commerce or need advanced development capabilities, we have the right plan for you. + +## Plan Comparison + +| Feature | Annual Base | Annual Pro | +|---------|-------------|------------| +| **Price** | 142$ yearly | 900$ yearly | +| **Trial** | 14 days | 21 days | +| **Target Audience** | Store owners, small teams | Professional development teams | +| **Setup Complexity** | Easy, no coding required (optional scripting) | Advanced, requires development skills | +| **Custom Development** | Optional | Mandatory | + +## Annual Base Plan + +Perfect for store owners who want to add 3D capabilities to their products without complex development work. + +### Core 3D Features +- ✅ Add 3D models to unlimited products +- ✅ Upload and display 3D files (GLTF format) +- ✅ Show realistic 3D product scans (Splat format) +- ✅ Let customers customize products in 3D +- ✅ Mobile-friendly 3D viewing +- ✅ Fast loading and smooth performance + +### Product Configurators +- ✅ Create simple product configurators without coding +- ✅ Build configurators with [bitbybit.dev](https://bitbybit.dev) visual programming tools +- ✅ Build advanced configurators with [bitbybit.dev](https://bitbybit.dev) TypeScript editor +- ✅ Create interactive 3D experiences +- ✅ Add realistic physics to product demos +- ✅ Design parametric and custom shapes + +### User Experience +- ✅ View products in full screen mode +- ✅ Show loading animations during processing +- ✅ Connect with pricing and UI apps + +:::tip Who is this for? +Annual Base is ideal for merchants who want to enhance their product pages with 3D models and simple configurators without needing a development team. +::: + +## Annual Pro Plan + +Designed for professional development teams who need complete control and advanced customization capabilities. + +### Everything in Annual Base, Plus: + +### Professional Development Tools +- ✅ Develop professional Single Page Applications (SPA) for product pages +- ✅ Embed SPA apps to product page via Theme App Extension block +- ✅ Use ThreeJS, BabylonJS, PlayCanvas or other web 3D engines +- ✅ Write custom Vite based TypeScript apps for 3D & 2D product presentations + +### Development Workflow +- ✅ Use the tools & editors that your team loves - VSCode, GitHub, etc. +- ✅ Ensure quality of your apps via unit tests +- ✅ Use configured local host development environment +- ✅ Emulate production environment in preview mode +- ✅ Easily embed build output via single JavaScript file to product page + +### Exclusive Access +- ✅ Access & clone opinionated example templates from our private GitHub repository +- ✅ Access private `bits-pro` NPM package allowing communication between product page inputs & your app logic + +:::warning Development Skills Required +Annual Pro requires technical expertise in JavaScript/TypeScript, 3D web development, and modern web development workflows. This plan is designed for development teams, not end users. +::: + +## Getting Started + +### Annual Base +1. Subscribe to the plan +2. Start adding 3D models immediately +3. Use our visual tools to create configurators +4. Publish to your store + +### Annual Pro +1. Subscribe to the plan +2. **Wait 24 hours** for access tokens to be sent to your email +3. Access our private GitHub repository and NPM package +4. Follow our [BITBYBIT APPS Pro guide](/learn/3d-bits/theme-app-extensions/bitbybit-apps) +5. Start developing custom 3D applications + +:::info Access Token Delivery +Pro plan subscribers will receive access tokens within 24 hours of subscription. If you don't receive them, contact us at [info@bitbybit.dev](mailto:info@bitbybit.dev) and we'll extend your trial period by 3 days. +::: + +## Support + +Need help choosing the right plan or setting up your 3D products? + +- 📧 Email: [info@bitbybit.dev](mailto:info@bitbybit.dev) +- 💬 Discord: [Join our community](https://discord.gg/GSe3VMe) +- 🛠️ Custom setup assistance available (quotes provided) diff --git a/docs/learn/3d-bits/theme-app-extensions/bitbybit-apps.md b/docs/learn/3d-bits/theme-app-extensions/bitbybit-apps.md new file mode 100644 index 00000000..e1aa9bbf --- /dev/null +++ b/docs/learn/3d-bits/theme-app-extensions/bitbybit-apps.md @@ -0,0 +1,214 @@ +--- +sidebar_position: 4 +title: "BITBYBIT APPS Block for Shopify's '3D Bits' App" +sidebar_label: BITBYBIT APPS (PRO) +description: Learn how to use the BITBYBIT APPS theme app extension block to develop and deploy professional 3D & 2D product presentations on Shopify +tags: [shopify, 3d-bits, typescript] +--- + +# Unlock Professional 3D & 2D Experiences with the BITBYBIT APPS Block + +The **BITBYBIT APPS** block, part of Shopify's "3D Bits" app, empowers professional development teams to create, test, and deploy sophisticated custom 3D & 2D Single Page Applications (SPAs) directly onto Shopify product pages. It provides a streamlined workflow, allowing you to seamlessly transition between local development, preview, and live production environments. + +## Why BITBYBIT APPS? Bridging the Gap in Shopify 3D Development + +Developing complex, interactive 3D applications within the traditional Shopify theme environment can be a hurdle. You might face: +- A restrictive development workflow ill-suited for dynamic applications. +- Challenges in integrating modern frontend frameworks and tools. +- Limitations with standard solutions designed for simpler, static 3D visualizations or small-scale configurators. + +Large-scale 3D experiences demand robust, professional programming practices to ensure quality, maintainability, and performance. The BITBYBIT APPS block addresses these challenges by providing a structured, developer-friendly workflow that integrates your local development environment directly with Shopify's powerful app ecosystem. This approach enables you to leverage professional IDEs, enjoy features like code completion and AI assistance, and implement crucial practices such as unit testing and test-driven development. + +## How It Works: Your App, Seamlessly Integrated + +The BITBYBIT APPS block acts as an intelligent bridge between your custom application and the Shopify product page. Here's a glimpse of its core functionality: + +1. **Smart Environment Detection**: It automatically detects if your application is running locally (e.g., on `localhost`) for development and embeds it. +2. **Real-time Data Sync**: It captures interactions on the Shopify product page (like variant selections or quantity changes) and sends this data in real-time to your application. +3. **Effortless Communication**: Your app, using our `bits-pro` NPM package, can easily subscribe to these updates and react dynamically. +4. **Flexible Modes**: It allows seamless switching between local development, preview, and live production modes, ensuring a consistent experience. + +### Data Flow Visualized +``` +Shopify Product Page ↔ BITBYBIT APPS Block ↔ Your SPA (using `bits-pro` NPM package) +``` +When customers interact with product options, variant selectors, or other designated inputs on the page, this data is automatically relayed to your application in JSON format. This enables your app to respond instantly to user choices and create truly interactive experiences. + +## The Development Journey: From Localhost to Live + +Our workflow is designed to be intuitive and efficient, supporting you at every stage of development: + +### 1. Local Development Mode: Build and Iterate Rapidly +- Run your Vite-based TypeScript application on a designated `localhost` port (e.g., `localhost:4242`). +- The BITBYBIT APPS block automatically detects and embeds your local app directly onto the Shopify product page. +- Experience real-time updates from product page interactions, fueling a full hot-reload development cycle. + +```bash +npm run dev # Your app runs, for example, on localhost:4242 +# The block detects and embeds your local app automatically. +``` + +### 2. Preview Mode: Test Before You Go Live +- Build your application into a single JavaScript file. +- Serve this static file locally (e.g., via `npm run watch`). +- This mode allows you to test production-like behavior while retaining the ability to make quick changes, as the file rebuilds live upon modification. +- Update the "Public Script URL" metafield in Shopify to point to your local server's static file (e.g., `https://localhost:4173/assets/index-stable.js`). + +```bash +npm run watch # Builds and serves the static file locally, rebuilding on changes. +# Point the "Public Script URL" metafield to your local static file. +``` + +### 3. Production Mode: Deploy to the World +- Create the final, optimized JavaScript bundle for your application. +- Upload this bundle to Shopify's CDN via Content → Files. +- Update the "Public Script URL" metafield with the new CDN URL. +- Your custom application is now live and accessible to all your customers. + +```bash +npm run build # Creates the optimized production bundle. +# Upload dist/assets/index-.js to Shopify Files. +# Update the "Public Script URL" metafield with the Shopify CDN URL. +``` +This streamlined process helps your team ship professional product configurators and interactive apps faster and more efficiently. + +## Technical Foundation: Flexible and Modern + +Our architecture is built to support modern web development practices while offering flexibility. + +### Core Technologies & Recommendations +- **Primary Stack**: We champion **TypeScript** with the **Vite** bundler for its speed, type safety, and excellent developer experience. +- **3D Engines**: Seamlessly integrate popular engines like **BabylonJS**, **ThreeJS**, **PlayCanvas**, or any other WebGL-based framework. +- **UI Frameworks**: Use **React**, **Vue**, **Svelte**, vanilla JavaScript, or your preferred UI library. +- **Styling**: Currently, styles should be inlined or bundled within your JavaScript. External CSS file embeds are not directly supported by the block itself. +- **Testing**: We strongly recommend **Vitest** (or your preferred testing framework) for unit testing. + +### Unparalleled Framework Flexibility +While our templates and primary recommendations focus on TypeScript and leading 3D engines, the BITBYBIT APPS architecture is fundamentally agnostic. Any frontend technology that can be bundled into a single JavaScript file can theoretically be used. This means you can leverage your team's existing skills and preferred tools. + +### Professional Development Environment +- **Your Choice of Editor**: Work in VSCode, Visual Studio, WebStorm, or any IDE you prefer. +- **Version Control**: Employ standard Git workflows for robust version control and collaboration. +- **Debugging & Testing**: Utilize professional debugging tools and implement comprehensive testing strategies, including unit tests. + +## Our Philosophy: An Opinionated, Professional Approach + +To ensure quality, maintainability, and a smooth development experience, we offer an opinionated solution: + +### What We Strongly Recommend +✅ **TypeScript**: For its robust type safety, improved code clarity, and enhanced developer productivity. +✅ **Unit Tests**: Essential for building reliable, high-quality applications and preventing regressions. +✅ **Vite Bundler**: For its lightning-fast development server and optimized production builds. +✅ **Our Templates**: Following our provided templates ensures a consistent project structure and easier updates. + +### Freedom to Customize (with Caveats) +While we advocate for our recommended stack, we understand the need for flexibility: +❓ **JavaScript instead of TypeScript**: Possible, but you lose the benefits of static typing. +❓ **Alternative Bundlers (e.g., Webpack)**: May work, but are not officially supported and may require custom configuration. +❓ **Custom Project Structures**: You can adapt the structure, but significant deviations might complicate compatibility with future updates to our `bits-pro` package or templates. + +:::warning Customization Considerations +Deviating significantly from our recommended approach and templates is done at your own discretion. While we aim for broad compatibility, we cannot guarantee that highly customized setups will remain fully compatible with all future updates. +::: + +## Jumpstart Your Project: Available Templates + +To get you started quickly, we provide access to our private GitHub repository containing production-ready templates: +- **React + Three.js (React Three Fiber)**: Ideal for crafting highly interactive 3D experiences. +- **Vanilla TypeScript + Three.js**: A lightweight option for efficient 2D or 3D applications. +- **Vanilla TypeScript + Babylon.js**: Perfect for building detailed 3D product configurators. +*(More templates focusing on other technologies may be added over time.)* + +## Crafting Your User Interface: Guidelines and Best Practices + +Your custom application will render within the designated theme app extension block on the product page. + +### Container & Styling +- **Rendering Space**: Your app operates within the confines of the block. The dimensions of this container are typically controlled by the Shopify theme settings. +- **Custom UI**: You have the freedom to build rich, custom UI components within this embed space. +- **Styling Approach**: For maximum compatibility and to ensure your styles are self-contained, aim to bundle all styles within your JavaScript (e.g., CSS-in-JS, inline styles, or utility classes processed at build time). While breaking out of the container is technically possible, it's generally not recommended as it can lead to conflicts with the theme. +- **Full-Page Experiences**: If needed, the block can be configured (often via theme settings) to occupy a larger portion of the page, or even simulate a full-page experience, depending on your design and theme capabilities. + +### Theme Integration & Independence +- **Minimize Dependencies**: Strive to make your application as theme-independent as possible. Relying heavily on theme-specific CSS classes or DOM structures can lead to your app breaking if the theme is updated. +- **Robust Design**: Design your UI to be self-contained and resilient to changes in the surrounding theme. + +## Configuring the Block: The Role of Metafields + +The BITBYBIT APPS block utilizes Shopify metafields to manage its behavior, particularly for switching between different script sources: + +| Metafield | Purpose | Example Value(s) | Behavior Notes | +|---------------------|----------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------| +| `Public Script URL` | Points to your app's main JavaScript file. | **Development (Preview Mode):** `https://localhost:4173/assets/index-stable.js`
**Production:** `https://cdn.shopify.com/s/files/1/xxx/index-.js?version=` | If this metafield is empty, the block defaults to attempting to embed from `https://localhost:4242` (Local Development Mode). | + +## Important Note: Pricing and Backend Logic + +The BITBYBIT APPS block and its associated workflow are designed **exclusively for frontend Single Page Application (SPA) development.** + +### Frontend Focus +- **Client-Side Rendering**: Your application runs entirely in the user's browser. +- **No Built-in Backend**: We do not provide backend solutions, databases, or server-side rendering capabilities as part of this specific feature. + +### Handling Pricing and Sensitive Operations +- **Secure Price Calculations**: Any logic that determines or modifies product prices **must** be handled securely. This typically requires backend validation to prevent manipulation. +- **Third-Party Apps**: For complex pricing rules or options that affect pricing, we recommend integrating with specialized third-party Shopify apps designed for this purpose. Your frontend application can then interact with these apps or reflect the pricing changes they manage. +- **Custom Backend**: If your project requires custom backend logic (e.g., for saving user configurations, complex calculations, or API integrations), you will need to develop and host this backend infrastructure separately. + +## Understanding the Scope: What's Included (and What's Not) + +It's crucial to understand what this setup provides and its inherent limitations. + +### What This Setup Empowers You To Do: +✅ Develop sophisticated **frontend SPAs** for Shopify product pages. +✅ Receive **real-time data** from product page interactions. +✅ Utilize **professional development tools** and workflows (IDE, Git, testing). +✅ Implement a **seamless deployment process** from local to production. +✅ Leverage **template examples** and best practices to accelerate development. +✅ Build UIs with **inline/bundled styles**, ensuring self-contained components. + +### What This Setup Does NOT Provide Out-of-the-Box: +❌ **Server-Side Rendering (SSR)**: Applications are client-side rendered. +❌ **Backend API Solutions**: No built-in backend for custom server logic or databases. +❌ **Direct Shopify Admin API Integration**: While technically possible to call Shopify APIs from the frontend with appropriate authentication, our templates don't include examples for this, and it requires careful security consideration. +❌ **Database or Persistence Layer**: User-specific data persistence needs a separate backend solution. +❌ **Built-in Secure Pricing Validation**: Price calculations affecting the cart must be validated server-side. + +### For Advanced Use Cases: +If your project demands features like Server-Side Rendering, custom backend APIs, deep Shopify Admin integrations, or a dedicated database, these components will need to be architected and implemented by your team separately. While the BITBYBIT APPS block can host the frontend interface for such systems, the backend infrastructure falls outside the scope of this specific tool. + +## Ready to Build? Getting Started with BITBYBIT APPS + +Embark on your journey to creating stunning product experiences. + +### Prerequisites +- An active **Annual Pro subscription** to the "3D Bits" Shopify app. +- **Access tokens** to our private GitHub repository (provided with the Pro plan). +- Solid knowledge of **TypeScript** and modern web development principles. +- A good understanding of Shopify theme structure and development concepts. + +### Quick Start Guide +1. **Clone a Template**: Choose a suitable template from our private GitHub repository. +2. **Install Dependencies**: Navigate to the project directory and run `npm install`. +3. **Start Local Development**: Execute `npm run dev`. Your app should now be running locally (e.g., on `http://localhost:4242`). +4. **Add the Block**: In your Shopify theme editor, add the **BITBYBIT APPS** block to a product page template. +5. **Preview**: Open a product page where the block is active. You should see your local application embedded and running. +6. **Test Interactivity**: Interact with product options (e.g., change quantity, select variants). Check your browser's developer console; your application (via `bits-pro`) should log these input changes. +7. **Link Metafield (Optional for Preview/Prod)**: For Preview and Production modes, create a dynamic link from the "Public Script URL" setting in the app block to a product metafield. This allows you to manage the script URL per product if needed, or globally. +8. **Begin Building**: Start developing your custom 3D/2D application logic! + +### Deployment Process Recap +1. **Develop & Test Locally**: Use `npm run dev` for rapid iteration. +2. **Preview Changes**: Use `npm run watch` and the local static file server to test a production-like build. +3. **Build for Production**: Run `npm run build` to generate the final optimized bundle. +4. **Upload to Shopify**: Go to Content → Files in your Shopify Admin and upload the generated JavaScript file (usually found in `dist/assets/`). +5. **Update Metafield**: Copy the Shopify CDN URL of the uploaded file and paste it into the `Public Script URL` metafield (or the app block setting linked to it). Your app is now live! + +## We're Here to Help: Support and Resources + +- 📧 **Email Support**: Reach out to us at [info@bitbybit.dev](mailto:info@bitbybit.dev) for direct assistance. +- 💬 **Discord Community**: Join our [Discord Server](https://discord.gg/GSe3VMe) to connect with other developers and the Bitbybit team. +- 🛠️ **Custom Development Services**: Need expert help building your vision? We offer professional development services. + +--- + +*The BITBYBIT APPS block and associated professional development features are available exclusively with the Annual Pro subscription plan for "3D Bits".* \ No newline at end of file diff --git a/docs/learn/3d-bits/theme-app-extensions/bitbybit-preview.md b/docs/learn/3d-bits/theme-app-extensions/bitbybit-preview.md index 7a6d130b..7cb8e401 100644 --- a/docs/learn/3d-bits/theme-app-extensions/bitbybit-preview.md +++ b/docs/learn/3d-bits/theme-app-extensions/bitbybit-preview.md @@ -1,7 +1,7 @@ --- sidebar_position: 1 title: "BITBYBIT PREVIEW Block for Shopify's '3D Bits' App" -sidebar_label: BITBYBIT PREVIEW +sidebar_label: BITBYBIT PREVIEW (BASIC) description: Learn how to use the BITBYBIT PREVIEW theme app extension block in Shopify's "3D Bits" app to embed publicly available Bitbybit project scripts into your product pages. tags: [shopify, 3d-bits] --- diff --git a/docs/learn/3d-bits/theme-app-extensions/bitbybit-runner.md b/docs/learn/3d-bits/theme-app-extensions/bitbybit-runner.md index 096436bb..ca78be4f 100644 --- a/docs/learn/3d-bits/theme-app-extensions/bitbybit-runner.md +++ b/docs/learn/3d-bits/theme-app-extensions/bitbybit-runner.md @@ -1,7 +1,7 @@ --- sidebar_position: 2 title: "BITBYBIT RUNNER Block for Shopify's '3D Bits' App" -sidebar_label: BITBYBIT RUNNER +sidebar_label: BITBYBIT RUNNER (BASIC) description: Learn how to use the BITBYBIT RUNNER theme app extension block in Shopify's "3D Bits" app to integrate parametric 3D models and interactive scripts from Bitbybit into your product pages. tags: [shopify, 3d-bits] --- diff --git a/docs/learn/3d-bits/theme-app-extensions/bitbybit-viewer.md b/docs/learn/3d-bits/theme-app-extensions/bitbybit-viewer.md index 5a8c6fb6..fb83f0bb 100644 --- a/docs/learn/3d-bits/theme-app-extensions/bitbybit-viewer.md +++ b/docs/learn/3d-bits/theme-app-extensions/bitbybit-viewer.md @@ -1,7 +1,7 @@ --- sidebar_position: 3 title: "BITBYBIT VIEWER Block for Shopify's '3D Bits' App" -sidebar_label: BITBYBIT VIEWER +sidebar_label: BITBYBIT VIEWER (BASIC) description: Learn how to use the BITBYBIT VIEWER theme app extension block in Shopify's "3D Bits" app to display static 3D models and configure complex scenes on your product pages without coding. tags: [shopify, 3d-bits] --- From eed319cb7618635136ce0bd296043367af636b5b Mon Sep 17 00:00:00 2001 From: Matas Ubarevicius Date: Tue, 24 Jun 2025 13:35:13 +0300 Subject: [PATCH 09/18] update to docs for pro, some steps taken for parsing assemblies... --- docs/learn/3d-bits/3d-assets/_category_.json | 10 + .../3d-assets/configurators-are-games.md | 58 + docs/learn/3d-bits/3d-assets/intro.md | 34 + docs/learn/3d-bits/faq.md | 2 +- docs/learn/3d-bits/intro.md | 58 +- docs/learn/3d-bits/plans/_category_.json | 10 + .../3d-bits/{ => plans}/subscription-plans.md | 6 +- .../theme-app-extensions/_category_.json | 2 +- .../theme-app-extensions/bitbybit-apps.md | 30 +- docs/learn/3d-bits/tutorials/_category_.json | 2 +- .../hex-shell/src/helpers/init-babylonjs.ts | 124 +- examples/vite/babylonjs/hex-shell/src/main.ts | 148 +- packages/dev/occt-worker/lib/api/occt/io.ts | 2 +- .../bitbybit-dev-occt/bitbybit-dev-occt.d.ts | 19191 ++++++++-------- .../bitbybit-dev-occt/bitbybit-dev-occt.wasm | Bin 12627406 -> 12830237 bytes .../bitbybit-dev-occt/bitbybit-dev-occt.yml | 25 + packages/dev/occt/generate-prod-build-yaml.js | 24 + packages/dev/occt/lib/services/io-assembly.ts | 987 + packages/dev/occt/lib/services/io.ts | 56 + .../dev/occt/lib/services/shapes/wire.test.ts | 27 + 20 files changed, 11330 insertions(+), 9466 deletions(-) create mode 100644 docs/learn/3d-bits/3d-assets/_category_.json create mode 100644 docs/learn/3d-bits/3d-assets/configurators-are-games.md create mode 100644 docs/learn/3d-bits/3d-assets/intro.md create mode 100644 docs/learn/3d-bits/plans/_category_.json rename docs/learn/3d-bits/{ => plans}/subscription-plans.md (96%) create mode 100644 packages/dev/occt/lib/services/io-assembly.ts diff --git a/docs/learn/3d-bits/3d-assets/_category_.json b/docs/learn/3d-bits/3d-assets/_category_.json new file mode 100644 index 00000000..c0205b7b --- /dev/null +++ b/docs/learn/3d-bits/3d-assets/_category_.json @@ -0,0 +1,10 @@ +{ + "label": "3D Assets", + "position": 6, + "link": { + "type": "generated-index", + "title": "3D Assets", + "description": "Learn how to use and prepare various assets to make your product configurators pop.", + "slug": "/3d-bits/3d-assets" + } +} \ No newline at end of file diff --git a/docs/learn/3d-bits/3d-assets/configurators-are-games.md b/docs/learn/3d-bits/3d-assets/configurators-are-games.md new file mode 100644 index 00000000..614483ae --- /dev/null +++ b/docs/learn/3d-bits/3d-assets/configurators-are-games.md @@ -0,0 +1,58 @@ +--- +sidebar_position: 2 +title: "Configurators Are Games" +sidebar_label: Configurators Are Games +description: Learn how to think like a game designer when creating 3D product configurators for Shopify using the "3D Bits" app. +tags: [shopify, 3d-bits, configurators] +--- + +# Configurators Are Games + +**Product configurators are games.** 🎮 🕹️👾 +This mindset has transformed how Shopify merchants approach 3D product pages using the **3D Bits** app. By thinking like a game designer, you can create immersive, interactive experiences that engage customers and showcase your products in unique ways. + +## Why Think Like a Game Designer? + +### Products Solve Problems +Your product isn’t just a “thing.” It fulfills a desire or solves a problem. A gamified product page lets users experience that value interactively. Think of your product page as a level in a game—an invitation for customers to explore, play, and immerse themselves in the experience. With smart storytelling and interactivity, you can make your product page more engaging than visiting a physical store. + +### Speed and Performance Matter +Games aren’t just fun—they’re fast. To ensure your configurator feels amazing, apply these practical tips inspired by game development: + +#### Keep Your 3D Assets Lean +Modern devices can handle a lot, but don’t push it—especially on mobile. Use lightweight, lower-poly models as abstractions of production-grade CAD designs. Learn more about asset preparation in the [3D Assets](./intro.md) section. + +#### Use Levels of Detail (LOD) +Swap in lower-poly models for distant objects in scenes with depth or zoom. This saves performance without sacrificing visuals. + +#### Add Animated Assets +Show your products in action—walking, sitting, swimming, racing or interacting with the environment. Keyframed product animations can bring your scene to life. + +#### Prioritize Textures and Materials +You can fake a lot of depth with smart textures and materials. Avoid modeling every tiny bump or groove. + +#### Compress Assets for Faster Load Times +Use tools like the [Khronos Group GLTF Compressor](https://github.khronos.org/glTF-Compressor-Release/) to reduce file sizes without compromising quality. The **3D Bits** app supports Draco compression for GLTF files. + +## Building Configurators with the "3D Bits" App + +The **3D Bits** app is built around the powerful [BabylonJS](https://learn.bitbybit.dev/learn/npm-packages/babylonjs/intro) game engine, enabling brands to create stunning, smooth, and even playable product experiences. By combining lightweight 3D assets with JSON-based scene configurations, you can create interactive configurators that respond to user input. + +### BITBYBIT VIEWER +The **Viewer Editor** functionality allows you to: +* Customize camera settings. +* Configure lighting and shadows. +* Enable skyboxes for realistic reflections. +* Load multiple 3D models into the same scene. +* React to Shopify product variants (e.g., change models based on selected options). +* Integrate with 3rd party apps such as YMQ Options and others for custom pricing + +Learn how to create scene configurations using the [Viewer Editor tool](../theme-app-extensions/bitbybit-viewer). + +### BITBYBIT RUNNER + +Use runner to access inner features of BabylonJS game engine and code actual TypeScript logic that can immerse your shop visitors. + +## Conclusion + +Thinking like a game designer can elevate your 3D product pages from static displays to immersive experiences. Whether you're showcasing a single model or building a complex configurator, the **3D Bits** app provides the tools to bring your vision to life. For more tips on asset preparation, visit the [3D Assets](./intro.md) section. \ No newline at end of file diff --git a/docs/learn/3d-bits/3d-assets/intro.md b/docs/learn/3d-bits/3d-assets/intro.md new file mode 100644 index 00000000..488a322f --- /dev/null +++ b/docs/learn/3d-bits/3d-assets/intro.md @@ -0,0 +1,34 @@ +--- +sidebar_position: 1 +title: "3D Assets for Shopify's '3D Bits' App" +sidebar_label: Intro +description: Learn about the 3D asset formats supported by the "3D Bits" app and how to prepare your models for interactive configurators and static displays on Shopify. +tags: [shopify, 3d-bits] +--- + +# 3D Assets for Shopify's "3D Bits" App + +The **3D Bits** app supports various 3D asset formats for creating interactive configurators and static displays on Shopify. This section provides an overview of the supported formats and best practices for preparing your models for the web. + +## Recommended Formats + +### GLTF/GLB +The **GLTF/GLB** file format is the most widely supported and optimized for web use. It is lightweight, efficient, and ideal for static models and interactive configurators. + +### Splat Files +For 3D scans, **Splat files** offer an alternative to traditional 3D models. These files can be created using third-party applications and are suitable for showcasing scanned objects. + +## Important Considerations + +### Public Accessibility of Assets +3D assets displayed on your Shopify store are publicly accessible, similar to images. Anyone with technical knowledge can download these files. To protect sensitive information: +* Use lightweight, lower-poly models that abstract production-grade CAD designs. +* Avoid uploading detailed production models directly. + +### Rights and Permissions +Ensure you have the rights to use all parts of your 3D models, including meshes, textures, and other assets. The **3D Bits** app renders the assets you provide, but you are responsible for their legality and compliance. + +## Interactive Configurators: Bridging Assets and Experiences + +Interactive configurators transform static 3D assets into dynamic experiences. By combining lightweight models with JSON-based scene configurations, you can create engaging product presentations that respond to user input. Learn more about configurators in the [Configurators Are Games](./configurators-are-games.md) section. + diff --git a/docs/learn/3d-bits/faq.md b/docs/learn/3d-bits/faq.md index ced51980..c2b3d152 100644 --- a/docs/learn/3d-bits/faq.md +++ b/docs/learn/3d-bits/faq.md @@ -1,7 +1,7 @@ --- sidebar_position: 2 title: "3D Bits Shopify App - FAQ" -sidebar_label: "3D Bits FAQ" +sidebar_label: "FAQ" description: "Frequently asked questions about using the 3D Bits app to integrate 3D models and product configurators into your Shopify store." tags: [shopify, 3d-bits] --- diff --git a/docs/learn/3d-bits/intro.md b/docs/learn/3d-bits/intro.md index 381876d9..d8e7cfa5 100644 --- a/docs/learn/3d-bits/intro.md +++ b/docs/learn/3d-bits/intro.md @@ -8,15 +8,17 @@ tags: [shopify, 3d-bits] # 3D Bits: Interactive 3D Product Visualization for Your Shopify Store -## Revolutionizing 3D E-Commerce on Shopify +## What is 3D Bits? -We are thrilled to announce the development of **"3D Bits"** our dedicated Shopify app designed to bring powerful, interactive 3D product visualization and customization to your e-commerce store. This solution helps your customers visualize custom products in 3D, leading to a more engaging and informative shopping experience. +**3D Bits** is a Shopify app that lets you add interactive 3D product configurators and visualizations to your online store. With 3D Bits, your customers can see and customize products in real-time 3D, making shopping more engaging and helping them understand exactly what they’re buying. -**Experience it Yourself:** -* Check out our **[Demo Store](https://bitbybit-dev-3d-configurators.myshopify.com)**. -* Use the password: `3d-bits-demo` +**Try it out:** +* Visit our **[Demo Store](https://bitbybit-dev-3d-configurators.myshopify.com)** +* Use password: `3d-bits-demo` -The web has evolved significantly. While traditional e-commerce relied on static images, today's complex and customizable products demand a richer presentation. "3D Bits" empowers Shopify merchants to showcase their products in interactive 3D, allowing buyers to explore variations and understand configuration options in real-time. +## Why Use 3D Bits? + +Traditional online stores use static images, but modern shoppers want to see products from every angle and try out different options. 3D Bits makes this possible by letting you build interactive 3D experiences for your products—no advanced coding required.
+## What Our Customers Say + +
+ +
+ +### "An outstanding app for 3D configuration and beyond! It's intuitive, fully customizable, and backed by exceptional support from Matas. You can seamlessly integrate 3D models into Shopify product media and dynamically reflect different variants — from accessories to color changes and more. A definite must-have!" + +**Nicolas Quendez, Co-Founder & CEO** +[![Kahe E-Nautic](https://ik.imagekit.io/bitbybit/app/assets/start/shopify/kahe-enautic.webp)](https://kahe-nautic.com/) + +
+ +
+ +### "I wasn't expecting to be this impressed. This guy delivers real value with authenticity, quality, and professionalism. Every interaction we've had has been smooth, straightforward, and reliable. What you see is exactly what you get, just solid, well-executed work with no unnecessary noise. This is the kind of service I'd recommend without hesitation. I'll definitely continue working with Matas." + +**Francesco, Founder & CEO** +[![Ironside Armour](https://ik.imagekit.io/bitbybit/app/assets/start/shopify/ironside-armour.webp)](https://ironsidearmour.com) + +
+ +
+ + ## How Does 3D Bits Work? 3D Bits is built on the [bitbybit.dev](https://bitbybit.dev) platform, which provides powerful 3D and CAD tools for both beginners and professionals. You can: diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css index 6e0e38ef..b711373b 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -57,4 +57,47 @@ .category-icon-small { width: 100px; +} + +.testimonials-section { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 2rem; + margin: 2rem 0; +} + +.testimonial-item { + background: #34383e; + padding: 1.5rem; + border-radius: 8px; + color: #f0cebb; + border-left: 4px solid #f0cebb; + display: flex; + flex-direction: column; + height: 100%; +} + +.testimonial-item h3 { + font-style: italic; + color: white; + font-weight: 400; + margin-bottom: 1rem; + line-height: 1.6; + font-size: 1rem; + flex-grow: 1; +} + +.testimonial-item img { + margin-top: 10px; + border-radius: 4px; + width: 160px; + object-fit: contain; + align-self: flex-start; +} + +@media (max-width: 768px) { + .testimonials-section { + grid-template-columns: 1fr; + gap: 1rem; + } } \ No newline at end of file diff --git a/docs/src/theme/Layout/index.tsx b/docs/src/theme/Layout/index.tsx index b9407869..69aef59f 100644 --- a/docs/src/theme/Layout/index.tsx +++ b/docs/src/theme/Layout/index.tsx @@ -11,12 +11,24 @@ export default function LayoutWrapper(props: Props): ReactNode { const [trackingInitialized, setTrackingInitialized] = useState(false); + // Check if running in iframe + const isInIframe = ExecutionEnvironment.canUseDOM && window.parent !== window; + // Check if cookies are disabled via query parameter - const isCookieDisabled = ExecutionEnvironment.canUseDOM && + const isCookieDisabledByQuery = ExecutionEnvironment.canUseDOM && new URLSearchParams(window.location.search).get("cookies") === "disabled"; + // Set decline cookie if disabled by query parameter (but not in iframe) + if (isCookieDisabledByQuery && ExecutionEnvironment.canUseDOM && !isInIframe) { + Cookies.set("bitbybit-docs-cookie-consent", "false", { expires: 365 }); + } + + // Check if cookies are disabled (by query, iframe, or previous decline) + const cookieConsent = Cookies.get("bitbybit-docs-cookie-consent"); + const isCookieDisabled = isCookieDisabledByQuery || cookieConsent === "false" || isInIframe; + const initializeGATracking = () => { - if (ExecutionEnvironment.canUseDOM && !window.gtag) { + if (ExecutionEnvironment.canUseDOM && !window.gtag && !isCookieDisabled) { const script = document.createElement("script"); script.src = `https://www.googletagmanager.com/gtag/js?id=${GA_MEASUREMENT_ID}`; script.async = true; @@ -35,8 +47,6 @@ export default function LayoutWrapper(props: Props): ReactNode { } }; - const cookieConsent = Cookies.get("bitbybit-docs-cookie-consent"); - if (cookieConsent === "true" && trackingInitialized === false && !isCookieDisabled) { initializeGATracking(); setTrackingInitialized(true); @@ -45,7 +55,7 @@ export default function LayoutWrapper(props: Props): ReactNode { return ( <> - {!isCookieDisabled && ( + {!isCookieDisabled && !cookieConsent && ( Date: Mon, 11 Aug 2025 14:42:42 +0300 Subject: [PATCH 14/18] added article on preparing gltf assets for 3D Bits --- docs/docusaurus.config.ts | 17 --- .../3d-assets/configurators-are-games.md | 2 +- .../learn/3d-bits/3d-assets/preparing-gltf.md | 109 ++++++++++++++++++ docs/package.json | 1 - 4 files changed, 110 insertions(+), 19 deletions(-) create mode 100644 docs/learn/3d-bits/3d-assets/preparing-gltf.md diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts index d3ca5100..affc28e7 100644 --- a/docs/docusaurus.config.ts +++ b/docs/docusaurus.config.ts @@ -30,23 +30,6 @@ const config: Config = { defaultLocale: "en", locales: ["en"], }, - plugins: [ - [ - "@docusaurus/plugin-client-redirects", - { - redirects: [ - { - from: "/learn/npm-packages/start-with-three-js", - to: "/learn/npm-packages/threejs/start-with-three-js", - }, - { - from: "/learn/npm-packages/start-with-babylon-js", - to: "/learn/npm-packages/babylonjs/start-with-babylon-js", - }, - ], - } - ], - ], presets: [ [ "classic", diff --git a/docs/learn/3d-bits/3d-assets/configurators-are-games.md b/docs/learn/3d-bits/3d-assets/configurators-are-games.md index 614483ae..7ea14c54 100644 --- a/docs/learn/3d-bits/3d-assets/configurators-are-games.md +++ b/docs/learn/3d-bits/3d-assets/configurators-are-games.md @@ -55,4 +55,4 @@ Use runner to access inner features of BabylonJS game engine and code actual Typ ## Conclusion -Thinking like a game designer can elevate your 3D product pages from static displays to immersive experiences. Whether you're showcasing a single model or building a complex configurator, the **3D Bits** app provides the tools to bring your vision to life. For more tips on asset preparation, visit the [3D Assets](./intro.md) section. \ No newline at end of file +Thinking like a game designer can elevate your 3D product pages from static displays to immersive experiences. Whether you're showcasing a single model or building a complex configurator, the **3D Bits** app provides the tools to bring your vision to life. For more tips on asset preparation, visit the [3D Assets](./intro.md) section. diff --git a/docs/learn/3d-bits/3d-assets/preparing-gltf.md b/docs/learn/3d-bits/3d-assets/preparing-gltf.md new file mode 100644 index 00000000..ce6bd3ef --- /dev/null +++ b/docs/learn/3d-bits/3d-assets/preparing-gltf.md @@ -0,0 +1,109 @@ +--- +sidebar_position: 3 +title: "Preparing GLTF 3D Assets" +sidebar_label: Preparing GLTF 3D Assets +description: Learn about the best practices and solutions when preparing 3D GLTF assets for your 3D configurators. +tags: [shopify, 3d-bits, configurators] +image: https://ik.imagekit.io/bitbybit/app/assets/start/shopify/preparing-gltf-assets/preparing-gltf-assets-for-3d-bits-app-for-shopify.jpeg +--- + +# Where to Start + +The first step in preparing 3D assets for your configurator is having 3D models of your products. + +If your brand already designs and manufactures physical goods, there’s a good chance you already have detailed, good-looking 3D models on hand. Resellers can often get these from manufacturers - many keep accurate CAD files of their products for engineering or marketing purposes. Not all manufacturers will share them, though, so sometimes you’ll need to commission a 3D artist or designer to create them from scratch in professional CAD software. Some AI tools also exist, which can create 3D assets from 2D images, but in many cases they are not optimised for speed or quality, this may however change in the near future. + +![Preparing GLTF Assets](https://ik.imagekit.io/bitbybit/app/assets/start/shopify/preparing-gltf-assets/preparing-gltf-assets-for-3d-bits-app-for-shopify.jpeg "Learn How to prepare GLTF assets") + +# What Formats Merchants Usually Have + +If you do manage to get existing 3D models, they’ll most likely come in formats such as **STEP (ISO 10303)**, **IGES**, or other proprietary CAD formats. These are common in professional design workflows because they use something called **BRep** - short for Boundary Representation - to store geometry. Usually people use software packages such as SolidWorks, Fusion 360, Catia, Rhino, OpenCascade and similar modeling software packages to create these assets. + +BRep is very different from polygonal meshes. Instead of a collection of triangles, vertices, and indices, a BRep model is a precise mathematical description: NURBS curves, faces, shells, and solids define the surfaces and edges of the object. This is great for manufacturing and engineering, but to use these models on the web, you’ll need to **triangulate** them into formats like GLTF, OBJ, FBX, 3MF, or STL. + +# From BRep to GLTF + +Not all CAD or BRep editors can export directly to GLTF. In many cases, you’ll need to first export to an intermediate format such as FBX or STL, bring that into Blender, and then export to GLTF. Another common challenge is that CAD exports often lack proper material and texture data. If that’s the case, you’ll have to apply materials and textures inside Blender, which can be time-consuming but is sometimes unavoidable without some additional 3rd party plugins. + +When you do triangulate, you’ll usually be able to choose how dense the mesh will be. This is a crucial decision: fewer triangles mean the GPU can render your model much faster. The goal is to create low-poly models that still look good. Don’t expect a browser to smoothly handle millions of triangles - especially on older devices. Even high-end GPUs will struggle if you push them too far. Designing a configurator is a lot like designing a video game: performance matters just as much as visual quality. We go deeper into this mindset in [Configurators Are Games](./configurators-are-games.md). + +# Editing Triangulated Models + +Once you have a triangulated model, you’ll probably need to make adjustments. We recommend Blender for this. It’s free, open source, and maintained by some of the most experienced 3D professionals in the industry. Of course, it’s not the only option - commercial tools like 3ds Max can also handle triangulated models perfectly well. + +[![Blender Logo](https://ik.imagekit.io/bitbybit/app/assets/start/shopify/preparing-gltf-assets/blender-logo.jpg "Blender Logo")](https://blender.org) +[Download Blender Here](https://www.blender.org/download/) + +# Understanding Meshes + +In the context of 3D assets, a “mesh” is simply a triangulated section of your model assembly. It’s made up of triangles, each defined by three points in space. You can read more about meshes [here](https://en.wikipedia.org/wiki/Polygon_mesh), but for now, think of them as the building blocks that make up the visible geometry of your model. + +In order to understand how many triangles or polygon faces your model contains, you should enable "Scene Stats" in Blender. Click right mouse button in the bottom right corner of Blender and enable it. + +![Understand how many triangles your 3D assets contain in Blender](https://ik.imagekit.io/bitbybit/app/assets/start/shopify/preparing-gltf-assets/blender-scene-stats.jpeg "Blender scene stats") +*Enable Scene stats to understand how many triangles your 3D assets contain in Blender.* + +# GLTF and Why We Use It + +GLTF has become one of the most widely supported formats for delivering 3D assets online. It’s designed to be efficient to load, transmit, and render in real time. You can read more about it on the [Khronos website](https://www.khronos.org/gltf/), but the short version is: if you’re delivering interactive 3D experiences on the web, GLTF is the format you want to be working with. Blender supports exporting to GLTF directly, and once you’ve done that, you can upload the file to Shopify’s CDN for use with the 3D Bits app. + +# Keeping Performance in Mind + +One of the biggest performance killers in a 3D scene is having too many separate meshes. Ideally, your mesh count should match the number of materials in your model. There are valid reasons to split meshes - maybe you need to hide or show parts independently while configuring - but in general, the fewer meshes you have, the better. + +The reason comes down to something called **draw calls**. Every mesh in your scene requires a separate draw call to be rendered, and this happens for every frame. If you want a smooth 60 frames per second, you have roughly 16 milliseconds to render each frame. Too many draw calls, and you’ll exceed that budget quickly. + +If you’re working in CAD, you can often merge parts by material before exporting. In Blender, you can select multiple meshes and use **Object → Join** to combine them into a single mesh. The specifics vary from one tool to another, but the principle is always the same: merge what you can. + +![Join objects in Blender](https://ik.imagekit.io/bitbybit/app/assets/start/shopify/preparing-gltf-assets/blender-join-mesh-objects.jpeg "Join separate mesh objects together in Blender") +*Join separate mesh objects together in Blender.* + +# Textures and Why They Matter + +Textures are the 2D images you wrap around your 3D geometry to add surface detail. Just like images on a website, textures should be optimized. Larger textures mean more GPU memory usage and slower rendering. + +A good rule of thumb: make your textures as small as possible without losing visible quality. If your model will only ever be seen from a certain distance, you don’t need a 4K texture. In fact, 256×256 or 512×512 is plenty for most surfaces. Only use 4K textures when absolutely necessary. + +We also recommend using **KTX** texture compression inside GLTF files. If you have a repeating surface pattern, like a brick wall, it’s much faster to tile a small texture across the surface than to load a huge image that covers the whole thing in one go. + +# Compression for Faster Loads + +When a customer visits your store, their browser has to download everything: HTML, CSS, JavaScript, images, videos, and, in our case, 3D models. The bigger your 3D files, the longer they’ll take to load. And if loading takes too long, some visitors won’t stick around. + +The good news is that GLTF files compress very well. You should always export to **GLB** - the binary version of GLTF - since it’s much smaller than the text-based version. Blender’s GLTF exporter can apply compression during export. + +![Blender Compression Options](https://ik.imagekit.io/bitbybit/app/assets/start/shopify/preparing-gltf-assets/blender-compress.jpeg "Blender Compression Options") + +For even more options, try the free [Khronos GLTF Compressor](https://github.khronos.org/glTF-Compressor-Release/) and enable **Draco compression**. 3D Bits can decompress Draco-compressed files without issue. This tool can also compress textures and save them in formats like KTX. + +Khronos compressor tool also will show you the split screen view of original vs compressed file with a nice separator line - it makes it super easy to compare before and after quality of the model. + +![Khronos GLTF Compressor](https://ik.imagekit.io/bitbybit/app/assets/start/shopify/preparing-gltf-assets/khronos-gltf-compressor.jpeg "Khronos compressor tool comparison mode") +*Khronos compressor allows to compare original model with compressed.* + +[Read More About The Compressor](https://www.khronos.org/blog/optimize-3d-assets-with-khronos-new-gltf-compressor-tool) + +# Hosting on Shopify’s CDN + +Once your file is ready, upload it to Shopify. Go to **Content → Files**, drag and drop your GLTF or GLB, and copy its URL if you want to use it in 3D Bits. Using Shopify’s CDN ensures your file is cached on servers close to your customers. If someone in Germany loads your product page, Shopify will serve the file from a nearby server, cutting down load times. + +Shopify has a 20 MB file size limit, but that’s rarely an issue with well-optimized assets. If your model is bigger than that, you can split it into multiple files - 3D Bits can load several at once. If you decide to use your own CDN instead, make sure the files are publicly accessible. + +# Reusing Parts with Instancing + +If your model contains repeated parts - like bolts, wheels, or identical furniture sets - it’s best to save that part as a separate GLTF file and then load it once in 3D Bits, placing **instances** wherever needed. Instancing means the GPU loads the geometry only once and reuses it multiple times in the scene, which is far more efficient than loading duplicate meshes. + +# Testing Before You Go Live + +GLTF files need to be valid to be properly loaded into any 3D software, 3D Bits is no exception. That is why you should validate your files for any potential issues. We recommend using [Khronos GLTF validator](https://github.khronos.org/glTF-Validator/). Just upload your model and it will show if your file contains errors or potential improvements. + +3D Bits is built on top of BabylonJS, which comes with a fantastic [Sandbox Viewer](https://sandbox.babylonjs.com/). Drop your GLTF file in there to preview it before uploading. You’ll spot missing textures, strange triangulation issues, or other export problems immediately. If you see a problem in the Sandbox, you’ll likely see it in 3D Bits as well. + +![BabylonJS Sandbox](https://ik.imagekit.io/bitbybit/app/assets/start/shopify/preparing-gltf-assets/babylonjs-sandbox.jpeg "BabylonJS Sandbox can be used to test loading your compressed 3D assets, inspect contents") +*BabylonJS Sandbox can be used to test loading your compressed 3D assets, inspect contents.* + +# Wrapping Up + +Preparing 3D assets for the web is a balancing act between fidelity, file size, and performance. You might start with a pristine engineering model, but to make it run smoothly in a browser, you’ll need to simplify geometry, optimize textures, merge meshes, and compress files. + +This guide has walked through the journey from CAD to GLTF, explained why mesh count and texture size matter, and shown you how to host and test your assets before launch. Every product and every merchant is different, but the principles are the same: keep things light, keep them efficient, and your customers will have a faster, smoother, and more engaging 3D experience. diff --git a/docs/package.json b/docs/package.json index bd6b078b..6daa2872 100644 --- a/docs/package.json +++ b/docs/package.json @@ -28,7 +28,6 @@ "@docusaurus/module-type-aliases": "3.7.0", "@docusaurus/tsconfig": "3.7.0", "@docusaurus/types": "3.7.0", - "@docusaurus/plugin-client-redirects": "3.7.0", "typescript": "~5.6.2" }, "browserslist": { From 75021f7f43e2a4653594ca018e1fdb66c60908b3 Mon Sep 17 00:00:00 2001 From: Matas Ubarevicius Date: Mon, 11 Aug 2025 15:06:50 +0300 Subject: [PATCH 15/18] added freecad to article on gltf preparation --- docs/learn/3d-bits/3d-assets/preparing-gltf.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/learn/3d-bits/3d-assets/preparing-gltf.md b/docs/learn/3d-bits/3d-assets/preparing-gltf.md index ce6bd3ef..1d9cf72c 100644 --- a/docs/learn/3d-bits/3d-assets/preparing-gltf.md +++ b/docs/learn/3d-bits/3d-assets/preparing-gltf.md @@ -17,7 +17,7 @@ If your brand already designs and manufactures physical goods, there’s a good # What Formats Merchants Usually Have -If you do manage to get existing 3D models, they’ll most likely come in formats such as **STEP (ISO 10303)**, **IGES**, or other proprietary CAD formats. These are common in professional design workflows because they use something called **BRep** - short for Boundary Representation - to store geometry. Usually people use software packages such as SolidWorks, Fusion 360, Catia, Rhino, OpenCascade and similar modeling software packages to create these assets. +If you do manage to get existing 3D models, they’ll most likely come in formats such as **STEP (ISO 10303)**, **IGES**, or other proprietary CAD formats. These are common in professional design workflows because they use something called **BRep** - short for Boundary Representation - to store geometry. Usually people use software packages such as FreeCAD, SolidWorks, Fusion 360, Catia, Rhino, OpenCascade and similar modeling software packages to create these assets. BRep is very different from polygonal meshes. Instead of a collection of triangles, vertices, and indices, a BRep model is a precise mathematical description: NURBS curves, faces, shells, and solids define the surfaces and edges of the object. This is great for manufacturing and engineering, but to use these models on the web, you’ll need to **triangulate** them into formats like GLTF, OBJ, FBX, 3MF, or STL. From 1ff756eae95595aa7bd5908e31f455872dc9ec41 Mon Sep 17 00:00:00 2001 From: Matas Ubarevicius Date: Wed, 20 Aug 2025 22:36:06 +0300 Subject: [PATCH 16/18] update languages, babylonjs and threejs versions --- docs/learn/runners/intro.mdx | 4 ++-- examples/react/threejs/vase/package.json | 2 +- .../threejs/lite/external-scene/index.html | 4 ++-- examples/runner/threejs/lite/simple/index.html | 4 ++-- .../runner/threejs/lite/threejs-logo/index.html | 4 ++-- .../babylonjs/hex-house-concept/package.json | 2 +- examples/vite/babylonjs/hex-shell/package.json | 2 +- .../vite/babylonjs/starter-template/package.json | 2 +- examples/vite/threejs/cup/package.json | 2 +- .../vite/threejs/hex-house-concept/package.json | 2 +- examples/vite/threejs/hex-shell/package.json | 2 +- .../vite/threejs/starter-template/package.json | 2 +- examples/webpack/threejs/package.json | 2 +- languages/ar.json | 16 +++++++++++++++- languages/bn.json | 16 +++++++++++++++- languages/de.json | 16 +++++++++++++++- languages/en.json | 16 +++++++++++++++- languages/es.json | 16 +++++++++++++++- languages/fr.json | 16 +++++++++++++++- languages/hi.json | 16 +++++++++++++++- languages/id.json | 16 +++++++++++++++- languages/lt.json | 16 +++++++++++++++- languages/pt.json | 16 +++++++++++++++- languages/ru.json | 16 +++++++++++++++- languages/uk.json | 16 +++++++++++++++- languages/zh-hans.json | 16 +++++++++++++++- packages/dev/babylonjs/package.json | 10 +++++----- packages/dev/threejs/package.json | 4 ++-- 28 files changed, 219 insertions(+), 37 deletions(-) diff --git a/docs/learn/runners/intro.mdx b/docs/learn/runners/intro.mdx index 2fadc9ac..09dac698 100644 --- a/docs/learn/runners/intro.mdx +++ b/docs/learn/runners/intro.mdx @@ -587,8 +587,8 @@ function hideSpinner() { diff --git a/examples/react/threejs/vase/package.json b/examples/react/threejs/vase/package.json index 16f79cb9..5f91e1a4 100644 --- a/examples/react/threejs/vase/package.json +++ b/examples/react/threejs/vase/package.json @@ -11,7 +11,7 @@ "@types/jest": "29.5.1", "@types/node": "20.2.5", "@types/react": "18.2.7", - "@types/three": "0.176.0", + "@types/three": "0.179.1", "@types/react-dom": "18.2.4", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/examples/runner/threejs/lite/external-scene/index.html b/examples/runner/threejs/lite/external-scene/index.html index ab39ea18..6eb90f90 100644 --- a/examples/runner/threejs/lite/external-scene/index.html +++ b/examples/runner/threejs/lite/external-scene/index.html @@ -13,8 +13,8 @@ diff --git a/examples/runner/threejs/lite/simple/index.html b/examples/runner/threejs/lite/simple/index.html index 6d997aa1..34a0fe7e 100644 --- a/examples/runner/threejs/lite/simple/index.html +++ b/examples/runner/threejs/lite/simple/index.html @@ -13,8 +13,8 @@ diff --git a/examples/runner/threejs/lite/threejs-logo/index.html b/examples/runner/threejs/lite/threejs-logo/index.html index e3998f47..27eff9d6 100644 --- a/examples/runner/threejs/lite/threejs-logo/index.html +++ b/examples/runner/threejs/lite/threejs-logo/index.html @@ -27,8 +27,8 @@ diff --git a/examples/vite/babylonjs/hex-house-concept/package.json b/examples/vite/babylonjs/hex-house-concept/package.json index ed6b9a3c..c1c77f89 100644 --- a/examples/vite/babylonjs/hex-house-concept/package.json +++ b/examples/vite/babylonjs/hex-house-concept/package.json @@ -15,6 +15,6 @@ "devDependencies": { "typescript": "~5.8.3", "vite": "^6.3.2", - "@types/three": "0.176.0" + "@types/three": "0.179.1" } } diff --git a/examples/vite/babylonjs/hex-shell/package.json b/examples/vite/babylonjs/hex-shell/package.json index ed6b9a3c..c1c77f89 100644 --- a/examples/vite/babylonjs/hex-shell/package.json +++ b/examples/vite/babylonjs/hex-shell/package.json @@ -15,6 +15,6 @@ "devDependencies": { "typescript": "~5.8.3", "vite": "^6.3.2", - "@types/three": "0.176.0" + "@types/three": "0.179.1" } } diff --git a/examples/vite/babylonjs/starter-template/package.json b/examples/vite/babylonjs/starter-template/package.json index f89e1d3a..ec08eb08 100644 --- a/examples/vite/babylonjs/starter-template/package.json +++ b/examples/vite/babylonjs/starter-template/package.json @@ -14,6 +14,6 @@ "devDependencies": { "typescript": "~5.8.3", "vite": "^6.3.2", - "@types/three": "0.176.0" + "@types/three": "0.179.1" } } diff --git a/examples/vite/threejs/cup/package.json b/examples/vite/threejs/cup/package.json index fe94371a..fdf3ee3d 100644 --- a/examples/vite/threejs/cup/package.json +++ b/examples/vite/threejs/cup/package.json @@ -15,6 +15,6 @@ "devDependencies": { "typescript": "~5.8.3", "vite": "^6.3.2", - "@types/three": "0.176.0" + "@types/three": "0.179.1" } } diff --git a/examples/vite/threejs/hex-house-concept/package.json b/examples/vite/threejs/hex-house-concept/package.json index fe94371a..fdf3ee3d 100644 --- a/examples/vite/threejs/hex-house-concept/package.json +++ b/examples/vite/threejs/hex-house-concept/package.json @@ -15,6 +15,6 @@ "devDependencies": { "typescript": "~5.8.3", "vite": "^6.3.2", - "@types/three": "0.176.0" + "@types/three": "0.179.1" } } diff --git a/examples/vite/threejs/hex-shell/package.json b/examples/vite/threejs/hex-shell/package.json index fe94371a..fdf3ee3d 100644 --- a/examples/vite/threejs/hex-shell/package.json +++ b/examples/vite/threejs/hex-shell/package.json @@ -15,6 +15,6 @@ "devDependencies": { "typescript": "~5.8.3", "vite": "^6.3.2", - "@types/three": "0.176.0" + "@types/three": "0.179.1" } } diff --git a/examples/vite/threejs/starter-template/package.json b/examples/vite/threejs/starter-template/package.json index 5e2f8033..a2b1c550 100644 --- a/examples/vite/threejs/starter-template/package.json +++ b/examples/vite/threejs/starter-template/package.json @@ -14,6 +14,6 @@ "devDependencies": { "typescript": "~5.8.3", "vite": "^6.3.2", - "@types/three": "0.176.0" + "@types/three": "0.179.1" } } diff --git a/examples/webpack/threejs/package.json b/examples/webpack/threejs/package.json index b45d26bb..9c650250 100644 --- a/examples/webpack/threejs/package.json +++ b/examples/webpack/threejs/package.json @@ -16,7 +16,7 @@ "lil-gui": "0.20.0" }, "devDependencies": { - "@types/three": "0.176.0", + "@types/three": "0.179.1", "copy-webpack-plugin": "12.0.2", "file-loader": "6.2.0", "html-webpack-plugin": "5.6.3", diff --git a/languages/ar.json b/languages/ar.json index a5831662..cb360403 100644 --- a/languages/ar.json +++ b/languages/ar.json @@ -5356,5 +5356,19 @@ "bitbybit.occt.shapes.face.fromBaseTriangle_description": "ينشئ وجهًا من تعريف المثلث", "bitbybit.occt.shapes.face.fromBaseMesh": "وجوه من الشبكة الأساسية", "bitbybit.occt.shapes.face.fromBaseMesh_description": "ينشئ وجوهًا من تعريف الشبكة", - "fromRightHanded": "من اليد اليمنى" + "fromRightHanded": "من اليد اليمنى", + "bitbybit.advanced.text3d.createWithUrl": "نص مع رابط", + "createWithUrl": "نص مع رابط", + "bitbybit.advanced.text3d.createWithUrl_description": "ينشئ نصًا ثلاثي الأبعاد باستخدام رابط URL للخط. هذا مفيد عندما تريد استخدام خط مخصص غير مدرج في المكتبة. سيتم تحميل الخط من الرابط المقدم واستخدامه لإنشاء النص ثلاثي الأبعاد. تأكد من أن الخطوط لا تحتوي على تقاطع ذاتي وأحرف سيئة أخرى - هذه مشكلة شائعة في الخطوط المخصصة. تنسيقات الخطوط المدعومة هي: ttf، otf، woff. يرجى ملاحظة أن Woff2 غير مدعوم بواسطة opentype.js لأنه تنسيق مضغوط.", + "fontUrl": "رابط الخط", + "bitbybit.advanced.text3d.createTextOnFaceUrl": "نص على وجه مع رابط", + "createTextOnFaceUrl": "نص على وجه مع رابط", + "bitbybit.advanced.text3d.createTextOnFaceUrl_description": "ينشئ نصًا ثلاثي الأبعاد على الوجه باستخدام رابط URL للخط. هذا مفيد عندما تريد استخدام خط مخصص غير مدرج في المكتبة. سيتم تحميل الخط من الرابط المقدم واستخدامه لإنشاء النص ثلاثي الأبعاد. تأكد من أن الخطوط لا تحتوي على تقاطع ذاتي وأحرف سيئة أخرى - هذه مشكلة شائعة في الخطوط المخصصة. تنسيقات الخطوط المدعومة هي: ttf، otf، woff. يرجى ملاحظة أن Woff2 غير مدعوم بواسطة opentype.js لأنه تنسيق مضغوط.", + "bitbybit.advanced.text3d.createTextsOnFaceUrl": "نصوص على وجه مع رابط", + "createTextsOnFaceUrl": "نصوص على وجه مع رابط", + "bitbybit.advanced.text3d.createTextsOnFaceUrl_description": "ينشئ نصوصًا ثلاثية الأبعاد على الوجه من تعريفات روابط متعددة. هذا مفيد عندما تريد استخدام خط مخصص غير مدرج في المكتبة. سيتم تحميل الخط من الرابط المقدم واستخدامه لإنشاء النص ثلاثي الأبعاد. تأكد من أن الخطوط لا تحتوي على تقاطع ذاتي وأحرف سيئة أخرى - هذه مشكلة شائعة في الخطوط المخصصة. تنسيقات الخطوط المدعومة هي: ttf، otf، woff. يرجى ملاحظة أن Woff2 غير مدعوم بواسطة opentype.js لأنه تنسيق مضغوط.", + "Text3DFaceDefinitionUrlDto[]": "Text3DFaceDefinitionUrlDto[]", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl": "تعريف نص ثلاثي الأبعاد على وجه مع رابط", + "definition3dTextOnFaceUrl": "تعريف نص ثلاثي الأبعاد على وجه مع رابط", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl_description": "ينشئ نصًا ثلاثي الأبعاد سيتم استخدامه في تعريف رابط الوجه. هذا مفيد عندما تريد استخدام خط مخصص غير مدرج في المكتبة. سيتم تحميل الخط من الرابط المقدم واستخدامه لإنشاء النص ثلاثي الأبعاد. تأكد من أن الخطوط لا تحتوي على تقاطع ذاتي وأحرف سيئة أخرى - هذه مشكلة شائعة في الخطوط المخصصة. تنسيقات الخطوط المدعومة هي: ttf، otf، woff. يرجى ملاحظة أن Woff2 غير مدعوم بواسطة opentype.js لأنه تنسيق مضغوط." } \ No newline at end of file diff --git a/languages/bn.json b/languages/bn.json index c91eb485..ee88e8ae 100644 --- a/languages/bn.json +++ b/languages/bn.json @@ -5356,5 +5356,19 @@ "bitbybit.occt.shapes.face.fromBaseTriangle_description": "ত্রিভুজ সংজ্ঞা থেকে ফেস তৈরি করে", "bitbybit.occt.shapes.face.fromBaseMesh": "বেস মেশ থেকে ফেস", "bitbybit.occt.shapes.face.fromBaseMesh_description": "মেশ সংজ্ঞা থেকে ফেস তৈরি করে", - "fromRightHanded": "ডান-হাতি থেকে" + "fromRightHanded": "ডান-হাতি থেকে", + "bitbybit.advanced.text3d.createWithUrl": "ইউআরএল সহ টেক্সট", + "createWithUrl": "ইউআরএল সহ টেক্সট", + "bitbybit.advanced.text3d.createWithUrl_description": "একটি ফন্ট ইউআরএল দিয়ে একটি ৩ডি টেক্সট তৈরি করে। এটি উপকারী যখন আপনি একটি কাস্টম ফন্ট ব্যবহার করতে চান যা লাইব্রেরিতে অন্তর্ভুক্ত নয়। প্রদত্ত ইউআরএল থেকে ফন্টটি লোড করা হবে এবং ৩ডি টেক্সট তৈরি করতে ব্যবহৃত হবে। নিশ্চিত করুন যে ফন্টগুলিতে স্ব-ছেদ এবং অন্যান্য খারাপ অক্ষর নেই - এটি কাস্টম ফন্টগুলির সাথে একটি সাধারণ সমস্যা। সমর্থিত ফন্ট ফরম্যাটগুলি হল: ttf, otf, woff। দয়া করে মনে রাখবেন যে Woff2 opentype.js দ্বারা সমর্থিত নয় কারণ এটি একটি সংকুচিত ফরম্যাট।", + "fontUrl": "ফন্ট ইউআরএল", + "bitbybit.advanced.text3d.createTextOnFaceUrl": "ফেস ইউআরএলে টেক্সট", + "createTextOnFaceUrl": "ফেস ইউআরএলে টেক্সট", + "bitbybit.advanced.text3d.createTextOnFaceUrl_description": "একটি ফন্ট ইউআরএল ব্যবহার করে ফেসের উপর একটি ৩ডি টেক্সট তৈরি করে। এটি উপকারী যখন আপনি একটি কাস্টম ফন্ট ব্যবহার করতে চান যা লাইব্রেরিতে অন্তর্ভুক্ত নয়। প্রদত্ত ইউআরএল থেকে ফন্টটি লোড করা হবে এবং ৩ডি টেক্সট তৈরি করতে ব্যবহৃত হবে। নিশ্চিত করুন যে ফন্টগুলিতে স্ব-ছেদ এবং অন্যান্য খারাপ অক্ষর নেই - এটি কাস্টম ফন্টগুলির সাথে একটি সাধারণ সমস্যা। সমর্থিত ফন্ট ফরম্যাটগুলি হল: ttf, otf, woff। দয়া করে মনে রাখবেন যে Woff2 opentype.js দ্বারা সমর্থিত নয় কারণ এটি একটি সংকুচিত ফরম্যাট।", + "bitbybit.advanced.text3d.createTextsOnFaceUrl": "ফেস ইউআরএলে টেক্সটসমূহ", + "createTextsOnFaceUrl": "ফেস ইউআরএলে টেক্সটসমূহ", + "bitbybit.advanced.text3d.createTextsOnFaceUrl_description": "একাধিক ইউআরএল সংজ্ঞা থেকে ফেসের উপর ৩ডি টেক্সট তৈরি করে। এটি উপকারী যখন আপনি একটি কাস্টম ফন্ট ব্যবহার করতে চান যা লাইব্রেরিতে অন্তর্ভুক্ত নয়। প্রদত্ত ইউআরএল থেকে ফন্টটি লোড করা হবে এবং ৩ডি টেক্সট তৈরি করতে ব্যবহৃত হবে। নিশ্চিত করুন যে ফন্টগুলিতে স্ব-ছেদ এবং অন্যান্য খারাপ অক্ষর নেই - এটি কাস্টম ফন্টগুলির সাথে একটি সাধারণ সমস্যা। সমর্থিত ফন্ট ফরম্যাটগুলি হল: ttf, otf, woff। দয়া করে মনে রাখবেন যে Woff2 opentype.js দ্বারা সমর্থিত নয় কারণ এটি একটি সংকুচিত ফরম্যাট।", + "Text3DFaceDefinitionUrlDto[]": "Text3DFaceDefinitionUrlDto[]", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl": "ফেস ইউআরএলে ৩ডি টেক্সটের সংজ্ঞা", + "definition3dTextOnFaceUrl": "ফেস ইউআরএলে ৩ডি টেক্সটের সংজ্ঞা", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl_description": "৩ডি টেক্সট তৈরি করে যা ফেস ইউআরএল সংজ্ঞায় ব্যবহৃত হবে। এটি উপকারী যখন আপনি একটি কাস্টম ফন্ট ব্যবহার করতে চান যা লাইব্রেরিতে অন্তর্ভুক্ত নয়। প্রদত্ত ইউআরএল থেকে ফন্টটি লোড করা হবে এবং ৩ডি টেক্সট তৈরি করতে ব্যবহৃত হবে। নিশ্চিত করুন যে ফন্টগুলিতে স্ব-ছেদ এবং অন্যান্য খারাপ অক্ষর নেই - এটি কাস্টম ফন্টগুলির সাথে একটি সাধারণ সমস্যা। সমর্থিত ফন্ট ফরম্যাটগুলি হল: ttf, otf, woff। দয়া করে মনে রাখবেন যে Woff2 opentype.js দ্বারা সমর্থিত নয় কারণ এটি একটি সংকুচিত ফরম্যাট।" } \ No newline at end of file diff --git a/languages/de.json b/languages/de.json index 67698589..9917c2e7 100644 --- a/languages/de.json +++ b/languages/de.json @@ -5356,5 +5356,19 @@ "bitbybit.occt.shapes.face.fromBaseTriangle_description": "Erstellt Fläche aus der Dreiecksdefinition", "bitbybit.occt.shapes.face.fromBaseMesh": "Flächen von Basisnetz", "bitbybit.occt.shapes.face.fromBaseMesh_description": "Erstellt Flächen aus der Netzdefinition", - "fromRightHanded": "von rechtshändig" + "fromRightHanded": "von rechtshändig", + "bitbybit.advanced.text3d.createWithUrl": "Text mit URL", + "createWithUrl": "Text mit URL", + "bitbybit.advanced.text3d.createWithUrl_description": "Erstellt einen 3D-Text mit einer Schriftart-URL. Dies ist nützlich, wenn Sie eine benutzerdefinierte Schriftart verwenden möchten, die nicht in der Bibliothek enthalten ist. Die Schriftart wird von der angegebenen URL geladen und zur Erzeugung des 3D-Textes verwendet. Stellen Sie sicher, dass Schriftarten keine Selbstüberschneidungen und andere fehlerhafte Zeichen enthalten - das ist ein häufiges Problem bei benutzerdefinierten Schriftarten. Unterstützte Schriftartformate sind: ttf, otf, woff. Bitte beachten Sie, dass Woff2 von opentype.js nicht unterstützt wird, da es sich um ein komprimiertes Format handelt.", + "fontUrl": "Schriftart-URL", + "bitbybit.advanced.text3d.createTextOnFaceUrl": "Text auf Fläche URL", + "createTextOnFaceUrl": "Text auf Fläche URL", + "bitbybit.advanced.text3d.createTextOnFaceUrl_description": "Erstellt einen 3D-Text auf der Fläche unter Verwendung einer Schriftart-URL. Dies ist nützlich, wenn Sie eine benutzerdefinierte Schriftart verwenden möchten, die nicht in der Bibliothek enthalten ist. Die Schriftart wird von der angegebenen URL geladen und zur Erzeugung des 3D-Textes verwendet. Stellen Sie sicher, dass Schriftarten keine Selbstüberschneidungen und andere fehlerhafte Zeichen enthalten - das ist ein häufiges Problem bei benutzerdefinierten Schriftarten. Unterstützte Schriftartformate sind: ttf, otf, woff. Bitte beachten Sie, dass Woff2 von opentype.js nicht unterstützt wird, da es sich um ein komprimiertes Format handelt.", + "bitbybit.advanced.text3d.createTextsOnFaceUrl": "Texte auf Fläche URL", + "createTextsOnFaceUrl": "Texte auf Fläche URL", + "bitbybit.advanced.text3d.createTextsOnFaceUrl_description": "Erstellt 3D-Texte auf der Fläche aus mehreren URL-Definitionen. Dies ist nützlich, wenn Sie eine benutzerdefinierte Schriftart verwenden möchten, die nicht in der Bibliothek enthalten ist. Die Schriftart wird von der angegebenen URL geladen und zur Erzeugung des 3D-Textes verwendet. Stellen Sie sicher, dass Schriftarten keine Selbstüberschneidungen und andere fehlerhafte Zeichen enthalten - das ist ein häufiges Problem bei benutzerdefinierten Schriftarten. Unterstützte Schriftartformate sind: ttf, otf, woff. Bitte beachten Sie, dass Woff2 von opentype.js nicht unterstützt wird, da es sich um ein komprimiertes Format handelt.", + "Text3DFaceDefinitionUrlDto[]": "Text3DFaceDefinitionUrlDto[]", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl": "Definition 3D-Text auf Fläche URL", + "definition3dTextOnFaceUrl": "Definition 3D-Text auf Fläche URL", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl_description": "Erstellt 3D-Text, der in der Flächen-URL-Definition verwendet wird. Dies ist nützlich, wenn Sie eine benutzerdefinierte Schriftart verwenden möchten, die nicht in der Bibliothek enthalten ist. Die Schriftart wird von der angegebenen URL geladen und zur Erzeugung des 3D-Textes verwendet. Stellen Sie sicher, dass Schriftarten keine Selbstüberschneidungen und andere fehlerhafte Zeichen enthalten - das ist ein häufiges Problem bei benutzerdefinierten Schriftarten. Unterstützte Schriftartformate sind: ttf, otf, woff. Bitte beachten Sie, dass Woff2 von opentype.js nicht unterstützt wird, da es sich um ein komprimiertes Format handelt." } \ No newline at end of file diff --git a/languages/en.json b/languages/en.json index ec694cbc..67fc8e83 100644 --- a/languages/en.json +++ b/languages/en.json @@ -5356,5 +5356,19 @@ "bitbybit.occt.shapes.face.fromBaseTriangle_description": "Creates face from triangle definition", "bitbybit.occt.shapes.face.fromBaseMesh": "faces from base mesh", "bitbybit.occt.shapes.face.fromBaseMesh_description": "Creates faces from mesh definition", - "fromRightHanded": "from right handed" + "fromRightHanded": "from right handed", + "bitbybit.advanced.text3d.createWithUrl": "text with url", + "createWithUrl": "text with url", + "bitbybit.advanced.text3d.createWithUrl_description": "Creates a 3d text with a font URL. This is useful when you want to use a custom font that is not included in the library. The font will be loaded from the provided URL and used to generate the 3d text. Make sure that fonts do not contain self intersection and other bad characters - that is common issue with custom fonts. Font formats supported are: ttf, otf, woff. Please note that Woff2 is not supported by opentype.js as it is a compressed format.", + "fontUrl": "font url", + "bitbybit.advanced.text3d.createTextOnFaceUrl": "text on face url", + "createTextOnFaceUrl": "text on face url", + "bitbybit.advanced.text3d.createTextOnFaceUrl_description": "Creates a 3d text on the face using a font URL. This is useful when you want to use a custom font that is not included in the library. The font will be loaded from the provided URL and used to generate the 3d text. Make sure that fonts do not contain self intersection and other bad characters - that is common issue with custom fonts. Font formats supported are: ttf, otf, woff. Please note that Woff2 is not supported by opentype.js as it is a compressed format.", + "bitbybit.advanced.text3d.createTextsOnFaceUrl": "texts on face url", + "createTextsOnFaceUrl": "texts on face url", + "bitbybit.advanced.text3d.createTextsOnFaceUrl_description": "Creates 3d texts on the face from multiple url definitions. This is useful when you want to use a custom font that is not included in the library. The font will be loaded from the provided URL and used to generate the 3d text. Make sure that fonts do not contain self intersection and other bad characters - that is common issue with custom fonts. Font formats supported are: ttf, otf, woff. Please note that Woff2 is not supported by opentype.js as it is a compressed format.", + "Text3DFaceDefinitionUrlDto[]": "Text3DFaceDefinitionUrlDto[]", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl": "definition 3d text on face url", + "definition3dTextOnFaceUrl": "definition 3d text on face url", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl_description": "Creates 3d text that will be used on the face url definition. This is useful when you want to use a custom font that is not included in the library. The font will be loaded from the provided URL and used to generate the 3d text. Make sure that fonts do not contain self intersection and other bad characters - that is common issue with custom fonts. Font formats supported are: ttf, otf, woff. Please note that Woff2 is not supported by opentype.js as it is a compressed format." } \ No newline at end of file diff --git a/languages/es.json b/languages/es.json index dfe76d24..3c20600d 100644 --- a/languages/es.json +++ b/languages/es.json @@ -5356,5 +5356,19 @@ "bitbybit.occt.shapes.face.fromBaseTriangle_description": "Crea una cara desde la definición de triángulo", "bitbybit.occt.shapes.face.fromBaseMesh": "caras desde malla base", "bitbybit.occt.shapes.face.fromBaseMesh_description": "Crea caras desde la definición de malla", - "fromRightHanded": "desde diestro" + "fromRightHanded": "desde diestro", + "bitbybit.advanced.text3d.createWithUrl": "texto con url", + "createWithUrl": "texto con url", + "bitbybit.advanced.text3d.createWithUrl_description": "Crea un texto 3D con una URL de fuente. Esto es útil cuando se quiere utilizar una fuente personalizada que no está incluida en la biblioteca. La fuente se cargará desde la URL proporcionada y se utilizará para generar el texto 3D. Asegúrese de que las fuentes no contengan autointersecciones y otros caracteres incorrectos; es un problema común con las fuentes personalizadas. Los formatos de fuente compatibles son: ttf, otf, woff. Tenga en cuenta que Woff2 no es compatible con opentype.js ya que es un formato comprimido.", + "fontUrl": "url de la fuente", + "bitbybit.advanced.text3d.createTextOnFaceUrl": "texto en cara url", + "createTextOnFaceUrl": "texto en cara url", + "bitbybit.advanced.text3d.createTextOnFaceUrl_description": "Crea un texto 3D en la cara utilizando una URL de fuente. Esto es útil cuando se quiere utilizar una fuente personalizada que no está incluida en la biblioteca. La fuente se cargará desde la URL proporcionada y se utilizará para generar el texto 3D. Asegúrese de que las fuentes no contengan autointersecciones y otros caracteres incorrectos; es un problema común con las fuentes personalizadas. Los formatos de fuente compatibles son: ttf, otf, woff. Tenga en cuenta que Woff2 no es compatible con opentype.js ya que es un formato comprimido.", + "bitbybit.advanced.text3d.createTextsOnFaceUrl": "textos en cara url", + "createTextsOnFaceUrl": "textos en cara url", + "bitbybit.advanced.text3d.createTextsOnFaceUrl_description": "Crea textos 3D en la cara a partir de múltiples definiciones de URL. Esto es útil cuando se quiere utilizar una fuente personalizada que no está incluida en la biblioteca. La fuente se cargará desde la URL proporcionada y se utilizará para generar el texto 3D. Asegúrese de que las fuentes no contengan autointersecciones y otros caracteres incorrectos; es un problema común con las fuentes personalizadas. Los formatos de fuente compatibles son: ttf, otf, woff. Tenga en cuenta que Woff2 no es compatible con opentype.js ya que es un formato comprimido.", + "Text3DFaceDefinitionUrlDto[]": "Text3DFaceDefinitionUrlDto[]", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl": "definición de texto 3d en cara url", + "definition3dTextOnFaceUrl": "definición de texto 3d en cara url", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl_description": "Crea un texto 3D que se utilizará en la definición de la URL de la cara. Esto es útil cuando se quiere utilizar una fuente personalizada que no está incluida en la biblioteca. La fuente se cargará desde la URL proporcionada y se utilizará para generar el texto 3D. Asegúrese de que las fuentes no contengan autointersecciones y otros caracteres incorrectos; es un problema común con las fuentes personalizadas. Los formatos de fuente compatibles son: ttf, otf, woff. Tenga en cuenta que Woff2 no es compatible con opentype.js ya que es un formato comprimido." } \ No newline at end of file diff --git a/languages/fr.json b/languages/fr.json index d80719af..cccfec38 100644 --- a/languages/fr.json +++ b/languages/fr.json @@ -5356,5 +5356,19 @@ "bitbybit.occt.shapes.face.fromBaseTriangle_description": "Crée une face à partir de la définition du triangle", "bitbybit.occt.shapes.face.fromBaseMesh": "faces depuis maillage de base", "bitbybit.occt.shapes.face.fromBaseMesh_description": "Crée des faces à partir de la définition du maillage", - "fromRightHanded": "depuis droitier" + "fromRightHanded": "depuis droitier", + "bitbybit.advanced.text3d.createWithUrl": "texte avec url", + "createWithUrl": "texte avec url", + "bitbybit.advanced.text3d.createWithUrl_description": "Crée un texte 3D avec une URL de police. Ceci est utile lorsque vous souhaitez utiliser une police personnalisée qui n'est pas incluse dans la bibliothèque. La police sera chargée à partir de l'URL fournie et utilisée pour générer le texte 3D. Assurez-vous que les polices ne contiennent pas d'auto-intersection et d'autres mauvais caractères - c'est un problème courant avec les polices personnalisées. Les formats de police pris en charge sont : ttf, otf, woff. Veuillez noter que Woff2 n'est pas pris en charge par opentype.js car il s'agit d'un format compressé.", + "fontUrl": "url de la police", + "bitbybit.advanced.text3d.createTextOnFaceUrl": "texte sur face url", + "createTextOnFaceUrl": "texte sur face url", + "bitbybit.advanced.text3d.createTextOnFaceUrl_description": "Crée un texte 3D sur la face à l'aide d'une URL de police. Ceci est utile lorsque vous souhaitez utiliser une police personnalisée qui n'est pas incluse dans la bibliothèque. La police sera chargée à partir de l'URL fournie et utilisée pour générer le texte 3D. Assurez-vous que les polices ne contiennent pas d'auto-intersection et d'autres mauvais caractères - c'est un problème courant avec les polices personnalisées. Les formats de police pris en charge sont : ttf, otf, woff. Veuillez noter que Woff2 n'est pas pris en charge par opentype.js car il s'agit d'un format compressé.", + "bitbybit.advanced.text3d.createTextsOnFaceUrl": "textes sur face url", + "createTextsOnFaceUrl": "textes sur face url", + "bitbybit.advanced.text3d.createTextsOnFaceUrl_description": "Crée des textes 3D sur la face à partir de plusieurs définitions d'URL. Ceci est utile lorsque vous souhaitez utiliser une police personnalisée qui n'est pas incluse dans la bibliothèque. La police sera chargée à partir de l'URL fournie et utilisée pour générer le texte 3D. Assurez-vous que les polices ne contiennent pas d'auto-intersection et d'autres mauvais caractères - c'est un problème courant avec les polices personnalisées. Les formats de police pris en charge sont : ttf, otf, woff. Veuillez noter que Woff2 n'est pas pris en charge par opentype.js car il s'agit d'un format compressé.", + "Text3DFaceDefinitionUrlDto[]": "Text3DFaceDefinitionUrlDto[]", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl": "définition texte 3d sur face url", + "definition3dTextOnFaceUrl": "définition texte 3d sur face url", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl_description": "Crée un texte 3D qui sera utilisé dans la définition de l'URL de la face. Ceci est utile lorsque vous souhaitez utiliser une police personnalisée qui n'est pas incluse dans la bibliothèque. La police sera chargée à partir de l'URL fournie et utilisée pour générer le texte 3D. Assurez-vous que les polices ne contiennent pas d'auto-intersection et d'autres mauvais caractères - c'est un problème courant avec les polices personnalisées. Les formats de police pris en charge sont : ttf, otf, woff. Veuillez noter que Woff2 n'est pas pris en charge par opentype.js car il s'agit d'un format compressé." } \ No newline at end of file diff --git a/languages/hi.json b/languages/hi.json index f08f0491..8f7db8f3 100644 --- a/languages/hi.json +++ b/languages/hi.json @@ -5356,5 +5356,19 @@ "bitbybit.occt.shapes.face.fromBaseTriangle_description": "त्रिकोण परिभाषा से फलक बनाता है", "bitbybit.occt.shapes.face.fromBaseMesh": "आधार मेश से फलक", "bitbybit.occt.shapes.face.fromBaseMesh_description": "मेश परिभाषा से फलक बनाता है", - "fromRightHanded": "दाहिने हाथ से" + "fromRightHanded": "दाहिने हाथ से", + "bitbybit.advanced.text3d.createWithUrl": "यूआरएल के साथ टेक्स्ट", + "createWithUrl": "यूआरएल के साथ टेक्स्ट", + "bitbybit.advanced.text3d.createWithUrl_description": "फ़ॉन्ट यूआरएल के साथ एक 3डी टेक्स्ट बनाता है। यह तब उपयोगी होता है जब आप एक कस्टम फ़ॉन्ट का उपयोग करना चाहते हैं जो लाइब्रेरी में शामिल नहीं है। फ़ॉन्ट दिए गए यूआरएल से लोड किया जाएगा और 3डी टेक्स्ट बनाने के लिए उपयोग किया जाएगा। सुनिश्चित करें कि फ़ॉन्ट्स में सेल्फ-इंटरसेक्शन और अन्य खराब कैरेक्टर नहीं हैं - यह कस्टम फ़ॉन्ट्स के साथ एक आम समस्या है। समर्थित फ़ॉन्ट प्रारूप हैं: ttf, otf, woff। कृपया ध्यान दें कि Woff2 opentype.js द्वारा समर्थित नहीं है क्योंकि यह एक संपीड़ित प्रारूप है।", + "fontUrl": "फ़ॉन्ट यूआरएल", + "bitbybit.advanced.text3d.createTextOnFaceUrl": "फेस यूआरएल पर टेक्स्ट", + "createTextOnFaceUrl": "फेस यूआरएल पर टेक्स्ट", + "bitbybit.advanced.text3d.createTextOnFaceUrl_description": "फ़ॉन्ट यूआरएल का उपयोग करके फेस पर एक 3डी टेक्स्ट बनाता है। यह तब उपयोगी होता है जब आप एक कस्टम फ़ॉन्ट का उपयोग करना चाहते हैं जो लाइब्रेरी में शामिल नहीं है। फ़ॉन्ट दिए गए यूआरएल से लोड किया जाएगा और 3डी टेक्स्ट बनाने के लिए उपयोग किया जाएगा। सुनिश्चित करें कि फ़ॉन्ट्स में सेल्फ-इंटरसेक्शन और अन्य खराब कैरेक्टर नहीं हैं - यह कस्टम फ़ॉन्ट्स के साथ एक आम समस्या है। समर्थित फ़ॉन्ट प्रारूप हैं: ttf, otf, woff। कृपया ध्यान दें कि Woff2 opentype.js द्वारा समर्थित नहीं है क्योंकि यह एक संपीड़ित प्रारूप है।", + "bitbybit.advanced.text3d.createTextsOnFaceUrl": "फेस यूआरएल पर टेक्स्ट्स", + "createTextsOnFaceUrl": "फेस यूआरएल पर टेक्स्ट्स", + "bitbybit.advanced.text3d.createTextsOnFaceUrl_description": "कई यूआरएल परिभाषाओं से फेस पर 3डी टेक्स्ट बनाता है। यह तब उपयोगी होता है जब आप एक कस्टम फ़ॉन्ट का उपयोग करना चाहते हैं जो लाइब्रेरी में शामिल नहीं है। फ़ॉन्ट दिए गए यूआरएल से लोड किया जाएगा और 3डी टेक्स्ट बनाने के लिए उपयोग किया जाएगा। सुनिश्चित करें कि फ़ॉन्ट्स में सेल्फ-इंटरसेक्शन और अन्य खराब कैरेक्टर नहीं हैं - यह कस्टम फ़ॉन्ट्स के साथ एक आम समस्या है। समर्थित फ़ॉन्ट प्रारूप हैं: ttf, otf, woff। कृपया ध्यान दें कि Woff2 opentype.js द्वारा समर्थित नहीं है क्योंकि यह एक संपीड़ित प्रारूप है।", + "Text3DFaceDefinitionUrlDto[]": "Text3DFaceDefinitionUrlDto[]", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl": "फेस यूआरएल पर 3डी टेक्स्ट की परिभाषा", + "definition3dTextOnFaceUrl": "फेस यूआरएल पर 3डी टेक्स्ट की परिभाषा", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl_description": "3डी टेक्स्ट बनाता है जिसका उपयोग फेस यूआरएल परिभाषा पर किया जाएगा। यह तब उपयोगी होता है जब आप एक कस्टम फ़ॉन्ट का उपयोग करना चाहते हैं जो लाइब्रेरी में शामिल नहीं है। फ़ॉन्ट दिए गए यूआरएल से लोड किया जाएगा और 3डी टेक्स्ट बनाने के लिए उपयोग किया जाएगा। सुनिश्चित करें कि फ़ॉन्ट्स में सेल्फ-इंटरसेक्शन और अन्य खराब कैरेक्टर नहीं हैं - यह कस्टम फ़ॉन्ट्स के साथ एक आम समस्या है। समर्थित फ़ॉन्ट प्रारूप हैं: ttf, otf, woff। कृपया ध्यान दें कि Woff2 opentype.js द्वारा समर्थित नहीं है क्योंकि यह एक संपीड़ित प्रारूप है।" } \ No newline at end of file diff --git a/languages/id.json b/languages/id.json index 64d24cb8..b5f6e93d 100644 --- a/languages/id.json +++ b/languages/id.json @@ -5356,5 +5356,19 @@ "bitbybit.occt.shapes.face.fromBaseTriangle_description": "Membuat muka dari definisi segitiga", "bitbybit.occt.shapes.face.fromBaseMesh": "muka dari mesh dasar", "bitbybit.occt.shapes.face.fromBaseMesh_description": "Membuat muka dari definisi mesh", - "fromRightHanded": "dari tangan kanan" + "fromRightHanded": "dari tangan kanan", + "bitbybit.advanced.text3d.createWithUrl": "teks dengan url", + "createWithUrl": "teks dengan url", + "bitbybit.advanced.text3d.createWithUrl_description": "Membuat teks 3d dengan URL font. Ini berguna ketika Anda ingin menggunakan font kustom yang tidak termasuk dalam pustaka. Font akan dimuat dari URL yang disediakan dan digunakan untuk menghasilkan teks 3d. Pastikan font tidak mengandung perpotongan sendiri dan karakter buruk lainnya - ini adalah masalah umum dengan font kustom. Format font yang didukung adalah: ttf, otf, woff. Harap dicatat bahwa Woff2 tidak didukung oleh opentype.js karena merupakan format terkompresi.", + "fontUrl": "url font", + "bitbybit.advanced.text3d.createTextOnFaceUrl": "teks pada wajah url", + "createTextOnFaceUrl": "teks pada wajah url", + "bitbybit.advanced.text3d.createTextOnFaceUrl_description": "Membuat teks 3d pada wajah menggunakan URL font. Ini berguna ketika Anda ingin menggunakan font kustom yang tidak termasuk dalam pustaka. Font akan dimuat dari URL yang disediakan dan digunakan untuk menghasilkan teks 3d. Pastikan font tidak mengandung perpotongan sendiri dan karakter buruk lainnya - ini adalah masalah umum dengan font kustom. Format font yang didukung adalah: ttf, otf, woff. Harap dicatat bahwa Woff2 tidak didukung oleh opentype.js karena merupakan format terkompresi.", + "bitbybit.advanced.text3d.createTextsOnFaceUrl": "teks pada wajah url", + "createTextsOnFaceUrl": "teks pada wajah url", + "bitbybit.advanced.text3d.createTextsOnFaceUrl_description": "Membuat teks 3d pada wajah dari beberapa definisi url. Ini berguna ketika Anda ingin menggunakan font kustom yang tidak termasuk dalam pustaka. Font akan dimuat dari URL yang disediakan dan digunakan untuk menghasilkan teks 3d. Pastikan font tidak mengandung perpotongan sendiri dan karakter buruk lainnya - ini adalah masalah umum dengan font kustom. Format font yang didukung adalah: ttf, otf, woff. Harap dicatat bahwa Woff2 tidak didukung oleh opentype.js karena merupakan format terkompresi.", + "Text3DFaceDefinitionUrlDto[]": "Text3DFaceDefinitionUrlDto[]", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl": "definisi teks 3d pada wajah url", + "definition3dTextOnFaceUrl": "definisi teks 3d pada wajah url", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl_description": "Membuat teks 3d yang akan digunakan pada definisi url wajah. Ini berguna ketika Anda ingin menggunakan font kustom yang tidak termasuk dalam pustaka. Font akan dimuat dari URL yang disediakan dan digunakan untuk menghasilkan teks 3d. Pastikan font tidak mengandung perpotongan sendiri dan karakter buruk lainnya - ini adalah masalah umum dengan font kustom. Format font yang didukung adalah: ttf, otf, woff. Harap dicatat bahwa Woff2 tidak didukung oleh opentype.js karena merupakan format terkompresi." } \ No newline at end of file diff --git a/languages/lt.json b/languages/lt.json index 0a149818..d00eadd0 100644 --- a/languages/lt.json +++ b/languages/lt.json @@ -5356,5 +5356,19 @@ "bitbybit.occt.shapes.face.fromBaseTriangle_description": "Sukuria paviršių iš trikampio apibrėžimo", "bitbybit.occt.shapes.face.fromBaseMesh": "paviršiai iš bazinio tinklo", "bitbybit.occt.shapes.face.fromBaseMesh_description": "Sukuria paviršius iš tinklo apibrėžimo", - "fromRightHanded": "iš dešiniarankio" + "fromRightHanded": "iš dešiniarankio", + "bitbybit.advanced.text3d.createWithUrl": "tekstas su url", + "createWithUrl": "tekstas su url", + "bitbybit.advanced.text3d.createWithUrl_description": "Sukuria 3d tekstą su šrifto URL. Tai naudinga, kai norite naudoti pasirinktinį šriftą, kuris nėra įtrauktas į biblioteką. Šriftas bus įkeltas iš pateikto URL ir naudojamas 3d tekstui generuoti. Įsitikinkite, kad šriftuose nėra savęs susikirtimų ir kitų blogų simbolių - tai yra dažna problema su pasirinktiniais šriftais. Palaikomi šriftų formatai: ttf, otf, woff. Atkreipkite dėmesį, kad Woff2 nepalaiko opentype.js, nes tai yra suspaustas formatas.", + "fontUrl": "šrifto url", + "bitbybit.advanced.text3d.createTextOnFaceUrl": "tekstas ant paviršiaus url", + "createTextOnFaceUrl": "tekstas ant paviršiaus url", + "bitbybit.advanced.text3d.createTextOnFaceUrl_description": "Sukuria 3d tekstą ant paviršiaus naudojant šrifto URL. Tai naudinga, kai norite naudoti pasirinktinį šriftą, kuris nėra įtrauktas į biblioteką. Šriftas bus įkeltas iš pateikto URL ir naudojamas 3d tekstui generuoti. Įsitikinkite, kad šriftuose nėra savęs susikirtimų ir kitų blogų simbolių - tai yra dažna problema su pasirinktiniais šriftais. Palaikomi šriftų formatai: ttf, otf, woff. Atkreipkite dėmesį, kad Woff2 nepalaiko opentype.js, nes tai yra suspaustas formatas.", + "bitbybit.advanced.text3d.createTextsOnFaceUrl": "tekstai ant paviršiaus url", + "createTextsOnFaceUrl": "tekstai ant paviršiaus url", + "bitbybit.advanced.text3d.createTextsOnFaceUrl_description": "Sukuria 3d tekstus ant paviršiaus iš kelių URL apibrėžimų. Tai naudinga, kai norite naudoti pasirinktinį šriftą, kuris nėra įtrauktas į biblioteką. Šriftas bus įkeltas iš pateikto URL ir naudojamas 3d tekstui generuoti. Įsitikinkite, kad šriftuose nėra savęs susikirtimų ir kitų blogų simbolių - tai yra dažna problema su pasirinktiniais šriftais. Palaikomi šriftų formatai: ttf, otf, woff. Atkreipkite dėmesį, kad Woff2 nepalaiko opentype.js, nes tai yra suspaustas formatas.", + "Text3DFaceDefinitionUrlDto[]": "Text3DFaceDefinitionUrlDto[]", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl": "3d teksto apibrėžimas ant paviršiaus url", + "definition3dTextOnFaceUrl": "3d teksto apibrėžimas ant paviršiaus url", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl_description": "Sukuria 3d tekstą, kuris bus naudojamas paviršiaus URL apibrėžime. Tai naudinga, kai norite naudoti pasirinktinį šriftą, kuris nėra įtrauktas į biblioteką. Šriftas bus įkeltas iš pateikto URL ir naudojamas 3d tekstui generuoti. Įsitikinkite, kad šriftuose nėra savęs susikirtimų ir kitų blogų simbolių - tai yra dažna problema su pasirinktiniais šriftais. Palaikomi šriftų formatai: ttf, otf, woff. Atkreipkite dėmesį, kad Woff2 nepalaiko opentype.js, nes tai yra suspaustas formatas." } \ No newline at end of file diff --git a/languages/pt.json b/languages/pt.json index fc5b0e36..ae1bd539 100644 --- a/languages/pt.json +++ b/languages/pt.json @@ -5356,5 +5356,19 @@ "bitbybit.occt.shapes.face.fromBaseTriangle_description": "Cria face a partir da definição de triângulo", "bitbybit.occt.shapes.face.fromBaseMesh": "faces da malha de base", "bitbybit.occt.shapes.face.fromBaseMesh_description": "Cria faces a partir da definição de malha", - "fromRightHanded": "de destro" + "fromRightHanded": "de destro", + "bitbybit.advanced.text3d.createWithUrl": "texto com url", + "createWithUrl": "texto com url", + "bitbybit.advanced.text3d.createWithUrl_description": "Cria um texto 3D com um URL de fonte. Isso é útil quando você deseja usar uma fonte personalizada que não está incluída na biblioteca. A fonte será carregada a partir do URL fornecido e usada para gerar o texto 3D. Certifique-se de que as fontes não contenham autointerseção e outros caracteres ruins - esse é um problema comum com fontes personalizadas. Os formatos de fonte suportados são: ttf, otf, woff. Observe que o Woff2 não é suportado pelo opentype.js, pois é um formato compactado.", + "fontUrl": "url da fonte", + "bitbybit.advanced.text3d.createTextOnFaceUrl": "texto na face url", + "createTextOnFaceUrl": "texto na face url", + "bitbybit.advanced.text3d.createTextOnFaceUrl_description": "Cria um texto 3D na face usando um URL de fonte. Isso é útil quando você deseja usar uma fonte personalizada que não está incluída na biblioteca. A fonte será carregada a partir do URL fornecido e usada para gerar o texto 3D. Certifique-se de que as fontes não contenham autointerseção e outros caracteres ruins - esse é um problema comum com fontes personalizadas. Os formatos de fonte suportados são: ttf, otf, woff. Observe que o Woff2 não é suportado pelo opentype.js, pois é um formato compactado.", + "bitbybit.advanced.text3d.createTextsOnFaceUrl": "textos na face url", + "createTextsOnFaceUrl": "textos na face url", + "bitbybit.advanced.text3d.createTextsOnFaceUrl_description": "Cria textos 3D na face a partir de várias definições de URL. Isso é útil quando você deseja usar uma fonte personalizada que não está incluída na biblioteca. A fonte será carregada a partir do URL fornecido e usada para gerar o texto 3D. Certifique-se de que as fontes não contenham autointerseção e outros caracteres ruins - esse é um problema comum com fontes personalizadas. Os formatos de fonte suportados são: ttf, otf, woff. Observe que o Woff2 não é suportado pelo opentype.js, pois é um formato compactado.", + "Text3DFaceDefinitionUrlDto[]": "Text3DFaceDefinitionUrlDto[]", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl": "definição de texto 3d na face url", + "definition3dTextOnFaceUrl": "definição de texto 3d na face url", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl_description": "Cria um texto 3D que será usado na definição de URL da face. Isso é útil quando você deseja usar uma fonte personalizada que não está incluída na biblioteca. A fonte será carregada a partir do URL fornecido e usada para gerar o texto 3D. Certifique-se de que as fontes não contenham autointerseção e outros caracteres ruins - esse é um problema comum com fontes personalizadas. Os formatos de fonte suportados são: ttf, otf, woff. Observe que o Woff2 não é suportado pelo opentype.js, pois é um formato compactado." } \ No newline at end of file diff --git a/languages/ru.json b/languages/ru.json index 402c3bb0..3ff5a4cc 100644 --- a/languages/ru.json +++ b/languages/ru.json @@ -5356,5 +5356,19 @@ "bitbybit.occt.shapes.face.fromBaseTriangle_description": "Создает грань из определения треугольника", "bitbybit.occt.shapes.face.fromBaseMesh": "грани из базовой сетки", "bitbybit.occt.shapes.face.fromBaseMesh_description": "Создает грани из определения сетки", - "fromRightHanded": "из правостороннего" + "fromRightHanded": "из правостороннего", + "bitbybit.advanced.text3d.createWithUrl": "текст с url", + "createWithUrl": "текст с url", + "bitbybit.advanced.text3d.createWithUrl_description": "Создает 3D-текст с использованием URL-адреса шрифта. Это полезно, когда вы хотите использовать пользовательский шрифт, который не включен в библиотеку. Шрифт будет загружен с предоставленного URL-адреса и использован для создания 3D-текста. Убедитесь, что шрифты не содержат самопересечений и других некорректных символов - это частая проблема с пользовательскими шрифтами. Поддерживаемые форматы шрифтов: ttf, otf, woff. Обратите внимание, что Woff2 не поддерживается opentype.js, так как это сжатый формат.", + "fontUrl": "url шрифта", + "bitbybit.advanced.text3d.createTextOnFaceUrl": "текст на грани url", + "createTextOnFaceUrl": "текст на грани url", + "bitbybit.advanced.text3d.createTextOnFaceUrl_description": "Создает 3D-текст на грани с использованием URL-адреса шрифта. Это полезно, когда вы хотите использовать пользовательский шрифт, который не включен в библиотеку. Шрифт будет загружен с предоставленного URL-адреса и использован для создания 3D-текста. Убедитесь, что шрифты не содержат самопересечений и других некорректных символов - это частая проблема с пользовательскими шрифтами. Поддерживаемые форматы шрифтов: ttf, otf, woff. Обратите внимание, что Woff2 не поддерживается opentype.js, так как это сжатый формат.", + "bitbybit.advanced.text3d.createTextsOnFaceUrl": "тексты на грани url", + "createTextsOnFaceUrl": "тексты на грани url", + "bitbybit.advanced.text3d.createTextsOnFaceUrl_description": "Создает 3D-тексты на грани из нескольких определений URL. Это полезно, когда вы хотите использовать пользовательский шрифт, который не включен в библиотеку. Шрифт будет загружен с предоставленного URL-адреса и использован для создания 3D-текста. Убедитесь, что шрифты не содержат самопересечений и других некорректных символов - это частая проблема с пользовательскими шрифтами. Поддерживаемые форматы шрифтов: ttf, otf, woff. Обратите внимание, что Woff2 не поддерживается opentype.js, так как это сжатый формат.", + "Text3DFaceDefinitionUrlDto[]": "Text3DFaceDefinitionUrlDto[]", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl": "определение 3d текста на грани url", + "definition3dTextOnFaceUrl": "определение 3d текста на грани url", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl_description": "Создает 3D-текст, который будет использоваться в определении URL грани. Это полезно, когда вы хотите использовать пользовательский шрифт, который не включен в библиотеку. Шрифт будет загружен с предоставленного URL-адреса и использован для создания 3D-текста. Убедитесь, что шрифты не содержат самопересечений и других некорректных символов - это частая проблема с пользовательскими шрифтами. Поддерживаемые форматы шрифтов: ttf, otf, woff. Обратите внимание, что Woff2 не поддерживается opentype.js, так как это сжатый формат." } \ No newline at end of file diff --git a/languages/uk.json b/languages/uk.json index 41f56c2a..78fefe6f 100644 --- a/languages/uk.json +++ b/languages/uk.json @@ -5356,5 +5356,19 @@ "bitbybit.occt.shapes.face.fromBaseTriangle_description": "Створює грань з визначення трикутника", "bitbybit.occt.shapes.face.fromBaseMesh": "грані з базової сітки", "bitbybit.occt.shapes.face.fromBaseMesh_description": "Створює грані з визначення сітки", - "fromRightHanded": "з правостороннього" + "fromRightHanded": "з правостороннього", + "bitbybit.advanced.text3d.createWithUrl": "текст з url", + "createWithUrl": "текст з url", + "bitbybit.advanced.text3d.createWithUrl_description": "Створює 3D-текст за URL-адресою шрифту. Це корисно, коли ви хочете використовувати власний шрифт, який не включений до бібліотеки. Шрифт буде завантажено за наданою URL-адресою та використано для створення 3D-тексту. Переконайтеся, що шрифти не містять самоперетинів та інших некоректних символів - це поширена проблема з власними шрифтами. Підтримувані формати шрифтів: ttf, otf, woff. Зверніть увагу, що Woff2 не підтримується opentype.js, оскільки це стиснутий формат.", + "fontUrl": "url шрифту", + "bitbybit.advanced.text3d.createTextOnFaceUrl": "текст на грані url", + "createTextOnFaceUrl": "текст на грані url", + "bitbybit.advanced.text3d.createTextOnFaceUrl_description": "Створює 3D-текст на грані за допомогою URL-адреси шрифту. Це корисно, коли ви хочете використовувати власний шрифт, який не включений до бібліотеки. Шрифт буде завантажено за наданою URL-адресою та використано для створення 3D-тексту. Переконайтеся, що шрифти не містять самоперетинів та інших некоректних символів - це поширена проблема з власними шрифтами. Підтримувані формати шрифтів: ttf, otf, woff. Зверніть увагу, що Woff2 не підтримується opentype.js, оскільки це стиснутий формат.", + "bitbybit.advanced.text3d.createTextsOnFaceUrl": "тексти на грані url", + "createTextsOnFaceUrl": "тексти на грані url", + "bitbybit.advanced.text3d.createTextsOnFaceUrl_description": "Створює 3D-тексти на грані з кількох визначень URL. Це корисно, коли ви хочете використовувати власний шрифт, який не включений до бібліотеки. Шрифт буде завантажено за наданою URL-адресою та використано для створення 3D-тексту. Переконайтеся, що шрифти не містять самоперетинів та інших некоректних символів - це поширена проблема з власними шрифтами. Підтримувані формати шрифтів: ttf, otf, woff. Зверніть увагу, що Woff2 не підтримується opentype.js, оскільки це стиснутий формат.", + "Text3DFaceDefinitionUrlDto[]": "Text3DFaceDefinitionUrlDto[]", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl": "визначення 3d тексту на грані url", + "definition3dTextOnFaceUrl": "визначення 3d тексту на грані url", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl_description": "Створює 3D-текст, який буде використовуватися у визначенні URL грані. Це корисно, коли ви хочете використовувати власний шрифт, який не включений до бібліотеки. Шрифт буде завантажено за наданою URL-адресою та використано для створення 3D-тексту. Переконайтеся, що шрифти не містять самоперетинів та інших некоректних символів - це поширена проблема з власними шрифтами. Підтримувані формати шрифтів: ttf, otf, woff. Зверніть увагу, що Woff2 не підтримується opentype.js, оскільки це стиснутий формат." } \ No newline at end of file diff --git a/languages/zh-hans.json b/languages/zh-hans.json index adb5c3e3..dd88e58d 100644 --- a/languages/zh-hans.json +++ b/languages/zh-hans.json @@ -5356,5 +5356,19 @@ "bitbybit.occt.shapes.face.fromBaseTriangle_description": "从三角形定义创建面", "bitbybit.occt.shapes.face.fromBaseMesh": "从基础网格创建多个面", "bitbybit.occt.shapes.face.fromBaseMesh_description": "从网格定义创建面", - "fromRightHanded": "从右手坐标系" + "fromRightHanded": "从右手坐标系", + "bitbybit.advanced.text3d.createWithUrl": "带url的文本", + "createWithUrl": "带url的文本", + "bitbybit.advanced.text3d.createWithUrl_description": "使用字体URL创建一个3D文本。当您想使用库中未包含的自定义字体时,这很有用。字体将从提供的URL加载,并用于生成3D文本。确保字体不包含自相交和其他错误字符——这是自定义字体的常见问题。支持的字体格式有:ttf、otf、woff。请注意,opentype.js不支持Woff2,因为它是一种压缩格式。", + "fontUrl": "字体url", + "bitbybit.advanced.text3d.createTextOnFaceUrl": "面上的文本url", + "createTextOnFaceUrl": "面上的文本url", + "bitbybit.advanced.text3d.createTextOnFaceUrl_description": "使用字体URL在面上创建一个3D文本。当您想使用库中未包含的自定义字体时,这很有用。字体将从提供的URL加载,并用于生成3D文本。确保字体不包含自相交和其他错误字符——这是自定义字体的常见问题。支持的字体格式有:ttf、otf、woff。请注意,opentype.js不支持Woff2,因为它是一种压缩格式。", + "bitbybit.advanced.text3d.createTextsOnFaceUrl": "面上的多个文本url", + "createTextsOnFaceUrl": "面上的多个文本url", + "bitbybit.advanced.text3d.createTextsOnFaceUrl_description": "从多个url定义在面上创建3D文本。当您想使用库中未包含的自定义字体时,这很有用。字体将从提供的URL加载,并用于生成3D文本。确保字体不包含自相交和其他错误字符——这是自定义字体的常见问题。支持的字体格式有:ttf、otf、woff。请注意,opentype.js不支持Woff2,因为它是一种压缩格式。", + "Text3DFaceDefinitionUrlDto[]": "Text3DFaceDefinitionUrlDto[]", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl": "面上3d文本的定义url", + "definition3dTextOnFaceUrl": "面上3d文本的定义url", + "bitbybit.advanced.text3d.definition3dTextOnFaceUrl_description": "创建将用于面上url定义的3D文本。当您想使用库中未包含的自定义字体时,这很有用。字体将从提供的URL加载,并用于生成3D文本。确保字体不包含自相交和其他错误字符——这是自定义字体的常见问题。支持的字体格式有:ttf、otf、woff。请注意,opentype.js不支持Woff2,因为它是一种压缩格式。" } \ No newline at end of file diff --git a/packages/dev/babylonjs/package.json b/packages/dev/babylonjs/package.json index a96f07b3..fc3015be 100644 --- a/packages/dev/babylonjs/package.json +++ b/packages/dev/babylonjs/package.json @@ -54,11 +54,11 @@ "types": "./index.d.ts", "type": "module", "dependencies": { - "@babylonjs/core": "8.9.1", - "@babylonjs/gui": "8.9.1", - "@babylonjs/loaders": "8.9.1", - "@babylonjs/materials": "8.9.1", - "@babylonjs/serializers": "8.9.1", + "@babylonjs/core": "8.23.1", + "@babylonjs/gui": "8.23.1", + "@babylonjs/loaders": "8.23.1", + "@babylonjs/materials": "8.23.1", + "@babylonjs/serializers": "8.23.1", "@babylonjs/havok": "1.3.10", "@bitbybit-dev/core": "0.20.4", "earcut": "2.2.3" diff --git a/packages/dev/threejs/package.json b/packages/dev/threejs/package.json index 96ed2e35..7f11a3cc 100644 --- a/packages/dev/threejs/package.json +++ b/packages/dev/threejs/package.json @@ -54,7 +54,7 @@ "types": "./index.d.ts", "type": "module", "dependencies": { - "three": "0.176.0", + "three": "0.179.1", "@bitbybit-dev/core": "0.20.4" }, "devDependencies": { @@ -66,7 +66,7 @@ "ts-jest": "29.0.0", "typescript": "4.8.2", "@types/jest": "29.0.0", - "@types/three": "0.176.0", + "@types/three": "0.179.1", "babel-jest": "29.0.0", "@babel/core": "7.16.0", "@babel/preset-env": "7.16.0", From 15cd7a20ac19f79a7eceeaafbfbb3eb90bbbf231 Mon Sep 17 00:00:00 2001 From: Matas Ubarevicius Date: Thu, 21 Aug 2025 14:19:57 +0300 Subject: [PATCH 17/18] v0.25.0 --- .../2024-04-23-introducing-bitbybit-runner.md | 2 +- .../tutorials/product-customizable-text.mdx | 2 +- .../tutorials/product-laptop-holder.mdx | 2 +- .../3d-bits/tutorials/product-palm-table.mdx | 2 +- .../common/base/color/color-usage-examples.md | 6 +- .../base/point/point-hex-grid-example.md | 6 +- .../base/point/point-spiral-examples.md | 6 +- .../common/base/text/text-usage-examples.md | 6 +- .../base/vector/vector-usage-examples.md | 6 +- docs/learn/code/common/draw/examples.mdx | 6 +- .../code/common/occt/booleans/operations.mdx | 18 +- .../occt/fillets/chamfer-circular-edges.mdx | 6 +- .../common/occt/fillets/chamfers-intro.mdx | 6 +- .../chamfers-var-radius-on-spec-edges.mdx | 6 +- .../common/occt/fillets/fillet-3d-wires.mdx | 6 +- .../common/occt/fillets/fillets-intro.mdx | 6 +- .../fillets/fillets-on-2d-wire-corners.mdx | 6 +- .../occt/fillets/fillets-on-2d-wires.mdx | 6 +- .../fillets-var-radius-on-spec-edges.mdx | 6 +- .../common/occt/operations/advanced-loft.md | 6 +- .../code/common/occt/operations/extrusions.md | 12 +- .../occt/operations/rotated-extrusions.md | 12 +- .../common/occt/operations/simple-loft.md | 6 +- .../common/occt/shapes/edge/edge-indexes.mdx | 6 +- .../basics/assets/local/gltf.mdx | 6 +- .../basics/assets/local/step.mdx | 6 +- .../getting-started/blockly/hello-world.mdx | 4 +- .../blockly/parametric-cube.mdx | 2 +- .../getting-started/rete/hello-world.mdx | 6 +- .../getting-started/rete/parametric-cube.mdx | 4 +- .../typescript/hello-world.mdx | 4 +- .../typescript/how-to-code-in-monaco.md | 2 +- .../typescript/parametric-cube.mdx | 2 +- .../babylonjs/start-with-babylon-js.md | 2 +- .../threejs/start-with-three-js.md | 2 +- docs/learn/runners/intro-blockly.mdx | 2 +- docs/learn/runners/intro-rete.mdx | 4 +- docs/learn/runners/intro-typescript.mdx | 4 +- docs/learn/runners/intro.mdx | 2 +- .../live-examples/configurable-cad-part.mdx | 4 +- .../live-examples/static-3d-model-script.mdx | 4 +- .../runners/table-configurator-blockly.mdx | 2 +- .../learn/runners/table-configurator-rete.mdx | 2 +- .../runners/table-configurator-typescript.mdx | 2 +- .../babylonjs/laptop-holder/package-lock.json | 258 ++++++------- .../babylonjs/laptop-holder/package.json | 2 +- .../nextjs/babylonjs/simple/package-lock.json | 130 +++---- examples/nextjs/babylonjs/simple/package.json | 2 +- examples/node/basic/package-lock.json | 16 +- examples/node/basic/package.json | 2 +- examples/node/express-app/package-lock.json | 138 +++---- examples/node/express-app/package.json | 2 +- .../nuxt/babylonjs/basic/package-lock.json | 130 +++---- examples/nuxt/babylonjs/basic/package.json | 2 +- .../react/babylonjs/cup/package-lock.json | 258 ++++++------- examples/react/babylonjs/cup/package.json | 2 +- .../babylonjs/laptop-holder/package-lock.json | 258 ++++++------- .../babylonjs/laptop-holder/package.json | 2 +- examples/react/threejs/vase/package-lock.json | 110 +++--- examples/react/threejs/vase/package.json | 4 +- .../babylon/full/inline-include/index.html | 4 +- .../full/physics-javascript/index.html | 2 +- .../babylon/lite/external-scene/index.html | 2 +- .../lite/physics-javascript/index.html | 2 +- .../runner/babylon/lite/simple/index.html | 2 +- .../threejs/full/inline-include/index.html | 2 +- .../runner/threejs/full/simple/index.html | 2 +- .../runner/threejs/lite/a-frame/index.html | 2 +- .../threejs/lite/external-scene/index.html | 2 +- .../runner/threejs/lite/simple/index.html | 2 +- .../threejs/lite/threejs-logo/index.html | 2 +- .../hex-house-concept/package-lock.json | 342 ++++++++--------- .../babylonjs/hex-house-concept/package.json | 4 +- .../babylonjs/hex-shell/package-lock.json | 342 ++++++++--------- .../vite/babylonjs/hex-shell/package.json | 4 +- .../starter-template/package-lock.json | 344 ++++++++---------- .../babylonjs/starter-template/package.json | 4 +- examples/vite/threejs/cup/package-lock.json | 108 +++--- examples/vite/threejs/cup/package.json | 4 +- .../hex-house-concept/package-lock.json | 261 ++++++------- .../threejs/hex-house-concept/package.json | 4 +- .../vite/threejs/hex-shell/package-lock.json | 261 ++++++------- examples/vite/threejs/hex-shell/package.json | 4 +- .../starter-template/package-lock.json | 261 ++++++------- .../threejs/starter-template/package.json | 4 +- examples/webpack/threejs/package-lock.json | 110 +++--- examples/webpack/threejs/package.json | 4 +- examples/webpack/threejs/src/code/homepage.ts | 2 +- .../threejs/src/html/cup-three/index.html | 2 +- .../threejs/src/html/homepage/index.html | 2 +- .../src/html/manifold-sliced-mesh/index.html | 2 +- .../threejs/src/html/patterns/index.html | 2 +- examples/webpack/threejs/webpack.config.js | 2 +- package.json | 2 +- .../lib/api/bitbybit/babylon/scene.ts | 8 +- packages/dev/babylonjs/package-lock.json | 212 +++++------ packages/dev/babylonjs/package.json | 4 +- packages/dev/base/package-lock.json | 4 +- packages/dev/base/package.json | 2 +- packages/dev/core/package-lock.json | 116 +++--- packages/dev/core/package.json | 10 +- packages/dev/jscad-worker/package-lock.json | 34 +- packages/dev/jscad-worker/package.json | 4 +- packages/dev/jscad/package-lock.json | 18 +- packages/dev/jscad/package.json | 4 +- .../dev/manifold-worker/package-lock.json | 18 +- packages/dev/manifold-worker/package.json | 4 +- packages/dev/manifold/package-lock.json | 4 +- packages/dev/manifold/package.json | 2 +- packages/dev/occt-worker/package-lock.json | 34 +- packages/dev/occt-worker/package.json | 4 +- packages/dev/occt/bitbybit-dev-occt/cdn.js | 2 +- packages/dev/occt/package-lock.json | 18 +- packages/dev/occt/package.json | 4 +- packages/dev/threejs/package-lock.json | 190 +++++----- packages/dev/threejs/package.json | 6 +- 116 files changed, 2061 insertions(+), 2274 deletions(-) diff --git a/docs/blog/2024-04-23-introducing-bitbybit-runner.md b/docs/blog/2024-04-23-introducing-bitbybit-runner.md index dd293ac0..42644b5f 100644 --- a/docs/blog/2024-04-23-introducing-bitbybit-runner.md +++ b/docs/blog/2024-04-23-introducing-bitbybit-runner.md @@ -148,4 +148,4 @@ First, you must include the `BITBYBIT-RUNNER.JS` script on your website. This si The JavaScript file is hosted on the JSDelivr CDN and can be included on your website by adding this script tag to your HTML (usually in the `` or before the closing `` tag): ```html - \ No newline at end of file + \ No newline at end of file diff --git a/docs/learn/3d-bits/tutorials/product-customizable-text.mdx b/docs/learn/3d-bits/tutorials/product-customizable-text.mdx index 989abd18..f13343c2 100644 --- a/docs/learn/3d-bits/tutorials/product-customizable-text.mdx +++ b/docs/learn/3d-bits/tutorials/product-customizable-text.mdx @@ -153,7 +153,7 @@ To save you time, here is the embedded Bitbybit Rete script used in this tutoria diff --git a/docs/learn/3d-bits/tutorials/product-laptop-holder.mdx b/docs/learn/3d-bits/tutorials/product-laptop-holder.mdx index ec0e2e31..618a0a0d 100644 --- a/docs/learn/3d-bits/tutorials/product-laptop-holder.mdx +++ b/docs/learn/3d-bits/tutorials/product-laptop-holder.mdx @@ -63,7 +63,7 @@ To save you time and provide a starting point, here is the embedded Bitbybit Typ {\n\n laptops.forEach(laptop => {\n laptop.center = [0, laptop.height / 2 + laptopLiftedHeight, 0] as Bit.Inputs.Base.Point3;\n });\n\n let laptopFillets = [];\n let totalDistance = 0;\n let previousLaptopLength = 0;\n\n laptops.forEach(async (laptop, index) => {\n totalDistance += distanceBetweenLaptops + laptop.length / 2 + previousLaptopLength / 2;\n previousLaptopLength = laptop.length;\n laptop.center[2] = totalDistance;\n const laptopBaseModel = await bitbybit.occt.shapes.solid.createBox({\n width: laptop.width,\n length: laptop.length,\n height: laptop.height,\n center: laptop.center\n });\n const laptopFillet = await bitbybit.occt.fillets.filletEdges({ shape: laptopBaseModel, indexes: undefined, radius: 0.2 });\n laptopFillets.push(laptopFillet);\n\n const laptopVisModel = await bitbybit.occt.shapes.solid.createBox({\n width: laptop.width,\n length: laptop.length - 0.01,\n height: laptop.height,\n center: laptop.center\n });\n const laptopVisFillet = await bitbybit.occt.fillets.filletEdges({ shape: laptopVisModel, indexes: undefined, radius: 0.2 });\n laptopFillets.push(laptopFillet);\n\n const di = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n\n di.faceOpacity = 0.2;\n di.edgeWidth = 5;\n di.edgeOpacity = 0.6;\n di.edgeColour = whiteColor;\n di.faceColour = whiteColor;\n const laptopFilletMesh = await bitbybit.draw.drawAnyAsync({ entity: laptopVisFillet, options: di });\n laptopsFilletsMesh.push(laptopFilletMesh);\n })\n\n const polygonWire = await bitbybit.occt.shapes.wire.createPolygonWire({\n points: controlPoints\n });\n const extrusion = await bitbybit.occt.operations.extrude({\n shape: polygonWire, direction: [0, 0, totalDistance += distanceBetweenLaptops + previousLaptopLength / 2]\n });\n const laptopStandFillet = await bitbybit.occt.fillets.filletEdges({ shape: extrusion, indexes: undefined, radius: 1 });\n const laptopStandThick = await bitbybit.occt.operations.makeThickSolidSimple({ shape: laptopStandFillet, offset: -0.5 });\n\n laptopStand = await bitbybit.occt.booleans.difference({ shape: laptopStandThick, shapes: laptopFillets, keepEdges: false });\n const li = new Bit.Inputs.OCCT.DrawShapeDto(laptopStand);\n li.faceOpacity = 1;\n if (flipColor) {\n li.faceColour = \"#0000ff\";\n li.edgeColour = whiteColor;\n } else {\n li.faceColour = holderColor;\n li.edgeColour = whiteColor;\n }\n li.edgeWidth = 5;\n laptopStandMesh = await bitbybit.draw.drawAnyAsync({ entity: laptopStand, options: li });\n const laptopsMeshes = await Promise.all(laptopsFilletsMesh);\n return [laptopStandMesh, ...laptopsMeshes];\n }\n\n const meshes = await renderLaptops(laptops);\n return { meshes };\n}\n\nclass Laptop {\n width: number;\n length: number;\n height: number;\n center?: Bit.Inputs.Base.Point3;\n}\n\nBit.setBitbybitRunnerResult(start());","version":"0.20.4","type":"typescript"}} + script={{"script":"Bit.mockBitbybitRunnerInputs({\n \"Laptop Type\": \"MacBook Pro 16\",\n \"Number Laptops\": \"3\",\n \"Color\": \"Black\",\n});\nconst inputs = Bit.getBitbybitRunnerInputs();\n\nconst laptops: Laptop[] = []\n\nlet laptop: Laptop;\n\nswitch (inputs[\"Laptop Type\"]) {\n case \"MacBook Pro 16\":\n laptop = {\n length: 1.63,\n width: 35.8,\n height: 24.6\n };\n break;\n case \"MacBook Pro 14\":\n laptop = {\n length: 1.57,\n width: 31.3,\n height: 22.2\n }\n break;\n case \"MacBook Air\":\n laptop = {\n length: 1.2,\n width: 30.5,\n height: 21.6\n }\n break;\n default:\n break;\n}\n\nlet flipColor = false;\nswitch (inputs[\"Color\"]) {\n case \"Blue\":\n flipColor = true;\n break;\n default:\n break;\n}\n\nconsole.log(\"laptop \", laptop);\n\nconst nrLaptops = +inputs[\"Number Laptops\"];\n\nfor (let i = 0; i < nrLaptops; i++) {\n laptops.push({ ...laptop });\n}\n\nconst whiteColor = \"#ffffff\";\nconst holderColor = \"#333333\";\n\nconst laptopLiftedHeight = 3;\nconst distanceBetweenLaptops = 1.7;\nconst exportSTEP = false;\n\nbitbybit.babylon.scene.backgroundColour({ colour: \"#bbbbbb\" });\n\nconst pointLightConf = new Bit.Inputs.BabylonScene.PointLightDto();\npointLightConf.position = [-15, 20, -5];\npointLightConf.intensity = 8000;\npointLightConf.diffuse = \"#3333ff\";\npointLightConf.radius = 0;\nbitbybit.babylon.scene.drawPointLight(pointLightConf);\n\nconst controlPoints = [\n [-12.5, 0, 0],\n [-8, 13, 0],\n [-4, 11, 0],\n [-2, 6, 0],\n [2, 6, 0],\n [4, 14, 0],\n [8, 17, 0],\n [12.5, 0, 0]\n] as Bit.Inputs.Base.Point3[];\n\nlet laptopStand;\nlet laptopStandMesh;\n\nconst laptopsFilletsMesh = [];\n\nasync function start() {\n const ground = await bitbybit.occt.shapes.face.createCircleFace({ center: [0, 0, 0], direction: [0, 1, 0], radius: 75, });\n const groundOptions = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n groundOptions.faceColour = whiteColor;\n groundOptions.drawEdges = false;\n await bitbybit.draw.drawAnyAsync({ entity: ground, options: groundOptions });\n\n const renderLaptops = async (laptops) => {\n\n laptops.forEach(laptop => {\n laptop.center = [0, laptop.height / 2 + laptopLiftedHeight, 0] as Bit.Inputs.Base.Point3;\n });\n\n let laptopFillets = [];\n let totalDistance = 0;\n let previousLaptopLength = 0;\n\n laptops.forEach(async (laptop, index) => {\n totalDistance += distanceBetweenLaptops + laptop.length / 2 + previousLaptopLength / 2;\n previousLaptopLength = laptop.length;\n laptop.center[2] = totalDistance;\n const laptopBaseModel = await bitbybit.occt.shapes.solid.createBox({\n width: laptop.width,\n length: laptop.length,\n height: laptop.height,\n center: laptop.center\n });\n const laptopFillet = await bitbybit.occt.fillets.filletEdges({ shape: laptopBaseModel, indexes: undefined, radius: 0.2 });\n laptopFillets.push(laptopFillet);\n\n const laptopVisModel = await bitbybit.occt.shapes.solid.createBox({\n width: laptop.width,\n length: laptop.length - 0.01,\n height: laptop.height,\n center: laptop.center\n });\n const laptopVisFillet = await bitbybit.occt.fillets.filletEdges({ shape: laptopVisModel, indexes: undefined, radius: 0.2 });\n laptopFillets.push(laptopFillet);\n\n const di = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n\n di.faceOpacity = 0.2;\n di.edgeWidth = 5;\n di.edgeOpacity = 0.6;\n di.edgeColour = whiteColor;\n di.faceColour = whiteColor;\n const laptopFilletMesh = await bitbybit.draw.drawAnyAsync({ entity: laptopVisFillet, options: di });\n laptopsFilletsMesh.push(laptopFilletMesh);\n })\n\n const polygonWire = await bitbybit.occt.shapes.wire.createPolygonWire({\n points: controlPoints\n });\n const extrusion = await bitbybit.occt.operations.extrude({\n shape: polygonWire, direction: [0, 0, totalDistance += distanceBetweenLaptops + previousLaptopLength / 2]\n });\n const laptopStandFillet = await bitbybit.occt.fillets.filletEdges({ shape: extrusion, indexes: undefined, radius: 1 });\n const laptopStandThick = await bitbybit.occt.operations.makeThickSolidSimple({ shape: laptopStandFillet, offset: -0.5 });\n\n laptopStand = await bitbybit.occt.booleans.difference({ shape: laptopStandThick, shapes: laptopFillets, keepEdges: false });\n const li = new Bit.Inputs.OCCT.DrawShapeDto(laptopStand);\n li.faceOpacity = 1;\n if (flipColor) {\n li.faceColour = \"#0000ff\";\n li.edgeColour = whiteColor;\n } else {\n li.faceColour = holderColor;\n li.edgeColour = whiteColor;\n }\n li.edgeWidth = 5;\n laptopStandMesh = await bitbybit.draw.drawAnyAsync({ entity: laptopStand, options: li });\n const laptopsMeshes = await Promise.all(laptopsFilletsMesh);\n return [laptopStandMesh, ...laptopsMeshes];\n }\n\n const meshes = await renderLaptops(laptops);\n return { meshes };\n}\n\nclass Laptop {\n width: number;\n length: number;\n height: number;\n center?: Bit.Inputs.Base.Point3;\n}\n\nBit.setBitbybitRunnerResult(start());","version":"0.20.5","type":"typescript"}} title="Bitbybit Rete Editor - 3D Laptop Holder" description="3D Laptop holder configurator" /> diff --git a/docs/learn/3d-bits/tutorials/product-palm-table.mdx b/docs/learn/3d-bits/tutorials/product-palm-table.mdx index f3215759..563c5841 100644 --- a/docs/learn/3d-bits/tutorials/product-palm-table.mdx +++ b/docs/learn/3d-bits/tutorials/product-palm-table.mdx @@ -157,7 +157,7 @@ To save you time, here is the embedded Rete script used in this tutorial for the diff --git a/docs/learn/code/common/base/color/color-usage-examples.md b/docs/learn/code/common/base/color/color-usage-examples.md index 30028f60..ed691869 100644 --- a/docs/learn/code/common/base/color/color-usage-examples.md +++ b/docs/learn/code/common/base/color/color-usage-examples.md @@ -48,21 +48,21 @@ Click through the tabs below to see the implementation. You can interact with th colorParamfaceColoredgeColorcolorParam0faceColorcolorParam255colorParam0255edgeColor#0000ff6000TRUE0.01TRUEfaceColorTRUEedgeColor10","version":"0.20.4","type":"blockly"}} + script={{"script":"colorParamfaceColoredgeColorcolorParam0faceColorcolorParam255colorParam0255edgeColor#0000ff6000TRUE0.01TRUEfaceColorTRUEedgeColor10","version":"0.20.5","type":"blockly"}} title="Color Usage Example" /> {\n\n const colorParam = 55;\n const rgbToHexOptions = new Bit.Inputs.Color.RGBMinMaxDto();\n rgbToHexOptions.r = colorParam;\n rgbToHexOptions.b = colorParam;\n const faceColor = bitbybit.color.rgbToHex(rgbToHexOptions);\n\n // This might look strange as you could just assign the string to edgeColor directly, \n // but this identity function is nice to have in visual prgramming editors - check Rete & Blockly\n // examples\n \n const edgeColor = bitbybit.color.hexColor({ color: \"#ff0000\" });\n\n const cubeOptions = new Bit.Inputs.OCCT.CubeDto();\n cubeOptions.size = 6;\n const cube = await bitbybit.occt.shapes.solid.createCube(cubeOptions);\n\n const drawOpt = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n drawOpt.faceColour = faceColor;\n drawOpt.edgeColour = edgeColor;\n drawOpt.edgeWidth = 10;\n bitbybit.draw.drawAnyAsync({ entity: cube, options: drawOpt });\n}\n\nstart();","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = async () => {\n\n const colorParam = 55;\n const rgbToHexOptions = new Bit.Inputs.Color.RGBMinMaxDto();\n rgbToHexOptions.r = colorParam;\n rgbToHexOptions.b = colorParam;\n const faceColor = bitbybit.color.rgbToHex(rgbToHexOptions);\n\n // This might look strange as you could just assign the string to edgeColor directly, \n // but this identity function is nice to have in visual prgramming editors - check Rete & Blockly\n // examples\n \n const edgeColor = bitbybit.color.hexColor({ color: \"#ff0000\" });\n\n const cubeOptions = new Bit.Inputs.OCCT.CubeDto();\n cubeOptions.size = 6;\n const cube = await bitbybit.occt.shapes.solid.createCube(cubeOptions);\n\n const drawOpt = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n drawOpt.faceColour = faceColor;\n drawOpt.edgeColour = edgeColor;\n drawOpt.edgeWidth = 10;\n bitbybit.draw.drawAnyAsync({ entity: cube, options: drawOpt });\n}\n\nstart();","version":"0.20.5","type":"typescript"}} title="Color Usage Example" /> diff --git a/docs/learn/code/common/base/point/point-hex-grid-example.md b/docs/learn/code/common/base/point/point-hex-grid-example.md index 6502b85e..26828a59 100644 --- a/docs/learn/code/common/base/point/point-hex-grid-example.md +++ b/docs/learn/code/common/base/point/point-hex-grid-example.md @@ -55,21 +55,21 @@ Click through the tabs below to see the implementation. Each example will genera hexagonspointshexCornershexPolylinesihexagons20101010FALSEFALSEFALSEFALSEFALSETRUEFALSEpointshexagonscentershexCornershexagonshexagonshexPolylinesihexCornersINSERTLASThexPolylinesiTRUEpointshexPolylines","version":"0.20.4","type":"blockly"}} + script={{"script":"hexagonspointshexCornershexPolylinesihexagons20101010FALSEFALSEFALSEFALSEFALSETRUEFALSEpointshexagonscentershexCornershexagonshexagonshexPolylinesihexCornersINSERTLASThexPolylinesiTRUEpointshexPolylines","version":"0.20.5","type":"blockly"}} title="Point Hex Grid Example" /> {\n\n // 1. Configure the hexagonal grid options\n const hexOptions = new Bit.Inputs.Point.HexGridScaledToFitDto();\n // Set options different from defaults. \n // TypeScript IntelliSense (e.g., typing \"hexOptions.\") will show all available parameters.\n hexOptions.width = 20;\n hexOptions.height = 10;\n hexOptions.nrHexagonsInWidth = 10;\n hexOptions.nrHexagonsInHeight = 10;\n hexOptions.centerGrid = true; // Center the entire grid at the world origin [0,0,0]\n // Example: hexOptions.flatTop = true; // To get flat-topped hexagons\n // Example: hexOptions.pointsOnGround = true; // To project to XZ plane if original is XY\n\n // 2. Generate the hex grid data\n // This function returns an object like: \n // { centers: Point3[], hexagons: Point3[][], shortestDistEdge, longestDistEdge, maxFilletRadius }\n const hexResult = bitbybit.point.hexGridScaledToFit(hexOptions);\n\n // 3. Create polylines for each hexagon's outline\n // hexResult.hexagons is a list of lists (e.g., [[v1,v2..v6 for hex1], [v1,v2..v6 for hex2], ...])\n // We .map() over this list to create a Polyline object for each hexagon.\n const polylines = hexResult.hexagons.map(singleHexagonCornerPoints => {\n const polylineOptions = new Bit.Inputs.Polyline.PolylineCreateDto();\n polylineOptions.points = singleHexagonCornerPoints; // The 6 corner points\n polylineOptions.isClosed = true; // Ensure the polyline forms a closed loop\n return bitbybit.polyline.create(polylineOptions);\n }) as Bit.Inputs.Base.Polyline3[]; // Type assertion: the result is an array of Polyline3 objects\n\n // 4. Draw the center points of the hexagons\n // hexResult.centers is a list of 3D points: [[cx1,cy1,cz1], [cx2,cy2,cz2], ...]\n bitbybit.draw.drawAnyAsync({ entity: hexResult.centers });\n\n // 5. Draw the polylines representing the hexagon outlines\n bitbybit.draw.drawAnyAsync({ entity: polylines });\n\n}\n\nstart();","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = () => {\n\n // 1. Configure the hexagonal grid options\n const hexOptions = new Bit.Inputs.Point.HexGridScaledToFitDto();\n // Set options different from defaults. \n // TypeScript IntelliSense (e.g., typing \"hexOptions.\") will show all available parameters.\n hexOptions.width = 20;\n hexOptions.height = 10;\n hexOptions.nrHexagonsInWidth = 10;\n hexOptions.nrHexagonsInHeight = 10;\n hexOptions.centerGrid = true; // Center the entire grid at the world origin [0,0,0]\n // Example: hexOptions.flatTop = true; // To get flat-topped hexagons\n // Example: hexOptions.pointsOnGround = true; // To project to XZ plane if original is XY\n\n // 2. Generate the hex grid data\n // This function returns an object like: \n // { centers: Point3[], hexagons: Point3[][], shortestDistEdge, longestDistEdge, maxFilletRadius }\n const hexResult = bitbybit.point.hexGridScaledToFit(hexOptions);\n\n // 3. Create polylines for each hexagon's outline\n // hexResult.hexagons is a list of lists (e.g., [[v1,v2..v6 for hex1], [v1,v2..v6 for hex2], ...])\n // We .map() over this list to create a Polyline object for each hexagon.\n const polylines = hexResult.hexagons.map(singleHexagonCornerPoints => {\n const polylineOptions = new Bit.Inputs.Polyline.PolylineCreateDto();\n polylineOptions.points = singleHexagonCornerPoints; // The 6 corner points\n polylineOptions.isClosed = true; // Ensure the polyline forms a closed loop\n return bitbybit.polyline.create(polylineOptions);\n }) as Bit.Inputs.Base.Polyline3[]; // Type assertion: the result is an array of Polyline3 objects\n\n // 4. Draw the center points of the hexagons\n // hexResult.centers is a list of 3D points: [[cx1,cy1,cz1], [cx2,cy2,cz2], ...]\n bitbybit.draw.drawAnyAsync({ entity: hexResult.centers });\n\n // 5. Draw the polylines representing the hexagon outlines\n bitbybit.draw.drawAnyAsync({ entity: polylines });\n\n}\n\nstart();","version":"0.20.5","type":"typescript"}} title="Point Hex Grid Example" /> diff --git a/docs/learn/code/common/base/point/point-spiral-examples.md b/docs/learn/code/common/base/point/point-spiral-examples.md index 0f404309..7315d310 100644 --- a/docs/learn/code/common/base/point/point-spiral-examples.md +++ b/docs/learn/code/common/base/point/point-spiral-examples.md @@ -45,21 +45,21 @@ Click through the tabs below to see the implementation. Each example will genera 0.9300361","version":"0.20.4","type":"blockly"}} + script={{"script":"0.9300361","version":"0.20.5","type":"blockly"}} title="Point Spiral Example" /> {\n\n // 1. Configure the spiral parameters\n const spiralOptions = new Bit.Inputs.Point.SpiralDto();\n spiralOptions.numberPoints = 300;\n spiralOptions.radius = 6; // Overall extent of the spiral; default is 1\n spiralOptions.widening = 3; // Controls how tight the spiral is; default is 10\n spiralOptions.phi = 0.9; // Constant influencing the spiral pattern; default relates to Golden Angle\n spiralOptions.factor = 1; // General scaling factor; default is 1\n\n // 2. Generate the list of points forming the spiral\n // The bitbybit.point.spiral() function returns an array of 3D points.\n const points = bitbybit.point.spiral(spiralOptions);\n\n // 3. Draw the generated points in the scene\n // The drawAnyAsync function can take an array of points and will render them.\n bitbybit.draw.drawAnyAsync({ entity: points });\n\n}\n\nstart();","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = () => {\n\n // 1. Configure the spiral parameters\n const spiralOptions = new Bit.Inputs.Point.SpiralDto();\n spiralOptions.numberPoints = 300;\n spiralOptions.radius = 6; // Overall extent of the spiral; default is 1\n spiralOptions.widening = 3; // Controls how tight the spiral is; default is 10\n spiralOptions.phi = 0.9; // Constant influencing the spiral pattern; default relates to Golden Angle\n spiralOptions.factor = 1; // General scaling factor; default is 1\n\n // 2. Generate the list of points forming the spiral\n // The bitbybit.point.spiral() function returns an array of 3D points.\n const points = bitbybit.point.spiral(spiralOptions);\n\n // 3. Draw the generated points in the scene\n // The drawAnyAsync function can take an array of points and will render them.\n bitbybit.draw.drawAnyAsync({ entity: points });\n\n}\n\nstart();","version":"0.20.5","type":"typescript"}} title="Point Spiral Example" /> diff --git a/docs/learn/code/common/base/text/text-usage-examples.md b/docs/learn/code/common/base/text/text-usage-examples.md index 3d80027d..61208627 100644 --- a/docs/learn/code/common/base/text/text-usage-examples.md +++ b/docs/learn/code/common/base/text/text-usage-examples.md @@ -53,21 +53,21 @@ Click through the tabs below to see the implementation. Each example will create namewordwordListnameJohnwordawesomewordListnamewordHi {0}, you are {1}!wordList'Roboto''Regular'20.2180000010'centerMiddle'","version":"0.20.4","type":"blockly"}} + script={{"script":"namewordwordListnameJohnwordawesomewordListnamewordHi {0}, you are {1}!wordList'Roboto''Regular'20.2180000010'centerMiddle'","version":"0.20.5","type":"blockly"}} title="Text Formatting And 3D Fonts" /> {\n const name = \"John\";\n const word = \"awesome\";\n\n const formatOpt = new Bit.Inputs.Text.TextFormatDto();\n formatOpt.text = \"Hi {0}, you are {1}!\";\n formatOpt.values = [name, word];\n const formattedText = bitbybit.text.format(formatOpt);\n\n const text3dOptions = new Bit.Advanced.Text3D.Text3DDto();\n text3dOptions.text = formattedText;\n text3dOptions.rotation = 180;\n text3dOptions.fontSize = 2;\n const text3d = await bitbybit.advanced.text3d.create(text3dOptions);\n bitbybit.draw.drawAnyAsync({ entity: text3d });\n}\n\nstart();","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = async () => {\n const name = \"John\";\n const word = \"awesome\";\n\n const formatOpt = new Bit.Inputs.Text.TextFormatDto();\n formatOpt.text = \"Hi {0}, you are {1}!\";\n formatOpt.values = [name, word];\n const formattedText = bitbybit.text.format(formatOpt);\n\n const text3dOptions = new Bit.Advanced.Text3D.Text3DDto();\n text3dOptions.text = formattedText;\n text3dOptions.rotation = 180;\n text3dOptions.fontSize = 2;\n const text3d = await bitbybit.advanced.text3d.create(text3dOptions);\n bitbybit.draw.drawAnyAsync({ entity: text3d });\n}\n\nstart();","version":"0.20.5","type":"typescript"}} title="Text Formatting And 3D Fonts" /> diff --git a/docs/learn/code/common/base/vector/vector-usage-examples.md b/docs/learn/code/common/base/vector/vector-usage-examples.md index 37274627..da6c802d 100644 --- a/docs/learn/code/common/base/vector/vector-usage-examples.md +++ b/docs/learn/code/common/base/vector/vector-usage-examples.md @@ -60,21 +60,21 @@ Click through the tabs below to see the implementation in Rete, Blockly, and Typ spanItemsspanEaseItemsvectorsj40040010100.450.50.5FALSE#ffffff#ffffffspanItems0.205spanEaseItemsspanItems05'easeInSine'FALSEvectorsj1spanItems1INSERTLASTvectorsGETFROM_STARTspanItemsjGETFROM_STARTspanEaseItemsj0vectorsvectors","version":"0.20.4","type":"blockly"}} + script={{"script":"spanItemsspanEaseItemsvectorsj40040010100.450.50.5FALSE#ffffff#ffffffspanItems0.205spanEaseItemsspanItems05'easeInSine'FALSEvectorsj1spanItems1INSERTLASTvectorsGETFROM_STARTspanItemsjGETFROM_STARTspanEaseItemsj0vectorsvectors","version":"0.20.5","type":"blockly"}} title="Vector Span & Ease In Combination" /> {\n\n const spanOptions = new Bit.Inputs.Vector.SpanDto();\n spanOptions.step = 0.2;\n spanOptions.min = 0;\n spanOptions.max = 5;\n const spanItems = bitbybit.vector.span(spanOptions);\n\n const spanEaseOptions = new Bit.Inputs.Vector.SpanEaseItemsDto();\n spanEaseOptions.ease = Bit.Inputs.Math.easeEnum.easeInSine;\n spanEaseOptions.min = 0;\n spanEaseOptions.max = 5;\n spanEaseOptions.nrItems = spanItems.length;\n const spanEaseItems = bitbybit.vector.spanEaseItems(spanEaseOptions);\n\n const vectors = spanItems.map((s, index) => [s, spanEaseItems[index], 0]) as Bit.Inputs.Base.Vector3[];\n\n bitbybit.draw.drawGridMesh(new Bit.Inputs.Draw.SceneDrawGridMeshDto());\n bitbybit.draw.drawAnyAsync({ entity: vectors });\n\n}\n\nstart();","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = () => {\n\n const spanOptions = new Bit.Inputs.Vector.SpanDto();\n spanOptions.step = 0.2;\n spanOptions.min = 0;\n spanOptions.max = 5;\n const spanItems = bitbybit.vector.span(spanOptions);\n\n const spanEaseOptions = new Bit.Inputs.Vector.SpanEaseItemsDto();\n spanEaseOptions.ease = Bit.Inputs.Math.easeEnum.easeInSine;\n spanEaseOptions.min = 0;\n spanEaseOptions.max = 5;\n spanEaseOptions.nrItems = spanItems.length;\n const spanEaseItems = bitbybit.vector.spanEaseItems(spanEaseOptions);\n\n const vectors = spanItems.map((s, index) => [s, spanEaseItems[index], 0]) as Bit.Inputs.Base.Vector3[];\n\n bitbybit.draw.drawGridMesh(new Bit.Inputs.Draw.SceneDrawGridMeshDto());\n bitbybit.draw.drawAnyAsync({ entity: vectors });\n\n}\n\nstart();","version":"0.20.5","type":"typescript"}} title="Vector Span & Ease In Combination" /> diff --git a/docs/learn/code/common/draw/examples.mdx b/docs/learn/code/common/draw/examples.mdx index 3422dcbe..09488be8 100644 --- a/docs/learn/code/common/draw/examples.mdx +++ b/docs/learn/code/common/draw/examples.mdx @@ -28,7 +28,7 @@ The primary component for custom drawing is typically found under the path: **Rete Example: Filleted Cube with Custom Drawing Options** @@ -44,7 +44,7 @@ The primary block for custom drawing is typically found under: 5000TRUE111#ff6600#000099#cc33cc20.3TRUETRUETRUE0.01FALSE0.06#ff00ffFALSE0.06#0000ff","version":"0.20.4","type":"blockly"}} + script={{"script":"5000TRUE111#ff6600#000099#cc33cc20.3TRUETRUETRUE0.01FALSE0.06#ff00ffFALSE0.06#0000ff","version":"0.20.5","type":"blockly"}} title="Blockly Drawing Example" description="Draws simple filletted cube geometry." /> @@ -55,7 +55,7 @@ Finally, we achieve the same result using TypeScript. The code follows a similar {\n\n const cubeOptions = new Bit.Inputs.OCCT.CubeDto();\n cubeOptions.size = 5;\n const cube = await bitbybit.occt.shapes.solid.createCube(cubeOptions);\n const filletOptions = new Bit.Inputs.OCCT.FilletDto()\n filletOptions.shape = cube;\n filletOptions.radius = 1;\n const roundedCube = await bitbybit.occt.fillets.filletEdges(filletOptions);\n\n const drawOcctOptions = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n drawOcctOptions.faceColour = \"#0000ff\";\n drawOcctOptions.edgeColour = \"#ff5555\";\n drawOcctOptions.drawVertices = true;\n drawOcctOptions.vertexSize = 0.3;\n // The rest of options remain default (initialized inside the instance)\n const drawnMesh = await bitbybit.draw.drawAnyAsync({ entity: roundedCube, options: drawOcctOptions })\n // drawnMesh is BABYLONJS Mesh if BabylonJS engine is used. In Three.JS it turns into Group.\n return drawnMesh;\n \n}\n\nstart();","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = async () => {\n\n const cubeOptions = new Bit.Inputs.OCCT.CubeDto();\n cubeOptions.size = 5;\n const cube = await bitbybit.occt.shapes.solid.createCube(cubeOptions);\n const filletOptions = new Bit.Inputs.OCCT.FilletDto()\n filletOptions.shape = cube;\n filletOptions.radius = 1;\n const roundedCube = await bitbybit.occt.fillets.filletEdges(filletOptions);\n\n const drawOcctOptions = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n drawOcctOptions.faceColour = \"#0000ff\";\n drawOcctOptions.edgeColour = \"#ff5555\";\n drawOcctOptions.drawVertices = true;\n drawOcctOptions.vertexSize = 0.3;\n // The rest of options remain default (initialized inside the instance)\n const drawnMesh = await bitbybit.draw.drawAnyAsync({ entity: roundedCube, options: drawOcctOptions })\n // drawnMesh is BABYLONJS Mesh if BabylonJS engine is used. In Three.JS it turns into Group.\n return drawnMesh;\n \n}\n\nstart();","version":"0.20.5","type":"typescript"}} title="TypeScript Drawing Example" description="Draws simple filletted cube geometry." /> \ No newline at end of file diff --git a/docs/learn/code/common/occt/booleans/operations.mdx b/docs/learn/code/common/occt/booleans/operations.mdx index e8713ecf..18eb8468 100644 --- a/docs/learn/code/common/occt/booleans/operations.mdx +++ b/docs/learn/code/common/occt/booleans/operations.mdx @@ -49,21 +49,21 @@ The following scripts demonstrate creating three solids (a box, a cylinder, and **TypeScript Example: Union of Solids** {\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 5;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n\n const cylinderOpt = new Bit.Inputs.OCCT.CylinderDto();\n cylinderOpt.radius = 3;\n cylinderOpt.height = 7;\n cylinderOpt.center = [3, 0, 3];\n const cylinder = await bitbybit.occt.shapes.solid.createCylinder(cylinderOpt);\n\n\n const sphereOpt = new Bit.Inputs.OCCT.SphereDto();\n sphereOpt.radius = 3;\n sphereOpt.center = [-1.5, 1.5, -5];\n const sphere = await bitbybit.occt.shapes.solid.createSphere(sphereOpt);\n\n const union = await bitbybit.occt.booleans.union({\n shapes: [box, cylinder, sphere],\n keepEdges: false\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: union\n });\n}\n\nstart();\n","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = async () => {\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 5;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n\n const cylinderOpt = new Bit.Inputs.OCCT.CylinderDto();\n cylinderOpt.radius = 3;\n cylinderOpt.height = 7;\n cylinderOpt.center = [3, 0, 3];\n const cylinder = await bitbybit.occt.shapes.solid.createCylinder(cylinderOpt);\n\n\n const sphereOpt = new Bit.Inputs.OCCT.SphereDto();\n sphereOpt.radius = 3;\n sphereOpt.center = [-1.5, 1.5, -5];\n const sphere = await bitbybit.occt.shapes.solid.createSphere(sphereOpt);\n\n const union = await bitbybit.occt.booleans.union({\n shapes: [box, cylinder, sphere],\n keepEdges: false\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: union\n });\n}\n\nstart();\n","version":"0.20.5","type":"typescript"}} title="Union Three Solids" /> **Blockly Example: Union of Solids** boxspherecylinderbox585000sphere3-1.51.5-5cylinder37303010boxcylindersphereFALSE","version":"0.20.4","type":"blockly"}} + script={{"script":"boxspherecylinderbox585000sphere3-1.51.5-5cylinder37303010boxcylindersphereFALSE","version":"0.20.5","type":"blockly"}} title="Union Three Solids" /> **Rete Example: Union of Solids** @@ -94,21 +94,21 @@ These scripts demonstrate creating a box, cylinder, and sphere, then subtracting **TypeScript Example: Difference of Solids** {\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 5;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n\n const cylinderOpt = new Bit.Inputs.OCCT.CylinderDto();\n cylinderOpt.radius = 3;\n cylinderOpt.height = 7;\n cylinderOpt.center = [3, 0, 3];\n const cylinder = await bitbybit.occt.shapes.solid.createCylinder(cylinderOpt);\n\n\n const sphereOpt = new Bit.Inputs.OCCT.SphereDto();\n sphereOpt.radius = 3;\n sphereOpt.center = [-1.5, 1.5, -5];\n const sphere = await bitbybit.occt.shapes.solid.createSphere(sphereOpt);\n\n const diff = await bitbybit.occt.booleans.difference({\n shape: box,\n shapes: [cylinder, sphere],\n keepEdges: false\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: diff\n });\n}\n\nstart();\n","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = async () => {\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 5;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n\n const cylinderOpt = new Bit.Inputs.OCCT.CylinderDto();\n cylinderOpt.radius = 3;\n cylinderOpt.height = 7;\n cylinderOpt.center = [3, 0, 3];\n const cylinder = await bitbybit.occt.shapes.solid.createCylinder(cylinderOpt);\n\n\n const sphereOpt = new Bit.Inputs.OCCT.SphereDto();\n sphereOpt.radius = 3;\n sphereOpt.center = [-1.5, 1.5, -5];\n const sphere = await bitbybit.occt.shapes.solid.createSphere(sphereOpt);\n\n const diff = await bitbybit.occt.booleans.difference({\n shape: box,\n shapes: [cylinder, sphere],\n keepEdges: false\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: diff\n });\n}\n\nstart();\n","version":"0.20.5","type":"typescript"}} title="Difference of Solids" /> **Blockly Example: Difference of Solids** boxspherecylinderbox585000sphere3-1.51.5-5cylinder37303010boxcylindersphereFALSE","version":"0.20.4","type":"blockly"}} + script={{"script":"boxspherecylinderbox585000sphere3-1.51.5-5cylinder37303010boxcylindersphereFALSE","version":"0.20.5","type":"blockly"}} title="Difference of Solids" /> **Rete Example: Difference of Solids** @@ -138,21 +138,21 @@ These scripts create a box, cylinder, and sphere, and then compute their common **TypeScript Example: Intersection of Solids** {\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 5;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n\n const cylinderOpt = new Bit.Inputs.OCCT.CylinderDto();\n cylinderOpt.radius = 3;\n cylinderOpt.height = 7;\n cylinderOpt.center = [3, 0, 3];\n const cylinder = await bitbybit.occt.shapes.solid.createCylinder(cylinderOpt);\n\n\n const sphereOpt = new Bit.Inputs.OCCT.SphereDto();\n sphereOpt.radius = 3;\n sphereOpt.center = [-1.5, 1.5, -5];\n const sphere = await bitbybit.occt.shapes.solid.createSphere(sphereOpt);\n\n const diff = await bitbybit.occt.booleans.intersection({\n shapes: [box, cylinder, sphere],\n keepEdges: false\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: diff\n });\n}\n\nstart();\n","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = async () => {\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 5;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n\n const cylinderOpt = new Bit.Inputs.OCCT.CylinderDto();\n cylinderOpt.radius = 3;\n cylinderOpt.height = 7;\n cylinderOpt.center = [3, 0, 3];\n const cylinder = await bitbybit.occt.shapes.solid.createCylinder(cylinderOpt);\n\n\n const sphereOpt = new Bit.Inputs.OCCT.SphereDto();\n sphereOpt.radius = 3;\n sphereOpt.center = [-1.5, 1.5, -5];\n const sphere = await bitbybit.occt.shapes.solid.createSphere(sphereOpt);\n\n const diff = await bitbybit.occt.booleans.intersection({\n shapes: [box, cylinder, sphere],\n keepEdges: false\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: diff\n });\n}\n\nstart();\n","version":"0.20.5","type":"typescript"}} title="Intersection of Solids" /> **Blockly Example: Intersection of Solids** boxspherecylinderbox585000sphere3-1.51.5-5cylinder37303010boxcylindersphereFALSE","version":"0.20.4","type":"blockly"}} + script={{"script":"boxspherecylinderbox585000sphere3-1.51.5-5cylinder37303010boxcylindersphereFALSE","version":"0.20.5","type":"blockly"}} title="Intersection of Solids" /> **Rete Example: Intersection of Solids** diff --git a/docs/learn/code/common/occt/fillets/chamfer-circular-edges.mdx b/docs/learn/code/common/occt/fillets/chamfer-circular-edges.mdx index bb831bb7..4f19934a 100644 --- a/docs/learn/code/common/occt/fillets/chamfer-circular-edges.mdx +++ b/docs/learn/code/common/occt/fillets/chamfer-circular-edges.mdx @@ -25,21 +25,21 @@ The examples below demonstrate creating a box with a cylindrical hole through it **TypeScript Example: Chamfer Circular Edge of a Hole** {\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n const cylinderOpt = new Bit.Inputs.OCCT.CylinderDto();\n cylinderOpt.direction = [1, 0, 0];\n cylinderOpt.center = [-5, 0, 0];\n cylinderOpt.radius = 2;\n cylinderOpt.height = 10;\n\n const cylinder = await bitbybit.occt.shapes.solid.createCylinder(cylinderOpt)\n\n const difference = await bitbybit.occt.booleans.difference({\n shape: box,\n shapes: [cylinder],\n keepEdges: false\n });\n\n const chamfered = await bitbybit.occt.fillets.chamferEdges({\n shape: difference,\n distance: 0.4\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: chamfered,\n });\n}\n\nstart();\n","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = async () => {\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n const cylinderOpt = new Bit.Inputs.OCCT.CylinderDto();\n cylinderOpt.direction = [1, 0, 0];\n cylinderOpt.center = [-5, 0, 0];\n cylinderOpt.radius = 2;\n cylinderOpt.height = 10;\n\n const cylinder = await bitbybit.occt.shapes.solid.createCylinder(cylinderOpt)\n\n const difference = await bitbybit.occt.booleans.difference({\n shape: box,\n shapes: [cylinder],\n keepEdges: false\n });\n\n const chamfered = await bitbybit.occt.fillets.chamferEdges({\n shape: difference,\n distance: 0.4\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: chamfered,\n });\n}\n\nstart();\n","version":"0.20.5","type":"typescript"}} title="Chamfer Circular Edge" /> **Blockly Example: Chamfer Circular Edge of a Hole** differenceSoliddifferenceSolid5810000210-500100FALSEdifferenceSolid0.4","version":"0.20.4","type":"blockly"}} + script={{"script":"differenceSoliddifferenceSolid5810000210-500100FALSEdifferenceSolid0.4","version":"0.20.5","type":"blockly"}} title="Chamfer Circular Edge" /> **Rete Example: Chamfer Circular Edge of a Hole** diff --git a/docs/learn/code/common/occt/fillets/chamfers-intro.mdx b/docs/learn/code/common/occt/fillets/chamfers-intro.mdx index 54a48853..9b18ffc5 100644 --- a/docs/learn/code/common/occt/fillets/chamfers-intro.mdx +++ b/docs/learn/code/common/occt/fillets/chamfers-intro.mdx @@ -48,21 +48,21 @@ The following examples in TypeScript, Rete, and Blockly demonstrate creating a s **TypeScript Example: Chamfer All Edges of a Solid** {\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n const chamfered = await bitbybit.occt.fillets.chamferEdges({\n shape: box,\n distance: 1,\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: chamfered,\n });\n}\n\nstart();\n","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = async () => {\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n const chamfered = await bitbybit.occt.fillets.chamferEdges({\n shape: box,\n distance: 1,\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: chamfered,\n });\n}\n\nstart();\n","version":"0.20.5","type":"typescript"}} title="Chamfer All Edges of Solid" /> **Blockly Example: Chamfer All Edges of a Solid** 58100001","version":"0.20.4","type":"blockly"}} + script={{"script":"58100001","version":"0.20.5","type":"blockly"}} title="Chamfer All Edges of Solid" /> **Rete Example: Chamfer All Edges of a Solid** diff --git a/docs/learn/code/common/occt/fillets/chamfers-var-radius-on-spec-edges.mdx b/docs/learn/code/common/occt/fillets/chamfers-var-radius-on-spec-edges.mdx index 7c4c2c8e..145f9a52 100644 --- a/docs/learn/code/common/occt/fillets/chamfers-var-radius-on-spec-edges.mdx +++ b/docs/learn/code/common/occt/fillets/chamfers-var-radius-on-spec-edges.mdx @@ -28,21 +28,21 @@ The examples below demonstrate creating a solid box and then applying chamfers w **TypeScript Example: Chamfer Specific Edges with Variable Distances** {\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n const chamfered = await bitbybit.occt.fillets.chamferEdges({\n shape: box,\n distanceList: [0.2, 1.2, 2],\n indexes: [1, 2, 3]\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: chamfered,\n });\n}\n\nstart();\n","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = async () => {\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n const chamfered = await bitbybit.occt.fillets.chamferEdges({\n shape: box,\n distanceList: [0.2, 1.2, 2],\n indexes: [1, 2, 3]\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: chamfered,\n });\n}\n\nstart();\n","version":"0.20.5","type":"typescript"}} title="Chamfer Specific Edges of Solid" /> **Blockly Example: Chamfer Specific Edges with Variable Distances** 58100000.10.31.22123","version":"0.20.4","type":"blockly"}} + script={{"script":"58100000.10.31.22123","version":"0.20.5","type":"blockly"}} title="Chamfer Specific Edges of Solid" /> **Rete Example: Chamfer Specific Edges with Variable Distances** diff --git a/docs/learn/code/common/occt/fillets/fillet-3d-wires.mdx b/docs/learn/code/common/occt/fillets/fillet-3d-wires.mdx index 43213de7..695f9630 100644 --- a/docs/learn/code/common/occt/fillets/fillet-3d-wires.mdx +++ b/docs/learn/code/common/occt/fillets/fillet-3d-wires.mdx @@ -55,21 +55,21 @@ In these examples, we first construct a 3D star-shaped wire. Then, we apply diff **TypeScript Example: Fillet Specific Corners of a 3D Wire** {\n\n const repeatOpt = new Bit.Inputs.Lists.MultiplyItemDto([innerFillet, outerFillet], nrRays);\n const radiusList = bitbybit.lists.repeat(repeatOpt).flat();\n const spanOptions = new Bit.Inputs.Vector.SpanDto(1, 1, nrRays * 2);\n const indexes = bitbybit.vector.span(spanOptions);\n\n const starOptions = new Bit.Inputs.OCCT.StarDto(outerStarRadius, innerStarRadius, nrRays, [0, 0, 0], [0, 1, 0], 4, false);\n const star = await bitbybit.occt.shapes.wire.createStarWire(starOptions);\n\n const filletOptions = new Bit.Inputs.OCCT.Fillet3DWireDto(star, undefined, [0, 1, 0], radiusList, indexes);\n const starFillet = await bitbybit.occt.fillets.fillet3DWire(filletOptions);\n\n const startFilletTranslated1 = await bitbybit.occt.transforms.translate({ shape: starFillet, translation: [0, 5, 0] })\n const startFilletTranslated2 = await bitbybit.occt.transforms.translate({ shape: starFillet, translation: [0, 10, 0] })\n\n\n const starFace = await bitbybit.occt.shapes.face.createFaceFromWire({ shape: startFilletTranslated2, planar: false });\n const starThick = await bitbybit.occt.operations.makeThickSolidSimple({ shape: starFace, offset: -1 });\n const starThickFillet = await bitbybit.occt.fillets.filletEdges({ shape: starThick, radius: 0.3 });\n\n const drawOptions = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n drawOptions.edgeWidth = 15;\n bitbybit.draw.drawAnyAsync({ entity: star, options: drawOptions });\n bitbybit.draw.drawAnyAsync({ entity: startFilletTranslated1, options: drawOptions });\n drawOptions.faceColour = \"#5555ff\";\n drawOptions.edgeColour = \"#000000\";\n drawOptions.edgeWidth = 2;\n drawOptions.precision = 0.005;\n bitbybit.draw.drawAnyAsync({ entity: starThickFillet, options: drawOptions });\n\n const gridOptions = new Bit.Inputs.Draw.SceneDrawGridMeshDto();\n bitbybit.draw.drawGridMesh(gridOptions);\n const skyboxOptions = new Bit.Inputs.BabylonScene.SkyboxDto();\n skyboxOptions.skybox = Bit.Inputs.Base.skyboxEnum.clearSky;\n bitbybit.babylon.scene.enableSkybox(skyboxOptions);\n}\n\nstart();\n","version":"0.20.4","type":"typescript"}} + script={{"script":"const nrRays = 7;\nconst outerStarRadius = 10;\nconst innerStarRadius = 4;\nconst outerFillet = 0.6;\nconst innerFillet = 1.7;\n\nconst start = async () => {\n\n const repeatOpt = new Bit.Inputs.Lists.MultiplyItemDto([innerFillet, outerFillet], nrRays);\n const radiusList = bitbybit.lists.repeat(repeatOpt).flat();\n const spanOptions = new Bit.Inputs.Vector.SpanDto(1, 1, nrRays * 2);\n const indexes = bitbybit.vector.span(spanOptions);\n\n const starOptions = new Bit.Inputs.OCCT.StarDto(outerStarRadius, innerStarRadius, nrRays, [0, 0, 0], [0, 1, 0], 4, false);\n const star = await bitbybit.occt.shapes.wire.createStarWire(starOptions);\n\n const filletOptions = new Bit.Inputs.OCCT.Fillet3DWireDto(star, undefined, [0, 1, 0], radiusList, indexes);\n const starFillet = await bitbybit.occt.fillets.fillet3DWire(filletOptions);\n\n const startFilletTranslated1 = await bitbybit.occt.transforms.translate({ shape: starFillet, translation: [0, 5, 0] })\n const startFilletTranslated2 = await bitbybit.occt.transforms.translate({ shape: starFillet, translation: [0, 10, 0] })\n\n\n const starFace = await bitbybit.occt.shapes.face.createFaceFromWire({ shape: startFilletTranslated2, planar: false });\n const starThick = await bitbybit.occt.operations.makeThickSolidSimple({ shape: starFace, offset: -1 });\n const starThickFillet = await bitbybit.occt.fillets.filletEdges({ shape: starThick, radius: 0.3 });\n\n const drawOptions = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n drawOptions.edgeWidth = 15;\n bitbybit.draw.drawAnyAsync({ entity: star, options: drawOptions });\n bitbybit.draw.drawAnyAsync({ entity: startFilletTranslated1, options: drawOptions });\n drawOptions.faceColour = \"#5555ff\";\n drawOptions.edgeColour = \"#000000\";\n drawOptions.edgeWidth = 2;\n drawOptions.precision = 0.005;\n bitbybit.draw.drawAnyAsync({ entity: starThickFillet, options: drawOptions });\n\n const gridOptions = new Bit.Inputs.Draw.SceneDrawGridMeshDto();\n bitbybit.draw.drawGridMesh(gridOptions);\n const skyboxOptions = new Bit.Inputs.BabylonScene.SkyboxDto();\n skyboxOptions.skybox = Bit.Inputs.Base.skyboxEnum.clearSky;\n bitbybit.babylon.scene.enableSkybox(skyboxOptions);\n}\n\nstart();\n","version":"0.20.5","type":"typescript"}} title="Fillet 3D Wire Specific Corners" /> **Blockly Example: Fillet Specific Corners of a 3D Wire** nrRaysinnerFilletRadiusouterRadiusFilletfilletIndexesradiusLististarPromisestarFilletPromisenrRays7innerFilletRadius1.7outerRadiusFillet0.6filletIndexes11MULTIPLYnrRays2'clearSky'10000.10.7radiusListi1MULTIPLYnrRays21EQi20INSERTLASTradiusListouterRadiusFilletINSERTLASTradiusListinnerFilletRadiusstarPromise000010nrRays1044FALSEstarFilletPromisestarPromiseradiusListfilletIndexes010starPromise0.01FALSE#ff0000TRUE#ffffff15starFilletPromise0500.01FALSE#ff0000TRUE#ffffff15starFilletPromise0100FALSE-10.30.005TRUE#3333ffTRUE#000000240040010100.450.50.5FALSE#ffffff#ffffff","version":"0.20.4","type":"blockly"}} + script={{"script":"nrRaysinnerFilletRadiusouterRadiusFilletfilletIndexesradiusLististarPromisestarFilletPromisenrRays7innerFilletRadius1.7outerRadiusFillet0.6filletIndexes11MULTIPLYnrRays2'clearSky'10000.10.7radiusListi1MULTIPLYnrRays21EQi20INSERTLASTradiusListouterRadiusFilletINSERTLASTradiusListinnerFilletRadiusstarPromise000010nrRays1044FALSEstarFilletPromisestarPromiseradiusListfilletIndexes010starPromise0.01FALSE#ff0000TRUE#ffffff15starFilletPromise0500.01FALSE#ff0000TRUE#ffffff15starFilletPromise0100FALSE-10.30.005TRUE#3333ffTRUE#000000240040010100.450.50.5FALSE#ffffff#ffffff","version":"0.20.5","type":"blockly"}} title="Fillet 3D Wire Specific Corners" /> **Rete Example: Fillet Specific Corners of a 3D Wire** diff --git a/docs/learn/code/common/occt/fillets/fillets-intro.mdx b/docs/learn/code/common/occt/fillets/fillets-intro.mdx index 5764f90e..8a409ff2 100644 --- a/docs/learn/code/common/occt/fillets/fillets-intro.mdx +++ b/docs/learn/code/common/occt/fillets/fillets-intro.mdx @@ -43,21 +43,21 @@ The following examples in TypeScript, Rete, and Blockly demonstrate creating a s **TypeScript Example: Fillet All Edges of a Solid** {\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n const filleted = await bitbybit.occt.fillets.filletEdges({\n shape: box,\n radius: 1,\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: filleted,\n });\n}\n\nstart();\n","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = async () => {\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n const filleted = await bitbybit.occt.fillets.filletEdges({\n shape: box,\n radius: 1,\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: filleted,\n });\n}\n\nstart();\n","version":"0.20.5","type":"typescript"}} title="Fillet Solid" /> **Blockly Example: Fillet All Edges of a Solid** 58100001","version":"0.20.4","type":"blockly"}} + script={{"script":"58100001","version":"0.20.5","type":"blockly"}} title="Fillet Solid" /> **Rete Example: Fillet All Edges of a Solid** diff --git a/docs/learn/code/common/occt/fillets/fillets-on-2d-wire-corners.mdx b/docs/learn/code/common/occt/fillets/fillets-on-2d-wire-corners.mdx index 81b34431..9a5ccbb8 100644 --- a/docs/learn/code/common/occt/fillets/fillets-on-2d-wire-corners.mdx +++ b/docs/learn/code/common/occt/fillets/fillets-on-2d-wire-corners.mdx @@ -30,21 +30,21 @@ The examples below demonstrate creating a 2D wire and then applying fillets with **TypeScript Example: Fillet Specific Corners of a Wire with Variable Radii** {\n const squareOpt = new Bit.Inputs.OCCT.SquareDto();\n const square = await bitbybit.occt.shapes.wire.createSquareWire(squareOpt);\n const squareFillet = await bitbybit.occt.fillets.fillet2d({\n shape: square,\n radiusList: [0.1, 0.3],\n indexes: [1, 3]\n });\n\n bitbybit.draw.drawAnyAsync({\n entity: squareFillet\n });\n}\n\nstart();\n","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = async () => {\n const squareOpt = new Bit.Inputs.OCCT.SquareDto();\n const square = await bitbybit.occt.shapes.wire.createSquareWire(squareOpt);\n const squareFillet = await bitbybit.occt.fillets.fillet2d({\n shape: square,\n radiusList: [0.1, 0.3],\n indexes: [1, 3]\n });\n\n bitbybit.draw.drawAnyAsync({\n entity: squareFillet\n });\n}\n\nstart();\n","version":"0.20.5","type":"typescript"}} title="Fillet Specific Corners of Wire" /> **Blockly Example: Fillet Specific Corners of a Wire with Variable Radii** 10000100.10.313","version":"0.20.4","type":"blockly"}} + script={{"script":"10000100.10.313","version":"0.20.5","type":"blockly"}} title="Fillet Specific Corners of Wire" /> **Rete Example: Fillet Specific Corners of a Wire with Variable Radii** diff --git a/docs/learn/code/common/occt/fillets/fillets-on-2d-wires.mdx b/docs/learn/code/common/occt/fillets/fillets-on-2d-wires.mdx index 86f0d3e3..68529ca2 100644 --- a/docs/learn/code/common/occt/fillets/fillets-on-2d-wires.mdx +++ b/docs/learn/code/common/occt/fillets/fillets-on-2d-wires.mdx @@ -29,21 +29,21 @@ The examples below demonstrate how to create a simple 2D wire (e.g., a polyline **TypeScript Example: Fillet All Corners of a Wire** {\n const squareOpt = new Bit.Inputs.OCCT.SquareDto();\n const square = await bitbybit.occt.shapes.wire.createSquareWire(squareOpt);\n const squareFillet = await bitbybit.occt.fillets.fillet2d({\n shape: square,\n radius: 0.25\n });\n\n bitbybit.draw.drawAnyAsync({\n entity: squareFillet\n });\n}\n\nstart();\n","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = async () => {\n const squareOpt = new Bit.Inputs.OCCT.SquareDto();\n const square = await bitbybit.occt.shapes.wire.createSquareWire(squareOpt);\n const squareFillet = await bitbybit.occt.fillets.fillet2d({\n shape: square,\n radius: 0.25\n });\n\n bitbybit.draw.drawAnyAsync({\n entity: squareFillet\n });\n}\n\nstart();\n","version":"0.20.5","type":"typescript"}} title="Fillet All Corners of Wire" /> **Blockly Example: Fillet All Corners of a Wire** 10000100.24","version":"0.20.4","type":"blockly"}} + script={{"script":"10000100.24","version":"0.20.5","type":"blockly"}} title="Fillet All Corners of Wire" /> **Rete Example: Fillet All Corners of a Wire** diff --git a/docs/learn/code/common/occt/fillets/fillets-var-radius-on-spec-edges.mdx b/docs/learn/code/common/occt/fillets/fillets-var-radius-on-spec-edges.mdx index d07b443e..0e617131 100644 --- a/docs/learn/code/common/occt/fillets/fillets-var-radius-on-spec-edges.mdx +++ b/docs/learn/code/common/occt/fillets/fillets-var-radius-on-spec-edges.mdx @@ -31,7 +31,7 @@ The examples below demonstrate creating a solid box and then applying fillets wi **TypeScript Example: Fillet Specific Edges with Variable Radii** {\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n const filleted = await bitbybit.occt.fillets.filletEdges({\n shape: box,\n radiusList: [1, 2, 0.3],\n indexes: [1, 2, 3]\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: filleted,\n });\n}\n\nstart();\n","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = async () => {\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n const filleted = await bitbybit.occt.fillets.filletEdges({\n shape: box,\n radiusList: [1, 2, 0.3],\n indexes: [1, 2, 3]\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: filleted,\n });\n}\n\nstart();\n","version":"0.20.5","type":"typescript"}} title="Variable Fillet Radius On Spec Edges" /> @@ -39,7 +39,7 @@ The examples below demonstrate creating a solid box and then applying fillets wi **Blockly Example: Fillet Specific Edges with Variable Radii** 5810000120.3123","version":"0.20.4","type":"blockly"}} + script={{"script":"5810000120.3123","version":"0.20.5","type":"blockly"}} title="Variable Fillet Radius On Spec Edges" /> @@ -47,7 +47,7 @@ The examples below demonstrate creating a solid box and then applying fillets wi **Rete Example: Fillet Specific Edges with Variable Radii** diff --git a/docs/learn/code/common/occt/operations/advanced-loft.md b/docs/learn/code/common/occt/operations/advanced-loft.md index ade039f4..7ecb779b 100644 --- a/docs/learn/code/common/occt/operations/advanced-loft.md +++ b/docs/learn/code/common/occt/operations/advanced-loft.md @@ -45,21 +45,21 @@ Here's a breakdown of the process described: nrCornerswire1wire2wire3nrCorners10151515030117910001000100010003wire1000010nrCorners31wire2030010nrCorners10.3wire3070010nrCorners60.5wire3wire2wire1FALSEFALSEFALSEFALSE10FALSE31e-7'approxChordLength'01000-300.01TRUE#cc33ccTRUE#ffffff2","version":"0.20.4","type":"blockly"}} + script={{"script":"nrCornerswire1wire2wire3nrCorners10151515030117910001000100010003wire1000010nrCorners31wire2030010nrCorners10.3wire3070010nrCorners60.5wire3wire2wire1FALSEFALSEFALSEFALSE10FALSE31e-7'approxChordLength'01000-300.01TRUE#cc33ccTRUE#ffffff2","version":"0.20.5","type":"blockly"}} title="Advanced Loft Operation" /> {\n\n // --- 1. Camera Configuration ---\n // Create a new configuration object for the scene's Arc Rotate Camera.\n const arcCameraOptions = new CameraConfigurationDto();\n // Set the camera's position in 3D space (x, y, z).\n arcCameraOptions.position = [15, 15, 15];\n // Set the point the camera will look at.\n arcCameraOptions.lookAt = [0, 3, 0];\n // Apply these settings to the active camera in the scene.\n scene.adjustActiveArcRotateCamera(arcCameraOptions);\n\n // Define the number of corners for the polygonal profiles.\n const nrCorners = 10;\n\n // --- 2. Create the First Profile (Bottom) ---\n // Create a DTO to define an n-sided polygon wire.\n const ngonOpt = new NGonWireDto();\n ngonOpt.nrCorners = nrCorners;\n ngonOpt.radius = 3;\n // Asynchronously create the first polygon wire shape at the default center [0,0,0].\n const wire1 = await wire.createNGonWire(ngonOpt);\n\n // Create a DTO for a 2D fillet operation to round the corners of a wire.\n const filletOpt = new FilletDto();\n filletOpt.radius = 0.3; // The radius of the rounded corners.\n filletOpt.shape = wire1; // Specify that the fillet should be applied to wire1.\n // Asynchronously apply the fillet and store the new, smoothed wire.\n const filletedWire1 = await fillets.fillet2d(filletOpt);\n\n // --- 3. Create the Second Profile (Middle) ---\n // Reuse the ngonOpt DTO but modify its properties for the next shape.\n ngonOpt.center = [0, 3, 0]; // Move the center up along the Y-axis.\n ngonOpt.radius = 1; // Make this polygon smaller.\n const wire2 = await wire.createNGonWire(ngonOpt);\n\n // Reuse the filletOpt DTO to apply the same fillet radius to the new wire.\n filletOpt.shape = wire2;\n const filletedWire2 = await fillets.fillet2d(filletOpt);\n\n // --- 4. Create the Third Profile (Top) ---\n // Reuse and modify the DTOs again for the third and final profile.\n ngonOpt.center = [0, 7, 0]; // Move this one even higher.\n ngonOpt.radius = 6; // Make this polygon the largest.\n const wire3 = await wire.createNGonWire(ngonOpt);\n\n // Use a larger fillet radius for this larger wire.\n filletOpt.radius = 0.5;\n filletOpt.shape = wire3;\n const filletedWire3 = await fillets.fillet2d(filletOpt);\n\n // --- 5. Perform the Loft Operation ---\n // A loft creates a 3D solid by connecting a series of 2D profiles.\n const loftAdvancedOptions = new LoftAdvancedDto();\n // Specify a single point where the loft should begin, creating a pointed top.\n loftAdvancedOptions.startVertex = [0, 10, 0];\n // Specify a single point where the loft should end, creating a pointed bottom.\n loftAdvancedOptions.endVertex = [0, -3, 0];\n // Provide the array of profiles to connect. The order matters.\n loftAdvancedOptions.shapes = [filletedWire3, filletedWire2, filletedWire1];\n // Asynchronously execute the loft operation to create the final 3D shape.\n const loftedShape = await operations.loftAdvanced(loftAdvancedOptions)\n\n // --- 6. Draw the Final Shape ---\n // Create a DTO to define how the shape should be drawn.\n const drawOptions = new DrawOcctShapeSimpleOptions();\n // Set the color of the shape's faces to magenta.\n drawOptions.faceColour = \"#ff00ff\";\n\n // Call the generic drawing function to render the OCCT shape in the scene.\n bitbybit.draw.drawAnyAsync({\n entity: loftedShape, // The shape to draw.\n options: drawOptions // The drawing options to apply.\n });\n\n}\n\n// Execute the main function to start the script.\nstart();","version":"0.20.4","type":"typescript"}} + script={{"script":"\n// Import DTOs for configuring various operations. DTOs are objects used to pass data.\n// Import camera configuration for setting up the scene view.\nconst { CameraConfigurationDto } = Bit.Inputs.BabylonScene;\n// Import DTOs for OpenCASCADE (OCCT) geometric modeling: creating polygons, fillets, and lofts.\nconst { NGonWireDto, FilletDto, LoftAdvancedDto } = Bit.Inputs.OCCT;\n// Import DTO for specifying drawing options, like color and opacity.\nconst { DrawOcctShapeSimpleOptions } = Bit.Inputs.Draw;\n// Import a specific type for an OCCT wire, ensuring type safety in our code.\ntype TopoDSWirePointer = Bit.Inputs.OCCT.TopoDSWirePointer;\n\n// Destructure the bitbybit API to get direct access to its main modules.\n// 'scene' provides access to Babylon.js scene controls.\nconst { scene } = bitbybit.babylon;\n// 'wire', 'fillets', and 'operations' are part of the OCCT module for creating and manipulating shapes.\nconst { wire } = bitbybit.occt.shapes;\nconst { fillets, operations } = bitbybit.occt;\n\n// Define an asynchronous function to execute the main logic.\n// Using async/await is necessary because geometry creation and drawing are non-blocking operations.\nconst start = async () => {\n\n // --- 1. Camera Configuration ---\n // Create a new configuration object for the scene's Arc Rotate Camera.\n const arcCameraOptions = new CameraConfigurationDto();\n // Set the camera's position in 3D space (x, y, z).\n arcCameraOptions.position = [15, 15, 15];\n // Set the point the camera will look at.\n arcCameraOptions.lookAt = [0, 3, 0];\n // Apply these settings to the active camera in the scene.\n scene.adjustActiveArcRotateCamera(arcCameraOptions);\n\n // Define the number of corners for the polygonal profiles.\n const nrCorners = 10;\n\n // --- 2. Create the First Profile (Bottom) ---\n // Create a DTO to define an n-sided polygon wire.\n const ngonOpt = new NGonWireDto();\n ngonOpt.nrCorners = nrCorners;\n ngonOpt.radius = 3;\n // Asynchronously create the first polygon wire shape at the default center [0,0,0].\n const wire1 = await wire.createNGonWire(ngonOpt);\n\n // Create a DTO for a 2D fillet operation to round the corners of a wire.\n const filletOpt = new FilletDto();\n filletOpt.radius = 0.3; // The radius of the rounded corners.\n filletOpt.shape = wire1; // Specify that the fillet should be applied to wire1.\n // Asynchronously apply the fillet and store the new, smoothed wire.\n const filletedWire1 = await fillets.fillet2d(filletOpt);\n\n // --- 3. Create the Second Profile (Middle) ---\n // Reuse the ngonOpt DTO but modify its properties for the next shape.\n ngonOpt.center = [0, 3, 0]; // Move the center up along the Y-axis.\n ngonOpt.radius = 1; // Make this polygon smaller.\n const wire2 = await wire.createNGonWire(ngonOpt);\n\n // Reuse the filletOpt DTO to apply the same fillet radius to the new wire.\n filletOpt.shape = wire2;\n const filletedWire2 = await fillets.fillet2d(filletOpt);\n\n // --- 4. Create the Third Profile (Top) ---\n // Reuse and modify the DTOs again for the third and final profile.\n ngonOpt.center = [0, 7, 0]; // Move this one even higher.\n ngonOpt.radius = 6; // Make this polygon the largest.\n const wire3 = await wire.createNGonWire(ngonOpt);\n\n // Use a larger fillet radius for this larger wire.\n filletOpt.radius = 0.5;\n filletOpt.shape = wire3;\n const filletedWire3 = await fillets.fillet2d(filletOpt);\n\n // --- 5. Perform the Loft Operation ---\n // A loft creates a 3D solid by connecting a series of 2D profiles.\n const loftAdvancedOptions = new LoftAdvancedDto();\n // Specify a single point where the loft should begin, creating a pointed top.\n loftAdvancedOptions.startVertex = [0, 10, 0];\n // Specify a single point where the loft should end, creating a pointed bottom.\n loftAdvancedOptions.endVertex = [0, -3, 0];\n // Provide the array of profiles to connect. The order matters.\n loftAdvancedOptions.shapes = [filletedWire3, filletedWire2, filletedWire1];\n // Asynchronously execute the loft operation to create the final 3D shape.\n const loftedShape = await operations.loftAdvanced(loftAdvancedOptions)\n\n // --- 6. Draw the Final Shape ---\n // Create a DTO to define how the shape should be drawn.\n const drawOptions = new DrawOcctShapeSimpleOptions();\n // Set the color of the shape's faces to magenta.\n drawOptions.faceColour = \"#ff00ff\";\n\n // Call the generic drawing function to render the OCCT shape in the scene.\n bitbybit.draw.drawAnyAsync({\n entity: loftedShape, // The shape to draw.\n options: drawOptions // The drawing options to apply.\n });\n\n}\n\n// Execute the main function to start the script.\nstart();","version":"0.20.5","type":"typescript"}} title="Advanced Loft Operation" /> diff --git a/docs/learn/code/common/occt/operations/extrusions.md b/docs/learn/code/common/occt/operations/extrusions.md index 518c3243..11304d53 100644 --- a/docs/learn/code/common/occt/operations/extrusions.md +++ b/docs/learn/code/common/occt/operations/extrusions.md @@ -35,21 +35,21 @@ By understanding extrusion, you gain a powerful tool for your 3D modeling toolki heightheight40000107740FALSE0.50height0","version":"0.20.4","type":"blockly"}} + script={{"script":"heightheight40000107740FALSE0.50height0","version":"0.20.5","type":"blockly"}} title="Extrude the wire into shell kind of shape" /> {\n\n // Define a constant 'height' for the extrusion operation.\n const height = 4;\n\n // Create a new StarDto instance to configure the properties of a star-shaped wire.\n const starOpt = new StarDto();\n // Set the inner radius of the star.\n starOpt.innerRadius = 4;\n // Set the outer radius of the star.\n starOpt.outerRadius = 7;\n // Asynchronously create the star-shaped wire using the configured options.\n // The 'await' keyword pauses execution until the wire creation is complete.\n // Bitbybit runs such CAD operations in the worker thread, which doesn't block UI\n // and is usually faster.\n const star = await wire.createStarWire(starOpt);\n\n // Create a new FilletDto instance to configure a 2D fillet operation.\n // The generic type specifies that this fillet will be applied to a wire.\n const filletOpt = new FilletDto();\n // Set the shape to be filleted to the previously created star wire.\n filletOpt.shape = star;\n // Set the radius for the fillet (rounding of corners).\n filletOpt.radius = 0.5;\n // Asynchronously apply the 2D fillet to the star wire.\n const roundedStar = await fillets.fillet2d(filletOpt);\n\n // Create a new ExtrudeDto instance to configure an extrusion operation.\n // The generic type specifies that a wire will be extruded.\n const extrudeOpt = new ExtrudeDto();\n // Set the shape to be extruded to the previously created rounded star wire.\n extrudeOpt.shape = roundedStar;\n // Set the direction and magnitude of the extrusion as a 3D vector [x, y, z].\n // Here, it extrudes along the Y-axis by the value of 'height'.\n extrudeOpt.direction = [0, height, 0];\n // Asynchronously perform the extrusion operation on the rounded star wire.\n const extrudedRoundStar = await operations.extrude(extrudeOpt);\n\n // Asynchronously draw the final extruded shape in the 3D scene.\n // 'entity' specifies the shape to be drawn.\n bitbybit.draw.drawAnyAsync({ entity: extrudedRoundStar });\n\n}\n\n// Call the 'start' function to execute the script.\nstart();","version":"0.20.4","type":"typescript"}} + script={{"script":"// Import the 'wire' module for creating wire shapes from the OCCT (OpenCASCADE Technology) library.\nconst { wire } = bitbybit.occt.shapes;\n// Import 'fillets' and 'operations' modules for performing filleting and extrusion operations on OCCT shapes.\nconst { fillets, operations } = bitbybit.occt;\n// Import Data Transfer Objects (DTOs) for configuring star creation, filleting, and extrusion.\n// DTOs are used to pass parameters to the respective functions.\nconst { StarDto, FilletDto, ExtrudeDto } = Bit.Inputs.OCCT;\n// Define a type alias for a pointer to a TopoDS_Wire, which is an OCCT data structure representing a wire.\ntype TopoDSWirePointer = Bit.Inputs.OCCT.TopoDSWirePointer;\n\n// Define an asynchronous function named 'start' which will contain the main logic for creating and drawing the shape.\n// The 'async' keyword allows the use of 'await' for operations that might take time, like geometry creation.\nconst start = async () => {\n\n // Define a constant 'height' for the extrusion operation.\n const height = 4;\n\n // Create a new StarDto instance to configure the properties of a star-shaped wire.\n const starOpt = new StarDto();\n // Set the inner radius of the star.\n starOpt.innerRadius = 4;\n // Set the outer radius of the star.\n starOpt.outerRadius = 7;\n // Asynchronously create the star-shaped wire using the configured options.\n // The 'await' keyword pauses execution until the wire creation is complete.\n // Bitbybit runs such CAD operations in the worker thread, which doesn't block UI\n // and is usually faster.\n const star = await wire.createStarWire(starOpt);\n\n // Create a new FilletDto instance to configure a 2D fillet operation.\n // The generic type specifies that this fillet will be applied to a wire.\n const filletOpt = new FilletDto();\n // Set the shape to be filleted to the previously created star wire.\n filletOpt.shape = star;\n // Set the radius for the fillet (rounding of corners).\n filletOpt.radius = 0.5;\n // Asynchronously apply the 2D fillet to the star wire.\n const roundedStar = await fillets.fillet2d(filletOpt);\n\n // Create a new ExtrudeDto instance to configure an extrusion operation.\n // The generic type specifies that a wire will be extruded.\n const extrudeOpt = new ExtrudeDto();\n // Set the shape to be extruded to the previously created rounded star wire.\n extrudeOpt.shape = roundedStar;\n // Set the direction and magnitude of the extrusion as a 3D vector [x, y, z].\n // Here, it extrudes along the Y-axis by the value of 'height'.\n extrudeOpt.direction = [0, height, 0];\n // Asynchronously perform the extrusion operation on the rounded star wire.\n const extrudedRoundStar = await operations.extrude(extrudeOpt);\n\n // Asynchronously draw the final extruded shape in the 3D scene.\n // 'entity' specifies the shape to be drawn.\n bitbybit.draw.drawAnyAsync({ entity: extrudedRoundStar });\n\n}\n\n// Call the 'start' function to execute the script.\nstart();","version":"0.20.5","type":"typescript"}} title="Extrude the wire into shell kind of shape" /> @@ -69,21 +69,21 @@ In the following examples, we first construct a complex wire, then create a plan heightheight4000010070000100520FALSEFALSETRUETRUE0height0","version":"0.20.4","type":"blockly"}} + script={{"script":"heightheight4000010070000100520FALSEFALSETRUETRUE0height0","version":"0.20.5","type":"blockly"}} title="Extrude the face into solid shape" /> {\n\n const height = 4;\n\n const heartOpt = new Heart2DDto();\n heartOpt.sizeApprox = 7;\n const heart1 = await wire.createHeartWire(heartOpt);\n\n heartOpt.sizeApprox = 5;\n const heart2 = await wire.createHeartWire(heartOpt);\n\n const zigZagOpt = new ZigZagBetweenTwoWiresDto(heart1, heart2, 31);\n const zigZagWire = await wire.createZigZagBetweenTwoWires(zigZagOpt);\n\n const faceFromWireOpt = new FaceFromWireDto(zigZagWire, true);\n const zigZagFace = await face.createFaceFromWire(faceFromWireOpt);\n \n const extrudeOpt = new ExtrudeDto();\n extrudeOpt.shape = zigZagFace;\n extrudeOpt.direction = [0, height, 0];\n const extrudedZigZag = await operations.extrude(extrudeOpt);\n\n bitbybit.draw.drawAnyAsync({ entity: extrudedZigZag });\n\n}\n\nstart();","version":"0.20.4","type":"typescript"}} + script={{"script":"const { wire, face } = bitbybit.occt.shapes;\nconst { fillets, operations } = bitbybit.occt;\nconst { FilletDto, ExtrudeDto, Heart2DDto, ZigZagBetweenTwoWiresDto, FaceFromWireDto } = Bit.Inputs.OCCT;\ntype TopoDSWirePointer = Bit.Inputs.OCCT.TopoDSWirePointer;\ntype TopoDSFacePointer = Bit.Inputs.OCCT.TopoDSFacePointer;\nconst start = async () => {\n\n const height = 4;\n\n const heartOpt = new Heart2DDto();\n heartOpt.sizeApprox = 7;\n const heart1 = await wire.createHeartWire(heartOpt);\n\n heartOpt.sizeApprox = 5;\n const heart2 = await wire.createHeartWire(heartOpt);\n\n const zigZagOpt = new ZigZagBetweenTwoWiresDto(heart1, heart2, 31);\n const zigZagWire = await wire.createZigZagBetweenTwoWires(zigZagOpt);\n\n const faceFromWireOpt = new FaceFromWireDto(zigZagWire, true);\n const zigZagFace = await face.createFaceFromWire(faceFromWireOpt);\n \n const extrudeOpt = new ExtrudeDto();\n extrudeOpt.shape = zigZagFace;\n extrudeOpt.direction = [0, height, 0];\n const extrudedZigZag = await operations.extrude(extrudeOpt);\n\n bitbybit.draw.drawAnyAsync({ entity: extrudedZigZag });\n\n}\n\nstart();","version":"0.20.5","type":"typescript"}} title="Extrude the face into solid shape" /> diff --git a/docs/learn/code/common/occt/operations/rotated-extrusions.md b/docs/learn/code/common/occt/operations/rotated-extrusions.md index 5e6c66ca..b590d6aa 100644 --- a/docs/learn/code/common/occt/operations/rotated-extrusions.md +++ b/docs/learn/code/common/occt/operations/rotated-extrusions.md @@ -34,21 +34,21 @@ In the examples below, we will demonstrate how to create a simple solid 3D helic 130000104360TRUE","version":"0.20.4","type":"blockly"}} + script={{"script":"130000104360TRUE","version":"0.20.5","type":"blockly"}} title="Extrude the wire into shell kind of shape" /> {\n\n const recOpt = new Bit.Inputs.OCCT.RectangleDto(1, 3);\n const rectangle = await bitbybit.occt.shapes.wire.createRectangleWire(recOpt);\n const rotatedExtrudeOpt = new Bit.Inputs.OCCT.RotationExtrudeDto(rectangle, 4);\n const rotatedExtrude = await bitbybit.occt.operations.rotatedExtrude(rotatedExtrudeOpt)\n\n bitbybit.draw.drawAnyAsync({ entity: rotatedExtrude });\n\n}\n\nstart();","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = async () => {\n\n const recOpt = new Bit.Inputs.OCCT.RectangleDto(1, 3);\n const rectangle = await bitbybit.occt.shapes.wire.createRectangleWire(recOpt);\n const rotatedExtrudeOpt = new Bit.Inputs.OCCT.RotationExtrudeDto(rectangle, 4);\n const rotatedExtrude = await bitbybit.occt.operations.rotatedExtrude(rotatedExtrudeOpt)\n\n bitbybit.draw.drawAnyAsync({ entity: rotatedExtrude });\n\n}\n\nstart();","version":"0.20.5","type":"typescript"}} title="Extrude the wire into shell kind of shape" /> @@ -62,21 +62,21 @@ When the profile is further from the center it will form a helix like shape. Thi pointPromisespointsngonRotationPromisesi3050300150117910001000100010003pointPromises00001061012FALSETRUEpointspointPromisesngonRotationPromisesipointsINSERTLASTngonRotationPromisesi01061.530270TRUEngonRotationPromises","version":"0.20.4","type":"blockly"}} + script={{"script":"pointPromisespointsngonRotationPromisesi3050300150117910001000100010003pointPromises00001061012FALSETRUEpointspointPromisesngonRotationPromisesipointsINSERTLASTngonRotationPromisesi01061.530270TRUEngonRotationPromises","version":"0.20.5","type":"blockly"}} title="Extrude the wire into shell kind of shape" /> {\n\n // Adjust the default camera position to face the object\n const cameraOptions = new CameraConfigurationDto();\n cameraOptions.position = [30, 50, 50];\n cameraOptions.lookAt = [0, 15, 0];\n scene.adjustActiveArcRotateCamera(cameraOptions);\n\n // This ellipse will be used to derive origins for ngons on the ground plane\n const ellipseOptions = new EllipseDto();\n ellipseOptions.radiusMinor = 6;\n ellipseOptions.radiusMajor = 10;\n const ellipse = await wire.createEllipseWire(ellipseOptions);\n\n // We divide the wire into 12 segments and return the points\n const divideOptions = new DivideDto(ellipse);\n divideOptions.removeEndPoint = true;\n divideOptions.nrOfDivisions = 12;\n const points = await wire.divideWireByEqualDistanceToPoints(divideOptions);\n\n // Create ngons on these points\n const ngonOptions = new NGonWireDto();\n ngonOptions.radius = 1.5;\n const ngonPromises = points.map(point => {\n ngonOptions.center = point;\n return wire.createNGonWire(ngonOptions);\n });\n\n const ngons = await Promise.all(ngonPromises);\n\n // Form rotated extrusions on all of the points\n const rotatedExtrudeOptions = new RotationExtrudeDto();\n rotatedExtrudeOptions.angle = 270;\n rotatedExtrudeOptions.height = 30;\n const rotatedExtrusionPromises = ngons.map(ngon => {\n rotatedExtrudeOptions.shape = ngon;\n return operations.rotatedExtrude(rotatedExtrudeOptions);\n });\n\n const rotatedExtrusions = await Promise.all(rotatedExtrusionPromises);\n\n // Compounding multiple shapes will generally deliver much better rendering performance\n // as it will form a single mesh for all of the geometries involved in compound\n const compoundOptions = new CompoundShapesDto(rotatedExtrusions);\n const ngonCompound = await compound.makeCompound(compoundOptions);\n\n // As a last step we draw the ngon with default occt settings (defualt because we omit specifying options property)\n bitbybit.draw.drawAnyAsync({ entity: ngonCompound });\n\n}\n\n// Let's not forget to execute the start function, otherwise nothing will happen.\nstart();","version":"0.20.4","type":"typescript"}} + script={{"script":"// These destructured imports are optional, but convenient later on - option DTO's are classes\nconst { EllipseDto, RotationExtrudeDto, DivideDto, NGonWireDto, CompoundShapesDto } = Bit.Inputs.OCCT;\nconst { CameraConfigurationDto } = Bit.Inputs.BabylonScene;\n// These are parts of the bitbybit API that will be used in the script\nconst { wire, compound } = bitbybit.occt.shapes;\nconst { operations } = bitbybit.occt;\nconst { scene } = bitbybit.babylon;\n// Types need to be destructured one by one\ntype TopoDSWirePointer = Bit.Inputs.OCCT.TopoDSWirePointer;\n\n// Async definition of the start function where we can await on asynchronous CAD algorithms running inside the web workers\nconst start = async () => {\n\n // Adjust the default camera position to face the object\n const cameraOptions = new CameraConfigurationDto();\n cameraOptions.position = [30, 50, 50];\n cameraOptions.lookAt = [0, 15, 0];\n scene.adjustActiveArcRotateCamera(cameraOptions);\n\n // This ellipse will be used to derive origins for ngons on the ground plane\n const ellipseOptions = new EllipseDto();\n ellipseOptions.radiusMinor = 6;\n ellipseOptions.radiusMajor = 10;\n const ellipse = await wire.createEllipseWire(ellipseOptions);\n\n // We divide the wire into 12 segments and return the points\n const divideOptions = new DivideDto(ellipse);\n divideOptions.removeEndPoint = true;\n divideOptions.nrOfDivisions = 12;\n const points = await wire.divideWireByEqualDistanceToPoints(divideOptions);\n\n // Create ngons on these points\n const ngonOptions = new NGonWireDto();\n ngonOptions.radius = 1.5;\n const ngonPromises = points.map(point => {\n ngonOptions.center = point;\n return wire.createNGonWire(ngonOptions);\n });\n\n const ngons = await Promise.all(ngonPromises);\n\n // Form rotated extrusions on all of the points\n const rotatedExtrudeOptions = new RotationExtrudeDto();\n rotatedExtrudeOptions.angle = 270;\n rotatedExtrudeOptions.height = 30;\n const rotatedExtrusionPromises = ngons.map(ngon => {\n rotatedExtrudeOptions.shape = ngon;\n return operations.rotatedExtrude(rotatedExtrudeOptions);\n });\n\n const rotatedExtrusions = await Promise.all(rotatedExtrusionPromises);\n\n // Compounding multiple shapes will generally deliver much better rendering performance\n // as it will form a single mesh for all of the geometries involved in compound\n const compoundOptions = new CompoundShapesDto(rotatedExtrusions);\n const ngonCompound = await compound.makeCompound(compoundOptions);\n\n // As a last step we draw the ngon with default occt settings (defualt because we omit specifying options property)\n bitbybit.draw.drawAnyAsync({ entity: ngonCompound });\n\n}\n\n// Let's not forget to execute the start function, otherwise nothing will happen.\nstart();","version":"0.20.5","type":"typescript"}} title="Extrude the wire into shell kind of shape" /> diff --git a/docs/learn/code/common/occt/operations/simple-loft.md b/docs/learn/code/common/occt/operations/simple-loft.md index c91e5f4d..db6acfad 100644 --- a/docs/learn/code/common/occt/operations/simple-loft.md +++ b/docs/learn/code/common/occt/operations/simple-loft.md @@ -37,21 +37,21 @@ In this tutorial, we'll walk through the process of creating a simple lofted sha ellipse1ellipse2ellipse3ellipsesloftellipse100001048ellipse203001014ellipse307001026ellipsesellipse1ellipse2ellipse3loftellipsesFALSEloft0.001TRUE#6600ccTRUE#ffffff2","version":"0.20.4","type":"blockly"}} + script={{"script":"ellipse1ellipse2ellipse3ellipsesloftellipse100001048ellipse203001014ellipse307001026ellipsesellipse1ellipse2ellipse3loftellipsesFALSEloft0.001TRUE#6600ccTRUE#ffffff2","version":"0.20.5","type":"blockly"}} title="Simple Loft Operation" /> {\n\n // Create an instance of EllipseDto to define the properties of the first ellipse.\n const ellipseOpt = new EllipseDto();\n // Set the minor radius of the ellipse.\n ellipseOpt.radiusMinor = 4;\n // Set the major radius of the ellipse.\n ellipseOpt.radiusMajor = 8;\n // Create the first elliptical wire. The center defaults to [0,0,0] and direction to [0,1,0] if not specified.\n // 'await' is used because shape creation is an asynchronous operation.\n const ellipse1 = await shapes.wire.createEllipseWire(ellipseOpt);\n\n // Modify the ellipseOpt for the second ellipse.\n // Set the center of the second ellipse.\n ellipseOpt.center = [0, 3, 0];\n // Set the minor radius for the second ellipse.\n ellipseOpt.radiusMinor = 1;\n // Set the major radius for the second ellipse.\n ellipseOpt.radiusMajor = 4;\n // Create the second elliptical wire with the updated options.\n const ellipse2 = await shapes.wire.createEllipseWire(ellipseOpt);\n\n // Modify the ellipseOpt for the third ellipse.\n // Set the center of the third ellipse.\n ellipseOpt.center = [0, 7, 0];\n // Set the minor radius for the third ellipse.\n ellipseOpt.radiusMinor = 2;\n // Set the major radius for the third ellipse.\n ellipseOpt.radiusMajor = 6;\n // Create the third elliptical wire with the updated options.\n const ellipse3 = await shapes.wire.createEllipseWire(ellipseOpt);\n\n // Create an instance of LoftDto to define the parameters for the loft operation.\n // The generic type TopoDSShapePointer indicates the type of shapes to be lofted.\n const loftOpt = new LoftDto();\n // Assign an array of the created ellipse wires to the 'shapes' property of loftOpt.\n // These are the profiles that will be connected by the loft.\n loftOpt.shapes = [ellipse1, ellipse2, ellipse3];\n // Perform the loft operation using the defined options.\n // This will create a surface (or shell) connecting the three ellipses.\n // 'makeSolid' defaults to false, creating a shell.\n const loft = await operations.loft(loftOpt);\n\n // Create an instance of DrawOcctShapeSimpleOptions to define how the lofted shape will be displayed.\n const drawOpt = new DrawOcctShapeSimpleOptions();\n // Set the precision for drawing the shape. This affects the tessellation quality.\n drawOpt.precision = 0.001;\n // Set the color of the faces of the lofted shape.\n drawOpt.faceColour = \"#ff00ff\"; // Magenta\n // Draw the lofted shape asynchronously using the specified entity and drawing options.\n draw.drawAnyAsync({ entity: loft, options: drawOpt });\n\n}\n\n// Call the start function to execute the script.\nstart();","version":"0.20.4","type":"typescript"}} + script={{"script":"// Import necessary modules from the bitbybit library.\n// 'operations' and 'shapes' are for OpenCascade Technology (OCCT) functionalities like lofting and creating wires.\nconst { operations, shapes } = bitbybit.occt;\n// 'draw' module is used for rendering shapes on the canvas.\nconst { draw } = bitbybit;\n// Import Data Transfer Objects (DTOs) for defining OCCT inputs.\n// 'EllipseDto' for creating ellipses, 'LoftDto' for loft operation parameters.\nconst { EllipseDto, LoftDto } = Bit.Inputs.OCCT;\n// Import DTO for drawing options.\nconst { DrawOcctShapeSimpleOptions } = Bit.Inputs.Draw;\n// Define a type alias for OCCT shape pointers for better readability.\ntype TopoDSShapePointer = Bit.Inputs.OCCT.TopoDSShapePointer;\n\n// Define an asynchronous function 'start' which will contain the main logic.\nconst start = async () => {\n\n // Create an instance of EllipseDto to define the properties of the first ellipse.\n const ellipseOpt = new EllipseDto();\n // Set the minor radius of the ellipse.\n ellipseOpt.radiusMinor = 4;\n // Set the major radius of the ellipse.\n ellipseOpt.radiusMajor = 8;\n // Create the first elliptical wire. The center defaults to [0,0,0] and direction to [0,1,0] if not specified.\n // 'await' is used because shape creation is an asynchronous operation.\n const ellipse1 = await shapes.wire.createEllipseWire(ellipseOpt);\n\n // Modify the ellipseOpt for the second ellipse.\n // Set the center of the second ellipse.\n ellipseOpt.center = [0, 3, 0];\n // Set the minor radius for the second ellipse.\n ellipseOpt.radiusMinor = 1;\n // Set the major radius for the second ellipse.\n ellipseOpt.radiusMajor = 4;\n // Create the second elliptical wire with the updated options.\n const ellipse2 = await shapes.wire.createEllipseWire(ellipseOpt);\n\n // Modify the ellipseOpt for the third ellipse.\n // Set the center of the third ellipse.\n ellipseOpt.center = [0, 7, 0];\n // Set the minor radius for the third ellipse.\n ellipseOpt.radiusMinor = 2;\n // Set the major radius for the third ellipse.\n ellipseOpt.radiusMajor = 6;\n // Create the third elliptical wire with the updated options.\n const ellipse3 = await shapes.wire.createEllipseWire(ellipseOpt);\n\n // Create an instance of LoftDto to define the parameters for the loft operation.\n // The generic type TopoDSShapePointer indicates the type of shapes to be lofted.\n const loftOpt = new LoftDto();\n // Assign an array of the created ellipse wires to the 'shapes' property of loftOpt.\n // These are the profiles that will be connected by the loft.\n loftOpt.shapes = [ellipse1, ellipse2, ellipse3];\n // Perform the loft operation using the defined options.\n // This will create a surface (or shell) connecting the three ellipses.\n // 'makeSolid' defaults to false, creating a shell.\n const loft = await operations.loft(loftOpt);\n\n // Create an instance of DrawOcctShapeSimpleOptions to define how the lofted shape will be displayed.\n const drawOpt = new DrawOcctShapeSimpleOptions();\n // Set the precision for drawing the shape. This affects the tessellation quality.\n drawOpt.precision = 0.001;\n // Set the color of the faces of the lofted shape.\n drawOpt.faceColour = \"#ff00ff\"; // Magenta\n // Draw the lofted shape asynchronously using the specified entity and drawing options.\n draw.drawAnyAsync({ entity: loft, options: drawOpt });\n\n}\n\n// Call the start function to execute the script.\nstart();","version":"0.20.5","type":"typescript"}} title="Simple Loft Operation" /> diff --git a/docs/learn/code/common/occt/shapes/edge/edge-indexes.mdx b/docs/learn/code/common/occt/shapes/edge/edge-indexes.mdx index 6d8295dc..f4a91c09 100644 --- a/docs/learn/code/common/occt/shapes/edge/edge-indexes.mdx +++ b/docs/learn/code/common/occt/shapes/edge/edge-indexes.mdx @@ -42,21 +42,21 @@ Below are examples in TypeScript, Blockly, and Rete that demonstrate creating a **TypeScript Example: Drawing Edge Indexes** {\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n const drawOpt = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n drawOpt.drawEdgeIndexes = true;\n drawOpt.faceOpacity = 0.3;\n drawOpt.edgeOpacity = 0.3;\n drawOpt.edgeIndexHeight = 0.24\n\n bitbybit.draw.drawAnyAsync({\n entity: box,\n options: drawOpt\n });\n}\n\nstart();\n","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = async () => {\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n const drawOpt = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n drawOpt.drawEdgeIndexes = true;\n drawOpt.faceOpacity = 0.3;\n drawOpt.edgeOpacity = 0.3;\n drawOpt.edgeIndexHeight = 0.24\n\n bitbybit.draw.drawAnyAsync({\n entity: box,\n options: drawOpt\n });\n}\n\nstart();\n","version":"0.20.5","type":"typescript"}} title="Edge Indexing" /> **Blockly Example: Drawing Edge Indexes** 58100000.30.3#ffffff#ff00002TRUETRUE0.01TRUE0.24#ff00ffFALSE0.06#0000ff","version":"0.20.4","type":"blockly"}} + script={{"script":"58100000.30.3#ffffff#ff00002TRUETRUE0.01TRUE0.24#ff00ffFALSE0.06#0000ff","version":"0.20.5","type":"blockly"}} title="Edge Indexing" /> **Rete Example: Drawing Edge Indexes** diff --git a/docs/learn/getting-started/basics/assets/local/gltf.mdx b/docs/learn/getting-started/basics/assets/local/gltf.mdx index 6b489065..91d5aea3 100644 --- a/docs/learn/getting-started/basics/assets/local/gltf.mdx +++ b/docs/learn/getting-started/basics/assets/local/gltf.mdx @@ -59,7 +59,7 @@ Your Rete graph should now look similar to the setup in the embedded editor belo **Rete Editor Example:** @@ -101,7 +101,7 @@ After assembling the blocks, click "Run". You should see the BoomBox model. **Blockly Editor Example:** TRUEBoomBoxFALSE","version":"0.20.4","type":"blockly"}} + script={{"script":"TRUEBoomBoxFALSE","version":"0.20.5","type":"blockly"}} title="Bitbybit Blockly Editor - Using Local glTF Asset" description="Upload local asset from tutorial named accordingly and it will appear in 3D scene after you hit run." /> @@ -126,7 +126,7 @@ Here's the example code, which should be fairly self-explanatory for those famil **TypeScript Editor Example:** {\n bitbybit.babylon.scene.useRightHandedSystem({\n use: true,\n });\n const file = await bitbybit.asset.getLocalFile({\n fileName: \"BoomBox\"\n }) as File;\n await bitbybit.babylon.io.loadAssetIntoScene({\n assetFile: file,\n hidden: false\n });\n}\n\nstart();\n","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = async () => {\n bitbybit.babylon.scene.useRightHandedSystem({\n use: true,\n });\n const file = await bitbybit.asset.getLocalFile({\n fileName: \"BoomBox\"\n }) as File;\n await bitbybit.babylon.io.loadAssetIntoScene({\n assetFile: file,\n hidden: false\n });\n}\n\nstart();\n","version":"0.20.5","type":"typescript"}} title="Bitbybit Blockly Editor - Using Local glTF Asset" description="Upload local asset from tutorial named accordingly and it will appear in 3D scene after you hit run." /> diff --git a/docs/learn/getting-started/basics/assets/local/step.mdx b/docs/learn/getting-started/basics/assets/local/step.mdx index ef945581..54f1b4a1 100644 --- a/docs/learn/getting-started/basics/assets/local/step.mdx +++ b/docs/learn/getting-started/basics/assets/local/step.mdx @@ -54,7 +54,7 @@ That's it! Your Rete graph should be set up. It might take a moment for the Kuka **Rete Editor Example:** @@ -95,7 +95,7 @@ After assembling the blocks, click "Run". **Blockly Editor Example:** KukaRobotTRUE","version":"0.20.4","type":"blockly"}} + script={{"script":"KukaRobotTRUE","version":"0.20.5","type":"blockly"}} title="Bitbybit Blockly Editor - Using Local STEP Asset" description="Upload local asset from tutorial named accordingly and it will appear in 3D scene after you hit run." /> @@ -122,7 +122,7 @@ Here's an example of how to do that: **TypeScript Editor Example:** {\n\n const file = await bitbybit.asset.getLocalFile({\n fileName: \"KukaRobot\"\n }) as File;\n\n const shape = await bitbybit.occt.io.loadSTEPorIGES({\n assetFile: file,\n adjustZtoY: true,\n });\n\n bitbybit.draw.drawAnyAsync({\n entity: shape\n })\n}\n\nstart();\n","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = async () => {\n\n const file = await bitbybit.asset.getLocalFile({\n fileName: \"KukaRobot\"\n }) as File;\n\n const shape = await bitbybit.occt.io.loadSTEPorIGES({\n assetFile: file,\n adjustZtoY: true,\n });\n\n bitbybit.draw.drawAnyAsync({\n entity: shape\n })\n}\n\nstart();\n","version":"0.20.5","type":"typescript"}} title="Bitbybit TypeScript Editor - Using Local STEP Asset" description="Upload local asset from tutorial named accordingly and it will appear in 3D scene after you hit run." /> diff --git a/docs/learn/getting-started/blockly/hello-world.mdx b/docs/learn/getting-started/blockly/hello-world.mdx index 0dcb3e07..8de88267 100644 --- a/docs/learn/getting-started/blockly/hello-world.mdx +++ b/docs/learn/getting-started/blockly/hello-world.mdx @@ -56,7 +56,7 @@ Your setup should resemble this interactive example: Hello World!'Aboreto''Regular'1.50.20000010'leftTop'","version":"0.20.4","type":"blockly"}} + script={{"script":"Hello World!'Aboreto''Regular'1.50.20000010'leftTop'","version":"0.20.5","type":"blockly"}} title="Draw 3D Text" description="Draws the text on the screen." /> @@ -88,7 +88,7 @@ After completing these steps, your Blockly script should look similar to this: 40040010100.450.50.5FALSE#ffffff#ffffffHello World!'Roboto''Regular'1.50.2-9000000-1'centerBottom'","version":"0.20.4","type":"blockly"}} + script={{"script":"40040010100.450.50.5FALSE#ffffff#ffffffHello World!'Roboto''Regular'1.50.2-9000000-1'centerBottom'","version":"0.20.5","type":"blockly"}} title="Draw 3D text and grid" description="Draws 3D text and the grid on the screen. Text is placed in better orientation." /> diff --git a/docs/learn/getting-started/blockly/parametric-cube.mdx b/docs/learn/getting-started/blockly/parametric-cube.mdx index 88dcc571..a6e3949a 100644 --- a/docs/learn/getting-started/blockly/parametric-cube.mdx +++ b/docs/learn/getting-started/blockly/parametric-cube.mdx @@ -69,7 +69,7 @@ Your Blockly workspace should now look something like this interactive example: sizesize3size000","version":"0.20.4","type":"blockly"}} + script={{"script":"sizesize3size000","version":"0.20.5","type":"blockly"}} title="Parametric cube example" description="Draws the parametrically controlled cube." /> diff --git a/docs/learn/getting-started/rete/hello-world.mdx b/docs/learn/getting-started/rete/hello-world.mdx index 74b34a25..67aeefaf 100644 --- a/docs/learn/getting-started/rete/hello-world.mdx +++ b/docs/learn/getting-started/rete/hello-world.mdx @@ -41,7 +41,7 @@ If you've done it correctly, your canvas should have the "Draw Grid Mesh" compon @@ -79,7 +79,7 @@ The setup should resemble this: @@ -109,7 +109,7 @@ Here's the final result you should aim for: diff --git a/docs/learn/getting-started/rete/parametric-cube.mdx b/docs/learn/getting-started/rete/parametric-cube.mdx index f87db349..3a58aab9 100644 --- a/docs/learn/getting-started/rete/parametric-cube.mdx +++ b/docs/learn/getting-started/rete/parametric-cube.mdx @@ -44,7 +44,7 @@ We'll use the OpenCascade Technology (OCCT) geometry kernel to create our cube. @@ -69,7 +69,7 @@ If you've connected them correctly, your setup should resemble the following int diff --git a/docs/learn/getting-started/typescript/hello-world.mdx b/docs/learn/getting-started/typescript/hello-world.mdx index 1b7ac19b..407adc96 100644 --- a/docs/learn/getting-started/typescript/hello-world.mdx +++ b/docs/learn/getting-started/typescript/hello-world.mdx @@ -26,7 +26,7 @@ Check out the script below: {\n const gridOptions = new Bit.Inputs.Draw.SceneDrawGridMeshDto();\n bitbybit.draw.drawGridMesh(gridOptions);\n}\n\nstart();\n","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = async () => {\n const gridOptions = new Bit.Inputs.Draw.SceneDrawGridMeshDto();\n bitbybit.draw.drawGridMesh(gridOptions);\n}\n\nstart();\n","version":"0.20.5","type":"typescript"}} title="Draw the grid" description="Draws the grid mesh with lines in 3D space." /> @@ -51,7 +51,7 @@ The script below shows a working example. We've set the `rotation` to -90 degree {\n const gridOptions = new Bit.Inputs.Draw.SceneDrawGridMeshDto();\n bitbybit.draw.drawGridMesh(gridOptions);\n\n const textOpt = new Bit.Advanced.Text3D.Text3DDto();\n textOpt.text = \"Hello World!\";\n textOpt.rotation = -90;\n textOpt.originAlignment = Bit.Advanced.Text3D.recAlignmentEnum.centerBottom;\n textOpt.direction = [0, 0, -1];\n const text3D = await bitbybit.advanced.text3d.create(textOpt);\n\n bitbybit.draw.drawAnyAsync({\n entity: text3D\n });\n}\n\nstart();\n","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = async () => {\n const gridOptions = new Bit.Inputs.Draw.SceneDrawGridMeshDto();\n bitbybit.draw.drawGridMesh(gridOptions);\n\n const textOpt = new Bit.Advanced.Text3D.Text3DDto();\n textOpt.text = \"Hello World!\";\n textOpt.rotation = -90;\n textOpt.originAlignment = Bit.Advanced.Text3D.recAlignmentEnum.centerBottom;\n textOpt.direction = [0, 0, -1];\n const text3D = await bitbybit.advanced.text3d.create(textOpt);\n\n bitbybit.draw.drawAnyAsync({\n entity: text3D\n });\n}\n\nstart();\n","version":"0.20.5","type":"typescript"}} title="Draw the text & grid" description="Draws the grid mesh with text in 3D space." /> diff --git a/docs/learn/getting-started/typescript/how-to-code-in-monaco.md b/docs/learn/getting-started/typescript/how-to-code-in-monaco.md index 557cb230..8c434a96 100644 --- a/docs/learn/getting-started/typescript/how-to-code-in-monaco.md +++ b/docs/learn/getting-started/typescript/how-to-code-in-monaco.md @@ -197,7 +197,7 @@ start(); {\n // Step 3a: Create input objects (DTOs) and set their properties for a cube\n const cubeOptions = new CubeDto(); // Instantiate the DTO\n cubeOptions.size = 6; // Set the cube's size\n // Call the bitbybit function to create the cube, awaiting its promise\n const cube: TopoDSShapePointer = await solid.createCube(cubeOptions);\n\n // Step 3b: Create input objects (DTOs) for a sphere\n const sphereOptions = new SphereDto();\n sphereOptions.radius = 3;\n sphereOptions.center = [3, 3, -3]; // Define center as [x, y, z] coordinates\n const sphere: TopoDSShapePointer = await solid.createSphere(sphereOptions);\n\n // Step 4: Perform geometric operations\n // Example: Boolean difference (subtract sphere from cube)\n const diffOptions = new DifferenceDto(); // Generic type for the shapes involved\n diffOptions.shape = cube; // The base shape\n diffOptions.shapes = [sphere]; // An array of shapes to subtract\n const diff: TopoDSShapePointer = await booleans.difference(diffOptions);\n\n // Example: Apply fillets (round edges) to the result of the difference\n const roundingOptions = new FilletDto();\n roundingOptions.shape = diff; // The shape to fillet\n roundingOptions.radius = 1; // The radius of the fillet\n // Note: Some operations might have specific methods like 'filletEdges' for common tasks\n const solidRoundedCorners: TopoDSShapePointer = await fillets.filletEdges(roundingOptions);\n\n // Step 5: Visualize the result in the 3D viewer\n // Prepare drawing options to customize appearance\n const occtDrawOptions = new DrawOcctShapeOptions();\n occtDrawOptions.faceColour = \"#0000ff\"; // Blue faces\n occtDrawOptions.edgeColour = \"#ff00ff\"; // Magenta edges\n occtDrawOptions.edgeWidth = 5; // Width of the edges\n occtDrawOptions.precision = 0.001; // Rendering precision for complex shapes (lower is finer)\n // Draw the final shape. 'drawAnyAsync' is a versatile function for drawing various entity types.\n draw.drawAnyAsync({ entity: solidRoundedCorners, options: occtDrawOptions });\n\n // Step 6: (Optional) Adjust scene elements like lighting for better visualization\n const dirLight = new DirectionalLightDto();\n dirLight.shadowGeneratorMapSize = 2000; // Higher values for better shadow quality\n dirLight.intensity = 3; // Light intensity\n scene.drawDirectionalLight(dirLight); // Adds or updates a directional light in the scene\n\n // Step 7: (Optional) Export your model to common CAD file formats\n // Export as STEP file (a common format for solid models)\n const stepExportOptions = new SaveStepDto();\n stepExportOptions.shape = solidRoundedCorners;\n stepExportOptions.adjustYtoZ = true; // Optional: Adjusts coordinate system (Y-up to Z-up) if needed\n stepExportOptions.fileName = \"cube_with_sphere_cutout.step\";\n stepExportOptions.tryDownload = true; // Attempts to trigger a browser download of the file\n await io.saveShapeSTEP(stepExportOptions); // Use the destructured 'io'\n\n // Export as STL file (a common format for 3D printing)\n const stlExportOptions = new SaveStlDto();\n stlExportOptions.shape = solidRoundedCorners;\n stlExportOptions.adjustYtoZ = true;\n stlExportOptions.fileName = \"cube_with_sphere_cutout.stl\";\n stlExportOptions.precision = 0.001; // Affects STL mesh quality (smaller values for finer mesh)\n stlExportOptions.tryDownload = true;\n await io.saveShapeStl(stlExportOptions); // Use the destructured 'io'\n};\n\n// Step 8: Call the start function to execute your script\nstart();","version":"0.20.4","type":"typescript"}} + script={{"script":"// Step 1: (Optional but Recommended) Destructure for convenience\n// This makes your code less verbose and easier to read.\nconst { solid } = bitbybit.occt.shapes;\nconst { booleans, fillets, io } = bitbybit.occt; // Added 'io' for export functions\nconst { draw } = bitbybit;\nconst { scene } = bitbybit.babylon;\n\n// Step 2: Import type definitions for input objects and shapes\n// This enables type checking and autocompletion.\ntype TopoDSShapePointer = Bit.Inputs.OCCT.TopoDSShapePointer; // Represents an OCCT shape\n\nconst { CubeDto, SphereDto, FilletDto, DifferenceDto, SaveStepDto, SaveStlDto } = Bit.Inputs.OCCT;\nconst DrawOcctShapeOptions = Bit.Inputs.Draw.DrawOcctShapeOptions;\nconst DirectionalLightDto = Bit.Inputs.BabylonScene.DirectionalLightDto;\n\n// Step 3: Define your main logic within an async function\nconst start = async () => {\n // Step 3a: Create input objects (DTOs) and set their properties for a cube\n const cubeOptions = new CubeDto(); // Instantiate the DTO\n cubeOptions.size = 6; // Set the cube's size\n // Call the bitbybit function to create the cube, awaiting its promise\n const cube: TopoDSShapePointer = await solid.createCube(cubeOptions);\n\n // Step 3b: Create input objects (DTOs) for a sphere\n const sphereOptions = new SphereDto();\n sphereOptions.radius = 3;\n sphereOptions.center = [3, 3, -3]; // Define center as [x, y, z] coordinates\n const sphere: TopoDSShapePointer = await solid.createSphere(sphereOptions);\n\n // Step 4: Perform geometric operations\n // Example: Boolean difference (subtract sphere from cube)\n const diffOptions = new DifferenceDto(); // Generic type for the shapes involved\n diffOptions.shape = cube; // The base shape\n diffOptions.shapes = [sphere]; // An array of shapes to subtract\n const diff: TopoDSShapePointer = await booleans.difference(diffOptions);\n\n // Example: Apply fillets (round edges) to the result of the difference\n const roundingOptions = new FilletDto();\n roundingOptions.shape = diff; // The shape to fillet\n roundingOptions.radius = 1; // The radius of the fillet\n // Note: Some operations might have specific methods like 'filletEdges' for common tasks\n const solidRoundedCorners: TopoDSShapePointer = await fillets.filletEdges(roundingOptions);\n\n // Step 5: Visualize the result in the 3D viewer\n // Prepare drawing options to customize appearance\n const occtDrawOptions = new DrawOcctShapeOptions();\n occtDrawOptions.faceColour = \"#0000ff\"; // Blue faces\n occtDrawOptions.edgeColour = \"#ff00ff\"; // Magenta edges\n occtDrawOptions.edgeWidth = 5; // Width of the edges\n occtDrawOptions.precision = 0.001; // Rendering precision for complex shapes (lower is finer)\n // Draw the final shape. 'drawAnyAsync' is a versatile function for drawing various entity types.\n draw.drawAnyAsync({ entity: solidRoundedCorners, options: occtDrawOptions });\n\n // Step 6: (Optional) Adjust scene elements like lighting for better visualization\n const dirLight = new DirectionalLightDto();\n dirLight.shadowGeneratorMapSize = 2000; // Higher values for better shadow quality\n dirLight.intensity = 3; // Light intensity\n scene.drawDirectionalLight(dirLight); // Adds or updates a directional light in the scene\n\n // Step 7: (Optional) Export your model to common CAD file formats\n // Export as STEP file (a common format for solid models)\n const stepExportOptions = new SaveStepDto();\n stepExportOptions.shape = solidRoundedCorners;\n stepExportOptions.adjustYtoZ = true; // Optional: Adjusts coordinate system (Y-up to Z-up) if needed\n stepExportOptions.fileName = \"cube_with_sphere_cutout.step\";\n stepExportOptions.tryDownload = true; // Attempts to trigger a browser download of the file\n await io.saveShapeSTEP(stepExportOptions); // Use the destructured 'io'\n\n // Export as STL file (a common format for 3D printing)\n const stlExportOptions = new SaveStlDto();\n stlExportOptions.shape = solidRoundedCorners;\n stlExportOptions.adjustYtoZ = true;\n stlExportOptions.fileName = \"cube_with_sphere_cutout.stl\";\n stlExportOptions.precision = 0.001; // Affects STL mesh quality (smaller values for finer mesh)\n stlExportOptions.tryDownload = true;\n await io.saveShapeStl(stlExportOptions); // Use the destructured 'io'\n};\n\n// Step 8: Call the start function to execute your script\nstart();","version":"0.20.5","type":"typescript"}} title="Create And Download STEP & STL 3D Models" description="Contains example code that can be executed directly inside the editor by clicking Run button." /> diff --git a/docs/learn/getting-started/typescript/parametric-cube.mdx b/docs/learn/getting-started/typescript/parametric-cube.mdx index 0513ad27..e9351d5d 100644 --- a/docs/learn/getting-started/typescript/parametric-cube.mdx +++ b/docs/learn/getting-started/typescript/parametric-cube.mdx @@ -35,7 +35,7 @@ The script shown in the editor below is fairly straightforward, but let's break {\n const size = 10;\n const cubeOptions = new Bit.Inputs.OCCT.CubeDto();\n cubeOptions.size = size;\n const cube = await bitbybit.occt.shapes.solid.createCube(cubeOptions);\n\n bitbybit.draw.drawAnyAsync({\n entity: cube\n });\n}\n\nstart();\n","version":"0.20.4","type":"typescript"}} + script={{"script":"const start = async () => {\n const size = 10;\n const cubeOptions = new Bit.Inputs.OCCT.CubeDto();\n cubeOptions.size = size;\n const cube = await bitbybit.occt.shapes.solid.createCube(cubeOptions);\n\n bitbybit.draw.drawAnyAsync({\n entity: cube\n });\n}\n\nstart();\n","version":"0.20.5","type":"typescript"}} title="Draw the grid" description="Draws the grid mesh with lines in 3D space." /> diff --git a/docs/learn/npm-packages/babylonjs/start-with-babylon-js.md b/docs/learn/npm-packages/babylonjs/start-with-babylon-js.md index 0bb0cf07..4f480490 100644 --- a/docs/learn/npm-packages/babylonjs/start-with-babylon-js.md +++ b/docs/learn/npm-packages/babylonjs/start-with-babylon-js.md @@ -159,7 +159,7 @@ const init = async () => { // This CDN link provides a hosted version. // For production, you might want to host this yourself. locateFile: () => { - return 'https://cdn.jsdelivr.net/gh/bitbybit-dev/bitbybit-assets@0.20.4/wasm/manifold.cc2ddd38.wasm'; + return 'https://cdn.jsdelivr.net/gh/bitbybit-dev/bitbybit-assets@latest/wasm/manifold.cc2ddd38.wasm'; }, }); wasm.setup(); // Additional setup step for Manifold diff --git a/docs/learn/npm-packages/threejs/start-with-three-js.md b/docs/learn/npm-packages/threejs/start-with-three-js.md index fa29479c..f7cf0d82 100644 --- a/docs/learn/npm-packages/threejs/start-with-three-js.md +++ b/docs/learn/npm-packages/threejs/start-with-three-js.md @@ -159,7 +159,7 @@ const init = async () => { // This CDN link provides a hosted version. // For production, you might want to host this yourself. locateFile: () => { - return 'https://cdn.jsdelivr.net/gh/bitbybit-dev/bitbybit-assets@0.20.4/wasm/manifold.cc2ddd38.wasm'; + return 'https://cdn.jsdelivr.net/gh/bitbybit-dev/bitbybit-assets@latest/wasm/manifold.cc2ddd38.wasm'; }, }); wasm.setup(); // Additional setup step for Manifold diff --git a/docs/learn/runners/intro-blockly.mdx b/docs/learn/runners/intro-blockly.mdx index 92d7102f..a1463a32 100644 --- a/docs/learn/runners/intro-blockly.mdx +++ b/docs/learn/runners/intro-blockly.mdx @@ -48,7 +48,7 @@ The following Bitbybit Blockly script is the visual program we'll be creating. T sizecubeMeshsizesizesizesize1cubeMeshsize0000.40.005TRUE#000099TRUE#ffffff1cubeMeshcubeMesh","version":"0.20.4","type":"blockly"}} + script={{"script":"sizecubeMeshsizesizesizesize1cubeMeshsize0000.40.005TRUE#000099TRUE#ffffff1cubeMeshcubeMesh","version":"0.20.5","type":"blockly"}} title="Bitbybit Blockly Editor - Simple Cube for Runner Tutorial" description="Draws 3D Cube and controls its size via inputs coming from external executing program" /> diff --git a/docs/learn/runners/intro-rete.mdx b/docs/learn/runners/intro-rete.mdx index ff531164..d003e245 100644 --- a/docs/learn/runners/intro-rete.mdx +++ b/docs/learn/runners/intro-rete.mdx @@ -51,7 +51,7 @@ The following Bitbybit Rete script is the visual program we'll be creating. The @@ -71,7 +71,7 @@ Below are the `index.html` and `script.js` files you would use on StackBlitz or - + diff --git a/docs/learn/runners/intro-typescript.mdx b/docs/learn/runners/intro-typescript.mdx index 014026ae..a0f0a6da 100644 --- a/docs/learn/runners/intro-typescript.mdx +++ b/docs/learn/runners/intro-typescript.mdx @@ -46,7 +46,7 @@ The following is the Bitbybit TypeScript script we'll be creating. The JavaScrip {\n const cube = await occt.shapes.solid.createCube({\n size: inputs.size,\n center: [0, 0, 0],\n });\n const filletCube = await occt.fillets.filletEdges({\n shape: cube,\n radius: 0.4\n });\n const drawOptions = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n drawOptions.faceColour = \"#0000ff\";\n drawOptions.edgeWidth = 1;\n drawOptions.precision = 0.005;\n const cubeMesh = await bitbybit.draw.drawAnyAsync({\n entity: filletCube,\n options: drawOptions,\n });\n return { cubeMesh };\n}\n\nconst runnerOutput = start();\nBit.setBitbybitRunnerResult(runnerOutput);\n","version":"0.20.4","type":"typescript"}} + script={{"script":"type Inputs = {\n size: number;\n}\n\nBit.mockBitbybitRunnerInputs({ size: 1 });\nconst inputs: Inputs = Bit.getBitbybitRunnerInputs();\n\nconst { occt } = bitbybit;\n\nconst start = async () => {\n const cube = await occt.shapes.solid.createCube({\n size: inputs.size,\n center: [0, 0, 0],\n });\n const filletCube = await occt.fillets.filletEdges({\n shape: cube,\n radius: 0.4\n });\n const drawOptions = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n drawOptions.faceColour = \"#0000ff\";\n drawOptions.edgeWidth = 1;\n drawOptions.precision = 0.005;\n const cubeMesh = await bitbybit.draw.drawAnyAsync({\n entity: filletCube,\n options: drawOptions,\n });\n return { cubeMesh };\n}\n\nconst runnerOutput = start();\nBit.setBitbybitRunnerResult(runnerOutput);\n","version":"0.20.5","type":"typescript"}} title="Bitbybit TypeScript Editor - Simple Cube for Runner Tutorial" description="Draws 3D Cube and controls its size via inputs coming from external executing program" /> @@ -66,7 +66,7 @@ Below are the `index.html` and `script.js` files you would use on StackBlitz or - + diff --git a/docs/learn/runners/intro.mdx b/docs/learn/runners/intro.mdx index 09dac698..c2d0170c 100644 --- a/docs/learn/runners/intro.mdx +++ b/docs/learn/runners/intro.mdx @@ -600,7 +600,7 @@ function hideSpinner() { diff --git a/docs/learn/runners/live-examples/configurable-cad-part.mdx b/docs/learn/runners/live-examples/configurable-cad-part.mdx index dfe8a714..c5e5bb33 100644 --- a/docs/learn/runners/live-examples/configurable-cad-part.mdx +++ b/docs/learn/runners/live-examples/configurable-cad-part.mdx @@ -30,7 +30,7 @@ Below is an interactive preview of the Rete visual program. Notice how this scri - {/* Ensure version is current */} + {/* Ensure version is current */} diff --git a/docs/learn/runners/live-examples/static-3d-model-script.mdx b/docs/learn/runners/live-examples/static-3d-model-script.mdx index 8f4bf643..e9c7e902 100644 --- a/docs/learn/runners/live-examples/static-3d-model-script.mdx +++ b/docs/learn/runners/live-examples/static-3d-model-script.mdx @@ -26,7 +26,7 @@ Below is an interactive preview of the Rete visual program. You can see the node @@ -70,7 +70,7 @@ To use the runner on your own website, you'll need a basic HTML structure. {/* Step 1: Include the Bitbybit Runner library */} - + {/* Step 2: Include your custom script that uses the runner */} diff --git a/docs/learn/runners/table-configurator-blockly.mdx b/docs/learn/runners/table-configurator-blockly.mdx index 7839796e..576c6cf4 100644 --- a/docs/learn/runners/table-configurator-blockly.mdx +++ b/docs/learn/runners/table-configurator-blockly.mdx @@ -46,7 +46,7 @@ The following Bitbybit Blockly script is the visual program that defines the log widthlengthlegHeightheighthalfLegheightthicknesshalfThicknesswidthOffsetlengthOffsetlegShapecompoundShapetable'clearSky'10000.10.7-100-100-1003#ffffff#ffffff1024TRUE0legHeightMINUSheightthicknesshalfLegheightDIVIDElegHeight2halfThicknessDIVIDEthickness2widthOffsetMINUSDIVIDEwidth2halfThicknesslengthOffsetMINUSDIVIDElength2halfThicknesslegShapethicknessthicknesslegHeight000compoundShapewidthlengththickness0MINUSheighthalfThickness0legShapewidthOffsethalfLegheightlengthOffsetlegShapeNEGwidthOffsethalfLegheightlengthOffsetlegShapewidthOffsethalfLegheightNEGlengthOffsetlegShapeNEGwidthOffsethalfLegheightNEGlengthOffset2000010tablecompoundShape0.01TRUE#999999TRUE#ffffff1tabletablesetupParamsDescribe this function...widthwidthlengthlengthheightheightthicknessthicknesswidthwidth1lengthlength1heightheight0.5thicknessthickness0.05","version":"0.20.4","type":"blockly"}} + script={{"script":"widthlengthlegHeightheighthalfLegheightthicknesshalfThicknesswidthOffsetlengthOffsetlegShapecompoundShapetable'clearSky'10000.10.7-100-100-1003#ffffff#ffffff1024TRUE0legHeightMINUSheightthicknesshalfLegheightDIVIDElegHeight2halfThicknessDIVIDEthickness2widthOffsetMINUSDIVIDEwidth2halfThicknesslengthOffsetMINUSDIVIDElength2halfThicknesslegShapethicknessthicknesslegHeight000compoundShapewidthlengththickness0MINUSheighthalfThickness0legShapewidthOffsethalfLegheightlengthOffsetlegShapeNEGwidthOffsethalfLegheightlengthOffsetlegShapewidthOffsethalfLegheightNEGlengthOffsetlegShapeNEGwidthOffsethalfLegheightNEGlengthOffset2000010tablecompoundShape0.01TRUE#999999TRUE#ffffff1tabletablesetupParamsDescribe this function...widthwidthlengthlengthheightheightthicknessthicknesswidthwidth1lengthlength1heightheight0.5thicknessthickness0.05","version":"0.20.5","type":"blockly"}} title="Bitbybit Blockly Editor - Simple Cube for Runner Tutorial" description="Draws 3D Table and controls its size via inputs coming from external executing program" /> diff --git a/docs/learn/runners/table-configurator-rete.mdx b/docs/learn/runners/table-configurator-rete.mdx index 49c390cd..7ab167c0 100644 --- a/docs/learn/runners/table-configurator-rete.mdx +++ b/docs/learn/runners/table-configurator-rete.mdx @@ -46,7 +46,7 @@ The following Bitbybit Rete script is the visual program that defines the logic diff --git a/docs/learn/runners/table-configurator-typescript.mdx b/docs/learn/runners/table-configurator-typescript.mdx index e2f689e9..d06d69c2 100644 --- a/docs/learn/runners/table-configurator-typescript.mdx +++ b/docs/learn/runners/table-configurator-typescript.mdx @@ -51,7 +51,7 @@ The following Bitbybit TypeScript script is the program that defines the logic f {\n\n const skyboxOptions = new Bit.Inputs.BabylonScene.SkyboxDto();\n skyboxOptions.skybox = Bit.Inputs.Base.skyboxEnum.clearSky;\n bitbybit.babylon.scene.enableSkybox(skyboxOptions);\n\n const lightOptions = new Bit.Inputs.BabylonScene.DirectionalLightDto();\n lightOptions.intensity = 3;\n bitbybit.babylon.scene.drawDirectionalLight(lightOptions);\n\n const tableTopShape = await solid.createBox({\n width: inputs.width,\n length: inputs.length,\n height: inputs.thickness,\n center: [0, inputs.height - halfThickness, 0],\n });\n\n const leg1Shape = await solid.createBox({\n width: inputs.thickness,\n length: inputs.thickness,\n height: legHeight,\n center: [widthOffset, halfLegHeight, lengthOffset],\n });\n const leg2Shape = await solid.createBox({\n width: inputs.thickness,\n length: inputs.thickness,\n height: legHeight,\n center: [-widthOffset, halfLegHeight, lengthOffset],\n });\n const leg3Shape = await solid.createBox({\n width: inputs.thickness,\n length: inputs.thickness,\n height: legHeight,\n center: [widthOffset, halfLegHeight, -lengthOffset],\n });\n const leg4Shape = await solid.createBox({\n width: inputs.thickness,\n length: inputs.thickness,\n height: legHeight,\n center: [-widthOffset, halfLegHeight, -lengthOffset],\n });\n\n const groundShape = await face.createCircleFace({\n radius: 2,\n center: [0, 0, 0],\n direction: [0, 1, 0]\n });\n\n const compoundShape = await compound.makeCompound({\n shapes: [tableTopShape, leg1Shape, leg2Shape, leg3Shape, leg4Shape, groundShape],\n });\n\n const drawOptions = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n drawOptions.faceColour = \"#555577\";\n drawOptions.edgeWidth = 1;\n const table = await bitbybit.draw.drawAnyAsync({ entity: compoundShape, options: drawOptions });\n return { table };\n}\n\nconst runnerOutput = start();\nBit.setBitbybitRunnerResult(runnerOutput);\n","version":"0.20.4","type":"typescript"}} + script={{"script":"type Inputs = {\n width: number;\n length: number;\n height: number;\n thickness: number;\n};\n\nconst defaultValues: Inputs = {\n width: 1,\n length: 1,\n height: 0.5,\n thickness: 0.05,\n};\n\nBit.mockBitbybitRunnerInputs(defaultValues);\nconst inputs: Inputs = Bit.getBitbybitRunnerInputs();\n\nconst { solid, compound, face } = bitbybit.occt.shapes;\n\nconst legHeight = inputs.height - inputs.thickness;\nconst halfLegHeight = legHeight / 2;\nconst halfThickness = inputs.thickness / 2;\nconst widthOffset = inputs.width / 2 - halfThickness;\nconst lengthOffset = inputs.length / 2 - halfThickness;\n\n\nconst start = async () => {\n\n const skyboxOptions = new Bit.Inputs.BabylonScene.SkyboxDto();\n skyboxOptions.skybox = Bit.Inputs.Base.skyboxEnum.clearSky;\n bitbybit.babylon.scene.enableSkybox(skyboxOptions);\n\n const lightOptions = new Bit.Inputs.BabylonScene.DirectionalLightDto();\n lightOptions.intensity = 3;\n bitbybit.babylon.scene.drawDirectionalLight(lightOptions);\n\n const tableTopShape = await solid.createBox({\n width: inputs.width,\n length: inputs.length,\n height: inputs.thickness,\n center: [0, inputs.height - halfThickness, 0],\n });\n\n const leg1Shape = await solid.createBox({\n width: inputs.thickness,\n length: inputs.thickness,\n height: legHeight,\n center: [widthOffset, halfLegHeight, lengthOffset],\n });\n const leg2Shape = await solid.createBox({\n width: inputs.thickness,\n length: inputs.thickness,\n height: legHeight,\n center: [-widthOffset, halfLegHeight, lengthOffset],\n });\n const leg3Shape = await solid.createBox({\n width: inputs.thickness,\n length: inputs.thickness,\n height: legHeight,\n center: [widthOffset, halfLegHeight, -lengthOffset],\n });\n const leg4Shape = await solid.createBox({\n width: inputs.thickness,\n length: inputs.thickness,\n height: legHeight,\n center: [-widthOffset, halfLegHeight, -lengthOffset],\n });\n\n const groundShape = await face.createCircleFace({\n radius: 2,\n center: [0, 0, 0],\n direction: [0, 1, 0]\n });\n\n const compoundShape = await compound.makeCompound({\n shapes: [tableTopShape, leg1Shape, leg2Shape, leg3Shape, leg4Shape, groundShape],\n });\n\n const drawOptions = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n drawOptions.faceColour = \"#555577\";\n drawOptions.edgeWidth = 1;\n const table = await bitbybit.draw.drawAnyAsync({ entity: compoundShape, options: drawOptions });\n return { table };\n}\n\nconst runnerOutput = start();\nBit.setBitbybitRunnerResult(runnerOutput);\n","version":"0.20.5","type":"typescript"}} title="Bitbybit TypeScript Editor - 3D Table Configurator" description="Draws 3D Table and controls its size via inputs coming from external executing program" /> diff --git a/examples/angular/babylonjs/laptop-holder/package-lock.json b/examples/angular/babylonjs/laptop-holder/package-lock.json index 07b835a5..c5be416d 100644 --- a/examples/angular/babylonjs/laptop-holder/package-lock.json +++ b/examples/angular/babylonjs/laptop-holder/package-lock.json @@ -17,7 +17,7 @@ "@angular/platform-browser": "13.3.0", "@angular/platform-browser-dynamic": "13.3.0", "@angular/router": "13.3.0", - "@bitbybit-dev/babylonjs": "0.20.4", + "@bitbybit-dev/babylonjs": "0.20.5", "rxjs": "7.5.5", "tslib": "2.3.1", "zone.js": "0.11.5" @@ -2331,14 +2331,14 @@ } }, "node_modules/@babylonjs/core": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.9.1.tgz", - "integrity": "sha512-YJvsQgjEtBIKDJXCi+6rhPH5UJ46QbaMknO5fQGg8tT2PI5L6D+vfrhdZc1YNnzDrOmLkrkXF/Uy2CGdXFdT9Q==" + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.23.1.tgz", + "integrity": "sha512-ro126NE6PZMb+uvRZhWZEB9O1CTiQE0xk4immnDu17KUoYkqcrsl+nDK8z6q8X+I1yQIelfJuOd6L1iRocgZfw==" }, "node_modules/@babylonjs/gui": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.9.1.tgz", - "integrity": "sha512-kYxPJ8C3HlNYrsKn3fPXJhQ8/BFUxMksBSNKQD+AsduEFWsMSlViYPdcMFh3oGpXEFZsqefoBoQe9xwN9L7brw==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.23.1.tgz", + "integrity": "sha512-GnpmcoJ4G6bRl/k1WPHkTRXv7pctc77lFbgUiUGgIjDBEJP9PmxC4Gs3mL4urEwxe/ODcOLN2wPdrImCOxiOVQ==", "peerDependencies": { "@babylonjs/core": "^8.0.0" } @@ -2352,71 +2352,71 @@ } }, "node_modules/@babylonjs/loaders": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.9.1.tgz", - "integrity": "sha512-8UolyusbjHoVVD2nNrqMMNS0a6OIiGrxPyzs6LYqCRFuXKXNhnFIPYCNU3WEBeD5Uc3+UQXgSaQpZudtjflFMw==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.23.1.tgz", + "integrity": "sha512-7FJ7PRaQWW94Abvr7vqKN8jTL7hH0F3RuTlgCZno6vQsdMCf+9Q3dVE0zRA2pbGg8G+RS4V/tYhL5nbIlX/1xQ==", "peerDependencies": { "@babylonjs/core": "^8.0.0", "babylonjs-gltf2interface": "^8.0.0" } }, "node_modules/@babylonjs/materials": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.9.1.tgz", - "integrity": "sha512-/Ey/Kkb9JcqM1eJ7HpOcvMhCbE2CAPRJRBhTCe6jUQ08eG/nuOJHs5SRUBdP4X4DRxgDQWY0owFP2nLLWQKM6A==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.23.1.tgz", + "integrity": "sha512-X36+SXDA/81cQPfeg+gUAfcMm/FE/oVNR9NWIOaTo6oJEHNC/EQIuAME1qL3vrLUB/Yrb9CJPg2V76Lh2Pc5vQ==", "peerDependencies": { "@babylonjs/core": "^8.6.0" } }, "node_modules/@babylonjs/serializers": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.9.1.tgz", - "integrity": "sha512-iGsizPwkQp00PaBzZing+5/CBR/x2yCkGu7GsOx2uFfoutihtn8zy+u51rarE2O6TO2sNjxp/KxCMng48c8KWA==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.23.1.tgz", + "integrity": "sha512-vlSZoHmq7TIivk2dtpmhW6VpPRe6oa4t9c/03LAcEGnvE3SppGrpVhQHx0k1Zj3HM4ae2TUhLsi58Bf4ppZUUg==", "peerDependencies": { "@babylonjs/core": "^8.0.0", "babylonjs-gltf2interface": "^8.0.0" } }, "node_modules/@bitbybit-dev/babylonjs": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.4.tgz", - "integrity": "sha512-tn+1VYQgz+6c2i16HpkIgWnIIRdnUCQKFdA701QGcKB59zJ67rU7Y8TIVTSVgPwJ9mJLpg1Co3bCVYEAyGCYXw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.5.tgz", + "integrity": "sha512-y6YgJbRAkLfgVNvtuuZHqE0xcfrpVC296f44v9T0DVZg1HPL9t60rmpzhiSVd7Hc+xd5qnL7ttAQ4X0n1kMfEg==", "dependencies": { - "@babylonjs/core": "8.9.1", - "@babylonjs/gui": "8.9.1", + "@babylonjs/core": "8.23.1", + "@babylonjs/gui": "8.23.1", "@babylonjs/havok": "1.3.10", - "@babylonjs/loaders": "8.9.1", - "@babylonjs/materials": "8.9.1", - "@babylonjs/serializers": "8.9.1", - "@bitbybit-dev/core": "0.20.4", + "@babylonjs/loaders": "8.23.1", + "@babylonjs/materials": "8.23.1", + "@babylonjs/serializers": "8.23.1", + "@bitbybit-dev/core": "0.20.5", "earcut": "2.2.3" } }, "node_modules/@bitbybit-dev/base": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.4.tgz", - "integrity": "sha512-yMsOkUFrm9JIGC3Bs49bu1I/gqwQNK8nVO3XgesOpzZvVQOF5OTxCheiQnrqiUw9DiiPuKw1T0gXBMwThzwdOw==" + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.5.tgz", + "integrity": "sha512-aFjGKgKO+DLq7b+EJ9I8u4Jlit8Xh/ahA5C/c/i3nafds5i5sFgUpD+MCZKMQEW9T7qqWCIselwBXQSeTsqJvA==" }, "node_modules/@bitbybit-dev/core": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.4.tgz", - "integrity": "sha512-T2hOHzvI+ikNxQRvhDyk/TeMCBhjZPY+wLmRSbYHiWnNGP5+3GCesZyb672XfEwPIWRH2kBS4vyp9R9fRnJujQ==", - "dependencies": { - "@bitbybit-dev/base": "0.20.4", - "@bitbybit-dev/jscad-worker": "0.20.4", - "@bitbybit-dev/manifold-worker": "0.20.4", - "@bitbybit-dev/occt-worker": "0.20.4", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.5.tgz", + "integrity": "sha512-4uGVqzCbRmcQhbXMib99hqYoCVeR1nu98rM7fsd2p0KV7geqSvUtp8qUvwu6rroktJ04H50z91JuRG+Cy0jqOQ==", + "dependencies": { + "@bitbybit-dev/base": "0.20.5", + "@bitbybit-dev/jscad-worker": "0.20.5", + "@bitbybit-dev/manifold-worker": "0.20.5", + "@bitbybit-dev/occt-worker": "0.20.5", "jsonpath-plus": "10.1.0", "rxjs": "7.5.5", "verb-nurbs-web": "2.1.3" } }, "node_modules/@bitbybit-dev/jscad": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.4.tgz", - "integrity": "sha512-e7/7Ag796rwn58H6Nu0lzhDkim+rJTqMWCqFZquNswoX2qqZXCv8azyOFE2LqfTvyIsEeJr/VEWIy2nvmtJnmg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.5.tgz", + "integrity": "sha512-h1SQLeMZTXwvXDt+dggoq4zNJoMKL4nfeyXkL6BVeu8gXarvPboEX1FkYatrenkFF5B0G5kBwd9B797t6VjFBA==", "dependencies": { - "@bitbybit-dev/base": "0.20.4", + "@bitbybit-dev/base": "0.20.5", "@jscad/3mf-serializer": "2.1.12", "@jscad/dxf-serializer": "2.1.18", "@jscad/io-utils": "2.0.28", @@ -2425,45 +2425,45 @@ } }, "node_modules/@bitbybit-dev/jscad-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.4.tgz", - "integrity": "sha512-DsjL2YO6urR8B/8LKYRrk4q9hAJE8oB+e5m+LDDBXbl7Vl0CHdC5ogPm6w07RcAHdSbMJouf2Ow7nGP/oOcjEg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.5.tgz", + "integrity": "sha512-TtsyplH8d4KJz5izzhui1ZOeALYnHw40t5mCrjS62pKqr16glf1Ab4Y7Kqfj05eBQfBfTmD0wGZnXtoWBZM7Vw==", "dependencies": { - "@bitbybit-dev/jscad": "0.20.4", + "@bitbybit-dev/jscad": "0.20.5", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/manifold": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.4.tgz", - "integrity": "sha512-rEGO8wOd/RUWPIRWdyE70w79JXhQ1iV6mACBuOH8/UD7+vf9wkk3KLWAYCzVPJP1nvx4+/SKCvU7e1JxEzq0Qw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.5.tgz", + "integrity": "sha512-m+jmRkuW4V5NlM5pITK/GH52GUzIYLUzTqdzTGZ+mOpfANH3jDUHAGyJJlrgqwApUXexuRX8GZ18Am5IcVRJdA==", "dependencies": { "manifold-3d": "3.0.0" } }, "node_modules/@bitbybit-dev/manifold-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.4.tgz", - "integrity": "sha512-mwU87fg8M3p472dn/RiuveiPtq/IuOWCcoG0uismEE2g+rnciMrCSUSkXMkfXDCk9l0ZqoVfYg+dHVx0KBHBUg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.5.tgz", + "integrity": "sha512-d6KhxveoM+MoEVq/8ySmZcDU4ShzPmQzfvyRi8dXQ27SgrAQldNBtZtU0DCGx7Gbl9+6PyWrnG86e6AzvwANyg==", "dependencies": { - "@bitbybit-dev/manifold": "0.20.4", + "@bitbybit-dev/manifold": "0.20.5", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/occt": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.4.tgz", - "integrity": "sha512-Lxx4wsToS3EIiS2L3KjUh6Jpgvxsyxbh2Jt4raWhIbD9PSy1zRfMww9K7xFlawSMgq12WN1a0lV8ydKs1f5/zw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.5.tgz", + "integrity": "sha512-PHVvROaXoTeolPI8R68tRyhEUqIDbhfB6foc/FxqL4IBjftCyYMPb2pMkYvWHbmCTZRF2/Wx+qZQB+Zd386LYA==", "dependencies": { - "@bitbybit-dev/base": "0.20.4" + "@bitbybit-dev/base": "0.20.5" } }, "node_modules/@bitbybit-dev/occt-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.4.tgz", - "integrity": "sha512-R5fiGteBSitv89Pz3XVgs+Vv0c1uH477oihkw1EUWLDTa7ypiXOohpjlKYFd/qAy3QCe8GEF3jDT+TK3dsQ+FA==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.5.tgz", + "integrity": "sha512-3Rp4psUuXlLNv5EpL5INrR3HcOsqaztB7WRp+kUXP6mt0/Q+UzRDEDMfND5RUo9UN918m7D78vSZIcvwH3tIeg==", "dependencies": { - "@bitbybit-dev/occt": "0.20.4", + "@bitbybit-dev/occt": "0.20.5", "rxjs": "7.5.5" } }, @@ -3666,9 +3666,9 @@ } }, "node_modules/babylonjs-gltf2interface": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.9.1.tgz", - "integrity": "sha512-7GjEcvwL+d/lJ058J7rYTM96reekIq/kjg6SkM7NG6+Krj7UM3HMeJkAhwj22dCBfOs2/RzjFSGleEhh5qjq5g==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.24.0.tgz", + "integrity": "sha512-X3CA16Nl/l2xfXyiKXOZGcCJxfIoUOcTjgavQ0NDX07Zc4r64aWriIDds6qvEQPPoutCG7ralQdB29YVL6rSLg==", "peer": true }, "node_modules/balanced-match": { @@ -8289,9 +8289,9 @@ "dev": true }, "node_modules/nan": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", - "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz", + "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==", "optional": true }, "node_modules/nanoid": { @@ -13686,14 +13686,14 @@ } }, "@babylonjs/core": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.9.1.tgz", - "integrity": "sha512-YJvsQgjEtBIKDJXCi+6rhPH5UJ46QbaMknO5fQGg8tT2PI5L6D+vfrhdZc1YNnzDrOmLkrkXF/Uy2CGdXFdT9Q==" + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.23.1.tgz", + "integrity": "sha512-ro126NE6PZMb+uvRZhWZEB9O1CTiQE0xk4immnDu17KUoYkqcrsl+nDK8z6q8X+I1yQIelfJuOd6L1iRocgZfw==" }, "@babylonjs/gui": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.9.1.tgz", - "integrity": "sha512-kYxPJ8C3HlNYrsKn3fPXJhQ8/BFUxMksBSNKQD+AsduEFWsMSlViYPdcMFh3oGpXEFZsqefoBoQe9xwN9L7brw==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.23.1.tgz", + "integrity": "sha512-GnpmcoJ4G6bRl/k1WPHkTRXv7pctc77lFbgUiUGgIjDBEJP9PmxC4Gs3mL4urEwxe/ODcOLN2wPdrImCOxiOVQ==", "requires": {} }, "@babylonjs/havok": { @@ -13705,63 +13705,63 @@ } }, "@babylonjs/loaders": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.9.1.tgz", - "integrity": "sha512-8UolyusbjHoVVD2nNrqMMNS0a6OIiGrxPyzs6LYqCRFuXKXNhnFIPYCNU3WEBeD5Uc3+UQXgSaQpZudtjflFMw==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.23.1.tgz", + "integrity": "sha512-7FJ7PRaQWW94Abvr7vqKN8jTL7hH0F3RuTlgCZno6vQsdMCf+9Q3dVE0zRA2pbGg8G+RS4V/tYhL5nbIlX/1xQ==", "requires": {} }, "@babylonjs/materials": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.9.1.tgz", - "integrity": "sha512-/Ey/Kkb9JcqM1eJ7HpOcvMhCbE2CAPRJRBhTCe6jUQ08eG/nuOJHs5SRUBdP4X4DRxgDQWY0owFP2nLLWQKM6A==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.23.1.tgz", + "integrity": "sha512-X36+SXDA/81cQPfeg+gUAfcMm/FE/oVNR9NWIOaTo6oJEHNC/EQIuAME1qL3vrLUB/Yrb9CJPg2V76Lh2Pc5vQ==", "requires": {} }, "@babylonjs/serializers": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.9.1.tgz", - "integrity": "sha512-iGsizPwkQp00PaBzZing+5/CBR/x2yCkGu7GsOx2uFfoutihtn8zy+u51rarE2O6TO2sNjxp/KxCMng48c8KWA==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.23.1.tgz", + "integrity": "sha512-vlSZoHmq7TIivk2dtpmhW6VpPRe6oa4t9c/03LAcEGnvE3SppGrpVhQHx0k1Zj3HM4ae2TUhLsi58Bf4ppZUUg==", "requires": {} }, "@bitbybit-dev/babylonjs": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.4.tgz", - "integrity": "sha512-tn+1VYQgz+6c2i16HpkIgWnIIRdnUCQKFdA701QGcKB59zJ67rU7Y8TIVTSVgPwJ9mJLpg1Co3bCVYEAyGCYXw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.5.tgz", + "integrity": "sha512-y6YgJbRAkLfgVNvtuuZHqE0xcfrpVC296f44v9T0DVZg1HPL9t60rmpzhiSVd7Hc+xd5qnL7ttAQ4X0n1kMfEg==", "requires": { - "@babylonjs/core": "8.9.1", - "@babylonjs/gui": "8.9.1", + "@babylonjs/core": "8.23.1", + "@babylonjs/gui": "8.23.1", "@babylonjs/havok": "1.3.10", - "@babylonjs/loaders": "8.9.1", - "@babylonjs/materials": "8.9.1", - "@babylonjs/serializers": "8.9.1", - "@bitbybit-dev/core": "0.20.4", + "@babylonjs/loaders": "8.23.1", + "@babylonjs/materials": "8.23.1", + "@babylonjs/serializers": "8.23.1", + "@bitbybit-dev/core": "0.20.5", "earcut": "2.2.3" } }, "@bitbybit-dev/base": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.4.tgz", - "integrity": "sha512-yMsOkUFrm9JIGC3Bs49bu1I/gqwQNK8nVO3XgesOpzZvVQOF5OTxCheiQnrqiUw9DiiPuKw1T0gXBMwThzwdOw==" + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.5.tgz", + "integrity": "sha512-aFjGKgKO+DLq7b+EJ9I8u4Jlit8Xh/ahA5C/c/i3nafds5i5sFgUpD+MCZKMQEW9T7qqWCIselwBXQSeTsqJvA==" }, "@bitbybit-dev/core": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.4.tgz", - "integrity": "sha512-T2hOHzvI+ikNxQRvhDyk/TeMCBhjZPY+wLmRSbYHiWnNGP5+3GCesZyb672XfEwPIWRH2kBS4vyp9R9fRnJujQ==", - "requires": { - "@bitbybit-dev/base": "0.20.4", - "@bitbybit-dev/jscad-worker": "0.20.4", - "@bitbybit-dev/manifold-worker": "0.20.4", - "@bitbybit-dev/occt-worker": "0.20.4", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.5.tgz", + "integrity": "sha512-4uGVqzCbRmcQhbXMib99hqYoCVeR1nu98rM7fsd2p0KV7geqSvUtp8qUvwu6rroktJ04H50z91JuRG+Cy0jqOQ==", + "requires": { + "@bitbybit-dev/base": "0.20.5", + "@bitbybit-dev/jscad-worker": "0.20.5", + "@bitbybit-dev/manifold-worker": "0.20.5", + "@bitbybit-dev/occt-worker": "0.20.5", "jsonpath-plus": "10.1.0", "rxjs": "7.5.5", "verb-nurbs-web": "2.1.3" } }, "@bitbybit-dev/jscad": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.4.tgz", - "integrity": "sha512-e7/7Ag796rwn58H6Nu0lzhDkim+rJTqMWCqFZquNswoX2qqZXCv8azyOFE2LqfTvyIsEeJr/VEWIy2nvmtJnmg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.5.tgz", + "integrity": "sha512-h1SQLeMZTXwvXDt+dggoq4zNJoMKL4nfeyXkL6BVeu8gXarvPboEX1FkYatrenkFF5B0G5kBwd9B797t6VjFBA==", "requires": { - "@bitbybit-dev/base": "0.20.4", + "@bitbybit-dev/base": "0.20.5", "@jscad/3mf-serializer": "2.1.12", "@jscad/dxf-serializer": "2.1.18", "@jscad/io-utils": "2.0.28", @@ -13770,45 +13770,45 @@ } }, "@bitbybit-dev/jscad-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.4.tgz", - "integrity": "sha512-DsjL2YO6urR8B/8LKYRrk4q9hAJE8oB+e5m+LDDBXbl7Vl0CHdC5ogPm6w07RcAHdSbMJouf2Ow7nGP/oOcjEg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.5.tgz", + "integrity": "sha512-TtsyplH8d4KJz5izzhui1ZOeALYnHw40t5mCrjS62pKqr16glf1Ab4Y7Kqfj05eBQfBfTmD0wGZnXtoWBZM7Vw==", "requires": { - "@bitbybit-dev/jscad": "0.20.4", + "@bitbybit-dev/jscad": "0.20.5", "rxjs": "7.5.5" } }, "@bitbybit-dev/manifold": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.4.tgz", - "integrity": "sha512-rEGO8wOd/RUWPIRWdyE70w79JXhQ1iV6mACBuOH8/UD7+vf9wkk3KLWAYCzVPJP1nvx4+/SKCvU7e1JxEzq0Qw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.5.tgz", + "integrity": "sha512-m+jmRkuW4V5NlM5pITK/GH52GUzIYLUzTqdzTGZ+mOpfANH3jDUHAGyJJlrgqwApUXexuRX8GZ18Am5IcVRJdA==", "requires": { "manifold-3d": "3.0.0" } }, "@bitbybit-dev/manifold-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.4.tgz", - "integrity": "sha512-mwU87fg8M3p472dn/RiuveiPtq/IuOWCcoG0uismEE2g+rnciMrCSUSkXMkfXDCk9l0ZqoVfYg+dHVx0KBHBUg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.5.tgz", + "integrity": "sha512-d6KhxveoM+MoEVq/8ySmZcDU4ShzPmQzfvyRi8dXQ27SgrAQldNBtZtU0DCGx7Gbl9+6PyWrnG86e6AzvwANyg==", "requires": { - "@bitbybit-dev/manifold": "0.20.4", + "@bitbybit-dev/manifold": "0.20.5", "rxjs": "7.5.5" } }, "@bitbybit-dev/occt": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.4.tgz", - "integrity": "sha512-Lxx4wsToS3EIiS2L3KjUh6Jpgvxsyxbh2Jt4raWhIbD9PSy1zRfMww9K7xFlawSMgq12WN1a0lV8ydKs1f5/zw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.5.tgz", + "integrity": "sha512-PHVvROaXoTeolPI8R68tRyhEUqIDbhfB6foc/FxqL4IBjftCyYMPb2pMkYvWHbmCTZRF2/Wx+qZQB+Zd386LYA==", "requires": { - "@bitbybit-dev/base": "0.20.4" + "@bitbybit-dev/base": "0.20.5" } }, "@bitbybit-dev/occt-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.4.tgz", - "integrity": "sha512-R5fiGteBSitv89Pz3XVgs+Vv0c1uH477oihkw1EUWLDTa7ypiXOohpjlKYFd/qAy3QCe8GEF3jDT+TK3dsQ+FA==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.5.tgz", + "integrity": "sha512-3Rp4psUuXlLNv5EpL5INrR3HcOsqaztB7WRp+kUXP6mt0/Q+UzRDEDMfND5RUo9UN918m7D78vSZIcvwH3tIeg==", "requires": { - "@bitbybit-dev/occt": "0.20.4", + "@bitbybit-dev/occt": "0.20.5", "rxjs": "7.5.5" } }, @@ -14814,9 +14814,9 @@ } }, "babylonjs-gltf2interface": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.9.1.tgz", - "integrity": "sha512-7GjEcvwL+d/lJ058J7rYTM96reekIq/kjg6SkM7NG6+Krj7UM3HMeJkAhwj22dCBfOs2/RzjFSGleEhh5qjq5g==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.24.0.tgz", + "integrity": "sha512-X3CA16Nl/l2xfXyiKXOZGcCJxfIoUOcTjgavQ0NDX07Zc4r64aWriIDds6qvEQPPoutCG7ralQdB29YVL6rSLg==", "peer": true }, "balanced-match": { @@ -18192,9 +18192,9 @@ "dev": true }, "nan": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", - "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz", + "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==", "optional": true }, "nanoid": { diff --git a/examples/angular/babylonjs/laptop-holder/package.json b/examples/angular/babylonjs/laptop-holder/package.json index 2d96827f..96332c94 100644 --- a/examples/angular/babylonjs/laptop-holder/package.json +++ b/examples/angular/babylonjs/laptop-holder/package.json @@ -10,7 +10,7 @@ }, "private": true, "dependencies": { - "@bitbybit-dev/babylonjs": "0.20.4", + "@bitbybit-dev/babylonjs": "0.20.5", "@angular/animations": "13.3.0", "@angular/common": "13.3.0", "@angular/compiler": "13.3.0", diff --git a/examples/nextjs/babylonjs/simple/package-lock.json b/examples/nextjs/babylonjs/simple/package-lock.json index 0bb042ca..c9bbe8c7 100644 --- a/examples/nextjs/babylonjs/simple/package-lock.json +++ b/examples/nextjs/babylonjs/simple/package-lock.json @@ -8,7 +8,7 @@ "name": "simple", "version": "0.1.0", "dependencies": { - "@bitbybit-dev/babylonjs": "0.20.4", + "@bitbybit-dev/babylonjs": "0.20.5", "file-loader": "6.2.0", "next": "15.0.1", "react": "19.0.0-rc-69d4b800-20241021", @@ -38,14 +38,14 @@ } }, "node_modules/@babylonjs/core": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.9.1.tgz", - "integrity": "sha512-YJvsQgjEtBIKDJXCi+6rhPH5UJ46QbaMknO5fQGg8tT2PI5L6D+vfrhdZc1YNnzDrOmLkrkXF/Uy2CGdXFdT9Q==" + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.23.1.tgz", + "integrity": "sha512-ro126NE6PZMb+uvRZhWZEB9O1CTiQE0xk4immnDu17KUoYkqcrsl+nDK8z6q8X+I1yQIelfJuOd6L1iRocgZfw==" }, "node_modules/@babylonjs/gui": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.9.1.tgz", - "integrity": "sha512-kYxPJ8C3HlNYrsKn3fPXJhQ8/BFUxMksBSNKQD+AsduEFWsMSlViYPdcMFh3oGpXEFZsqefoBoQe9xwN9L7brw==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.23.1.tgz", + "integrity": "sha512-GnpmcoJ4G6bRl/k1WPHkTRXv7pctc77lFbgUiUGgIjDBEJP9PmxC4Gs3mL4urEwxe/ODcOLN2wPdrImCOxiOVQ==", "peerDependencies": { "@babylonjs/core": "^8.0.0" } @@ -59,71 +59,71 @@ } }, "node_modules/@babylonjs/loaders": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.9.1.tgz", - "integrity": "sha512-8UolyusbjHoVVD2nNrqMMNS0a6OIiGrxPyzs6LYqCRFuXKXNhnFIPYCNU3WEBeD5Uc3+UQXgSaQpZudtjflFMw==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.23.1.tgz", + "integrity": "sha512-7FJ7PRaQWW94Abvr7vqKN8jTL7hH0F3RuTlgCZno6vQsdMCf+9Q3dVE0zRA2pbGg8G+RS4V/tYhL5nbIlX/1xQ==", "peerDependencies": { "@babylonjs/core": "^8.0.0", "babylonjs-gltf2interface": "^8.0.0" } }, "node_modules/@babylonjs/materials": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.9.1.tgz", - "integrity": "sha512-/Ey/Kkb9JcqM1eJ7HpOcvMhCbE2CAPRJRBhTCe6jUQ08eG/nuOJHs5SRUBdP4X4DRxgDQWY0owFP2nLLWQKM6A==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.23.1.tgz", + "integrity": "sha512-X36+SXDA/81cQPfeg+gUAfcMm/FE/oVNR9NWIOaTo6oJEHNC/EQIuAME1qL3vrLUB/Yrb9CJPg2V76Lh2Pc5vQ==", "peerDependencies": { "@babylonjs/core": "^8.6.0" } }, "node_modules/@babylonjs/serializers": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.9.1.tgz", - "integrity": "sha512-iGsizPwkQp00PaBzZing+5/CBR/x2yCkGu7GsOx2uFfoutihtn8zy+u51rarE2O6TO2sNjxp/KxCMng48c8KWA==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.23.1.tgz", + "integrity": "sha512-vlSZoHmq7TIivk2dtpmhW6VpPRe6oa4t9c/03LAcEGnvE3SppGrpVhQHx0k1Zj3HM4ae2TUhLsi58Bf4ppZUUg==", "peerDependencies": { "@babylonjs/core": "^8.0.0", "babylonjs-gltf2interface": "^8.0.0" } }, "node_modules/@bitbybit-dev/babylonjs": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.4.tgz", - "integrity": "sha512-tn+1VYQgz+6c2i16HpkIgWnIIRdnUCQKFdA701QGcKB59zJ67rU7Y8TIVTSVgPwJ9mJLpg1Co3bCVYEAyGCYXw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.5.tgz", + "integrity": "sha512-y6YgJbRAkLfgVNvtuuZHqE0xcfrpVC296f44v9T0DVZg1HPL9t60rmpzhiSVd7Hc+xd5qnL7ttAQ4X0n1kMfEg==", "dependencies": { - "@babylonjs/core": "8.9.1", - "@babylonjs/gui": "8.9.1", + "@babylonjs/core": "8.23.1", + "@babylonjs/gui": "8.23.1", "@babylonjs/havok": "1.3.10", - "@babylonjs/loaders": "8.9.1", - "@babylonjs/materials": "8.9.1", - "@babylonjs/serializers": "8.9.1", - "@bitbybit-dev/core": "0.20.4", + "@babylonjs/loaders": "8.23.1", + "@babylonjs/materials": "8.23.1", + "@babylonjs/serializers": "8.23.1", + "@bitbybit-dev/core": "0.20.5", "earcut": "2.2.3" } }, "node_modules/@bitbybit-dev/base": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.4.tgz", - "integrity": "sha512-yMsOkUFrm9JIGC3Bs49bu1I/gqwQNK8nVO3XgesOpzZvVQOF5OTxCheiQnrqiUw9DiiPuKw1T0gXBMwThzwdOw==" + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.5.tgz", + "integrity": "sha512-aFjGKgKO+DLq7b+EJ9I8u4Jlit8Xh/ahA5C/c/i3nafds5i5sFgUpD+MCZKMQEW9T7qqWCIselwBXQSeTsqJvA==" }, "node_modules/@bitbybit-dev/core": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.4.tgz", - "integrity": "sha512-T2hOHzvI+ikNxQRvhDyk/TeMCBhjZPY+wLmRSbYHiWnNGP5+3GCesZyb672XfEwPIWRH2kBS4vyp9R9fRnJujQ==", - "dependencies": { - "@bitbybit-dev/base": "0.20.4", - "@bitbybit-dev/jscad-worker": "0.20.4", - "@bitbybit-dev/manifold-worker": "0.20.4", - "@bitbybit-dev/occt-worker": "0.20.4", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.5.tgz", + "integrity": "sha512-4uGVqzCbRmcQhbXMib99hqYoCVeR1nu98rM7fsd2p0KV7geqSvUtp8qUvwu6rroktJ04H50z91JuRG+Cy0jqOQ==", + "dependencies": { + "@bitbybit-dev/base": "0.20.5", + "@bitbybit-dev/jscad-worker": "0.20.5", + "@bitbybit-dev/manifold-worker": "0.20.5", + "@bitbybit-dev/occt-worker": "0.20.5", "jsonpath-plus": "10.1.0", "rxjs": "7.5.5", "verb-nurbs-web": "2.1.3" } }, "node_modules/@bitbybit-dev/jscad": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.4.tgz", - "integrity": "sha512-e7/7Ag796rwn58H6Nu0lzhDkim+rJTqMWCqFZquNswoX2qqZXCv8azyOFE2LqfTvyIsEeJr/VEWIy2nvmtJnmg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.5.tgz", + "integrity": "sha512-h1SQLeMZTXwvXDt+dggoq4zNJoMKL4nfeyXkL6BVeu8gXarvPboEX1FkYatrenkFF5B0G5kBwd9B797t6VjFBA==", "dependencies": { - "@bitbybit-dev/base": "0.20.4", + "@bitbybit-dev/base": "0.20.5", "@jscad/3mf-serializer": "2.1.12", "@jscad/dxf-serializer": "2.1.18", "@jscad/io-utils": "2.0.28", @@ -132,45 +132,45 @@ } }, "node_modules/@bitbybit-dev/jscad-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.4.tgz", - "integrity": "sha512-DsjL2YO6urR8B/8LKYRrk4q9hAJE8oB+e5m+LDDBXbl7Vl0CHdC5ogPm6w07RcAHdSbMJouf2Ow7nGP/oOcjEg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.5.tgz", + "integrity": "sha512-TtsyplH8d4KJz5izzhui1ZOeALYnHw40t5mCrjS62pKqr16glf1Ab4Y7Kqfj05eBQfBfTmD0wGZnXtoWBZM7Vw==", "dependencies": { - "@bitbybit-dev/jscad": "0.20.4", + "@bitbybit-dev/jscad": "0.20.5", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/manifold": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.4.tgz", - "integrity": "sha512-rEGO8wOd/RUWPIRWdyE70w79JXhQ1iV6mACBuOH8/UD7+vf9wkk3KLWAYCzVPJP1nvx4+/SKCvU7e1JxEzq0Qw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.5.tgz", + "integrity": "sha512-m+jmRkuW4V5NlM5pITK/GH52GUzIYLUzTqdzTGZ+mOpfANH3jDUHAGyJJlrgqwApUXexuRX8GZ18Am5IcVRJdA==", "dependencies": { "manifold-3d": "3.0.0" } }, "node_modules/@bitbybit-dev/manifold-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.4.tgz", - "integrity": "sha512-mwU87fg8M3p472dn/RiuveiPtq/IuOWCcoG0uismEE2g+rnciMrCSUSkXMkfXDCk9l0ZqoVfYg+dHVx0KBHBUg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.5.tgz", + "integrity": "sha512-d6KhxveoM+MoEVq/8ySmZcDU4ShzPmQzfvyRi8dXQ27SgrAQldNBtZtU0DCGx7Gbl9+6PyWrnG86e6AzvwANyg==", "dependencies": { - "@bitbybit-dev/manifold": "0.20.4", + "@bitbybit-dev/manifold": "0.20.5", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/occt": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.4.tgz", - "integrity": "sha512-Lxx4wsToS3EIiS2L3KjUh6Jpgvxsyxbh2Jt4raWhIbD9PSy1zRfMww9K7xFlawSMgq12WN1a0lV8ydKs1f5/zw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.5.tgz", + "integrity": "sha512-PHVvROaXoTeolPI8R68tRyhEUqIDbhfB6foc/FxqL4IBjftCyYMPb2pMkYvWHbmCTZRF2/Wx+qZQB+Zd386LYA==", "dependencies": { - "@bitbybit-dev/base": "0.20.4" + "@bitbybit-dev/base": "0.20.5" } }, "node_modules/@bitbybit-dev/occt-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.4.tgz", - "integrity": "sha512-R5fiGteBSitv89Pz3XVgs+Vv0c1uH477oihkw1EUWLDTa7ypiXOohpjlKYFd/qAy3QCe8GEF3jDT+TK3dsQ+FA==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.5.tgz", + "integrity": "sha512-3Rp4psUuXlLNv5EpL5INrR3HcOsqaztB7WRp+kUXP6mt0/Q+UzRDEDMfND5RUo9UN918m7D78vSZIcvwH3tIeg==", "dependencies": { - "@bitbybit-dev/occt": "0.20.4", + "@bitbybit-dev/occt": "0.20.5", "rxjs": "7.5.5" } }, @@ -1751,9 +1751,9 @@ } }, "node_modules/babylonjs-gltf2interface": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.9.1.tgz", - "integrity": "sha512-7GjEcvwL+d/lJ058J7rYTM96reekIq/kjg6SkM7NG6+Krj7UM3HMeJkAhwj22dCBfOs2/RzjFSGleEhh5qjq5g==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.24.0.tgz", + "integrity": "sha512-X3CA16Nl/l2xfXyiKXOZGcCJxfIoUOcTjgavQ0NDX07Zc4r64aWriIDds6qvEQPPoutCG7ralQdB29YVL6rSLg==", "peer": true }, "node_modules/balanced-match": { @@ -4206,9 +4206,9 @@ } }, "node_modules/nan": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", - "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz", + "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==", "optional": true }, "node_modules/nanoid": { diff --git a/examples/nextjs/babylonjs/simple/package.json b/examples/nextjs/babylonjs/simple/package.json index ab6b5f96..12d9dc3c 100644 --- a/examples/nextjs/babylonjs/simple/package.json +++ b/examples/nextjs/babylonjs/simple/package.json @@ -9,7 +9,7 @@ "lint": "next lint" }, "dependencies": { - "@bitbybit-dev/babylonjs": "0.20.4", + "@bitbybit-dev/babylonjs": "0.20.5", "react": "19.0.0-rc-69d4b800-20241021", "react-dom": "19.0.0-rc-69d4b800-20241021", "next": "15.0.1", diff --git a/examples/node/basic/package-lock.json b/examples/node/basic/package-lock.json index 40e38696..990b432a 100644 --- a/examples/node/basic/package-lock.json +++ b/examples/node/basic/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "@bitbybit-dev/occt": "^0.20.4" + "@bitbybit-dev/occt": "^0.20.5" }, "devDependencies": { "concurrently": "^7.6.0", @@ -30,16 +30,16 @@ } }, "node_modules/@bitbybit-dev/base": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.4.tgz", - "integrity": "sha512-yMsOkUFrm9JIGC3Bs49bu1I/gqwQNK8nVO3XgesOpzZvVQOF5OTxCheiQnrqiUw9DiiPuKw1T0gXBMwThzwdOw==" + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.5.tgz", + "integrity": "sha512-aFjGKgKO+DLq7b+EJ9I8u4Jlit8Xh/ahA5C/c/i3nafds5i5sFgUpD+MCZKMQEW9T7qqWCIselwBXQSeTsqJvA==" }, "node_modules/@bitbybit-dev/occt": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.4.tgz", - "integrity": "sha512-Lxx4wsToS3EIiS2L3KjUh6Jpgvxsyxbh2Jt4raWhIbD9PSy1zRfMww9K7xFlawSMgq12WN1a0lV8ydKs1f5/zw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.5.tgz", + "integrity": "sha512-PHVvROaXoTeolPI8R68tRyhEUqIDbhfB6foc/FxqL4IBjftCyYMPb2pMkYvWHbmCTZRF2/Wx+qZQB+Zd386LYA==", "dependencies": { - "@bitbybit-dev/base": "0.20.4" + "@bitbybit-dev/base": "0.20.5" } }, "node_modules/ansi-regex": { diff --git a/examples/node/basic/package.json b/examples/node/basic/package.json index 3c8cc561..8e6d1030 100644 --- a/examples/node/basic/package.json +++ b/examples/node/basic/package.json @@ -12,7 +12,7 @@ "license": "MIT", "type": "module", "dependencies": { - "@bitbybit-dev/occt": "^0.20.4" + "@bitbybit-dev/occt": "^0.20.5" }, "devDependencies": { "concurrently": "^7.6.0", diff --git a/examples/node/express-app/package-lock.json b/examples/node/express-app/package-lock.json index 7a58510e..12bcdf9e 100644 --- a/examples/node/express-app/package-lock.json +++ b/examples/node/express-app/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "@bitbybit-dev/core": "0.20.4", + "@bitbybit-dev/core": "0.20.5", "cors": "^2.8.5", "dotenv": "^16.0.3", "express": "^4.18.2", @@ -37,30 +37,30 @@ } }, "node_modules/@bitbybit-dev/base": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.4.tgz", - "integrity": "sha512-yMsOkUFrm9JIGC3Bs49bu1I/gqwQNK8nVO3XgesOpzZvVQOF5OTxCheiQnrqiUw9DiiPuKw1T0gXBMwThzwdOw==" + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.5.tgz", + "integrity": "sha512-aFjGKgKO+DLq7b+EJ9I8u4Jlit8Xh/ahA5C/c/i3nafds5i5sFgUpD+MCZKMQEW9T7qqWCIselwBXQSeTsqJvA==" }, "node_modules/@bitbybit-dev/core": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.4.tgz", - "integrity": "sha512-T2hOHzvI+ikNxQRvhDyk/TeMCBhjZPY+wLmRSbYHiWnNGP5+3GCesZyb672XfEwPIWRH2kBS4vyp9R9fRnJujQ==", - "dependencies": { - "@bitbybit-dev/base": "0.20.4", - "@bitbybit-dev/jscad-worker": "0.20.4", - "@bitbybit-dev/manifold-worker": "0.20.4", - "@bitbybit-dev/occt-worker": "0.20.4", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.5.tgz", + "integrity": "sha512-4uGVqzCbRmcQhbXMib99hqYoCVeR1nu98rM7fsd2p0KV7geqSvUtp8qUvwu6rroktJ04H50z91JuRG+Cy0jqOQ==", + "dependencies": { + "@bitbybit-dev/base": "0.20.5", + "@bitbybit-dev/jscad-worker": "0.20.5", + "@bitbybit-dev/manifold-worker": "0.20.5", + "@bitbybit-dev/occt-worker": "0.20.5", "jsonpath-plus": "10.1.0", "rxjs": "7.5.5", "verb-nurbs-web": "2.1.3" } }, "node_modules/@bitbybit-dev/jscad": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.4.tgz", - "integrity": "sha512-e7/7Ag796rwn58H6Nu0lzhDkim+rJTqMWCqFZquNswoX2qqZXCv8azyOFE2LqfTvyIsEeJr/VEWIy2nvmtJnmg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.5.tgz", + "integrity": "sha512-h1SQLeMZTXwvXDt+dggoq4zNJoMKL4nfeyXkL6BVeu8gXarvPboEX1FkYatrenkFF5B0G5kBwd9B797t6VjFBA==", "dependencies": { - "@bitbybit-dev/base": "0.20.4", + "@bitbybit-dev/base": "0.20.5", "@jscad/3mf-serializer": "2.1.12", "@jscad/dxf-serializer": "2.1.18", "@jscad/io-utils": "2.0.28", @@ -69,45 +69,45 @@ } }, "node_modules/@bitbybit-dev/jscad-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.4.tgz", - "integrity": "sha512-DsjL2YO6urR8B/8LKYRrk4q9hAJE8oB+e5m+LDDBXbl7Vl0CHdC5ogPm6w07RcAHdSbMJouf2Ow7nGP/oOcjEg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.5.tgz", + "integrity": "sha512-TtsyplH8d4KJz5izzhui1ZOeALYnHw40t5mCrjS62pKqr16glf1Ab4Y7Kqfj05eBQfBfTmD0wGZnXtoWBZM7Vw==", "dependencies": { - "@bitbybit-dev/jscad": "0.20.4", + "@bitbybit-dev/jscad": "0.20.5", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/manifold": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.4.tgz", - "integrity": "sha512-rEGO8wOd/RUWPIRWdyE70w79JXhQ1iV6mACBuOH8/UD7+vf9wkk3KLWAYCzVPJP1nvx4+/SKCvU7e1JxEzq0Qw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.5.tgz", + "integrity": "sha512-m+jmRkuW4V5NlM5pITK/GH52GUzIYLUzTqdzTGZ+mOpfANH3jDUHAGyJJlrgqwApUXexuRX8GZ18Am5IcVRJdA==", "dependencies": { "manifold-3d": "3.0.0" } }, "node_modules/@bitbybit-dev/manifold-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.4.tgz", - "integrity": "sha512-mwU87fg8M3p472dn/RiuveiPtq/IuOWCcoG0uismEE2g+rnciMrCSUSkXMkfXDCk9l0ZqoVfYg+dHVx0KBHBUg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.5.tgz", + "integrity": "sha512-d6KhxveoM+MoEVq/8ySmZcDU4ShzPmQzfvyRi8dXQ27SgrAQldNBtZtU0DCGx7Gbl9+6PyWrnG86e6AzvwANyg==", "dependencies": { - "@bitbybit-dev/manifold": "0.20.4", + "@bitbybit-dev/manifold": "0.20.5", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/occt": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.4.tgz", - "integrity": "sha512-Lxx4wsToS3EIiS2L3KjUh6Jpgvxsyxbh2Jt4raWhIbD9PSy1zRfMww9K7xFlawSMgq12WN1a0lV8ydKs1f5/zw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.5.tgz", + "integrity": "sha512-PHVvROaXoTeolPI8R68tRyhEUqIDbhfB6foc/FxqL4IBjftCyYMPb2pMkYvWHbmCTZRF2/Wx+qZQB+Zd386LYA==", "dependencies": { - "@bitbybit-dev/base": "0.20.4" + "@bitbybit-dev/base": "0.20.5" } }, "node_modules/@bitbybit-dev/occt-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.4.tgz", - "integrity": "sha512-R5fiGteBSitv89Pz3XVgs+Vv0c1uH477oihkw1EUWLDTa7ypiXOohpjlKYFd/qAy3QCe8GEF3jDT+TK3dsQ+FA==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.5.tgz", + "integrity": "sha512-3Rp4psUuXlLNv5EpL5INrR3HcOsqaztB7WRp+kUXP6mt0/Q+UzRDEDMfND5RUo9UN918m7D78vSZIcvwH3tIeg==", "dependencies": { - "@bitbybit-dev/occt": "0.20.4", + "@bitbybit-dev/occt": "0.20.5", "rxjs": "7.5.5" } }, @@ -1824,30 +1824,30 @@ } }, "@bitbybit-dev/base": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.4.tgz", - "integrity": "sha512-yMsOkUFrm9JIGC3Bs49bu1I/gqwQNK8nVO3XgesOpzZvVQOF5OTxCheiQnrqiUw9DiiPuKw1T0gXBMwThzwdOw==" + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.5.tgz", + "integrity": "sha512-aFjGKgKO+DLq7b+EJ9I8u4Jlit8Xh/ahA5C/c/i3nafds5i5sFgUpD+MCZKMQEW9T7qqWCIselwBXQSeTsqJvA==" }, "@bitbybit-dev/core": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.4.tgz", - "integrity": "sha512-T2hOHzvI+ikNxQRvhDyk/TeMCBhjZPY+wLmRSbYHiWnNGP5+3GCesZyb672XfEwPIWRH2kBS4vyp9R9fRnJujQ==", - "requires": { - "@bitbybit-dev/base": "0.20.4", - "@bitbybit-dev/jscad-worker": "0.20.4", - "@bitbybit-dev/manifold-worker": "0.20.4", - "@bitbybit-dev/occt-worker": "0.20.4", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.5.tgz", + "integrity": "sha512-4uGVqzCbRmcQhbXMib99hqYoCVeR1nu98rM7fsd2p0KV7geqSvUtp8qUvwu6rroktJ04H50z91JuRG+Cy0jqOQ==", + "requires": { + "@bitbybit-dev/base": "0.20.5", + "@bitbybit-dev/jscad-worker": "0.20.5", + "@bitbybit-dev/manifold-worker": "0.20.5", + "@bitbybit-dev/occt-worker": "0.20.5", "jsonpath-plus": "10.1.0", "rxjs": "7.5.5", "verb-nurbs-web": "2.1.3" } }, "@bitbybit-dev/jscad": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.4.tgz", - "integrity": "sha512-e7/7Ag796rwn58H6Nu0lzhDkim+rJTqMWCqFZquNswoX2qqZXCv8azyOFE2LqfTvyIsEeJr/VEWIy2nvmtJnmg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.5.tgz", + "integrity": "sha512-h1SQLeMZTXwvXDt+dggoq4zNJoMKL4nfeyXkL6BVeu8gXarvPboEX1FkYatrenkFF5B0G5kBwd9B797t6VjFBA==", "requires": { - "@bitbybit-dev/base": "0.20.4", + "@bitbybit-dev/base": "0.20.5", "@jscad/3mf-serializer": "2.1.12", "@jscad/dxf-serializer": "2.1.18", "@jscad/io-utils": "2.0.28", @@ -1856,45 +1856,45 @@ } }, "@bitbybit-dev/jscad-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.4.tgz", - "integrity": "sha512-DsjL2YO6urR8B/8LKYRrk4q9hAJE8oB+e5m+LDDBXbl7Vl0CHdC5ogPm6w07RcAHdSbMJouf2Ow7nGP/oOcjEg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.5.tgz", + "integrity": "sha512-TtsyplH8d4KJz5izzhui1ZOeALYnHw40t5mCrjS62pKqr16glf1Ab4Y7Kqfj05eBQfBfTmD0wGZnXtoWBZM7Vw==", "requires": { - "@bitbybit-dev/jscad": "0.20.4", + "@bitbybit-dev/jscad": "0.20.5", "rxjs": "7.5.5" } }, "@bitbybit-dev/manifold": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.4.tgz", - "integrity": "sha512-rEGO8wOd/RUWPIRWdyE70w79JXhQ1iV6mACBuOH8/UD7+vf9wkk3KLWAYCzVPJP1nvx4+/SKCvU7e1JxEzq0Qw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.5.tgz", + "integrity": "sha512-m+jmRkuW4V5NlM5pITK/GH52GUzIYLUzTqdzTGZ+mOpfANH3jDUHAGyJJlrgqwApUXexuRX8GZ18Am5IcVRJdA==", "requires": { "manifold-3d": "3.0.0" } }, "@bitbybit-dev/manifold-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.4.tgz", - "integrity": "sha512-mwU87fg8M3p472dn/RiuveiPtq/IuOWCcoG0uismEE2g+rnciMrCSUSkXMkfXDCk9l0ZqoVfYg+dHVx0KBHBUg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.5.tgz", + "integrity": "sha512-d6KhxveoM+MoEVq/8ySmZcDU4ShzPmQzfvyRi8dXQ27SgrAQldNBtZtU0DCGx7Gbl9+6PyWrnG86e6AzvwANyg==", "requires": { - "@bitbybit-dev/manifold": "0.20.4", + "@bitbybit-dev/manifold": "0.20.5", "rxjs": "7.5.5" } }, "@bitbybit-dev/occt": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.4.tgz", - "integrity": "sha512-Lxx4wsToS3EIiS2L3KjUh6Jpgvxsyxbh2Jt4raWhIbD9PSy1zRfMww9K7xFlawSMgq12WN1a0lV8ydKs1f5/zw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.5.tgz", + "integrity": "sha512-PHVvROaXoTeolPI8R68tRyhEUqIDbhfB6foc/FxqL4IBjftCyYMPb2pMkYvWHbmCTZRF2/Wx+qZQB+Zd386LYA==", "requires": { - "@bitbybit-dev/base": "0.20.4" + "@bitbybit-dev/base": "0.20.5" } }, "@bitbybit-dev/occt-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.4.tgz", - "integrity": "sha512-R5fiGteBSitv89Pz3XVgs+Vv0c1uH477oihkw1EUWLDTa7ypiXOohpjlKYFd/qAy3QCe8GEF3jDT+TK3dsQ+FA==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.5.tgz", + "integrity": "sha512-3Rp4psUuXlLNv5EpL5INrR3HcOsqaztB7WRp+kUXP6mt0/Q+UzRDEDMfND5RUo9UN918m7D78vSZIcvwH3tIeg==", "requires": { - "@bitbybit-dev/occt": "0.20.4", + "@bitbybit-dev/occt": "0.20.5", "rxjs": "7.5.5" } }, diff --git a/examples/node/express-app/package.json b/examples/node/express-app/package.json index 1ee489cb..984cf0d7 100644 --- a/examples/node/express-app/package.json +++ b/examples/node/express-app/package.json @@ -11,7 +11,7 @@ "author": "Bit By Bit Developers", "license": "MIT", "dependencies": { - "@bitbybit-dev/core": "0.20.4", + "@bitbybit-dev/core": "0.20.5", "cors": "^2.8.5", "dotenv": "^16.0.3", "express": "^4.18.2", diff --git a/examples/nuxt/babylonjs/basic/package-lock.json b/examples/nuxt/babylonjs/basic/package-lock.json index 175a58da..59c67bc9 100644 --- a/examples/nuxt/babylonjs/basic/package-lock.json +++ b/examples/nuxt/babylonjs/basic/package-lock.json @@ -8,7 +8,7 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@bitbybit-dev/babylonjs": "0.20.4", + "@bitbybit-dev/babylonjs": "0.20.5", "@pinia/nuxt": "^0.5.4", "nuxt": "^3.13.0", "pinia": "^2.2.2", @@ -486,14 +486,14 @@ } }, "node_modules/@babylonjs/core": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.9.1.tgz", - "integrity": "sha512-YJvsQgjEtBIKDJXCi+6rhPH5UJ46QbaMknO5fQGg8tT2PI5L6D+vfrhdZc1YNnzDrOmLkrkXF/Uy2CGdXFdT9Q==" + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.23.1.tgz", + "integrity": "sha512-ro126NE6PZMb+uvRZhWZEB9O1CTiQE0xk4immnDu17KUoYkqcrsl+nDK8z6q8X+I1yQIelfJuOd6L1iRocgZfw==" }, "node_modules/@babylonjs/gui": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.9.1.tgz", - "integrity": "sha512-kYxPJ8C3HlNYrsKn3fPXJhQ8/BFUxMksBSNKQD+AsduEFWsMSlViYPdcMFh3oGpXEFZsqefoBoQe9xwN9L7brw==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.23.1.tgz", + "integrity": "sha512-GnpmcoJ4G6bRl/k1WPHkTRXv7pctc77lFbgUiUGgIjDBEJP9PmxC4Gs3mL4urEwxe/ODcOLN2wPdrImCOxiOVQ==", "peerDependencies": { "@babylonjs/core": "^8.0.0" } @@ -507,71 +507,71 @@ } }, "node_modules/@babylonjs/loaders": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.9.1.tgz", - "integrity": "sha512-8UolyusbjHoVVD2nNrqMMNS0a6OIiGrxPyzs6LYqCRFuXKXNhnFIPYCNU3WEBeD5Uc3+UQXgSaQpZudtjflFMw==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.23.1.tgz", + "integrity": "sha512-7FJ7PRaQWW94Abvr7vqKN8jTL7hH0F3RuTlgCZno6vQsdMCf+9Q3dVE0zRA2pbGg8G+RS4V/tYhL5nbIlX/1xQ==", "peerDependencies": { "@babylonjs/core": "^8.0.0", "babylonjs-gltf2interface": "^8.0.0" } }, "node_modules/@babylonjs/materials": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.9.1.tgz", - "integrity": "sha512-/Ey/Kkb9JcqM1eJ7HpOcvMhCbE2CAPRJRBhTCe6jUQ08eG/nuOJHs5SRUBdP4X4DRxgDQWY0owFP2nLLWQKM6A==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.23.1.tgz", + "integrity": "sha512-X36+SXDA/81cQPfeg+gUAfcMm/FE/oVNR9NWIOaTo6oJEHNC/EQIuAME1qL3vrLUB/Yrb9CJPg2V76Lh2Pc5vQ==", "peerDependencies": { "@babylonjs/core": "^8.6.0" } }, "node_modules/@babylonjs/serializers": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.9.1.tgz", - "integrity": "sha512-iGsizPwkQp00PaBzZing+5/CBR/x2yCkGu7GsOx2uFfoutihtn8zy+u51rarE2O6TO2sNjxp/KxCMng48c8KWA==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.23.1.tgz", + "integrity": "sha512-vlSZoHmq7TIivk2dtpmhW6VpPRe6oa4t9c/03LAcEGnvE3SppGrpVhQHx0k1Zj3HM4ae2TUhLsi58Bf4ppZUUg==", "peerDependencies": { "@babylonjs/core": "^8.0.0", "babylonjs-gltf2interface": "^8.0.0" } }, "node_modules/@bitbybit-dev/babylonjs": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.4.tgz", - "integrity": "sha512-tn+1VYQgz+6c2i16HpkIgWnIIRdnUCQKFdA701QGcKB59zJ67rU7Y8TIVTSVgPwJ9mJLpg1Co3bCVYEAyGCYXw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.5.tgz", + "integrity": "sha512-y6YgJbRAkLfgVNvtuuZHqE0xcfrpVC296f44v9T0DVZg1HPL9t60rmpzhiSVd7Hc+xd5qnL7ttAQ4X0n1kMfEg==", "dependencies": { - "@babylonjs/core": "8.9.1", - "@babylonjs/gui": "8.9.1", + "@babylonjs/core": "8.23.1", + "@babylonjs/gui": "8.23.1", "@babylonjs/havok": "1.3.10", - "@babylonjs/loaders": "8.9.1", - "@babylonjs/materials": "8.9.1", - "@babylonjs/serializers": "8.9.1", - "@bitbybit-dev/core": "0.20.4", + "@babylonjs/loaders": "8.23.1", + "@babylonjs/materials": "8.23.1", + "@babylonjs/serializers": "8.23.1", + "@bitbybit-dev/core": "0.20.5", "earcut": "2.2.3" } }, "node_modules/@bitbybit-dev/base": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.4.tgz", - "integrity": "sha512-yMsOkUFrm9JIGC3Bs49bu1I/gqwQNK8nVO3XgesOpzZvVQOF5OTxCheiQnrqiUw9DiiPuKw1T0gXBMwThzwdOw==" + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.5.tgz", + "integrity": "sha512-aFjGKgKO+DLq7b+EJ9I8u4Jlit8Xh/ahA5C/c/i3nafds5i5sFgUpD+MCZKMQEW9T7qqWCIselwBXQSeTsqJvA==" }, "node_modules/@bitbybit-dev/core": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.4.tgz", - "integrity": "sha512-T2hOHzvI+ikNxQRvhDyk/TeMCBhjZPY+wLmRSbYHiWnNGP5+3GCesZyb672XfEwPIWRH2kBS4vyp9R9fRnJujQ==", - "dependencies": { - "@bitbybit-dev/base": "0.20.4", - "@bitbybit-dev/jscad-worker": "0.20.4", - "@bitbybit-dev/manifold-worker": "0.20.4", - "@bitbybit-dev/occt-worker": "0.20.4", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.5.tgz", + "integrity": "sha512-4uGVqzCbRmcQhbXMib99hqYoCVeR1nu98rM7fsd2p0KV7geqSvUtp8qUvwu6rroktJ04H50z91JuRG+Cy0jqOQ==", + "dependencies": { + "@bitbybit-dev/base": "0.20.5", + "@bitbybit-dev/jscad-worker": "0.20.5", + "@bitbybit-dev/manifold-worker": "0.20.5", + "@bitbybit-dev/occt-worker": "0.20.5", "jsonpath-plus": "10.1.0", "rxjs": "7.5.5", "verb-nurbs-web": "2.1.3" } }, "node_modules/@bitbybit-dev/jscad": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.4.tgz", - "integrity": "sha512-e7/7Ag796rwn58H6Nu0lzhDkim+rJTqMWCqFZquNswoX2qqZXCv8azyOFE2LqfTvyIsEeJr/VEWIy2nvmtJnmg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.5.tgz", + "integrity": "sha512-h1SQLeMZTXwvXDt+dggoq4zNJoMKL4nfeyXkL6BVeu8gXarvPboEX1FkYatrenkFF5B0G5kBwd9B797t6VjFBA==", "dependencies": { - "@bitbybit-dev/base": "0.20.4", + "@bitbybit-dev/base": "0.20.5", "@jscad/3mf-serializer": "2.1.12", "@jscad/dxf-serializer": "2.1.18", "@jscad/io-utils": "2.0.28", @@ -580,45 +580,45 @@ } }, "node_modules/@bitbybit-dev/jscad-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.4.tgz", - "integrity": "sha512-DsjL2YO6urR8B/8LKYRrk4q9hAJE8oB+e5m+LDDBXbl7Vl0CHdC5ogPm6w07RcAHdSbMJouf2Ow7nGP/oOcjEg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.5.tgz", + "integrity": "sha512-TtsyplH8d4KJz5izzhui1ZOeALYnHw40t5mCrjS62pKqr16glf1Ab4Y7Kqfj05eBQfBfTmD0wGZnXtoWBZM7Vw==", "dependencies": { - "@bitbybit-dev/jscad": "0.20.4", + "@bitbybit-dev/jscad": "0.20.5", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/manifold": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.4.tgz", - "integrity": "sha512-rEGO8wOd/RUWPIRWdyE70w79JXhQ1iV6mACBuOH8/UD7+vf9wkk3KLWAYCzVPJP1nvx4+/SKCvU7e1JxEzq0Qw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.5.tgz", + "integrity": "sha512-m+jmRkuW4V5NlM5pITK/GH52GUzIYLUzTqdzTGZ+mOpfANH3jDUHAGyJJlrgqwApUXexuRX8GZ18Am5IcVRJdA==", "dependencies": { "manifold-3d": "3.0.0" } }, "node_modules/@bitbybit-dev/manifold-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.4.tgz", - "integrity": "sha512-mwU87fg8M3p472dn/RiuveiPtq/IuOWCcoG0uismEE2g+rnciMrCSUSkXMkfXDCk9l0ZqoVfYg+dHVx0KBHBUg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.5.tgz", + "integrity": "sha512-d6KhxveoM+MoEVq/8ySmZcDU4ShzPmQzfvyRi8dXQ27SgrAQldNBtZtU0DCGx7Gbl9+6PyWrnG86e6AzvwANyg==", "dependencies": { - "@bitbybit-dev/manifold": "0.20.4", + "@bitbybit-dev/manifold": "0.20.5", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/occt": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.4.tgz", - "integrity": "sha512-Lxx4wsToS3EIiS2L3KjUh6Jpgvxsyxbh2Jt4raWhIbD9PSy1zRfMww9K7xFlawSMgq12WN1a0lV8ydKs1f5/zw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.5.tgz", + "integrity": "sha512-PHVvROaXoTeolPI8R68tRyhEUqIDbhfB6foc/FxqL4IBjftCyYMPb2pMkYvWHbmCTZRF2/Wx+qZQB+Zd386LYA==", "dependencies": { - "@bitbybit-dev/base": "0.20.4" + "@bitbybit-dev/base": "0.20.5" } }, "node_modules/@bitbybit-dev/occt-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.4.tgz", - "integrity": "sha512-R5fiGteBSitv89Pz3XVgs+Vv0c1uH477oihkw1EUWLDTa7ypiXOohpjlKYFd/qAy3QCe8GEF3jDT+TK3dsQ+FA==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.5.tgz", + "integrity": "sha512-3Rp4psUuXlLNv5EpL5INrR3HcOsqaztB7WRp+kUXP6mt0/Q+UzRDEDMfND5RUo9UN918m7D78vSZIcvwH3tIeg==", "dependencies": { - "@bitbybit-dev/occt": "0.20.4", + "@bitbybit-dev/occt": "0.20.5", "rxjs": "7.5.5" } }, @@ -3006,9 +3006,9 @@ "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==" }, "node_modules/babylonjs-gltf2interface": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.9.1.tgz", - "integrity": "sha512-7GjEcvwL+d/lJ058J7rYTM96reekIq/kjg6SkM7NG6+Krj7UM3HMeJkAhwj22dCBfOs2/RzjFSGleEhh5qjq5g==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.24.0.tgz", + "integrity": "sha512-X3CA16Nl/l2xfXyiKXOZGcCJxfIoUOcTjgavQ0NDX07Zc4r64aWriIDds6qvEQPPoutCG7ralQdB29YVL6rSLg==", "peer": true }, "node_modules/balanced-match": { @@ -5483,9 +5483,9 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nan": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", - "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz", + "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==", "optional": true }, "node_modules/nanoid": { diff --git a/examples/nuxt/babylonjs/basic/package.json b/examples/nuxt/babylonjs/basic/package.json index 5e948baf..f2dc3dbe 100644 --- a/examples/nuxt/babylonjs/basic/package.json +++ b/examples/nuxt/babylonjs/basic/package.json @@ -11,7 +11,7 @@ "postinstall": "nuxt prepare" }, "dependencies": { - "@bitbybit-dev/babylonjs": "0.20.4", + "@bitbybit-dev/babylonjs": "0.20.5", "@pinia/nuxt": "^0.5.4", "nuxt": "^3.13.0", "pinia": "^2.2.2", diff --git a/examples/react/babylonjs/cup/package-lock.json b/examples/react/babylonjs/cup/package-lock.json index 86dc19f8..8a319454 100644 --- a/examples/react/babylonjs/cup/package-lock.json +++ b/examples/react/babylonjs/cup/package-lock.json @@ -8,7 +8,7 @@ "name": "cup", "version": "0.1.0", "dependencies": { - "@bitbybit-dev/babylonjs": "0.20.4", + "@bitbybit-dev/babylonjs": "0.20.5", "@emotion/react": "11.9.0", "@emotion/styled": "11.8.1", "@mui/icons-material": "5.6.2", @@ -1809,14 +1809,14 @@ } }, "node_modules/@babylonjs/core": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.9.1.tgz", - "integrity": "sha512-YJvsQgjEtBIKDJXCi+6rhPH5UJ46QbaMknO5fQGg8tT2PI5L6D+vfrhdZc1YNnzDrOmLkrkXF/Uy2CGdXFdT9Q==" + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.23.1.tgz", + "integrity": "sha512-ro126NE6PZMb+uvRZhWZEB9O1CTiQE0xk4immnDu17KUoYkqcrsl+nDK8z6q8X+I1yQIelfJuOd6L1iRocgZfw==" }, "node_modules/@babylonjs/gui": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.9.1.tgz", - "integrity": "sha512-kYxPJ8C3HlNYrsKn3fPXJhQ8/BFUxMksBSNKQD+AsduEFWsMSlViYPdcMFh3oGpXEFZsqefoBoQe9xwN9L7brw==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.23.1.tgz", + "integrity": "sha512-GnpmcoJ4G6bRl/k1WPHkTRXv7pctc77lFbgUiUGgIjDBEJP9PmxC4Gs3mL4urEwxe/ODcOLN2wPdrImCOxiOVQ==", "peerDependencies": { "@babylonjs/core": "^8.0.0" } @@ -1830,26 +1830,26 @@ } }, "node_modules/@babylonjs/loaders": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.9.1.tgz", - "integrity": "sha512-8UolyusbjHoVVD2nNrqMMNS0a6OIiGrxPyzs6LYqCRFuXKXNhnFIPYCNU3WEBeD5Uc3+UQXgSaQpZudtjflFMw==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.23.1.tgz", + "integrity": "sha512-7FJ7PRaQWW94Abvr7vqKN8jTL7hH0F3RuTlgCZno6vQsdMCf+9Q3dVE0zRA2pbGg8G+RS4V/tYhL5nbIlX/1xQ==", "peerDependencies": { "@babylonjs/core": "^8.0.0", "babylonjs-gltf2interface": "^8.0.0" } }, "node_modules/@babylonjs/materials": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.9.1.tgz", - "integrity": "sha512-/Ey/Kkb9JcqM1eJ7HpOcvMhCbE2CAPRJRBhTCe6jUQ08eG/nuOJHs5SRUBdP4X4DRxgDQWY0owFP2nLLWQKM6A==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.23.1.tgz", + "integrity": "sha512-X36+SXDA/81cQPfeg+gUAfcMm/FE/oVNR9NWIOaTo6oJEHNC/EQIuAME1qL3vrLUB/Yrb9CJPg2V76Lh2Pc5vQ==", "peerDependencies": { "@babylonjs/core": "^8.6.0" } }, "node_modules/@babylonjs/serializers": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.9.1.tgz", - "integrity": "sha512-iGsizPwkQp00PaBzZing+5/CBR/x2yCkGu7GsOx2uFfoutihtn8zy+u51rarE2O6TO2sNjxp/KxCMng48c8KWA==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.23.1.tgz", + "integrity": "sha512-vlSZoHmq7TIivk2dtpmhW6VpPRe6oa4t9c/03LAcEGnvE3SppGrpVhQHx0k1Zj3HM4ae2TUhLsi58Bf4ppZUUg==", "peerDependencies": { "@babylonjs/core": "^8.0.0", "babylonjs-gltf2interface": "^8.0.0" @@ -1861,45 +1861,45 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, "node_modules/@bitbybit-dev/babylonjs": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.4.tgz", - "integrity": "sha512-tn+1VYQgz+6c2i16HpkIgWnIIRdnUCQKFdA701QGcKB59zJ67rU7Y8TIVTSVgPwJ9mJLpg1Co3bCVYEAyGCYXw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.5.tgz", + "integrity": "sha512-y6YgJbRAkLfgVNvtuuZHqE0xcfrpVC296f44v9T0DVZg1HPL9t60rmpzhiSVd7Hc+xd5qnL7ttAQ4X0n1kMfEg==", "dependencies": { - "@babylonjs/core": "8.9.1", - "@babylonjs/gui": "8.9.1", + "@babylonjs/core": "8.23.1", + "@babylonjs/gui": "8.23.1", "@babylonjs/havok": "1.3.10", - "@babylonjs/loaders": "8.9.1", - "@babylonjs/materials": "8.9.1", - "@babylonjs/serializers": "8.9.1", - "@bitbybit-dev/core": "0.20.4", + "@babylonjs/loaders": "8.23.1", + "@babylonjs/materials": "8.23.1", + "@babylonjs/serializers": "8.23.1", + "@bitbybit-dev/core": "0.20.5", "earcut": "2.2.3" } }, "node_modules/@bitbybit-dev/base": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.4.tgz", - "integrity": "sha512-yMsOkUFrm9JIGC3Bs49bu1I/gqwQNK8nVO3XgesOpzZvVQOF5OTxCheiQnrqiUw9DiiPuKw1T0gXBMwThzwdOw==" + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.5.tgz", + "integrity": "sha512-aFjGKgKO+DLq7b+EJ9I8u4Jlit8Xh/ahA5C/c/i3nafds5i5sFgUpD+MCZKMQEW9T7qqWCIselwBXQSeTsqJvA==" }, "node_modules/@bitbybit-dev/core": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.4.tgz", - "integrity": "sha512-T2hOHzvI+ikNxQRvhDyk/TeMCBhjZPY+wLmRSbYHiWnNGP5+3GCesZyb672XfEwPIWRH2kBS4vyp9R9fRnJujQ==", - "dependencies": { - "@bitbybit-dev/base": "0.20.4", - "@bitbybit-dev/jscad-worker": "0.20.4", - "@bitbybit-dev/manifold-worker": "0.20.4", - "@bitbybit-dev/occt-worker": "0.20.4", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.5.tgz", + "integrity": "sha512-4uGVqzCbRmcQhbXMib99hqYoCVeR1nu98rM7fsd2p0KV7geqSvUtp8qUvwu6rroktJ04H50z91JuRG+Cy0jqOQ==", + "dependencies": { + "@bitbybit-dev/base": "0.20.5", + "@bitbybit-dev/jscad-worker": "0.20.5", + "@bitbybit-dev/manifold-worker": "0.20.5", + "@bitbybit-dev/occt-worker": "0.20.5", "jsonpath-plus": "10.1.0", "rxjs": "7.5.5", "verb-nurbs-web": "2.1.3" } }, "node_modules/@bitbybit-dev/jscad": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.4.tgz", - "integrity": "sha512-e7/7Ag796rwn58H6Nu0lzhDkim+rJTqMWCqFZquNswoX2qqZXCv8azyOFE2LqfTvyIsEeJr/VEWIy2nvmtJnmg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.5.tgz", + "integrity": "sha512-h1SQLeMZTXwvXDt+dggoq4zNJoMKL4nfeyXkL6BVeu8gXarvPboEX1FkYatrenkFF5B0G5kBwd9B797t6VjFBA==", "dependencies": { - "@bitbybit-dev/base": "0.20.4", + "@bitbybit-dev/base": "0.20.5", "@jscad/3mf-serializer": "2.1.12", "@jscad/dxf-serializer": "2.1.18", "@jscad/io-utils": "2.0.28", @@ -1908,45 +1908,45 @@ } }, "node_modules/@bitbybit-dev/jscad-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.4.tgz", - "integrity": "sha512-DsjL2YO6urR8B/8LKYRrk4q9hAJE8oB+e5m+LDDBXbl7Vl0CHdC5ogPm6w07RcAHdSbMJouf2Ow7nGP/oOcjEg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.5.tgz", + "integrity": "sha512-TtsyplH8d4KJz5izzhui1ZOeALYnHw40t5mCrjS62pKqr16glf1Ab4Y7Kqfj05eBQfBfTmD0wGZnXtoWBZM7Vw==", "dependencies": { - "@bitbybit-dev/jscad": "0.20.4", + "@bitbybit-dev/jscad": "0.20.5", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/manifold": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.4.tgz", - "integrity": "sha512-rEGO8wOd/RUWPIRWdyE70w79JXhQ1iV6mACBuOH8/UD7+vf9wkk3KLWAYCzVPJP1nvx4+/SKCvU7e1JxEzq0Qw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.5.tgz", + "integrity": "sha512-m+jmRkuW4V5NlM5pITK/GH52GUzIYLUzTqdzTGZ+mOpfANH3jDUHAGyJJlrgqwApUXexuRX8GZ18Am5IcVRJdA==", "dependencies": { "manifold-3d": "3.0.0" } }, "node_modules/@bitbybit-dev/manifold-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.4.tgz", - "integrity": "sha512-mwU87fg8M3p472dn/RiuveiPtq/IuOWCcoG0uismEE2g+rnciMrCSUSkXMkfXDCk9l0ZqoVfYg+dHVx0KBHBUg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.5.tgz", + "integrity": "sha512-d6KhxveoM+MoEVq/8ySmZcDU4ShzPmQzfvyRi8dXQ27SgrAQldNBtZtU0DCGx7Gbl9+6PyWrnG86e6AzvwANyg==", "dependencies": { - "@bitbybit-dev/manifold": "0.20.4", + "@bitbybit-dev/manifold": "0.20.5", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/occt": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.4.tgz", - "integrity": "sha512-Lxx4wsToS3EIiS2L3KjUh6Jpgvxsyxbh2Jt4raWhIbD9PSy1zRfMww9K7xFlawSMgq12WN1a0lV8ydKs1f5/zw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.5.tgz", + "integrity": "sha512-PHVvROaXoTeolPI8R68tRyhEUqIDbhfB6foc/FxqL4IBjftCyYMPb2pMkYvWHbmCTZRF2/Wx+qZQB+Zd386LYA==", "dependencies": { - "@bitbybit-dev/base": "0.20.4" + "@bitbybit-dev/base": "0.20.5" } }, "node_modules/@bitbybit-dev/occt-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.4.tgz", - "integrity": "sha512-R5fiGteBSitv89Pz3XVgs+Vv0c1uH477oihkw1EUWLDTa7ypiXOohpjlKYFd/qAy3QCe8GEF3jDT+TK3dsQ+FA==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.5.tgz", + "integrity": "sha512-3Rp4psUuXlLNv5EpL5INrR3HcOsqaztB7WRp+kUXP6mt0/Q+UzRDEDMfND5RUo9UN918m7D78vSZIcvwH3tIeg==", "dependencies": { - "@bitbybit-dev/occt": "0.20.4", + "@bitbybit-dev/occt": "0.20.5", "rxjs": "7.5.5" } }, @@ -5672,9 +5672,9 @@ } }, "node_modules/babylonjs-gltf2interface": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.9.1.tgz", - "integrity": "sha512-7GjEcvwL+d/lJ058J7rYTM96reekIq/kjg6SkM7NG6+Krj7UM3HMeJkAhwj22dCBfOs2/RzjFSGleEhh5qjq5g==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.24.0.tgz", + "integrity": "sha512-X3CA16Nl/l2xfXyiKXOZGcCJxfIoUOcTjgavQ0NDX07Zc4r64aWriIDds6qvEQPPoutCG7ralQdB29YVL6rSLg==", "peer": true }, "node_modules/balanced-match": { @@ -12610,9 +12610,9 @@ } }, "node_modules/nan": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", - "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz", + "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==", "optional": true }, "node_modules/nanoid": { @@ -19040,14 +19040,14 @@ } }, "@babylonjs/core": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.9.1.tgz", - "integrity": "sha512-YJvsQgjEtBIKDJXCi+6rhPH5UJ46QbaMknO5fQGg8tT2PI5L6D+vfrhdZc1YNnzDrOmLkrkXF/Uy2CGdXFdT9Q==" + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.23.1.tgz", + "integrity": "sha512-ro126NE6PZMb+uvRZhWZEB9O1CTiQE0xk4immnDu17KUoYkqcrsl+nDK8z6q8X+I1yQIelfJuOd6L1iRocgZfw==" }, "@babylonjs/gui": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.9.1.tgz", - "integrity": "sha512-kYxPJ8C3HlNYrsKn3fPXJhQ8/BFUxMksBSNKQD+AsduEFWsMSlViYPdcMFh3oGpXEFZsqefoBoQe9xwN9L7brw==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.23.1.tgz", + "integrity": "sha512-GnpmcoJ4G6bRl/k1WPHkTRXv7pctc77lFbgUiUGgIjDBEJP9PmxC4Gs3mL4urEwxe/ODcOLN2wPdrImCOxiOVQ==", "requires": {} }, "@babylonjs/havok": { @@ -19059,21 +19059,21 @@ } }, "@babylonjs/loaders": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.9.1.tgz", - "integrity": "sha512-8UolyusbjHoVVD2nNrqMMNS0a6OIiGrxPyzs6LYqCRFuXKXNhnFIPYCNU3WEBeD5Uc3+UQXgSaQpZudtjflFMw==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.23.1.tgz", + "integrity": "sha512-7FJ7PRaQWW94Abvr7vqKN8jTL7hH0F3RuTlgCZno6vQsdMCf+9Q3dVE0zRA2pbGg8G+RS4V/tYhL5nbIlX/1xQ==", "requires": {} }, "@babylonjs/materials": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.9.1.tgz", - "integrity": "sha512-/Ey/Kkb9JcqM1eJ7HpOcvMhCbE2CAPRJRBhTCe6jUQ08eG/nuOJHs5SRUBdP4X4DRxgDQWY0owFP2nLLWQKM6A==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.23.1.tgz", + "integrity": "sha512-X36+SXDA/81cQPfeg+gUAfcMm/FE/oVNR9NWIOaTo6oJEHNC/EQIuAME1qL3vrLUB/Yrb9CJPg2V76Lh2Pc5vQ==", "requires": {} }, "@babylonjs/serializers": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.9.1.tgz", - "integrity": "sha512-iGsizPwkQp00PaBzZing+5/CBR/x2yCkGu7GsOx2uFfoutihtn8zy+u51rarE2O6TO2sNjxp/KxCMng48c8KWA==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.23.1.tgz", + "integrity": "sha512-vlSZoHmq7TIivk2dtpmhW6VpPRe6oa4t9c/03LAcEGnvE3SppGrpVhQHx0k1Zj3HM4ae2TUhLsi58Bf4ppZUUg==", "requires": {} }, "@bcoe/v8-coverage": { @@ -19082,45 +19082,45 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, "@bitbybit-dev/babylonjs": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.4.tgz", - "integrity": "sha512-tn+1VYQgz+6c2i16HpkIgWnIIRdnUCQKFdA701QGcKB59zJ67rU7Y8TIVTSVgPwJ9mJLpg1Co3bCVYEAyGCYXw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.5.tgz", + "integrity": "sha512-y6YgJbRAkLfgVNvtuuZHqE0xcfrpVC296f44v9T0DVZg1HPL9t60rmpzhiSVd7Hc+xd5qnL7ttAQ4X0n1kMfEg==", "requires": { - "@babylonjs/core": "8.9.1", - "@babylonjs/gui": "8.9.1", + "@babylonjs/core": "8.23.1", + "@babylonjs/gui": "8.23.1", "@babylonjs/havok": "1.3.10", - "@babylonjs/loaders": "8.9.1", - "@babylonjs/materials": "8.9.1", - "@babylonjs/serializers": "8.9.1", - "@bitbybit-dev/core": "0.20.4", + "@babylonjs/loaders": "8.23.1", + "@babylonjs/materials": "8.23.1", + "@babylonjs/serializers": "8.23.1", + "@bitbybit-dev/core": "0.20.5", "earcut": "2.2.3" } }, "@bitbybit-dev/base": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.4.tgz", - "integrity": "sha512-yMsOkUFrm9JIGC3Bs49bu1I/gqwQNK8nVO3XgesOpzZvVQOF5OTxCheiQnrqiUw9DiiPuKw1T0gXBMwThzwdOw==" + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.5.tgz", + "integrity": "sha512-aFjGKgKO+DLq7b+EJ9I8u4Jlit8Xh/ahA5C/c/i3nafds5i5sFgUpD+MCZKMQEW9T7qqWCIselwBXQSeTsqJvA==" }, "@bitbybit-dev/core": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.4.tgz", - "integrity": "sha512-T2hOHzvI+ikNxQRvhDyk/TeMCBhjZPY+wLmRSbYHiWnNGP5+3GCesZyb672XfEwPIWRH2kBS4vyp9R9fRnJujQ==", - "requires": { - "@bitbybit-dev/base": "0.20.4", - "@bitbybit-dev/jscad-worker": "0.20.4", - "@bitbybit-dev/manifold-worker": "0.20.4", - "@bitbybit-dev/occt-worker": "0.20.4", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.5.tgz", + "integrity": "sha512-4uGVqzCbRmcQhbXMib99hqYoCVeR1nu98rM7fsd2p0KV7geqSvUtp8qUvwu6rroktJ04H50z91JuRG+Cy0jqOQ==", + "requires": { + "@bitbybit-dev/base": "0.20.5", + "@bitbybit-dev/jscad-worker": "0.20.5", + "@bitbybit-dev/manifold-worker": "0.20.5", + "@bitbybit-dev/occt-worker": "0.20.5", "jsonpath-plus": "10.1.0", "rxjs": "7.5.5", "verb-nurbs-web": "2.1.3" } }, "@bitbybit-dev/jscad": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.4.tgz", - "integrity": "sha512-e7/7Ag796rwn58H6Nu0lzhDkim+rJTqMWCqFZquNswoX2qqZXCv8azyOFE2LqfTvyIsEeJr/VEWIy2nvmtJnmg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.5.tgz", + "integrity": "sha512-h1SQLeMZTXwvXDt+dggoq4zNJoMKL4nfeyXkL6BVeu8gXarvPboEX1FkYatrenkFF5B0G5kBwd9B797t6VjFBA==", "requires": { - "@bitbybit-dev/base": "0.20.4", + "@bitbybit-dev/base": "0.20.5", "@jscad/3mf-serializer": "2.1.12", "@jscad/dxf-serializer": "2.1.18", "@jscad/io-utils": "2.0.28", @@ -19129,45 +19129,45 @@ } }, "@bitbybit-dev/jscad-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.4.tgz", - "integrity": "sha512-DsjL2YO6urR8B/8LKYRrk4q9hAJE8oB+e5m+LDDBXbl7Vl0CHdC5ogPm6w07RcAHdSbMJouf2Ow7nGP/oOcjEg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.5.tgz", + "integrity": "sha512-TtsyplH8d4KJz5izzhui1ZOeALYnHw40t5mCrjS62pKqr16glf1Ab4Y7Kqfj05eBQfBfTmD0wGZnXtoWBZM7Vw==", "requires": { - "@bitbybit-dev/jscad": "0.20.4", + "@bitbybit-dev/jscad": "0.20.5", "rxjs": "7.5.5" } }, "@bitbybit-dev/manifold": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.4.tgz", - "integrity": "sha512-rEGO8wOd/RUWPIRWdyE70w79JXhQ1iV6mACBuOH8/UD7+vf9wkk3KLWAYCzVPJP1nvx4+/SKCvU7e1JxEzq0Qw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.5.tgz", + "integrity": "sha512-m+jmRkuW4V5NlM5pITK/GH52GUzIYLUzTqdzTGZ+mOpfANH3jDUHAGyJJlrgqwApUXexuRX8GZ18Am5IcVRJdA==", "requires": { "manifold-3d": "3.0.0" } }, "@bitbybit-dev/manifold-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.4.tgz", - "integrity": "sha512-mwU87fg8M3p472dn/RiuveiPtq/IuOWCcoG0uismEE2g+rnciMrCSUSkXMkfXDCk9l0ZqoVfYg+dHVx0KBHBUg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.5.tgz", + "integrity": "sha512-d6KhxveoM+MoEVq/8ySmZcDU4ShzPmQzfvyRi8dXQ27SgrAQldNBtZtU0DCGx7Gbl9+6PyWrnG86e6AzvwANyg==", "requires": { - "@bitbybit-dev/manifold": "0.20.4", + "@bitbybit-dev/manifold": "0.20.5", "rxjs": "7.5.5" } }, "@bitbybit-dev/occt": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.4.tgz", - "integrity": "sha512-Lxx4wsToS3EIiS2L3KjUh6Jpgvxsyxbh2Jt4raWhIbD9PSy1zRfMww9K7xFlawSMgq12WN1a0lV8ydKs1f5/zw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.5.tgz", + "integrity": "sha512-PHVvROaXoTeolPI8R68tRyhEUqIDbhfB6foc/FxqL4IBjftCyYMPb2pMkYvWHbmCTZRF2/Wx+qZQB+Zd386LYA==", "requires": { - "@bitbybit-dev/base": "0.20.4" + "@bitbybit-dev/base": "0.20.5" } }, "@bitbybit-dev/occt-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.4.tgz", - "integrity": "sha512-R5fiGteBSitv89Pz3XVgs+Vv0c1uH477oihkw1EUWLDTa7ypiXOohpjlKYFd/qAy3QCe8GEF3jDT+TK3dsQ+FA==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.5.tgz", + "integrity": "sha512-3Rp4psUuXlLNv5EpL5INrR3HcOsqaztB7WRp+kUXP6mt0/Q+UzRDEDMfND5RUo9UN918m7D78vSZIcvwH3tIeg==", "requires": { - "@bitbybit-dev/occt": "0.20.4", + "@bitbybit-dev/occt": "0.20.5", "rxjs": "7.5.5" } }, @@ -21796,9 +21796,9 @@ } }, "babylonjs-gltf2interface": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.9.1.tgz", - "integrity": "sha512-7GjEcvwL+d/lJ058J7rYTM96reekIq/kjg6SkM7NG6+Krj7UM3HMeJkAhwj22dCBfOs2/RzjFSGleEhh5qjq5g==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.24.0.tgz", + "integrity": "sha512-X3CA16Nl/l2xfXyiKXOZGcCJxfIoUOcTjgavQ0NDX07Zc4r64aWriIDds6qvEQPPoutCG7ralQdB29YVL6rSLg==", "peer": true }, "balanced-match": { @@ -26838,9 +26838,9 @@ } }, "nan": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", - "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz", + "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==", "optional": true }, "nanoid": { diff --git a/examples/react/babylonjs/cup/package.json b/examples/react/babylonjs/cup/package.json index 9c0486b8..a44a34fe 100644 --- a/examples/react/babylonjs/cup/package.json +++ b/examples/react/babylonjs/cup/package.json @@ -4,7 +4,7 @@ "private": true, "homepage": "https://app-store.bitbybit.dev/cup", "dependencies": { - "@bitbybit-dev/babylonjs": "0.20.4", + "@bitbybit-dev/babylonjs": "0.20.5", "@emotion/react": "11.9.0", "@emotion/styled": "11.8.1", "web-ifc": "0.0.68", diff --git a/examples/react/babylonjs/laptop-holder/package-lock.json b/examples/react/babylonjs/laptop-holder/package-lock.json index 8390deac..18a893f1 100644 --- a/examples/react/babylonjs/laptop-holder/package-lock.json +++ b/examples/react/babylonjs/laptop-holder/package-lock.json @@ -8,7 +8,7 @@ "name": "laptop-holder", "version": "0.1.0", "dependencies": { - "@bitbybit-dev/babylonjs": "0.20.4", + "@bitbybit-dev/babylonjs": "0.20.5", "@emotion/react": "11.9.0", "@emotion/styled": "11.8.1", "@mui/icons-material": "5.6.2", @@ -1847,14 +1847,14 @@ } }, "node_modules/@babylonjs/core": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.9.1.tgz", - "integrity": "sha512-YJvsQgjEtBIKDJXCi+6rhPH5UJ46QbaMknO5fQGg8tT2PI5L6D+vfrhdZc1YNnzDrOmLkrkXF/Uy2CGdXFdT9Q==" + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.23.1.tgz", + "integrity": "sha512-ro126NE6PZMb+uvRZhWZEB9O1CTiQE0xk4immnDu17KUoYkqcrsl+nDK8z6q8X+I1yQIelfJuOd6L1iRocgZfw==" }, "node_modules/@babylonjs/gui": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.9.1.tgz", - "integrity": "sha512-kYxPJ8C3HlNYrsKn3fPXJhQ8/BFUxMksBSNKQD+AsduEFWsMSlViYPdcMFh3oGpXEFZsqefoBoQe9xwN9L7brw==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.23.1.tgz", + "integrity": "sha512-GnpmcoJ4G6bRl/k1WPHkTRXv7pctc77lFbgUiUGgIjDBEJP9PmxC4Gs3mL4urEwxe/ODcOLN2wPdrImCOxiOVQ==", "peerDependencies": { "@babylonjs/core": "^8.0.0" } @@ -1868,26 +1868,26 @@ } }, "node_modules/@babylonjs/loaders": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.9.1.tgz", - "integrity": "sha512-8UolyusbjHoVVD2nNrqMMNS0a6OIiGrxPyzs6LYqCRFuXKXNhnFIPYCNU3WEBeD5Uc3+UQXgSaQpZudtjflFMw==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.23.1.tgz", + "integrity": "sha512-7FJ7PRaQWW94Abvr7vqKN8jTL7hH0F3RuTlgCZno6vQsdMCf+9Q3dVE0zRA2pbGg8G+RS4V/tYhL5nbIlX/1xQ==", "peerDependencies": { "@babylonjs/core": "^8.0.0", "babylonjs-gltf2interface": "^8.0.0" } }, "node_modules/@babylonjs/materials": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.9.1.tgz", - "integrity": "sha512-/Ey/Kkb9JcqM1eJ7HpOcvMhCbE2CAPRJRBhTCe6jUQ08eG/nuOJHs5SRUBdP4X4DRxgDQWY0owFP2nLLWQKM6A==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.23.1.tgz", + "integrity": "sha512-X36+SXDA/81cQPfeg+gUAfcMm/FE/oVNR9NWIOaTo6oJEHNC/EQIuAME1qL3vrLUB/Yrb9CJPg2V76Lh2Pc5vQ==", "peerDependencies": { "@babylonjs/core": "^8.6.0" } }, "node_modules/@babylonjs/serializers": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.9.1.tgz", - "integrity": "sha512-iGsizPwkQp00PaBzZing+5/CBR/x2yCkGu7GsOx2uFfoutihtn8zy+u51rarE2O6TO2sNjxp/KxCMng48c8KWA==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.23.1.tgz", + "integrity": "sha512-vlSZoHmq7TIivk2dtpmhW6VpPRe6oa4t9c/03LAcEGnvE3SppGrpVhQHx0k1Zj3HM4ae2TUhLsi58Bf4ppZUUg==", "peerDependencies": { "@babylonjs/core": "^8.0.0", "babylonjs-gltf2interface": "^8.0.0" @@ -1899,45 +1899,45 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, "node_modules/@bitbybit-dev/babylonjs": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.4.tgz", - "integrity": "sha512-tn+1VYQgz+6c2i16HpkIgWnIIRdnUCQKFdA701QGcKB59zJ67rU7Y8TIVTSVgPwJ9mJLpg1Co3bCVYEAyGCYXw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.5.tgz", + "integrity": "sha512-y6YgJbRAkLfgVNvtuuZHqE0xcfrpVC296f44v9T0DVZg1HPL9t60rmpzhiSVd7Hc+xd5qnL7ttAQ4X0n1kMfEg==", "dependencies": { - "@babylonjs/core": "8.9.1", - "@babylonjs/gui": "8.9.1", + "@babylonjs/core": "8.23.1", + "@babylonjs/gui": "8.23.1", "@babylonjs/havok": "1.3.10", - "@babylonjs/loaders": "8.9.1", - "@babylonjs/materials": "8.9.1", - "@babylonjs/serializers": "8.9.1", - "@bitbybit-dev/core": "0.20.4", + "@babylonjs/loaders": "8.23.1", + "@babylonjs/materials": "8.23.1", + "@babylonjs/serializers": "8.23.1", + "@bitbybit-dev/core": "0.20.5", "earcut": "2.2.3" } }, "node_modules/@bitbybit-dev/base": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.4.tgz", - "integrity": "sha512-yMsOkUFrm9JIGC3Bs49bu1I/gqwQNK8nVO3XgesOpzZvVQOF5OTxCheiQnrqiUw9DiiPuKw1T0gXBMwThzwdOw==" + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.5.tgz", + "integrity": "sha512-aFjGKgKO+DLq7b+EJ9I8u4Jlit8Xh/ahA5C/c/i3nafds5i5sFgUpD+MCZKMQEW9T7qqWCIselwBXQSeTsqJvA==" }, "node_modules/@bitbybit-dev/core": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.4.tgz", - "integrity": "sha512-T2hOHzvI+ikNxQRvhDyk/TeMCBhjZPY+wLmRSbYHiWnNGP5+3GCesZyb672XfEwPIWRH2kBS4vyp9R9fRnJujQ==", - "dependencies": { - "@bitbybit-dev/base": "0.20.4", - "@bitbybit-dev/jscad-worker": "0.20.4", - "@bitbybit-dev/manifold-worker": "0.20.4", - "@bitbybit-dev/occt-worker": "0.20.4", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.5.tgz", + "integrity": "sha512-4uGVqzCbRmcQhbXMib99hqYoCVeR1nu98rM7fsd2p0KV7geqSvUtp8qUvwu6rroktJ04H50z91JuRG+Cy0jqOQ==", + "dependencies": { + "@bitbybit-dev/base": "0.20.5", + "@bitbybit-dev/jscad-worker": "0.20.5", + "@bitbybit-dev/manifold-worker": "0.20.5", + "@bitbybit-dev/occt-worker": "0.20.5", "jsonpath-plus": "10.1.0", "rxjs": "7.5.5", "verb-nurbs-web": "2.1.3" } }, "node_modules/@bitbybit-dev/jscad": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.4.tgz", - "integrity": "sha512-e7/7Ag796rwn58H6Nu0lzhDkim+rJTqMWCqFZquNswoX2qqZXCv8azyOFE2LqfTvyIsEeJr/VEWIy2nvmtJnmg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.5.tgz", + "integrity": "sha512-h1SQLeMZTXwvXDt+dggoq4zNJoMKL4nfeyXkL6BVeu8gXarvPboEX1FkYatrenkFF5B0G5kBwd9B797t6VjFBA==", "dependencies": { - "@bitbybit-dev/base": "0.20.4", + "@bitbybit-dev/base": "0.20.5", "@jscad/3mf-serializer": "2.1.12", "@jscad/dxf-serializer": "2.1.18", "@jscad/io-utils": "2.0.28", @@ -1946,45 +1946,45 @@ } }, "node_modules/@bitbybit-dev/jscad-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.4.tgz", - "integrity": "sha512-DsjL2YO6urR8B/8LKYRrk4q9hAJE8oB+e5m+LDDBXbl7Vl0CHdC5ogPm6w07RcAHdSbMJouf2Ow7nGP/oOcjEg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.5.tgz", + "integrity": "sha512-TtsyplH8d4KJz5izzhui1ZOeALYnHw40t5mCrjS62pKqr16glf1Ab4Y7Kqfj05eBQfBfTmD0wGZnXtoWBZM7Vw==", "dependencies": { - "@bitbybit-dev/jscad": "0.20.4", + "@bitbybit-dev/jscad": "0.20.5", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/manifold": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.4.tgz", - "integrity": "sha512-rEGO8wOd/RUWPIRWdyE70w79JXhQ1iV6mACBuOH8/UD7+vf9wkk3KLWAYCzVPJP1nvx4+/SKCvU7e1JxEzq0Qw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.5.tgz", + "integrity": "sha512-m+jmRkuW4V5NlM5pITK/GH52GUzIYLUzTqdzTGZ+mOpfANH3jDUHAGyJJlrgqwApUXexuRX8GZ18Am5IcVRJdA==", "dependencies": { "manifold-3d": "3.0.0" } }, "node_modules/@bitbybit-dev/manifold-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.4.tgz", - "integrity": "sha512-mwU87fg8M3p472dn/RiuveiPtq/IuOWCcoG0uismEE2g+rnciMrCSUSkXMkfXDCk9l0ZqoVfYg+dHVx0KBHBUg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.5.tgz", + "integrity": "sha512-d6KhxveoM+MoEVq/8ySmZcDU4ShzPmQzfvyRi8dXQ27SgrAQldNBtZtU0DCGx7Gbl9+6PyWrnG86e6AzvwANyg==", "dependencies": { - "@bitbybit-dev/manifold": "0.20.4", + "@bitbybit-dev/manifold": "0.20.5", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/occt": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.4.tgz", - "integrity": "sha512-Lxx4wsToS3EIiS2L3KjUh6Jpgvxsyxbh2Jt4raWhIbD9PSy1zRfMww9K7xFlawSMgq12WN1a0lV8ydKs1f5/zw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.5.tgz", + "integrity": "sha512-PHVvROaXoTeolPI8R68tRyhEUqIDbhfB6foc/FxqL4IBjftCyYMPb2pMkYvWHbmCTZRF2/Wx+qZQB+Zd386LYA==", "dependencies": { - "@bitbybit-dev/base": "0.20.4" + "@bitbybit-dev/base": "0.20.5" } }, "node_modules/@bitbybit-dev/occt-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.4.tgz", - "integrity": "sha512-R5fiGteBSitv89Pz3XVgs+Vv0c1uH477oihkw1EUWLDTa7ypiXOohpjlKYFd/qAy3QCe8GEF3jDT+TK3dsQ+FA==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.5.tgz", + "integrity": "sha512-3Rp4psUuXlLNv5EpL5INrR3HcOsqaztB7WRp+kUXP6mt0/Q+UzRDEDMfND5RUo9UN918m7D78vSZIcvwH3tIeg==", "dependencies": { - "@bitbybit-dev/occt": "0.20.4", + "@bitbybit-dev/occt": "0.20.5", "rxjs": "7.5.5" } }, @@ -5378,9 +5378,9 @@ } }, "node_modules/babylonjs-gltf2interface": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.9.1.tgz", - "integrity": "sha512-7GjEcvwL+d/lJ058J7rYTM96reekIq/kjg6SkM7NG6+Krj7UM3HMeJkAhwj22dCBfOs2/RzjFSGleEhh5qjq5g==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.24.0.tgz", + "integrity": "sha512-X3CA16Nl/l2xfXyiKXOZGcCJxfIoUOcTjgavQ0NDX07Zc4r64aWriIDds6qvEQPPoutCG7ralQdB29YVL6rSLg==", "peer": true }, "node_modules/balanced-match": { @@ -11863,9 +11863,9 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, "node_modules/nan": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", - "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz", + "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==", "optional": true }, "node_modules/nanoid": { @@ -18145,14 +18145,14 @@ } }, "@babylonjs/core": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.9.1.tgz", - "integrity": "sha512-YJvsQgjEtBIKDJXCi+6rhPH5UJ46QbaMknO5fQGg8tT2PI5L6D+vfrhdZc1YNnzDrOmLkrkXF/Uy2CGdXFdT9Q==" + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.23.1.tgz", + "integrity": "sha512-ro126NE6PZMb+uvRZhWZEB9O1CTiQE0xk4immnDu17KUoYkqcrsl+nDK8z6q8X+I1yQIelfJuOd6L1iRocgZfw==" }, "@babylonjs/gui": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.9.1.tgz", - "integrity": "sha512-kYxPJ8C3HlNYrsKn3fPXJhQ8/BFUxMksBSNKQD+AsduEFWsMSlViYPdcMFh3oGpXEFZsqefoBoQe9xwN9L7brw==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.23.1.tgz", + "integrity": "sha512-GnpmcoJ4G6bRl/k1WPHkTRXv7pctc77lFbgUiUGgIjDBEJP9PmxC4Gs3mL4urEwxe/ODcOLN2wPdrImCOxiOVQ==", "requires": {} }, "@babylonjs/havok": { @@ -18164,21 +18164,21 @@ } }, "@babylonjs/loaders": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.9.1.tgz", - "integrity": "sha512-8UolyusbjHoVVD2nNrqMMNS0a6OIiGrxPyzs6LYqCRFuXKXNhnFIPYCNU3WEBeD5Uc3+UQXgSaQpZudtjflFMw==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.23.1.tgz", + "integrity": "sha512-7FJ7PRaQWW94Abvr7vqKN8jTL7hH0F3RuTlgCZno6vQsdMCf+9Q3dVE0zRA2pbGg8G+RS4V/tYhL5nbIlX/1xQ==", "requires": {} }, "@babylonjs/materials": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.9.1.tgz", - "integrity": "sha512-/Ey/Kkb9JcqM1eJ7HpOcvMhCbE2CAPRJRBhTCe6jUQ08eG/nuOJHs5SRUBdP4X4DRxgDQWY0owFP2nLLWQKM6A==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.23.1.tgz", + "integrity": "sha512-X36+SXDA/81cQPfeg+gUAfcMm/FE/oVNR9NWIOaTo6oJEHNC/EQIuAME1qL3vrLUB/Yrb9CJPg2V76Lh2Pc5vQ==", "requires": {} }, "@babylonjs/serializers": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.9.1.tgz", - "integrity": "sha512-iGsizPwkQp00PaBzZing+5/CBR/x2yCkGu7GsOx2uFfoutihtn8zy+u51rarE2O6TO2sNjxp/KxCMng48c8KWA==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.23.1.tgz", + "integrity": "sha512-vlSZoHmq7TIivk2dtpmhW6VpPRe6oa4t9c/03LAcEGnvE3SppGrpVhQHx0k1Zj3HM4ae2TUhLsi58Bf4ppZUUg==", "requires": {} }, "@bcoe/v8-coverage": { @@ -18187,45 +18187,45 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, "@bitbybit-dev/babylonjs": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.4.tgz", - "integrity": "sha512-tn+1VYQgz+6c2i16HpkIgWnIIRdnUCQKFdA701QGcKB59zJ67rU7Y8TIVTSVgPwJ9mJLpg1Co3bCVYEAyGCYXw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.5.tgz", + "integrity": "sha512-y6YgJbRAkLfgVNvtuuZHqE0xcfrpVC296f44v9T0DVZg1HPL9t60rmpzhiSVd7Hc+xd5qnL7ttAQ4X0n1kMfEg==", "requires": { - "@babylonjs/core": "8.9.1", - "@babylonjs/gui": "8.9.1", + "@babylonjs/core": "8.23.1", + "@babylonjs/gui": "8.23.1", "@babylonjs/havok": "1.3.10", - "@babylonjs/loaders": "8.9.1", - "@babylonjs/materials": "8.9.1", - "@babylonjs/serializers": "8.9.1", - "@bitbybit-dev/core": "0.20.4", + "@babylonjs/loaders": "8.23.1", + "@babylonjs/materials": "8.23.1", + "@babylonjs/serializers": "8.23.1", + "@bitbybit-dev/core": "0.20.5", "earcut": "2.2.3" } }, "@bitbybit-dev/base": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.4.tgz", - "integrity": "sha512-yMsOkUFrm9JIGC3Bs49bu1I/gqwQNK8nVO3XgesOpzZvVQOF5OTxCheiQnrqiUw9DiiPuKw1T0gXBMwThzwdOw==" + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.5.tgz", + "integrity": "sha512-aFjGKgKO+DLq7b+EJ9I8u4Jlit8Xh/ahA5C/c/i3nafds5i5sFgUpD+MCZKMQEW9T7qqWCIselwBXQSeTsqJvA==" }, "@bitbybit-dev/core": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.4.tgz", - "integrity": "sha512-T2hOHzvI+ikNxQRvhDyk/TeMCBhjZPY+wLmRSbYHiWnNGP5+3GCesZyb672XfEwPIWRH2kBS4vyp9R9fRnJujQ==", - "requires": { - "@bitbybit-dev/base": "0.20.4", - "@bitbybit-dev/jscad-worker": "0.20.4", - "@bitbybit-dev/manifold-worker": "0.20.4", - "@bitbybit-dev/occt-worker": "0.20.4", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.5.tgz", + "integrity": "sha512-4uGVqzCbRmcQhbXMib99hqYoCVeR1nu98rM7fsd2p0KV7geqSvUtp8qUvwu6rroktJ04H50z91JuRG+Cy0jqOQ==", + "requires": { + "@bitbybit-dev/base": "0.20.5", + "@bitbybit-dev/jscad-worker": "0.20.5", + "@bitbybit-dev/manifold-worker": "0.20.5", + "@bitbybit-dev/occt-worker": "0.20.5", "jsonpath-plus": "10.1.0", "rxjs": "7.5.5", "verb-nurbs-web": "2.1.3" } }, "@bitbybit-dev/jscad": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.4.tgz", - "integrity": "sha512-e7/7Ag796rwn58H6Nu0lzhDkim+rJTqMWCqFZquNswoX2qqZXCv8azyOFE2LqfTvyIsEeJr/VEWIy2nvmtJnmg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.5.tgz", + "integrity": "sha512-h1SQLeMZTXwvXDt+dggoq4zNJoMKL4nfeyXkL6BVeu8gXarvPboEX1FkYatrenkFF5B0G5kBwd9B797t6VjFBA==", "requires": { - "@bitbybit-dev/base": "0.20.4", + "@bitbybit-dev/base": "0.20.5", "@jscad/3mf-serializer": "2.1.12", "@jscad/dxf-serializer": "2.1.18", "@jscad/io-utils": "2.0.28", @@ -18234,45 +18234,45 @@ } }, "@bitbybit-dev/jscad-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.4.tgz", - "integrity": "sha512-DsjL2YO6urR8B/8LKYRrk4q9hAJE8oB+e5m+LDDBXbl7Vl0CHdC5ogPm6w07RcAHdSbMJouf2Ow7nGP/oOcjEg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.5.tgz", + "integrity": "sha512-TtsyplH8d4KJz5izzhui1ZOeALYnHw40t5mCrjS62pKqr16glf1Ab4Y7Kqfj05eBQfBfTmD0wGZnXtoWBZM7Vw==", "requires": { - "@bitbybit-dev/jscad": "0.20.4", + "@bitbybit-dev/jscad": "0.20.5", "rxjs": "7.5.5" } }, "@bitbybit-dev/manifold": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.4.tgz", - "integrity": "sha512-rEGO8wOd/RUWPIRWdyE70w79JXhQ1iV6mACBuOH8/UD7+vf9wkk3KLWAYCzVPJP1nvx4+/SKCvU7e1JxEzq0Qw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.5.tgz", + "integrity": "sha512-m+jmRkuW4V5NlM5pITK/GH52GUzIYLUzTqdzTGZ+mOpfANH3jDUHAGyJJlrgqwApUXexuRX8GZ18Am5IcVRJdA==", "requires": { "manifold-3d": "3.0.0" } }, "@bitbybit-dev/manifold-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.4.tgz", - "integrity": "sha512-mwU87fg8M3p472dn/RiuveiPtq/IuOWCcoG0uismEE2g+rnciMrCSUSkXMkfXDCk9l0ZqoVfYg+dHVx0KBHBUg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.5.tgz", + "integrity": "sha512-d6KhxveoM+MoEVq/8ySmZcDU4ShzPmQzfvyRi8dXQ27SgrAQldNBtZtU0DCGx7Gbl9+6PyWrnG86e6AzvwANyg==", "requires": { - "@bitbybit-dev/manifold": "0.20.4", + "@bitbybit-dev/manifold": "0.20.5", "rxjs": "7.5.5" } }, "@bitbybit-dev/occt": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.4.tgz", - "integrity": "sha512-Lxx4wsToS3EIiS2L3KjUh6Jpgvxsyxbh2Jt4raWhIbD9PSy1zRfMww9K7xFlawSMgq12WN1a0lV8ydKs1f5/zw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.5.tgz", + "integrity": "sha512-PHVvROaXoTeolPI8R68tRyhEUqIDbhfB6foc/FxqL4IBjftCyYMPb2pMkYvWHbmCTZRF2/Wx+qZQB+Zd386LYA==", "requires": { - "@bitbybit-dev/base": "0.20.4" + "@bitbybit-dev/base": "0.20.5" } }, "@bitbybit-dev/occt-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.4.tgz", - "integrity": "sha512-R5fiGteBSitv89Pz3XVgs+Vv0c1uH477oihkw1EUWLDTa7ypiXOohpjlKYFd/qAy3QCe8GEF3jDT+TK3dsQ+FA==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.5.tgz", + "integrity": "sha512-3Rp4psUuXlLNv5EpL5INrR3HcOsqaztB7WRp+kUXP6mt0/Q+UzRDEDMfND5RUo9UN918m7D78vSZIcvwH3tIeg==", "requires": { - "@bitbybit-dev/occt": "0.20.4", + "@bitbybit-dev/occt": "0.20.5", "rxjs": "7.5.5" } }, @@ -20704,9 +20704,9 @@ } }, "babylonjs-gltf2interface": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.9.1.tgz", - "integrity": "sha512-7GjEcvwL+d/lJ058J7rYTM96reekIq/kjg6SkM7NG6+Krj7UM3HMeJkAhwj22dCBfOs2/RzjFSGleEhh5qjq5g==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.24.0.tgz", + "integrity": "sha512-X3CA16Nl/l2xfXyiKXOZGcCJxfIoUOcTjgavQ0NDX07Zc4r64aWriIDds6qvEQPPoutCG7ralQdB29YVL6rSLg==", "peer": true }, "balanced-match": { @@ -25413,9 +25413,9 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, "nan": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", - "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz", + "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==", "optional": true }, "nanoid": { diff --git a/examples/react/babylonjs/laptop-holder/package.json b/examples/react/babylonjs/laptop-holder/package.json index 750a5a30..e86a31a8 100644 --- a/examples/react/babylonjs/laptop-holder/package.json +++ b/examples/react/babylonjs/laptop-holder/package.json @@ -16,7 +16,7 @@ "react-scripts": "5.0.1", "typescript": "^4.6.2", "web-vitals": "^2.1.4", - "@bitbybit-dev/babylonjs": "0.20.4", + "@bitbybit-dev/babylonjs": "0.20.5", "file-loader": "6.2.0", "@mui/icons-material": "5.6.2", "@mui/material": "5.6.4", diff --git a/examples/react/threejs/vase/package-lock.json b/examples/react/threejs/vase/package-lock.json index 67315463..efbe37f8 100644 --- a/examples/react/threejs/vase/package-lock.json +++ b/examples/react/threejs/vase/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "@babel/plugin-proposal-private-property-in-object": "7.21.11", - "@bitbybit-dev/threejs": "0.20.4", + "@bitbybit-dev/threejs": "0.20.5", "@emotion/react": "11.11.0", "@emotion/styled": "11.11.0", "@mui/icons-material": "5.11.16", @@ -21,7 +21,7 @@ "@types/node": "20.2.5", "@types/react": "18.2.7", "@types/react-dom": "18.2.4", - "@types/three": "0.176.0", + "@types/three": "0.179.0", "react": "18.2.0", "react-app-rewired": "2.2.1", "react-dom": "18.2.0", @@ -1995,30 +1995,30 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, "node_modules/@bitbybit-dev/base": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.4.tgz", - "integrity": "sha512-yMsOkUFrm9JIGC3Bs49bu1I/gqwQNK8nVO3XgesOpzZvVQOF5OTxCheiQnrqiUw9DiiPuKw1T0gXBMwThzwdOw==" + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.5.tgz", + "integrity": "sha512-aFjGKgKO+DLq7b+EJ9I8u4Jlit8Xh/ahA5C/c/i3nafds5i5sFgUpD+MCZKMQEW9T7qqWCIselwBXQSeTsqJvA==" }, "node_modules/@bitbybit-dev/core": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.4.tgz", - "integrity": "sha512-T2hOHzvI+ikNxQRvhDyk/TeMCBhjZPY+wLmRSbYHiWnNGP5+3GCesZyb672XfEwPIWRH2kBS4vyp9R9fRnJujQ==", - "dependencies": { - "@bitbybit-dev/base": "0.20.4", - "@bitbybit-dev/jscad-worker": "0.20.4", - "@bitbybit-dev/manifold-worker": "0.20.4", - "@bitbybit-dev/occt-worker": "0.20.4", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.5.tgz", + "integrity": "sha512-4uGVqzCbRmcQhbXMib99hqYoCVeR1nu98rM7fsd2p0KV7geqSvUtp8qUvwu6rroktJ04H50z91JuRG+Cy0jqOQ==", + "dependencies": { + "@bitbybit-dev/base": "0.20.5", + "@bitbybit-dev/jscad-worker": "0.20.5", + "@bitbybit-dev/manifold-worker": "0.20.5", + "@bitbybit-dev/occt-worker": "0.20.5", "jsonpath-plus": "10.1.0", "rxjs": "7.5.5", "verb-nurbs-web": "2.1.3" } }, "node_modules/@bitbybit-dev/jscad": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.4.tgz", - "integrity": "sha512-e7/7Ag796rwn58H6Nu0lzhDkim+rJTqMWCqFZquNswoX2qqZXCv8azyOFE2LqfTvyIsEeJr/VEWIy2nvmtJnmg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.5.tgz", + "integrity": "sha512-h1SQLeMZTXwvXDt+dggoq4zNJoMKL4nfeyXkL6BVeu8gXarvPboEX1FkYatrenkFF5B0G5kBwd9B797t6VjFBA==", "dependencies": { - "@bitbybit-dev/base": "0.20.4", + "@bitbybit-dev/base": "0.20.5", "@jscad/3mf-serializer": "2.1.12", "@jscad/dxf-serializer": "2.1.18", "@jscad/io-utils": "2.0.28", @@ -2027,55 +2027,55 @@ } }, "node_modules/@bitbybit-dev/jscad-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.4.tgz", - "integrity": "sha512-DsjL2YO6urR8B/8LKYRrk4q9hAJE8oB+e5m+LDDBXbl7Vl0CHdC5ogPm6w07RcAHdSbMJouf2Ow7nGP/oOcjEg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.5.tgz", + "integrity": "sha512-TtsyplH8d4KJz5izzhui1ZOeALYnHw40t5mCrjS62pKqr16glf1Ab4Y7Kqfj05eBQfBfTmD0wGZnXtoWBZM7Vw==", "dependencies": { - "@bitbybit-dev/jscad": "0.20.4", + "@bitbybit-dev/jscad": "0.20.5", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/manifold": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.4.tgz", - "integrity": "sha512-rEGO8wOd/RUWPIRWdyE70w79JXhQ1iV6mACBuOH8/UD7+vf9wkk3KLWAYCzVPJP1nvx4+/SKCvU7e1JxEzq0Qw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.5.tgz", + "integrity": "sha512-m+jmRkuW4V5NlM5pITK/GH52GUzIYLUzTqdzTGZ+mOpfANH3jDUHAGyJJlrgqwApUXexuRX8GZ18Am5IcVRJdA==", "dependencies": { "manifold-3d": "3.0.0" } }, "node_modules/@bitbybit-dev/manifold-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.4.tgz", - "integrity": "sha512-mwU87fg8M3p472dn/RiuveiPtq/IuOWCcoG0uismEE2g+rnciMrCSUSkXMkfXDCk9l0ZqoVfYg+dHVx0KBHBUg==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.5.tgz", + "integrity": "sha512-d6KhxveoM+MoEVq/8ySmZcDU4ShzPmQzfvyRi8dXQ27SgrAQldNBtZtU0DCGx7Gbl9+6PyWrnG86e6AzvwANyg==", "dependencies": { - "@bitbybit-dev/manifold": "0.20.4", + "@bitbybit-dev/manifold": "0.20.5", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/occt": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.4.tgz", - "integrity": "sha512-Lxx4wsToS3EIiS2L3KjUh6Jpgvxsyxbh2Jt4raWhIbD9PSy1zRfMww9K7xFlawSMgq12WN1a0lV8ydKs1f5/zw==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.5.tgz", + "integrity": "sha512-PHVvROaXoTeolPI8R68tRyhEUqIDbhfB6foc/FxqL4IBjftCyYMPb2pMkYvWHbmCTZRF2/Wx+qZQB+Zd386LYA==", "dependencies": { - "@bitbybit-dev/base": "0.20.4" + "@bitbybit-dev/base": "0.20.5" } }, "node_modules/@bitbybit-dev/occt-worker": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.4.tgz", - "integrity": "sha512-R5fiGteBSitv89Pz3XVgs+Vv0c1uH477oihkw1EUWLDTa7ypiXOohpjlKYFd/qAy3QCe8GEF3jDT+TK3dsQ+FA==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.5.tgz", + "integrity": "sha512-3Rp4psUuXlLNv5EpL5INrR3HcOsqaztB7WRp+kUXP6mt0/Q+UzRDEDMfND5RUo9UN918m7D78vSZIcvwH3tIeg==", "dependencies": { - "@bitbybit-dev/occt": "0.20.4", + "@bitbybit-dev/occt": "0.20.5", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/threejs": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/threejs/-/threejs-0.20.4.tgz", - "integrity": "sha512-kGRZDQFCmN6qEWeR62bniTT+kMJTzheRA0l3AIUOFzgKX5ZMxeV0lUv6gZgLnKHOLniC+Aa1o7p2uLQjGjD2MA==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/threejs/-/threejs-0.20.5.tgz", + "integrity": "sha512-u18aj43s1V58sRHSV2XV2YdcmTGh3TQOzXntQYqLIM0+NH2Zk336SAZ3EWshgC22/ce3hNpNBh0gof53ipIgFQ==", "dependencies": { - "@bitbybit-dev/core": "0.20.4", - "three": "0.176.0" + "@bitbybit-dev/core": "0.20.5", + "three": "0.179.1" } }, "node_modules/@csstools/normalize.css": { @@ -4760,17 +4760,17 @@ } }, "node_modules/@types/three": { - "version": "0.176.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.176.0.tgz", - "integrity": "sha512-FwfPXxCqOtP7EdYMagCFePNKoG1AGBDUEVKtluv2BTVRpSt7b+X27xNsirPCTCqY1pGYsPUzaM3jgWP7dXSxlw==", + "version": "0.179.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.179.0.tgz", + "integrity": "sha512-VgbFG2Pgsm84BqdegZzr7w2aKbQxmgzIu4Dy7/75ygiD/0P68LKmp5ie08KMPNqGTQwIge8s6D1guZf1RnZE0A==", "dependencies": { - "@dimforge/rapier3d-compat": "^0.12.0", + "@dimforge/rapier3d-compat": "~0.12.0", "@tweenjs/tween.js": "~23.1.3", "@types/stats.js": "*", "@types/webxr": "*", "@webgpu/types": "*", "fflate": "~0.8.2", - "meshoptimizer": "~0.18.1" + "meshoptimizer": "~0.22.0" } }, "node_modules/@types/three/node_modules/fflate": { @@ -12727,9 +12727,9 @@ } }, "node_modules/meshoptimizer": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", - "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==" + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.22.0.tgz", + "integrity": "sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==" }, "node_modules/methods": { "version": "1.1.2", @@ -12887,9 +12887,9 @@ } }, "node_modules/nan": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", - "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz", + "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==", "optional": true }, "node_modules/nanoid": { @@ -17078,9 +17078,9 @@ } }, "node_modules/three": { - "version": "0.176.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.176.0.tgz", - "integrity": "sha512-PWRKYWQo23ojf9oZSlRGH8K09q7nRSWx6LY/HF/UUrMdYgN9i1e2OwJYHoQjwc6HF/4lvvYLC5YC1X8UJL2ZpA==" + "version": "0.179.1", + "resolved": "https://registry.npmjs.org/three/-/three-0.179.1.tgz", + "integrity": "sha512-5y/elSIQbrvKOISxpwXCR4sQqHtGiOI+MKLc3SsBdDXA2hz3Mdp3X59aUp8DyybMa34aeBwbFTpdoLJaUDEWSw==" }, "node_modules/throat": { "version": "6.0.2", diff --git a/examples/react/threejs/vase/package.json b/examples/react/threejs/vase/package.json index 5f91e1a4..12ddfdac 100644 --- a/examples/react/threejs/vase/package.json +++ b/examples/react/threejs/vase/package.json @@ -4,14 +4,14 @@ "private": true, "homepage": "https://app-store.bitbybit.dev/bitbybit-threejs", "dependencies": { - "@bitbybit-dev/threejs": "0.20.4", + "@bitbybit-dev/threejs": "0.20.5", "@testing-library/jest-dom": "5.16.5", "@testing-library/react": "14.0.0", "@testing-library/user-event": "14.4.3", "@types/jest": "29.5.1", "@types/node": "20.2.5", "@types/react": "18.2.7", - "@types/three": "0.179.1", + "@types/three": "0.179.0", "@types/react-dom": "18.2.4", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/examples/runner/babylon/full/inline-include/index.html b/examples/runner/babylon/full/inline-include/index.html index 14834d00..9d0a76dc 100644 --- a/examples/runner/babylon/full/inline-include/index.html +++ b/examples/runner/babylon/full/inline-include/index.html @@ -9,7 +9,7 @@ - +