mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-11 10:06:47 +00:00
Merge branch 'IfcOpenShell-v0.7.0' into v0.7.0
This commit is contained in:
@@ -768,6 +768,8 @@ class ActivateBcfViewpoint(bpy.types.Operator):
|
||||
bcfxml = bcfstore.BcfStore.get_bcfxml()
|
||||
props = context.scene.BCFProperties
|
||||
blender_topic = props.active_topic
|
||||
if blender_topic is None:
|
||||
return False
|
||||
topic = bcfxml.topics[blender_topic.name]
|
||||
return topic.viewpoints
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@ def getBcfViewpoints(self, context, force_update=False):
|
||||
props = context.scene.BCFProperties
|
||||
bcfxml = bcfstore.BcfStore.get_bcfxml()
|
||||
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())])
|
||||
return bcfviewpoints_enum
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@ class UpdateRepresentation(bpy.types.Operator):
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
return context.active_object.mode == "OBJECT"
|
||||
return context.active_object and context.active_object.mode == "OBJECT"
|
||||
|
||||
def execute(self, context):
|
||||
return IfcStore.execute_ifc_operator(self, context)
|
||||
@@ -240,7 +240,7 @@ class UpdateParametricRepresentation(bpy.types.Operator):
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
return context.active_object.mode == "OBJECT"
|
||||
return context.active_object and context.active_object.mode == "OBJECT"
|
||||
|
||||
def execute(self, context):
|
||||
self.file = IfcStore.get_file()
|
||||
|
||||
@@ -678,7 +678,7 @@ class LinkIfc(bpy.types.Operator):
|
||||
if self.use_relative_path:
|
||||
filepath = os.path.relpath(filepath, bpy.path.abspath("//"))
|
||||
new.name = filepath
|
||||
bpy.ops.bim.load_link(filepath=self.filepath)
|
||||
bpy.ops.bim.load_link(filepath=filepath)
|
||||
return {"FINISHED"}
|
||||
|
||||
def invoke(self, context, event):
|
||||
|
||||
@@ -209,8 +209,8 @@ class EnablePsetEditing(bpy.types.Operator):
|
||||
new.is_selected = enum in selected_enum_items
|
||||
else:
|
||||
value = prop["NominalValue"]
|
||||
prop = self.props.properties.add()
|
||||
metadata = prop.metadata
|
||||
new_prop = self.props.properties.add()
|
||||
metadata = new_prop.metadata
|
||||
metadata.set_value(value)
|
||||
metadata.name = prop["Name"]
|
||||
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):
|
||||
value_name = prop.metadata.get_value_name()
|
||||
if not value_name:
|
||||
layout.label(text=prop.metadata.name)
|
||||
layout.label(text=prop["Name"])
|
||||
return
|
||||
layout.prop(
|
||||
prop.metadata,
|
||||
|
||||
@@ -63,7 +63,7 @@ architecture flow charts and diagrams. The code and its comments will guide you
|
||||
through the process.
|
||||
|
||||
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
|
||||
``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.
|
||||
|
||||
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:
|
||||
|
||||
::
|
||||
|
||||
@@ -7,11 +7,21 @@ Scenario: Select all walls
|
||||
And the object "Cube" is selected
|
||||
And I set "scene.BIMRootProperties.ifc_class" to "IfcWall"
|
||||
And I press "bim.assign_class"
|
||||
And I add a new group to IfcSelector
|
||||
And I add a new query to IfcSelector
|
||||
And I add a new item to "scene.IfcSelectorProperties.groups"
|
||||
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].active_option" to "124: IfcWall"
|
||||
When I press "bim.filter_model_elements(option='select')"
|
||||
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"
|
||||
|
||||
@@ -89,7 +89,7 @@ def i_add_an_empty():
|
||||
|
||||
|
||||
@given("I add a sun")
|
||||
@when("I add an sun")
|
||||
@when("I add a sun")
|
||||
def i_add_a_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")
|
||||
|
||||
|
||||
@given("I add a new group to IfcSelector")
|
||||
@when("I add a new group to IfcSelector")
|
||||
def i_add_a_new_collection_item():
|
||||
bpy.data.scenes["Scene"].IfcSelectorProperties.groups.add()
|
||||
@given(parsers.parse('I add a new item to "{collection}"'))
|
||||
@when(parsers.parse('I add a new item to "{collection}"'))
|
||||
def i_add_a_new_collection_item(collection):
|
||||
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}"'))
|
||||
@when(parsers.parse('the material "{name}" colour is set to "{colour}"'))
|
||||
@@ -489,6 +487,7 @@ def prop_is_value(prop, value):
|
||||
except:
|
||||
pass
|
||||
if not is_value:
|
||||
print(f"bpy.context.{prop}")
|
||||
actual_value = eval(f"bpy.context.{prop}")
|
||||
assert False, f"Value is {actual_value}"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user