2017-07-11 27 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()...; 

因此,这适用于我目前的目的。当然如果这个产品应该变成商业的,我将不得不重写我早期的约束。