PDA

Visualizza la versione completa : [c++]formato IFC


giuseppe500
05-11-2009, 15:58
Ciao.
Devo importare un formato xml , di nome IFCper l'architettura.
Questo formato è ad oggetti , ovvero in tutto l'xml ci sono le entità che possono essere Wall , Window , door ecc....
Ogni entità ha un id(identificativo univoco , un ref(riferimento ad un id) e un tipo che puo' essere ifcWall.

per es questo è l'ifcProject da cui si inizia:


<IfcProject id="i1">
<GlobalId>3Dnr_WURnBz8naa7SrcgQx</GlobalId>
<OwnerHistory>
<IfcOwnerHistory xsi:nil="true" ref="i2"/>
</OwnerHistory>
<Name>Default Project</Name>
<Description>Description of Default Project</Description>
<RepresentationContexts ex:cType="set">
<IfcGeometricRepresentationContext pos="0" xsi:nil="true" ref="i20"/>
</RepresentationContexts>
<UnitsInContext>
<IfcUnitAssignment xsi:nil="true" ref="i7"/>
</UnitsInContext>
</IfcProject>
[code]

se voglio importare la geometria mi concentrero' sul nodo <IfcGeometricRepresentationContext pos="0" xsi:nil="true" ref="i20"/>

quindi andro al riferimento all'ìd i20 che è dello stesso tipo (IfcGeometricRepresentationContext):
[code]
<IfcGeometricRepresentationContext id="i20">
<ContextType>Model</ContextType>
<CoordinateSpaceDimension>3</CoordinateSpaceDimension>
<Precision>0.00001</Precision>
<WorldCoordinateSystem>
<IfcAxis2Placement3D xsi:nil="true" ref="i21"/>
</WorldCoordinateSystem>
</IfcGeometricRepresentationContext>


quindi all'id "i21"


<IfcAxis2Placement3D xsi:nil="true" ref="i21"/>
e otterrò:
<IfcAxis2Placement3D id="i21">
<Location>
<IfcCartesianPoint xsi:nil="true" ref="i22"/>
</Location>
</IfcAxis2Placement3D>

e all' id:ref="i22" e otterro' finalmente i punti:


<IfcCartesianPoint id="i22">
<Coordinates ex:cType="list">
<IfcLengthMeasure pos="0">0.</IfcLengthMeasure>
<IfcLengthMeasure pos="1">0.</IfcLengthMeasure>
<IfcLengthMeasure pos="2">0.</IfcLengthMeasure>
</Coordinates>
</IfcCartesianPoint>


Io sto cercando una buona soluzione , e l'ho pensata cosi:
prima di tutto creo una classe ifcEntity e da questa faccio ereditare tutte le entità ,poi
deserializzzo il documento e metto tutti gli id delle entità in una mappa , cosi:
map<stringID,CEntityIFC>mappa
poi inizio ad attraversare il documento(tutto fatto di ifcEntity) e per ogni riferimento carico l'entità e vorrei il tipo.
Per ogni tipo la logica sarà diversa a seconda se l'entità è un wall o una door ecc...
una volta che arrivo all'oggetto che mi serve leggo i dati e ho finito.
Ho pensato che si potrebbero utilizzare i template per gestire la logica , ma non sono molto preparato e chiedo a voi.
Grazie.

Loading