@@ -16,6 +16,63 @@ class ValidationError(Exception):
1616 pass
1717
1818
19+ HEADER_FIELDS = {
20+ "file_description" : [
21+ "description" ,
22+ "implementation_level" ,
23+ ],
24+ "file_name" : [
25+ "name" ,
26+ "time_stamp" ,
27+ "author" ,
28+ "organization" ,
29+ "preprocessor_version" ,
30+ "originating_system" ,
31+ "authorization" ,
32+ ],
33+ "file_schema" : [
34+ "schema_identifiers" ,
35+ ],
36+ }
37+
38+ class HeaderWrapper :
39+ def __init__ (self , field_names , values ):
40+ self ._fields = field_names
41+ self ._values = values
42+ for k , v in zip (field_names , values ):
43+ setattr (self , k , v )
44+
45+ def __getitem__ (self , index ):
46+ """
47+ Allows for the object to be subscriptable, avoiding conflicts with the validation service. Can be removed after service is fully compatible.
48+ e.g.
49+ >>> f.header.file_name[0]
50+ 'Header example2.ifc'
51+ >>> f.header.file_name.name
52+ 'Header example2.ifc'
53+ """
54+ return self ._values [index ]
55+
56+ def __len__ (self ):
57+ return len (self ._values )
58+
59+ def __iter__ (self ):
60+ return iter (self ._values )
61+
62+ def __repr__ (self ):
63+ """
64+ Representing custom header object when debugging, e.g.
65+ >>> f.header.file_name
66+ <HeaderWrapper name='Header example2.ifc', time_stamp='2022-09-16T10:35:07',
67+ author=('Evandro Alfieri',), organization=('buildingSMART Int.',),
68+ preprocessor_version='IFC Motor 1.0', originating_system='Company - Application - 26.0.0.0',
69+ authorization='none'>
70+ """
71+ return f"<{ self .__class__ .__name__ } " + ", " .join (
72+ f"{ k } ={ repr (getattr (self , k ))} " for k in self ._fields
73+ ) + ">"
74+
75+
1976class SyntaxError (ValidationError ):
2077 def __init__ (self , filecontent , exception ):
2178 self .filecontent = filecontent
@@ -433,9 +490,26 @@ def schema_version(self) -> tuple[int, int, int, int]:
433490 version .append (int (number .group (1 )) if number else 0 )
434491 return tuple (version )
435492
493+ # @property
494+ # def header(self):
495+ # mapping = {
496+ # "file_description": file_description,
497+ # "file_name": file_name,
498+ # "file_schema": file_schema,
499+ # }
500+
501+ # return types.SimpleNamespace(**{
502+ # k.lower(): mapping[k.lower()](v)
503+ # for k, v in self.header_.items()
504+ # if k.lower() in mapping
505+ # })
436506 @property
437507 def header (self ):
438- return types .SimpleNamespace (** {k .lower (): v for k , v in self .header_ .items ()})
508+ return types .SimpleNamespace (** {
509+ name : HeaderWrapper (fields , self .header_ [name .upper ()])
510+ for name , fields in HEADER_FIELDS .items ()
511+ if name .upper () in self .header_
512+ })
439513
440514 def __getitem__ (self , key : numbers .Integral ) -> entity_instance :
441515 return self .by_id (key )
@@ -472,3 +546,22 @@ def by_type(self, type: str) -> list[entity_instance]:
472546
473547def open (fn ) -> file :
474548 return file (parse (filename = fn , with_tree = True , with_header = True ))
549+
550+ class file_description :
551+ def __init__ (self , values ):
552+ self .description = values [0 ]
553+ self .implementation_level = values [1 ]
554+
555+ class file_name :
556+ def __init__ (self , values ):
557+ self .name = values [0 ]
558+ self .time_stamp = values [1 ]
559+ self .author = values [2 ]
560+ self .organization = values [3 ]
561+ self .preprocessor_version = values [4 ]
562+ self .originating_system = values [5 ]
563+ self .authorization = values [6 ]
564+
565+ class file_schema :
566+ def __init__ (self , values ):
567+ self .schema_identifiers = values [0 ]
0 commit comments