Fix bug where adding a pset template didn't auto refresh the UI to the newly added template

This commit is contained in:
Dion Moult
2022-09-01 17:52:36 +10:00
parent 87021ebbe7
commit f2bd362f57
6 changed files with 151 additions and 258 deletions
@@ -20,21 +20,20 @@ import bpy
from . import ui, prop, operator
classes = (
operator.RefreshPsetTemplates,
operator.AddPsetFile,
operator.SavePsetTemplateFile,
operator.AddPsetTemplate,
operator.EditPsetTemplate,
operator.RemovePsetTemplate,
operator.AddPropTemplate,
operator.EditPropTemplate,
operator.RemovePropTemplate,
operator.EnableEditingPsetTemplate,
operator.DisableEditingPsetTemplate,
operator.EnableEditingPropTemplate,
operator.DeletePropEnum,
operator.AddPropEnum,
operator.AddPropTemplate,
operator.AddPsetFile,
operator.AddPsetTemplate,
operator.DeletePropEnum,
operator.DisableEditingPropTemplate,
operator.DisableEditingPsetTemplate,
operator.EditPropTemplate,
operator.EditPsetTemplate,
operator.EnableEditingPropTemplate,
operator.EnableEditingPsetTemplate,
operator.RemovePropTemplate,
operator.RemovePsetTemplate,
operator.SavePsetTemplateFile,
prop.PsetTemplate,
prop.EnumerationValues,
prop.PropTemplate,
@@ -16,8 +16,11 @@
# You should have received a copy of the GNU General Public License
# along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
import os
import bpy
import ifcopenshell
import blenderbim.tool as tool
from blenderbim.bim.ifc import IfcStore
def refresh():
@@ -30,10 +33,51 @@ class PsetTemplatesData:
@classmethod
def load(cls):
cls.data = {"primary_measure_type": cls.primary_measure_type()}
cls.is_loaded = True
cls.data["primary_measure_type"] = cls.primary_measure_type()
cls.data["pset_template_files"] = cls.pset_template_files()
cls.data["pset_templates"] = cls.pset_templates()
cls.data["pset_template"] = cls.pset_template()
cls.data["prop_templates"] = cls.prop_templates()
@classmethod
def primary_measure_type(cls):
schema = tool.Ifc.schema()
return [(t, t, "") for t in sorted([d.name() for d in schema.declarations() if hasattr(d, "declared_type")])]
@classmethod
def pset_template_files(cls):
files = os.listdir(os.path.join(bpy.context.scene.BIMProperties.data_dir, "pset"))
return [(f.replace(".ifc", ""), f.replace(".ifc", ""), "") for f in files]
@classmethod
def pset_templates(cls):
if not IfcStore.pset_template_file:
IfcStore.pset_template_path = os.path.join(
bpy.context.scene.BIMProperties.data_dir,
"pset",
bpy.context.scene.BIMPsetTemplateProperties.pset_template_files + ".ifc",
)
IfcStore.pset_template_file = ifcopenshell.open(IfcStore.pset_template_path)
return [(str(t.id()), t.Name, "") for t in IfcStore.pset_template_file.by_type("IfcPropertySetTemplate")]
@classmethod
def pset_template(cls):
props = bpy.context.scene.BIMPsetTemplateProperties
template_id = props.pset_templates
if not template_id:
return {}
info = IfcStore.pset_template_file.by_id(int(template_id)).get_info()
del info["id"]
del info["type"]
del info["OwnerHistory"]
del info["HasPropertyTemplates"]
return info
@classmethod
def prop_templates(cls):
props = bpy.context.scene.BIMPsetTemplateProperties
template_id = props.pset_templates
if not template_id:
return []
return [e.get_info() for e in IfcStore.pset_template_file.by_id(int(template_id)).HasPropertyTemplates or []]
@@ -22,24 +22,26 @@ import ifcopenshell
import ifcopenshell.api
import blenderbim.bim.schema
import blenderbim.bim.handler
from blenderbim.bim.module.pset_template.prop import purge as purge_templates, updatePsetTemplates, getPsetTemplates
from blenderbim.bim.module.pset.prop import purge as purge_psets
from ifcopenshell.api.pset_template.data import Data
from blenderbim.bim.ifc import IfcStore
# This is just a temporary operator until
# @Moult performs some of his refactor-magic ;) - vulevukusej
class RefreshPsetTemplates(bpy.types.Operator):
bl_idname = "bim.refresh_psettemplates"
bl_label = "Refresh the data for PsetTemplates"
bl_options = {"REGISTER", "UNDO"}
class Operator:
def execute(self, context):
purge_templates()
purge_psets()
IfcStore.begin_transaction(self)
IfcStore.pset_template_file.begin_transaction()
result = self._execute(context)
IfcStore.pset_template_file.end_transaction()
IfcStore.add_transaction_operation(self)
IfcStore.end_transaction(self)
blenderbim.bim.handler.refresh_ui_data()
return {"FINISHED"}
def rollback(self, data):
IfcStore.pset_template_file.undo()
def commit(self, data):
IfcStore.pset_template_file.redo()
class AddPsetFile(bpy.types.Operator):
bl_idname = "bim.add_pset_file"
@@ -76,52 +78,22 @@ class AddPsetFile(bpy.types.Operator):
return {"FINISHED"}
class AddPsetTemplate(bpy.types.Operator):
class AddPsetTemplate(bpy.types.Operator, Operator):
bl_idname = "bim.add_pset_template"
bl_label = "Add Pset Template"
bl_options = {"REGISTER", "UNDO"}
def execute(self, context):
IfcStore.begin_transaction(self)
IfcStore.pset_template_file.begin_transaction()
result = self._execute(context)
IfcStore.pset_template_file.end_transaction()
IfcStore.add_transaction_operation(self)
IfcStore.end_transaction(self)
return result
def _execute(self, context):
ifcopenshell.api.run("pset_template.add_pset_template", IfcStore.pset_template_file)
Data.load(IfcStore.pset_template_file)
updatePsetTemplates(self, context)
return {"FINISHED"}
def rollback(self, data):
IfcStore.pset_template_file.undo()
def commit(self, data):
IfcStore.pset_template_file.redo()
template = ifcopenshell.api.run("pset_template.add_pset_template", IfcStore.pset_template_file)
blenderbim.bim.handler.refresh_ui_data()
context.scene.BIMPsetTemplateProperties.pset_templates = str(template.id())
class RemovePsetTemplate(bpy.types.Operator):
class RemovePsetTemplate(bpy.types.Operator, Operator):
bl_idname = "bim.remove_pset_template"
bl_label = "Remove Pset Template"
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
props = context.scene.BIMPsetTemplateProperties
return bool(getPsetTemplates(props, context))
def execute(self, context):
IfcStore.begin_transaction(self)
IfcStore.pset_template_file.begin_transaction()
result = self._execute(context)
IfcStore.pset_template_file.end_transaction()
IfcStore.add_transaction_operation(self)
IfcStore.end_transaction(self)
return result
def _execute(self, context):
props = context.scene.BIMPsetTemplateProperties
if props.active_pset_template_id == int(props.pset_templates):
@@ -131,15 +103,6 @@ class RemovePsetTemplate(bpy.types.Operator):
IfcStore.pset_template_file,
**{"pset_template": IfcStore.pset_template_file.by_id(int(props.pset_templates))}
)
Data.load(IfcStore.pset_template_file)
updatePsetTemplates(self, context)
return {"FINISHED"}
def rollback(self, data):
IfcStore.pset_template_file.undo()
def commit(self, data):
IfcStore.pset_template_file.redo()
class EnableEditingPsetTemplate(bpy.types.Operator):
@@ -147,20 +110,15 @@ class EnableEditingPsetTemplate(bpy.types.Operator):
bl_label = "Enable Editing Pset Template"
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
props = context.scene.BIMPsetTemplateProperties
return bool(getPsetTemplates(props, context))
def execute(self, context):
props = context.scene.BIMPsetTemplateProperties
props.active_pset_template_id = int(props.pset_templates)
template = Data.pset_templates[props.active_pset_template_id]
props.active_pset_template.global_id = template["GlobalId"]
props.active_pset_template.name = template["Name"] or ""
props.active_pset_template.description = template["Description"] or ""
props.active_pset_template.template_type = template["TemplateType"]
props.active_pset_template.applicable_entity = template["ApplicableEntity"] or ""
template = IfcStore.pset_template_file.by_id(props.active_pset_template_id)
props.active_pset_template.global_id = template.GlobalId
props.active_pset_template.name = template.Name or ""
props.active_pset_template.description = template.Description or ""
props.active_pset_template.template_type = template.TemplateType
props.active_pset_template.applicable_entity = template.ApplicableEntity or ""
return {"FINISHED"}
@@ -184,20 +142,19 @@ class EnableEditingPropTemplate(bpy.types.Operator):
def execute(self, context):
props = context.scene.BIMPsetTemplateProperties
props.active_prop_template_id = self.prop_template
template = Data.prop_templates[props.active_prop_template_id]
props.active_prop_template.name = template["Name"] or ""
props.active_prop_template.description = template["Description"] or ""
props.active_prop_template.primary_measure_type = template["PrimaryMeasureType"]
props.active_prop_template.template_type = template["TemplateType"]
template = IfcStore.pset_template_file.by_id(props.active_prop_template_id)
props.active_prop_template.name = template.Name or ""
props.active_prop_template.description = template.Description or ""
props.active_prop_template.primary_measure_type = template.PrimaryMeasureType
props.active_prop_template.template_type = template.TemplateType
props.active_prop_template.enum_values.clear()
if template["Enumerators"]:
if template.Enumerators:
props.active_prop_template.enum_values.clear()
data_type = props.active_prop_template.get_value_name()
for e in template["Enumerators"].EnumerationValues:
for e in template.Enumerators.EnumerationValues:
new = props.active_prop_template.enum_values.add()
setattr(new, data_type, e.wrappedValue)
return {"FINISHED"}
@@ -236,20 +193,11 @@ class DisableEditingPropTemplate(bpy.types.Operator):
return {"FINISHED"}
class EditPsetTemplate(bpy.types.Operator):
class EditPsetTemplate(bpy.types.Operator, Operator):
bl_idname = "bim.edit_pset_template"
bl_label = "Edit Pset Template"
bl_options = {"REGISTER", "UNDO"}
def execute(self, context):
IfcStore.begin_transaction(self)
IfcStore.pset_template_file.begin_transaction()
result = self._execute(context)
IfcStore.pset_template_file.end_transaction()
IfcStore.add_transaction_operation(self)
IfcStore.end_transaction(self)
return result
def _execute(self, context):
props = context.scene.BIMPsetTemplateProperties
ifcopenshell.api.run(
@@ -265,16 +213,7 @@ class EditPsetTemplate(bpy.types.Operator):
},
}
)
Data.load(IfcStore.pset_template_file)
updatePsetTemplates(self, context)
bpy.ops.bim.disable_editing_pset_template()
return {"FINISHED"}
def rollback(self, data):
IfcStore.pset_template_file.undo()
def commit(self, data):
IfcStore.pset_template_file.redo()
class SavePsetTemplateFile(bpy.types.Operator):
@@ -288,20 +227,11 @@ class SavePsetTemplateFile(bpy.types.Operator):
return {"FINISHED"}
class AddPropTemplate(bpy.types.Operator):
class AddPropTemplate(bpy.types.Operator, Operator):
bl_idname = "bim.add_prop_template"
bl_label = "Add Prop Template"
bl_options = {"REGISTER", "UNDO"}
def execute(self, context):
IfcStore.begin_transaction(self)
IfcStore.pset_template_file.begin_transaction()
result = self._execute(context)
IfcStore.pset_template_file.end_transaction()
IfcStore.add_transaction_operation(self)
IfcStore.end_transaction(self)
return result
def _execute(self, context):
props = context.scene.BIMPsetTemplateProperties
pset_template_id = props.active_pset_template_id or int(props.pset_templates)
@@ -310,31 +240,14 @@ class AddPropTemplate(bpy.types.Operator):
IfcStore.pset_template_file,
**{"pset_template": IfcStore.pset_template_file.by_id(pset_template_id)}
)
Data.load(IfcStore.pset_template_file)
return {"FINISHED"}
def rollback(self, data):
IfcStore.pset_template_file.undo()
def commit(self, data):
IfcStore.pset_template_file.redo()
class RemovePropTemplate(bpy.types.Operator):
class RemovePropTemplate(bpy.types.Operator, Operator):
bl_idname = "bim.remove_prop_template"
bl_label = "Remove Prop Template"
bl_options = {"REGISTER", "UNDO"}
prop_template: bpy.props.IntProperty()
def execute(self, context):
IfcStore.begin_transaction(self)
IfcStore.pset_template_file.begin_transaction()
result = self._execute(context)
IfcStore.pset_template_file.end_transaction()
IfcStore.add_transaction_operation(self)
IfcStore.end_transaction(self)
return result
def _execute(self, context):
props = context.scene.BIMPsetTemplateProperties
ifcopenshell.api.run(
@@ -342,30 +255,13 @@ class RemovePropTemplate(bpy.types.Operator):
IfcStore.pset_template_file,
**{"prop_template": IfcStore.pset_template_file.by_id(self.prop_template)}
)
Data.load(IfcStore.pset_template_file)
return {"FINISHED"}
def rollback(self, data):
IfcStore.pset_template_file.undo()
def commit(self, data):
IfcStore.pset_template_file.redo()
class EditPropTemplate(bpy.types.Operator):
class EditPropTemplate(bpy.types.Operator, Operator):
bl_idname = "bim.edit_prop_template"
bl_label = "Edit Prop Template"
bl_options = {"REGISTER", "UNDO"}
def execute(self, context):
IfcStore.begin_transaction(self)
IfcStore.pset_template_file.begin_transaction()
result = self._execute(context)
IfcStore.pset_template_file.end_transaction()
IfcStore.add_transaction_operation(self)
IfcStore.end_transaction(self)
return result
def _execute(self, context):
props = context.scene.BIMPsetTemplateProperties
if props.active_prop_template.template_type == "P_ENUMERATEDVALUE":
@@ -386,9 +282,7 @@ class EditPropTemplate(bpy.types.Operator):
},
}
)
Data.load(IfcStore.pset_template_file)
bpy.ops.bim.disable_editing_prop_template()
return {"FINISHED"}
# TODO -This will need to go into the
# api code at some point - vulevukusej
@@ -404,9 +298,3 @@ class EditPropTemplate(bpy.types.Operator):
),
)
return prop_enum
def rollback(self, data):
IfcStore.pset_template_file.undo()
def commit(self, data):
IfcStore.pset_template_file.redo()
@@ -1,5 +1,5 @@
# BlenderBIM Add-on - OpenBIM Blender Add-on
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
# Copyright (C) 2020-2022 Dion Moult <dion@thinkmoult.com>
#
# This file is part of BlenderBIM Add-on.
#
@@ -33,59 +33,30 @@ from bpy.props import (
FloatVectorProperty,
CollectionProperty,
)
from ifcopenshell.api.pset_template.data import Data
psettemplatefiles_enum = []
psettemplates_enum = []
def purge():
global psettemplatefiles_enum
global psettemplates_enum
psettemplatefiles_enum = []
psettemplates_enum = []
def updatePsetTemplateFiles(self, context):
global psettemplates_enum
IfcStore.pset_template_path = os.path.join(
context.scene.BIMProperties.data_dir,
"pset",
context.scene.BIMPsetTemplateProperties.pset_template_files + ".ifc",
)
IfcStore.pset_template_file = ifcopenshell.open(IfcStore.pset_template_path)
updatePsetTemplates(self, context)
IfcStore.pset_template_file = None
PsetTemplatesData.data["pset_template_files"] = PsetTemplatesData.pset_template_files()
PsetTemplatesData.data["pset_templates"] = PsetTemplatesData.pset_templates()
PsetTemplatesData.data["prop_templates"] = PsetTemplatesData.prop_templates()
def getPsetTemplateFiles(self, context):
global psettemplatefiles_enum
if len(psettemplatefiles_enum) < 1:
files = os.listdir(os.path.join(context.scene.BIMProperties.data_dir, "pset"))
psettemplatefiles_enum.extend([(f.replace(".ifc", ""), f.replace(".ifc", ""), "") for f in files])
return psettemplatefiles_enum
if not PsetTemplatesData.is_loaded:
PsetTemplatesData.load()
return PsetTemplatesData.data["pset_template_files"]
def updatePsetTemplates(self, context):
global psettemplates_enum
psettemplates_enum.clear()
getPsetTemplates(self, context)
PsetTemplatesData.data["pset_template"] = PsetTemplatesData.pset_template()
PsetTemplatesData.data["prop_templates"] = PsetTemplatesData.prop_templates()
def getPsetTemplates(self, context):
global psettemplates_enum
if len(psettemplates_enum) < 1:
if not IfcStore.pset_template_file:
IfcStore.pset_template_path = os.path.join(
context.scene.BIMProperties.data_dir,
"pset",
context.scene.BIMPsetTemplateProperties.pset_template_files + ".ifc",
)
IfcStore.pset_template_file = ifcopenshell.open(IfcStore.pset_template_path)
templates = IfcStore.pset_template_file.by_type("IfcPropertySetTemplate")
psettemplates_enum.extend([(str(t.id()), t.Name, "") for t in templates])
Data.load(IfcStore.pset_template_file)
return psettemplates_enum
if not PsetTemplatesData.is_loaded:
PsetTemplatesData.load()
return PsetTemplatesData.data["pset_templates"]
def get_primary_measure_type(self, context):
@@ -182,7 +153,7 @@ class BIMPsetTemplateProperties(PropertyGroup):
pset_template_files: EnumProperty(
items=getPsetTemplateFiles, name="Pset Template Files", update=updatePsetTemplateFiles
)
pset_templates: EnumProperty(items=getPsetTemplates, name="Pset Template Files")
pset_templates: EnumProperty(items=getPsetTemplates, name="Pset Template Files", update=updatePsetTemplates)
active_pset_template_id: IntProperty(name="Active Pset Template Id")
active_prop_template_id: IntProperty(name="Active Prop Template Id")
active_pset_template: PointerProperty(type=PsetTemplate)
@@ -20,10 +20,7 @@ import bpy
from bpy.types import Panel
from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.helper import prop_with_search
from blenderbim.bim.module.pset_template.prop import (
getPsetTemplates,
)
from ifcopenshell.api.pset_template.data import Data
from blenderbim.bim.module.pset_template.data import PsetTemplatesData
class BIM_PT_pset_template(Panel):
@@ -36,23 +33,24 @@ class BIM_PT_pset_template(Panel):
bl_parent_id = "BIM_PT_project_setup"
def draw(self, context):
layout = self.layout
props = context.scene.BIMPsetTemplateProperties
if not PsetTemplatesData.is_loaded:
PsetTemplatesData.load()
row = layout.row(align=True)
prop_with_search(row, props, "pset_template_files", text="")
self.props = context.scene.BIMPsetTemplateProperties
row = self.layout.row(align=True)
prop_with_search(row, self.props, "pset_template_files", text="")
row.operator("bim.save_pset_template_file", text="", icon="EXPORT")
row.operator("bim.add_pset_file", icon="ADD", text="")
row.operator("bim.refresh_psettemplates", icon="FILE_REFRESH", text="")
row = layout.row(align=True)
row = self.layout.row(align=True)
if bool(getPsetTemplates(props, context)):
prop_with_search(row, props, "pset_templates", text="", icon="COPY_ID")
if PsetTemplatesData.data["pset_templates"]:
prop_with_search(row, self.props, "pset_templates", text="", icon="COPY_ID")
else:
row.label(text="No Pset Templates", icon="COPY_ID")
if props.active_pset_template_id:
if self.props.active_pset_template_id:
row.operator("bim.edit_pset_template", text="", icon="CHECKMARK")
row.operator("bim.disable_editing_pset_template", text="", icon="CANCEL")
else:
@@ -60,49 +58,39 @@ class BIM_PT_pset_template(Panel):
row.operator("bim.enable_editing_pset_template", text="", icon="GREASEPENCIL")
row.operator("bim.remove_pset_template", text="", icon="X")
if not Data.is_loaded and props.pset_template_files:
Data.load(IfcStore.pset_template_file)
if PsetTemplatesData.data["pset_template"]:
self.draw_pset_template()
if not Data.pset_templates:
return
if props.active_pset_template_id:
pset_template = Data.pset_templates[int(props.active_pset_template_id)]
row = layout.row()
row.prop(props.active_pset_template, "name")
row = layout.row()
row.prop(props.active_pset_template, "description")
prop_with_search(layout, props.active_pset_template, "template_type")
row = layout.row()
row.prop(props.active_pset_template, "applicable_entity")
def draw_pset_template(self):
if self.props.active_pset_template_id:
row = self.layout.row()
row.prop(self.props.active_pset_template, "name")
row = self.layout.row()
row.prop(self.props.active_pset_template, "description")
prop_with_search(self.layout, self.props.active_pset_template, "template_type")
row = self.layout.row()
row.prop(self.props.active_pset_template, "applicable_entity")
else:
pset_template = Data.pset_templates[int(props.pset_templates)]
for name, value in pset_template.items():
if name == "id" or name == "type" or name == "HasPropertyTemplates":
continue
row = layout.row(align=True)
for name, value in PsetTemplatesData.data["pset_template"].items():
row = self.layout.row(align=True)
row.label(text=name)
row.label(text=str(value))
row = layout.row(align=True)
row = self.layout.row(align=True)
row.label(text="Property Templates", icon="COPY_ID")
row.operator("bim.add_prop_template", icon="ADD", text="")
row = layout.row()
row.label(text="Name | Description | PrimaryMeasureType | TemplateType")
for prop_template in PsetTemplatesData.data["prop_templates"]:
row = self.layout.row(align=True)
for prop_template_id in pset_template["HasPropertyTemplates"]:
prop_template = Data.prop_templates[prop_template_id]
row = layout.row(align=True)
if self.props.active_prop_template_id and self.props.active_prop_template_id == prop_template["id"]:
row.prop(self.props.active_prop_template, "name", text="")
row.prop(self.props.active_prop_template, "description", text="")
prop_with_search(row, self.props.active_prop_template, "primary_measure_type", text="")
row.prop(self.props.active_prop_template, "template_type", text="")
if props.active_prop_template_id and props.active_prop_template_id == prop_template_id:
row.prop(props.active_prop_template, "name", text="")
row.prop(props.active_prop_template, "description", text="")
prop_with_search(row, props.active_prop_template, "primary_measure_type", text="")
row.prop(props.active_prop_template, "template_type", text="")
if props.active_prop_template.template_type == "P_ENUMERATEDVALUE":
row = layout.row(align=True)
if self.props.active_prop_template.template_type == "P_ENUMERATEDVALUE":
row = self.layout.row(align=True)
split = row.split(factor=0.2)
c = split.column()
c.label(
@@ -112,10 +100,10 @@ class BIM_PT_pset_template(Panel):
c = split.column()
box = c.box()
grid = box.column_flow(columns=4)
value_name = props.active_prop_template.get_value_name()
value_name = self.props.active_prop_template.get_value_name()
r = grid.row()
r.operator("bim.add_prop_enum", text="Add Enum")
for k, v in enumerate(props.active_prop_template.enum_values):
for k, v in enumerate(self.props.active_prop_template.enum_values):
r = grid.row(align=True)
r.prop(v, value_name, text="")
op = r.operator("bim.delete_prop_enum", icon="X", text="")
@@ -127,12 +115,12 @@ class BIM_PT_pset_template(Panel):
row.label(text=prop_template["PrimaryMeasureType"])
row.label(text=prop_template["TemplateType"])
if props.active_prop_template_id and props.active_prop_template_id == prop_template_id:
if self.props.active_prop_template_id and self.props.active_prop_template_id == prop_template["id"]:
op = row.operator("bim.edit_prop_template", icon="CHECKMARK", text="")
row.operator("bim.disable_editing_prop_template", icon="CANCEL", text="")
elif props.active_prop_template_id and props.active_prop_template_id != prop_template_id:
row.operator("bim.remove_prop_template", icon="X", text="").prop_template = prop_template_id
elif self.props.active_prop_template_id and self.props.active_prop_template_id != prop_template["id"]:
row.operator("bim.remove_prop_template", icon="X", text="").prop_template = prop_template["id"]
else:
op = row.operator("bim.enable_editing_prop_template", icon="GREASEPENCIL", text="")
op.prop_template = prop_template_id
row.operator("bim.remove_prop_template", icon="X", text="").prop_template = prop_template_id
op.prop_template = prop_template["id"]
row.operator("bim.remove_prop_template", icon="X", text="").prop_template = prop_template["id"]
+3
View File
@@ -150,6 +150,9 @@ class BIM_ADDON_preferences(bpy.types.AddonPreferences):
row = layout.row()
row.prop(self, "should_play_chaching_sound")
row = layout.row()
row.prop(context.scene.BIMProjectProperties, "should_disable_undo_on_save")
row = layout.row()
row.prop(context.scene.BIMModelProperties, "occurrence_name_style")
row = layout.row()