Skip to content

Commit aba95fe

Browse files
FIX conflicts from main.
2 parents d70313b + adc7001 commit aba95fe

File tree

6 files changed

+134
-79
lines changed

6 files changed

+134
-79
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
4343
* Added `compas_model.elements.BeamElement`.
4444
* Added `compas_model.elements.ColumnElement`.
4545
* Added `compas_model.elements.PlateElement`.
46+
* Added `compas_model.models.Model.collisions` iterator.
47+
* Added `compas_model.models.graph.InteractionGraph.clear_edges`.
4648

4749
### Changed
4850

4951
* Changed `Element.graph_node` to `Element.graphnode`.
5052
* Changed `Element.tree_node` to `Element.treenode`.
53+
* Fixed bug in deserialisation (`element.model` was not set properly).
5154

5255
### Removed
5356

docs/examples/interactions/002_frame.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from compas.tolerance import TOL
1313
from compas_model.elements import BeamElement
1414
from compas_model.elements import ColumnElement
15-
from compas_model.interactions import BooleanModifier
1615
from compas_model.models import Model
1716
from compas_viewer import Viewer
1817
from compas_viewer.config import Config

src/compas_model/models/interactiongraph.py

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,15 @@ def _build_interactions_str(self) -> str:
100100
)
101101
return "\n".join(lines) + "\n"
102102

103+
def clear_edges(self):
104+
"""Clear all the edges and connectivity information of the graph."""
105+
for u, v in list(self.edges()):
106+
del self.edge[u][v]
107+
if v in self.adjacency[u]:
108+
del self.adjacency[u][v]
109+
if u in self.adjacency[v]:
110+
del self.adjacency[v][u]
111+
103112
def node_element(self, node: int) -> Element:
104113
"""Get the element associated with the node.
105114
@@ -114,30 +123,3 @@ def node_element(self, node: int) -> Element:
114123
115124
"""
116125
return self.node_attribute(node, "element") # type: ignore
117-
118-
# def edge_interactions(self, edge: tuple[int, int]) -> list[Interaction]:
119-
# """Get the element associated with the node.
120-
121-
# Parameters
122-
# ----------
123-
# edge : tuple[int, int]
124-
# The identifier of the edge.
125-
126-
# Returns
127-
# -------
128-
# :class:`compas_model.interactions.Interaction`
129-
130-
# """
131-
# return self.edge_attribute(edge, "interactions") # type: ignore
132-
133-
# def interactions(self) -> Generator[Interaction, None, None]:
134-
# """Get the interactions in the graph.
135-
136-
# Yields
137-
# ------
138-
# :class:`compas_model.interactions.Interaction`
139-
140-
# """
141-
# for edge in self.edges():
142-
# for interaction in self.edge_interactions(edge):
143-
# yield interaction

src/compas_model/models/model.py

Lines changed: 69 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ def add(nodedata: dict, parentnode: ElementNode) -> None:
7878
for childdata in nodedata["children"]:
7979
guid = childdata["element"]
8080
element = model._guid_element[guid]
81+
element.model = model
8182
attr = childdata.get("attributes") or {}
8283
childnode = ElementNode(element=element, name=childdata["name"], **attr)
8384
parentnode.add(childnode)
@@ -605,7 +606,29 @@ def materials(self) -> Generator[Material, None, None]:
605606
"""
606607
return iter(self._guid_material.values())
607608

608-
def collisions(self):
609+
def collisions(self) -> Generator[tuple[Element, Element], None, None]:
610+
"""Yield all collision pairs in the model.
611+
612+
Yields
613+
------
614+
tuple[:class:`Element`, :class:`Element`]
615+
The collision pairs.
616+
617+
Notes
618+
-----
619+
Collisions are not identified automatically.
620+
To identify collision, run :meth:`identify_interactions` or :meth:`compute_collisions` first.
621+
622+
"""
623+
for edge in self.graph.edges():
624+
collision = self.graph.edge_attribute(edge, name="collision")
625+
if collision:
626+
u, v = edge
627+
a = self.graph.node_element(u)
628+
b = self.graph.node_element(v)
629+
yield a, b
630+
631+
def contacts(self):
609632
raise NotImplementedError
610633

611634
# def elements_connected_by(self, interaction_type: Type[Interaction]) -> list[list[Element]]:
@@ -653,11 +676,34 @@ def collisions(self):
653676
# Compute
654677
# =============================================================================
655678

656-
def compute_bvh(self, nodetype=ElementOBBNode, max_depth=None, leafsize=1) -> ElementBVH:
679+
def compute_bvh(self, nodetype=ElementOBBNode, max_depth: Optional[int] = None, leafsize: Optional[int] = 1) -> ElementBVH:
680+
"""Compute the Bounding Volume Hierarchy (BVH) of the elements for fast collision checks.
681+
682+
Parameters
683+
----------
684+
nodetype : :class:`ElementOBBNode`
685+
The type of bounding volume node used in the tree.
686+
max_depth : int, optional
687+
The maximum depth used for constructing the BVH.
688+
leafsize : int, optional
689+
The number of elements contained in a BVH leaf node.
690+
691+
Returns
692+
-------
693+
:class:`ElementBVH`
694+
695+
"""
657696
self._bvh = ElementBVH.from_elements(self.elements(), nodetype=nodetype, max_depth=max_depth, leafsize=leafsize)
658697
return self._bvh
659698

660699
def compute_kdtree(self) -> KDTree:
700+
"""Compute the KD tree of the elements for fast nearest neighbour queries.
701+
702+
Returns
703+
-------
704+
:class:`KDTree`
705+
706+
"""
661707
self._kdtree = KDTree(list(self.elements()))
662708
return self._kdtree
663709

@@ -666,9 +712,30 @@ def compute_kdtree(self) -> KDTree:
666712
# =============================================================================
667713

668714
def element_nnbrs(self, element: Element, k=1) -> list[tuple[Element, float]]:
715+
""""""
669716
return [nbr for nbr in self.point_nnbrs(element.point, k=k + 1) if nbr[0] is not element]
670717

671718
def point_nnbrs(self, point, k=1) -> list[tuple[Element, float]]:
672719
if k == 1:
673720
return [self.kdtree.nearest_neighbor(point)]
674721
return self.kdtree.nearest_neighbors(point, number=k)
722+
723+
# def identify_interactions(self, reset_graph=True, k=None) -> None:
724+
# """Identify element interactions by computing element collision pairs and adding an interaction edge per pair.
725+
726+
# Returns
727+
# -------
728+
# None
729+
730+
# """
731+
# if reset_graph:
732+
# self.graph.clear_edges()
733+
734+
# k = k or 1
735+
# for element in self.elements():
736+
# for nbr, distance in self.element_nnbrs(element, k=k):
737+
# if self.has_interaction():
738+
# continue
739+
# # dos something with the distance?
740+
# if element.is_collision(nbr, precise=True):
741+
# pass

src/compas_model/scene/elementobject.py

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
import compas.geometry # noqa: F401
2-
import compas_model.elements # noqa: F401
1+
from typing import Optional
2+
33
from compas.colors import Color
4+
from compas.geometry import Transformation
45
from compas.scene import SceneObject
56
from compas.scene.descriptors.colordict import ColorDictAttribute
7+
from compas_model.elements import Element
68

79

810
class ElementObject(SceneObject):
@@ -50,37 +52,49 @@ class ElementObject(SceneObject):
5052
edgecolor = ColorDictAttribute()
5153
facecolor = ColorDictAttribute()
5254

53-
def __init__(self, element, **kwargs):
54-
# type: (compas_model.elements.Element, dict) -> None
55-
super(ElementObject, self).__init__(item=element, **kwargs)
55+
def __init__(
56+
self,
57+
element: Element,
58+
vertexcolor: Optional[Color] = Color.black(),
59+
edgecolor: Optional[Color] = Color.black(),
60+
facecolor: Optional[Color] = Color.white(),
61+
vertexsize: Optional[float] = 1.0,
62+
edgewidth: Optional[float] = 1.0,
63+
show_vertices: Optional[bool] = False,
64+
show_edges: Optional[bool] = True,
65+
show_faces: Optional[bool] = True,
66+
**kwargs,
67+
) -> None:
68+
super().__init__(item=element, **kwargs)
5669

5770
self._element = element
58-
self.vertexcolor = kwargs.get("vertexcolor", Color.black())
59-
self.edgecolor = kwargs.get("edgecolor", Color.black())
60-
self.facecolor = kwargs.get("facecolor", Color.white())
61-
self.vertexsize = kwargs.get("vertexsize", 1.0)
62-
self.edgewidth = kwargs.get("edgewidth", 1.0)
63-
self.show_vertices = kwargs.get("show_vertices", False)
64-
self.show_edges = kwargs.get("show_edges", True)
65-
self.show_faces = kwargs.get("show_faces", True)
71+
72+
self.vertexcolor = vertexcolor
73+
self.edgecolor = edgecolor
74+
self.facecolor = facecolor
75+
76+
self.vertexsize = vertexsize
77+
self.edgewidth = edgewidth
78+
79+
self.show_vertices = show_vertices
80+
self.show_edges = show_edges
81+
self.show_faces = show_faces
6682

6783
@property
68-
def element(self):
69-
# type: () -> compas_model.elements.Element
84+
def element(self) -> Element:
7085
return self._element
7186

7287
@element.setter
73-
def element(self, element):
88+
def element(self, element: Element) -> None:
7489
self._element = element
7590
self._transformation = None
7691

7792
@property
78-
def transformation(self):
79-
# type: () -> compas.geometry.Transformation | None
93+
def transformation(self) -> Transformation:
8094
return self._transformation
8195

8296
@transformation.setter
83-
def transformation(self, transformation):
97+
def transformation(self, transformation: Transformation) -> None:
8498
self._transformation = transformation
8599

86100
def draw(self):

src/compas_model/scene/modelobject.py

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,49 @@
1-
import compas.geometry # noqa: F401
2-
import compas_model.models # noqa: F401
1+
from typing import Optional
2+
3+
from compas.geometry import Transformation
34
from compas.scene import SceneObject
5+
from compas_model.models import Model
46

57

68
class ModelObject(SceneObject):
79
def __init__(
810
self,
9-
model, # type: compas_model.models.Model
10-
show_tree=False, # type: bool
11-
show_graph=False, # type: bool
12-
show_elements=True, # type: bool
13-
show_interactions=True, # type: bool
14-
show_element_faces=True, # type: bool
15-
**kwargs, # type: dict
16-
): # type: (...) -> None
17-
super(ModelObject, self).__init__(item=model, **kwargs)
11+
model: Model,
12+
show_elements: Optional[bool] = True,
13+
show_contacts: Optional[bool] = True,
14+
**kwargs,
15+
) -> None:
16+
super().__init__(item=model, **kwargs)
1817

1918
self._model = model
2019

21-
self.show_tree = show_tree
22-
self.show_graph = show_graph
2320
self.show_elements = show_elements
24-
self.show_interactions = show_interactions
25-
26-
elementkwargs = kwargs.copy()
27-
if "show_faces" in elementkwargs:
28-
del elementkwargs["show_faces"]
21+
self.show_contacts = show_contacts
2922

3023
for element in model.elements():
31-
self.add(element, show_faces=show_element_faces, **elementkwargs)
24+
self.add(element, **kwargs)
3225

33-
# for edge in model.graph.edges():
34-
# interaction = model.graph.edge_attribute(edge, name="interaction")
35-
# self.add(interaction, show_faces=show_interaction_faces, **kwargs)
26+
for contact in model.contacts():
27+
self.add(contact, **kwargs)
3628

3729
@property
38-
def model(self):
39-
# type: () -> compas_model.models.Model
30+
def model(self) -> Model:
4031
return self._model
4132

4233
@model.setter
43-
def model(self, model):
34+
def model(self, model: Model) -> None:
4435
self._model = model
4536
self._transformation = None
4637

4738
@property
48-
def transformation(self):
49-
# type: () -> compas.geometry.Transformation | None
39+
def transformation(self) -> Transformation:
5040
return self._transformation
5141

5242
@transformation.setter
53-
def transformation(self, transformation):
43+
def transformation(self, transformation: Transformation) -> None:
5444
self._transformation = transformation
5545

56-
def draw(self):
46+
def draw(self) -> None:
5747
"""draw the model.
5848
5949
Returns
@@ -63,7 +53,7 @@ def draw(self):
6353
"""
6454
raise NotImplementedError
6555

66-
def clear(self):
56+
def clear(self) -> None:
6757
"""Clear all components of the model.
6858
6959
Returns

0 commit comments

Comments
 (0)