Skip to content

Commit f2b6198

Browse files
Ghesselinkaothms
authored andcommitted
check for invalid header entity
1 parent 84f84aa commit f2b6198

File tree

4 files changed

+75
-13
lines changed

4 files changed

+75
-13
lines changed

__init__.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010

1111
from lark import Lark, Transformer, Tree, Token
1212
from lark.exceptions import UnexpectedToken, UnexpectedCharacters
13-
from .mvd_info import MvdInfo, LARK_AVAILABLE
13+
try:
14+
from .mvd_info import MvdInfo, LARK_AVAILABLE
15+
except ImportError: # in case of running module locally (e.g. test_parser.py)
16+
from mvd_info import MvdInfo, LARK_AVAILABLE
1417

1518
class ValidationError(Exception):
1619
pass
@@ -87,8 +90,10 @@ def build():
8790
subsuper_record : "(" simple_record_list ")"
8891
simple_record_list:simple_record simple_record*
8992
simple_record: keyword "("parameter_list?")"
90-
header_entity :keyword "(" parameter_list ")" ";"
91-
header_entity_list: header_entity header_entity*
93+
header_entity_list: file_description file_name file_schema
94+
file_description: "FILE_DESCRIPTION" "(" parameter_list ")" ";"
95+
file_name: "FILE_NAME" "(" parameter_list ")" ";"
96+
file_schema: "FILE_SCHEMA" "(" parameter_list ")" ";"
9297
id: /#[0-9]+/
9398
keyword: /[A-Z][0-9A-Z_]*/
9499
parameter: untyped_parameter|typed_parameter|omitted_parameter
@@ -285,17 +290,18 @@ def traverse(fn, x):
285290
attributes,
286291
(min(lines), max(lines)),
287292
)
293+
294+
def make_header_ent(ast):
295+
rule = ast.data
296+
params = T(visit_tokens=True).transform(ast.children[0])
297+
return rule.upper(), params
298+
288299

289300

290301
def process_tree(filecontent, file_tree, with_progress, with_header=False):
291302
ents = defaultdict(list)
292303
header, data = file_tree.children
293304

294-
def make_header_ent(ast):
295-
kw, param_list = ast.children
296-
kw = kw.children[0].value
297-
return kw, T(visit_tokens=True).transform(param_list)
298-
299305
if with_header:
300306
header = dict(map(make_header_ent, header.children[0].children))
301307

@@ -366,11 +372,6 @@ def replace_fn(match):
366372

367373
header_tree = ast.children[0] # HEADER section
368374

369-
def make_header_ent(ast):
370-
kw, param_list = ast.children
371-
kw = kw.children[0].value
372-
return kw, T(visit_tokens=True).transform(param_list)
373-
374375
header = dict(map(make_header_ent, header_tree.children[0].children))
375376
return header
376377

fixtures/extended_mvd.ifc

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
ISO-10303-21;
2+
HEADER;
3+
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');
4+
FILE_NAME('','2022-05-04T08:08:30',(''),(''),'IfcOpenShell-0.7.0','IfcOpenShell-0.7.0','');
5+
FILE_SCHEMA(('IFC4'));
6+
ENDSEC;
7+
DATA;
8+
#1=IFCPERSON($,$,'',,$,$,$,$);
9+
#2=IFCORGANIZATION($,'',$,$,$);
10+
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
11+
#4=IFCAPPLICATION(#2,'0.7.0','IfcOpenShell-0.7.0','');
12+
#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,$,#3,#4,1651651710);
13+
#6=IFCDIRECTION((1.,0.,0.));
14+
#7=IFCDIRECTION((0.,0.,1.));
15+
#8=IFCCARTESIANPOINT((0.,0.,0.));
16+
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
17+
#10=IFCDIRECTION((0.,1.,0.));
18+
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
19+
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
20+
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
21+
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
22+
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
23+
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
24+
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
25+
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
26+
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
27+
#20=IFCPROJECT('2AyG2X0sb16Bjd4gQc07yZ',#5,'',$,$,$,$,(#11),#19);
28+
ENDSEC;
29+
END-ISO-10303-21;
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
ISO-10303-21;
2+
HEADER;
3+
FILE_DESCRIPTION(('ViewDefinition [Alignment-basedView]'),'2;1');
4+
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');
5+
FILE_SCHEMA(('IFC4X3_ADD2'));
6+
ENDSEC;
7+
DATA;
8+
#1=IFCPERSON($,$,'',$,$,$,$,$);
9+
#2=IFCORGANIZATION($,'',$,$,$);
10+
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
11+
#4=IFCAPPLICATION(#2,'v0.7.0-6c9e130ca','IfcOpenShell-v0.7.0-6c9e130ca','');
12+
#5=IFCOWNERHISTORY(#3,#4,$,.NOTDEFINED.,$,#3,#4,1700419055);
13+
#6=IFCDIRECTION((1.,0.,0.));
14+
#7=IFCDIRECTION((0.,0.,1.));
15+
#8=IFCCARTESIANPOINT((0.,0.,0.));
16+
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
17+
#10=IFCDIRECTION((0.,1.));
18+
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
19+
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
20+
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
21+
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
22+
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
23+
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
24+
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
25+
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
26+
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
27+
#20=IFCPROJECT('0iDmeiiLP3AOllitM2Favn',#5,'',$,$,$,$,(#11),#19);
28+
#21=IFCSITE('3rg2jGkIH10RFhrQsGZKRk',#5,$,$,$,$,$,$,$,$,$,$,$,$);
29+
ENDSEC;
30+
END-ISO-10303-21;

test_parser.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,5 @@ def test_file_mvd_attr():
104104
assert 'Ramp' in f.mvd.options['ExcludedObjects']
105105
assert f.mvd.Remark['SomeKey'] == 'SomeValue'
106106
assert len(f.mvd.comments) == 2
107+
assert all(v in vars(f.header).keys() for v in ['file_description', 'file_name', 'file_schema'])
108+
assert len(f.header.file_name) == 7

0 commit comments

Comments
 (0)