mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-10 09:48:32 +00:00
ShapeBuilder - added 3d rectangles and polylines support
This commit is contained in:
@@ -42,25 +42,48 @@ class ShapeBuilder:
|
|||||||
segments.append( (len(points),1) )
|
segments.append( (len(points),1) )
|
||||||
if position_offset:
|
if position_offset:
|
||||||
points = [Vector(p) + position_offset for p in points]
|
points = [Vector(p) + position_offset for p in points]
|
||||||
ifc_points = self.ifc.createIfcCartesianPointList2D(points)
|
|
||||||
|
dimensions = len(points[0])
|
||||||
|
if dimensions == 2:
|
||||||
|
ifc_points = self.ifc.createIfcCartesianPointList2D(points)
|
||||||
|
elif dimensions == 3:
|
||||||
|
ifc_points = self.ifc.createIfcCartesianPointList3D(points)
|
||||||
|
|
||||||
ifc_segments = [ self.ifc.createIfcLineIndex( segment ) for segment in segments]
|
ifc_segments = [ self.ifc.createIfcLineIndex( segment ) for segment in segments]
|
||||||
ifc_curve = self.ifc.createIfcIndexedPolyCurve(Points=ifc_points, Segments=ifc_segments)
|
ifc_curve = self.ifc.createIfcIndexedPolyCurve(Points=ifc_points, Segments=ifc_segments)
|
||||||
return ifc_curve
|
return ifc_curve
|
||||||
|
|
||||||
def get_rectangle_coords(self,
|
def get_rectangle_coords(self,
|
||||||
size:Vector = Vector( (1., 1.) ).freeze(),
|
size:Vector = Vector( (1., 1.) ).freeze(),
|
||||||
position:Vector = Vector( (0., 0.) ).freeze()):
|
position:Vector = None):
|
||||||
|
|
||||||
|
dimensions = len(size)
|
||||||
|
|
||||||
|
if not position:
|
||||||
|
position = Vector([0]*dimensions)
|
||||||
|
|
||||||
|
# adds support both 2d and 3d sizes
|
||||||
|
non_empty_coords = [i for i, v in enumerate(size) if v]
|
||||||
|
id_matrix = Matrix.Identity(dimensions)
|
||||||
|
|
||||||
points = [
|
points = [
|
||||||
position,
|
position,
|
||||||
position + size * Vector( (0, 1)),
|
position + size * id_matrix[non_empty_coords[0]],
|
||||||
position + size,
|
position + size,
|
||||||
position + size * Vector( (1, 0))
|
position + size * id_matrix[non_empty_coords[1]]
|
||||||
]
|
]
|
||||||
return points
|
return points
|
||||||
|
|
||||||
def rectangle(self,
|
def rectangle(self,
|
||||||
size:Vector = Vector( (1., 1.) ).freeze(),
|
size:Vector = Vector( (1., 1.) ).freeze(),
|
||||||
position:Vector = Vector( (0., 0.) ).freeze()):
|
position:Vector = None):
|
||||||
|
"""
|
||||||
|
function supports both 2d and 3d rectangle sizes
|
||||||
|
|
||||||
|
if `position` not specified zero-vector will be used
|
||||||
|
|
||||||
|
returns IfcIndexedPolyCurve
|
||||||
|
"""
|
||||||
# < IfcIndexedPolyCurve
|
# < IfcIndexedPolyCurve
|
||||||
return self.polyline(self.get_rectangle_coords(size, position), closed=True)
|
return self.polyline(self.get_rectangle_coords(size, position), closed=True)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user