mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-25 07:09:22 +00:00
update incorporating review comments
This commit is contained in:
@@ -29,19 +29,19 @@ classes = (
|
|||||||
operator.GuessQuantity,
|
operator.GuessQuantity,
|
||||||
operator.RemovePset,
|
operator.RemovePset,
|
||||||
operator.TogglePsetExpansion,
|
operator.TogglePsetExpansion,
|
||||||
operator.AddPropertyToEdit,
|
operator.BIM_OT_add_property_to_edit,
|
||||||
operator.RemovePropertyToEdit,
|
operator.BIM_OT_remove_property_to_edit,
|
||||||
operator.ClearList,
|
operator.BIM_OT_clear_list,
|
||||||
operator.RenameParameters,
|
operator.BIM_OT_rename_parameters,
|
||||||
operator.AddEditCustomProperty,
|
operator.BIM_OT_add_edit_custom_property,
|
||||||
prop.PsetProperties,
|
prop.PsetProperties,
|
||||||
prop.MaterialPsetProperties,
|
prop.MaterialPsetProperties,
|
||||||
prop.TaskPsetProperties,
|
prop.TaskPsetProperties,
|
||||||
prop.ResourcePsetProperties,
|
prop.ResourcePsetProperties,
|
||||||
prop.ProfilePsetProperties,
|
prop.ProfilePsetProperties,
|
||||||
prop.WorkSchedulePsetProperties,
|
prop.WorkSchedulePsetProperties,
|
||||||
prop.PropertiesToRename,
|
prop.RenameProperties,
|
||||||
prop.PropertiesToAddOrEdit,
|
prop.AddEditProperties,
|
||||||
ui.BIM_PT_object_psets,
|
ui.BIM_PT_object_psets,
|
||||||
ui.BIM_PT_object_qtos,
|
ui.BIM_PT_object_qtos,
|
||||||
ui.BIM_PT_material_psets,
|
ui.BIM_PT_material_psets,
|
||||||
@@ -50,9 +50,9 @@ classes = (
|
|||||||
ui.BIM_PT_resource_psets,
|
ui.BIM_PT_resource_psets,
|
||||||
ui.BIM_PT_profile_psets,
|
ui.BIM_PT_profile_psets,
|
||||||
ui.BIM_PT_work_schedule_psets,
|
ui.BIM_PT_work_schedule_psets,
|
||||||
ui.BIM_PT_BulkPropertyEditor,
|
ui.BIM_PT_bulk_property_editor,
|
||||||
ui.BIM_PT_RenameParameters,
|
ui.BIM_PT_rename_parameters,
|
||||||
ui.BIM_PT_AddPropertiesOrEditValues
|
ui.BIM_PT_add_edit_custom_properties
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -63,8 +63,8 @@ def register():
|
|||||||
bpy.types.Scene.ResourcePsetProperties = bpy.props.PointerProperty(type=prop.ResourcePsetProperties)
|
bpy.types.Scene.ResourcePsetProperties = bpy.props.PointerProperty(type=prop.ResourcePsetProperties)
|
||||||
bpy.types.Scene.ProfilePsetProperties = bpy.props.PointerProperty(type=prop.ProfilePsetProperties)
|
bpy.types.Scene.ProfilePsetProperties = bpy.props.PointerProperty(type=prop.ProfilePsetProperties)
|
||||||
bpy.types.Scene.WorkSchedulePsetProperties = bpy.props.PointerProperty(type=prop.WorkSchedulePsetProperties)
|
bpy.types.Scene.WorkSchedulePsetProperties = bpy.props.PointerProperty(type=prop.WorkSchedulePsetProperties)
|
||||||
bpy.types.Scene.PropertiesToRename = bpy.props.CollectionProperty(type=prop.PropertiesToRename)
|
bpy.types.Scene.RenameProperties = bpy.props.CollectionProperty(type=prop.RenameProperties)
|
||||||
bpy.types.Scene.PropertiesToAddOrEdit = bpy.props.CollectionProperty(type=prop.PropertiesToAddOrEdit)
|
bpy.types.Scene.AddEditProperties = bpy.props.CollectionProperty(type=prop.AddEditProperties)
|
||||||
|
|
||||||
|
|
||||||
def unregister():
|
def unregister():
|
||||||
@@ -74,5 +74,5 @@ def unregister():
|
|||||||
del bpy.types.Scene.ResourcePsetProperties
|
del bpy.types.Scene.ResourcePsetProperties
|
||||||
del bpy.types.Scene.ProfilePsetProperties
|
del bpy.types.Scene.ProfilePsetProperties
|
||||||
del bpy.types.Scene.WorkSchedulePsetProperties
|
del bpy.types.Scene.WorkSchedulePsetProperties
|
||||||
del bpy.types.Scene.PropertiesToRename
|
del bpy.types.Scene.RenameProperties
|
||||||
del bpy.types.Scene.PropertiesToAddOrEdit
|
del bpy.types.Scene.AddEditProperties
|
||||||
|
|||||||
@@ -101,7 +101,6 @@ class EnablePsetEditing(bpy.types.Operator):
|
|||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
self.props = get_pset_props(context, self.obj, self.obj_type)
|
self.props = get_pset_props(context, self.obj, self.obj_type)
|
||||||
|
|
||||||
self.props.properties.clear()
|
self.props.properties.clear()
|
||||||
|
|
||||||
data = Data.psets if self.pset_id in Data.psets else Data.qtos
|
data = Data.psets if self.pset_id in Data.psets else Data.qtos
|
||||||
@@ -376,56 +375,41 @@ class CopyPropertyToSelection(bpy.types.Operator, Operator):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class AddPropertyToEdit(bpy.types.Operator):
|
class BIM_OT_add_property_to_edit(bpy.types.Operator):
|
||||||
bl_label = "Add new row"
|
bl_label = "Add new row"
|
||||||
bl_idname = "bim.add_property_to_edit"
|
bl_idname = "bim.add_property_to_edit"
|
||||||
bl_options = {"REGISTER", "UNDO"}
|
bl_options = {"REGISTER", "UNDO"}
|
||||||
type: bpy.props.StringProperty()
|
option: bpy.props.StringProperty()
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
if self.type == "PropertiesToRename":
|
getattr(context.scene, self.option).add()
|
||||||
props = context.scene.PropertiesToRename
|
|
||||||
props.add()
|
|
||||||
elif self.type == "PropertiesToAddOrEdit":
|
|
||||||
props = context.scene.PropertiesToAddOrEdit
|
|
||||||
props.add()
|
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
class RemovePropertyToEdit(bpy.types.Operator):
|
class BIM_OT_remove_property_to_edit(bpy.types.Operator):
|
||||||
bl_label = "Remove property to be renamed"
|
bl_label = "Remove property to be renamed"
|
||||||
bl_idname = "bim.remove_property_to_edit"
|
bl_idname = "bim.remove_property_to_edit"
|
||||||
bl_options = {"REGISTER", "UNDO"}
|
bl_options = {"REGISTER", "UNDO"}
|
||||||
index: bpy.props.IntProperty()
|
index: bpy.props.IntProperty()
|
||||||
type: bpy.props.StringProperty()
|
option: bpy.props.StringProperty()
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
if self.type == "PropertiesToRename":
|
getattr(context.scene, self.option).remove()
|
||||||
props = context.scene.PropertiesToRename
|
|
||||||
props.remove(self.index)
|
|
||||||
if self.type == "PropertiesToAddOrEdit":
|
|
||||||
props = context.scene.PropertiesToAddOrEdit
|
|
||||||
props.remove(self.index)
|
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
class ClearList(bpy.types.Operator):
|
class BIM_OT_clear_list(bpy.types.Operator):
|
||||||
bl_label = "Clear list of properties"
|
bl_label = "Clear list of properties"
|
||||||
bl_idname = "bim.clear_list"
|
bl_idname = "bim.clear_list"
|
||||||
bl_options = {"REGISTER", "UNDO"}
|
bl_options = {"REGISTER", "UNDO"}
|
||||||
type: bpy.props.StringProperty()
|
option: bpy.props.StringProperty()
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
if self.type == "PropertiesToRename":
|
getattr(context.scene, self.option).clear()
|
||||||
props = context.scene.PropertiesToRename
|
|
||||||
props.clear()
|
|
||||||
if self.type == "PropertiesToAddOrEdit":
|
|
||||||
props = context.scene.PropertiesToAddOrEdit
|
|
||||||
props.clear()
|
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
class RenameParameters(bpy.types.Operator):
|
class BIM_OT_rename_parameters(bpy.types.Operator):
|
||||||
bl_label = "Rename Parameters"
|
bl_label = "Rename Parameters"
|
||||||
bl_idname = "bim.rename_parameters"
|
bl_idname = "bim.rename_parameters"
|
||||||
bl_options = {"REGISTER", "UNDO"}
|
bl_options = {"REGISTER", "UNDO"}
|
||||||
@@ -435,7 +419,7 @@ class RenameParameters(bpy.types.Operator):
|
|||||||
return IfcStore.execute_ifc_operator(self, context)
|
return IfcStore.execute_ifc_operator(self, context)
|
||||||
|
|
||||||
def _execute(self, context):
|
def _execute(self, context):
|
||||||
props_to_map = context.scene.PropertiesToRename
|
props_to_map = context.scene.RenameProperties
|
||||||
ifc_file = IfcStore.get_file()
|
ifc_file = IfcStore.get_file()
|
||||||
all_ifc_elements = ifc_file.by_type("IfcElement")
|
all_ifc_elements = ifc_file.by_type("IfcElement")
|
||||||
|
|
||||||
@@ -463,7 +447,7 @@ class RenameParameters(bpy.types.Operator):
|
|||||||
Data.load(IfcStore.get_file(), ifc_element.id())
|
Data.load(IfcStore.get_file(), ifc_element.id())
|
||||||
|
|
||||||
|
|
||||||
class AddEditCustomProperty(bpy.types.Operator):
|
class BIM_OT_add_edit_custom_property(bpy.types.Operator):
|
||||||
bl_label = "Add or edit a custom property"
|
bl_label = "Add or edit a custom property"
|
||||||
bl_idname = "bim.add_edit_custom_property"
|
bl_idname = "bim.add_edit_custom_property"
|
||||||
bl_options = {"REGISTER", "UNDO"}
|
bl_options = {"REGISTER", "UNDO"}
|
||||||
@@ -475,46 +459,28 @@ class AddEditCustomProperty(bpy.types.Operator):
|
|||||||
def _execute(self, context):
|
def _execute(self, context):
|
||||||
self.file = IfcStore.get_file()
|
self.file = IfcStore.get_file()
|
||||||
selected_objects = context.selected_objects
|
selected_objects = context.selected_objects
|
||||||
props = context.scene.PropertiesToAddOrEdit
|
props = context.scene.AddEditProperties
|
||||||
|
|
||||||
for object in selected_objects:
|
for obj in selected_objects:
|
||||||
ifc_definition_id = object.BIMObjectProperties.ifc_definition_id
|
ifc_definition_id = obj.BIMObjectProperties.ifc_definition_id
|
||||||
if not ifc_definition_id:
|
if not ifc_definition_id:
|
||||||
continue
|
continue
|
||||||
ifc_element = tool.Ifc.get().by_id(ifc_definition_id)
|
ifc_element = tool.Ifc.get().by_id(ifc_definition_id)
|
||||||
psets = ifcopenshell.util.element.get_psets(ifc_element)
|
|
||||||
for prop in props:
|
for prop in props:
|
||||||
if prop.value_type == "String":
|
value = getattr(prop, prop.get_value_name())
|
||||||
value = prop.string_value
|
new_pset = ifcopenshell.api.run(
|
||||||
elif prop.value_type == "Boolean":
|
"pset.add_pset",
|
||||||
value = prop.bool_value
|
self.file,
|
||||||
elif prop.value_type == "Integer":
|
product=ifc_element,
|
||||||
value = prop.int_value
|
name=prop.pset_name
|
||||||
elif prop.value_type == "Number":
|
)
|
||||||
value = prop.float_value
|
ifcopenshell.api.run(
|
||||||
|
"pset.edit_pset",
|
||||||
if prop.pset_name not in psets:
|
self.file,
|
||||||
new_pset = ifcopenshell.api.run("pset.add_pset", self.file, product=ifc_element, name=prop.pset_name)
|
pset=new_pset,
|
||||||
ifcopenshell.api.run("pset.edit_pset", self.file, pset=new_pset, properties={prop.property_name:value})
|
properties={prop.property_name:value}
|
||||||
|
)
|
||||||
else:#1) delete the existing property first, in case the value type has also been changed, and then
|
|
||||||
#2) re-add the property
|
|
||||||
#TODOUpdate this code to incorporate the dion's latest commit
|
|
||||||
self.delete_ifc_property(ifc_element, prop)
|
|
||||||
ifcopenshell.api.run("pset.edit_pset", self.file, pset=self.file.by_id(psets[prop.pset_name]["id"]), properties={prop.property_name:value})
|
|
||||||
|
|
||||||
self.report({'INFO'}, 'Finished applying changes')
|
self.report({'INFO'}, 'Finished applying changes')
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
def delete_ifc_property(self, element, property):
|
|
||||||
for definition in element.IsDefinedBy:
|
|
||||||
if definition.is_a('IfcRelDefinesByProperties'):
|
|
||||||
prop_set = definition.RelatingPropertyDefinition
|
|
||||||
if prop_set.Name != property.pset_name:
|
|
||||||
continue
|
|
||||||
for hasprop in prop_set.HasProperties:
|
|
||||||
if hasprop.Name != property.property_name:
|
|
||||||
continue
|
|
||||||
self.file.remove(hasprop)
|
|
||||||
Data.load(IfcStore.get_file(), element.id())
|
|
||||||
return
|
|
||||||
|
|||||||
@@ -175,24 +175,34 @@ class WorkSchedulePsetProperties(PropertyGroup):
|
|||||||
pset_name: EnumProperty(items=getWorkSchedulePsetNames, name="Pset Name")
|
pset_name: EnumProperty(items=getWorkSchedulePsetNames, name="Pset Name")
|
||||||
|
|
||||||
|
|
||||||
class PropertiesToRename(PropertyGroup):
|
class RenameProperties(PropertyGroup):
|
||||||
pset_name: StringProperty(name="Pset")
|
pset_name: StringProperty(name="Pset")
|
||||||
existing_property_name: StringProperty(name="Existing Property Name")
|
existing_property_name: StringProperty(name="Existing Property Name")
|
||||||
new_property_name: StringProperty(name="New Property Name")
|
new_property_name: StringProperty(name="New Property Name")
|
||||||
|
|
||||||
|
|
||||||
class PropertiesToAddOrEdit(PropertyGroup):
|
class AddEditProperties(PropertyGroup):
|
||||||
pset_name: StringProperty(name="Pset")
|
pset_name: StringProperty(name="Pset")
|
||||||
property_name: StringProperty(name="Property")
|
property_name: StringProperty(name="Property")
|
||||||
string_value: StringProperty(name="Value")
|
string_value: StringProperty(name="Value")
|
||||||
bool_value: BoolProperty(name="Property Value")
|
bool_value: BoolProperty(name="Value")
|
||||||
int_value: IntProperty(name="Property Value")
|
int_value: IntProperty(name="Value")
|
||||||
float_value: FloatProperty(name="Property Value")
|
float_value: FloatProperty(name="Value")
|
||||||
value_type: EnumProperty(
|
data_type: EnumProperty(
|
||||||
items=[
|
items=[
|
||||||
("String", "String", "" ),
|
("string", "String", "" ),
|
||||||
("Boolean", "True/False", "" ),
|
("boolean", "True/False", "" ),
|
||||||
("Integer", "Integer", "" ),
|
("integer", "Integer", "" ),
|
||||||
("Number", "Number", "" )],
|
("float", "Number", "" )],
|
||||||
default="String"
|
default="string"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def get_value_name(self):
|
||||||
|
if self.data_type == "string":
|
||||||
|
return "string_value"
|
||||||
|
elif self.data_type == "boolean":
|
||||||
|
return "bool_value"
|
||||||
|
elif self.data_type == "integer":
|
||||||
|
return "int_value"
|
||||||
|
elif self.data_type == "float":
|
||||||
|
return "float_value"
|
||||||
|
|||||||
@@ -377,7 +377,7 @@ class BIM_PT_work_schedule_psets(Panel):
|
|||||||
draw_psetqto_ui(context, pset["id"], pset, props, self.layout, "WorkSchedule")
|
draw_psetqto_ui(context, pset["id"], pset, props, self.layout, "WorkSchedule")
|
||||||
|
|
||||||
|
|
||||||
class BIM_PT_BulkPropertyEditor(Panel):
|
class BIM_PT_bulk_property_editor(Panel):
|
||||||
bl_label = "IFC Bulk Property Editor"
|
bl_label = "IFC Bulk Property Editor"
|
||||||
bl_space_type = 'PROPERTIES'
|
bl_space_type = 'PROPERTIES'
|
||||||
bl_region_type = 'WINDOW'
|
bl_region_type = 'WINDOW'
|
||||||
@@ -387,80 +387,72 @@ class BIM_PT_BulkPropertyEditor(Panel):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class BIM_PT_RenameParameters(Panel):
|
class BIM_PT_rename_parameters(Panel):
|
||||||
bl_label = "Rename all building elements"
|
bl_label = "Rename all building elements"
|
||||||
bl_space_type = 'PROPERTIES'
|
bl_space_type = 'PROPERTIES'
|
||||||
bl_region_type = 'WINDOW'
|
bl_region_type = 'WINDOW'
|
||||||
bl_context = "object"
|
bl_context = "object"
|
||||||
bl_parent_id = "BIM_PT_BulkPropertyEditor"
|
bl_parent_id = "BIM_PT_bulk_property_editor"
|
||||||
bl_options = {"DEFAULT_CLOSED"}
|
bl_options = {"DEFAULT_CLOSED"}
|
||||||
bl_order = 0
|
bl_order = 0
|
||||||
|
|
||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
props = context.scene.PropertiesToRename
|
props = context.scene.RenameProperties
|
||||||
|
|
||||||
if props:
|
if props:
|
||||||
for index, property in enumerate(props):
|
for index, prop in enumerate(props):
|
||||||
row = layout.row()
|
row = layout.row()
|
||||||
row.prop(property, "pset_name", text="")
|
row.prop(prop, "pset_name", text="")
|
||||||
row.prop(property, "existing_property_name", text="")
|
row.prop(prop, "existing_property_name", text="")
|
||||||
row.prop(property, "new_property_name", text="")
|
row.prop(prop, "new_property_name", text="")
|
||||||
op = row.operator("bim.remove_property_to_edit",icon="PANEL_CLOSE", text="")
|
op = row.operator("bim.remove_property_to_edit",icon="PANEL_CLOSE", text="")
|
||||||
op.index = index
|
op.index = index
|
||||||
op.type = "properties_to_map"
|
op.option = "RenameProperties"
|
||||||
|
|
||||||
row = layout.row()
|
row = layout.row()
|
||||||
row.label()
|
row.label()
|
||||||
op = row.operator("bim.add_property_to_edit", icon="ADD",text="")
|
op = row.operator("bim.add_property_to_edit", icon="ADD",text="")
|
||||||
op.type = "PropertiesToRename"
|
op.option = "RenameProperties"
|
||||||
|
|
||||||
if props:
|
if props:
|
||||||
row = layout.row()
|
row = layout.row()
|
||||||
clear = row.operator("bim.clear_list")
|
clear = row.operator("bim.clear_list")
|
||||||
clear.type = "PropertiesToRename"
|
clear.option = "RenameProperties"
|
||||||
row.operator("bim.rename_parameters")
|
row.operator("bim.rename_parameters")
|
||||||
|
|
||||||
|
|
||||||
class BIM_PT_AddPropertiesOrEditValues(Panel):
|
class BIM_PT_add_edit_custom_properties(Panel):
|
||||||
"""Creates a Panel in the Object properties window"""
|
|
||||||
bl_label = "Add/Edit Custom Properties and Values (to selected objects)"
|
bl_label = "Add/Edit Custom Properties and Values (to selected objects)"
|
||||||
bl_space_type = 'PROPERTIES'
|
bl_space_type = 'PROPERTIES'
|
||||||
bl_region_type = 'WINDOW'
|
bl_region_type = 'WINDOW'
|
||||||
bl_context = "object"
|
bl_context = "object"
|
||||||
bl_parent_id = "BIM_PT_BulkPropertyEditor"
|
bl_parent_id = "BIM_PT_bulk_property_editor"
|
||||||
bl_options = {"DEFAULT_CLOSED"}
|
bl_options = {"DEFAULT_CLOSED"}
|
||||||
bl_order = 1
|
bl_order = 1
|
||||||
|
|
||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
props = context.scene.PropertiesToAddOrEdit
|
props = context.scene.AddEditProperties
|
||||||
|
|
||||||
if props:
|
if props:
|
||||||
for index, property in enumerate(props):
|
for index, prop in enumerate(props):
|
||||||
row = layout.row()
|
row = layout.row()
|
||||||
row.prop(property, "pset_name", text="")
|
row.prop(prop, "pset_name", text="")
|
||||||
row.prop(property, "property_name", text="")
|
row.prop(prop, "property_name", text="")
|
||||||
if property.value_type == "String":
|
row.prop(prop, prop.get_value_name(), text="")
|
||||||
row.prop(property, "string_value", text="")
|
row.prop(prop, "data_type", text="")
|
||||||
elif property.value_type == "Boolean":
|
op = row.operator("bim.remove_property_to_edit",icon="PANEL_CLOSE", text="")
|
||||||
row.prop(property, "bool_value", text="")
|
op.index = index
|
||||||
elif property.value_type == "Integer":
|
op.option = "AddEditProperties"
|
||||||
row.prop(property, "int_value", text="")
|
|
||||||
elif property.value_type == "Number":
|
|
||||||
row.prop(property, "float_value", text="")
|
|
||||||
row.prop(property, "value_type", text="")
|
|
||||||
op = row.operator("bim.remove_property_to_edit",icon="PANEL_CLOSE", text="")
|
|
||||||
op.index = index
|
|
||||||
op.type = "PropertiesToAddOrEdit"
|
|
||||||
|
|
||||||
row = layout.row()
|
row = layout.row()
|
||||||
row.label()
|
row.label()
|
||||||
op = row.operator("bim.add_property_to_edit", icon="ADD",text="")
|
op = row.operator("bim.add_property_to_edit", icon="ADD",text="")
|
||||||
op.type = "PropertiesToAddOrEdit"
|
op.option = "AddEditProperties"
|
||||||
|
|
||||||
if props:
|
if props:
|
||||||
row = layout.row()
|
row = layout.row()
|
||||||
clear = row.operator("bim.clear_list")
|
clear = row.operator("bim.clear_list")
|
||||||
clear.type = "PropertiesToAddOrEdit"
|
clear.option = "AddEditProperties"
|
||||||
op = row.operator("bim.add_edit_custom_property",icon="ADD", text="Apply Changes")
|
op = row.operator("bim.add_edit_custom_property",icon="ADD", text="Apply Changes")
|
||||||
|
|||||||
Reference in New Issue
Block a user