From 9659de6ebfe74ed4a605dc5e2906b465fa995e1c Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 15 Nov 2019 15:44:04 +1100 Subject: [PATCH] Support export of people and organisations --- .../data/owner/organisation.json | 13 +++++ .../io_export_ifc/data/owner/person.json | 35 +++++++++++++ .../io_export_ifc/export_ifc.py | 50 +++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 src/ifcblenderexport/io_export_ifc/data/owner/organisation.json create mode 100644 src/ifcblenderexport/io_export_ifc/data/owner/person.json diff --git a/src/ifcblenderexport/io_export_ifc/data/owner/organisation.json b/src/ifcblenderexport/io_export_ifc/data/owner/organisation.json new file mode 100644 index 0000000000..b9420dc4d3 --- /dev/null +++ b/src/ifcblenderexport/io_export_ifc/data/owner/organisation.json @@ -0,0 +1,13 @@ +[ + { + "Name": "ACME", + "Description": "Does everything", + "Roles": [ { "Role": "ARCHITECT" } ], + "Addresses": [{ + "Purpose": "OFFICE", + "Description": "Headquarters", + "ElectronicMailAddresses": ["acme@example.com"], + "WWWHomePageURL": "https://example.com" + }] + } +] diff --git a/src/ifcblenderexport/io_export_ifc/data/owner/person.json b/src/ifcblenderexport/io_export_ifc/data/owner/person.json new file mode 100644 index 0000000000..caa8276916 --- /dev/null +++ b/src/ifcblenderexport/io_export_ifc/data/owner/person.json @@ -0,0 +1,35 @@ +[ + { + "Identification": "Moult", + "FamilyName": "Moult", + "GivenName": "Dion", + "MiddleNames": ["Sebastian", "Isan", "Tan"], + "PrefixTitles": ["Mr"], + "SuffixTitles": ["UE"], + "Roles": [{ + "Role": "ARCHITECT", + "UserDefinedRole": null, + "Description": "Draws the pretty pictures" + }], + "Addresses": [{ + "Purpose": "OFFICE", + "Description": "Headquarters", + "UserDefinedPurpose": null, + "InternalLocation": "Cupboard under the stairs", + "AddressLines": [ "221B Baker Street" ], + "PostalBox": null, + "Town": "MyTown", + "Region": "Middle-Earth", + "PostalCode": "42", + "Country": "Narnia" + }, { + "Purpose": "OFFICE", + "Description": "Headquarters", + "UserDefinedPurpose": null, + "TelephoneNumbers": ["0123456789"], + "ElectronicMailAddresses": ["dion@thinkmoult.com"], + "WWWHomePageURL": "https://thinkmoult.com", + "MessagingIDs": ["irc://irc.freenode.net##architect"] + }] + } +] diff --git a/src/ifcblenderexport/io_export_ifc/export_ifc.py b/src/ifcblenderexport/io_export_ifc/export_ifc.py index e29f82fd60..5c63229afa 100644 --- a/src/ifcblenderexport/io_export_ifc/export_ifc.py +++ b/src/ifcblenderexport/io_export_ifc/export_ifc.py @@ -98,6 +98,8 @@ class IfcParser(): self.product_name_index_map = {} self.units = {} + self.people = [] + self.organisations = [] self.psets = {} self.documents = {} self.classifications = [] @@ -135,6 +137,8 @@ class IfcParser(): def parse(self): self.units = self.get_units() self.unit_scale = self.get_unit_scale() + self.people = self.get_people() + self.organisations = self.get_organisations() self.convert_selected_objects_into_products(bpy.context.selected_objects) self.psets = self.get_psets() self.documents = self.get_documents() @@ -454,6 +458,14 @@ class IfcParser(): } return results + def get_people(self): + with open(self.data_dir + 'owner/person.json') as file: + return json.load(file) + + def get_organisations(self): + with open(self.data_dir + 'owner/organisation.json') as file: + return json.load(file) + def get_documents(self): documents = {} doc_path = self.data_dir + 'doc/' @@ -784,6 +796,8 @@ class IfcExporter(): self.set_common_definitions() self.ifc_parser.parse() self.create_units() + self.create_people() + self.create_organisations() self.create_rep_context() self.create_project() self.create_documents() @@ -866,6 +880,42 @@ class IfcExporter(): dimensional_exponents, '{}UNIT'.format(type.upper()), name, conversion_factor) + def create_people(self): + for person in self.ifc_parser.people: + if person['Roles']: + person['Roles'] = self.create_roles(person['Roles']) + if person['Addresses']: + person['Addresses'] = self.create_addresses(person['Addresses']) + self.file.create_entity('IfcPerson', **person) + + def create_organisations(self): + for organisation in self.ifc_parser.organisations: + if organisation['Roles']: + organisation['Roles'] = self.create_roles(organisation['Roles']) + if organisation['Addresses']: + organisation['Addresses'] = self.create_addresses(organisation['Addresses']) + self.file.create_entity('IfcOrganization', **organisation) + + def create_roles(self, roles): + results = [] + for role in roles: + results.append(self.file.create_entity('IfcActorRole', **role)) + return results + + def create_addresses(self, addresses): + results = [] + for address in addresses: + is_postal_address = False + for key in ['InternalLocation', 'AddressLines', 'PostalBox', 'Town', + 'Region', 'PostalCode', 'Country']: + if key in address: + is_postal_address = True + if is_postal_address: + results.append(self.file.create_entity('IfcPostalAddress', **address)) + else: + results.append(self.file.create_entity('IfcTelecomAddress', **address)) + return results + def create_documents(self): for document in self.ifc_parser.documents.values(): document['ifc'] = self.file.create_entity(