mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-10 01:41:57 +00:00
248 lines
9.0 KiB
Python
248 lines
9.0 KiB
Python
import ifcopenshell
|
|
import ifcopenshell.api.context
|
|
import ifcopenshell.api.geometry
|
|
import ifcopenshell.api.project
|
|
import ifcopenshell.api.root
|
|
import ifcopenshell.api.unit
|
|
from ifcopenshell.util.shape_builder import ShapeBuilder
|
|
from mathutils import Vector
|
|
|
|
V = lambda *x: Vector([float(i) for i in x])
|
|
|
|
|
|
# TODO: move examples to more suitable place
|
|
def simple_uses():
|
|
ifc_file = ifcopenshell.file()
|
|
builder = ShapeBuilder(ifc_file)
|
|
triangle_curve = builder.polyline(((0.0, 0.0), (1.0, 2.0), (2.0, 0.0)), closed=True)
|
|
print(triangle_curve)
|
|
|
|
rectangle_curve = builder.rectangle()
|
|
print(rectangle_curve)
|
|
|
|
circle_curve = builder.circle()
|
|
print(circle_curve)
|
|
|
|
translated_rect = builder.translate(rectangle_curve, Vector((2.5, 2.5)), create_copy=True)
|
|
print(translated_rect)
|
|
|
|
rotated_triangle = builder.rotate(
|
|
triangle_curve, 90, pivot_point=Vector((1.0, 1.0)), counter_clockwise=True, create_copy=True
|
|
)
|
|
print(rotated_triangle)
|
|
|
|
a, b = builder.translate([rectangle_curve, circle_curve], Vector((5.0, 5.0)), create_copy=True)
|
|
print(f"Multiple translated objects: {a}, {b}")
|
|
|
|
c, d = builder.rotate([a, b], 90, pivot_point=Vector((0.0, 0.0)), counter_clockwise=False, create_copy=True)
|
|
print(f"Multiple rotated objects: {c}, {d}")
|
|
|
|
mirrored_objects = builder.mirror(
|
|
[a, b],
|
|
mirror_axes=[Vector((1.0, 0.0)), Vector((0.0, 1.0)), Vector((1.0, 1.0))],
|
|
mirror_point=Vector((3.0, 3.0)),
|
|
create_copy=True,
|
|
)
|
|
print(f"Multiple mirrored objects: {mirrored_objects}")
|
|
|
|
rotated_circle = builder.rotate(
|
|
builder.translate(circle_curve, Vector((5.0, 5.0)), create_copy=True),
|
|
90,
|
|
pivot_point=Vector((0.0, 0.0)),
|
|
counter_clockwise=True,
|
|
create_copy=True,
|
|
)
|
|
print(rotated_circle)
|
|
|
|
profile = builder.profile(
|
|
rectangle_curve, "test_profile", inner_curves=[builder.circle(center=Vector((0.5, 0.5)), radius=0.2)]
|
|
)
|
|
print(profile)
|
|
|
|
extruded_area = builder.extrude(profile, 5.0)
|
|
print(extruded_area)
|
|
|
|
ifc_file.write("tmp.ifc")
|
|
|
|
|
|
def generate_desk_test():
|
|
ifc_file = ifcopenshell.file()
|
|
desks = [
|
|
generate_simple_desk(ifc_file, 1000, 600, 730),
|
|
generate_simple_desk(ifc_file, 1200, 700, 750),
|
|
generate_simple_desk(ifc_file, 1500, 800, 750),
|
|
]
|
|
print(f"desks: {desks}")
|
|
|
|
table = generate_table(ifc_file, 1000, 600, 730)
|
|
print(f"table: {table}")
|
|
|
|
ifc_file.write("tmp.ifc")
|
|
|
|
|
|
def mirror_placement_test():
|
|
ifc_file = ifcopenshell.api.project.create_file()
|
|
project = ifcopenshell.api.root.create_entity(
|
|
ifc_file, ifc_class="IfcProject", name=f"Non-structural assets library"
|
|
)
|
|
library = ifcopenshell.api.root.create_entity(
|
|
ifc_file, ifc_class="IfcProjectLibrary", name=f"Non-structural assets library"
|
|
)
|
|
ifcopenshell.api.project.assign_declaration(ifc_file, definitions=[library], relating_context=project)
|
|
unit = ifcopenshell.api.unit.add_si_unit(ifc_file, unit_type="LENGTHUNIT", prefix="MILLI")
|
|
ifcopenshell.api.unit.assign_unit(ifc_file, units=[unit])
|
|
model = ifcopenshell.api.context.add_context(ifc_file, context_type="Model")
|
|
plan = ifcopenshell.api.context.add_context(ifc_file, context_type="Plan")
|
|
|
|
representations = {
|
|
"body": ifcopenshell.api.context.add_context(
|
|
ifc_file,
|
|
context_type="Model",
|
|
context_identifier="Body",
|
|
target_view="MODEL_VIEW",
|
|
parent=model,
|
|
),
|
|
"annotation": ifcopenshell.api.context.add_context(
|
|
ifc_file,
|
|
context_type="Plan",
|
|
context_identifier="Annotation",
|
|
target_view="PLAN_VIEW",
|
|
parent=plan,
|
|
),
|
|
}
|
|
|
|
builder = ShapeBuilder(ifc_file)
|
|
|
|
width = 15.0
|
|
height = 5.0
|
|
size = V(width, height)
|
|
offset = 2.5
|
|
second_size = V(offset, offset)
|
|
|
|
rect = builder.rectangle(size=size)
|
|
rect_small = builder.rectangle(size=size - second_size, position=second_size / 2)
|
|
|
|
rect_profile = builder.profile(rect, inner_curves=rect_small)
|
|
|
|
pl = builder.extrude(
|
|
rect_profile, magnitude=7.0, position_z_axis=V(0, -1, 0), extrusion_vector=V(0, 0, -1), position=V(0, 5, 0)
|
|
)
|
|
|
|
rect = builder.rectangle(size=size)
|
|
|
|
back_wall = builder.extrude(
|
|
rect, magnitude=2.0, position_z_axis=V(0, -1, 0), extrusion_vector=V(0, 0, -1), position=V(0, 1, 0)
|
|
)
|
|
|
|
items_3d = [pl, back_wall]
|
|
builder.mirror(items_3d, mirror_axes=V(0, 1))
|
|
|
|
representation_3d = builder.get_representation(context=representations["body"], items=items_3d)
|
|
|
|
element = ifcopenshell.api.root.create_entity(ifc_file, ifc_class="IfcFurnitureType", name="test")
|
|
ifcopenshell.api.geometry.assign_representation(ifc_file, product=element, representation=representation_3d)
|
|
ifcopenshell.api.project.assign_declaration(ifc_file, definitions=[element], relating_context=library)
|
|
|
|
ifc_file.write("tmp.ifc")
|
|
|
|
|
|
def curve_between_two_points_test():
|
|
ifc_file = ifcopenshell.api.project.create_file()
|
|
project = ifcopenshell.api.root.create_entity(
|
|
ifc_file, ifc_class="IfcProject", name=f"Non-structural assets library"
|
|
)
|
|
library = ifcopenshell.api.root.create_entity(
|
|
ifc_file, ifc_class="IfcProjectLibrary", name=f"Non-structural assets library"
|
|
)
|
|
ifcopenshell.api.project.assign_declaration(ifc_file, definitions=[library], relating_context=project)
|
|
unit = ifcopenshell.api.unit.add_si_unit(ifc_file, unit_type="LENGTHUNIT", prefix="MILLI")
|
|
ifcopenshell.api.unit.assign_unit(ifc_file, units=[unit])
|
|
model = ifcopenshell.api.context.add_context(ifc_file, context_type="Model")
|
|
plan = ifcopenshell.api.context.add_context(ifc_file, context_type="Plan")
|
|
|
|
representations = {
|
|
"body": ifcopenshell.api.context.add_context(
|
|
ifc_file,
|
|
context_type="Model",
|
|
context_identifier="Body",
|
|
target_view="MODEL_VIEW",
|
|
parent=model,
|
|
),
|
|
"annotation": ifcopenshell.api.context.add_context(
|
|
ifc_file,
|
|
context_type="Plan",
|
|
context_identifier="Annotation",
|
|
target_view="PLAN_VIEW",
|
|
parent=plan,
|
|
),
|
|
}
|
|
|
|
builder = ShapeBuilder(ifc_file)
|
|
|
|
width, depth = (200.0, 200.0)
|
|
|
|
curve_coords = (
|
|
(V(0, depth), V(-width, 0)), # ccw
|
|
(V(0, depth), V(width, 0)), # cw
|
|
(V(0, -depth), V(width, 0)), # ccw
|
|
(V(0, -depth), V(-width, 0)), # cw
|
|
(V(+width / 2, 0), V(0, depth)), # ccw
|
|
(V(-width / 2, 0), V(0, depth)), # cw
|
|
(V(-width / 2, 0), V(0, -depth)), # ccw
|
|
(V(+width / 2, 0), V(0, -depth)), # cw
|
|
(V(0, depth / 2), V(+width, 0)), # cw
|
|
(V(0, depth / 2), V(-width, 0)), # ccw
|
|
(V(0, -depth / 2), V(+width, 0)), # ccw
|
|
(V(0, -depth / 2), V(-width, 0)), # cw
|
|
)
|
|
items_2d = [builder.curve_between_two_points(c) for c in curve_coords]
|
|
|
|
representation_2d = builder.get_representation(context=representations["annotation"], items=items_2d)
|
|
|
|
print(representation_2d)
|
|
element = ifcopenshell.api.root.create_entity(ifc_file, ifc_class="IfcFurnitureType", name="test")
|
|
ifcopenshell.api.geometry.assign_representation(ifc_file, product=element, representation=representation_2d)
|
|
ifcopenshell.api.project.assign_declaration(ifc_file, definitions=[element], relating_context=library)
|
|
|
|
ifc_file.write("tmp.ifc")
|
|
|
|
|
|
def generate_simple_desk(ifc_file, width, depth, height):
|
|
# > width, depth, height in mm
|
|
width, depth, height = [i / 1000 for i in (width, depth, height)]
|
|
builder = ShapeBuilder(ifc_file)
|
|
rectangle_curve = builder.rectangle(size=Vector((width, depth)))
|
|
profile = builder.profile(rectangle_curve, "simple_desk")
|
|
extruded_area = builder.extrude(profile, height)
|
|
return extruded_area
|
|
|
|
|
|
def generate_table(ifc_file, width, depth, height, countertop_thickness=20, leg_size=40, leg_offset=50):
|
|
# > width, depth, height in mm
|
|
width, depth, height, countertop_thickness, leg_size, leg_offset = [
|
|
i / 1000 for i in (width, depth, height, countertop_thickness, leg_size, leg_offset)
|
|
]
|
|
builder = ShapeBuilder(ifc_file)
|
|
|
|
countertop_curve = builder.rectangle(size=Vector((width, depth)))
|
|
countertop_profile = builder.profile(countertop_curve, "table_countertop")
|
|
countertop = builder.extrude(
|
|
countertop_profile, countertop_thickness, position=V(0, 0, height - countertop_thickness)
|
|
)
|
|
|
|
leg_curve = builder.rectangle(size=V(leg_size, leg_size))
|
|
builder.translate(leg_curve, Vector((leg_offset, leg_offset)))
|
|
legs_curves = [leg_curve] + builder.mirror(
|
|
leg_curve, mirror_axes=[V(1, 0), V(0, 1), V(1, 1)], mirror_point=V(width / 2, depth / 2), create_copy=True
|
|
)
|
|
legs_profiles = [builder.profile(leg, "table_leg") for leg in legs_curves]
|
|
legs = [builder.extrude(leg, height - countertop_thickness) for leg in legs_profiles]
|
|
return (countertop, legs)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
simple_uses()
|
|
# main()
|
|
# placement_mirror_test()
|
|
# mirror_placement_test()
|