【问题标题】:How to implement EXPRESS in CSharp the most efficient如何在 CSharp 中实现 EXPRESS 最高效
【发布时间】:2017-07-11 07:00:49
【问题描述】:

我需要创建一个基于 EXPRESS 模式的类库。 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、Name和Description都是IfcRoot类的属性。例如“Name”的属性类型是 IfcLabel,它在 EXPRESS 模式中作为 TYPE 给出,如下所示:

TYPE IfcLabel = STRING(255);
END_TYPE;

该类型是字符串类型或井字符串数组。在我的方法中,我将模式中的所有实体和模式中的所有类型都实现为 chsharp 中的类。因此我写了一个字符串阅读器,它读取模式并基于它创建实体(~800)和类型(~400)。 我的实现中的 IfcLabel 如下所示:

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

这一切都很好,但是当我想使用我的类库时,它真的很费力,因为每个属性类型都是一个类本身。这意味着我必须首先创建 IfcLabel-Class 的对象并分配 _value 属性,然后创建我的 IfcRoot-object 并将 Name-property 分配为 IfcLabel-object。 有谁知道,我如何以更智能的方式实现它? 还有一件事要补充:所有类型都需要有一个方法并从一个名为 IfcBase 的类继承,所以这仍然需要成为可能。我也不允许直接将属性类型从 IfcLabel 更改为字符串,无论如何它实际上是最后的。

【问题讨论】:

  • 我以前没有听说过这个,但从我快速阅读的内容来看,这似乎是解决我问题的可能方法。我会进一步研究它,谢谢!
  • 我不确定,但我认为express 标签不是一个好标签,因为它看起来不像这里的nodeJs 框架实现
  • 我之所以这么说是因为这是调用模式的类型。你还有什么推荐的?
  • 刚刚编辑了我的标签,希望能得到答案。为单挑干杯!

标签: c# iso ifc


【解决方案1】:

为了简化 IfcLabel,您可能需要使用 implicit operator overloading,这样您就可以将 IfcLabel 视为 String,而无需通过代码使用 Name._value。

如果这不仅仅是一个教育项目,那么可能值得看看其他人是如何解决这个问题的。例如。 Xbim project 具有用于读取和写入 IFC 文件的 C# 库。作为参考,这里是他们对 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,因为从头开始编写自己的文件是一个复杂的领域。

【讨论】:

  • 嗨,安迪,非常感谢您的回答!我只是一名土木工程专业的学生,​​正在撰写我的学士论文,其中包括为 Autodesk Civil 3D 编写 ifc 导出插件。但是,从两个月前开始,我就没有任何编程知识。我的 AddIn 是用 C-Sharp 编写的,因此我需要创建一个 CSharp 早期绑定(至少这对我来说是最简单的方法)。我的实现肯定是完全基本的,并且在某些部分不是 100% 正确,但它可以工作,我现在可以将我的 .dwg 绘图导出到 .ifc 文件并使用 ifc 引擎查看器打开它。
  • 我在我的答案中发布了更多代码,我无法在评论中这样做。只是为了让你可以看到我的实现。
【解决方案2】:

还是不好,但至少好一点,因为我可以折叠整个对象声明,使它在 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()...;

所以这对我目前的目的有效。当然,如果这个产品要商业化,我将不得不重写我的早期绑定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 2018-12-25
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2013-04-20
    相关资源
    最近更新 更多