mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-22 14:38:05 +00:00
refactor pset operator
This commit is contained in:
@@ -28,3 +28,18 @@ def copy_property_to_selection(ifc, pset, is_pset=True, obj=None, pset_name=None
|
|||||||
ifc.run("pset.edit_pset", pset=ifc_pset, properties={prop_name: prop_value})
|
ifc.run("pset.edit_pset", pset=ifc_pset, properties={prop_name: prop_value})
|
||||||
else:
|
else:
|
||||||
ifc.run("pset.edit_qto", qto=ifc_pset, properties={prop_name: prop_value})
|
ifc.run("pset.edit_qto", qto=ifc_pset, properties={prop_name: prop_value})
|
||||||
|
|
||||||
|
def add_pset(ifc, pset, blender, obj_name, obj_type):
|
||||||
|
pset_name = pset.get_pset_name(obj_name, obj_type)
|
||||||
|
if obj_type == "Object":
|
||||||
|
elements = [ifc.get_entity(obj) for obj in blender.get_selected_objects()]
|
||||||
|
else:
|
||||||
|
elements = [ifc.get().by_id(blender.get_obj_ifc_definition_id(obj_name, obj_type))]
|
||||||
|
for element in elements:
|
||||||
|
if not element:
|
||||||
|
continue
|
||||||
|
if not pset.is_pset_applicable(element, pset_name):
|
||||||
|
continue
|
||||||
|
ifc_pset = pset.get_element_pset(element, pset_name)
|
||||||
|
if not ifc_pset:
|
||||||
|
ifc.run("pset.add_pset", product=element, name=pset_name)
|
||||||
|
|||||||
@@ -71,7 +71,11 @@ class Aggregate:
|
|||||||
|
|
||||||
@interface
|
@interface
|
||||||
class Blender: pass
|
class Blender: pass
|
||||||
|
def create_ifc_object(cls, ifc_class, name, data): pass
|
||||||
|
def get_name(cls, ifc_class, name): pass
|
||||||
|
def get_obj_ifc_definition_id(cls, obj, obj_type): pass
|
||||||
|
def get_selected_objects(cls): pass
|
||||||
|
def set_active_object(cls, obj): pass
|
||||||
|
|
||||||
@interface
|
@interface
|
||||||
class Boundary: pass
|
class Boundary: pass
|
||||||
@@ -486,6 +490,8 @@ class Profile:
|
|||||||
@interface
|
@interface
|
||||||
class Pset:
|
class Pset:
|
||||||
def get_element_pset(cls, element, pset_name): pass
|
def get_element_pset(cls, element, pset_name): pass
|
||||||
|
def get_pset_name(cls, obj, obj_type): pass
|
||||||
|
def is_pset_applicable(cls,element, pset_name): pass
|
||||||
|
|
||||||
|
|
||||||
@interface
|
@interface
|
||||||
|
|||||||
@@ -18,8 +18,7 @@
|
|||||||
|
|
||||||
import bpy
|
import bpy
|
||||||
import ifcopenshell.api
|
import ifcopenshell.api
|
||||||
import blenderbim.core.tool
|
import blenderbim.tool as tool
|
||||||
from blenderbim.bim.ifc import IfcStore
|
|
||||||
|
|
||||||
|
|
||||||
class Blender:
|
class Blender:
|
||||||
@@ -39,7 +38,9 @@ class Blender:
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_selected_objects(cls):
|
def get_selected_objects(cls):
|
||||||
return set(bpy.context.selected_objects + [bpy.context.active_object])
|
if bpy.context.selected_objects:
|
||||||
|
return set(bpy.context.selected_objects + [bpy.context.active_object])
|
||||||
|
return set([bpy.context.active_object])
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create_ifc_object(cls, ifc_class: str, name: str = None, data=None) -> bpy.types.Object:
|
def create_ifc_object(cls, ifc_class: str, name: str = None, data=None) -> bpy.types.Object:
|
||||||
@@ -48,3 +49,46 @@ class Blender:
|
|||||||
obj = bpy.data.objects.new(name, data)
|
obj = bpy.data.objects.new(name, data)
|
||||||
bpy.ops.bim.assign_class(obj=obj.name, ifc_class=ifc_class)
|
bpy.ops.bim.assign_class(obj=obj.name, ifc_class=ifc_class)
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_obj_ifc_definition_id(cls, obj=None, obj_type=None):
|
||||||
|
if obj_type == "Object":
|
||||||
|
return bpy.data.objects.get(obj).BIMObjectProperties.ifc_definition_id
|
||||||
|
elif obj_type == "Material":
|
||||||
|
return bpy.data.materials.get(obj).BIMObjectProperties.ifc_definition_id
|
||||||
|
elif obj_type == "MaterialSet":
|
||||||
|
return ifcopenshell.util.element.get_material(
|
||||||
|
tool.Ifc.get_entity(bpy.data.objects.get(obj)), should_skip_usage=True
|
||||||
|
).id()
|
||||||
|
elif obj_type == "MaterialSetItem":
|
||||||
|
return bpy.data.objects.get(obj).BIMObjectMaterialProperties.active_material_set_item_id
|
||||||
|
elif obj_type == "Task":
|
||||||
|
return bpy.context.scene.BIMTaskTreeProperties.tasks[
|
||||||
|
bpy.context.scene.BIMWorkScheduleProperties.active_task_index
|
||||||
|
].ifc_definition_id
|
||||||
|
elif obj_type == "Cost":
|
||||||
|
return bpy.context.scene.BIMCostProperties.cost_items[
|
||||||
|
bpy.context.scene.BIMCostProperties.active_cost_item_index
|
||||||
|
].ifc_definition_id
|
||||||
|
elif obj_type == "Resource":
|
||||||
|
return bpy.context.scene.BIMResourceTreeProperties.resources[
|
||||||
|
bpy.context.scene.BIMResourceProperties.active_resource_index
|
||||||
|
].ifc_definition_id
|
||||||
|
elif obj_type == "Profile":
|
||||||
|
return bpy.context.scene.BIMProfileProperties.profiles[
|
||||||
|
bpy.context.scene.BIMProfileProperties.active_profile_index
|
||||||
|
].ifc_definition_id
|
||||||
|
elif obj_type == "WorkSchedule":
|
||||||
|
return bpy.context.scene.BIMWorkScheduleProperties.active_work_schedule_id
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def is_ifc_object(cls, obj):
|
||||||
|
return bool(obj.BIMObjectProperties.ifc_definition_id)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def is_ifc_class_active(cls, ifc_class):
|
||||||
|
if bpy.context.active_object:
|
||||||
|
if cls.is_ifc_object(bpy.context.active_object):
|
||||||
|
return tool.Ifc.get_entity(bpy.context.active_object).is_a(ifc_class)
|
||||||
|
return False
|
||||||
|
return False
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import bpy
|
|||||||
import ifcopenshell
|
import ifcopenshell
|
||||||
import blenderbim.core.tool
|
import blenderbim.core.tool
|
||||||
import blenderbim.tool as tool
|
import blenderbim.tool as tool
|
||||||
|
import blenderbim.bim.schema
|
||||||
|
|
||||||
|
|
||||||
class Pset(blenderbim.core.tool.Pset):
|
class Pset(blenderbim.core.tool.Pset):
|
||||||
@@ -28,3 +29,32 @@ class Pset(blenderbim.core.tool.Pset):
|
|||||||
pset = ifcopenshell.util.element.get_pset(element, pset_name)
|
pset = ifcopenshell.util.element.get_pset(element, pset_name)
|
||||||
if pset:
|
if pset:
|
||||||
return tool.Ifc.get().by_id(pset["id"])
|
return tool.Ifc.get().by_id(pset["id"])
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_pset_props(cls, obj, obj_type):
|
||||||
|
if obj_type == "Object":
|
||||||
|
return bpy.data.objects.get(obj).PsetProperties
|
||||||
|
elif obj_type == "Material":
|
||||||
|
return bpy.data.materials.get(obj).PsetProperties
|
||||||
|
elif obj_type == "MaterialSet":
|
||||||
|
return bpy.data.objects.get(obj).MaterialSetPsetProperties
|
||||||
|
elif obj_type == "MaterialSetItem":
|
||||||
|
return bpy.data.objects.get(obj).MaterialSetItemPsetProperties
|
||||||
|
elif obj_type == "Task":
|
||||||
|
return bpy.context.scene.TaskPsetProperties
|
||||||
|
elif obj_type == "Resource":
|
||||||
|
return bpy.context.scene.ResourcePsetProperties
|
||||||
|
elif obj_type == "Profile":
|
||||||
|
return bpy.context.scene.ProfilePsetProperties
|
||||||
|
elif obj_type == "WorkSchedule":
|
||||||
|
return bpy.context.scene.WorkSchedulePsetProperties
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_pset_name(cls, obj, obj_type):
|
||||||
|
pset = cls.get_pset_props(obj, obj_type)
|
||||||
|
print(pset.pset_name)
|
||||||
|
return pset.pset_name
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def is_pset_applicable(cls, element, pset_name):
|
||||||
|
return bool(pset_name in blenderbim.bim.schema.ifc.psetqto.get_applicable_names(element.is_a(), pset_only=True))
|
||||||
|
|||||||
Reference in New Issue
Block a user