mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-18 22:33:33 +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()
|
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,
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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}"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user