Skip to content

Commit c38d1c3

Browse files
committed
Add duplicate element method
1 parent 4c9c0d2 commit c38d1c3

2 files changed

Lines changed: 28 additions & 0 deletions

File tree

src/compas_cadwork/elements/element.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from typing import TYPE_CHECKING
55
from typing import ClassVar
66
from typing import Final
7+
from typing import Self
78
from typing import final
89
from uuid import UUID
910

@@ -269,6 +270,24 @@ def translate(self, vector: Vector) -> None:
269270
"""
270271
ec.move_element([self.id], compas_to_cwpoint(vector))
271272

273+
def duplicate(self, vector: Vector) -> Self:
274+
"""Duplicate element by the given vector.
275+
276+
Parameters
277+
----------
278+
vector : Vector
279+
The vector by which to duplicate the element.
280+
281+
Returns
282+
-------
283+
Self
284+
New element.
285+
"""
286+
new_element_ids = ec.copy_elements([self.id], compas_to_cwpoint(vector))
287+
if len(new_element_ids) != 1:
288+
raise RuntimeError(f"Failed to copy Cadwork element with ID {self.id}")
289+
return self.__class__(new_element_ids[0])
290+
272291
def delete(self) -> None:
273292
"""Delete element.
274293

tests/compas_cadwork/elements/test_element.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,15 @@ def test_translates_element(cadwork) -> None:
363363
cadwork.ec.move_element.assert_called_once_with([123], cadwork.cadwork.point_3d(100.0, 200.0, 300.0))
364364

365365

366+
def test_duplicates_element(cadwork) -> None:
367+
cadwork.ec.copy_elements.return_value = [124]
368+
element = Element(123)
369+
new_element = element.duplicate(Vector(100.0, 200.0, 300.0))
370+
assert new_element is not element
371+
assert new_element.id == 124
372+
cadwork.ec.copy_elements.assert_called_once_with([123], cadwork.cadwork.point_3d(100.0, 200.0, 300.0))
373+
374+
366375
def test_deletes_element(cadwork) -> None:
367376
element = Element(123)
368377
element.delete()

0 commit comments

Comments
 (0)