WIP merge MVDs into geometry workarounds UI. Cleaner, more usable import / export UI. Remove obsoleted MVD options. See #1222.

This commit is contained in:
Dion Moult
2021-01-24 14:33:56 +11:00
parent 900aa20e10
commit 9d893d2c5a
15 changed files with 191 additions and 226 deletions
@@ -188,7 +188,6 @@ if bpy is not None:
ui.BIM_PT_library,
ui.BIM_PT_presentation_layers,
ui.BIM_PT_patch,
ui.BIM_PT_mvd,
ui.BIM_PT_presentation_layer_data,
ui.BIM_PT_object_structural,
ui.BIM_PT_camera,
@@ -93,6 +93,4 @@ class IfcExportSettings:
settings = IfcExportSettings()
settings.output_file = output_file
settings.logger = logger
settings.json_version = scene_bim.export_json_version
settings.json_compact = scene_bim.export_json_compact
return settings
@@ -51,9 +51,7 @@ class MaterialCreator:
hasattr(element, "RepresentationMaps") and not element.RepresentationMaps
):
return
if not self.mesh:
return
if self.mesh.name in self.parsed_meshes:
if not self.mesh or self.mesh.name in self.parsed_meshes:
return
self.parsed_meshes.add(self.mesh.name)
if self.parse_representations(element):
@@ -97,10 +95,9 @@ class MaterialCreator:
return True
style = bpy.data.materials.get(style_name)
if not style:
style = bpy.data.materials.new(style_name)
self.parse_styled_item(styled_item, style)
self.parse_styled_item(styled_item, style)
self.assign_style_to_mesh(style)
item_id.slot_index = len(self.mesh.materials) - 1
@@ -312,8 +309,6 @@ class IfcImporter:
self.material_creator = MaterialCreator(ifc_import_settings, self)
def profile_code(self, message):
if not self.ifc_import_settings.should_import_with_profiling:
return
if not self.time:
self.time = time.time()
print("{} :: {:.2f}".format(message, time.time() - self.time))
@@ -352,14 +347,14 @@ class IfcImporter:
self.profile_code("Create opening collection")
self.process_element_filter()
self.profile_code("Process element filter")
if self.ifc_import_settings.should_import_native:
self.parse_native_elements()
self.profile_code("Parsing native elements")
# TODO: Deprecate
#self.parse_native_elements()
#self.profile_code("Parsing native elements")
self.create_grids()
self.profile_code("Creating grids")
if self.ifc_import_settings.should_import_native:
self.create_native_products()
self.profile_code("Creating native products")
# TODO: Deprecate
#self.create_native_products()
#self.profile_code("Creating native products")
self.create_products()
self.profile_code("Creating meshified products")
self.relate_openings()
@@ -1574,20 +1569,24 @@ class IfcImportSettings:
def __init__(self):
self.logger = None
self.input_file = None
self.should_auto_set_workarounds = True
self.should_ignore_site_coordinates = False
self.should_ignore_building_coordinates = False
self.should_merge_materials_by_colour = False
self.should_import_type_representations = False
self.should_import_curves = False
self.should_import_spaces = False
self.should_use_cpu_multiprocessing = False
self.should_import_with_profiling = False
self.should_import_native = False
self.should_merge_by_class = False
self.should_merge_by_material = False
self.should_clean_mesh = True
self.diff_file = None
self.should_import_type_representations: False
self.should_import_curves: False
self.should_import_spaces: False
self.should_auto_set_workarounds: True
self.should_use_cpu_multiprocessing: True
self.should_merge_by_class: False
self.should_merge_by_material: False
self.should_merge_materials_by_colour: False
self.should_clean_mesh: True
self.deflection_tolerance: 0.001
self.angular_tolerance: 0.5
self.should_allow_non_element_aggregates: False
self.should_offset_model: False
self.model_offset_coordinates: (0, 0, 0)
self.ifc_import_filter: "NONE"
self.ifc_selector: ""
@staticmethod
def factory(context, input_file, logger):
@@ -1597,27 +1596,4 @@ class IfcImportSettings:
settings.input_file = input_file
settings.logger = logger
settings.diff_file = scene_diff.diff_json_file
settings.ifc_import_filter = scene_bim.ifc_import_filter
settings.ifc_selector = scene_bim.ifc_selector
settings.should_import_type_representations = scene_bim.import_should_import_type_representations
settings.should_import_curves = scene_bim.import_should_import_curves
settings.should_import_spaces = scene_bim.import_should_import_spaces
settings.should_auto_set_workarounds = scene_bim.import_should_auto_set_workarounds
settings.should_use_cpu_multiprocessing = scene_bim.import_should_use_cpu_multiprocessing
settings.should_import_with_profiling = scene_bim.import_should_import_with_profiling
settings.should_import_native = scene_bim.import_should_import_native
settings.should_roundtrip_native = scene_bim.import_export_should_roundtrip_native
settings.should_merge_by_class = scene_bim.import_should_merge_by_class
settings.should_merge_by_material = scene_bim.import_should_merge_by_material
settings.should_merge_materials_by_colour = scene_bim.import_should_merge_materials_by_colour
settings.should_clean_mesh = scene_bim.import_should_clean_mesh
settings.should_allow_non_element_aggregates = scene_bim.import_should_allow_non_element_aggregates
settings.should_offset_model = scene_bim.import_should_offset_model
settings.model_offset_coordinates = (
[float(o) for o in scene_bim.import_model_offset_coordinates.split(",")]
if scene_bim.import_model_offset_coordinates
else (0, 0, 0)
)
settings.deflection_tolerance = scene_bim.import_deflection_tolerance
settings.angular_tolerance = scene_bim.import_angular_tolerance
return settings
@@ -30,4 +30,4 @@ def register():
def unregister():
del bpy.types.Scene.BIMConstraintProperties
del bpy.types.Scene.BIMObjectConstraintProperties
del bpy.types.Object.BIMObjectConstraintProperties
@@ -33,4 +33,4 @@ def register():
def unregister():
del bpy.types.Scene.BIMDocumentProperties
del bpy.types.Scene.BIMObjectDocumentProperties
del bpy.types.Object.BIMObjectDocumentProperties
@@ -1,5 +1,5 @@
import bpy
from . import ui, operator
from . import ui, prop, operator
classes = (
operator.EditObjectPlacement,
@@ -9,14 +9,18 @@ classes = (
operator.UpdateMeshRepresentation,
operator.UpdateParametricRepresentation,
operator.GetRepresentationIfcParameters,
prop.BIMGeometryProperties,
ui.BIM_PT_representations,
ui.BIM_PT_mesh,
ui.BIM_PT_workarounds,
)
def register():
bpy.types.Scene.BIMGeometryProperties = bpy.props.PointerProperty(type=prop.BIMGeometryProperties)
bpy.types.OBJECT_PT_transform.append(ui.BIM_PT_transform)
def unregister():
bpy.types.OBJECT_PT_transform.remove(ui.BIM_PT_transform)
del bpy.types.Scene.BIMGeometryProperties
@@ -1,3 +1,5 @@
import bpy
import bmesh
import ifcopenshell.util.unit
@@ -7,10 +9,12 @@ class Usecase:
self.file = file
self.settings = {
"context": None, # IfcGeometricRepresentationContext
"blender_object": None, # This is (currently) a Blender object, hence this depends on Blender now
"geometry": None, # This is (currently) a Blender data object, hence this depends on Blender now
"total_items": 1, # How many representation items to create
"unit_scale": None, # A scale factor to apply for all vectors in case the unit is different
"should_force_faceted_brep": False, # If we should force faceted breps for meshes
"should_force_triangulation": False, # If we should force triangulation for meshes
"is_wireframe": False, # If the geometry is a wireframe
"is_curve": False, # If the geometry is a Blender curve
"is_point_cloud": False, # If the geometry is a point cloud
@@ -20,6 +24,7 @@ class Usecase:
self.settings[key] = value
def execute(self):
self.evaluate_geometry()
if self.settings["unit_scale"] is None:
self.settings["unit_scale"] = ifcopenshell.util.unit.calculate_unit_scale(self.file)
if self.settings["context"].ContextType == "Model":
@@ -28,6 +33,34 @@ class Usecase:
return self.create_plan_representation()
return self.create_variable_representation()
def evaluate_geometry(self):
self.boolean_modifiers = []
for modifier in self.settings["blender_object"].modifiers:
if not modifier.type == "BOOLEAN":
continue
modifier_data = {}
for name in ["operation", "operand_type", "object", "solver", "use_self"]:
modifier_data[name] = getattr(modifier, name)
self.boolean_modifiers.append(modifier_data)
self.settings["blender_object"].modifiers.remove(modifier)
if self.settings["should_force_triangulation"]:
mesh = self.settings["blender_object"].evaluated_get(bpy.context.evaluated_depsgraph_get()).to_mesh()
bm = bmesh.new()
bm.from_mesh(mesh)
bmesh.ops.triangulate(bm, faces=bm.faces)
bm.to_mesh(mesh)
bm.free()
del bm
self.settings["geometry"] = mesh
else:
self.settings["geometry"] = self.settings["blender_object"].evaluated_get(bpy.context.evaluated_depsgraph_get()).to_mesh()
for modifier in self.boolean_modifiers:
new = self.settings["blender_object"].modifiers.new("IfcOpeningElement", "BOOLEAN")
for key, value in modifier.items():
setattr(new, key, value)
def create_model_representation(self):
if self.settings["context"].is_a() == "IfcGeometricRepresentationContext":
return self.create_variable_representation()
@@ -39,7 +39,10 @@ class Usecase:
ifcopenshell.util.element.replace_attribute(
inverse, self.settings["product"].ObjectPlacement, placement
)
self.file.remove(self.settings["product"].ObjectPlacement)
old = self.settings["product"].ObjectPlacement
self.settings["product"].ObjectPlacement = None
if not self.file.get_inverse(old):
ifcopenshell.util.element.remove_deep(self.file, old)
self.settings["product"].ObjectPlacement = placement
for settings in dependent_objects:
@@ -76,8 +76,11 @@ class AddRepresentation(bpy.types.Operator):
self.file,
{
"context": self.file.by_id(context_id),
"blender_object": obj,
"geometry": obj.data,
"total_items": max(1, len(obj.material_slots)),
"should_force_faceted_brep": context.scene.BIMGeometryProperties.should_force_faceted_brep,
"should_force_triangulation": context.scene.BIMGeometryProperties.should_force_triangulation
},
).execute()
if not result:
@@ -92,6 +95,7 @@ class AddRepresentation(bpy.types.Operator):
for s in obj.material_slots
if s.material
],
"should_use_presentation_style_assignment": context.scene.BIMGeometryProperties.should_use_presentation_style_assignment
},
).execute()
assign_representation.Usecase(
@@ -183,8 +187,11 @@ class UpdateMeshRepresentation(bpy.types.Operator):
self.file,
{
"context": old_representation.ContextOfItems,
"blender_object": obj,
"geometry": obj.data,
"total_items": max(1, len(obj.material_slots)),
"should_force_faceted_brep": context.scene.BIMGeometryProperties.should_force_faceted_brep,
"should_force_triangulation": context.scene.BIMGeometryProperties.should_force_triangulation
},
).execute()
if not new_representation:
@@ -200,6 +207,7 @@ class UpdateMeshRepresentation(bpy.types.Operator):
for s in obj.material_slots
if s.material
],
"should_use_presentation_style_assignment": context.scene.BIMGeometryProperties.should_use_presentation_style_assignment
},
).execute()
@@ -0,0 +1,22 @@
import bpy
from blenderbim.bim.prop import StrProperty, Attribute
from bpy.types import PropertyGroup
from bpy.props import (
PointerProperty,
StringProperty,
EnumProperty,
BoolProperty,
IntProperty,
FloatProperty,
FloatVectorProperty,
CollectionProperty,
)
class BIMGeometryProperties(PropertyGroup):
# Revit workaround
should_use_presentation_style_assignment: BoolProperty(name="Force Presentation Style Assignment", default=False)
# RIB iTwo, DESITE BIM workaround
should_force_faceted_brep: BoolProperty(name="Force Faceted Breps", default=False)
# Navisworks workaround
should_force_triangulation: BoolProperty(name="Force Triangulation", default=False)
@@ -1,3 +1,5 @@
import ifcopenshell.util.element
class Usecase:
def __init__(self, file, settings=None):
self.file = file
@@ -6,17 +8,10 @@ class Usecase:
self.settings[key] = value
def execute(self):
styles = []
dummy_context = self.file.create_entity("IfcRepresentationContext")
for subelement in self.file.traverse(self.settings["representation"]):
if subelement.is_a("IfcRepresentationItem") and subelement.StyledByItem:
styles.append(subelement)
for style in styles:
self.remove_deep(style)
self.remove_deep(self.settings["representation"])
def remove_deep(self, element):
subgraph = list(self.file.traverse(element))
subgraph_set = set(subgraph)
for ref in subgraph[::-1]:
if ref.id() and len(set(self.file.get_inverse(ref)) - subgraph_set) == 0:
self.file.remove(ref)
[self.file.remove(s) for s in subelement.StyledByItem]
elif subelement.is_a("IfcRepresentation"):
subelement.ContextOfItems = dummy_context
ifcopenshell.util.element.remove_deep(self.file, self.settings["representation"])
@@ -55,6 +55,7 @@ class BIM_PT_mesh(Panel):
context.active_object is not None
and context.active_object.type == "MESH"
and hasattr(context.active_object.data, "BIMMeshProperties")
and context.active_object.data.BIMMeshProperties.ifc_definition_id
)
def draw(self, context):
@@ -78,3 +79,30 @@ def BIM_PT_transform(self, context):
if context.active_object and context.active_object.BIMObjectProperties.ifc_definition_id:
row = self.layout.row()
row.operator("bim.edit_object_placement")
class BIM_PT_workarounds(Panel):
bl_label = "IFC Vendor Workarounds"
bl_idname = "BIM_PT_workarounds"
bl_options = {"DEFAULT_CLOSED"}
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "data"
@classmethod
def poll(cls, context):
return (
context.active_object is not None
and context.active_object.type == "MESH"
and hasattr(context.active_object.data, "BIMMeshProperties")
and context.active_object.data.BIMMeshProperties.ifc_definition_id
)
def draw(self, context):
props = context.scene.BIMGeometryProperties
row = self.layout.row()
row.prop(props, "should_force_faceted_brep")
row = self.layout.row()
row.prop(props, "should_force_triangulation")
row = self.layout.row()
row.prop(props, "should_use_presentation_style_assignment")
@@ -66,6 +66,8 @@ class ExportIFC(bpy.types.Operator):
bl_label = "Export IFC"
filename_ext = ".ifc"
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
json_version: bpy.props.EnumProperty(items=[("4", "4", ""), ("5a", "5a", "")], name="IFC JSON Version")
json_compact: bpy.props.BoolProperty(name="Export Compact IFCJSON", default=False)
def invoke(self, context, event):
if not self.filepath:
@@ -87,11 +89,15 @@ class ExportIFC(bpy.types.Operator):
output_file = bpy.path.ensure_ext(self.filepath, ".ifcjson")
else:
output_file = bpy.path.ensure_ext(self.filepath, ".ifc")
ifc_export_settings = export_ifc.IfcExportSettings.factory(context, output_file, logger)
ifc_exporter = export_ifc.IfcExporter(ifc_export_settings)
ifc_export_settings.logger.info("Starting export")
settings = export_ifc.IfcExportSettings.factory(context, output_file, logger)
settings.json_version = self.json_version
settings.json_compact = self.json_compact
ifc_exporter = export_ifc.IfcExporter(settings)
settings.logger.info("Starting export")
ifc_exporter.export()
ifc_export_settings.logger.info("Export finished in {:.2f} seconds".format(time.time() - start))
settings.logger.info("Export finished in {:.2f} seconds".format(time.time() - start))
if not bpy.context.scene.DocProperties.ifc_files:
new = bpy.context.scene.DocProperties.ifc_files.add()
new.name = output_file
@@ -106,17 +112,59 @@ class ImportIFC(bpy.types.Operator, ImportHelper):
filename_ext = ".ifc"
filter_glob: bpy.props.StringProperty(default="*.ifc;*.ifczip;*.ifcxml", options={"HIDDEN"})
should_import_type_representations: bpy.props.BoolProperty(name="Import Type Representations", default=False)
should_import_curves: bpy.props.BoolProperty(name="Import Curves", default=False)
should_import_spaces: bpy.props.BoolProperty(name="Import Spaces", default=False)
should_auto_set_workarounds: bpy.props.BoolProperty(name="Automatically Set Vendor Workarounds", default=True)
should_use_cpu_multiprocessing: bpy.props.BoolProperty(name="Import with CPU Multiprocessing", default=True)
should_merge_by_class: bpy.props.BoolProperty(name="Import and Merge by Class", default=False)
should_merge_by_material: bpy.props.BoolProperty(name="Import and Merge by Material", default=False)
should_merge_materials_by_colour: bpy.props.BoolProperty(name="Import and Merge Materials by Colour", default=False)
should_clean_mesh: bpy.props.BoolProperty(name="Import and Clean Mesh", default=True)
deflection_tolerance: bpy.props.FloatProperty(name="Import Deflection Tolerance", default=0.001)
angular_tolerance: bpy.props.FloatProperty(name="Import Angular Tolerance", default=0.5)
should_allow_non_element_aggregates: bpy.props.BoolProperty(name="Import Non-Element Aggregates", default=False)
should_offset_model: bpy.props.BoolProperty(name="Import and Offset Model", default=False)
model_offset_coordinates: bpy.props.StringProperty(name="Model Offset Coordinates", default="0,0,0")
ifc_import_filter: bpy.props.EnumProperty(
items=[("NONE", "None", ""), ("WHITELIST", "Whitelist", ""), ("BLACKLIST", "Blacklist", ""),],
name="Import Filter",
)
ifc_selector: bpy.props.StringProperty(default="", name="IFC Selector")
def execute(self, context):
start = time.time()
logger = logging.getLogger("ImportIFC")
logging.basicConfig(
filename=bpy.context.scene.BIMProperties.data_dir + "process.log", filemode="a", level=logging.DEBUG
)
ifc_import_settings = import_ifc.IfcImportSettings.factory(context, self.filepath, logger)
ifc_import_settings.logger.info("Starting import")
ifc_importer = import_ifc.IfcImporter(ifc_import_settings)
settings = import_ifc.IfcImportSettings.factory(context, self.filepath, logger)
settings.should_import_type_representations = self.should_import_type_representations
settings.should_import_curves = self.should_import_curves
settings.should_import_spaces = self.should_import_spaces
settings.should_auto_set_workarounds = self.should_auto_set_workarounds
settings.should_use_cpu_multiprocessing = self.should_use_cpu_multiprocessing
settings.should_merge_by_class = self.should_merge_by_class
settings.should_merge_by_material = self.should_merge_by_material
settings.should_merge_materials_by_colour = self.should_merge_materials_by_colour
settings.should_clean_mesh = self.should_clean_mesh
settings.deflection_tolerance = self.deflection_tolerance
settings.angular_tolerance = self.angular_tolerance
settings.should_allow_non_element_aggregates = self.should_allow_non_element_aggregates
settings.should_offset_model = self.should_offset_model
settings.model_offset_coordinates = (
[float(o) for o in self.model_offset_coordinates.split(",")]
if self.model_offset_coordinates
else (0, 0, 0)
)
settings.ifc_import_filter = self.ifc_import_filter
settings.ifc_selector = self.ifc_selector
settings.logger.info("Starting import")
ifc_importer = import_ifc.IfcImporter(settings)
ifc_importer.execute()
ifc_import_settings.logger.info("Import finished in {:.2f} seconds".format(time.time() - start))
settings.logger.info("Import finished in {:.2f} seconds".format(time.time() - start))
print("Import finished in {:.2f} seconds".format(time.time() - start))
return {"FINISHED"}
@@ -1249,6 +1297,7 @@ class CopyAttributeToSelection(bpy.types.Operator):
attribute_value: bpy.props.StringProperty()
def execute(self, context):
# TODO: reimplement
self.schema = ifcopenshell.ifcopenshell_wrapper.schema_by_name(bpy.context.scene.BIMProperties.export_schema)
self.applicable_attributes_cache = {}
for obj in bpy.context.selected_objects:
@@ -295,18 +295,6 @@ def getMaterialPsetNames(self, context):
return materialpsetnames_enum
def getApplicableMaterialAttributes(self, context):
global materialattributes_enum
materialattributes_enum.clear()
if "/" in context.active_object.name:
ifc_schema = ifcopenshell.ifcopenshell_wrapper.schema_by_name(bpy.context.scene.BIMProperties.export_schema)
entity = ifc_schema.declaration_by_name("IfcMaterial")
materialattributes_enum.extend(
[(a.name(), a.name(), "") for a in entity.all_attributes() if self.attributes.find(a.name()) == -1]
)
return materialattributes_enum
def getContexts(self, context):
from blenderbim.bim.module.context.data import Data
if not Data.is_loaded:
@@ -699,36 +687,6 @@ class BIMProperties(PropertyGroup):
data_dir: StringProperty(default=os.path.join(cwd, "data") + os.path.sep, name="Data Directory")
ifc_file: StringProperty(name="IFC File")
export_schema: EnumProperty(items=[("IFC4", "IFC4", ""), ("IFC2X3", "IFC2X3", "")], name="IFC Schema")
export_json_version: EnumProperty(items=[("4", "4", ""), ("5a", "5a", "")], name="IFC JSON Version")
export_json_compact: BoolProperty(name="Export Compact IFCJSON", default=False)
export_has_representations: BoolProperty(name="Export Representations", default=True)
export_should_guess_quantities: BoolProperty(name="Export with Guessed Quantities", default=False)
export_should_use_presentation_style_assignment: BoolProperty(
name="Export with Presentation Style Assignment", default=False
)
export_should_force_faceted_brep: BoolProperty(name="Export with Faceted Breps", default=False)
export_should_force_triangulation: BoolProperty(name="Export with Triangulation", default=False)
import_should_import_type_representations: BoolProperty(name="Import Type Representations", default=False)
import_should_import_curves: BoolProperty(name="Import Curves", default=False)
import_should_import_opening_elements: BoolProperty(name="Import Opening Elements", default=False)
import_should_import_spaces: BoolProperty(name="Import Spaces", default=False)
import_should_auto_set_workarounds: BoolProperty(name="Automatically Set Vendor Workarounds", default=True)
import_should_import_native: BoolProperty(name="Import Native Representations", default=False)
import_export_should_roundtrip_native: BoolProperty(name="Roundtrip Native Representations", default=True)
import_should_use_cpu_multiprocessing: BoolProperty(name="Import with CPU Multiprocessing", default=True)
import_should_import_with_profiling: BoolProperty(name="Import with Profiling", default=True)
import_should_import_aggregates: BoolProperty(name="Import Aggregates", default=True)
import_should_merge_by_class: BoolProperty(name="Import and Merge by Class", default=False)
import_should_merge_by_material: BoolProperty(name="Import and Merge by Material", default=False)
import_should_merge_materials_by_colour: BoolProperty(name="Import and Merge Materials by Colour", default=False)
import_should_clean_mesh: BoolProperty(name="Import and Clean Mesh", default=True)
import_deflection_tolerance: FloatProperty(name="Import Deflection Tolerance", default=0.001)
import_angular_tolerance: FloatProperty(name="Import Angular Tolerance", default=0.5)
import_should_allow_non_element_aggregates: BoolProperty(name="Import Non-Element Aggregates", default=False)
import_should_offset_model: BoolProperty(name="Import and Offset Model", default=False)
import_model_offset_coordinates: StringProperty(name="Model Offset Coordinates", default="0,0,0")
has_georeferencing: BoolProperty(name="Has Georeferencing", default=False)
has_library: BoolProperty(name="Has Project Library", default=False)
contexts: EnumProperty(items=getContexts, name="Contexts")
available_contexts: EnumProperty(items=[("Model", "Model", ""), ("Plan", "Plan", "")], name="Available Contexts")
@@ -744,11 +702,6 @@ class BIMProperties(PropertyGroup):
section_plane_colour: FloatVectorProperty(
name="Temporary Section Cutaway Colour", subtype="COLOR", default=(1, 0, 0), min=0.0, max=1.0
)
ifc_import_filter: EnumProperty(
items=[("NONE", "None", ""), ("WHITELIST", "Whitelist", ""), ("BLACKLIST", "Blacklist", ""),],
name="Import Filter",
)
ifc_selector: StringProperty(default="", name="IFC Selector")
blender_clash_set_a: CollectionProperty(name="Blender Clash Set A", type=StrProperty)
blender_clash_set_b: CollectionProperty(name="Blender Clash Set B", type=StrProperty)
clash_sets: CollectionProperty(name="Clash Sets", type=ClashSet)
@@ -874,7 +827,6 @@ class BIMMaterialProperties(PropertyGroup):
pset_name: EnumProperty(items=getMaterialPsetNames, name="Pset Name")
psets: CollectionProperty(name="Psets", type=PsetQto)
attributes: CollectionProperty(name="Attributes", type=Attribute)
applicable_attributes: EnumProperty(items=getApplicableMaterialAttributes, name="Attribute Names")
# In Blender, a material object can map to an IFC material, IFC surface style, or both
ifc_style_id: IntProperty(name="IFC Style ID")
-102
View File
@@ -477,108 +477,6 @@ class BIM_PT_patch(Panel):
op = row.operator("bim.execute_ifc_patch")
class BIM_PT_mvd(Panel):
bl_label = "Model View Definitions (MVD)"
bl_idname = "BIM_PT_mvd"
bl_options = {"DEFAULT_CLOSED"}
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "scene"
def draw(self, context):
layout = self.layout
scene = context.scene
bim_properties = scene.BIMProperties
row = layout.row()
row.prop(bim_properties, "export_schema")
row = layout.row()
row.prop(bim_properties, "export_json_version")
row = layout.row()
row.prop(bim_properties, "ifc_import_filter")
row = layout.row()
row.prop(bim_properties, "ifc_selector")
layout.label(text="Custom MVD:")
row = layout.row()
row.prop(bim_properties, "export_has_representations")
row = layout.row()
row.prop(bim_properties, "export_should_guess_quantities")
row = layout.row()
row.prop(bim_properties, "export_should_force_faceted_brep")
row = layout.row()
row.prop(bim_properties, "import_should_import_type_representations")
row = layout.row()
row.prop(bim_properties, "import_should_import_curves")
row = layout.row()
row.prop(bim_properties, "import_should_import_spaces")
layout.label(text="Experimental Modes:")
row = layout.row()
row.prop(bim_properties, "import_should_import_native")
row = layout.row()
row.prop(bim_properties, "import_export_should_roundtrip_native")
row = layout.row()
row.prop(bim_properties, "import_should_use_cpu_multiprocessing")
row = layout.row()
row.prop(bim_properties, "import_should_import_with_profiling")
row = layout.row()
row.prop(bim_properties, "import_deflection_tolerance")
row = layout.row()
row.prop(bim_properties, "import_angular_tolerance")
row = layout.row()
row.prop(bim_properties, "export_json_compact")
layout.label(text="Simplifications:")
row = layout.row()
row.prop(bim_properties, "import_should_merge_by_class")
row = layout.row()
row.prop(bim_properties, "import_should_merge_by_material")
row = layout.row()
row.prop(bim_properties, "import_should_merge_materials_by_colour")
row = layout.row()
row.prop(bim_properties, "import_should_clean_mesh")
layout.label(text="Vendor Workarounds:")
row = layout.row()
row.prop(bim_properties, "import_should_auto_set_workarounds")
layout.label(text="RIB iTWO Workarounds:")
row = layout.row()
row.prop(bim_properties, "export_should_force_faceted_brep")
layout.label(text="DESITE BIM Workarounds:")
row = layout.row()
row.prop(bim_properties, "export_should_force_faceted_brep")
layout.label(text="Navisworks Workarounds:")
row = layout.row()
row.prop(bim_properties, "export_should_force_triangulation")
layout.label(text="ProStructures Workarounds:")
row = layout.row()
row.prop(bim_properties, "import_should_allow_non_element_aggregates")
row = layout.row()
row.prop(bim_properties, "import_should_offset_model")
row = layout.row()
row.prop(bim_properties, "import_model_offset_coordinates")
layout.label(text="Revit Workarounds:")
row = layout.row()
row.prop(bim_properties, "export_should_use_presentation_style_assignment")
class BIM_UL_generic(bpy.types.UIList):
def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
if item: