如何在CSharp中实现EXPRESS效率最高

时间:2017-07-11 07:00:50

标签: c# iso ifc

我需要基于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;

此类型的类型为String或well字符串数组。在我的方法中,我将模式中的所有实体和模式中的所有类型实现为chsharp中的类。因此我编写了一个字符串阅读器,它读取模式并基于此创建实体(~800)和类型(~400)。 我的实现中的ifcLabel看起来像这样:

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

一切都运行得很好,但是当我想使用我的类库时,由于每个属性类型本身都是一个类,所以它非常费力。意义我必须首先创建一个IfcLabel-Class的对象并分配_value属性,然后创建我的IfcRoot对象并将Name-property指定为IfcLabel对象。 有没有人有一个想法,我怎么能以更聪明的方式实现它? 还有一件事要补充:所有类型都需要有一个方法,并从一个名为IfcBase的类继承,因此仍然需要。我也不允许直接将属性类型从IfcLabel更改为字符串,无论如何它实际上都是最终的。

2 个答案:

答案 0 :(得分: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,因为它是一个复杂的域,可以从头开始编写自己的文件。

答案 1 :(得分:0)

仍然不好,但至少好一点,因为我可以折叠整个对象声明,使它在Visual Studio中看起来更清晰,我这样做了:

---
title: 'RMarkdown Test'
author: "Carl Parker"
date: "July 16, 2017"
output: 
  pdf_document: default
  html_document:
    keep_md: yes
--- 


# Page 1 #

\newpage

# Page 2 #


**--- END ---**

折叠为:

library( "rmarkdown" )
library( "knitr" )

render( "test-1.rmd", output_format = "all" )


# --- END ---

这对我目前的目的起作用。当然,如果这个产品应该成为商业广告,我将不得不改写我的早期装订。