2017-07-11 1 views
0

J'ai besoin de créer une bibliothèque de classes basée sur un schéma EXPRESS. Le schéma EXPRESS a des types et des entités qui ressemblent à ce qui suit:Comment implémenter EXPRESS dans CSharp le plus efficace

ENTITY IfcRoot 
ABSTRACT SUPERTYPE OF (ONEOF 
    (IfcObjectDefinition 
    ,IfcPropertyDefinition 
    ,IfcRelationship)); 
    GlobalId : IfcGloballyUniqueId; 
    OwnerHistory : OPTIONAL IfcOwnerHistory; 
    Name : OPTIONAL IfcLabel; 
    Description : OPTIONAL IfcText; 
UNIQUE 
    UR1 : GlobalId; 
END_ENTITY; 

Ici GlobalId, OwnerHistory, le nom et la description sont toutes les propriétés de la IfcRoot de classe. Le type de par exemple « Nom » de la propriété est IfcLabel, qui est donné comme un type dans le schéma EXPRESS qui ressemble à ceci:

TYPE IfcLabel = STRING(255); 
END_TYPE; 

Ce type est du type String ou bien tableau de chaînes. Dans mon approche, j'ai implémenté toutes les entités du schéma et tous les types dans le schéma comme des classes dans chsharp. Par conséquent, j'ai écrit un lecteur de chaîne, qui lit le schéma et crée les entités (~ 800) et les types (~ 400) sur cette base. IfcLabel dans ma mise en œuvre ressemble à ceci:

public class IfcLabel 
{ 
    public string _value { get; set; } 
} 

tout cela fonctionne tout à fait bien, mais quand je veux utiliser ma bibliothèque de classes, il est vraiment laborieux en raison du fait que chaque type d'attribut est une classe elle-même. Signification Je dois d'abord créer un objet de la classe IfcLabel et affecter la propriété _value, puis créer mon objet IfcRoot et affecter la propriété Name en tant qu'objet IfcLabel. Est-ce que quelqu'un a une idée, comment je peux l'implémenter d'une manière plus intelligente? Il y a encore une chose à ajouter: tous les types doivent avoir une méthode et hériter d'une classe appelée IfcBase, ce qui doit toujours être possible. Je ne suis pas non plus autorisé à changer directement le type de propriété d'IfcLabel en chaîne, ce qui est en fait à la fin de toute façon.

+0

[motif d'usine?] (Https://www.google.com/search?q=factory+pattern&ie=utf-8&oe=utf-8&client=firefox-b) – TaW

+1

Je n'ai jamais entendu parler de ça auparavant, mais de ce que je lis rapidement, cela ressemble à une solution possible à mon problème. Je vais y regarder de plus près, merci! – FlixFix

+0

Je ne suis pas sûr à ce sujet mais je pense que la balise 'express' n'est pas la bonne puisqu'elle ne ressemble pas à une implémentation de framework nodeJs ici – mJehanno

Répondre

1

Pour simplifier le IfcLabel, vous pouvez utiliser implicit operator overloading afin de pouvoir traiter IfcLabel comme String, sans avoir Name._value à travers votre code.

S'il s'agit de plus qu'un projet éducatif, il pourrait être intéressant de voir comment les autres s'y sont attaqués. Par exemple. le Xbim project a bibliothèques C# pour lire & écrire des fichiers IFC. Pour référence est ici la mise en œuvre de IfcRoot et IfcLabel:

https://github.com/xBimTeam/XbimEssentials/blob/master/Xbim.Ifc4/Kernel/IfcRoot.cs#L58 https://github.com/xBimTeam/XbimEssentials/blob/master/Xbim.Ifc4/MeasureResource/IfcLabel.cs

Si vous avez réellement besoin de travailler avec des fichiers IFC EXPRESS Je commerce recommande à la recherche à la bibliothèque aguerri, comme XBim ou IfcOpenShell comme C'est un domaine complexe d'écrire les vôtres à partir de zéro.

+0

Salut Andy, merci beaucoup pour votre réponse! Je suis seulement un étudiant en génie civil qui écrit ma thèse de licence qui consiste à programmer un plugin d'export ifc pour Autodesk Civil 3D. Cependant, je n'avais aucune connaissance en programmation depuis deux mois. Mon AddIn est écrit en C-Sharp et j'ai donc eu besoin de créer une liaison anticipée CSharp (enfin, c'était la façon la plus simple pour moi de le faire). Mon implémentation est sûrement complètement basique et pas 100% correcte dans certaines parties, mais cela fonctionne et je peux exporter mon dessin .dwg dans un fichier .ifc maintenant et l'ouvrir avec le visualiseur de moteur ifc. – FlixFix

+0

J'ai posté un peu plus de code dans ma réponse, ce que je ne pouvais pas faire dans un commentaire. Juste pour que vous puissiez voir ma mise en œuvre. – FlixFix

0

toujours pas agréable, mais au moins un peu mieux, parce que je peux plier toute déclaration d'objet faisant paraître un peu plus clair dans Visual Studio, je l'ai fait:

IfcAlignment2DVerSegLine ifcVerSegLine = new IfcAlignment2DVerSegLine() 
{ 
    m_StartDistAlong = new IfcLengthMeasure() 
    { 
    _value = verTangent.StartStation 
    }, 
    m_HorizontalLength = new IfcPositiveLengthMeasure() 
    { 
    _value = new IfcLengthMeasure() 
    { 
     _value = verTangent.Length 
    } 
    }, 
    m_StartGradient = new IfcRatioMeasure() 
    { 
    _value = verTangent.Grade 
    }, 
    m_StartHeight = new IfcLengthMeasure() 
    { 
    _value = verTangent.StartElevation 
    } 
}; 

plis à:

IfcAlignment2DVerSegLine ifcVerSegLine = new IfcAlignment2DVerSegLine()...; 

Donc cela fonctionne pour mon but en ce moment. Sûrement si ce produit devrait devenir commercial, je devrai réécrire ma liaison anticipée.