mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-12 14:33:28 +00:00
WIP implement local placement tree. See #1222.
This commit is contained in:
@@ -25,6 +25,7 @@ class AssignObject(bpy.types.Operator):
|
|||||||
"relating_object": self.file.by_id(relating_object.BIMObjectProperties.ifc_definition_id),
|
"relating_object": self.file.by_id(relating_object.BIMObjectProperties.ifc_definition_id),
|
||||||
},
|
},
|
||||||
).execute()
|
).execute()
|
||||||
|
bpy.ops.bim.edit_object_placement(obj=related_object.name)
|
||||||
Data.load(props.ifc_definition_id)
|
Data.load(props.ifc_definition_id)
|
||||||
bpy.ops.bim.disable_editing_aggregate(obj=related_object.name)
|
bpy.ops.bim.disable_editing_aggregate(obj=related_object.name)
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import bpy
|
|||||||
from . import ui, operator
|
from . import ui, operator
|
||||||
|
|
||||||
classes = (
|
classes = (
|
||||||
|
operator.EditObjectPlacement,
|
||||||
operator.AddRepresentation,
|
operator.AddRepresentation,
|
||||||
operator.SwitchRepresentation,
|
operator.SwitchRepresentation,
|
||||||
operator.RemoveRepresentation,
|
operator.RemoveRepresentation,
|
||||||
@@ -14,8 +15,8 @@ classes = (
|
|||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
pass
|
bpy.types.OBJECT_PT_transform.append(ui.BIM_PT_transform)
|
||||||
|
|
||||||
|
|
||||||
def unregister():
|
def unregister():
|
||||||
pass
|
bpy.types.OBJECT_PT_transform.remove(ui.BIM_PT_transform)
|
||||||
|
|||||||
+32
-5
@@ -1,4 +1,5 @@
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
|
import ifcopenshell.util.element
|
||||||
import ifcopenshell.util.placement
|
import ifcopenshell.util.placement
|
||||||
|
|
||||||
|
|
||||||
@@ -13,12 +14,38 @@ class Usecase:
|
|||||||
if not hasattr(self.settings["product"], "ObjectPlacement"):
|
if not hasattr(self.settings["product"], "ObjectPlacement"):
|
||||||
return
|
return
|
||||||
self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(self.file)
|
self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(self.file)
|
||||||
if not self.settings["product"].ObjectPlacement:
|
|
||||||
placement_rel_to = None
|
dependent_objects = []
|
||||||
else:
|
if self.settings["product"].ObjectPlacement:
|
||||||
placement_rel_to = self.settings["product"].ObjectPlacement.PlacementRelTo
|
for referenced_placement in self.settings["product"].ObjectPlacement.ReferencedByPlacements:
|
||||||
|
for placed_obj in referenced_placement.PlacesObject:
|
||||||
|
dependent_objects.append(
|
||||||
|
{
|
||||||
|
"product": placed_obj,
|
||||||
|
"matrix": ifcopenshell.util.placement.get_local_placement(referenced_placement),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
placement_rel_to = None
|
||||||
|
if hasattr(self.settings["product"], "ContainedInStructure") and self.settings["product"].ContainedInStructure:
|
||||||
|
placement_rel_to = self.settings["product"].ContainedInStructure[0].RelatingStructure.ObjectPlacement
|
||||||
|
elif hasattr(self.settings["product"], "Decomposes") and self.settings["product"].Decomposes:
|
||||||
|
relating_object = self.settings["product"].Decomposes[0].RelatingObject
|
||||||
|
placement_rel_to = relating_object.ObjectPlacement if hasattr(relating_object, "ObjectPlacement") else None
|
||||||
|
|
||||||
placement = self.file.createIfcLocalPlacement(placement_rel_to, self.get_relative_placement(placement_rel_to))
|
placement = self.file.createIfcLocalPlacement(placement_rel_to, self.get_relative_placement(placement_rel_to))
|
||||||
|
if self.settings["product"].ObjectPlacement:
|
||||||
|
for inverse in self.file.get_inverse(self.settings["product"]):
|
||||||
|
ifcopenshell.util.element.replace_attribute(
|
||||||
|
inverse, self.settings["product"].ObjectPlacement, placement
|
||||||
|
)
|
||||||
|
self.file.remove(self.settings["product"].ObjectPlacement)
|
||||||
self.settings["product"].ObjectPlacement = placement
|
self.settings["product"].ObjectPlacement = placement
|
||||||
|
|
||||||
|
for settings in dependent_objects:
|
||||||
|
self.settings = settings
|
||||||
|
self.execute()
|
||||||
|
|
||||||
return placement
|
return placement
|
||||||
|
|
||||||
def get_relative_placement(self, placement_rel_to):
|
def get_relative_placement(self, placement_rel_to):
|
||||||
@@ -34,7 +61,7 @@ class Usecase:
|
|||||||
z = np.array((m[0][2], m[1][2], m[2][2]))
|
z = np.array((m[0][2], m[1][2], m[2][2]))
|
||||||
o = np.array((m[0][3], m[1][3], m[2][3]))
|
o = np.array((m[0][3], m[1][3], m[2][3]))
|
||||||
object_matrix = ifcopenshell.util.placement.a2p(o, z, x)
|
object_matrix = ifcopenshell.util.placement.a2p(o, z, x)
|
||||||
relative_placement_matrix = relating_object_matrix @ object_matrix
|
relative_placement_matrix = np.linalg.inv(relating_object_matrix) @ object_matrix
|
||||||
return self.create_ifc_axis_2_placement_3d(
|
return self.create_ifc_axis_2_placement_3d(
|
||||||
relative_placement_matrix[:, 3][0:3],
|
relative_placement_matrix[:, 3][0:3],
|
||||||
relative_placement_matrix[:, 2][0:3],
|
relative_placement_matrix[:, 2][0:3],
|
||||||
@@ -2,7 +2,7 @@ import bpy
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
import ifcopenshell
|
import ifcopenshell
|
||||||
import logging
|
import logging
|
||||||
import blenderbim.bim.module.geometry.add_object_placement as add_object_placement
|
import blenderbim.bim.module.geometry.edit_object_placement as edit_object_placement
|
||||||
import blenderbim.bim.module.geometry.add_representation as add_representation
|
import blenderbim.bim.module.geometry.add_representation as add_representation
|
||||||
import blenderbim.bim.module.geometry.assign_styles as assign_styles
|
import blenderbim.bim.module.geometry.assign_styles as assign_styles
|
||||||
import blenderbim.bim.module.geometry.assign_representation as assign_representation
|
import blenderbim.bim.module.geometry.assign_representation as assign_representation
|
||||||
@@ -12,6 +12,24 @@ from blenderbim.bim import import_ifc
|
|||||||
from blenderbim.bim.module.geometry.data import Data
|
from blenderbim.bim.module.geometry.data import Data
|
||||||
|
|
||||||
|
|
||||||
|
class EditObjectPlacement(bpy.types.Operator):
|
||||||
|
bl_idname = "bim.edit_object_placement"
|
||||||
|
bl_label = "Edit Object Placement"
|
||||||
|
obj: bpy.props.StringProperty()
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object
|
||||||
|
self.file = IfcStore.get_file()
|
||||||
|
edit_object_placement.Usecase(
|
||||||
|
self.file,
|
||||||
|
{
|
||||||
|
"product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id),
|
||||||
|
"matrix": np.array(obj.matrix_world),
|
||||||
|
},
|
||||||
|
).execute()
|
||||||
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
class AddRepresentation(bpy.types.Operator):
|
class AddRepresentation(bpy.types.Operator):
|
||||||
bl_idname = "bim.add_representation"
|
bl_idname = "bim.add_representation"
|
||||||
bl_label = "Add Representation"
|
bl_label = "Add Representation"
|
||||||
@@ -22,13 +40,7 @@ class AddRepresentation(bpy.types.Operator):
|
|||||||
self.file = IfcStore.get_file()
|
self.file = IfcStore.get_file()
|
||||||
self.context_id = bpy.context.scene.BIMProperties.contexts
|
self.context_id = bpy.context.scene.BIMProperties.contexts
|
||||||
|
|
||||||
add_object_placement.Usecase(
|
bpy.ops.bim.edit_object_placement(obj=obj.name)
|
||||||
self.file,
|
|
||||||
{
|
|
||||||
"product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id),
|
|
||||||
"matrix": np.array(obj.matrix_world),
|
|
||||||
},
|
|
||||||
).execute()
|
|
||||||
|
|
||||||
if obj.data:
|
if obj.data:
|
||||||
result = add_representation.Usecase(
|
result = add_representation.Usecase(
|
||||||
@@ -134,13 +146,7 @@ class UpdateMeshRepresentation(bpy.types.Operator):
|
|||||||
obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object
|
obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object
|
||||||
self.file = IfcStore.get_file()
|
self.file = IfcStore.get_file()
|
||||||
|
|
||||||
add_object_placement.Usecase(
|
bpy.ops.bim.edit_object_placement(obj=obj.name)
|
||||||
self.file,
|
|
||||||
{
|
|
||||||
"product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id),
|
|
||||||
"matrix": np.array(obj.matrix_world),
|
|
||||||
},
|
|
||||||
).execute()
|
|
||||||
|
|
||||||
element = self.file.by_id(obj.data.BIMMeshProperties.ifc_definition_id)
|
element = self.file.by_id(obj.data.BIMMeshProperties.ifc_definition_id)
|
||||||
result = add_representation.Usecase(
|
result = add_representation.Usecase(
|
||||||
|
|||||||
@@ -67,3 +67,9 @@ class BIM_PT_mesh(Panel):
|
|||||||
row.prop(ifc_parameter, "name", text="")
|
row.prop(ifc_parameter, "name", text="")
|
||||||
row.prop(ifc_parameter, "value", text="")
|
row.prop(ifc_parameter, "value", text="")
|
||||||
row.operator("bim.update_parametric_representation", icon="FILE_REFRESH", text="").index = index
|
row.operator("bim.update_parametric_representation", icon="FILE_REFRESH", text="").index = index
|
||||||
|
|
||||||
|
|
||||||
|
def BIM_PT_transform(self, context):
|
||||||
|
if context.active_object and context.active_object.BIMObjectProperties.ifc_definition_id:
|
||||||
|
row = self.layout.row()
|
||||||
|
row.operator("bim.edit_object_placement")
|
||||||
|
|||||||
@@ -5,11 +5,6 @@ import ifcopenshell.util.schema
|
|||||||
import blenderbim.bim.module.root.create_product as create_product
|
import blenderbim.bim.module.root.create_product as create_product
|
||||||
import blenderbim.bim.module.root.remove_product as remove_product
|
import blenderbim.bim.module.root.remove_product as remove_product
|
||||||
import blenderbim.bim.module.root.reassign_class as reassign_class
|
import blenderbim.bim.module.root.reassign_class as reassign_class
|
||||||
import blenderbim.bim.module.geometry.add_representation as add_representation
|
|
||||||
import blenderbim.bim.module.geometry.assign_styles as assign_styles
|
|
||||||
import blenderbim.bim.module.geometry.assign_representation as assign_representation
|
|
||||||
import blenderbim.bim.module.geometry.add_object_placement as add_object_placement
|
|
||||||
import blenderbim.bim.module.spatial.assign_container as assign_container
|
|
||||||
from blenderbim.bim.ifc import IfcStore
|
from blenderbim.bim.ifc import IfcStore
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ class AssignContainer(bpy.types.Operator):
|
|||||||
"relating_structure": self.file.by_id(relating_structure.BIMObjectProperties.ifc_definition_id),
|
"relating_structure": self.file.by_id(relating_structure.BIMObjectProperties.ifc_definition_id),
|
||||||
},
|
},
|
||||||
).execute()
|
).execute()
|
||||||
|
bpy.ops.bim.edit_object_placement(obj=related_element.name)
|
||||||
Data.load(props.ifc_definition_id)
|
Data.load(props.ifc_definition_id)
|
||||||
bpy.ops.bim.disable_editing_container(obj=related_element.name)
|
bpy.ops.bim.disable_editing_container(obj=related_element.name)
|
||||||
|
|
||||||
|
|||||||
@@ -1522,6 +1522,7 @@ class BIM_PT_patch(Panel):
|
|||||||
class BIM_PT_mvd(Panel):
|
class BIM_PT_mvd(Panel):
|
||||||
bl_label = "Model View Definitions (MVD)"
|
bl_label = "Model View Definitions (MVD)"
|
||||||
bl_idname = "BIM_PT_mvd"
|
bl_idname = "BIM_PT_mvd"
|
||||||
|
bl_options = {"DEFAULT_CLOSED"}
|
||||||
bl_space_type = "PROPERTIES"
|
bl_space_type = "PROPERTIES"
|
||||||
bl_region_type = "WINDOW"
|
bl_region_type = "WINDOW"
|
||||||
bl_context = "scene"
|
bl_context = "scene"
|
||||||
|
|||||||
Reference in New Issue
Block a user