我需要基于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更改为字符串,无论如何它实际上都是最终的。
答案 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 ---
这对我目前的目的起作用。当然,如果这个产品应该成为商业广告,我将不得不改写我的早期装订。