mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-19 14:41:25 +00:00
Reuse builder.create_axis2_placement_3d
This commit is contained in:
@@ -40,6 +40,7 @@ from mathutils import Vector, Matrix
|
||||
from bonsai.bim.ifc import IfcStore
|
||||
from bonsai.bim.module.model.decorator import ProfileDecorator
|
||||
from bonsai.bim.module.boundary.decorator import BoundaryDecorator
|
||||
from ifcopenshell.util.shape_builder import ShapeBuilder
|
||||
import bonsai.core
|
||||
import bonsai.core.geometry
|
||||
from typing import Union, Optional
|
||||
@@ -1058,15 +1059,11 @@ class AddBoundary(bpy.types.Operator, tool.Ifc.Operator):
|
||||
|
||||
self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
|
||||
tool.Model.unit_scale = self.unit_scale
|
||||
builder = ShapeBuilder(tool.Ifc.get())
|
||||
|
||||
surface = tool.Ifc.get().createIfcCurveBoundedPlane()
|
||||
surface.BasisSurface = tool.Ifc.get().createIfcPlane(
|
||||
tool.Ifc.get().createIfcAxis2Placement3D(
|
||||
tool.Ifc.get().createIfcCartesianPoint([o / self.unit_scale for o in p1]),
|
||||
tool.Ifc.get().createIfcDirection([float(o) for o in z_axis]),
|
||||
tool.Ifc.get().createIfcDirection([float(o) for o in x_axis]),
|
||||
)
|
||||
)
|
||||
placement = builder.create_axis2_placement_3d([o / self.unit_scale for o in p1], z_axis, x_axis)
|
||||
surface.BasisSurface = tool.Ifc.get().create_entity("IfcPlane", placement)
|
||||
|
||||
if tool.Ifc.get().schema != "IFC2X3":
|
||||
points = [tool.Model.convert_si_to_unit(list(co)) for co in polygon.exterior.coords]
|
||||
|
||||
@@ -28,6 +28,7 @@ import bonsai.tool as tool
|
||||
from math import pi, pow
|
||||
from mathutils import Vector, Matrix, geometry
|
||||
from typing import Union, Any, TypeVar, Optional
|
||||
from ifcopenshell.util.shape_builder import ShapeBuilder
|
||||
|
||||
T = TypeVar("T")
|
||||
|
||||
@@ -35,6 +36,7 @@ T = TypeVar("T")
|
||||
class Helper:
|
||||
def __init__(self, file: ifcopenshell.file):
|
||||
self.file = file
|
||||
self.builder = ShapeBuilder(file)
|
||||
self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(self.file)
|
||||
|
||||
# We can detect a rectangular extrusion by picking any face, then find an
|
||||
@@ -340,8 +342,10 @@ class Helper:
|
||||
def create_extruded_area_solid(
|
||||
self, mesh: bpy.types.Mesh, extrusion_indices: list[int], profile_def: dict[str, Any]
|
||||
) -> ifcopenshell.entity_instance:
|
||||
position = self.create_ifc_axis_2_placement_3d(
|
||||
profile_def["curve_ucs"]["center"], profile_def["curve_ucs"]["z_axis"], profile_def["curve_ucs"]["x_axis"]
|
||||
position = self.builder.create_axis2_placement_3d(
|
||||
self.convert_si_to_unit(profile_def["curve_ucs"]["center"]),
|
||||
profile_def["curve_ucs"]["z_axis"],
|
||||
profile_def["curve_ucs"]["x_axis"],
|
||||
)
|
||||
direction = self.get_extrusion_direction(mesh, extrusion_indices, profile_def["curve_ucs"])
|
||||
unit_direction = direction.normalized()
|
||||
@@ -505,12 +509,3 @@ class Helper:
|
||||
return self.file.createIfcAxis2Placement2D(
|
||||
self.create_cartesian_point(point.x, point.y), self.file.createIfcDirection((forward.x, forward.y))
|
||||
)
|
||||
|
||||
def create_ifc_axis_2_placement_3d(
|
||||
self, point: Vector, up: Vector, forward: Vector
|
||||
) -> ifcopenshell.entity_instance:
|
||||
return self.file.createIfcAxis2Placement3D(
|
||||
self.create_cartesian_point(point.x, point.y, point.z),
|
||||
self.file.createIfcDirection((up.x, up.y, up.z)),
|
||||
self.file.createIfcDirection((forward.x, forward.y, forward.z)),
|
||||
)
|
||||
|
||||
@@ -58,6 +58,7 @@ from fractions import Fraction
|
||||
from typing import Optional, Union, Any, Literal, TYPE_CHECKING, NamedTuple
|
||||
from collections.abc import Iterable, Sequence
|
||||
from pathlib import Path
|
||||
from ifcopenshell.util.shape_builder import ShapeBuilder
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from bonsai.bim.module.drawing.prop import (
|
||||
@@ -778,11 +779,8 @@ class Drawing(bonsai.core.tool.Drawing):
|
||||
@classmethod
|
||||
def add_literal(cls, **attributes: str) -> ifcopenshell.entity_instance:
|
||||
ifc_file = tool.Ifc.get()
|
||||
origin = ifc_file.createIfcAxis2Placement3D(
|
||||
ifc_file.createIfcCartesianPoint((0.0, 0.0, 0.0)),
|
||||
ifc_file.createIfcDirection((0.0, 0.0, 1.0)),
|
||||
ifc_file.createIfcDirection((1.0, 0.0, 0.0)),
|
||||
)
|
||||
builder = ShapeBuilder(ifc_file)
|
||||
origin = builder.create_axis2_placement_3d()
|
||||
ifc_literal = ifc_file.create_entity(
|
||||
"IfcTextLiteralWithExtent",
|
||||
attributes.get("Literal", "Literal"),
|
||||
|
||||
@@ -238,6 +238,8 @@ class Model(bonsai.core.tool.Model):
|
||||
|
||||
@classmethod
|
||||
def export_surface(cls, obj: bpy.types.Object) -> Union[ifcopenshell.entity_instance, None]:
|
||||
ifc_file = tool.Ifc.get()
|
||||
builder = ShapeBuilder(ifc_file)
|
||||
p1, p2, p3 = [v.co.copy() for v in obj.data.vertices[0:3]]
|
||||
|
||||
edge1 = p2 - p1
|
||||
@@ -271,13 +273,8 @@ class Model(bonsai.core.tool.Model):
|
||||
cls.bm.edges.ensure_lookup_table()
|
||||
|
||||
surface = tool.Ifc.get().createIfcCurveBoundedPlane()
|
||||
surface.BasisSurface = tool.Ifc.get().createIfcPlane(
|
||||
tool.Ifc.get().createIfcAxis2Placement3D(
|
||||
tool.Ifc.get().createIfcCartesianPoint([o / cls.unit_scale for o in p1]),
|
||||
tool.Ifc.get().createIfcDirection([float(o) for o in z_axis]),
|
||||
tool.Ifc.get().createIfcDirection([float(o) for o in x_axis]),
|
||||
)
|
||||
)
|
||||
placement = builder.create_axis2_placement_3d([o / cls.unit_scale for o in p1], z_axis, x_axis)
|
||||
surface.BasisSurface = ifc_file.create_entity("IfcPlane", placement)
|
||||
|
||||
surface.OuterBoundary = tool.Ifc.get().add(profile_def.OuterCurve)
|
||||
if profile_def.is_a("IfcArbitraryProfileDefWithVoids"):
|
||||
@@ -2124,13 +2121,8 @@ class Model(bonsai.core.tool.Model):
|
||||
@classmethod
|
||||
def add_extrusion_position(cls, extrusion: ifcopenshell.entity_instance, position: Vector) -> None:
|
||||
ifc_file = tool.Ifc.get()
|
||||
|
||||
new_position = ifc_file.createIfcAxis2Placement3D(
|
||||
ifc_file.createIfcCartesianPoint(position),
|
||||
ifc_file.createIfcDirection((0.0, 0.0, 1.0)),
|
||||
ifc_file.createIfcDirection((1.0, 0.0, 0.0)),
|
||||
)
|
||||
|
||||
builder = ShapeBuilder(ifc_file)
|
||||
new_position = builder.create_axis2_placement_3d(position)
|
||||
extrusion.Position = new_position
|
||||
|
||||
@classmethod
|
||||
|
||||
Reference in New Issue
Block a user