From 07b6be610fb811cb8fc1f62ad00866118348b378 Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Wed, 19 Oct 2022 14:54:51 +0200 Subject: [PATCH 01/21] git commit -m "initial commit for examples layout" --- doc/source/conf.py | 2 +- doc/source/examples.rst | 6 +- doc/source/examples/README.rst | 8 +++ .../examples/{ => basic}/basic_usage.mystnb | 0 doc/source/examples/design/design.mystnb | 58 +++++++++++++++++++ doc/source/examples/sketch/sketch.mystnb | 0 6 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 doc/source/examples/README.rst rename doc/source/examples/{ => basic}/basic_usage.mystnb (100%) create mode 100644 doc/source/examples/design/design.mystnb create mode 100644 doc/source/examples/sketch/sketch.mystnb diff --git a/doc/source/conf.py b/doc/source/conf.py index c8d4334a83..dcf17e55d3 100755 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -120,7 +120,7 @@ ".mystnb": ["jupytext.reads", {"fmt": "mystnb"}], } nbsphinx_thumbnails = { - "examples/basic_usage": "_static/thumbnails/basic_usage.png", + "examples/basic/basic_usage": "_static/thumbnails/basic_usage.png", } typehints_defaults = "comma" diff --git a/doc/source/examples.rst b/doc/source/examples.rst index 6ff616eea9..59c919d992 100644 --- a/doc/source/examples.rst +++ b/doc/source/examples.rst @@ -3,6 +3,8 @@ Examples All examples are collected in this page. -.. nbgallery:: +.. toctree:: + :hidden: + :maxdepth: 3 - examples/basic_usage.mystnb + examples/README diff --git a/doc/source/examples/README.rst b/doc/source/examples/README.rst new file mode 100644 index 0000000000..3c5d49245c --- /dev/null +++ b/doc/source/examples/README.rst @@ -0,0 +1,8 @@ +Primitives examples +=================== +This secttion contains the basic examples. + +.. nbgallery:: + + basic/basic_usage.mystnb + design/design.mystnb \ No newline at end of file diff --git a/doc/source/examples/basic_usage.mystnb b/doc/source/examples/basic/basic_usage.mystnb similarity index 100% rename from doc/source/examples/basic_usage.mystnb rename to doc/source/examples/basic/basic_usage.mystnb diff --git a/doc/source/examples/design/design.mystnb b/doc/source/examples/design/design.mystnb new file mode 100644 index 0000000000..9e9b263541 --- /dev/null +++ b/doc/source/examples/design/design.mystnb @@ -0,0 +1,58 @@ +--- +jupytext: + text_representation: + extension: .mystnb + format_name: myst + format_version: 0.13 + jupytext_version: 1.14.1 +kernelspec: + display_name: Python 3 (ipykernel) + language: python + name: python3 +--- + +# Extruded rectangular plate + +The box is located in the center of the plate, with the default origin of a sketch plane (origin at (0,0,0)). +The outer plate is extruded with equal radius holes at four corners of the plate. +The projection is at the center of the face. The default projection depth is through the entire part. + ++++ +import the fundamental objects: + +```{code-cell} ipython3 +import numpy as np +from pint import Quantity + +from ansys.geometry.core import Modeler +from ansys.geometry.core.math import Plane, Point3D, Point2D +from ansys.geometry.core.misc import UNITS +from ansys.geometry.core.sketch import Sketch +``` + +## Defining a ``Sketch`` profile for the PCB + +```{code-cell} ipython3 +sketch = Sketch() +(sketch.segment(Point2D([-4, 5], unit=UNITS.m), Point2D([4, 5], unit=UNITS.m)) + .segment_to_point(Point2D([4, -5], unit=UNITS.m)) + .segment_to_point(Point2D([-4, -5], unit=UNITS.m)) + .segment_to_point(Point2D([-4, 5], unit=UNITS.m)) + .box(Point2D([0,0], unit=UNITS.m), Quantity(3, UNITS.m), Quantity(3, UNITS.m)) + .circle(Point2D([3, 4], unit=UNITS.m), Quantity(0.5, UNITS.m)) + .circle(Point2D([-3, -4], unit=UNITS.m), Quantity(0.5, UNITS.m)) + .circle(Point2D([-3, 4], unit=UNITS.m), Quantity(0.5, UNITS.m)) + .circle(Point2D([3, -4], unit=UNITS.m), Quantity(0.5, UNITS.m)) +) +``` + +```{code-cell} ipython3 +modeler = Modeler() +design = modeler.create_design("ExtrudedPlate") +layers= [] +layer_thickness = Quantity(2, UNITS.m) +for layer_index in range(4): + layers.append(design.extrude_sketch(f"PlateLayer_{layer_index}", sketch, layer_thickness)) +board_named_selection = design.create_named_selection("Full", bodies=layers) +design.plot(color = "gold") +``` \ No newline at end of file diff --git a/doc/source/examples/sketch/sketch.mystnb b/doc/source/examples/sketch/sketch.mystnb new file mode 100644 index 0000000000..e69de29bb2 From 0fdd87dc0aef37e80e040d65b21bcf00a57a209a Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Wed, 19 Oct 2022 17:23:43 +0200 Subject: [PATCH 02/21] Modify examples with proper doc strings --- doc/source/examples.rst | 19 +++++++++++++++---- doc/source/examples/README.rst | 8 -------- .../{design.mystnb => plate_with_hole.mystnb} | 13 ++++++++++--- doc/source/examples/sketch/sketch.mystnb | 0 4 files changed, 25 insertions(+), 15 deletions(-) delete mode 100644 doc/source/examples/README.rst rename doc/source/examples/design/{design.mystnb => plate_with_hole.mystnb} (82%) delete mode 100644 doc/source/examples/sketch/sketch.mystnb diff --git a/doc/source/examples.rst b/doc/source/examples.rst index 59c919d992..55f9c732ae 100644 --- a/doc/source/examples.rst +++ b/doc/source/examples.rst @@ -3,8 +3,19 @@ Examples All examples are collected in this page. -.. toctree:: - :hidden: - :maxdepth: 3 +Math and sketch examples +------------------------ +This section demonstrate using PyGeometry for math operations on geometric objects +and for creating basic geometry. + +.. nbgallery:: + + examples/basic/basic_usage.mystnb + +Service based examples +---------------------- + +.. nbgallery:: + + examples/design/plate_with_hole.mystnb - examples/README diff --git a/doc/source/examples/README.rst b/doc/source/examples/README.rst deleted file mode 100644 index 3c5d49245c..0000000000 --- a/doc/source/examples/README.rst +++ /dev/null @@ -1,8 +0,0 @@ -Primitives examples -=================== -This secttion contains the basic examples. - -.. nbgallery:: - - basic/basic_usage.mystnb - design/design.mystnb \ No newline at end of file diff --git a/doc/source/examples/design/design.mystnb b/doc/source/examples/design/plate_with_hole.mystnb similarity index 82% rename from doc/source/examples/design/design.mystnb rename to doc/source/examples/design/plate_with_hole.mystnb index 9e9b263541..6dafe41dd5 100644 --- a/doc/source/examples/design/design.mystnb +++ b/doc/source/examples/design/plate_with_hole.mystnb @@ -30,7 +30,10 @@ from ansys.geometry.core.misc import UNITS from ansys.geometry.core.sketch import Sketch ``` -## Defining a ``Sketch`` profile for the PCB +## Defining a ``Sketch`` profile for the proposed design + +The profile required 4 segment which constitute the body, a box on the center and +a circle at four corners. ```{code-cell} ipython3 sketch = Sketch() @@ -46,13 +49,17 @@ sketch = Sketch() ) ``` -```{code-cell} ipython3 +## Creating the design and plot + +Create a design with a name and extrude the four segments with desired thickness. + +```{code-cell} ipython3 modeler = Modeler() design = modeler.create_design("ExtrudedPlate") layers= [] layer_thickness = Quantity(2, UNITS.m) for layer_index in range(4): layers.append(design.extrude_sketch(f"PlateLayer_{layer_index}", sketch, layer_thickness)) -board_named_selection = design.create_named_selection("Full", bodies=layers) +board_named_selection = design.create_named_selection("Plate", bodies=layers) design.plot(color = "gold") ``` \ No newline at end of file diff --git a/doc/source/examples/sketch/sketch.mystnb b/doc/source/examples/sketch/sketch.mystnb deleted file mode 100644 index e69de29bb2..0000000000 From e45c502605ca861483539032051a2c9343b6d75a Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Thu, 20 Oct 2022 09:46:51 +0200 Subject: [PATCH 03/21] tesselation examples --- doc/source/examples.rst | 3 +- .../examples/design/tesselation_usage.mystnb | 48 +++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 doc/source/examples/design/tesselation_usage.mystnb diff --git a/doc/source/examples.rst b/doc/source/examples.rst index 55f9c732ae..7e9da1e790 100644 --- a/doc/source/examples.rst +++ b/doc/source/examples.rst @@ -17,5 +17,4 @@ Service based examples .. nbgallery:: - examples/design/plate_with_hole.mystnb - + examples/design/plate_with_hole.mystnb \ No newline at end of file diff --git a/doc/source/examples/design/tesselation_usage.mystnb b/doc/source/examples/design/tesselation_usage.mystnb new file mode 100644 index 0000000000..456621602c --- /dev/null +++ b/doc/source/examples/design/tesselation_usage.mystnb @@ -0,0 +1,48 @@ +--- +jupytext: + text_representation: + extension: .mystnb + format_name: myst + format_version: 0.13 + jupytext_version: 1.14.1 +kernelspec: + display_name: Python 3 (ipykernel) + language: python + name: python3 +--- + +# Tessellation of two bodies + +Create two stacked bodies and return the tessellation as two merged bodies. ++++ +import the fundamental objects: + +```{code-cell} ipython3 +from ansys.geometry.core.sketch import Sketch +from ansys.geometry.core import Modeler +from ansys.geometry.core.math import Point2D, Point3D, Plane +from ansys.geometry.core.misc import UNITS +from ansys.geometry.core.plotting.plotter import Plotter +``` + +## Creating the design + +```{code-cell} ipython3 +modeler = Modeler("10.54.0.72", "50051") +sketch_1 = Sketch() +box = sketch_1.box(Point3D([10, 10]), width=10, height=5) +circle = sketch_1.circle(Point3D([0, 0]), radius=25 * UNITS.m) +design = modeler.create_design("MyDesign") +comp = design.add_component("MyComponent") +body = comp.extrude_sketch("MyBody", sketch=sketch_1, distance=10 * UNITS.m) +sketch_2 = Sketch(Plane([0, 0, 10])) +box = sketch_2.box(Point2D([10, 10]), width=10, height=5) +circle = sketch_2.circle(Point2D([0, 0]), radius=25 * UNITS.m) +body = comp.extrude_sketch("MyBody", sketch=sketch_2, distance=10 * UNITS.m) +dataset = comp.tessellate(merge_bodies=True) +dataset +``` +## Plot the tessellation merged body +```{code-cell} ipython3 +dataset.plot() +``` \ No newline at end of file From 2ded5659c95292c2d2d505149767ec5b1c006070 Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Thu, 20 Oct 2022 09:58:51 +0200 Subject: [PATCH 04/21] Add docstrings for teseelation example --- doc/source/examples.rst | 2 +- .../{ => design}/dynamic_sketch_plane.mystnb | 0 .../examples/design/plate_with_hole.mystnb | 5 +++- .../examples/design/tesselation_usage.mystnb | 28 +++++++++++++------ 4 files changed, 24 insertions(+), 11 deletions(-) rename doc/source/examples/{ => design}/dynamic_sketch_plane.mystnb (100%) diff --git a/doc/source/examples.rst b/doc/source/examples.rst index 62694938ac..fdf059037a 100644 --- a/doc/source/examples.rst +++ b/doc/source/examples.rst @@ -18,4 +18,4 @@ Service based examples .. nbgallery:: examples/design/plate_with_hole.mystnb - examples/dynamic_sketch_plane.mystnb \ No newline at end of file + examples/design/dynamic_sketch_plane.mystnb \ No newline at end of file diff --git a/doc/source/examples/dynamic_sketch_plane.mystnb b/doc/source/examples/design/dynamic_sketch_plane.mystnb similarity index 100% rename from doc/source/examples/dynamic_sketch_plane.mystnb rename to doc/source/examples/design/dynamic_sketch_plane.mystnb diff --git a/doc/source/examples/design/plate_with_hole.mystnb b/doc/source/examples/design/plate_with_hole.mystnb index 6dafe41dd5..73d04ddbdc 100644 --- a/doc/source/examples/design/plate_with_hole.mystnb +++ b/doc/source/examples/design/plate_with_hole.mystnb @@ -51,7 +51,10 @@ sketch = Sketch() ## Creating the design and plot -Create a design with a name and extrude the four segments with desired thickness. +A server connection is established and the single sketch profile is used to extrude +the board profile at multiple Z-offsets. A named selection is then created from the +resulting list of layer bodies. +The design is going to extrude the four segments with desired thickness, resulting in four server calls. ```{code-cell} ipython3 modeler = Modeler() diff --git a/doc/source/examples/design/tesselation_usage.mystnb b/doc/source/examples/design/tesselation_usage.mystnb index 456621602c..7809db757d 100644 --- a/doc/source/examples/design/tesselation_usage.mystnb +++ b/doc/source/examples/design/tesselation_usage.mystnb @@ -30,19 +30,29 @@ from ansys.geometry.core.plotting.plotter import Plotter ```{code-cell} ipython3 modeler = Modeler("10.54.0.72", "50051") sketch_1 = Sketch() -box = sketch_1.box(Point3D([10, 10]), width=10, height=5) -circle = sketch_1.circle(Point3D([0, 0]), radius=25 * UNITS.m) -design = modeler.create_design("MyDesign") -comp = design.add_component("MyComponent") -body = comp.extrude_sketch("MyBody", sketch=sketch_1, distance=10 * UNITS.m) +box = sketch_1.box( + Point2D([10, 10], unit=UNITS.m), width=Quantity(10, UNITS.m), height=Quantity(5, UNITS.m) +) +circle = sketch_1.circle( + Point2D([0, 0], unit=UNITS.m), radius=Quantity(25, UNITS.m) +) +design = modeler.create_design("TessellationDesign") +comp = design.add_component("TessellationComponent") +body = comp.extrude_sketch("FirstBody", sketch=sketch_1, distance=10 * UNITS.m) + +# Create the second body in a plane with different origin. sketch_2 = Sketch(Plane([0, 0, 10])) -box = sketch_2.box(Point2D([10, 10]), width=10, height=5) -circle = sketch_2.circle(Point2D([0, 0]), radius=25 * UNITS.m) -body = comp.extrude_sketch("MyBody", sketch=sketch_2, distance=10 * UNITS.m) +box = sketch_2.box(Point2D( + [10, 10], unit=UNITS.m), width=Quantity(10, UNITS.m), height=Quantity(5, UNITS.m) +) +circle = sketch_2.circle( + Point2D([0, 10], unit=UNITS.m), radius=Quantity(25, UNITS.m) +) +body = comp.extrude_sketch("SecondBody", sketch=sketch_2, distance=10 * UNITS.m) dataset = comp.tessellate(merge_bodies=True) dataset ``` -## Plot the tessellation merged body +## Plot the tessellation as two merged bodies. ```{code-cell} ipython3 dataset.plot() ``` \ No newline at end of file From 4d7b0911c67d9813194cf63be8a89fad93812b59 Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Thu, 20 Oct 2022 10:40:33 +0200 Subject: [PATCH 05/21] reformat examples --- doc/source/examples/design/plate_with_hole.mystnb | 4 +++- doc/source/examples/design/tesselation_usage.mystnb | 10 ++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/doc/source/examples/design/plate_with_hole.mystnb b/doc/source/examples/design/plate_with_hole.mystnb index 73d04ddbdc..95e63cfadd 100644 --- a/doc/source/examples/design/plate_with_hole.mystnb +++ b/doc/source/examples/design/plate_with_hole.mystnb @@ -59,10 +59,12 @@ The design is going to extrude the four segments with desired thickness, resulti ```{code-cell} ipython3 modeler = Modeler() design = modeler.create_design("ExtrudedPlate") + layers= [] layer_thickness = Quantity(2, UNITS.m) for layer_index in range(4): layers.append(design.extrude_sketch(f"PlateLayer_{layer_index}", sketch, layer_thickness)) + board_named_selection = design.create_named_selection("Plate", bodies=layers) -design.plot(color = "gold") +design.plot() ``` \ No newline at end of file diff --git a/doc/source/examples/design/tesselation_usage.mystnb b/doc/source/examples/design/tesselation_usage.mystnb index 7809db757d..e7e2126319 100644 --- a/doc/source/examples/design/tesselation_usage.mystnb +++ b/doc/source/examples/design/tesselation_usage.mystnb @@ -17,7 +17,9 @@ Create two stacked bodies and return the tessellation as two merged bodies. +++ import the fundamental objects: -```{code-cell} ipython3 +```{code-cell} ipython3 +from pint import Quantity + from ansys.geometry.core.sketch import Sketch from ansys.geometry.core import Modeler from ansys.geometry.core.math import Point2D, Point3D, Plane @@ -28,7 +30,8 @@ from ansys.geometry.core.plotting.plotter import Plotter ## Creating the design ```{code-cell} ipython3 -modeler = Modeler("10.54.0.72", "50051") +modeler = Modeler() + sketch_1 = Sketch() box = sketch_1.box( Point2D([10, 10], unit=UNITS.m), width=Quantity(10, UNITS.m), height=Quantity(5, UNITS.m) @@ -36,6 +39,7 @@ box = sketch_1.box( circle = sketch_1.circle( Point2D([0, 0], unit=UNITS.m), radius=Quantity(25, UNITS.m) ) + design = modeler.create_design("TessellationDesign") comp = design.add_component("TessellationComponent") body = comp.extrude_sketch("FirstBody", sketch=sketch_1, distance=10 * UNITS.m) @@ -48,8 +52,10 @@ box = sketch_2.box(Point2D( circle = sketch_2.circle( Point2D([0, 10], unit=UNITS.m), radius=Quantity(25, UNITS.m) ) + body = comp.extrude_sketch("SecondBody", sketch=sketch_2, distance=10 * UNITS.m) dataset = comp.tessellate(merge_bodies=True) + dataset ``` ## Plot the tessellation as two merged bodies. From 983efa08ac3ce09486b4c04473fba7095879aca3 Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Thu, 20 Oct 2022 10:41:05 +0200 Subject: [PATCH 06/21] add new example in toc-tree --- doc/source/examples.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/source/examples.rst b/doc/source/examples.rst index fdf059037a..ab7ea3495a 100644 --- a/doc/source/examples.rst +++ b/doc/source/examples.rst @@ -18,4 +18,5 @@ Service based examples .. nbgallery:: examples/design/plate_with_hole.mystnb - examples/design/dynamic_sketch_plane.mystnb \ No newline at end of file + examples/design/dynamic_sketch_plane.mystnb + examples/design/tesselation_usage.mystnb \ No newline at end of file From a6fbed965e3ab3a98199dfff7213253cbd7d4e98 Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Thu, 20 Oct 2022 11:46:03 +0200 Subject: [PATCH 07/21] add basic example of single body --- doc/source/examples.rst | 7 +- .../design/add_design_material.mystnb | 74 +++++++++++++++++++ .../examples/design/plate_with_hole.mystnb | 9 ++- .../examples/design/tesselation_usage.mystnb | 5 +- 4 files changed, 88 insertions(+), 7 deletions(-) create mode 100644 doc/source/examples/design/add_design_material.mystnb diff --git a/doc/source/examples.rst b/doc/source/examples.rst index ab7ea3495a..d898ab7bfb 100644 --- a/doc/source/examples.rst +++ b/doc/source/examples.rst @@ -5,8 +5,8 @@ All examples are collected in this page. Math and sketch examples ------------------------ -This section demonstrate using PyGeometry for math operations on geometric objects -and for creating basic geometry. +This section demonstrates the math operations on geometric objects +and sketching basic sketch objects in PyGeometry. .. nbgallery:: @@ -15,8 +15,11 @@ and for creating basic geometry. Service based examples ---------------------- +This section demonstrates service based operations on PyGeometry. + .. nbgallery:: + examples/design/add_design_material.mystnb examples/design/plate_with_hole.mystnb examples/design/dynamic_sketch_plane.mystnb examples/design/tesselation_usage.mystnb \ No newline at end of file diff --git a/doc/source/examples/design/add_design_material.mystnb b/doc/source/examples/design/add_design_material.mystnb new file mode 100644 index 0000000000..8bec36f194 --- /dev/null +++ b/doc/source/examples/design/add_design_material.mystnb @@ -0,0 +1,74 @@ +--- +jupytext: + text_representation: + extension: .mystnb + format_name: myst + format_version: 0.13 + jupytext_version: 1.14.1 +kernelspec: + display_name: Python 3 (ipykernel) + language: python + name: python3 +--- +# Single body with material assignment + +In PyGeometry ``body`` represents solids and surfaces organized within the design assembly. +The current state of ``sketch``, which is a client side execution cab be used for the operations of +the geometric design assembly. Geometric Service also provides data structure to create individual materials +and its properties. + +This example demonstrate how to create a single body from the extruded sketch and how to assign material to it. + +```{code-cell} ipython3 +from pint import Quantity + +from ansys.geometry.core import Modeler +from ansys.geometry.core.materials import Material, MaterialProperty, MaterialPropertyType +from ansys.geometry.core.math import UNITVECTOR3D_Z, Frame, Plane, Point2D, Point3D, UnitVector3D +from ansys.geometry.core.misc import UNITS +from ansys.geometry.core.sketch import Sketch +``` +## Defining the ``Sketch``. + +Create a basic ``circle`` sketch instance with radius 10mm in default plane. + +```{code-cell} ipython3 +sketch = Sketch() +sketch.circle(Point2D([10, 10], UNITS.mm), Quantity(10, UNITS.mm)) +``` + +## Initiate the design in server. +A server connection is established and a design has been initiated. +```{code-cell} ipython3 +modeler = Modeler() +design_name = "ExtrudeProfile" +design = modeler.create_design(design_name) +``` + +## Add materials to the design. +Adding materials and its property to the design. +```{code-cell} ipython3 +density = Quantity(125, 10 * UNITS.kg / (UNITS.m * UNITS.m * UNITS.m)) +poisson_ratio = Quantity(0.33, UNITS.dimensionless) +tensile_strength = Quantity(45) +material = Material( + "steel", + density, + [MaterialProperty(MaterialPropertyType.POISSON_RATIO, "PoissonRatio", poisson_ratio)], +) +material.add_property(MaterialPropertyType.TENSILE_STRENGTH, "TensileProp", Quantity(45)) +design.add_material(material) +``` +## extrude the body from single sketch. + +Extrude the sketch to create body and add material to the body. + +```{code-cell} ipython3 +# Extrude the sketch to create a Body +body = design.extrude_sketch("SingleBody", sketch, Quantity(10, UNITS.mm)) + +# Assign a material to a Body +body.assign_material(material) + +body.plot() +``` \ No newline at end of file diff --git a/doc/source/examples/design/plate_with_hole.mystnb b/doc/source/examples/design/plate_with_hole.mystnb index 95e63cfadd..c9058577c1 100644 --- a/doc/source/examples/design/plate_with_hole.mystnb +++ b/doc/source/examples/design/plate_with_hole.mystnb @@ -11,8 +11,9 @@ kernelspec: name: python3 --- -# Extruded rectangular plate +# Extruded rectangular plate with multiple bodies +Multiple bodies can be created from a single sketch by extruding the same sketch by layers. The box is located in the center of the plate, with the default origin of a sketch plane (origin at (0,0,0)). The outer plate is extruded with equal radius holes at four corners of the plate. The projection is at the center of the face. The default projection depth is through the entire part. @@ -32,8 +33,10 @@ from ansys.geometry.core.sketch import Sketch ## Defining a ``Sketch`` profile for the proposed design -The profile required 4 segment which constitute the body, a box on the center and -a circle at four corners. +The profile required four ``Segment`` which constitute the outer body of the design, a `Box`` on the center and +a ``Circle`` at four corners. + +A single sketch instance can be used for multiple design operations. ```{code-cell} ipython3 sketch = Sketch() diff --git a/doc/source/examples/design/tesselation_usage.mystnb b/doc/source/examples/design/tesselation_usage.mystnb index e7e2126319..d8f135e7a9 100644 --- a/doc/source/examples/design/tesselation_usage.mystnb +++ b/doc/source/examples/design/tesselation_usage.mystnb @@ -14,6 +14,7 @@ kernelspec: # Tessellation of two bodies Create two stacked bodies and return the tessellation as two merged bodies. + +++ import the fundamental objects: @@ -55,10 +56,10 @@ circle = sketch_2.circle( body = comp.extrude_sketch("SecondBody", sketch=sketch_2, distance=10 * UNITS.m) dataset = comp.tessellate(merge_bodies=True) - dataset ``` + ## Plot the tessellation as two merged bodies. ```{code-cell} ipython3 -dataset.plot() +comp.plot(merge_bodies=True) ``` \ No newline at end of file From 70fd32920adb07166b85d82eabcb94d7d6443249 Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Thu, 20 Oct 2022 11:57:11 +0200 Subject: [PATCH 08/21] Add thumb nails --- .../thumbnails/add_design_material.PNG | Bin 0 -> 9290 bytes .../thumbnails/dynamic_sketch_plane.png | Bin 15448 -> 6500 bytes .../_static/thumbnails/plate_with_hole.PNG | Bin 0 -> 11181 bytes .../_static/thumbnails/tessellation_usage.PNG | Bin 0 -> 12909 bytes doc/source/conf.py | 3 +++ doc/source/examples.rst | 2 +- ...usage.mystnb => tessellation_usage.mystnb} | 0 7 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 doc/source/_static/thumbnails/add_design_material.PNG create mode 100644 doc/source/_static/thumbnails/plate_with_hole.PNG create mode 100644 doc/source/_static/thumbnails/tessellation_usage.PNG rename doc/source/examples/design/{tesselation_usage.mystnb => tessellation_usage.mystnb} (100%) diff --git a/doc/source/_static/thumbnails/add_design_material.PNG b/doc/source/_static/thumbnails/add_design_material.PNG new file mode 100644 index 0000000000000000000000000000000000000000..db25f560bb74e56f96fa7fde2a67ef6d88b1ce3e GIT binary patch literal 9290 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 i5&wTGdQ`EIu>LdPy8SHISLp6 literal 15448 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 A>;M1& diff --git a/doc/source/_static/thumbnails/plate_with_hole.PNG b/doc/source/_static/thumbnails/plate_with_hole.PNG new file mode 100644 index 0000000000000000000000000000000000000000..987943826a765260d9559dfc0e69d290aecea9ca GIT binary patch literal 11181 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 HW#In-u7SZr literal 0 HcmV?d00001 diff --git a/doc/source/_static/thumbnails/tessellation_usage.PNG b/doc/source/_static/thumbnails/tessellation_usage.PNG new file mode 100644 index 0000000000000000000000000000000000000000..106108aae2b8a79a9e753287ecf2841c9916b5f1 GIT binary patch literal 12909 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%0DrH=^53B^myJ1mm55$EjzH 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 literal 0 HcmV?d00001 diff --git a/doc/source/conf.py b/doc/source/conf.py index 346b1580c9..1bb00785dc 100755 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -122,6 +122,9 @@ nbsphinx_thumbnails = { "examples/basic/basic_usage": "_static/thumbnails/basic_usage.png", "examples/design/dynamic_sketch_plane": "_static/thumbnails/dynamic_sketch_plane.png", + "examples/design/add_design_material": "_static/thumbnails/add_design_material.png", + "examples/design/plate_with_hole": "_static/thumbnails/plate_with_hole.png", + "examples/design/tessellation_usage": "_static/thumbnails/tessellation_usage.png", } typehints_defaults = "comma" diff --git a/doc/source/examples.rst b/doc/source/examples.rst index d898ab7bfb..84a500b1d7 100644 --- a/doc/source/examples.rst +++ b/doc/source/examples.rst @@ -22,4 +22,4 @@ This section demonstrates service based operations on PyGeometry. examples/design/add_design_material.mystnb examples/design/plate_with_hole.mystnb examples/design/dynamic_sketch_plane.mystnb - examples/design/tesselation_usage.mystnb \ No newline at end of file + examples/design/tessellation_usage.mystnb \ No newline at end of file diff --git a/doc/source/examples/design/tesselation_usage.mystnb b/doc/source/examples/design/tessellation_usage.mystnb similarity index 100% rename from doc/source/examples/design/tesselation_usage.mystnb rename to doc/source/examples/design/tessellation_usage.mystnb From 6a32039fc151b6f64995a04c0bf5b56f6bdfdc6b Mon Sep 17 00:00:00 2001 From: Revathy Venugopal <104772255+Revathyvenugopal162@users.noreply.github.com> Date: Thu, 20 Oct 2022 13:25:38 +0200 Subject: [PATCH 09/21] Apply suggestions from code review Co-authored-by: Roberto Pastor Muela --- doc/source/examples.rst | 2 +- .../examples/design/add_design_material.mystnb | 12 +++++++----- doc/source/examples/design/plate_with_hole.mystnb | 11 ++++++----- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/doc/source/examples.rst b/doc/source/examples.rst index 84a500b1d7..716c31131f 100644 --- a/doc/source/examples.rst +++ b/doc/source/examples.rst @@ -6,7 +6,7 @@ All examples are collected in this page. Math and sketch examples ------------------------ This section demonstrates the math operations on geometric objects -and sketching basic sketch objects in PyGeometry. +and basic sketching capabilities in PyGeometry. .. nbgallery:: diff --git a/doc/source/examples/design/add_design_material.mystnb b/doc/source/examples/design/add_design_material.mystnb index 8bec36f194..ec6dcebf9e 100644 --- a/doc/source/examples/design/add_design_material.mystnb +++ b/doc/source/examples/design/add_design_material.mystnb @@ -12,7 +12,7 @@ kernelspec: --- # Single body with material assignment -In PyGeometry ``body`` represents solids and surfaces organized within the design assembly. +In PyGeometry, a ``Body`` represents solids or surfaces organized within the ``Design`` assembly. The current state of ``sketch``, which is a client side execution cab be used for the operations of the geometric design assembly. Geometric Service also provides data structure to create individual materials and its properties. @@ -30,14 +30,15 @@ from ansys.geometry.core.sketch import Sketch ``` ## Defining the ``Sketch``. -Create a basic ``circle`` sketch instance with radius 10mm in default plane. +Create a basic ``circle`` sketch instance with radius 10mm in the default plane. ```{code-cell} ipython3 sketch = Sketch() sketch.circle(Point2D([10, 10], UNITS.mm), Quantity(10, UNITS.mm)) ``` -## Initiate the design in server. +## Initiate the design in the server. + A server connection is established and a design has been initiated. ```{code-cell} ipython3 modeler = Modeler() @@ -46,6 +47,7 @@ design = modeler.create_design(design_name) ``` ## Add materials to the design. + Adding materials and its property to the design. ```{code-cell} ipython3 density = Quantity(125, 10 * UNITS.kg / (UNITS.m * UNITS.m * UNITS.m)) @@ -59,9 +61,9 @@ material = Material( material.add_property(MaterialPropertyType.TENSILE_STRENGTH, "TensileProp", Quantity(45)) design.add_material(material) ``` -## extrude the body from single sketch. +## Extrude the body from the sketch. -Extrude the sketch to create body and add material to the body. +Extrude the sketch to create the body and assign a material to it. ```{code-cell} ipython3 # Extrude the sketch to create a Body diff --git a/doc/source/examples/design/plate_with_hole.mystnb b/doc/source/examples/design/plate_with_hole.mystnb index c9058577c1..1bd76ee39e 100644 --- a/doc/source/examples/design/plate_with_hole.mystnb +++ b/doc/source/examples/design/plate_with_hole.mystnb @@ -13,13 +13,14 @@ kernelspec: # Extruded rectangular plate with multiple bodies -Multiple bodies can be created from a single sketch by extruding the same sketch by layers. -The box is located in the center of the plate, with the default origin of a sketch plane (origin at (0,0,0)). -The outer plate is extruded with equal radius holes at four corners of the plate. +Multiple bodies can be created from a single sketch by extruding the same sketch in different planes. +In this example, a box is located in the center of the plate, with the default origin of a sketch plane (origin at (0,0,0)). +Four holes of equal radius are sketched at the corners of the plate. +The plate is then extruded, leading to the generation of the requested body. The projection is at the center of the face. The default projection depth is through the entire part. +++ -import the fundamental objects: +First, let us import the fundamental objects: ```{code-cell} ipython3 import numpy as np @@ -33,7 +34,7 @@ from ansys.geometry.core.sketch import Sketch ## Defining a ``Sketch`` profile for the proposed design -The profile required four ``Segment`` which constitute the outer body of the design, a `Box`` on the center and +The profile requires four ``Segments`` which constitute the outer limits of the design, a ``Box`` on the center and a ``Circle`` at four corners. A single sketch instance can be used for multiple design operations. From fce2f0609540c80fd39348adee9c172a682c6fb5 Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Thu, 20 Oct 2022 14:49:27 +0200 Subject: [PATCH 10/21] Add examples for planar surface and extruding face --- .../design/add_design_material.mystnb | 8 +-- .../examples/design/plate_with_hole.mystnb | 58 +++++++++++++++++-- .../examples/design/tessellation_usage.mystnb | 4 +- 3 files changed, 58 insertions(+), 12 deletions(-) diff --git a/doc/source/examples/design/add_design_material.mystnb b/doc/source/examples/design/add_design_material.mystnb index ec6dcebf9e..d723d2c06c 100644 --- a/doc/source/examples/design/add_design_material.mystnb +++ b/doc/source/examples/design/add_design_material.mystnb @@ -28,7 +28,7 @@ from ansys.geometry.core.math import UNITVECTOR3D_Z, Frame, Plane, Point2D, Poin from ansys.geometry.core.misc import UNITS from ansys.geometry.core.sketch import Sketch ``` -## Defining the ``Sketch``. +## Defining the ``Sketch`` Create a basic ``circle`` sketch instance with radius 10mm in the default plane. @@ -37,7 +37,7 @@ sketch = Sketch() sketch.circle(Point2D([10, 10], UNITS.mm), Quantity(10, UNITS.mm)) ``` -## Initiate the design in the server. +## Initiate the design in the server A server connection is established and a design has been initiated. ```{code-cell} ipython3 @@ -46,7 +46,7 @@ design_name = "ExtrudeProfile" design = modeler.create_design(design_name) ``` -## Add materials to the design. +## Add materials to the design Adding materials and its property to the design. ```{code-cell} ipython3 @@ -61,7 +61,7 @@ material = Material( material.add_property(MaterialPropertyType.TENSILE_STRENGTH, "TensileProp", Quantity(45)) design.add_material(material) ``` -## Extrude the body from the sketch. +## Extrude the body from the sketch Extrude the sketch to create the body and assign a material to it. diff --git a/doc/source/examples/design/plate_with_hole.mystnb b/doc/source/examples/design/plate_with_hole.mystnb index 1bd76ee39e..7cf7a52f4a 100644 --- a/doc/source/examples/design/plate_with_hole.mystnb +++ b/doc/source/examples/design/plate_with_hole.mystnb @@ -27,17 +27,18 @@ import numpy as np from pint import Quantity from ansys.geometry.core import Modeler -from ansys.geometry.core.math import Plane, Point3D, Point2D +from ansys.geometry.core.math import Plane, Point3D, Point2D, UnitVector3D from ansys.geometry.core.misc import UNITS from ansys.geometry.core.sketch import Sketch ``` ## Defining a ``Sketch`` profile for the proposed design -The profile requires four ``Segments`` which constitute the outer limits of the design, a ``Box`` on the center and -a ``Circle`` at four corners. +The profile requires four ``Segments`` which constitute the outer limits of the design, +a ``Box`` on the center and a ``Circle`` at four corners. -A single sketch instance can be used for multiple design operations. +A single sketch instance can be used for multiple design operations such as extruding a body, +projecting a profile, or imprinting curves. ```{code-cell} ipython3 sketch = Sketch() @@ -53,7 +54,7 @@ sketch = Sketch() ) ``` -## Creating the design and plot +## Creating the design by extruding sketch A server connection is established and the single sketch profile is used to extrude the board profile at multiple Z-offsets. A named selection is then created from the @@ -71,4 +72,49 @@ for layer_index in range(4): board_named_selection = design.create_named_selection("Plate", bodies=layers) design.plot() -``` \ No newline at end of file +``` + +## Add new component with planar surface + +We have created plate as base component and Let's add a new component with a planar surface to it. +For that, create an instance ``sketch``, create surface in the design with that sketch. +For the sketch, we are creating an ellipse keeping the origin of the plane as center. + +```{code-cell} ipython3 +# Add components to the design +planar_component = design.add_component("PlanarComponent") + +# Initiate ``Sketch`` to create the planar surface. +planar_sketch = Sketch() +planar_sketch.ellipse( + Point2D([0, 0], UNITS.m), Quantity(1, UNITS.m), Quantity(0.5, UNITS.m) + ) + +planar_body = planar_component.create_surface("PlanarComponentSurface", planar_sketch) + +comp_str = repr(planar_component) +design.plot() +``` + +## Extrude from face to create body + +It is possible to extrude the face profile by the given distance to create a new solid body. +There are no modifications against the body containing the source face. + +```{code-cell} ipython3 +longer_body = design.extrude_face( + "LongerEllipseFace", planar_body.faces[0], Quantity(5, UNITS.m) + ) +design.plot() +``` +## Translate the body with in the plane + +By using the translate method, we can move the body to direction specified by the given distance. +It is also possible to move a sketch around the global coordinate system. see example +[Dynamic Sketch Plane](dynamic_sketch_plane.mystnb). + +```{code-cell} ipython3 +longer_body.translate(UnitVector3D([1, 0, 0]), Quantity(4, UNITS.m)) +design.plot() +``` + diff --git a/doc/source/examples/design/tessellation_usage.mystnb b/doc/source/examples/design/tessellation_usage.mystnb index d8f135e7a9..545ecbbb4e 100644 --- a/doc/source/examples/design/tessellation_usage.mystnb +++ b/doc/source/examples/design/tessellation_usage.mystnb @@ -45,7 +45,7 @@ design = modeler.create_design("TessellationDesign") comp = design.add_component("TessellationComponent") body = comp.extrude_sketch("FirstBody", sketch=sketch_1, distance=10 * UNITS.m) -# Create the second body in a plane with different origin. +# Create the second body in a plane with different origin sketch_2 = Sketch(Plane([0, 0, 10])) box = sketch_2.box(Point2D( [10, 10], unit=UNITS.m), width=Quantity(10, UNITS.m), height=Quantity(5, UNITS.m) @@ -59,7 +59,7 @@ dataset = comp.tessellate(merge_bodies=True) dataset ``` -## Plot the tessellation as two merged bodies. +## Plot the tessellation as two merged bodies ```{code-cell} ipython3 comp.plot(merge_bodies=True) ``` \ No newline at end of file From 8582905ec9ae3c6889ea66afcb31e140fcd732ad Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Thu, 20 Oct 2022 15:45:31 +0200 Subject: [PATCH 11/21] Add tesselate bodies to examples --- .../examples/design/plate_with_hole.mystnb | 6 ++- .../examples/design/tessellation_usage.mystnb | 46 ++++++++++++++++--- 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/doc/source/examples/design/plate_with_hole.mystnb b/doc/source/examples/design/plate_with_hole.mystnb index 7cf7a52f4a..4fadb2b1f7 100644 --- a/doc/source/examples/design/plate_with_hole.mystnb +++ b/doc/source/examples/design/plate_with_hole.mystnb @@ -13,7 +13,11 @@ kernelspec: # Extruded rectangular plate with multiple bodies -Multiple bodies can be created from a single sketch by extruding the same sketch in different planes. +Multiple bodies can be created from a single sketch by extruding the same sketch in different planes. + +The sketch is designed as an effective fluent-style API with all operations receiving 2D configurations. +to know more about the fluent API, see [Fluent based API in Sketch](../../user_guide/shapes.rst) + In this example, a box is located in the center of the plate, with the default origin of a sketch plane (origin at (0,0,0)). Four holes of equal radius are sketched at the corners of the plate. The plate is then extruded, leading to the generation of the requested body. diff --git a/doc/source/examples/design/tessellation_usage.mystnb b/doc/source/examples/design/tessellation_usage.mystnb index 545ecbbb4e..d256849d9f 100644 --- a/doc/source/examples/design/tessellation_usage.mystnb +++ b/doc/source/examples/design/tessellation_usage.mystnb @@ -16,7 +16,7 @@ kernelspec: Create two stacked bodies and return the tessellation as two merged bodies. +++ -import the fundamental objects: +Let's first import the fundamental objects: ```{code-cell} ipython3 from pint import Quantity @@ -30,7 +30,16 @@ from ansys.geometry.core.plotting.plotter import Plotter ## Creating the design -```{code-cell} ipython3 +Create the basic sketches to be tessellate, and extrude the sketch in required plane. +[Extruded rectangular plate with multiple bodies](plate_with_hole.mystnb) +contains the working example of creating component and extruding sketch in a design. + +Here is a typical situation where two bodies of different sketch plane +and merge each body into a single dataset. +This effectively combines all the faces of each individual +body into a single dataset without separating faces. + +```{code-cell} ipython3 modeler = Modeler() sketch_1 = Sketch() @@ -43,7 +52,7 @@ circle = sketch_1.circle( design = modeler.create_design("TessellationDesign") comp = design.add_component("TessellationComponent") -body = comp.extrude_sketch("FirstBody", sketch=sketch_1, distance=10 * UNITS.m) +body = comp.extrude_sketch("Body", sketch=sketch_1, distance=10 * UNITS.m) # Create the second body in a plane with different origin sketch_2 = Sketch(Plane([0, 0, 10])) @@ -54,12 +63,37 @@ circle = sketch_2.circle( Point2D([0, 10], unit=UNITS.m), radius=Quantity(25, UNITS.m) ) -body = comp.extrude_sketch("SecondBody", sketch=sketch_2, distance=10 * UNITS.m) +body = comp.extrude_sketch("Body", sketch=sketch_2, distance=10 * UNITS.m) +``` +## Tessellation the component as two merged bodies + +Tessellate the component and merge each body in to a single dataset, +This effectively combines all the faces of each individual body into a +single dataset without separating faces. + +```{code-cell} ipython3 dataset = comp.tessellate(merge_bodies=True) dataset ``` +If you want tessellate the body and return the geometry as triangles, single body tessellation is also possible with +merge the body into a single mesh, if you wish to merge the individual faces of the tessellation. +This preserves the number of triangles and only merges the topology. By default, False. + +Without merging the body: + +```{code-cell} ipython3 +dataset = body.tessellate() +dataset +``` +Merge the body: + +```{code-cell} ipython3 +mesh = body.tessellate(merge=True) +mesh +``` + +And finally plot to see the design. -## Plot the tessellation as two merged bodies ```{code-cell} ipython3 -comp.plot(merge_bodies=True) +design.plot() ``` \ No newline at end of file From 42d73025d829a57ae3bfa2972eaed0787f280d0d Mon Sep 17 00:00:00 2001 From: Revathy Venugopal <104772255+Revathyvenugopal162@users.noreply.github.com> Date: Thu, 20 Oct 2022 15:46:06 +0200 Subject: [PATCH 12/21] Update doc/source/examples/design/add_design_material.mystnb Co-authored-by: Roberto Pastor Muela --- doc/source/examples/design/add_design_material.mystnb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/doc/source/examples/design/add_design_material.mystnb b/doc/source/examples/design/add_design_material.mystnb index d723d2c06c..3da6b53f2b 100644 --- a/doc/source/examples/design/add_design_material.mystnb +++ b/doc/source/examples/design/add_design_material.mystnb @@ -13,11 +13,12 @@ kernelspec: # Single body with material assignment In PyGeometry, a ``Body`` represents solids or surfaces organized within the ``Design`` assembly. -The current state of ``sketch``, which is a client side execution cab be used for the operations of -the geometric design assembly. Geometric Service also provides data structure to create individual materials -and its properties. +The current state of ``Sketch``, which is a client-side execution, can be used for the operations of +the geometric design assembly. The Geometry Service also provides data structures to create individual materials +and its properties, which are also exposed through PyGeometry. -This example demonstrate how to create a single body from the extruded sketch and how to assign material to it. +This example demonstrates how to create a single body from a sketch, by requesting its extrusion, +and how to assign a material to it. ```{code-cell} ipython3 from pint import Quantity From 4052e53b7facf6ecf8388701f0c81ca45712c06b Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Thu, 20 Oct 2022 16:26:53 +0200 Subject: [PATCH 13/21] Code suggestions by @chadqueen --- .../_static/thumbnails/plate_with_hole.PNG | Bin 11181 -> 10690 bytes .../examples/design/plate_with_hole.mystnb | 9 +++------ .../examples/design/tessellation_usage.mystnb | 4 ++-- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/doc/source/_static/thumbnails/plate_with_hole.PNG b/doc/source/_static/thumbnails/plate_with_hole.PNG index 987943826a765260d9559dfc0e69d290aecea9ca..780376226762139267ef09f766691a735b5196f2 100644 GIT binary patch literal 10690 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 literal 11181 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 HW#In-u7SZr diff --git a/doc/source/examples/design/plate_with_hole.mystnb b/doc/source/examples/design/plate_with_hole.mystnb index 4fadb2b1f7..30e352424a 100644 --- a/doc/source/examples/design/plate_with_hole.mystnb +++ b/doc/source/examples/design/plate_with_hole.mystnb @@ -62,19 +62,16 @@ sketch = Sketch() A server connection is established and the single sketch profile is used to extrude the board profile at multiple Z-offsets. A named selection is then created from the -resulting list of layer bodies. +resulting list of bodies. The design is going to extrude the four segments with desired thickness, resulting in four server calls. ```{code-cell} ipython3 modeler = Modeler() design = modeler.create_design("ExtrudedPlate") -layers= [] -layer_thickness = Quantity(2, UNITS.m) -for layer_index in range(4): - layers.append(design.extrude_sketch(f"PlateLayer_{layer_index}", sketch, layer_thickness)) +body = design.extrude_sketch(f"PlateLayer", sketch, Quantity(2, UNITS.m)) -board_named_selection = design.create_named_selection("Plate", bodies=layers) +board_named_selection = design.create_named_selection("Plate", bodies=[body]) design.plot() ``` diff --git a/doc/source/examples/design/tessellation_usage.mystnb b/doc/source/examples/design/tessellation_usage.mystnb index d256849d9f..8d0028c333 100644 --- a/doc/source/examples/design/tessellation_usage.mystnb +++ b/doc/source/examples/design/tessellation_usage.mystnb @@ -30,9 +30,9 @@ from ansys.geometry.core.plotting.plotter import Plotter ## Creating the design -Create the basic sketches to be tessellate, and extrude the sketch in required plane. +Create the basic sketches to be tessellated, and extrude the sketch in the required plane. [Extruded rectangular plate with multiple bodies](plate_with_hole.mystnb) -contains the working example of creating component and extruding sketch in a design. +contains the working example of creating a component and extruding sketch the in ``design``. Here is a typical situation where two bodies of different sketch plane and merge each body into a single dataset. From d1cfa41d494e5f8e39e05059492b9a1bd661c7d7 Mon Sep 17 00:00:00 2001 From: Revathy Venugopal <104772255+Revathyvenugopal162@users.noreply.github.com> Date: Thu, 20 Oct 2022 17:54:54 +0200 Subject: [PATCH 14/21] Apply suggestions from code review Co-authored-by: Roberto Pastor Muela --- .../examples/design/add_design_material.mystnb | 4 +++- doc/source/examples/design/plate_with_hole.mystnb | 12 ++++++------ .../examples/design/tessellation_usage.mystnb | 13 +++++++------ 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/doc/source/examples/design/add_design_material.mystnb b/doc/source/examples/design/add_design_material.mystnb index 3da6b53f2b..d15e29ef2e 100644 --- a/doc/source/examples/design/add_design_material.mystnb +++ b/doc/source/examples/design/add_design_material.mystnb @@ -49,7 +49,9 @@ design = modeler.create_design(design_name) ## Add materials to the design -Adding materials and its property to the design. +Adding materials and its properties to the design. Additional properties of +the material can be added at construction of the ``Material`` object or afterwards, +as it is shown in the code snippet. ```{code-cell} ipython3 density = Quantity(125, 10 * UNITS.kg / (UNITS.m * UNITS.m * UNITS.m)) poisson_ratio = Quantity(0.33, UNITS.dimensionless) diff --git a/doc/source/examples/design/plate_with_hole.mystnb b/doc/source/examples/design/plate_with_hole.mystnb index 30e352424a..e703825ef2 100644 --- a/doc/source/examples/design/plate_with_hole.mystnb +++ b/doc/source/examples/design/plate_with_hole.mystnb @@ -39,7 +39,7 @@ from ansys.geometry.core.sketch import Sketch ## Defining a ``Sketch`` profile for the proposed design The profile requires four ``Segments`` which constitute the outer limits of the design, -a ``Box`` on the center and a ``Circle`` at four corners. +a ``Box`` on the center and a ``Circle`` at its four corners. A single sketch instance can be used for multiple design operations such as extruding a body, projecting a profile, or imprinting curves. @@ -77,9 +77,9 @@ design.plot() ## Add new component with planar surface -We have created plate as base component and Let's add a new component with a planar surface to it. +We have created a plate as a base component. Let's add a new component with a planar surface to it. For that, create an instance ``sketch``, create surface in the design with that sketch. -For the sketch, we are creating an ellipse keeping the origin of the plane as center. +For the sketch, we are creating an ellipse keeping the origin of the plane as its center. ```{code-cell} ipython3 # Add components to the design @@ -99,7 +99,7 @@ design.plot() ## Extrude from face to create body -It is possible to extrude the face profile by the given distance to create a new solid body. +It is possible to extrude a face profile by a given distance to create a new solid body. There are no modifications against the body containing the source face. ```{code-cell} ipython3 @@ -110,8 +110,8 @@ design.plot() ``` ## Translate the body with in the plane -By using the translate method, we can move the body to direction specified by the given distance. -It is also possible to move a sketch around the global coordinate system. see example +By using the translate method, we can move the body in a direction specified by a given distance. +It is also possible to move a sketch around the global coordinate system. See example [Dynamic Sketch Plane](dynamic_sketch_plane.mystnb). ```{code-cell} ipython3 diff --git a/doc/source/examples/design/tessellation_usage.mystnb b/doc/source/examples/design/tessellation_usage.mystnb index 8d0028c333..4b6b62a954 100644 --- a/doc/source/examples/design/tessellation_usage.mystnb +++ b/doc/source/examples/design/tessellation_usage.mystnb @@ -21,21 +21,22 @@ Let's first import the fundamental objects: ```{code-cell} ipython3 from pint import Quantity -from ansys.geometry.core.sketch import Sketch from ansys.geometry.core import Modeler from ansys.geometry.core.math import Point2D, Point3D, Plane from ansys.geometry.core.misc import UNITS -from ansys.geometry.core.plotting.plotter import Plotter +from ansys.geometry.core.plotting.plotter import Plotter. +from ansys.geometry.core.sketch import Sketch + ``` ## Creating the design Create the basic sketches to be tessellated, and extrude the sketch in the required plane. [Extruded rectangular plate with multiple bodies](plate_with_hole.mystnb) -contains the working example of creating a component and extruding sketch the in ``design``. +contains the working example of creating a component and extruding a sketch in the ``design``. -Here is a typical situation where two bodies of different sketch plane -and merge each body into a single dataset. +Here is a typical situation in which two bodies, with different sketch planes, +merge each body into a single dataset. This effectively combines all the faces of each individual body into a single dataset without separating faces. @@ -65,7 +66,7 @@ circle = sketch_2.circle( body = comp.extrude_sketch("Body", sketch=sketch_2, distance=10 * UNITS.m) ``` -## Tessellation the component as two merged bodies +## Tessellation of the component as two merged bodies Tessellate the component and merge each body in to a single dataset, This effectively combines all the faces of each individual body into a From 00a75dee7c985e6bd8851fa07781ea362ae8ddce Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Thu, 20 Oct 2022 18:01:31 +0200 Subject: [PATCH 15/21] Add minor changes --- doc/source/examples/design/plate_with_hole.mystnb | 8 ++++---- doc/source/examples/design/tessellation_usage.mystnb | 7 ++++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/doc/source/examples/design/plate_with_hole.mystnb b/doc/source/examples/design/plate_with_hole.mystnb index 30e352424a..d8efbcff88 100644 --- a/doc/source/examples/design/plate_with_hole.mystnb +++ b/doc/source/examples/design/plate_with_hole.mystnb @@ -16,9 +16,9 @@ kernelspec: Multiple bodies can be created from a single sketch by extruding the same sketch in different planes. The sketch is designed as an effective fluent-style API with all operations receiving 2D configurations. -to know more about the fluent API, see [Fluent based API in Sketch](../../user_guide/shapes.rst) +To know more about the fluent API, see [Fluent based API in Sketch](../../user_guide/shapes.rst) -In this example, a box is located in the center of the plate, with the default origin of a sketch plane (origin at (0,0,0)). +In this example, a box is located in the center of the plate, with the default origin of a sketch plane (origin at (0, 0, 0)). Four holes of equal radius are sketched at the corners of the plate. The plate is then extruded, leading to the generation of the requested body. The projection is at the center of the face. The default projection depth is through the entire part. @@ -61,9 +61,9 @@ sketch = Sketch() ## Creating the design by extruding sketch A server connection is established and the single sketch profile is used to extrude -the board profile at multiple Z-offsets. A named selection is then created from the +the base component at Z axis. A named selection is then created from the resulting list of bodies. -The design is going to extrude the four segments with desired thickness, resulting in four server calls. +The design is going to extrude the four segments with desired thickness, just in three server calls. ```{code-cell} ipython3 modeler = Modeler() diff --git a/doc/source/examples/design/tessellation_usage.mystnb b/doc/source/examples/design/tessellation_usage.mystnb index 8d0028c333..4b90ff3876 100644 --- a/doc/source/examples/design/tessellation_usage.mystnb +++ b/doc/source/examples/design/tessellation_usage.mystnb @@ -75,9 +75,10 @@ single dataset without separating faces. dataset = comp.tessellate(merge_bodies=True) dataset ``` -If you want tessellate the body and return the geometry as triangles, single body tessellation is also possible with -merge the body into a single mesh, if you wish to merge the individual faces of the tessellation. -This preserves the number of triangles and only merges the topology. By default, False. +If you want tessellate the body and return the geometry as triangles, single body tessellation is also possible. +If you wish to merge the individual faces of the tessellation, enable the +merge the body into a single mesh. +This preserves the number of triangles and only merges the topology. Without merging the body: From 71fe4256cc73d3bf6dc38231d50ec787d1020c43 Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Thu, 20 Oct 2022 18:05:20 +0200 Subject: [PATCH 16/21] Add minor changes in design organisation --- doc/source/examples/{ => design}/design_organization.mystnb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename doc/source/examples/{ => design}/design_organization.mystnb (97%) diff --git a/doc/source/examples/design_organization.mystnb b/doc/source/examples/design/design_organization.mystnb similarity index 97% rename from doc/source/examples/design_organization.mystnb rename to doc/source/examples/design/design_organization.mystnb index b4b1bd76c9..5060206bc8 100644 --- a/doc/source/examples/design_organization.mystnb +++ b/doc/source/examples/design/design_organization.mystnb @@ -75,7 +75,7 @@ used sketch. double_nested_component = nested_component.add_component("DoubleNestedComponent") circle_surface_body = double_nested_component.create_surface("CircularSurfaceBody", circle_sketch) -circle_surface_body.translate(UNITVECTOR3D_X, Distance(-10, UNITS.mm)) +circle_surface_body.translate(UNITVECTOR3D_X, Distance(-35, UNITS.mm)) design.plot() ``` From a24cca52050d36378d4463f69480d1ecd3e5f45e Mon Sep 17 00:00:00 2001 From: Revathy Venugopal <104772255+Revathyvenugopal162@users.noreply.github.com> Date: Thu, 20 Oct 2022 18:08:05 +0200 Subject: [PATCH 17/21] Update doc/source/examples/design/plate_with_hole.mystnb Co-authored-by: Roberto Pastor Muela --- doc/source/examples/design/plate_with_hole.mystnb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/examples/design/plate_with_hole.mystnb b/doc/source/examples/design/plate_with_hole.mystnb index 7606f74e99..3d81fc803a 100644 --- a/doc/source/examples/design/plate_with_hole.mystnb +++ b/doc/source/examples/design/plate_with_hole.mystnb @@ -78,7 +78,7 @@ design.plot() ## Add new component with planar surface We have created a plate as a base component. Let's add a new component with a planar surface to it. -For that, create an instance ``sketch``, create surface in the design with that sketch. +For that, create an instance ``sketch``, and create a surface in the design with that sketch. For the sketch, we are creating an ellipse keeping the origin of the plane as its center. ```{code-cell} ipython3 From 7bcc2390b5c84f58bfa6876684c075394df1bc10 Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Thu, 20 Oct 2022 18:11:36 +0200 Subject: [PATCH 18/21] Modify user guide --- doc/source/user_guide/index.rst | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/doc/source/user_guide/index.rst b/doc/source/user_guide/index.rst index f3e73d92bd..93479b3f7a 100644 --- a/doc/source/user_guide/index.rst +++ b/doc/source/user_guide/index.rst @@ -27,10 +27,8 @@ PyGeometry is a Python wrapper for the Ansys Geometry Service. The key features Simple interactive example ========================== - -1. Start the Geometry Service instance --------------------------------------- - +Start the Geometry Service instance +----------------------------------- The :class:`Modeler() ` class within the ``ansys-geometry-core`` library creates an instance of @@ -45,10 +43,8 @@ Now, you can start the service with: >>> from ansys.geometry.core import Modeler >>> modeler = Modeler() - -2. Create Geometry models -------------------------- - +Create Geometry models +---------------------- The Geometry Service is now active and you can start creating the geometry model by initializing the :ref:`Sketch ` and :ref:`Primitives `. From 108e5642ea9d24d354aec7fc5040479c7f0d1852 Mon Sep 17 00:00:00 2001 From: Roberto Pastor Muela Date: Fri, 21 Oct 2022 08:19:09 +0200 Subject: [PATCH 19/21] Update doc/source/examples/design/tessellation_usage.mystnb --- doc/source/examples/design/tessellation_usage.mystnb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/examples/design/tessellation_usage.mystnb b/doc/source/examples/design/tessellation_usage.mystnb index 0c22cc88d1..4047c17cda 100644 --- a/doc/source/examples/design/tessellation_usage.mystnb +++ b/doc/source/examples/design/tessellation_usage.mystnb @@ -24,7 +24,7 @@ from pint import Quantity from ansys.geometry.core import Modeler from ansys.geometry.core.math import Point2D, Point3D, Plane from ansys.geometry.core.misc import UNITS -from ansys.geometry.core.plotting.plotter import Plotter. +from ansys.geometry.core.plotting import Plotter. from ansys.geometry.core.sketch import Sketch ``` From 65bcec68bfa6f0945e0d61a5a1f1d07efe15e2ce Mon Sep 17 00:00:00 2001 From: Roberto Pastor Muela Date: Fri, 21 Oct 2022 08:53:38 +0200 Subject: [PATCH 20/21] Update doc/source/examples/design/tessellation_usage.mystnb --- doc/source/examples/design/tessellation_usage.mystnb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/examples/design/tessellation_usage.mystnb b/doc/source/examples/design/tessellation_usage.mystnb index 4047c17cda..07ea087db2 100644 --- a/doc/source/examples/design/tessellation_usage.mystnb +++ b/doc/source/examples/design/tessellation_usage.mystnb @@ -76,9 +76,9 @@ single dataset without separating faces. dataset = comp.tessellate(merge_bodies=True) dataset ``` -If you want tessellate the body and return the geometry as triangles, single body tessellation is also possible. +If you want to tessellate the body and return the geometry as triangles, single body tessellation is also possible. If you wish to merge the individual faces of the tessellation, enable the -merge the body into a single mesh. +``merge`` option so that the body is rendered into a single mesh. This preserves the number of triangles and only merges the topology. Without merging the body: From f0e05ad920df19576d5d67941d54f2fe36089ed3 Mon Sep 17 00:00:00 2001 From: Revathy Venugopal <104772255+Revathyvenugopal162@users.noreply.github.com> Date: Fri, 21 Oct 2022 09:47:15 +0200 Subject: [PATCH 21/21] Apply suggestions from code review Co-authored-by: Maxime Rey <87315832+MaxJPRey@users.noreply.github.com> --- doc/source/examples/design/plate_with_hole.mystnb | 4 ++-- doc/source/examples/design/tessellation_usage.mystnb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/source/examples/design/plate_with_hole.mystnb b/doc/source/examples/design/plate_with_hole.mystnb index 3d81fc803a..ba9c8f2236 100644 --- a/doc/source/examples/design/plate_with_hole.mystnb +++ b/doc/source/examples/design/plate_with_hole.mystnb @@ -11,7 +11,7 @@ kernelspec: name: python3 --- -# Extruded rectangular plate with multiple bodies +# Extrude rectangular plate with multiple bodies Multiple bodies can be created from a single sketch by extruding the same sketch in different planes. @@ -58,7 +58,7 @@ sketch = Sketch() ) ``` -## Creating the design by extruding sketch +## Create the design by extruding sketch A server connection is established and the single sketch profile is used to extrude the base component at Z axis. A named selection is then created from the diff --git a/doc/source/examples/design/tessellation_usage.mystnb b/doc/source/examples/design/tessellation_usage.mystnb index 07ea087db2..482cce7c02 100644 --- a/doc/source/examples/design/tessellation_usage.mystnb +++ b/doc/source/examples/design/tessellation_usage.mystnb @@ -55,7 +55,7 @@ design = modeler.create_design("TessellationDesign") comp = design.add_component("TessellationComponent") body = comp.extrude_sketch("Body", sketch=sketch_1, distance=10 * UNITS.m) -# Create the second body in a plane with different origin +# Create the second body in a plane with a different origin sketch_2 = Sketch(Plane([0, 0, 10])) box = sketch_2.box(Point2D( [10, 10], unit=UNITS.m), width=Quantity(10, UNITS.m), height=Quantity(5, UNITS.m)