Minor fixes to placement utilities for getting mapped item matrixes

This commit is contained in:
Dion Moult
2023-10-13 23:36:24 +11:00
parent 94db9ec522
commit 1f6d23c19c
@@ -118,9 +118,9 @@ def get_cartesiantransformationoperator3d(inst):
:rtype: np.array[np.array[float]]
"""
origin = np.array(inst.LocalOrigin.Coordinates)
axis1 = np.array((1., 0., 0.))
axis2 = np.array((0., 1., 0.))
axis3 = np.array((0., 0., 1.))
axis1 = np.array((1.0, 0.0, 0.0))
axis2 = np.array((0.0, 1.0, 0.0))
axis3 = np.array((0.0, 0.0, 1.0))
if inst.Axis1:
axis1[0:3] = inst.Axis1.DirectionRatios
@@ -129,18 +129,18 @@ def get_cartesiantransformationoperator3d(inst):
if inst.Axis3:
axis3[0:3] = inst.Axis3.DirectionRatios
m4 = ifcopenshell.util.placement.a2p(origin, axis3, axis1)
m4 = a2p(origin, axis3, axis1)
# Negate axis2 (introduce mirroring) when supplied axis2
# is opposite of constructed axis2, but remains orthogonal
if m4.T[1][0:3].dot(axis2) < 0.:
m4.T[1] *= -1.
if m4.T[1][0:3].dot(axis2) < 0.0:
m4.T[1] *= -1.0
scale1 = scale2 = scale3 = 1.
scale1 = scale2 = scale3 = 1.0
if inst.Scale:
scale1 = inst.Scale
if inst.is_a('IfcCartesianTransformationOperator3DnonUniform'):
if inst.is_a("IfcCartesianTransformationOperator3DnonUniform"):
scale2 = inst.Scale2 if inst.Scale2 is not None else scale1
scale3 = inst.Scale3 if inst.Scale3 is not None else scale1
@@ -163,8 +163,10 @@ def get_mappeditem_transformation(item):
:return: A 4x4 numpy transformation matrix
:rtype: np.array[np.array[float]]
"""
m4 = ifcopenshell.util.placement.get_axis2placement(item.MappingSource.MappingOrigin)
return get_cartesiantransformationoperator(item.MappingTarget) @ m4
m4 = get_axis2placement(item.MappingSource.MappingOrigin)
# TODO 2d
if item.MappingTarget.is_a("IfcCartesianTransformationOperator3D"):
return get_cartesiantransformationoperator3d(item.MappingTarget) @ m4
def get_storey_elevation(storey):