2013-02-25 5 views
2

Je dois extraire la géométrie d'un fichier ifc dans JAVA. Mon problème est, que je ne sais pas comment le faire.Extraction de la géométrie à partir du fichier IFC

J'ai essayé d'utiliser openifctools mais la documentation est vraiment mauvaise. Pour l'instant, j'ai le fichier ifc chargé, mais je ne peux pas obtenir la géométrie du modèle.

Est-ce que quelqu'un a de l'expérience avec le chargement de modèle ifc?

Merci d'avance.

EDIT: Voici ce que je l'ai fait jusqu'à présent

try { 
    IfcModel ifcModel = new IfcModel(); 
    ifcModel.readStepFile(new File("my-project.ifc")); 
    Collection<IfcClass> ifcObjects = ifcModel.getIfcObjects(); 
    System.out.println(ifcObjects.iterator().next()); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

Cela charge correctement le fichier ifc. Mais je ne sais pas quoi faire avec cette information.

J'ai également essayé d'utiliser IfcOpenShell mais le conteneur de pot fourni n'avait pas fonctionné non plus. En ce moment j'essaie de construire IfcOpenShell par moi-même.

Je suis un peu désespéré parce que tout est très non documenté et j'ai vraiment besoin de charger et d'analyser la géométrie ifc.

+0

Je n'ai aucune expérience avec les fichiers IFC, mais si c'est un problème java général, je pourrais être en mesure de vous aider. Pouvez-vous nous montrer ce que vous avez jusqu'ici? Plus les erreurs/la production que vous pourriez avoir. – mjshaw

+0

Java ne devrait pas être le problème. Quoi qu'il en soit, j'ai édité ma question et ajouté quelques morceaux de code qui chargent un fichier ifc en mémoire en utilisant openifctools. – AlmostBearded

+0

Désolé, alors j'ai mal compris. Pour utiliser IfcModel et IfcClass, vous avez vraiment besoin de l'API. A défaut, essayez de jouer avec un IDE qui offre une auto-complétion, comme une éclipse. cela pourrait vous donner une idée des méthodes disponibles pour que vous puissiez en déduire comment l'utiliser. Désolé, je ne suis pas plus d'aide. – mjshaw

Répondre

3

Selon ce que vous voulez faire avec la géométrie, la profondeur que vous voulez plonger dans la norme SFI et quelles sont les performances dont vous avez besoin pour votre solution, vous avez deux options différentes:

  1. extraire la géométrie implicite votre propre
  2. Utilisez un moteur de géométrie externe

Si vous optez pour la première option, il vous faudrait étudier la IFC schema intensive. Vous ne seriez intéressé que par IFCProducts, car seuls ceux-là peuvent avoir une géométrie. En utilisant OpenIfcTools vous pouvez faire quelque chose comme:

Collection<IfcProduct> products = model.getCollection(IfcProduct.class); 
for(IfcProduct product: products){ 
    List<IfcRepresentation> representations = product.getRepresentation().getRepresentations(); 
    assert ! representations.isEmpty(); 
    assert representations.get(0) instanceof IfcShapeRepresentation: 
    Collection<IfcRepresentationItem> repr = representations.get(0).getItems(); 
    assert !repr.isEmpty(); 
    IfcRepresentationItem representationItem = repr.iterator().next(); 
    assert representationItem instanceof IfcFacetedBrep; 
    for(IfcFace face: ((IfcFacetedBrep)representationItem).getOuter().getCfsFaces()){ 
     for(IfcFaceBound faceBound: face.getBounds()){ 
      IfcLoop loop = faceBound.getBound(); 
      assert loop instanceof IfcPolyLoop; 
      for(IfcCartesianPoint point: ((IfcPolyLoop) loop).getPolygon()){ 
       point.getCoordinates(); 
      } 
     } 
    } 
} 

Cependant, il y a beaucoup de différentes GeometryRepresentations, que vous auriez à couvrir, probablement faire triangulation et d'autres choses sur votre propre. J'ai montré un cas particulier et fait beaucoup d'affirmations. Et vous devrez manipuler les transformations de coordonnées, car celles-ci peuvent être imbriquées récursivement. Si vous optez pour la deuxième option, les moteurs de géométrie que je connais sont tous écrits en C/C++ (Ifcopenshell, RDF IfcEngine), vous devrez donc faire face à l'intégration de la bibliothèque native. Le paquet jar fourni avec IFCOpenshell est destiné à être utilisé comme un plugin Bimserver. Ceux que vous ne pouvez pas utiliser sans les dépendances respectives. Cependant, vous pouvez récupérer les binaires natifs de ce paquet. Pour utiliser le moteur, vous pouvez vous inspirer du Bimserver plugin source. Les principales méthodes natives que vous êtes va utiliser sont

  • boolean setIfcData(byte[] ifc) pour analyser les données ifc
  • IfcGeomObject getGeometry() pour accéder à la géométrie extraite successivement.
Questions connexes