0

我需要创建一个基于 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 类的对象并分配 _value 属性,然后创建我的 IfcRoot 对象并将 Name 属性分配为 IfcLabel 对象。有谁知道,我如何以更智能的方式实现它?还有一件事要补充:所有类型都需要有一个方法并从一个名为 IfcBase 的类继承,所以这仍然需要成为可能。我也不允许直接将属性类型从 IfcLabel 更改为字符串,无论如何它实际上是最终的。

4

2 回答 2

1

为了简化 IfcLabel,您可能需要使用隐式运算符重载,这样您就可以将 IfcLabel 视为 a String,而无需Name._value通过您的代码。

如果这不仅仅是一个教育项目,那么可能值得看看其他人是如何解决这个问题的。例如,Xbim 项目有 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,因为从头开始编写自己的文件是一个复杂的领域。

于 2017-07-16T20:32:54.173 回答
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()...;

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

于 2017-07-17T05:38:33.400 回答