Merge branch 'IfcOpenShell-v0.7.0' into v0.7.0

This commit is contained in:
Carlos Villagrasa
2022-07-26 01:39:49 +02:00
9 changed files with 33 additions and 22 deletions
@@ -768,6 +768,8 @@ class ActivateBcfViewpoint(bpy.types.Operator):
bcfxml = bcfstore.BcfStore.get_bcfxml() bcfxml = bcfstore.BcfStore.get_bcfxml()
props = context.scene.BCFProperties props = context.scene.BCFProperties
blender_topic = props.active_topic blender_topic = props.active_topic
if blender_topic is None:
return False
topic = bcfxml.topics[blender_topic.name] topic = bcfxml.topics[blender_topic.name]
return topic.viewpoints return topic.viewpoints
@@ -95,7 +95,7 @@ def getBcfViewpoints(self, context, force_update=False):
props = context.scene.BCFProperties props = context.scene.BCFProperties
bcfxml = bcfstore.BcfStore.get_bcfxml() bcfxml = bcfstore.BcfStore.get_bcfxml()
topic = props.active_topic topic = props.active_topic
viewpoints = bcfxml.get_viewpoints(topic.name) viewpoints = bcfxml.get_viewpoints(topic.name) if topic else {}
bcfviewpoints_enum.extend([(v, f"Viewpoint {i+1}", "") for i, v in enumerate(viewpoints.keys())]) bcfviewpoints_enum.extend([(v, f"Viewpoint {i+1}", "") for i, v in enumerate(viewpoints.keys())])
return bcfviewpoints_enum return bcfviewpoints_enum
@@ -132,7 +132,7 @@ class UpdateRepresentation(bpy.types.Operator):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return context.active_object.mode == "OBJECT" return context.active_object and context.active_object.mode == "OBJECT"
def execute(self, context): def execute(self, context):
return IfcStore.execute_ifc_operator(self, context) return IfcStore.execute_ifc_operator(self, context)
@@ -240,7 +240,7 @@ class UpdateParametricRepresentation(bpy.types.Operator):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return context.active_object.mode == "OBJECT" return context.active_object and context.active_object.mode == "OBJECT"
def execute(self, context): def execute(self, context):
self.file = IfcStore.get_file() self.file = IfcStore.get_file()
@@ -678,7 +678,7 @@ class LinkIfc(bpy.types.Operator):
if self.use_relative_path: if self.use_relative_path:
filepath = os.path.relpath(filepath, bpy.path.abspath("//")) filepath = os.path.relpath(filepath, bpy.path.abspath("//"))
new.name = filepath new.name = filepath
bpy.ops.bim.load_link(filepath=self.filepath) bpy.ops.bim.load_link(filepath=filepath)
return {"FINISHED"} return {"FINISHED"}
def invoke(self, context, event): def invoke(self, context, event):
@@ -209,8 +209,8 @@ class EnablePsetEditing(bpy.types.Operator):
new.is_selected = enum in selected_enum_items new.is_selected = enum in selected_enum_items
else: else:
value = prop["NominalValue"] value = prop["NominalValue"]
prop = self.props.properties.add() new_prop = self.props.properties.add()
metadata = prop.metadata metadata = new_prop.metadata
metadata.set_value(value) metadata.set_value(value)
metadata.name = prop["Name"] metadata.name = prop["Name"]
metadata.is_null = value is None metadata.is_null = value is None
@@ -41,7 +41,7 @@ def draw_property(prop, layout, copy_operator=None):
def draw_single_property(prop, layout, copy_operator=None): def draw_single_property(prop, layout, copy_operator=None):
value_name = prop.metadata.get_value_name() value_name = prop.metadata.get_value_name()
if not value_name: if not value_name:
layout.label(text=prop.metadata.name) layout.label(text=prop["Name"])
return return
layout.prop( layout.prop(
prop.metadata, prop.metadata,
+2 -2
View File
@@ -63,7 +63,7 @@ architecture flow charts and diagrams. The code and its comments will guide you
through the process. through the process.
Before playing with the demo module, you may want to switch to using a source Before playing with the demo module, you may want to switch to using a source
installation. See `blenderbim/installation <./installation.rst>`_ for details. installation. See `blenderbim/installation <./installation.html>`_ for details.
To see the demo module in action, you'll need to enable it. In To see the demo module in action, you'll need to enable it. In
``src/blenderbim/blenderbim/bim/__init__.py``, uncomment the line for the demo ``src/blenderbim/blenderbim/bim/__init__.py``, uncomment the line for the demo
@@ -95,7 +95,7 @@ and how to test and structure it so that you can build incredibly complex
features in a maintainable way. features in a maintainable way.
Tests for quality checking also exist. The system is designed so that you can Tests for quality checking also exist. The system is designed so that you can
do "Test Driven Development". For reference on how to run these tests, see `blenderbim/running_tests <./running_tests.rst>`_ do "Test Driven Development". For reference on how to run these tests, see `blenderbim/running_tests <./running_tests.html>`_
for details. You can find the tests here: for details. You can find the tests here:
:: ::
+13 -3
View File
@@ -7,11 +7,21 @@ Scenario: Select all walls
And the object "Cube" is selected And the object "Cube" is selected
And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" And I set "scene.BIMRootProperties.ifc_class" to "IfcWall"
And I press "bim.assign_class" And I press "bim.assign_class"
And I add a new group to IfcSelector And I add a new item to "scene.IfcSelectorProperties.groups"
And I add a new query to IfcSelector And I add a new item to "scene.IfcSelectorProperties.groups[0].queries"
And I set "scene.IfcSelectorProperties.groups[0].queries[0].selector" to "IFC Class" And I set "scene.IfcSelectorProperties.groups[0].queries[0].selector" to "IFC Class"
And I set "scene.IfcSelectorProperties.groups[0].queries[0].active_option" to "124: IfcWall" And I set "scene.IfcSelectorProperties.groups[0].queries[0].active_option" to "124: IfcWall"
When I press "bim.filter_model_elements(option='select')" When I press "bim.filter_model_elements(option='select')"
Then the object "IfcWall/Cube" is selected Then the object "IfcWall/Cube" is selected
Scenario: Add selection to IfcGroup
Given an empty IFC project
And I add a cube
And the object "Cube" is selected
And I set "scene.BIMRootProperties.ifc_class" to "IfcWall"
And I press "bim.assign_class"
And I set "scene.IfcSelectorProperties.selector_query_syntax" to ".IfcWall"
And I set "scene.IfcSelectorProperties.manual_override" to "True"
When I press "bim.add_to_ifc_group(group_name='Walls')"
And I press "bim.load_groups"
Then "scene.BIMGroupProperties.groups[-1].name" is "Walls"
+9 -10
View File
@@ -89,7 +89,7 @@ def i_add_an_empty():
@given("I add a sun") @given("I add a sun")
@when("I add an sun") @when("I add a sun")
def i_add_a_sun(): def i_add_a_sun():
bpy.ops.object.light_add(type="SUN") bpy.ops.object.light_add(type="SUN")
@@ -100,17 +100,15 @@ def i_add_a_material():
bpy.context.active_object.active_material = bpy.data.materials.new("Material") bpy.context.active_object.active_material = bpy.data.materials.new("Material")
@given("I add a new group to IfcSelector") @given(parsers.parse('I add a new item to "{collection}"'))
@when("I add a new group to IfcSelector") @when(parsers.parse('I add a new item to "{collection}"'))
def i_add_a_new_collection_item(): def i_add_a_new_collection_item(collection):
bpy.data.scenes["Scene"].IfcSelectorProperties.groups.add() try:
eval(f"bpy.context.{collection}.add()")
except:
assert False, "Collection does not exist"
@given("I add a new query to IfcSelector")
@when("I add a new query to IfcSelector")
def i_add_a_new_collection_item():
bpy.data.scenes["Scene"].IfcSelectorProperties.groups[0].queries.add()
@given(parsers.parse('the material "{name}" colour is set to "{colour}"')) @given(parsers.parse('the material "{name}" colour is set to "{colour}"'))
@when(parsers.parse('the material "{name}" colour is set to "{colour}"')) @when(parsers.parse('the material "{name}" colour is set to "{colour}"'))
@@ -489,6 +487,7 @@ def prop_is_value(prop, value):
except: except:
pass pass
if not is_value: if not is_value:
print(f"bpy.context.{prop}")
actual_value = eval(f"bpy.context.{prop}") actual_value = eval(f"bpy.context.{prop}")
assert False, f"Value is {actual_value}" assert False, f"Value is {actual_value}"