mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-30 12:09:51 +00:00
You can now write BIMTester tests directly to the features dir.
This commit is contained in:
@@ -12,6 +12,7 @@ from . import schema
|
|||||||
from bpy_extras.io_utils import ImportHelper
|
from bpy_extras.io_utils import ImportHelper
|
||||||
from itertools import cycle
|
from itertools import cycle
|
||||||
from mathutils import Vector
|
from mathutils import Vector
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
class ExportIFC(bpy.types.Operator):
|
class ExportIFC(bpy.types.Operator):
|
||||||
bl_idname = "export.ifc"
|
bl_idname = "export.ifc"
|
||||||
@@ -204,56 +205,91 @@ class ResetObjectColours(bpy.types.Operator):
|
|||||||
object.color = (1, 1, 1, 1)
|
object.color = (1, 1, 1, 1)
|
||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
|
||||||
|
class QAHelper():
|
||||||
|
@classmethod
|
||||||
|
def append_to_scenario(cls, lines):
|
||||||
|
filename = os.path.join(
|
||||||
|
bpy.context.scene.BIMProperties.features_dir,
|
||||||
|
bpy.context.scene.BIMProperties.features_file + '.feature')
|
||||||
|
if os.path.exists(filename+'~'):
|
||||||
|
os.remove(filename+'~')
|
||||||
|
os.rename(filename, filename+'~')
|
||||||
|
with open(filename, 'w') as destination:
|
||||||
|
with open(filename+'~', 'r') as source:
|
||||||
|
is_in_scenario = False
|
||||||
|
for source_line in source:
|
||||||
|
if 'Scenario: 'in source_line \
|
||||||
|
and bpy.context.scene.BIMProperties.scenario == source_line.strip()[len('Scenario: '):]:
|
||||||
|
is_in_scenario = True
|
||||||
|
if is_in_scenario and source_line.strip()[0:4] == 'Then':
|
||||||
|
for line in lines:
|
||||||
|
destination.write((' '*8) + line + '\n')
|
||||||
|
is_in_scenario = False
|
||||||
|
destination.write(source_line)
|
||||||
|
os.remove(filename+'~')
|
||||||
|
|
||||||
|
|
||||||
class ApproveClass(bpy.types.Operator):
|
class ApproveClass(bpy.types.Operator):
|
||||||
bl_idname = 'bim.approve_class'
|
bl_idname = 'bim.approve_class'
|
||||||
bl_label = 'Approve Class'
|
bl_label = 'Approve Class'
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
with open(bpy.context.scene.BIMProperties.data_dir + 'audit.txt', 'a') as file:
|
lines = []
|
||||||
for object in bpy.context.selected_objects:
|
for object in bpy.context.selected_objects:
|
||||||
index = object.BIMObjectProperties.attributes.find('GlobalId')
|
index = object.BIMObjectProperties.attributes.find('GlobalId')
|
||||||
if index == -1:
|
if index != -1:
|
||||||
continue
|
lines.append('Then the element {} is an {}'.format(
|
||||||
file.write('Then the element {} is an {}\n'.format(
|
|
||||||
object.BIMObjectProperties.attributes[index].string_value,
|
object.BIMObjectProperties.attributes[index].string_value,
|
||||||
object.name.split('/')[0]))
|
object.name.split('/')[0]))
|
||||||
|
QAHelper.append_to_scenario(lines)
|
||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
|
||||||
class RejectClass(bpy.types.Operator):
|
class RejectClass(bpy.types.Operator):
|
||||||
bl_idname = 'bim.reject_class'
|
bl_idname = 'bim.reject_class'
|
||||||
bl_label = 'Reject Class'
|
bl_label = 'Reject Class'
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
with open(bpy.context.scene.BIMProperties.data_dir + 'audit.txt', 'a') as file:
|
lines = []
|
||||||
for object in bpy.context.selected_objects:
|
for object in bpy.context.selected_objects:
|
||||||
file.write('Then the element {} is an {}\n'.format(
|
lines.append('Then the element {} is an {}'.format(
|
||||||
object.BIMObjectProperties.attributes[
|
object.BIMObjectProperties.attributes[
|
||||||
object.BIMObjectProperties.attributes.find('GlobalId')].string_value,
|
object.BIMObjectProperties.attributes.find('GlobalId')].string_value,
|
||||||
bpy.context.scene.BIMProperties.audit_ifc_class))
|
bpy.context.scene.BIMProperties.audit_ifc_class))
|
||||||
|
QAHelper.append_to_scenario(lines)
|
||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
|
||||||
class RejectElement(bpy.types.Operator):
|
class RejectElement(bpy.types.Operator):
|
||||||
bl_idname = 'bim.reject_element'
|
bl_idname = 'bim.reject_element'
|
||||||
bl_label = 'Reject Element'
|
bl_label = 'Reject Element'
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
with open(bpy.context.scene.BIMProperties.data_dir + 'audit.txt', 'a') as file:
|
lines = []
|
||||||
for object in bpy.context.selected_objects:
|
for object in bpy.context.selected_objects:
|
||||||
file.write('Then the element {} should not exist because {}\n'.format(
|
lines.append('Then the element {} should not exist because {}'.format(
|
||||||
object.BIMObjectProperties.attributes[
|
object.BIMObjectProperties.attributes[
|
||||||
object.BIMObjectProperties.attributes.find('GlobalId')].string_value,
|
object.BIMObjectProperties.attributes.find('GlobalId')].string_value,
|
||||||
bpy.context.scene.BIMProperties.qa_reject_element_reason))
|
bpy.context.scene.BIMProperties.qa_reject_element_reason))
|
||||||
|
QAHelper.append_to_scenario(lines)
|
||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
|
||||||
class SelectAudited(bpy.types.Operator):
|
class SelectAudited(bpy.types.Operator):
|
||||||
bl_idname = 'bim.select_audited'
|
bl_idname = 'bim.select_audited'
|
||||||
bl_label = 'Select Audited'
|
bl_label = 'Select Audited'
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
audited_global_ids = []
|
audited_global_ids = []
|
||||||
with open(bpy.context.scene.BIMProperties.data_dir + 'audit.txt') as file:
|
for filename in Path(bpy.context.scene.BIMProperties.features_dir).glob('*.feature'):
|
||||||
for line in file:
|
with open(filename, 'r') as feature_file:
|
||||||
audited_global_ids.append(line.split(' ')[3])
|
lines = feature_file.readlines()
|
||||||
|
for line in lines:
|
||||||
|
words = line.strip().split()
|
||||||
|
for word in words:
|
||||||
|
if self.is_a_global_id(word):
|
||||||
|
audited_global_ids.append(word)
|
||||||
for object in bpy.context.visible_objects:
|
for object in bpy.context.visible_objects:
|
||||||
index = object.BIMObjectProperties.attributes.find('GlobalId')
|
index = object.BIMObjectProperties.attributes.find('GlobalId')
|
||||||
if index != -1 \
|
if index != -1 \
|
||||||
@@ -261,6 +297,9 @@ class SelectAudited(bpy.types.Operator):
|
|||||||
object.select_set(True)
|
object.select_set(True)
|
||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
def is_a_global_id(self, word):
|
||||||
|
return word[0] in ['0', '1', '2', '3'] and len(word) == 22
|
||||||
|
|
||||||
class QuickProjectSetup(bpy.types.Operator):
|
class QuickProjectSetup(bpy.types.Operator):
|
||||||
bl_idname = 'bim.quick_project_setup'
|
bl_idname = 'bim.quick_project_setup'
|
||||||
bl_label = 'Quick Project Setup'
|
bl_label = 'Quick Project Setup'
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ profiledef_enum = []
|
|||||||
classes_enum = []
|
classes_enum = []
|
||||||
types_enum = []
|
types_enum = []
|
||||||
availablematerialpsets_enum = []
|
availablematerialpsets_enum = []
|
||||||
|
featuresfiles_enum = []
|
||||||
|
scenarios_enum = []
|
||||||
psetnames_enum = []
|
psetnames_enum = []
|
||||||
psetfiles_enum = []
|
psetfiles_enum = []
|
||||||
classification_enum = []
|
classification_enum = []
|
||||||
@@ -159,6 +161,44 @@ def getAvailableMaterialPsets(self, context):
|
|||||||
return availablematerialpsets_enum
|
return availablematerialpsets_enum
|
||||||
|
|
||||||
|
|
||||||
|
def getFeaturesFiles(self, context):
|
||||||
|
global featuresfiles_enum
|
||||||
|
if len(featuresfiles_enum) < 1:
|
||||||
|
featuresfiles_enum.clear()
|
||||||
|
for filename in Path(context.scene.BIMProperties.features_dir).glob('*.feature'):
|
||||||
|
f = str(filename.stem)
|
||||||
|
featuresfiles_enum.append((f, f, ''))
|
||||||
|
return featuresfiles_enum
|
||||||
|
|
||||||
|
|
||||||
|
def refreshFeaturesFiles(self, context):
|
||||||
|
global featuresfiles_enum
|
||||||
|
featuresfiles_enum.clear()
|
||||||
|
getFeaturesFiles(self, context)
|
||||||
|
|
||||||
|
|
||||||
|
def getScenarios(self, context):
|
||||||
|
global scenarios_enum
|
||||||
|
if len(scenarios_enum) < 1:
|
||||||
|
scenarios_enum.clear()
|
||||||
|
filename = os.path.join(
|
||||||
|
context.scene.BIMProperties.features_dir,
|
||||||
|
context.scene.BIMProperties.features_file + '.feature')
|
||||||
|
with open(filename, 'r') as feature_file:
|
||||||
|
lines = feature_file.readlines()
|
||||||
|
for line in lines:
|
||||||
|
if 'Scenario:' in line:
|
||||||
|
s = line.strip()[len('Scenario: '):]
|
||||||
|
scenarios_enum.append((s, s, ''))
|
||||||
|
return scenarios_enum
|
||||||
|
|
||||||
|
|
||||||
|
def refreshScenarios(self, context):
|
||||||
|
global scenarios_enum
|
||||||
|
scenarios_enum.clear()
|
||||||
|
getScenarios(self, context)
|
||||||
|
|
||||||
|
|
||||||
def getPsetNames(self, context):
|
def getPsetNames(self, context):
|
||||||
global psetnames_enum
|
global psetnames_enum
|
||||||
if len(psetnames_enum) < 1:
|
if len(psetnames_enum) < 1:
|
||||||
@@ -345,7 +385,9 @@ class BIMProperties(PropertyGroup):
|
|||||||
has_georeferencing: BoolProperty(name="Has Georeferencing", default=False)
|
has_georeferencing: BoolProperty(name="Has Georeferencing", default=False)
|
||||||
has_library: BoolProperty(name="Has Project Library", default=False)
|
has_library: BoolProperty(name="Has Project Library", default=False)
|
||||||
global_id: StringProperty(name="GlobalId")
|
global_id: StringProperty(name="GlobalId")
|
||||||
features_dir: StringProperty(default='', name="Features Directory")
|
features_dir: StringProperty(default='', name="Features Directory", update=refreshFeaturesFiles)
|
||||||
|
features_file: EnumProperty(items=getFeaturesFiles, name="Features File", update=refreshScenarios)
|
||||||
|
scenario: EnumProperty(items=getScenarios, name="Scenario")
|
||||||
diff_json_file: StringProperty(default='', name="Diff JSON File")
|
diff_json_file: StringProperty(default='', name="Diff JSON File")
|
||||||
diff_old_file: StringProperty(default='', name="Diff Old IFC File")
|
diff_old_file: StringProperty(default='', name="Diff Old IFC File")
|
||||||
diff_new_file: StringProperty(default='', name="Diff New IFC File")
|
diff_new_file: StringProperty(default='', name="Diff New IFC File")
|
||||||
|
|||||||
@@ -484,6 +484,13 @@ class BIM_PT_qa(Panel):
|
|||||||
row.prop(bim_properties, "features_dir")
|
row.prop(bim_properties, "features_dir")
|
||||||
row.operator("bim.select_features_dir", icon="FILE_FOLDER", text="")
|
row.operator("bim.select_features_dir", icon="FILE_FOLDER", text="")
|
||||||
|
|
||||||
|
if bim_properties.features_dir:
|
||||||
|
row = layout.row(align=True)
|
||||||
|
row.prop(bim_properties, "features_file")
|
||||||
|
|
||||||
|
row = layout.row(align=True)
|
||||||
|
row.prop(bim_properties, "scenario")
|
||||||
|
|
||||||
layout.label(text="Quality Auditing:")
|
layout.label(text="Quality Auditing:")
|
||||||
|
|
||||||
row = layout.row()
|
row = layout.row()
|
||||||
|
|||||||
Reference in New Issue
Block a user