2017-07-11 36 views
0

我需要基於EXPRESS模式創建類庫。快遞模式具有類型和實體看起來像以下:如何在CSharp中實現EXPRESS效率最高

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; 

在這裏GlobalId,OwnerHistory,名稱和描述是類IfcRoot的所有屬性。屬性類型例如「名稱」的是IfcLabel,它被給定爲在EXPRESS模式中的TYPE看起來像這樣:

TYPE IfcLabel = STRING(255); 
END_TYPE; 

此類型是String類型或井柱陣列。在我的方法中,我將模式中的所有實體和模式中的所有類型實現爲chsharp中的類。因此,我編寫了一個字符串閱讀器,讀取模式並基於此創建實體(〜800)和類型(〜400)。 IfcLabel在我的實現是這樣的:

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

它所有的工作完全正常,但是當我想用我的類庫實在是費力由於每個屬性的類型是類本身。這意味着我必須先創建一個IfcLabel類的對象,然後分配_value屬性,然後創建我的IfcRoot對象並將Name-property分配爲IfcLabel對象。 有沒有人有一個想法,我怎麼能以更聰明的方式實現? 還有一件事需要補充:所有類型都需要有一個方法並從一個名爲IfcBase的類繼承,所以仍然需要可能。我也不允許直接將IfcLabel中的屬性類型更改爲字符串,無論如何它實際上最終都是這樣。

+0

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

+1

我以前沒有聽說過這種情況,但從我快速閱讀它看起來像是我的問題的一個可能的解決方案。我會更深入地看,謝謝! – FlixFix

+0

我不確定它,但我認爲'express'標記不是好的,因爲它看起來不像這裏的nodeJs框架實現 – mJehanno

回答

1

爲了簡化IfcLabel,您可能需要使用implicit operator overloading,因此您可以將IfcLabel作爲String,而無需在您的代碼中使用Name._value

如果這不僅僅是一個教育項目,它可能值得看看其他人如何解決這個問題。例如。 Xbim project有C#庫讀取&寫入IFC文件。僅供參考這裏是他們的執行IfcRoot和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

如果你確實有必要與IFC Express文件工作市售我可以推薦看久經沙場的圖書館,像XBim或IfcOpenShell作爲從頭開始編寫自己的文章是一個複雜的領域。

+0

嗨安迪,非常感謝您的回答!我只是一名土木工程專業的學生,​​撰寫我的學士論文,其中包括爲Autodesk Civil 3D編寫ifc導出插件。但是,自兩個月前以來,我沒有任何編程知識。我的AddIn是用C-Sharp編寫的,因此我需要創建一個CSharp早期綁定(至少這對我來說是最簡單的方法)。我的實現肯定是完全基本的,並且在某些部分不是100%正確的,但它的工作原理和我現在可以將.dwg繪圖導出到.ifc文件並使用ifc引擎查看器打開它。 – FlixFix

+0

我在我的答案中發佈了一些更多的代碼,在評論中我無法做到。只是這樣你才能看到我的實現。 – FlixFix

0

仍然不是很好,但至少有一點好,因爲我可以摺疊整個對象的聲明使得它在Visual Studio中看起來更清楚一點,我這樣做:

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

倍至:

IfcAlignment2DVerSegLine ifcVerSegLine = new IfcAlignment2DVerSegLine()...; 

因此,這適用於我目前的目的。當然如果這個產品應該變成商業的,我將不得不重寫我早期的約束。