mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-10 01:41:57 +00:00
mvd info to module, add testing, setattr & getattr
This commit is contained in:
committed by
Thomas Krijnen
parent
9f11568aff
commit
cbe8fc1ebd
@@ -0,0 +1,30 @@
|
||||
ISO-10303-21;
|
||||
HEADER;
|
||||
FILE_DESCRIPTION(('ViewDefinition [ReferenceView_V1.2]', 'Comment [Any]'),'2;1');
|
||||
FILE_NAME('Header.ifc','2025-02-13T15:58:45',('tricott'),('Trimble Inc.'),'TrimBimToIFC rel. 4.0.2','Trimble Inc. - SketchUp - 2025.0','IFC4 model');
|
||||
FILE_SCHEMA(('IFC4'));
|
||||
ENDSEC;
|
||||
DATA;
|
||||
#1=IFCPERSON($,$,'',$,$,$,$,$);
|
||||
#2=IFCORGANIZATION($,'',$,$,$);
|
||||
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
|
||||
#4=IFCAPPLICATION(#2,'v0.7.0-6c9e130ca','IfcOpenShell-v0.7.0-6c9e130ca','');
|
||||
#5=IFCOWNERHISTORY(#3,#4,$,.NOTDEFINED.,$,#3,#4,1700419055);
|
||||
#6=IFCDIRECTION((1.,0.,0.));
|
||||
#7=IFCDIRECTION((0.,0.,1.));
|
||||
#8=IFCCARTESIANPOINT((0.,0.,0.));
|
||||
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
|
||||
#10=IFCDIRECTION((0.,1.));
|
||||
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
|
||||
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
|
||||
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
|
||||
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
|
||||
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
|
||||
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
|
||||
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
|
||||
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
|
||||
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
|
||||
#20=IFCPROJECT('0iDmeiiLP3AOllitM2Favn',#5,'',$,$,$,$,(#11),#19);
|
||||
#21=IFCSITE('3rg2jGkIH10RFhrQsGZKRk',#5,$,$,$,$,$,$,$,$,$,$,$,$);
|
||||
ENDSEC;
|
||||
END-ISO-10303-21;
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
ISO-10303-21;
|
||||
HEADER;
|
||||
FILE_DESCRIPTION(('ViewDefinition [ReferenceView_V1.2]', 'ExchangeRequirement [Any]'),'2;1');
|
||||
FILE_NAME('Header.ifc','2025-02-13T15:58:45',('tricott'),('Trimble Inc.'),'TrimBimToIFC rel. 4.0.2','Trimble Inc. - SketchUp - 2025.0','IFC4 model');
|
||||
FILE_SCHEMA(('IFC4'));
|
||||
ENDSEC;
|
||||
DATA;
|
||||
#1=IFCPERSON($,$,'',$,$,$,$,$);
|
||||
#2=IFCORGANIZATION($,'',$,$,$);
|
||||
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
|
||||
#4=IFCAPPLICATION(#2,'v0.7.0-6c9e130ca','IfcOpenShell-v0.7.0-6c9e130ca','');
|
||||
#5=IFCOWNERHISTORY(#3,#4,$,.NOTDEFINED.,$,#3,#4,1700419055);
|
||||
#6=IFCDIRECTION((1.,0.,0.));
|
||||
#7=IFCDIRECTION((0.,0.,1.));
|
||||
#8=IFCCARTESIANPOINT((0.,0.,0.));
|
||||
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
|
||||
#10=IFCDIRECTION((0.,1.));
|
||||
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
|
||||
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
|
||||
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
|
||||
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
|
||||
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
|
||||
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
|
||||
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
|
||||
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
|
||||
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
|
||||
#20=IFCPROJECT('0iDmeiiLP3AOllitM2Favn',#5,'',$,$,$,$,(#11),#19);
|
||||
#21=IFCSITE('3rg2jGkIH10RFhrQsGZKRk',#5,$,$,$,$,$,$,$,$,$,$,$,$);
|
||||
ENDSEC;
|
||||
END-ISO-10303-21;
|
||||
@@ -0,0 +1,30 @@
|
||||
ISO-10303-21;
|
||||
HEADER;
|
||||
FILE_DESCRIPTION(('ViewDefinition [ReferenceView_V1.2]', 'Option [Any]'),'2;1');
|
||||
FILE_NAME('Header.ifc','2025-02-13T15:58:45',('tricott'),('Trimble Inc.'),'TrimBimToIFC rel. 4.0.2','Trimble Inc. - SketchUp - 2025.0','IFC4 model');
|
||||
FILE_SCHEMA(('IFC4'));
|
||||
ENDSEC;
|
||||
DATA;
|
||||
#1=IFCPERSON($,$,'',$,$,$,$,$);
|
||||
#2=IFCORGANIZATION($,'',$,$,$);
|
||||
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
|
||||
#4=IFCAPPLICATION(#2,'v0.7.0-6c9e130ca','IfcOpenShell-v0.7.0-6c9e130ca','');
|
||||
#5=IFCOWNERHISTORY(#3,#4,$,.NOTDEFINED.,$,#3,#4,1700419055);
|
||||
#6=IFCDIRECTION((1.,0.,0.));
|
||||
#7=IFCDIRECTION((0.,0.,1.));
|
||||
#8=IFCCARTESIANPOINT((0.,0.,0.));
|
||||
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
|
||||
#10=IFCDIRECTION((0.,1.));
|
||||
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
|
||||
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
|
||||
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
|
||||
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
|
||||
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
|
||||
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
|
||||
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
|
||||
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
|
||||
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
|
||||
#20=IFCPROJECT('0iDmeiiLP3AOllitM2Favn',#5,'',$,$,$,$,(#11),#19);
|
||||
#21=IFCSITE('3rg2jGkIH10RFhrQsGZKRk',#5,$,$,$,$,$,$,$,$,$,$,$,$);
|
||||
ENDSEC;
|
||||
END-ISO-10303-21;
|
||||
@@ -0,0 +1,30 @@
|
||||
ISO-10303-21;
|
||||
HEADER;
|
||||
FILE_DESCRIPTION(('ViewDefinition [ReferenceView_V1.2]', 'ViewDefinition [QuantityTakeOffAddOnView]', 'Option [ExcludedObjects: Stair, Ramp, Space; SplitLevel: On]', 'ExchangeRequirement [CustomRequirement: Value1, Value2]', 'Remark [SomeKey: SomeValue; AnotherKey: AnotherValue]', 'Comment [This is a free text comment, or a comma-separated list of items]'),'2;1');
|
||||
FILE_NAME('Header example2.ifc', '2022-09-16T10:35:07', ('Evandro Alfieri'), ('buildingSMART Int.'), 'IFC Motor 1.0', 'Company - Application - 26.0.0.0', 'none');
|
||||
FILE_SCHEMA(('IFC4X3_ADD2'));
|
||||
ENDSEC;
|
||||
DATA;
|
||||
#1=IFCPERSON($,$,'',$,$,$,$,$);
|
||||
#2=IFCORGANIZATION($,'',$,$,$);
|
||||
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
|
||||
#4=IFCAPPLICATION(#2,'v0.7.0-6c9e130ca','IfcOpenShell-v0.7.0-6c9e130ca','');
|
||||
#5=IFCOWNERHISTORY(#3,#4,$,.NOTDEFINED.,$,#3,#4,1700419055);
|
||||
#6=IFCDIRECTION((1.,0.,0.));
|
||||
#7=IFCDIRECTION((0.,0.,1.));
|
||||
#8=IFCCARTESIANPOINT((0.,0.,0.));
|
||||
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
|
||||
#10=IFCDIRECTION((0.,1.));
|
||||
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
|
||||
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
|
||||
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
|
||||
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
|
||||
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
|
||||
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
|
||||
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
|
||||
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
|
||||
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
|
||||
#20=IFCPROJECT('0iDmeiiLP3AOllitM2Favn',#5,'',$,$,$,$,(#11),#19);
|
||||
#21=IFCSITE('3rg2jGkIH10RFhrQsGZKRk',#5,$,$,$,$,$,$,$,$,$,$,$,$);
|
||||
ENDSEC;
|
||||
END-ISO-10303-21;
|
||||
@@ -0,0 +1,30 @@
|
||||
ISO-10303-21;
|
||||
HEADER;
|
||||
FILE_DESCRIPTION(('ViewDefinition [Alignment-basedView]'),'2;1');
|
||||
FILE_NAME('Header example2.ifc', '2022-09-16T10:35:07', ('Evandro Alfieri'), ('buildingSMART Int.'), 'IFC Motor 1.0', 'Company - Application - 26.0.0.0', 'none');
|
||||
FILE_SCHEMA(('IFC4X3_ADD2'));
|
||||
ENDSEC;
|
||||
DATA;
|
||||
#1=IFCPERSON($,$,'',$,$,$,$,$);
|
||||
#2=IFCORGANIZATION($,'',$,$,$);
|
||||
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
|
||||
#4=IFCAPPLICATION(#2,'v0.7.0-6c9e130ca','IfcOpenShell-v0.7.0-6c9e130ca','');
|
||||
#5=IFCOWNERHISTORY(#3,#4,$,.NOTDEFINED.,$,#3,#4,1700419055);
|
||||
#6=IFCDIRECTION((1.,0.,0.));
|
||||
#7=IFCDIRECTION((0.,0.,1.));
|
||||
#8=IFCCARTESIANPOINT((0.,0.,0.));
|
||||
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
|
||||
#10=IFCDIRECTION((0.,1.));
|
||||
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
|
||||
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
|
||||
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
|
||||
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
|
||||
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
|
||||
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
|
||||
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
|
||||
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
|
||||
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
|
||||
#20=IFCPROJECT('0iDmeiiLP3AOllitM2Favn',#5,'',$,$,$,$,(#11),#19);
|
||||
#21=IFCSITE('3rg2jGkIH10RFhrQsGZKRk',#5,$,$,$,$,$,$,$,$,$,$,$,$);
|
||||
ENDSEC;
|
||||
END-ISO-10303-21;
|
||||
@@ -0,0 +1,30 @@
|
||||
ISO-10303-21;
|
||||
HEADER;
|
||||
FILE_DESCRIPTION(('ViewDefinition [CoordinationView_V2.0]', 'ViewDefinition[SpaceBoundaryAddonView]'),'2;1');
|
||||
FILE_NAME('Header example2.ifc', '2022-09-16T10:35:07', ('Evandro Alfieri'), ('buildingSMART Int.'), 'IFC Motor 1.0', 'Company - Application - 26.0.0.0', 'none');
|
||||
FILE_SCHEMA(('IFC2X3'));
|
||||
ENDSEC;
|
||||
DATA;
|
||||
#1=IFCPERSON($,$,'',$,$,$,$,$);
|
||||
#2=IFCORGANIZATION($,'',$,$,$);
|
||||
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
|
||||
#4=IFCAPPLICATION(#2,'v0.7.0-6c9e130ca','IfcOpenShell-v0.7.0-6c9e130ca','');
|
||||
#5=IFCOWNERHISTORY(#3,#4,$,.NOTDEFINED.,$,#3,#4,1700419055);
|
||||
#6=IFCDIRECTION((1.,0.,0.));
|
||||
#7=IFCDIRECTION((0.,0.,1.));
|
||||
#8=IFCCARTESIANPOINT((0.,0.,0.));
|
||||
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
|
||||
#10=IFCDIRECTION((0.,1.));
|
||||
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
|
||||
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
|
||||
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
|
||||
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
|
||||
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
|
||||
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
|
||||
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
|
||||
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
|
||||
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
|
||||
#20=IFCPROJECT('0iDmeiiLP3AOllitM2Favn',#5,'',$,$,$,$,(#11),#19);
|
||||
#21=IFCSITE('3rg2jGkIH10RFhrQsGZKRk',#5,$,$,$,$,$,$,$,$,$,$,$,$);
|
||||
ENDSEC;
|
||||
END-ISO-10303-21;
|
||||
@@ -0,0 +1,134 @@
|
||||
import os
|
||||
import pytest
|
||||
import ifcopenshell
|
||||
from ifcopenshell.util import mvd_info
|
||||
from ifcopenshell.util.mvd_info import parse_mvd
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def load_fixture():
|
||||
base_dir = os.path.join(os.path.dirname(__file__), "fixtures", "mvd_parsing")
|
||||
def _load(filename):
|
||||
return ifcopenshell.open(os.path.join(base_dir, filename))
|
||||
return _load
|
||||
|
||||
|
||||
class TestViewDefinition:
|
||||
def test_single_view(self, load_fixture):
|
||||
f = load_fixture("passing_header.ifc")
|
||||
assert f.mvd.view_definitions == "Alignment-basedView"
|
||||
|
||||
def test_multiple_views(self, load_fixture):
|
||||
f = load_fixture("two_views.ifc")
|
||||
assert f.mvd.view_definitions == 'CoordinationView_V2.0, SpaceBoundaryAddonView'
|
||||
|
||||
|
||||
class TestExchangeRequirements:
|
||||
def test_parsing(self, load_fixture):
|
||||
f = load_fixture("contains_exchange_requirement.ifc")
|
||||
parsed = parse_mvd(f.mvd.description)
|
||||
assert parsed.exchange_requirements == 'Any'
|
||||
|
||||
def test_access_and_modification(self, load_fixture):
|
||||
f = load_fixture("contains_exchange_requirement.ifc")
|
||||
f.header.file_description.description = (
|
||||
'ViewDefinition [Alignment-basedView]',
|
||||
'ExchangeRequirement [SomethingElse]'
|
||||
)
|
||||
assert f.mvd.exchange_requirements == 'SomethingElse'
|
||||
f.mvd.view_definitions = 'CoordinationView_V2.0'
|
||||
assert f.mvd.view_definitions == 'CoordinationView_V2.0'
|
||||
|
||||
|
||||
class TestComments:
|
||||
def test_read_and_append(self, load_fixture):
|
||||
f = load_fixture("contains_comment.ifc")
|
||||
assert f.mvd.comments == ['Any']
|
||||
f.mvd.comments = ['SomethingElse']
|
||||
assert f.mvd.comments == ['SomethingElse']
|
||||
f.mvd.comments.append('AnotherComment')
|
||||
assert f.mvd.comments == ['SomethingElse', ' AnotherComment']
|
||||
assert f.mvd.description[1] == 'Comment [SomethingElse, AnotherComment]'
|
||||
|
||||
def test_comment_list_modifications(self, load_fixture):
|
||||
f = load_fixture("contains_comment.ifc")
|
||||
f.mvd.comments = ''
|
||||
f.mvd.comments.append('OnlyOne')
|
||||
assert 'OnlyOne' in f.mvd.comments
|
||||
|
||||
f.mvd.comments.insert(0, 'FirstOne')
|
||||
f.mvd.comments[0] == 'FirstOne'
|
||||
|
||||
f.mvd.comments.pop()
|
||||
assert f.mvd.comments[0] == 'FirstOne'
|
||||
|
||||
del f.mvd.comments[0]
|
||||
assert not f.mvd.comments
|
||||
|
||||
|
||||
class TestOptions:
|
||||
def test_string_options(self, load_fixture):
|
||||
f = load_fixture("contains_options.ifc")
|
||||
assert f.mvd.options == 'Any'
|
||||
assert 'options' in f.mvd.keywords
|
||||
|
||||
|
||||
class TestDynamicFields:
|
||||
def test_options_modifications(self, load_fixture):
|
||||
f = load_fixture("dynamic_fields.ifc")
|
||||
|
||||
f.mvd.options['ExcludedObjects'].append('Chair')
|
||||
f.mvd.options['SplitLevel'] = 'Off'
|
||||
f.mvd.options['OtherAttr'] = 'SomeValue'
|
||||
|
||||
assert f.mvd.description[2].startswith('Option [')
|
||||
assert 'OtherAttr: SomeValue' in f.mvd.description[2]
|
||||
assert f.mvd.description == f.header.file_description.description
|
||||
|
||||
def test_remark_editing(self, load_fixture):
|
||||
f = load_fixture("dynamic_fields.ifc")
|
||||
assert f.mvd.remark == {'SomeKey': 'SomeValue', 'AnotherKey': 'AnotherValue'}
|
||||
f.mvd.remark['AnotherKey'] = 'SometingElse'
|
||||
f.mvd.remark['IncludedObjects'] = ['Floor', 'Roof']
|
||||
assert f.mvd.remark['AnotherKey'] == 'SometingElse'
|
||||
assert f.mvd.remark['IncludedObjects'] == ['Floor', 'Roof']
|
||||
assert 'remark' in f.mvd.keywords
|
||||
|
||||
def test_custom_dict_behavior(self, load_fixture):
|
||||
f = load_fixture("dynamic_fields.ifc")
|
||||
|
||||
# delete
|
||||
del f.mvd.options['SplitLevel']
|
||||
assert not f.mvd.options.get('SplitLevel')
|
||||
|
||||
# keys, values, items
|
||||
assert set(f.mvd.remark.keys()) == {'SomeKey', 'AnotherKey'}
|
||||
assert 'SomeValue' in f.mvd.remark.values()
|
||||
assert ('SomeKey', 'SomeValue') in f.mvd.remark.items()
|
||||
|
||||
# containment
|
||||
assert 'SomeKey' in f.mvd.remark
|
||||
assert 'MissingKey' not in f.mvd.remark
|
||||
|
||||
|
||||
class TestKeywords:
|
||||
@pytest.mark.parametrize("filename, expected_keywords", [
|
||||
("contains_comment.ifc", {"view_definitions", "comments"}),
|
||||
("contains_exchange_requirement.ifc", {"view_definitions", "exchange_requirements"}),
|
||||
("contains_options.ifc", {"view_definitions", "options"}),
|
||||
("dynamic_fields.ifc", {"view_definitions", "exchange_requirements", "comments", "remark"})
|
||||
])
|
||||
def test_keywords_present(self, load_fixture, filename, expected_keywords):
|
||||
f = load_fixture(filename)
|
||||
assert f.mvd.keywords == expected_keywords
|
||||
|
||||
|
||||
class TestFallbackBehavior:
|
||||
def test_parse_mvd_fallback(self, monkeypatch):
|
||||
monkeypatch.setattr(mvd_info, "LARK_AVAILABLE", False)
|
||||
mvd = mvd_info.MvdInfo(
|
||||
get_description=lambda: ["ViewDefinition [ShouldNotParse]"],
|
||||
set_description=lambda d: None
|
||||
)
|
||||
assert mvd.view_definitions is None
|
||||
assert mvd.keywords == set()
|
||||
Reference in New Issue
Block a user