You can now add new profile definitions in the profile manager

This commit is contained in:
Dion Moult
2022-10-30 23:26:59 +11:00
parent d9f8aa4e7b
commit 0338825175
7 changed files with 54 additions and 6 deletions
+2
View File
@@ -26,6 +26,7 @@ from blenderbim.bim.module.drawing.prop import RasterStyleProperty
from bpy.app.handlers import persistent from bpy.app.handlers import persistent
from blenderbim.bim.ifc import IfcStore from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.module.owner.prop import get_user_person, get_user_organisation from blenderbim.bim.module.owner.prop import get_user_person, get_user_organisation
from blenderbim.bim.module.model.data import AuthoringData
from ifcopenshell.api.material.data import Data as MaterialData from ifcopenshell.api.material.data import Data as MaterialData
from ifcopenshell.api.type.data import Data as TypeData from ifcopenshell.api.type.data import Data as TypeData
@@ -301,3 +302,4 @@ def setDefaultProperties(scene):
drawing_style.name = "Blender Default" drawing_style.name = "Blender Default"
drawing_style.render_type = "DEFAULT" drawing_style.render_type = "DEFAULT"
bpy.ops.bim.save_drawing_style(index="2") bpy.ops.bim.save_drawing_style(index="2")
AuthoringData.type_thumbnails = {}
@@ -20,12 +20,13 @@ import bpy
from . import ui, prop, operator from . import ui, prop, operator
classes = ( classes = (
operator.LoadProfiles, operator.AddProfileDef,
operator.DisableProfileEditingUI,
operator.RemoveProfileDef,
operator.EnableEditingProfile,
operator.DisableEditingProfile, operator.DisableEditingProfile,
operator.DisableProfileEditingUI,
operator.EditProfile, operator.EditProfile,
operator.EnableEditingProfile,
operator.LoadProfiles,
operator.RemoveProfileDef,
prop.Profile, prop.Profile,
prop.BIMProfileProperties, prop.BIMProfileProperties,
ui.BIM_PT_profiles, ui.BIM_PT_profiles,
@@ -17,6 +17,7 @@
# along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>. # along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
import bpy import bpy
import ifcopenshell.util.doc
import blenderbim.tool as tool import blenderbim.tool as tool
@@ -30,9 +31,24 @@ class ProfileData:
@classmethod @classmethod
def load(cls): def load(cls):
cls.data = {"total_profiles": cls.total_profiles()} cls.data = {"total_profiles": cls.total_profiles(), "profile_classes": cls.profile_classes()}
cls.is_loaded = True cls.is_loaded = True
@classmethod @classmethod
def total_profiles(cls): def total_profiles(cls):
return len(tool.Ifc.get().by_type("IfcProfileDef")) return len(tool.Ifc.get().by_type("IfcProfileDef"))
@classmethod
def profile_classes(cls):
classes = ["IfcArbitraryClosedProfileDef"]
queue = ["IfcParameterizedProfileDef"]
while queue:
item = queue.pop()
subtypes = [s.name() for s in tool.Ifc.schema().declaration_by_name(item).subtypes()]
classes.extend(subtypes)
queue.extend(subtypes)
schema_identifier = tool.Ifc.get_schema()
return [
(c, c, ifcopenshell.util.doc.get_entity_doc(schema_identifier, c)["description"] or "")
for c in sorted(classes)
]
@@ -99,3 +99,20 @@ class EditProfile(bpy.types.Operator, tool.Ifc.Operator):
ifcopenshell.api.run("profile.edit_profile", tool.Ifc.get(), profile=profile, attributes=attributes) ifcopenshell.api.run("profile.edit_profile", tool.Ifc.get(), profile=profile, attributes=attributes)
bpy.ops.bim.load_profiles() bpy.ops.bim.load_profiles()
return {"FINISHED"} return {"FINISHED"}
class AddProfileDef(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.add_profile_def"
bl_label = "Add Profile"
bl_options = {"REGISTER", "UNDO"}
def _execute(self, context):
props = context.scene.BIMProfileProperties
profile_class = props.profile_classes
if profile_class == "IfcArbitraryClosedProfileDef":
points = [(0, 0), (0.1, 0), (0.1, 0.1), (0, 0.1)]
ifcopenshell.api.run("profile.add_arbitrary_profile", tool.Ifc.get(), profile=points)
else:
ifcopenshell.api.run("profile.add_parameterized_profile", tool.Ifc.get(), ifc_class=profile_class)
bpy.ops.bim.load_profiles()
return {"FINISHED"}
@@ -22,6 +22,7 @@ import ifcopenshell.util.schema
import ifcopenshell.util.attribute import ifcopenshell.util.attribute
from blenderbim.bim.ifc import IfcStore from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.prop import StrProperty, Attribute from blenderbim.bim.prop import StrProperty, Attribute
from blenderbim.bim.module.profile.data import ProfileData
from bpy.types import PropertyGroup from bpy.types import PropertyGroup
from bpy.props import ( from bpy.props import (
PointerProperty, PointerProperty,
@@ -35,6 +36,12 @@ from bpy.props import (
) )
def get_profile_classes(self, context):
if not ProfileData.is_loaded:
ProfileData.load()
return ProfileData.data["profile_classes"]
class Profile(PropertyGroup): class Profile(PropertyGroup):
name: StringProperty(name="Name") name: StringProperty(name="Name")
ifc_definition_id: IntProperty(name="IFC Definition ID") ifc_definition_id: IntProperty(name="IFC Definition ID")
@@ -46,3 +53,4 @@ class BIMProfileProperties(PropertyGroup):
active_profile_index: IntProperty(name="Active Profile Index") active_profile_index: IntProperty(name="Active Profile Index")
active_profile_id: IntProperty(name="Active Profile Id") active_profile_id: IntProperty(name="Active Profile Id")
profile_attributes: CollectionProperty(name="Profile Attributes", type=Attribute) profile_attributes: CollectionProperty(name="Profile Attributes", type=Attribute)
profile_classes: EnumProperty(items=get_profile_classes, name="Profile Classes")
@@ -50,6 +50,10 @@ class BIM_PT_profiles(Panel):
if not self.props.is_editing: if not self.props.is_editing:
return return
row = self.layout.row(align=True)
row.prop(self.props, "profile_classes", text="")
row.operator("bim.add_profile_def", text="", icon="ADD")
self.layout.template_list( self.layout.template_list(
"BIM_UL_profiles", "BIM_UL_profiles",
"", "",
+1 -1
View File
@@ -242,7 +242,7 @@ class Attribute(PropertyGroup):
has_calculator: BoolProperty(name="Has Calculator", default=False) has_calculator: BoolProperty(name="Has Calculator", default=False)
def get_value(self): def get_value(self):
if self.is_null: if self.is_optional and self.is_null:
return None return None
return getattr(self, str(self.get_value_name()), None) return getattr(self, str(self.get_value_name()), None)