Skip to content

Commit fe17267

Browse files
committed
Add function to retrieve inverse attributes from Python
1 parent 69a27e3 commit fe17267

File tree

9 files changed

+335
-1
lines changed

9 files changed

+335
-1
lines changed

src/ifcexpressparser/rt_implementation.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ def __init__(self, mapping):
2626
entity_descriptors = []
2727
enumeration_descriptors = []
2828
derived_field_statements = []
29+
inverse_implementations = []
2930

3031
for name, type in mapping.schema.simpletypes.items():
3132
entity_descriptors.append(templates.entity_descriptor % {
@@ -83,13 +84,25 @@ def __init__(self, mapping):
8384
'type' : name,
8485
'statements' : statements
8586
})
87+
88+
for name, type in mapping.schema.entities.items():
89+
if type.inverse:
90+
for attr in type.inverse.elements:
91+
print (attr)
92+
inverse_implementations.append(templates.inverse_implementation % {
93+
'type' : name,
94+
'name' : attr.name,
95+
'related_type' : attr.entity,
96+
'index' : [i for i, a in enumerate(mapping.schema.entities[attr.entity].attributes) if a.name == attr.attribute][0]
97+
})
8698

8799
self.str = templates.rt_implementation % {
88100
'schema_name_upper' : mapping.schema.name.upper(),
89101
'schema_name' : mapping.schema.name.capitalize(),
90102
'entity_descriptors' : '\n'.join(entity_descriptors),
91103
'enumeration_descriptors' : '\n'.join(enumeration_descriptors),
92-
'derived_field_statements' : '\n'.join(derived_field_statements)
104+
'derived_field_statements' : '\n'.join(derived_field_statements),
105+
'inverse_implementations' : '\n'.join(inverse_implementations)
93106
}
94107

95108
self.schema_name = mapping.schema.name.capitalize()

src/ifcexpressparser/templates.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
const std::string& GetAttributeName(Enum t, unsigned char a);
9090
bool GetAttributeOptional(Enum t, unsigned char a);
9191
std::pair<const char*, int> GetEnumerationIndex(Enum t, const std::string& a);
92+
std::pair<Enum, unsigned> GetInverseAttribute(Enum t, const std::string& a);
9293
Enum GetAttributeEnumerationClass(Enum t, unsigned char a);
9394
void PopulateDerivedFields(IfcWrite::IfcWritableEntity* e);
9495
}}
@@ -181,6 +182,7 @@
181182
182183
std::map<Type::Enum,IfcEntityDescriptor*> entity_descriptor_map;
183184
std::map<Type::Enum,IfcEnumerationDescriptor*> enumeration_descriptor_map;
185+
std::map<std::pair<Type::Enum, std::string>, std::pair<Type::Enum, int> > inverse_map;
184186
void InitDescriptorMap() {
185187
IfcEntityDescriptor* current;
186188
%(entity_descriptors)s
@@ -190,6 +192,10 @@
190192
%(enumeration_descriptors)s
191193
}
192194
195+
void InitInverseMap() {
196+
%(inverse_implementations)s
197+
}
198+
193199
int Type::GetAttributeIndex(Enum t, const std::string& a) {
194200
if (entity_descriptor_map.empty()) ::InitDescriptorMap();
195201
std::map<Type::Enum,IfcEntityDescriptor*>::const_iterator i = entity_descriptor_map.find(t);
@@ -232,6 +238,18 @@
232238
else return i->second->getIndex(a);
233239
}
234240
241+
std::pair<Type::Enum, unsigned> Type::GetInverseAttribute(Enum t, const std::string& a) {
242+
if (inverse_map.empty()) ::InitInverseMap();
243+
std::map<std::pair<Type::Enum, std::string>, std::pair<Type::Enum, int> >::const_iterator it;
244+
std::pair<Type::Enum, std::string> key = std::make_pair(t, a);
245+
while (true) {
246+
it = inverse_map.find(key);
247+
if (it != inverse_map.end()) return it->second;
248+
if ((key.first = Parent(key.first)) == -1) break;
249+
}
250+
throw IfcException("Attribute not found");
251+
}
252+
235253
Type::Enum Type::GetAttributeEnumerationClass(Enum t, unsigned char a) {
236254
if (entity_descriptor_map.empty()) ::InitDescriptorMap();
237255
std::map<Type::Enum,IfcEntityDescriptor*>::const_iterator i = entity_descriptor_map.find(t);
@@ -357,6 +375,8 @@ class %(name)s %(superclass)s{
357375
constructor_stmt_optional = " if (%(name)s) {%(stmt)s } else { e->setArgument(%(index)d); }"
358376
constructor_stmt_derived = " e->setArgumentDerived(%(index)d);"
359377

378+
inverse_implementation = " inverse_map.insert(std::make_pair(std::make_pair(Type::%(type)s, \"%(name)s\"), std::make_pair(Type::%(related_type)s, %(index)d)));"
379+
360380
def multi_line_comment(li):
361381
return ("/// %s"%("\n/// ".join(li))) if len(li) else ""
362382

src/ifcparse/Ifc2x3-rt.cpp

Lines changed: 131 additions & 0 deletions
Large diffs are not rendered by default.

src/ifcparse/Ifc2x3-rt.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ namespace Type {
4141
const std::string& GetAttributeName(Enum t, unsigned char a);
4242
bool GetAttributeOptional(Enum t, unsigned char a);
4343
std::pair<const char*, int> GetEnumerationIndex(Enum t, const std::string& a);
44+
std::pair<Enum, unsigned> GetInverseAttribute(Enum t, const std::string& a);
4445
Enum GetAttributeEnumerationClass(Enum t, unsigned char a);
4546
void PopulateDerivedFields(IfcWrite::IfcWritableEntity* e);
4647
}}

0 commit comments

Comments
 (0)