Files
ifc-weather-mapping-mechanism/ifcParser/ifcProject.py
2024-10-10 22:59:05 +00:00

146 lines
12 KiB
Python

from rdflib import Graph, Namespace, URIRef, Literal, RDF, RDFS, XSD
class project():
def __init__(self, IfcProject, g, ontology, resource):
self.IfcProject = IfcProject
self.g = g
self.ontology = ontology
self.resource = resource
def ifcProjectFunction(self):
for proj in self.IfcProject:
projectID = proj['globalId']
#basic information
self.g.add((self.resource[projectID], RDF.type, self.ontology.Project))
try:#add history
projectHistory = proj['ownerHistory']['ref']
self.g.add((self.resource[projectHistory], RDF.type, self.ontology.History))
self.g.add((self.resource[projectID], self.ontology.hasHistory, self.resource[projectHistory]))
except Exception:
pass
try: # name is not always there
projName = proj['name']
self.g.add((self.resource[projectID], self.ontology.name, Literal(projName)))
except Exception:
pass
try: # description is not always there
projDescription = proj['description']
self.g.add((self.resource[projectID], self.ontology.description, Literal(projDescription)))
except Exception:
pass
try: # description is not always there
projLongName = proj['longName']
self.g.add((self.resource[projectID], self.ontology.longName, Literal(projLongName)))
except Exception:
pass
try: # description is not always there
projPhase = proj['phase']
self.g.add((self.resource[projectID], self.ontology.phase, Literal(projPhase)))
except Exception:
pass
try: # representationContexts is not always there
for representationContexts in proj['representationContexts']:
context = representationContexts['ref']
self.g.add((self.resource[context], RDF.type, self.ontology.Context))
self.g.add((self.resource[projectID], self.ontology.hasRepresentationContext, self.resource[context]))
except Exception:
pass
try: # definedby is not always there
for defined in proj['isDefinedBy']:
issdefined = defined['ref']
self.g.add((self.resource[issdefined], RDF.type, self.ontology.PropertySet))
self.g.add((self.resource[projectID], self.ontology.isDefinedBy, self.resource[issdefined]))
except Exception:
pass
try: # decompose is not always there
for representation in proj['isDecomposedBy']:
rep = representation['ref']
self.g.add((self.resource["building_" + projectID], RDF.type, self.ontology.Object))
self.g.add((self.resource[rep], self.ontology.isDecomposedBy, self.resource["building_" + projectID]))
except Exception:
pass
try: # decompose is not always there
for representation in proj['declares']:
rep = representation['ref']
self.g.add((self.resource["declaration_" + projectID], RDF.type, self.ontology.RelationDeclaration))
self.g.add((self.resource[rep], self.ontology.declares, self.resource["declaration_" + projectID]))
except Exception:
pass
try:
count, countElement = 1, 1
for unit in proj['unitsInContext']['units']:
unitType = unit['type']
print(unitType)
if unitType == "IfcSIUnit":
self.g.add((self.resource["ifcUnit_" + projectID + "_" + str(count)], RDF.type, self.ontology.IfcSIUnit))
self.g.add((self.resource[projectID], self.ontology.hasUnit, self.resource["ifcUnit_" + projectID + "_" + str(count)]))
self.g.add((self.resource["ifcUnit_" + projectID + "_" + str(count)], self.ontology.unitType, Literal(unit['unitType'])))
self.g.add((self.resource["ifcUnit_" + projectID + "_" + str(count)], self.ontology.name, Literal(unit['name'])))
self.g.add((self.resource["ifcUnit_" + projectID + "_" + str(count)], self.ontology.dimensionType, Literal(unit['dimensions']['type'])))
if 'prefix' in list(unit.keys()):
self.g.add((self.resource["ifcUnit_" + projectID + "_" + str(count)], self.ontology.prefix, Literal(unit['prefix'])))
if 'LengthExponent' in list(unit['dimensions'].keys()):
self.g.add((self.resource["ifcUnit_" + projectID + "_" + str(count)], self.ontology.LengthExponent, Literal(unit['dimensions']['LengthExponent'])))
if 'TimeExponent' in list(unit['dimensions'].keys()):
self.g.add((self.resource["ifcUnit_" + projectID + "_" + str(count)], self.ontology.TimeExponent, Literal(unit['dimensions']['TimeExponent'])))
if 'ThermodynamicTemperatureExponent' in list(unit['dimensions'].keys()):
self.g.add((self.resource["ifcUnit_" + projectID + "_" + str(count)], self.ontology.ThermodynamicTemperatureExponent, Literal(unit['dimensions']['ThermodynamicTemperatureExponent'])))
if 'MassExponent' in list(unit['dimensions'].keys()):
self.g.add((self.resource["ifcUnit_" + projectID + "_" + str(count)], self.ontology.MassExponent, Literal(unit['dimensions']['MassExponent'])))
if 'ElectricCurrentExponent' in list(unit['dimensions'].keys()):
self.g.add((self.resource["ifcUnit_" + projectID + "_" + str(count)], self.ontology.ElectricCurrentExponent, Literal(unit['dimensions']['ElectricCurrentExponent'])))
if 'LuminousIntensityExponent' in list(unit['dimensions'].keys()):
self.g.add((self.resource["ifcUnit_" + projectID + "_" + str(count)], self.ontology.LuminousIntensityExponent, Literal(unit['dimensions']['LuminousIntensityExponent'])))
elif unitType == "IfcConversionBasedUnit":
self.g.add((self.resource["conversionBasedUnit_" + projectID + "_" + str(count)], RDF.type, self.ontology.ConversionBasedUnit))
self.g.add((self.resource[projectID], self.ontology.hasUnit, self.resource["conversionBasedUnit_" + projectID + "_" + str(count)]))
self.g.add((self.resource["conversionBasedUnit_" + projectID + "_" + str(count)], self.ontology.unitType, Literal(unit['unitType'])))
self.g.add((self.resource["conversionBasedUnit_" + projectID + "_" + str(count)], self.ontology.name, Literal(unit['name'])))
self.g.add((self.resource["conversionBasedUnit_" + projectID + "_" + str(count)], self.ontology.coversionType, Literal(unit['conversionFactor']['valueComponent']['type'])))
self.g.add((self.resource["conversionBasedUnit_" + projectID + "_" + str(count)], self.ontology.coversionValue, Literal(unit['conversionFactor']['valueComponent']['value'])))
self.g.add((self.resource["conversionBasedUnit_" + projectID + "_" + str(count)], self.ontology.componentType, Literal(unit['conversionFactor']['unitComponent']['unitType'])))
self.g.add((self.resource["conversionBasedUnit_" + projectID + "_" + str(count)], self.ontology.componentName, Literal(unit['conversionFactor']['unitComponent']['name'])))
self.g.add((self.resource["conversionBasedUnit_" + projectID + "_" + str(count)], self.ontology.dimensionType, Literal(unit['conversionFactor']['unitComponent']['dimensions']['type'])))
self.g.add((self.resource["conversionBasedUnit_" + projectID + "_" + str(count)], self.ontology.LengthExponent, Literal(unit['dimensions']['lengthExponent'])))
self.g.add((self.resource["conversionBasedUnit_" + projectID + "_" + str(count)], self.ontology.MassExponent, Literal(unit['dimensions']['massExponent'])))
self.g.add((self.resource["conversionBasedUnit_" + projectID + "_" + str(count)], self.ontology.TimeExponent, Literal(unit['dimensions']['timeExponent'])))
self.g.add((self.resource["conversionBasedUnit_" + projectID + "_" + str(count)], self.ontology.ElectricCurrentExponent, Literal(unit['dimensions']['electricCurrentExponent'])))
self.g.add((self.resource["conversionBasedUnit_" + projectID + "_" + str(count)], self.ontology.ThermodynamicTemperatureExponent, Literal(unit['dimensions']['thermodynamicTemperatureExponent'])))
self.g.add((self.resource["conversionBasedUnit_" + projectID + "_" + str(count)], self.ontology.AmountOfSubstanceExponent, Literal(unit['dimensions']['amountOfSubstanceExponent'])))
self.g.add((self.resource["conversionBasedUnit_" + projectID + "_" + str(count)], self.ontology.LuminousIntensityExponent, Literal(unit['dimensions']['luminousIntensityExponent'])))
elif unitType == "IfcDerivedUnit":
self.g.add((self.resource["derivedUnit_" + projectID + "_" + str(count)], RDF.type, self.ontology.DerivedUnit))
self.g.add((self.resource[projectID], self.ontology.hasUnit, self.resource["derivedUnit_" + projectID + "_" + str(count)]))
self.g.add((self.resource["derivedUnit_" + projectID + "_" + str(count)], self.ontology.unitType, Literal(unit['unitType'])))
for element in unit['elements']:
self.g.add((self.resource["derivedUnitElement_" + projectID + "_" + str(countElement)], RDF.type, self.ontology.DerivedUnit))
self.g.add((self.resource["derivedUnit_" + projectID + "_" + str(count)], self.ontology.hasElement, self.resource["derivedUnitElement_" + projectID + "_" + str(countElement)]))
self.g.add((self.resource["derivedUnitElement_" + projectID + "_" + str(countElement)], self.ontology.type, Literal(element['unit']['unitType'])))
try:
self.g.add((self.resource["derivedUnitElement_" + projectID + "_" + str(countElement)],
self.ontology.prefix, Literal(element['prefix'])))
except Exception:
pass
try:
self.g.add((self.resource["derivedUnitElement_" + projectID + "_" + str(countElement)], self.ontology.name, Literal(element['unit']['name'])))
except Exception:
pass
self.g.add((self.resource["derivedUnitElement_" + projectID + "_" + str(countElement)], self.ontology.exponent, Literal(element['exponent'])))
self.g.add((self.resource["derivedUnitElement_" + projectID + "_" + str(countElement)], self.ontology.dimensionType, Literal(element['unit']['dimensions']['type'])))
for k in list(element['unit']['dimensions'].keys()):
if str(k) != "type":
self.g.add((self.resource["derivedUnitElement_" + projectID + "_" + str(countElement)], self.ontology[k], Literal(element['unit']['dimensions'][k])))
countElement += 1
else:
pass
count += 1
except Exception:
pass
# Create RDF triples
# Serialize and save the RDF graph to a TTL file
file_path = "output.ttl"
self.g.serialize(destination=file_path, format="turtle")