Reimplement profile cardinal points 1-9 with new profile engine

This commit is contained in:
Dion Moult
2022-09-24 15:42:50 +10:00
parent 7545313dee
commit 56f4b72161
2 changed files with 91 additions and 17 deletions
@@ -16,6 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell.geom
import ifcopenshell.util.unit
@@ -43,10 +44,11 @@ class Usecase:
)
def create_item(self):
point = self.get_point()
extrusion = self.file.createIfcExtrudedAreaSolid(
self.settings["profile"],
self.file.createIfcAxis2Placement3D(
self.file.createIfcCartesianPoint((0.0, 0.0, 0.0)),
point,
self.file.createIfcDirection((0.0, 0.0, 1.0)),
self.file.createIfcDirection((1.0, 0.0, 0.0)),
),
@@ -81,3 +83,85 @@ class Usecase:
def convert_si_to_unit(self, co):
return co / self.settings["unit_scale"]
def get_point(self):
if not self.settings["cardinal_point"]:
return self.file.createIfcCartesianPoint((0.0, 0.0, 0.0))
elif self.settings["cardinal_point"] == 1:
return self.file.createIfcCartesianPoint((-self.get_x() / 2, self.get_y() / 2, 0.0))
elif self.settings["cardinal_point"] == 2:
return self.file.createIfcCartesianPoint((0.0, self.get_y() / 2, 0.0))
elif self.settings["cardinal_point"] == 3:
return self.file.createIfcCartesianPoint((self.get_x() / 2, self.get_y() / 2, 0.0))
elif self.settings["cardinal_point"] == 4:
return self.file.createIfcCartesianPoint((-self.get_x() / 2, 0.0, 0.0))
elif self.settings["cardinal_point"] == 5:
return self.file.createIfcCartesianPoint((0.0, 0.0, 0.0))
elif self.settings["cardinal_point"] == 6:
return self.file.createIfcCartesianPoint((self.get_x() / 2, 0.0, 0.0))
elif self.settings["cardinal_point"] == 7:
return self.file.createIfcCartesianPoint((-self.get_x() / 2, -self.get_y() / 2, 0.0))
elif self.settings["cardinal_point"] == 8:
return self.file.createIfcCartesianPoint((0.0, -self.get_y() / 2, 0.0))
elif self.settings["cardinal_point"] == 9:
return self.file.createIfcCartesianPoint((self.get_x() / 2, -self.get_y() / 2, 0.0))
# TODO other cardinal points
return self.file.createIfcCartesianPoint((0.0, 0.0, 0.0))
def get_x(self):
if self.settings["profile"].is_a("IfcAsymmetricIShapeProfileDef"):
return self.settings["profile"].OverallWidth
elif self.settings["profile"].is_a("IfcCShapeProfileDef"):
return self.settings["profile"].Width
elif self.settings["profile"].is_a("IfcCircleProfileDef"):
return self.settings["profile"].Radius * 2
elif self.settings["profile"].is_a("IfcEllipseProfileDef"):
return self.settings["profile"].SemiAxis1 * 2
elif self.settings["profile"].is_a("IfcIShapeProfileDef"):
return self.settings["profile"].OverallWidth
elif self.settings["profile"].is_a("IfcLShapeProfileDef"):
return self.settings["profile"].Width
elif self.settings["profile"].is_a("IfcRectangleProfileDef"):
return self.settings["profile"].XDim
elif self.settings["profile"].is_a("IfcTShapeProfileDef"):
return self.settings["profile"].FlangeWidth
elif self.settings["profile"].is_a("IfcUShapeProfileDef"):
return self.settings["profile"].FlangeWidth
elif self.settings["profile"].is_a("IfcZShapeProfileDef"):
return (self.settings["profile"].FlangeWidth * 2) - self.settings["profile"].WebThickness
else:
settings = ifcopenshell.geom.settings()
settings.set(settings.INCLUDE_CURVES, True)
shape = ifcopenshell.geom.create_shape(settings, element)
x = [verts[i] for i in range(0, len(shape.verts), 3)]
return self.convert_si_to_unit(max(x) - min(x))
return 0.0
def get_y(self):
if self.settings["profile"].is_a("IfcAsymmetricIShapeProfileDef"):
return self.settings["profile"].OverallDepth
elif self.settings["profile"].is_a("IfcCShapeProfileDef"):
return self.settings["profile"].Depth
elif self.settings["profile"].is_a("IfcCircleProfileDef"):
return self.settings["profile"].Radius * 2
elif self.settings["profile"].is_a("IfcEllipseProfileDef"):
return self.settings["profile"].SemiAxis2 * 2
elif self.settings["profile"].is_a("IfcIShapeProfileDef"):
return self.settings["profile"].OverallDepth
elif self.settings["profile"].is_a("IfcLShapeProfileDef"):
return self.settings["profile"].Depth
elif self.settings["profile"].is_a("IfcRectangleProfileDef"):
return self.settings["profile"].YDim
elif self.settings["profile"].is_a("IfcTShapeProfileDef"):
return self.settings["profile"].Depth
elif self.settings["profile"].is_a("IfcUShapeProfileDef"):
return self.settings["profile"].Depth
elif self.settings["profile"].is_a("IfcZShapeProfileDef"):
return self.settings["profile"].Depth
else:
settings = ifcopenshell.geom.settings()
settings.set(settings.INCLUDE_CURVES, True)
shape = ifcopenshell.geom.create_shape(settings, element)
y = [verts[i + 1] for i in range(0, len(shape.verts), 3)]
return self.convert_si_to_unit(max(y) - min(y))
return 0.0