From 4dfbf4f433523d2ab0018ef8022d37a6f6ea4476 Mon Sep 17 00:00:00 2001 From: petras Date: Fri, 20 Dec 2024 21:43:09 +0100 Subject: [PATCH 01/13] ADD Changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 133bef32..e43a6dd3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Added `Element.compute_elementgeometry()`. * Added `Element.compute_modelgeometry()` to replace `Element.compute_geometry()`. * Added `Element.compute_modeltransformation()` to replace `Element.compute_worldtransformation()`. +* Added `Element.is_dirty`. ### Changed From 7bfcbe28e246e9b9845f6a1a187e81243b97b3f6 Mon Sep 17 00:00:00 2001 From: petras Date: Fri, 20 Dec 2024 21:45:11 +0100 Subject: [PATCH 02/13] ADD attribute in constructor --- src/compas_model/elements/element.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/compas_model/elements/element.py b/src/compas_model/elements/element.py index 7012d2f7..0957154a 100644 --- a/src/compas_model/elements/element.py +++ b/src/compas_model/elements/element.py @@ -140,6 +140,8 @@ def __init__( self.include_features = False self.inflate_aabb = 0.0 self.inflate_obb = 0.0 + + self.is_dirty = True # this is not entirely correct def __repr__(self) -> str: From 248877c087eae3fef52d282d0981fdbf57e43204 Mon Sep 17 00:00:00 2001 From: petras Date: Fri, 20 Dec 2024 21:46:03 +0100 Subject: [PATCH 03/13] ADD docstring --- src/compas_model/elements/element.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/compas_model/elements/element.py b/src/compas_model/elements/element.py index 0957154a..2e82427b 100644 --- a/src/compas_model/elements/element.py +++ b/src/compas_model/elements/element.py @@ -93,6 +93,8 @@ class Element(Data): Scaling factor to inflate the AABB with. inflate_obb : float Scaling factor to inflate the OBB with. + is_dirty : bool + Flag to indicate that modelgeometry has to be recomputed. """ From 9df83d53f475ddb90e8f6561d22dbe50e03b5735 Mon Sep 17 00:00:00 2001 From: petras Date: Fri, 20 Dec 2024 21:47:09 +0100 Subject: [PATCH 04/13] ADD is_dirty setter and getter --- src/compas_model/elements/element.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/compas_model/elements/element.py b/src/compas_model/elements/element.py index 2e82427b..b62790f5 100644 --- a/src/compas_model/elements/element.py +++ b/src/compas_model/elements/element.py @@ -182,6 +182,19 @@ def parent(self) -> "ElementNode": def features(self) -> list[Feature]: return self._features + @property + def is_dirty(self): + return self._is_dirty + + @is_dirty.setter + def is_dirty(self, value): + self._is_dirty = value + + if value: + elements = list(self.model.elements()) + for neighbor in self.model.graph.neighbors_out(self.graphnode): + elements[neighbor].is_dirty = value + # ========================================================================== # Computed attributes # ========================================================================== From b4c769f885e743d58f3b066dacb754cf9b9ff457 Mon Sep 17 00:00:00 2001 From: petras Date: Fri, 20 Dec 2024 21:48:28 +0100 Subject: [PATCH 05/13] CHANGE compute_modelgeometry is_dirty attribute with code for interfaces --- src/compas_model/elements/element.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/compas_model/elements/element.py b/src/compas_model/elements/element.py index b62790f5..3a237a55 100644 --- a/src/compas_model/elements/element.py +++ b/src/compas_model/elements/element.py @@ -308,7 +308,24 @@ def compute_modelgeometry(self) -> Union[Brep, Mesh]: :class:`compas.datastructures.Mesh` | :class:`compas.geometry.Brep` """ - raise NotImplementedError + graph = self.model.graph + elements = list(self.model.elements()) + xform = self.modeltransformation + modelgeometry = self.elementgeometry.transformed(xform) + + for neighbor in graph.neighbors_in(self.graphnode): + for interaction in graph.edge_interactions((neighbor, self.graphnode)): # graph.edge_modififers() + # Interaction types: Modifier, Collision, Interface + if hasattr(interaction, "modify"): # Modifier + modelgeometry = interaction.modify(modelgeometry, elements[neighbor].modelgeometry) + elif hasattr(interaction, "collide"): # Collision: + modelgeometry = interaction.collide(modelgeometry, elements[neighbor].modelgeometry) + elif hasattr(interaction, "overlap"): # Interface: + modelgeometry = interaction.touch(modelgeometry, elements[neighbor].modelgeometry) + + self.is_dirty = False + + return modelgeometry def compute_aabb(self) -> Box: """Computes the Axis Aligned Bounding Box (AABB) of the geometry of the element. From 80ccd11f8669a4745c447b0405ec41015dedf6da Mon Sep 17 00:00:00 2001 From: petras Date: Fri, 20 Dec 2024 21:51:23 +0100 Subject: [PATCH 06/13] FIX contructor is_dirty is set to private --- src/compas_model/elements/element.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compas_model/elements/element.py b/src/compas_model/elements/element.py index 3a237a55..84422418 100644 --- a/src/compas_model/elements/element.py +++ b/src/compas_model/elements/element.py @@ -143,7 +143,7 @@ def __init__( self.inflate_aabb = 0.0 self.inflate_obb = 0.0 - self.is_dirty = True + self._is_dirty = True # this is not entirely correct def __repr__(self) -> str: From d1e5ef808601c6e759836d4bd7ae1f3ed47150d0 Mon Sep 17 00:00:00 2001 From: petras Date: Fri, 20 Dec 2024 21:55:59 +0100 Subject: [PATCH 07/13] ADD is_dirty attribute changes within the model class --- src/compas_model/models/model.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/compas_model/models/model.py b/src/compas_model/models/model.py index 73c1e834..ef63a34e 100644 --- a/src/compas_model/models/model.py +++ b/src/compas_model/models/model.py @@ -380,6 +380,8 @@ def add_interaction(self, a: Element, b: Element, interaction: Optional[Interact interactions.append(interaction) self.graph.edge_attribute(edge, name="interactions", value=interactions) + self._guid_element[str(b.guid)].is_dirty = True + return edge def remove_element(self, element: Element) -> None: @@ -398,10 +400,14 @@ def remove_element(self, element: Element) -> None: guid = str(element.guid) if guid not in self._guid_element: raise Exception("Element not in the model.") + + self._guid_element[guid].is_dirty = True + del self._guid_element[guid] self.graph.delete_node(element.graphnode) self.tree.remove(element.treenode) + def remove_interaction(self, a: Element, b: Element, interaction: Optional[Interaction] = None) -> None: """Remove the interaction between two elements. @@ -420,6 +426,9 @@ def remove_interaction(self, a: Element, b: Element, interaction: Optional[Inter if interaction: raise NotImplementedError + elements = list(self.elements()) + elements[b.graphnode]._is_dirty = True + edge = a.graphnode, b.graphnode if self.graph.has_edge(edge): self.graph.delete_edge(edge) From 8e02cd1b4dcedb37bdd0b76ffbbe1a5219d7e23c Mon Sep 17 00:00:00 2001 From: petras Date: Fri, 20 Dec 2024 21:56:36 +0100 Subject: [PATCH 08/13] ADD test_element.py all test are passed! --- tests/test_element.py | 163 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 tests/test_element.py diff --git a/tests/test_element.py b/tests/test_element.py new file mode 100644 index 00000000..c1f8dd70 --- /dev/null +++ b/tests/test_element.py @@ -0,0 +1,163 @@ +from compas_model.models import Model +from compas_model.elements import Element +from compas_model.interactions import Interaction +from compas.datastructures import Mesh +from typing import Optional + +from compas.geometry import Frame +from compas.geometry import Box +from compas.geometry import Transformation + + +class MyElement(Element): + """Class representing an element for testing.""" + + def __init__( + self, + size: float = 0.1, + frame: Frame = Frame.worldXY(), + transformation: Optional[Transformation] = None, + name: Optional[str] = None, + ) -> "MyElement": + super().__init__(frame=frame, transformation=transformation, name=name) + + self.size: float = size + + def compute_elementgeometry(self) -> Mesh: + """Element geometry in the local frame. + + Returns + ------- + :class:`compas.datastructures.Mesh` + + """ + + return Box(self.size, self.size, self.size, self.frame).to_mesh() + + +def test_is_dirty_setter(): + model = Model() + a = MyElement(name="a") + b = MyElement(name="b") + c = MyElement(name="c") + d = MyElement(name="d") + model.add_element(a) + model.add_element(b) + model.add_element(c) + model.add_element(d) + model.add_interaction(a, c, interaction=Interaction(name="i_a_c")) # a affects c + model.add_interaction(a, b, interaction=Interaction(name="i_b_c")) # a affects b + a.is_dirty = False + b.is_dirty = False + c.is_dirty = False + d.is_dirty = False + + elements = list(model.elements()) + + assert not elements[0].is_dirty + assert not elements[1].is_dirty + assert not elements[2].is_dirty + assert not elements[3].is_dirty + + elements[0].is_dirty = True + + assert elements[0].is_dirty + assert elements[1].is_dirty + assert elements[2].is_dirty + assert not elements[3].is_dirty + + +def test_is_dirty_add_interaction(): + model = Model() + a = MyElement(name="a") + b = MyElement(name="b") + c = MyElement(name="c") + d = MyElement(name="d") + model.add_element(a) + model.add_element(b) + model.add_element(c) + model.add_element(d) + + model.add_interaction(a, b, interaction=Interaction(name="i_a_b")) # c affects a + for element in model.elements(): + element.modelgeometry # All elements is_dirty is set to False + model.add_interaction(a, c, interaction=Interaction(name="i_a_c")) # c affects b + + elements = list(model.elements()) + assert not elements[0].is_dirty + assert not elements[1].is_dirty + assert elements[2].is_dirty + assert not elements[3].is_dirty + + +def test_is_dirty_remove_interaction(): + model = Model() + a = MyElement(name="a") + b = MyElement(name="b") + c = MyElement(name="c") + d = MyElement(name="d") + model.add_element(a) + model.add_element(b) + model.add_element(c) + model.add_element(d) + model.add_interaction(a, b, interaction=Interaction(name="i_a_b")) # a affects b + model.add_interaction(a, c, interaction=Interaction(name="i_a_c")) # a affects c + + for element in model.elements(): + element.is_dirty = False + model.remove_interaction(a, b) # a affects b + model.remove_interaction(a, c) # a affects c + + elements = list(model.elements()) + assert not elements[0].is_dirty + assert elements[1].is_dirty + assert elements[2].is_dirty + assert not elements[3].is_dirty + + +def test_is_dirty_remove_element_0(): + model = Model() + a = MyElement(name="a") + b = MyElement(name="b") + c = MyElement(name="c") + d = MyElement(name="d") + model.add_element(a) + model.add_element(b) + model.add_element(c) + model.add_element(d) + model.add_interaction(a, b, interaction=Interaction(name="i_a_b")) # a affects b + model.add_interaction(a, c, interaction=Interaction(name="i_a_c")) # a affects c + + for element in model.elements(): + element.modelgeometry # All element is_dirty is set to False + + model.remove_element(a) # b and c is_dirty is set to True + + elements = list(model.elements()) + assert elements[0].is_dirty + assert elements[1].is_dirty + assert not elements[2].is_dirty + + +def test_is_dirty_remove_element_1(): + model = Model() + a = MyElement(name="a") + b = MyElement(name="b") + c = MyElement(name="c") + d = MyElement(name="d") + model.add_element(a) + model.add_element(b) + model.add_element(c) + model.add_element(d) + model.add_interaction(a, b, interaction=Interaction(name="i_a_b")) # a affects b + model.add_interaction(a, c, interaction=Interaction(name="i_a_c")) # a affects c + + for element in model.elements(): + element.modelgeometry # All element is_dirty is set to False + + model.remove_element(b) # b and c is_dirty is set to True + + elements = list(model.elements()) + assert not elements[0].is_dirty + assert not elements[1].is_dirty + assert not elements[2].is_dirty \ No newline at end of file From 0e40c2ccaf5e2d1c665971a15f774d804a1b6cb8 Mon Sep 17 00:00:00 2001 From: petras Date: Fri, 20 Dec 2024 22:37:56 +0100 Subject: [PATCH 09/13] LINT --- src/compas_model/algorithms/interfaces.py | 5 ++--- src/compas_model/algorithms/overlaps.py | 4 ++-- src/compas_model/analysis/cra.py | 4 ++-- src/compas_model/elements/block.py | 1 - src/compas_model/elements/element.py | 3 +-- src/compas_model/elements/plate.py | 1 - src/compas_model/models/blockmodel.py | 4 ++-- src/compas_model/models/elementnode.py | 1 - src/compas_model/models/elementtree.py | 1 - src/compas_model/models/interactiongraph.py | 1 - src/compas_model/models/model.py | 4 +--- src/compas_model/notebook/scene/blockobject.py | 8 ++++---- src/compas_model/notebook/scene/modelobject.py | 4 ++-- src/compas_model/scene/elementobject.py | 3 +-- src/compas_model/scene/modelobject.py | 3 +-- src/compas_model/viewers/blockmodelviewer.py | 9 ++++----- tests/test_element.py | 2 +- 17 files changed, 23 insertions(+), 35 deletions(-) diff --git a/src/compas_model/algorithms/interfaces.py b/src/compas_model/algorithms/interfaces.py index 265b6256..48a240fa 100644 --- a/src/compas_model/algorithms/interfaces.py +++ b/src/compas_model/algorithms/interfaces.py @@ -1,11 +1,12 @@ from math import fabs +from shapely.geometry import Polygon as ShapelyPolygon + from compas.datastructures import Mesh from compas.geometry import Frame from compas.geometry import Plane from compas.geometry import Polygon from compas.geometry import Transformation -from compas.geometry import Vector from compas.geometry import bestfit_frame_numpy from compas.geometry import centroid_polygon from compas.geometry import is_colinear @@ -13,8 +14,6 @@ from compas.geometry import is_parallel_vector_vector from compas.geometry import transform_points from compas.itertools import window -from shapely.geometry import Polygon as ShapelyPolygon - from compas_model.elements import BlockGeometry from compas_model.interactions import ContactInterface from compas_model.models import Model diff --git a/src/compas_model/algorithms/overlaps.py b/src/compas_model/algorithms/overlaps.py index 77ef6135..93535823 100644 --- a/src/compas_model/algorithms/overlaps.py +++ b/src/compas_model/algorithms/overlaps.py @@ -1,7 +1,7 @@ -from compas.geometry import Brep -from compas.tolerance import TOL from compas_occ.brep import OCCBrepFace as BrepFace +from compas.geometry import Brep +from compas.tolerance import TOL from compas_model.interactions import ContactInterface from compas_model.models import Model diff --git a/src/compas_model/analysis/cra.py b/src/compas_model/analysis/cra.py index c5bc2b43..59665de0 100644 --- a/src/compas_model/analysis/cra.py +++ b/src/compas_model/analysis/cra.py @@ -1,7 +1,7 @@ -from compas_assembly.datastructures import Assembly -from compas_assembly.datastructures import Block from compas_cra.equilibrium import cra_penalty_solve as _cra_penalty_solve +from compas_assembly.datastructures import Assembly +from compas_assembly.datastructures import Block from compas_model.interactions import ContactInterface from compas_model.models import Model diff --git a/src/compas_model/elements/block.py b/src/compas_model/elements/block.py index d2e5e1f4..c3e0661c 100644 --- a/src/compas_model/elements/block.py +++ b/src/compas_model/elements/block.py @@ -14,7 +14,6 @@ from compas.geometry import oriented_bounding_box from compas.geometry import volume_polyhedron from compas.geometry.brep.brep import Brep - from compas_model.elements import Element from compas_model.elements import Feature diff --git a/src/compas_model/elements/element.py b/src/compas_model/elements/element.py index 84422418..74a126e8 100644 --- a/src/compas_model/elements/element.py +++ b/src/compas_model/elements/element.py @@ -12,7 +12,6 @@ from compas.geometry import Frame from compas.geometry import Shape from compas.geometry import Transformation - from compas_model.materials import Material if TYPE_CHECKING: @@ -142,7 +141,7 @@ def __init__( self.include_features = False self.inflate_aabb = 0.0 self.inflate_obb = 0.0 - + self._is_dirty = True # this is not entirely correct diff --git a/src/compas_model/elements/plate.py b/src/compas_model/elements/plate.py index 73bc9062..95c10db1 100644 --- a/src/compas_model/elements/plate.py +++ b/src/compas_model/elements/plate.py @@ -4,7 +4,6 @@ from compas.geometry import bounding_box from compas.geometry import oriented_bounding_box from compas.itertools import pairwise - from compas_model.elements import Element from compas_model.elements import Feature diff --git a/src/compas_model/models/blockmodel.py b/src/compas_model/models/blockmodel.py index 039a0569..16c5e0f1 100644 --- a/src/compas_model/models/blockmodel.py +++ b/src/compas_model/models/blockmodel.py @@ -1,9 +1,9 @@ from typing import Optional -from compas.geometry import Brep -from compas.tolerance import Tolerance from compas_occ.brep import OCCBrepFace as BrepFace +from compas.geometry import Brep +from compas.tolerance import Tolerance from compas_model.algorithms.nnbrs import find_nearest_neighbours from compas_model.elements import Element from compas_model.interactions import ContactInterface diff --git a/src/compas_model/models/elementnode.py b/src/compas_model/models/elementnode.py index f3b82cc5..8f45a15d 100644 --- a/src/compas_model/models/elementnode.py +++ b/src/compas_model/models/elementnode.py @@ -2,7 +2,6 @@ from typing import Optional from compas.datastructures import TreeNode - from compas_model.elements import Element if TYPE_CHECKING: diff --git a/src/compas_model/models/elementtree.py b/src/compas_model/models/elementtree.py index b5e71391..f66e6771 100644 --- a/src/compas_model/models/elementtree.py +++ b/src/compas_model/models/elementtree.py @@ -1,7 +1,6 @@ from typing import Optional from compas.datastructures import Tree - from compas_model.elements import Element from .elementnode import ElementNode diff --git a/src/compas_model/models/interactiongraph.py b/src/compas_model/models/interactiongraph.py index 07059a83..44036a12 100644 --- a/src/compas_model/models/interactiongraph.py +++ b/src/compas_model/models/interactiongraph.py @@ -2,7 +2,6 @@ from typing import Optional from compas.datastructures import Graph - from compas_model.elements import Element # noqa: F401 from compas_model.interactions import Interaction # noqa: F401 diff --git a/src/compas_model/models/model.py b/src/compas_model/models/model.py index ef63a34e..d4e04fce 100644 --- a/src/compas_model/models/model.py +++ b/src/compas_model/models/model.py @@ -7,7 +7,6 @@ from compas.datastructures import Datastructure from compas.geometry import Frame from compas.geometry import Transformation - from compas_model.elements import Element from compas_model.interactions import Interaction from compas_model.materials import Material @@ -400,14 +399,13 @@ def remove_element(self, element: Element) -> None: guid = str(element.guid) if guid not in self._guid_element: raise Exception("Element not in the model.") - + self._guid_element[guid].is_dirty = True del self._guid_element[guid] self.graph.delete_node(element.graphnode) self.tree.remove(element.treenode) - def remove_interaction(self, a: Element, b: Element, interaction: Optional[Interaction] = None) -> None: """Remove the interaction between two elements. diff --git a/src/compas_model/notebook/scene/blockobject.py b/src/compas_model/notebook/scene/blockobject.py index d40dbfa2..1360ed45 100644 --- a/src/compas_model/notebook/scene/blockobject.py +++ b/src/compas_model/notebook/scene/blockobject.py @@ -1,11 +1,11 @@ -import compas.datastructures # noqa: F401 -import compas.geometry # noqa: F401 import numpy import pythreejs as three -from compas.geometry import Polygon -from compas.geometry import earclip_polygon from compas_notebook.scene import ThreeSceneObject +import compas.datastructures # noqa: F401 +import compas.geometry # noqa: F401 +from compas.geometry import Polygon +from compas.geometry import earclip_polygon from compas_model.scene import BlockObject diff --git a/src/compas_model/notebook/scene/modelobject.py b/src/compas_model/notebook/scene/modelobject.py index 0bf80aca..fb157bd6 100644 --- a/src/compas_model/notebook/scene/modelobject.py +++ b/src/compas_model/notebook/scene/modelobject.py @@ -1,7 +1,7 @@ -import compas.datastructures # noqa: F401 -import compas.geometry # noqa: F401 from compas_notebook.scene import ThreeSceneObject +import compas.datastructures # noqa: F401 +import compas.geometry # noqa: F401 from compas_model.scene import ElementObject from compas_model.scene import ModelObject diff --git a/src/compas_model/scene/elementobject.py b/src/compas_model/scene/elementobject.py index a59fea20..8f3c5a6f 100644 --- a/src/compas_model/scene/elementobject.py +++ b/src/compas_model/scene/elementobject.py @@ -3,12 +3,11 @@ from __future__ import print_function import compas.geometry # noqa: F401 +import compas_model.elements # noqa: F401 from compas.colors import Color from compas.scene import SceneObject from compas.scene.descriptors.colordict import ColorDictAttribute -import compas_model.elements # noqa: F401 - class ElementObject(SceneObject): """Base class for all element scene objects. diff --git a/src/compas_model/scene/modelobject.py b/src/compas_model/scene/modelobject.py index fafb2355..7b72c1f6 100644 --- a/src/compas_model/scene/modelobject.py +++ b/src/compas_model/scene/modelobject.py @@ -3,9 +3,8 @@ from __future__ import print_function import compas.geometry # noqa: F401 -from compas.scene import SceneObject - import compas_model.models # noqa: F401 +from compas.scene import SceneObject class ModelObject(SceneObject): diff --git a/src/compas_model/viewers/blockmodelviewer.py b/src/compas_model/viewers/blockmodelviewer.py index ab7e1056..4ef81e44 100644 --- a/src/compas_model/viewers/blockmodelviewer.py +++ b/src/compas_model/viewers/blockmodelviewer.py @@ -2,15 +2,14 @@ from compas.datastructures import Mesh from compas.geometry import Line from compas.itertools import remap_values -from compas_viewer import Viewer -from compas_viewer.components import Button -from compas_viewer.components.slider import Slider -from compas_viewer.scene import GroupObject - from compas_model.elements import BlockElement from compas_model.elements import BlockGeometry from compas_model.interactions import ContactInterface from compas_model.models import Model +from compas_viewer import Viewer +from compas_viewer.components import Button +from compas_viewer.components.slider import Slider +from compas_viewer.scene import GroupObject def toggle_supports(): diff --git a/tests/test_element.py b/tests/test_element.py index c1f8dd70..4edc0c11 100644 --- a/tests/test_element.py +++ b/tests/test_element.py @@ -160,4 +160,4 @@ def test_is_dirty_remove_element_1(): elements = list(model.elements()) assert not elements[0].is_dirty assert not elements[1].is_dirty - assert not elements[2].is_dirty \ No newline at end of file + assert not elements[2].is_dirty From c8da4e8ff8edbe84d1b02ff33b79fae5f2dab34f Mon Sep 17 00:00:00 2001 From: petras Date: Thu, 9 Jan 2025 09:50:22 +0100 Subject: [PATCH 10/13] FIX underscore removal for is_dirty attribute in model class. --- src/compas_model/models/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compas_model/models/model.py b/src/compas_model/models/model.py index d4e04fce..efafaba9 100644 --- a/src/compas_model/models/model.py +++ b/src/compas_model/models/model.py @@ -425,7 +425,7 @@ def remove_interaction(self, a: Element, b: Element, interaction: Optional[Inter raise NotImplementedError elements = list(self.elements()) - elements[b.graphnode]._is_dirty = True + elements[b.graphnode].is_dirty = True edge = a.graphnode, b.graphnode if self.graph.has_edge(edge): From 84cfd17b86e3811ce052e23bf4fdf324f187e516 Mon Sep 17 00:00:00 2001 From: petras Date: Fri, 10 Jan 2025 16:16:59 +0100 Subject: [PATCH 11/13] CHANGE compute_modelgeometry with apply method. --- src/compas_model/elements/element.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/compas_model/elements/element.py b/src/compas_model/elements/element.py index 74a126e8..7af842ff 100644 --- a/src/compas_model/elements/element.py +++ b/src/compas_model/elements/element.py @@ -313,14 +313,8 @@ def compute_modelgeometry(self) -> Union[Brep, Mesh]: modelgeometry = self.elementgeometry.transformed(xform) for neighbor in graph.neighbors_in(self.graphnode): - for interaction in graph.edge_interactions((neighbor, self.graphnode)): # graph.edge_modififers() - # Interaction types: Modifier, Collision, Interface - if hasattr(interaction, "modify"): # Modifier - modelgeometry = interaction.modify(modelgeometry, elements[neighbor].modelgeometry) - elif hasattr(interaction, "collide"): # Collision: - modelgeometry = interaction.collide(modelgeometry, elements[neighbor].modelgeometry) - elif hasattr(interaction, "overlap"): # Interface: - modelgeometry = interaction.touch(modelgeometry, elements[neighbor].modelgeometry) + for interaction in graph.edge_interactions((neighbor, self.graphnode)): + modelgeometry = interaction.apply(modelgeometry, elements[neighbor].modelgeometry) self.is_dirty = False From 94faacb1e0186042f5361d451d9000ca0ac663cb Mon Sep 17 00:00:00 2001 From: petras Date: Fri, 10 Jan 2025 16:21:25 +0100 Subject: [PATCH 12/13] CHANGE occ is added to try catch --- src/compas_model/models/blockmodel.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/compas_model/models/blockmodel.py b/src/compas_model/models/blockmodel.py index 16ed32a3..709699d9 100644 --- a/src/compas_model/models/blockmodel.py +++ b/src/compas_model/models/blockmodel.py @@ -1,7 +1,5 @@ from typing import Optional -from compas_occ.brep import OCCBrepFace as BrepFace - from compas.geometry import Brep from compas.tolerance import Tolerance from compas_model.algorithms.nnbrs import find_nearest_neighbours From 69befea99844704b4a435b85e7e16cd3d04f7e8b Mon Sep 17 00:00:00 2001 From: petras Date: Fri, 10 Jan 2025 16:24:36 +0100 Subject: [PATCH 13/13] REMOVE apply in compute_modelgeometry. --- src/compas_model/elements/element.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compas_model/elements/element.py b/src/compas_model/elements/element.py index 7af842ff..17f2d4ee 100644 --- a/src/compas_model/elements/element.py +++ b/src/compas_model/elements/element.py @@ -308,13 +308,13 @@ def compute_modelgeometry(self) -> Union[Brep, Mesh]: """ graph = self.model.graph - elements = list(self.model.elements()) + elements = list(self.model.elements()) # noqa: F841 xform = self.modeltransformation modelgeometry = self.elementgeometry.transformed(xform) for neighbor in graph.neighbors_in(self.graphnode): for interaction in graph.edge_interactions((neighbor, self.graphnode)): - modelgeometry = interaction.apply(modelgeometry, elements[neighbor].modelgeometry) + pass # TODO: apply interaction self.is_dirty = False