diff --git a/src/blenderbim/blenderbim/bim/module/classification/operator.py b/src/blenderbim/blenderbim/bim/module/classification/operator.py index b1dd53b8fd..66e26f5d2b 100644 --- a/src/blenderbim/blenderbim/bim/module/classification/operator.py +++ b/src/blenderbim/blenderbim/bim/module/classification/operator.py @@ -47,6 +47,10 @@ class AddClassification(bpy.types.Operator): bl_label = "Add Classification" bl_options = {"REGISTER", "UNDO"} + @classmethod + def poll(cls, context): + return getClassifications(context.scene.BIMClassificationProperties, context) + def execute(self, context): return IfcStore.execute_ifc_operator(self, context) @@ -77,9 +81,9 @@ class EnableEditingClassification(bpy.types.Operator): new.is_null = classification_data[attribute.name()] is None new.is_optional = attribute.optional() if attribute.name() == "ReferenceTokens": - new.string_value = "" if new.is_null else json.dumps(classification_data[attribute.name()]) + new.set_value("" if new.is_null else json.dumps(classification_data[attribute.name()])) else: - new.string_value = "" if new.is_null else classification_data[attribute.name()] + new.set_value("" if new.is_null else classification_data[attribute.name()]) props.active_classification_id = self.classification return {"FINISHED"} @@ -162,7 +166,7 @@ class EnableEditingClassificationReference(bpy.types.Operator): new.name = attribute.name() new.is_null = reference_data[attribute.name()] is None new.is_optional = attribute.optional() - new.string_value = "" if new.is_null else reference_data[attribute.name()] + new.set_value("" if new.is_null else reference_data[attribute.name()]) props.active_reference_id = self.reference return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/georeference/operator.py b/src/blenderbim/blenderbim/bim/module/georeference/operator.py index 2026de99e4..b3e9777435 100644 --- a/src/blenderbim/blenderbim/bim/module/georeference/operator.py +++ b/src/blenderbim/blenderbim/bim/module/georeference/operator.py @@ -49,14 +49,7 @@ class EnableEditingGeoreferencing(bpy.types.Operator): new.is_null = Data.projected_crs[attribute.name()] is None new.is_optional = attribute.optional() new.data_type = data_type - if data_type == "string": - new.string_value = "" if new.is_null else Data.projected_crs[attribute.name()] - elif data_type == "float": - new.float_value = 0.0 if new.is_null else Data.projected_crs[attribute.name()] - elif data_type == "integer": - new.int_value = 0 if new.is_null else Data.projected_crs[attribute.name()] - elif data_type == "boolean": - new.bool_value = False if new.is_null else Data.projected_crs[attribute.name()] + new.set_value(new.get_value_default() if new.is_null else Data.projected_crs[attribute.name()]) props.is_map_unit_null = Data.projected_crs["MapUnit"] is None if not props.is_map_unit_null: @@ -79,8 +72,7 @@ class EnableEditingGeoreferencing(bpy.types.Operator): new.is_null = Data.map_conversion[attribute.name()] is None new.is_optional = attribute.optional() # Enforce a string data type to prevent data loss in single-precision Blender props - new.data_type = "string" - new.string_value = "" if new.is_null else str(Data.map_conversion[attribute.name()]) + new.set_value("" if new.is_null else str(Data.map_conversion[attribute.name()])) props.has_true_north = bool(Data.true_north) if Data.true_north: diff --git a/src/blenderbim/blenderbim/bim/module/group/operator.py b/src/blenderbim/blenderbim/bim/module/group/operator.py index 0cd773791f..d1bc2b43cc 100644 --- a/src/blenderbim/blenderbim/bim/module/group/operator.py +++ b/src/blenderbim/blenderbim/bim/module/group/operator.py @@ -130,7 +130,7 @@ class EnableEditingGroup(bpy.types.Operator): new.name = attribute.name() new.is_null = data[attribute.name()] is None new.is_optional = attribute.optional() - new.string_value = "" if new.is_null else data[attribute.name()] + new.set_value("" if new.is_null else data[attribute.name()]) props.active_group_id = self.group return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/layer/operator.py b/src/blenderbim/blenderbim/bim/module/layer/operator.py index 2ebd391809..f077f2dfdb 100644 --- a/src/blenderbim/blenderbim/bim/module/layer/operator.py +++ b/src/blenderbim/blenderbim/bim/module/layer/operator.py @@ -73,7 +73,7 @@ class EnableEditingLayer(bpy.types.Operator): new.name = attribute.name() new.is_null = data[attribute.name()] is None new.is_optional = attribute.optional() - new.string_value = "" if new.is_null else data[attribute.name()] + new.set_value("" if new.is_null else data[attribute.name()]) props.active_layer_id = self.layer return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/material/operator.py b/src/blenderbim/blenderbim/bim/module/material/operator.py index 7637d98138..c19e3e6a2f 100644 --- a/src/blenderbim/blenderbim/bim/module/material/operator.py +++ b/src/blenderbim/blenderbim/bim/module/material/operator.py @@ -444,7 +444,7 @@ class EnableEditingAssignedMaterial(bpy.types.Operator): new = props.material_set_attributes.add() new.name = attribute.name() new.is_null = material_set_data[attribute.name()] is None - new.string_value = "" if new.is_null else material_set_data[attribute.name()] + new.set_value("" if new.is_null else material_set_data[attribute.name()]) return {"FINISHED"} def import_attributes(self, name, prop, data): @@ -600,14 +600,7 @@ class EnableEditingMaterialSetItem(bpy.types.Operator): new.name = attribute.name() new.is_null = material_set_item_data[attribute.name()] is None new.data_type = data_type - if data_type == "string": - new.string_value = "" if new.is_null else material_set_item_data[attribute.name()] - elif data_type == "float": - new.float_value = 0.0 if new.is_null else material_set_item_data[attribute.name()] - elif data_type == "integer": - new.int_value = 0 if new.is_null else material_set_item_data[attribute.name()] - elif data_type == "boolean": - new.bool_value = False if new.is_null else material_set_item_data[attribute.name()] + new.set_value(new.get_value_default() if new.is_null else material_set_item_data[attribute.name()]) def load_profile_attributes(self, material_set_item, material_set_item_data): self.props.material_set_item_profile_attributes.clear() @@ -628,18 +621,12 @@ class EnableEditingMaterialSetItem(bpy.types.Operator): new.is_null = profile_data[attribute.name()] is None new.is_optional = attribute.optional() new.data_type = data_type - if data_type == "string": - new.string_value = "" if new.is_null else profile_data[attribute.name()] - elif data_type == "float": - new.float_value = 0.0 if new.is_null else profile_data[attribute.name()] - elif data_type == "integer": - new.int_value = 0 if new.is_null else profile_data[attribute.name()] - elif data_type == "boolean": - new.bool_value = False if new.is_null else profile_data[attribute.name()] - elif data_type == "enum": + if data_type == "enum": new.enum_items = json.dumps(ifcopenshell.util.attribute.get_enum_items(attribute)) if profile_data[attribute.name()]: new.enum_value = profile_data[attribute.name()] + else: + new.set_value(new.get_value_default() if new.is_null else profile_data[attribute.name()]) # Force null to be false if the attribute is mandatory because when we first assign a profile, all of # its fields are null (which is illegal). diff --git a/src/blenderbim/blenderbim/bim/module/pset/operator.py b/src/blenderbim/blenderbim/bim/module/pset/operator.py index 3e6a6edf82..f3b41395c8 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/operator.py +++ b/src/blenderbim/blenderbim/bim/module/pset/operator.py @@ -141,18 +141,12 @@ class EnablePsetEditing(bpy.types.Operator): new.is_optional = True new.data_type = data_type - if data_type == "string": - new.string_value = "" if new.is_null else data[prop_template.Name] - elif data_type == "integer": - new.int_value = 0 if new.is_null else data[prop_template.Name] - elif data_type == "float": - new.float_value = 0.0 if new.is_null else data[prop_template.Name] - elif data_type == "boolean": - new.bool_value = False if new.is_null else data[prop_template.Name] - elif data_type == "enum": + if data_type == "enum": new.enum_items = json.dumps(enum_items) if data.get(prop_template.Name): new.enum_value = data[prop_template.Name] + else: + new.set_value(new.get_value_default() if new.is_null else data[prop_template.Name]) def load_from_pset_data(self, pset_data): for prop_id in pset_data["Properties"]: diff --git a/src/blenderbim/blenderbim/bim/module/structural/operator.py b/src/blenderbim/blenderbim/bim/module/structural/operator.py index 5bb3e1469b..9dd84c5942 100644 --- a/src/blenderbim/blenderbim/bim/module/structural/operator.py +++ b/src/blenderbim/blenderbim/bim/module/structural/operator.py @@ -176,8 +176,7 @@ class EnableEditingStructuralBoundaryCondition(bpy.types.Operator): new.data_type = "float" new.enum_value = [i for i in enum_items if i != "IfcBoolean"][0] elif data_type == "string": - new.string_value = "" if new.is_null else data[attribute.name()] - new.data_type = "string" + new.set_value("" if new.is_null else data[attribute.name()]) props.active_boundary_condition = self.boundary_condition return {"FINISHED"} @@ -359,8 +358,7 @@ class EnableEditingStructuralAnalysisModel(bpy.types.Operator): if data[attribute.name()]: new.enum_value = data[attribute.name()] else: - new.string_value = "" if new.is_null else data[attribute.name()] - new.data_type = "string" + new.set_value("" if new.is_null else data[attribute.name()]) props.active_structural_analysis_model_id = self.structural_analysis_model return {"FINISHED"} @@ -1097,8 +1095,7 @@ class EnableEditingBoundaryCondition(bpy.types.Operator): new.data_type = "float" new.enum_value = [i for i in enum_items if i != "IfcBoolean"][0] elif data_type == "string": - new.string_value = "" if new.is_null else data[attribute.name()] - new.data_type = "string" + new.set_value("" if new.is_null else data[attribute.name()]) props.active_boundary_condition_id = self.boundary_condition return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/system/operator.py b/src/blenderbim/blenderbim/bim/module/system/operator.py index 51597aa7c0..a798ef6394 100644 --- a/src/blenderbim/blenderbim/bim/module/system/operator.py +++ b/src/blenderbim/blenderbim/bim/module/system/operator.py @@ -130,7 +130,7 @@ class EnableEditingSystem(bpy.types.Operator): new.name = attribute.name() new.is_null = data[attribute.name()] is None new.is_optional = attribute.optional() - new.string_value = "" if new.is_null else data[attribute.name()] + new.set_value("" if new.is_null else data[attribute.name()]) props.active_system_id = self.system return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/unit/operator.py b/src/blenderbim/blenderbim/bim/module/unit/operator.py index d55c0cd3e6..a042f9fb61 100644 --- a/src/blenderbim/blenderbim/bim/module/unit/operator.py +++ b/src/blenderbim/blenderbim/bim/module/unit/operator.py @@ -248,8 +248,7 @@ class EnableEditingUnit(bpy.types.Operator): new.name = name new.is_null = data[name] is None new.is_optional = False - new.data_type = "string" - new.string_value = json.dumps([e for e in IfcStore.get_file().by_id(data["id"]).Dimensions]) + new.set_value(json.dumps([e for e in IfcStore.get_file().by_id(data["id"]).Dimensions])) return True