mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-20 06:58:56 +00:00
Fix UI bug where changing classification levels sometimes didn't display
This commit is contained in:
@@ -258,3 +258,4 @@ class DisableEditingClassificationReferences(bpy.types.Operator):
|
|||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
props = context.scene.BIMClassificationProperties
|
props = context.scene.BIMClassificationProperties
|
||||||
props.available_library_references.clear()
|
props.available_library_references.clear()
|
||||||
|
return {"FINISHED"}
|
||||||
|
|||||||
@@ -123,10 +123,11 @@ class BIM_PT_classification_references(Panel):
|
|||||||
if self.sprops.active_library_referenced_source:
|
if self.sprops.active_library_referenced_source:
|
||||||
op = row.operator("bim.change_classification_level", text="", icon="FRAME_PREV")
|
op = row.operator("bim.change_classification_level", text="", icon="FRAME_PREV")
|
||||||
op.parent_id = self.sprops.active_library_referenced_source
|
op.parent_id = self.sprops.active_library_referenced_source
|
||||||
op = row.operator("bim.add_classification_reference", text="", icon="ADD")
|
if self.sprops.active_library_reference_index < len(self.sprops.available_library_references):
|
||||||
op.reference = self.sprops.available_library_references[
|
op = row.operator("bim.add_classification_reference", text="", icon="ADD")
|
||||||
self.sprops.active_library_reference_index
|
op.reference = self.sprops.available_library_references[
|
||||||
].ifc_definition_id
|
self.sprops.active_library_reference_index
|
||||||
|
].ifc_definition_id
|
||||||
row.operator("bim.disable_editing_classification_references", text="", icon="CANCEL")
|
row.operator("bim.disable_editing_classification_references", text="", icon="CANCEL")
|
||||||
self.layout.template_list(
|
self.layout.template_list(
|
||||||
"BIM_UL_classifications",
|
"BIM_UL_classifications",
|
||||||
|
|||||||
@@ -0,0 +1,187 @@
|
|||||||
|
@classification
|
||||||
|
Feature: Classification
|
||||||
|
|
||||||
|
Scenario: Load classification library
|
||||||
|
Given an empty IFC project
|
||||||
|
When I press "bim.load_classification_library(filepath='{cwd}/test/files/classification.ifc')"
|
||||||
|
Then nothing happens
|
||||||
|
|
||||||
|
Scenario: Add classification
|
||||||
|
Given an empty IFC project
|
||||||
|
And I press "bim.load_classification_library(filepath='{cwd}/test/files/classification.ifc')"
|
||||||
|
And the variable "classification" is "{classification_ifc}.by_type('IfcClassification')[0].id()"
|
||||||
|
And I set "scene.BIMClassificationProperties.available_classifications" to "{classification}"
|
||||||
|
When I press "bim.add_classification"
|
||||||
|
Then nothing happens
|
||||||
|
|
||||||
|
Scenario: Add classification - IFC2X3
|
||||||
|
Given an empty IFC2X3 project
|
||||||
|
And I press "bim.load_classification_library(filepath='{cwd}/test/files/classification.ifc')"
|
||||||
|
And the variable "classification" is "{classification_ifc}.by_type('IfcClassification')[0].id()"
|
||||||
|
And I set "scene.BIMClassificationProperties.available_classifications" to "{classification}"
|
||||||
|
When I press "bim.add_classification"
|
||||||
|
Then nothing happens
|
||||||
|
|
||||||
|
Scenario: Enable editing classification
|
||||||
|
Given an empty IFC project
|
||||||
|
And I press "bim.load_classification_library(filepath='{cwd}/test/files/classification.ifc')"
|
||||||
|
And the variable "classification" is "{classification_ifc}.by_type('IfcClassification')[0].id()"
|
||||||
|
And I set "scene.BIMClassificationProperties.available_classifications" to "{classification}"
|
||||||
|
And I press "bim.add_classification"
|
||||||
|
And the variable "classification" is "{ifc}.by_type('IfcClassification')[0].id()"
|
||||||
|
When I press "bim.enable_editing_classification(classification={classification})"
|
||||||
|
Then nothing happens
|
||||||
|
|
||||||
|
Scenario: Disable editing classification
|
||||||
|
Given an empty IFC project
|
||||||
|
And I press "bim.load_classification_library(filepath='{cwd}/test/files/classification.ifc')"
|
||||||
|
And the variable "classification" is "{classification_ifc}.by_type('IfcClassification')[0].id()"
|
||||||
|
And I set "scene.BIMClassificationProperties.available_classifications" to "{classification}"
|
||||||
|
And I press "bim.add_classification"
|
||||||
|
And the variable "classification" is "{ifc}.by_type('IfcClassification')[0].id()"
|
||||||
|
And I press "bim.enable_editing_classification(classification={classification})"
|
||||||
|
When I press "bim.disable_editing_classification"
|
||||||
|
Then nothing happens
|
||||||
|
|
||||||
|
Scenario: Remove classification
|
||||||
|
Given an empty IFC project
|
||||||
|
And I press "bim.load_classification_library(filepath='{cwd}/test/files/classification.ifc')"
|
||||||
|
And the variable "classification" is "{classification_ifc}.by_type('IfcClassification')[0].id()"
|
||||||
|
And I set "scene.BIMClassificationProperties.available_classifications" to "{classification}"
|
||||||
|
And I press "bim.add_classification"
|
||||||
|
And the variable "classification" is "{ifc}.by_type('IfcClassification')[0].id()"
|
||||||
|
When I press "bim.remove_classification(classification={classification})"
|
||||||
|
Then nothing happens
|
||||||
|
|
||||||
|
Scenario: Edit classification
|
||||||
|
Given an empty IFC project
|
||||||
|
And I press "bim.load_classification_library(filepath='{cwd}/test/files/classification.ifc')"
|
||||||
|
And the variable "classification" is "{classification_ifc}.by_type('IfcClassification')[0].id()"
|
||||||
|
And I set "scene.BIMClassificationProperties.available_classifications" to "{classification}"
|
||||||
|
And I press "bim.add_classification"
|
||||||
|
And the variable "classification" is "{ifc}.by_type('IfcClassification')[0].id()"
|
||||||
|
And I press "bim.enable_editing_classification(classification={classification})"
|
||||||
|
When I press "bim.edit_classification"
|
||||||
|
Then nothing happens
|
||||||
|
|
||||||
|
Scenario: Add classification reference
|
||||||
|
Given an empty IFC project
|
||||||
|
And I press "bim.load_classification_library(filepath='{cwd}/test/files/classification.ifc')"
|
||||||
|
And the variable "classification" is "{classification_ifc}.by_type('IfcClassification')[0].id()"
|
||||||
|
And I set "scene.BIMClassificationProperties.available_classifications" to "{classification}"
|
||||||
|
And I press "bim.add_classification"
|
||||||
|
And I add a cube
|
||||||
|
And the object "Cube" is selected
|
||||||
|
And I set "scene.BIMRootProperties.ifc_product" to "IfcElementType"
|
||||||
|
And I set "scene.BIMRootProperties.ifc_class" to "IfcWallType"
|
||||||
|
And I press "bim.assign_class"
|
||||||
|
And I press "bim.change_classification_level(parent_id={classification})"
|
||||||
|
And the variable "reference" is "{classification_ifc}.by_type('IfcClassificationReference')[0].id()"
|
||||||
|
When I press "bim.add_classification_reference(reference={reference})"
|
||||||
|
Then nothing happens
|
||||||
|
|
||||||
|
Scenario: Change classification level
|
||||||
|
Given an empty IFC project
|
||||||
|
And I press "bim.load_classification_library(filepath='{cwd}/test/files/classification.ifc')"
|
||||||
|
And the variable "classification" is "{classification_ifc}.by_type('IfcClassification')[0].id()"
|
||||||
|
And I set "scene.BIMClassificationProperties.available_classifications" to "{classification}"
|
||||||
|
And I press "bim.add_classification"
|
||||||
|
And I add a cube
|
||||||
|
And the object "Cube" is selected
|
||||||
|
And I set "scene.BIMRootProperties.ifc_product" to "IfcElementType"
|
||||||
|
And I set "scene.BIMRootProperties.ifc_class" to "IfcWallType"
|
||||||
|
And I press "bim.assign_class"
|
||||||
|
And I press "bim.change_classification_level(parent_id={classification})"
|
||||||
|
And the variable "reference" is "{classification_ifc}.by_type('IfcClassificationReference')[0].id()"
|
||||||
|
When I press "bim.change_classification_level(parent_id={reference})"
|
||||||
|
Then nothing happens
|
||||||
|
|
||||||
|
Scenario: Disable editing classification references
|
||||||
|
Given an empty IFC project
|
||||||
|
And I press "bim.load_classification_library(filepath='{cwd}/test/files/classification.ifc')"
|
||||||
|
And the variable "classification" is "{classification_ifc}.by_type('IfcClassification')[0].id()"
|
||||||
|
And I set "scene.BIMClassificationProperties.available_classifications" to "{classification}"
|
||||||
|
And I press "bim.add_classification"
|
||||||
|
And I add a cube
|
||||||
|
And the object "Cube" is selected
|
||||||
|
And I set "scene.BIMRootProperties.ifc_product" to "IfcElementType"
|
||||||
|
And I set "scene.BIMRootProperties.ifc_class" to "IfcWallType"
|
||||||
|
And I press "bim.assign_class"
|
||||||
|
And I press "bim.change_classification_level(parent_id={classification})"
|
||||||
|
When I press "bim.disable_editing_classification_references"
|
||||||
|
Then nothing happens
|
||||||
|
|
||||||
|
Scenario: Enable editing classification reference
|
||||||
|
Given an empty IFC project
|
||||||
|
And I press "bim.load_classification_library(filepath='{cwd}/test/files/classification.ifc')"
|
||||||
|
And the variable "classification" is "{classification_ifc}.by_type('IfcClassification')[0].id()"
|
||||||
|
And I set "scene.BIMClassificationProperties.available_classifications" to "{classification}"
|
||||||
|
And I press "bim.add_classification"
|
||||||
|
And I add a cube
|
||||||
|
And the object "Cube" is selected
|
||||||
|
And I set "scene.BIMRootProperties.ifc_product" to "IfcElementType"
|
||||||
|
And I set "scene.BIMRootProperties.ifc_class" to "IfcWallType"
|
||||||
|
And I press "bim.assign_class"
|
||||||
|
And I press "bim.change_classification_level(parent_id={classification})"
|
||||||
|
And the variable "reference" is "{classification_ifc}.by_type('IfcClassificationReference')[0].id()"
|
||||||
|
And I press "bim.add_classification_reference(reference={reference})"
|
||||||
|
And the variable "reference" is "{ifc}.by_type('IfcClassificationReference')[0].id()"
|
||||||
|
When I press "bim.enable_editing_classification_reference(reference={reference})"
|
||||||
|
Then nothing happens
|
||||||
|
|
||||||
|
Scenario: Disable editing classification reference
|
||||||
|
Given an empty IFC project
|
||||||
|
And I press "bim.load_classification_library(filepath='{cwd}/test/files/classification.ifc')"
|
||||||
|
And the variable "classification" is "{classification_ifc}.by_type('IfcClassification')[0].id()"
|
||||||
|
And I set "scene.BIMClassificationProperties.available_classifications" to "{classification}"
|
||||||
|
And I press "bim.add_classification"
|
||||||
|
And I add a cube
|
||||||
|
And the object "Cube" is selected
|
||||||
|
And I set "scene.BIMRootProperties.ifc_product" to "IfcElementType"
|
||||||
|
And I set "scene.BIMRootProperties.ifc_class" to "IfcWallType"
|
||||||
|
And I press "bim.assign_class"
|
||||||
|
And I press "bim.change_classification_level(parent_id={classification})"
|
||||||
|
And the variable "reference" is "{classification_ifc}.by_type('IfcClassificationReference')[0].id()"
|
||||||
|
And I press "bim.add_classification_reference(reference={reference})"
|
||||||
|
And the variable "reference" is "{ifc}.by_type('IfcClassificationReference')[0].id()"
|
||||||
|
And I press "bim.enable_editing_classification_reference(reference={reference})"
|
||||||
|
When I press "bim.disable_editing_classification_reference"
|
||||||
|
Then nothing happens
|
||||||
|
|
||||||
|
Scenario: Remove classification reference
|
||||||
|
Given an empty IFC project
|
||||||
|
And I press "bim.load_classification_library(filepath='{cwd}/test/files/classification.ifc')"
|
||||||
|
And the variable "classification" is "{classification_ifc}.by_type('IfcClassification')[0].id()"
|
||||||
|
And I set "scene.BIMClassificationProperties.available_classifications" to "{classification}"
|
||||||
|
And I press "bim.add_classification"
|
||||||
|
And I add a cube
|
||||||
|
And the object "Cube" is selected
|
||||||
|
And I set "scene.BIMRootProperties.ifc_product" to "IfcElementType"
|
||||||
|
And I set "scene.BIMRootProperties.ifc_class" to "IfcWallType"
|
||||||
|
And I press "bim.assign_class"
|
||||||
|
And I press "bim.change_classification_level(parent_id={classification})"
|
||||||
|
And the variable "reference" is "{classification_ifc}.by_type('IfcClassificationReference')[0].id()"
|
||||||
|
And I press "bim.add_classification_reference(reference={reference})"
|
||||||
|
And the variable "reference" is "{ifc}.by_type('IfcClassificationReference')[0].id()"
|
||||||
|
And I press "bim.enable_editing_classification_reference(reference={reference})"
|
||||||
|
When I press "bim.remove_classification_reference(reference={reference})"
|
||||||
|
Then nothing happens
|
||||||
|
|
||||||
|
Scenario: Edit classification reference
|
||||||
|
Given an empty IFC project
|
||||||
|
And I press "bim.load_classification_library(filepath='{cwd}/test/files/classification.ifc')"
|
||||||
|
And the variable "classification" is "{classification_ifc}.by_type('IfcClassification')[0].id()"
|
||||||
|
And I set "scene.BIMClassificationProperties.available_classifications" to "{classification}"
|
||||||
|
And I press "bim.add_classification"
|
||||||
|
And I add a cube
|
||||||
|
And the object "Cube" is selected
|
||||||
|
And I set "scene.BIMRootProperties.ifc_product" to "IfcElementType"
|
||||||
|
And I set "scene.BIMRootProperties.ifc_class" to "IfcWallType"
|
||||||
|
And I press "bim.assign_class"
|
||||||
|
And I press "bim.change_classification_level(parent_id={classification})"
|
||||||
|
And the variable "reference" is "{classification_ifc}.by_type('IfcClassificationReference')[0].id()"
|
||||||
|
And I press "bim.add_classification_reference(reference={reference})"
|
||||||
|
And the variable "reference" is "{ifc}.by_type('IfcClassificationReference')[0].id()"
|
||||||
|
And I press "bim.enable_editing_classification_reference(reference={reference})"
|
||||||
|
When I press "bim.edit_classification_reference"
|
||||||
|
Then nothing happens
|
||||||
@@ -14,6 +14,20 @@ Scenario: Create project
|
|||||||
And the object "IfcBuilding/My Building" is in the collection "IfcBuilding/My Building"
|
And the object "IfcBuilding/My Building" is in the collection "IfcBuilding/My Building"
|
||||||
And the object "IfcBuildingStorey/My Storey" is in the collection "IfcBuildingStorey/My Storey"
|
And the object "IfcBuildingStorey/My Storey" is in the collection "IfcBuildingStorey/My Storey"
|
||||||
|
|
||||||
|
Scenario: Create project - IFC2X3
|
||||||
|
Given an empty Blender session
|
||||||
|
And I set "scene.BIMProjectProperties.export_schema" to "IFC2X3"
|
||||||
|
When I press "bim.create_project"
|
||||||
|
Then an IFC file exists
|
||||||
|
And the object "IfcProject/My Project" is an "IfcProject"
|
||||||
|
And the object "IfcSite/My Site" is an "IfcSite"
|
||||||
|
And the object "IfcBuilding/My Building" is an "IfcBuilding"
|
||||||
|
And the object "IfcBuildingStorey/My Storey" is an "IfcBuildingStorey"
|
||||||
|
And the object "IfcProject/My Project" is in the collection "IfcProject/My Project"
|
||||||
|
And the object "IfcSite/My Site" is in the collection "IfcSite/My Site"
|
||||||
|
And the object "IfcBuilding/My Building" is in the collection "IfcBuilding/My Building"
|
||||||
|
And the object "IfcBuildingStorey/My Storey" is in the collection "IfcBuildingStorey/My Storey"
|
||||||
|
|
||||||
Scenario: Append library element
|
Scenario: Append library element
|
||||||
Given an empty IFC project
|
Given an empty IFC project
|
||||||
When I press "bim.select_library_file(filepath='{cwd}/test/files/basic.ifc')"
|
When I press "bim.select_library_file(filepath='{cwd}/test/files/basic.ifc')"
|
||||||
|
|||||||
@@ -29,7 +29,12 @@ from mathutils import Vector
|
|||||||
|
|
||||||
scenarios("feature")
|
scenarios("feature")
|
||||||
|
|
||||||
variables = {"cwd": os.getcwd(), "ifc": "IfcStore.get_file()", "pset_ifc": "IfcStore.pset_template_file"}
|
variables = {
|
||||||
|
"cwd": os.getcwd(),
|
||||||
|
"ifc": "IfcStore.get_file()",
|
||||||
|
"pset_ifc": "IfcStore.pset_template_file",
|
||||||
|
"classification_ifc": "IfcStore.classification_file",
|
||||||
|
}
|
||||||
|
|
||||||
# Monkey-patch webbrowser opening since we want to test headlessly
|
# Monkey-patch webbrowser opening since we want to test headlessly
|
||||||
webbrowser.open = lambda x: True
|
webbrowser.open = lambda x: True
|
||||||
@@ -68,6 +73,17 @@ def an_empty_ifc_project():
|
|||||||
bpy.ops.bim.create_project()
|
bpy.ops.bim.create_project()
|
||||||
|
|
||||||
|
|
||||||
|
@given("an empty IFC2X3 project")
|
||||||
|
def an_empty_ifc_project():
|
||||||
|
IfcStore.purge()
|
||||||
|
bpy.ops.wm.read_homefile(app_template="")
|
||||||
|
if len(bpy.data.objects) > 0:
|
||||||
|
bpy.data.batch_remove(bpy.data.objects)
|
||||||
|
bpy.ops.outliner.orphans_purge(do_local_ids=True, do_linked_ids=True, do_recursive=True)
|
||||||
|
bpy.context.scene.BIMProjectProperties.export_schema = "IFC2X3"
|
||||||
|
bpy.ops.bim.create_project()
|
||||||
|
|
||||||
|
|
||||||
@when("I load a new pset template file")
|
@when("I load a new pset template file")
|
||||||
def i_load_a_new_pset_template_file():
|
def i_load_a_new_pset_template_file():
|
||||||
IfcStore.pset_template_path = os.path.join(
|
IfcStore.pset_template_path = os.path.join(
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
ISO-10303-21;
|
||||||
|
HEADER;
|
||||||
|
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
|
||||||
|
FILE_NAME('','2020-04-23T18:09:33',(),(),'IfcOpenShell 0.6.0b0','IfcOpenShell 0.6.0b0','');
|
||||||
|
FILE_SCHEMA(('IFC4'));
|
||||||
|
ENDSEC;
|
||||||
|
DATA;
|
||||||
|
#1=IFCPROJECTLIBRARY($,$,'FoobarClass',$,$,$,$,$,$);
|
||||||
|
#2=IFCCLASSIFICATION('FoobarClass','(FBC)','2000-01-01','Foobar','The Foobar Classification System is a classification system for the construction industry.','http://www.example.org/',('_'));
|
||||||
|
#3=IFCRELASSOCIATESCLASSIFICATION('1qt9lErCr5hQsihRukSfaU',$,$,$,(#1),#2);
|
||||||
|
#4=IFCCLASSIFICATIONREFERENCE($,'Co','Complexes',#2,$,$);
|
||||||
|
#5=IFCCLASSIFICATIONREFERENCE($,'Co_20','Administrative, commercial and protective service complexes',#4,$,$);
|
||||||
|
#6=IFCCLASSIFICATIONREFERENCE($,'Co_20_10','Legislative complexes',#5,$,$);
|
||||||
|
#7=IFCCLASSIFICATIONREFERENCE($,'Pr','Products',#2,$,$);
|
||||||
|
#8=IFCCLASSIFICATIONREFERENCE($,'Pr_15','Preparatory products',#7,$,$);
|
||||||
|
#9=IFCCLASSIFICATIONREFERENCE($,'Pr_15_31','Formless preparatory products',#8,$,$);
|
||||||
|
ENDSEC;
|
||||||
|
END-ISO-10303-21;
|
||||||
Reference in New Issue
Block a user