2017-07-11 3 views
0

Ich muss eine Klassenbibliothek basierend auf einem EXPRESS-Schema erstellen. Der EXPRESS-Schema hat Typen und Entitäten, die wie folgt zusammen:So implementieren Sie EXPRESS in CSharp die effizienteste

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; 

In hier GlobalId, OwnerHistory, Name und Beschreibung sind alle Eigenschaften der Klasse IfcRoot. Der Objekttyp von zum Beispiel „Namen“ ist IfcLabel, die als TYPE im EXPRESS-Schema gegeben ist wie folgt aussehen:

TYPE IfcLabel = STRING(255); 
END_TYPE; 

Dieser Typ ist vom Typ String oder auch String-Array. In meinem Ansatz implementierte ich alle Entitäten im Schema und alle Typen im Schema als Klassen in chsharp. Deshalb habe ich einen String-Reader geschrieben, der das Schema liest und daraus die Entitäten (~ 800) und die Typen (~ 400) erstellt. IfcLabel in meiner Implementierung sieht wie folgt aus:

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

Alles ganz gut funktioniert, aber wenn ich es meine Klassenbibliothek verwenden wollen, ist wirklich mühsam aufgrund der Tatsache, dass jeder Attributtyp eine Klasse selbst ist. Bedeutung Ich muss zuerst ein Objekt der IfcLabel-Klasse erstellen und die Eigenschaft _value zuweisen und dann mein IfcRoot-Objekt erstellen und die Name-Eigenschaft als IfcLabel-Objekt zuweisen. Hat jemand eine Idee, wie ich das intelligenter umsetzen kann? Es gibt noch eine weitere Sache hinzuzufügen: Alle Typen müssen eine Methode haben und von einer Klasse namens IfcBase erben, so dass dies noch möglich sein muss. Ich bin auch nicht berechtigt, den Eigenschaftstyp von IfcLabel direkt in String zu ändern, was er eigentlich am Ende sowieso ist.

+0

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

+1

Ich habe vorher nicht darüber gehört, aber Von dem, was ich schnell gelesen habe, sieht es wie eine mögliche Lösung für mein Problem aus. Ich werde mehr darüber nachdenken, danke! – FlixFix

+0

Ich bin mir nicht sicher, aber ich denke, dass das 'express'-Tag nicht das gute ist, da es nicht wie eine NodeJs Framework-Implementierung hier – mJehanno

Antwort

1

Um die IfcLabel zu vereinfachen, können Sie implicit operator overloading verwenden, damit Sie IfcLabel als String behandeln können, ohne Name._value über Ihren Code zu haben.

Wenn dies mehr als ein Bildungsprojekt ist, könnte es sich lohnen, zu prüfen, wie andere dies angegangen sind. Z.B. Die Xbim project hat C# -Bibliotheken zu lesen & IFC-Dateien schreiben. Als Referenz ist hier die Umsetzung von IfcRoot und 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

Wenn Sie tatsächlich eine Notwendigkeit, mit IFC EXPRESS-Dateien arbeiten kommerziell kann ich empfehlen bei kampfgestählter Bibliothek suchen, wie XBim oder IfcOpenShell als Es ist eine komplexe Domäne, von Grund auf selbst zu schreiben.

+0

Hey Andy, vielen Dank für deine Antwort! Ich bin nur ein Student des Bauingenieurwesens, der meine Bachelorarbeit schreibt, die darin besteht, ein ifc-Export-Plugin für Autodesk Civil 3D zu programmieren. Vor zwei Monaten hatte ich jedoch keinerlei Programmierkenntnisse. Mein AddIn ist in C-Sharp geschrieben und deshalb musste ich eine CSharp frühe Bindung erstellen (zumindest war das der einfachste Weg für mich). Meine Implementierung ist sicherlich komplett einfach und in manchen Teilen nicht 100% korrekt, aber es funktioniert und ich kann meine .dwg Zeichnung jetzt in eine .ifc Datei exportieren und sie mit dem ifc engine viewer öffnen. – FlixFix

+0

Ich postete mehr Code in meiner Antwort, was ich in einem Kommentar nicht tun konnte. Nur damit Sie meine Implementierung sehen können. – FlixFix

0

noch nicht schön, aber zumindest ein wenig besser, weil ich die ganze Objektdeklaration falten kann es etwas klarer in Visual Studio aussehen zu lassen, ich dies tat:

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 
    } 
}; 

Falten:

IfcAlignment2DVerSegLine ifcVerSegLine = new IfcAlignment2DVerSegLine()...; 

Das funktioniert für meinen Zweck im Moment. Sollte dieses Produkt jemals kommerziell werden, muss ich meine frühe Bindung umschreiben.

Verwandte Themen