# OpenCIM2
**Repository Path**: xiyan100/open-cim2
## Basic Information
- **Project Name**: OpenCIM2
- **Description**: 在OpenCIM的基础上,根据最新CIM描述规范,构建的CIM数据集读写SDK
- **Primary Language**: C++
- **License**: LGPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 3
- **Created**: 2025-05-31
- **Last Updated**: 2025-05-31
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# OpenCIM2
[](http://dky.njnu.edu.cn/)[](https://gitee.com/zhoulch/open-cim)


## XXX 修订记录 XXX
| 更新时间 | 更新类型 | 更新内容 |
| :--------: | :------: | :----------------------------------------------------------: |
| 2024.8.13 | 新增 | OpenCIM2 V1.0完成 |
| 2024.9.4 | 修订 | 修复了MetaModel迭代器的错误 |
| 2024.9.6 | 修订 | FromCIM方法中,将schema和synthetic模型调整为懒加载 |
| 2024.9.9 | 修订 | 修复了getMetaModelName的异常 |
| 2024.9.16 | 修订 | 修复了BasicInfo.CIM文件路径的错误 |
| 2024.9.18 | 更改 | 更改了CIM2OSG中IFC可视化的方法 |
| 2024.9.18 | 新增 | 增加IFC2JSON工具 |
| 2024.9.18 | 删除 | 删除了OpenCIM.Console工具 |
| 2024.9.19 | 新增 | 增加CIMCreator |
| 2024.9.24 | 修订 | 移除了CIMCreator对模型的读取操作 |
| 2024.10.9 | 新增 | 增加PyCIMKennel(Python版本的CIM交换格式读写SDK) |
| 2024.10.23 | 修订 | 取消对OSGEarth的依赖,使用Proj进行坐标转换 |
| 2024.10.23 | 新增 | 增加SchemaCreator |
| 2024.10.23 | 新增 | 提供了所有依赖库的头文件、lib文件和dll文件(基于MSVC 14.41.34120版本) |
| 2024.11.1 | 新增 | SchemaCreator中增加模式文件转换格式说明文档 |
| 2025.2.17 | 修订 | 将OSGEarth库替换为3.7版本 |
| 2025.3.19 | 修订 | Relation类中增加获取parameter、fromEntity、toEntity数量的方法 |
| 2025.3.19 | 修订 | 将Interface修改为struct |
## 1 概述
OpenCIM2,是在OpenCIM的基础上,遵循《城市信息模型通用信息描述规范》、《城市信息模型数据交换格式标准》,构建的城市信息模型交换格式读写SDK,并配套相应的测试案例和简易可视化工具。
该项目提供了OSGB、IFC数据的解析工具,城市信息模型数据交换格式的创建工具,城市信息模型数据交换格式的可视化工具。完整的展现了基于GIS/BIM/IoT数据构建一个CIM模型,以及CIM模型的三维场景与背后的数据关联关系展现的完整流程。可以供CIM模型生成、CIM平台建设的研究者与开发者借鉴。

OpenCIM2组织结构示意图(操作流见FLOW)
## 1.1 设计思想
- 以SDK为核心,围绕形成数据解析、数据生产、数据可视全流程。
- 完全遵循并实现《城市信息模型通用信息描述规范》标准。
- 充分考虑实际使用,最大限度优化性能。
- 接口简单易用。
## 1.2 定位
OpenCIM2的核心为LibCIMModel,完全遵循并实现《城市信息模型通用信息描述规范》标准,实现《城市信息模型交换格式》的读、写、查功能。
配套的CIMCreator、CIM2KG、CIM2OSG、TestSuit、KGViewer、OSGViewer、IFC2JSON等作为OpenCIM2 LibCIMModel的使用、解析示例,为了更好的展示内部逻辑的完整性,因此并不追求高效,可参考其代码充分理解LibCIMModel,并在其基础上实现定制化、完备的业务应用程序。
## 2 理论基础
详见《城市信息模型通用信息描述规范》和《城市信息模型数据交换格式标准》。
## 3 结构组织
### 3.1 3rdlibs
OpenCIM2第三方依赖库包括OSG、OSGEarth、Proj(需要Proj.db文件)、OCC、IFC++、Xlnt、nlohmann。
- 其中nlohmann为头文件库,无需编译;
- Proj库需要Proj.db文件,该文件与编译器无关,已提供,可直接使用;
- **所有的库都已经提供编译好的lib和dll,编译器采用MSVC 14.41.34120版本,若使用OpenCIM2提供的库文件,则编译器版本不得低于MSVC 14.41.34120,若用户想在其他编译器版本下运行,则需要自行编译,下方提供库地址**:
IFC++:[ifcquery/ifcplusplus: IfcPlusPlus is an open source C++ class model, as well as a reader and writer for IFC files in STEP format. Features: Easy and efficient memory management using smart pointers. Parallel reader for very fast parsing on multi-core CPU's. Additionally, there's a simple IFC viewer application, using Qt and OpenSceneGraph. It can be used as starting point for all kinds of applications around the open building model standard IFC. (github.com)](https://github.com/ifcquery/ifcplusplus)
XLNT:[tfussell/xlnt: :bar_chart: Cross-platform user-friendly xlsx library for C++11+ (github.com)](https://github.com/tfussell/xlnt)
OSG:[GitHub - openscenegraph/OpenSceneGraph: OpenSceneGraph git repository](https://github.com/openscenegraph/OpenSceneGraph)
Proj:[GitHub - OSGeo/PROJ: PROJ - Cartographic Projections and Coordinate Transformations Library](https://github.com/OSGeo/PROJ)
OCC:[GitHub - Open-Cascade-SAS/OCCT: Open CASCADE Technology (OCCT) is an open-source software development platform for 3D CAD, CAM, CAE.](https://github.com/Open-Cascade-SAS/OCCT)
### 3.2 OpenCIM
#### 3.2.1 CIM2KG
CIM交换格式知识图谱可视化工具,将CIM交换格式转换为GraphVis可读取格式。
#### 3.2.2 CIM2OSG
CIM交换格式三维可视化工具,将CIM交换格式转换为OSGB格式或直接可视化。
#### 3.2.3 LibCIMKernel
CIM交换格式读写SDK
##### 3.2.3.1 Auxiliary
辅助类,在CIM交换格式全局中使用,但与CIM交换格式非强关联的类,包括:
- DataIterator[数据迭代器]
- Date[时间生成器]
- UniqueID[全局唯一ID生成器]
##### 3.2.3.2 Base
基础类,在CIM交换格式全局中使用,与CIM交换格式强相关的类,包括:
- AbstractElemnt[抽象要素类]——CIM通用信息描述规范中所有要素(元模型、元元模型)的共性抽象。
- CIMFileHandle[CIM文件句柄类]——CIM交换格式文件(Schema、Synthetic)的通用操作。
- ExternalData[外部数据类]——CIM交换格式引用外部数据的操作集合。
##### 3.2.3.3 Core
核心类,CIM交换格式的最核心类,包括:
- CIMDataSetImpl[CIM交换格式接口实现类]——CIM交换格式主文件的读写接口的具体功能实现。
- CIMMetaMetaModelImpl[CIM元元模型接口实现类]——CIM元元模型读写接口的具体功能实现。
- CIMMetaModelImpl[CIM元模型接口实现类]——CIM元模型读写接口的具体功能实现。
##### 3.2.3.4 Include
包含头文件,使用LibCIMKernel库所需用到的所有头文件(非所有头文件,部分无需使用到的头文件,放在CPP同级目录)。
文件组织结构与LibCIMKernel组织结构一致。
##### 3.2.3.5 MetaMetaModel
元元模型要素,包括(理论详见《城市信息模型通用信息描述规范》):
- Axiom[公理]
- Concept[概念]
##### 3.2.3.6 MetaModel
元模型要素,包括(理论详见《城市信息模型通用信息描述规范》):
- Entity[实体]
- Evolution[概念]
- Geometry[几何]
- MetaModelElemnt[元模型要素]——CIM通用信息描述规范中元模型抽象基类。
- Property[属性]
- Relation[关系]
- Time[时间]
- Transform[变换]
#### 3.2.4 CIMCreator
通过中间件(Excel)生成CIM数据集的工具,暨BIM、GIS、环境场数据集与CIM协同交互示例。
#### 3.2.5 PyCIMKernel
CIM交换格式读写SDK(Python版本)。使用SWIG将C++版本的LibCIMKernel封装成PyCIMKernelPython模块。
#### 3.2.6 SchemaCreator
通过中间件(Excel)生成CIM数据集模式文件的工具。
### 3.3 Tool
CIM交换格式可视化所需工具,与CIM交换格式非强关联。
#### 3.3.1 KGViewer
知识图谱可视化工具。
#### 3.3.2 OSGViewer
OSGB可视化工具。
#### 3.3.3 IFC2JSON
将IFC中构件基本信息解析为JSON的工具。
#### 3.3.4 OSG2JSON
将OSGB中的构件基本信息解析为JSON的工具。
### 3.4 TestSuit
- LibCIMKernel SDK接口测试与使用示例,分为使用LibCIMKernel手动创建(Manual)和使用Creator流式创建(Flow)。
- PyCIMKernel SDK接口(Python版本)测试与使用示例。使用PyCIMKernel模块手动创建(PyExample)
## 4 类说明
### 4.1 CIM2KG
#### 4.1.1 CIM2KG
将CIM交换格式转换为GraphVis支持的知识图谱JSON格式。
##### 4.1.1.1 属性
- _cimDataset——储存读取到的CIM交换格式主文件。
- _json——储存转换后的JSON数据。
- _colors——定义知识图谱中不同要素的颜色。
##### 4.1.1.2 行为
- CIM2KG——构造函数,将CIM交换格式加载进内存中,需传入CIM交换格式的BasicInfo.CIM文件路径,。
- parseMetaMetaModel——解析CIM交换格式中的元元模型,并转换为JSON,自动写入_json字段。
- parseMetaModel——解析CIM交换格式中的元模型,并转换为JSON,自动写入_json字段,需传入元模型的名称与待转换实体数量,待转换实体数量默认为全部。
- show——调用parseMetaMetaModel和parseMetaModel函数,并将转换后的_json写出到磁盘,储存为temp.json。
### 4.2 CIM2OSG
#### 4.2.1 CIM2OSG
CIM交换格式三维可视化类,将CIM交换格式转换为OSGB格式或直接可视化。
##### 4.2.1.1 属性
- _cimDatasetPath——CIM交换格式主文件路径。
- _cimDataset——储存读取到的CIM交换格式主文件。
- _viewer——osgViewer实例对象。
- _root——可视化场景数据根节点。
- _plugins——储存解析非OSGB数据的外部插件类。
- _isLocal——场景是否为局部坐标,从CIM交换格式中读取。
- _epsg——场景投影坐标系(若非局部坐标),从CIM交换格式中读取。
- _opx——场景局部坐标原点x(若非投影坐标),从CIM交换格式中读取。
- _opy——场景局部坐标原点y(若非投影坐标),从CIM交换格式中读取。
- _opz——场景局部坐标原点z(若非投影坐标),从CIM交换格式中读取。
- _orx——场景局部坐标x轴旋转角度(若非投影坐标),从CIM交换格式中读取。
- _ory——场景局部坐标y轴旋转角度(若非投影坐标),从CIM交换格式中读取。
- _orz——场景局部坐标z轴旋转角度(若非投影坐标),从CIM交换格式中读取。
- _os——场景局部坐标缩放比例(若非投影坐标),从CIM交换格式中读取。
- _colorIndex——记录当前的颜色索引。
- _colors——颜色数组,因参数化模型无颜色,为区分不同的参数化模型,因此使用颜色数组对不同的参数模型进行上色。参数模型按照读取顺序从颜色数组中循环取色。
##### 4.2.1.2 行为
- init——初始化osg相关对象。
- initPlugins——初始化数据读取插件。
- parse——解析元模型,将元模型的三维模型储存至_root中。需传入元模型名。
- description2Step——解析Step型内嵌几何。
- description2Obj——解析OBJP型内嵌几何。
- transformNode——根据CIM交换格式Transform对模型进行变换。
- CIMViewer——构造函数,解析CIM交换格式,调用init和initPlugins,初始化osg相关对象和数据读取插件。
- show——调用parse,解析元模型,并运行osgviewer。
- save——调用parse,解析元模型,并将osgNode储存为本地osgb。
#### 4.2.2 Plugin
CIM2OSG解析非OSGB类型数据的插件模板。
##### 行为
- modelType——当前插件所解析的外部数据类型。
- comments——插件注释(注意事项)。
- version——插件版本。
- run——插件运行入口,传入外部数据的文件夹路径和外部数据对象,插件内部实现解析,并返回osgNode对象。
### 4.3 LibCIMKernel
#### 4.3.1 IDataIterator
数据迭代器,虚基类。
##### 4.3.1.1 方法
- current——返回当前元素的指针。
- hasNext——判断是否还有下一个元素,返回bool值。
- next——迭代器指针后移一位。
#### 4.3.2 MapIteratorImpl
继承IDataIterator。
数据迭代器的Map类型容器实现。
#### 4.3.3 ListIteratorImpl
继承IDataIterator。
数据迭代器的List类型容器实现。
#### 4.3.4 Date
获取当前日期类,单例模式。
##### 4.3.4.1 方法
- currentDate——静态方法,获取当前时间,返回字符串。
#### 4.3.5 UniqueID
获取全球唯一ID,单例模式。
##### 4.3.5.1 方法
- getUUID——静态方法,获取全球唯一ID。
#### 4.3.6 AbstractElement
##### 4.3.6.1 属性
- _uuid——元素唯一标识符。
- _comments——元素注释。
- _isEmbedded——元素是否为内嵌型。
##### 4.3.6.2 方法
属性的getter和setter方法,不再赘述。
#### 4.3.7 CIMFileHandle
##### 4.3.7.1 属性
- _fileName——文件名。
- _filePath——文件所在路径。
- *_includeFiles——外部嵌套文件。CIM交换格式支持交换格式中嵌套外部的交换格式,如B交换格式嵌套A交换格式,则B交换格式包含B交换格式的内容和A交换格式的所有内容。Schema只能嵌套Schema,Synthetic只能嵌套Synthetic。*
##### 4.3.7.2 方法
属性的getter和setter方法,不再赘述。
#### 4.3.8 ExternalData
继承AbstractElement。
**ExternalData中会存放Transform,本Transform直接用于对外部数据进行变换,与Entity中的Transform无关,无需相乘。**
##### 4.3.8.1 属性
- _url——外部数据路径。
- _externalDataType——外部数据类型。支持OSGB、OBJ、IFC、SHP、TIFF五种类型。
- _transform——外部数据的变换列表。
- _transformIDs——用于反序列化JSON时获取交换格式中的transform,与交换格式无关,用户无法访问。
##### 4.3.8.2 方法
属性的getter和setter方法,不再赘述。
#### 4.3.9 ICIMDataSet
交换格式主文件CRUD接口。
##### 4.3.9.1 方法
- 名称、作者、机构、日期、md5码、笛卡尔坐标系原点、EPSG、中央经线、空间系统类型、地区编码、CIM模式信息、CIM综合模型的CURD,不再赘述。
#### 4.3.10 ICIMMetaMetaModel
继承自CIMFileHandle类,CIM交换格式元元模型CRUD接口。
##### 4.3.10.1 方法
- 公理、概念、公理依据CRUD,不再赘述。
#### 4.3.11 ICIMMetaModel
继承自CIMFileHandle类,CIM交换格式元模型CRUD接口。
##### 4.3.11.1 方法
- 几何、变换、时间、属性、实体、关系、演化CRUD,不再赘述。
#### 4.3.12 CIMDatasetImpl
继承ICIMDataSet。
交换格式CURD接口的实现类。
##### 4.3.12.1 属性
- _filePath——文件路径。
- _name——交换格式名称。
- _author——交换格式作者。
- _institution——交换格式作者单位。
- _date——交换格式创建时间,无需填写,创建交换格式时自动生成。
- _md5——交换格式校验码。
- _spatialSystemType——空间系统类型,包含投影坐标、大地坐标和笛卡尔坐标系。
- _cartesianOrigin——笛卡尔坐标系原点,当空间系统类型为笛卡尔坐标系时使用。
- _epsg——坐标系定义,当空间系统类型为非笛卡尔坐标系时使用。
- _centerMridian——中央经线,配合坐标系定义使用。
- _areaNumber——CIM交换格式描述区域的地区编号。
- _metaMetaModel——CIM交换格式的元元模型实例。
- _metaModels——CIM交换格式的元模型实例集合。
- _expressionModels——CIM交换格式的表达模型实例集合。
##### 4.3.12.2 方法
- CIM交换格式接口的方法实现,不再赘述。
#### 4.3.13 CIMMetaMetaModelImpl
继承ICIMMetaMetaModel。
CIM交换格式元元模型CRUD接口的实现类。
##### 4.3.13.1 属性
- _axioms——元元模型实例中的公理实例集合。
- _concepts——元元模型实例中的概念实例集合。
- _basisSet——公理依据集合。
##### 4.3.13.2 方法
- CIM交换格式元元模型接口的方法实现,不再赘述。
#### 4.3.14 CIMMetaModelImpl
继承ICIMMetaModel。
##### 4.3.14.1 属性
- _geometryMode——几何模式,定义CIM交换格式元模型实例中的几何表达形式,包括纯外链型和纯内嵌型。
- _geometries——元模型实例中的几何实例集合。
- _transfroms——元模型实例中的变换实例集合。
- _times——元模型实例中的时间实例集合。
- _properties——元模型实例中的属性实例集合。
- _entities——元模型实例中的实体实例集合。
- _relations——元模型实例中的关系实例集合。
- _evolutions——元模型实例中的演化实例集合。
- _externalDta——采用纯外链几何表达的元模型实例中的所有外链交换格式合。
##### 4.3.14.2 方法
- CIM交换格式元模型接口的方法实现,不再赘述。
#### 4.3.15 Axiom
继承AbstractElement。
##### 4.3.15.1 属性
- _axiomType——公理类型,分为子类、父类、组成、部分、被影响、影响、被依附、依附,共计八种。
- _basis——公理依据,这里储存的是公理依据的序号,需要根据序号,在CIM交换格式元元模型中查询公理依据的具体信息。
- _toConcepts——公理约束的概念集合。
- _toConceptsID——用于反序列化JSON时获取交换格式中的concept,与交换格式无关,用户无法访问。
##### 4.3.15.2 方法
- 属性的getter和setter方法,不再赘述。
#### 4.3.16 Concept
继承AbstractElement。
##### 4.3.16.1 属性
- _conceptType——概念类型,分为实体类概念、属性类概念和关系类概念。
- _conceptCode——概念代码,可以区分概念分类、颗粒的含语义字符串。
- _conceptName——概念名,即概念的定义。
- _toAxioms——概念包含的公理,即概念含有的约束。
- _toAxiomsID——用于反序列化JSON时获取交换格式中的axiom,与交换格式无关,用户无法访问。
##### 4.3.16.2 方法
- 属性的getter和setter方法,不再赘述。
#### 4.3.17 MetaModelElement
继承AbstractElement。
##### 4.3.17.1 属性
- _metaModelElementType——元模型要素类型,包含实体、几何、变换、时间、属性、关系和演化。
- _belongConcepts——元模型要素实例映射概念。
- _belongConceptIDs——用于反序列化JSON时获取交换格式中的concept,与交换格式无关,用户无法访问。
##### 4.3.17.2 方法
- 属性的getter和setter方法,不再赘述。
#### 4.3.18 Entity
继承MetaModelElement。
*实体仅有一个时间,但是可以有多个几何、变换和属性,其中几何列表与变换列表一一对应,即存在n个几何对象,必须存在n个变换对象,若m位置的几何不存在变换,可以在m位置的变换设置为nullptr。*
**Entity中存放有Transform,本Transform与Entity中Geomtry调用的ExternalData中Transform无关,而是用于结合Geometry中的X,Y,Z直接对模型实现定位。**
##### 4.3.18.1 属性
- _entityName——实体名。
- _entityCode——由地区编码、分类码、颗粒码和流水码组成的实体编码。
- _geometries——实体包含几何实例集合。
- _geometryIDS——用于反序列化JSON时获取交换格式中的geometry,与交换格式无关,用户无法访问。
- _transform——实体包含变换实例集合。
- _transformIDs——用于反序列化JSON时获取交换格式中的transform,与交换格式无关,用户无法访问。
- _time——实体的时间实例。
- _timeID——用于反序列化JSON时获取交换格式中的time,与交换格式无关,用户无法访问。
- _properties——实体包含的属性实例集合。
- _propertyIDs——用于反序列化JSON时获取交换格式中的property,与交换格式无关,用户无法访问。
##### 4.3.18.2 方法
- *addGeometry——向实体内部添加几何,该方法具有两个重载。重载1直接传入已经创建好的几何实例,则实体采用引用的方式包含该几何,即在交换格式中几何的具体信息储存在几何表中,该实体仅储存几何的ID、注释、嵌入方式等必要信息,不储存几何的具体信息。重载2传入几何的全部信息,则实体采用嵌入的方式包含该几何,即在几何的全部信息仅在交换格式中的对应实体储存,在几何表中不储存,且该几何实例无ID。*
- addTransform——向实体内部添加变换,该方法与addGeometry相同,具备两个重载,不再赘述。
- addProperty——向实体内部添加属性,该方法与addGeometry相同,具备两个重载,不再赘述。
- setTime——设置实体时间,该方法与addGeometry相同,具备两个重载,不再赘述。
- 其余方法为属性的getter和setter方法,不再赘述。
#### 4.3.19 Geometry
继承MetaModelElement。
##### 4.3.19.1 属性
- _geometryType——几何类型,包含外链,内嵌网格表达和内嵌参数表达。
- _radius——几何模型的半径,由几何模型自身坐标系定义,不考虑交换格式坐标系统和变换。
- _centerX——几何模型的中心点X,由几何模型自身坐标系定义,不考虑交换格式坐标系统和变换。
- _centerY——几何模型的中心点Y,由几何模型自身坐标系定义,不考虑交换格式坐标系统和变换。
- _centerZ——几何模型的中心点Z,由几何模型自身坐标系定义,不考虑交换格式坐标系统和变换。
- _positiveDirection——几何模型的朝向,由几何模型自身坐标系定义,不考虑交换格式坐标系统和变换。
- _description——几何描述。
##### 4.3.19.2 方法
- 属性的getter和setter方法,不再赘述。
##### 4.3.19.3 注意
- 当几何类型为外链数据时,description写入外链数据的url。如:“0e35b0781cff43578a7b6aeaa05697b9”为外链数据ID,description字段为“0e35b0781cff43578a7b6aeaa05697b9”。
- **当几何类型为外链且外链至数据内部的某一子项时,使用/作为地址分割。如:“0e35b0781cff43578a7b6aeaa05697b9”为外链数据ID,当前几何是外链数据中的node1,则description为“0e35b0781cff43578a7b6aeaa05697b9/node1”。**
- **当几何类型为外链且外链多个内部子项时,每个构件间使用“;”分割。如“0e35b0781cff43578a7b6aeaa05697b9”为外链数据ID,当前几何是外链数据中的node1、node2、node3的组合,则description为“0e35b0781cff43578a7b6aeaa05697b9/node1;0e35b0781cff43578a7b6aeaa05697b9/node2;0e35b0781cff43578a7b6aeaa05697b9/node3”**。
- 当几何类型为内嵌网格表达和内嵌参数表达时按objp和step格式写入description。
#### 4.3.20 Transform
继承MetaModelElement。
世界坐标系的原点与单位由交换格式坐标系统定义。
**模型缩放和旋转后模型原点不变。**
##### 4.3.20.1 属性
- _panX——X方向偏移,世界坐标系。
- _panY——Y方向偏移,世界坐标系。
- _panZ——Z方向偏移,世界坐标系。
- _rotateX——沿X轴旋转角度。
- _rotateY——沿Y轴旋转角度。
- _rotateZ——沿Z轴旋转角度。
- _sacleX——X方向缩放。
- _scaleY——Y方向缩放。
- _scaleZ——Z方向缩放。
##### 4.3.20.2 方法
- 属性的getter和setter方法,不再赘述。
#### 4.3.21 Time
继承MetaModelElement。
*时间系统默认为UTC北京时间,采用时间戳表达。*
当时间1与时间2相同时,表达为时间点。
当时间1与时间2不同时,表达为时间段。
时间1必然小于时间2。
##### 4.3.21.1 属性
- _t0——时间1。
- _t1——时间2。
##### 4.3.21.2 方法
- 属性的getter和setter方法,不再赘述。
#### 4.3.22 Property
继承MetaModelElement。
##### 4.3.22.1 属性
- _propertyType——属性类型,包含外链式和内嵌式。
- _fieldType——字段类型,包含字符串,整数,长整数,浮点数,双精度浮点数,布尔值,字符串列表,整数列表,长整数列表,浮点数列表,双精度浮点数列表,布尔值列表,复合型(列表值,中间使用“;”号隔开)。
- _value——属性值。
##### 4.3.22.2 方法
- 属性的getter和setter方法,不再赘述。
#### 4.3.23 Relation
继承MetaModelElement。
关系类型为有向多对多。
##### 4.3.23.1 属性
- _parameters——关系参数,如“相距”关系,相距距离5米,5即为参数。
- _description——关系描述,用自然语言和占位符进行表达。%P[n]%表达第n个参数,%F[n]%表达第n个从实体,%T[n]%表达第n个到实体。示例:"%[F0]%位于%[T0]%"。
- _fromEntities——从实体集合。
- _fromEntityIDs——用于反序列化JSON时获取交换格式中的entity,与交换格式无关,用户无法访问。
- _toEntities——到实体集合。
- _toEntityIDs——用于反序列化JSON时获取交换格式中的entity,与交换格式无关,用户无法访问。
##### 4.3.23.2 方法
- toString——根据关系的参数、从实体、到实体和关系的描述,自动将占位符替换为实际语义,输出转换后的关系描述。
- 其余方法为属性的getter和setter方法,不再赘述。
#### 4.3.24 Evolution
继承MetaModelElement。
##### 4.3.24.1 属性
- _fromEntity——从实体。
- _fromEntityIDs——用于反序列化JSON时获取交换格式中的entity,与交换格式无关,用户无法访问。
- _toEntity——到实体。
- _toEntityIDs——用于反序列化JSON时获取交换格式中的entity,与交换格式无关,用户无法访问。
##### 4.3.24.2 方法
- 属性的getter和setter方法,不再赘述。
### 4.4 TestSuit
#### 4.4.1 CIMDatasetDemo
LibCIMKernel内嵌几何、多重变换、演化过程、空间系统等信息创建及设置的示例。
##### 4.4.1.1 属性
- m_pCIMDataset——创建的CIM交换格式主文件。
- m_pCIMMetaMetaModel——创建的元元模型。
- m_buildingGeometry——内嵌建筑几何Description。
- m_carGeometry——内嵌汽车几何Description。
- m_householdGeometry——内嵌分层分户几何Description。
- m_terrainGeometry——内嵌地形几何Description。
- m_roadGeometry——内嵌道路几何Description。
- m_terrainImageGeometry——内嵌地形影像几何Description。
- m_treeGeometry——内嵌树几何Description。
- m_enviromentGeometry——内嵌环境场几何Description。
##### 4.4.1.2 方法
- readTxt——从txt中读取内嵌几何的文本信息。
- initInnerGeo——初始化内嵌几何变量。
- CIMDatasetDemo——构造函数,初始化CIM交换格式。
- schema——创建CIM交换格式Schema。
- synthetic——创建CIM交换格式Synthetic。
- output——输出CIM交换格式。
### 4.5 CIMCreator
通过中间件(Excel)生成CIM数据集的工具。
CIMCreator类结构简单,主要为实体表、属性表、关系表、几何表等读取函数,和LibCIMKernal创建对象,在此不再赘述,详见源码注释。
## 5 快速使用
### 5.1 CIM2KG
#### 5.1.1 编译
- CIM2KG依赖LibCIMKernel和nlohmann库。
- nlohmann库已在3rdlibs和CMakeList中配置完成。
- *需先编译LibCIMKernel,再编译使用CIM2KG。*
#### 5.1.2 运行
1. 编译完成后在编译输出目录会生成CIM2KG.exe。
2. 将LibCIMKernel.dll拷贝至CIM2KG.exe运行目录。
3. 控制台CD到CIM2KG.exe目录。
4. *控制台输入:**CIM2KG.exe [CIM交换格式BasicInfo.CIM路径] [综合模型名称] [模式信息要素限制数量(可选)] [综合模型要素限制数量(可选)]**。例如:CIM2KG.exe D:\Building_osgb\BasicInfo.CIM CIM3 100 100。*
5. 程序会在运行目录生成temp.json。
6. 使用Tool中的KGViewer打开temp.json即可查看CIM交换格式对应知识图谱。
#### 5.1.3 注意事项
- 限制数量设置为-1时即为无限制。
- 要素数量过多会导致KGViewer卡顿。
#### 5.1.4 结果展示

### 5.2 CIM2OSG
#### 5.2.1 编译
- CIM2OSG依赖LibCIMKernel、OSG、Proj和OCC部分库。
- OSG、Proj和OCC部分库采用FindPackage形式,需用户自行配置。
- 用户可自行替换OSG库,本案例使用OSG 3.6.5,使用别的版本的OSG库可能会导致报错。
- *需先编译LibCIMKernel,再编译使用CIM2OSG。*
#### 5.2.2 运行
1. 编译完成后在编译输出目录会生成CIM2OSG.exe。
2. 将OSG、Proj和OCC部分库相关dll拷贝至CIM2OSG.exe目录。
3. 将LibCIMKernel.dll和Proj.db拷贝至CIM2OSG.exe运行目录。
4. ***在CIM2OSG.exe目录下新建文件夹“temp”和"Plugin"。***
5. ***将CIM2OSG项目中的PluginIFC.dll拷贝至Plugin文件夹中。***
6. 控制台CD到CIM2OSG.exe目录。
7. 控制台输入:***CIM2OSG.exe [CIM交换格式BasicInfo.CIM路径] [综合模型名称] [--Show(可选)]**。 例如:CIM2KG.exe D:\Building_osgb\BasicInfo.CIM CIM3 --Show。*
8. 若未输入--Show,程序会在运行目录生成以综合模型名称命名的OSGB文件。若输入--Show,程序弹出窗口,展示CIM交换格式综合模型三维场景。
9. 生成的OSGB文件可用Tool中的OSGViewer查看。
#### 5.2.3 注意事项
- 用户可根据CIM2OSG插件模板生成自定义格式插件,使其支持更多数据格式。
- 生成自定义格式的插件放入程序运行目录下Plugin文件夹中即可。
#### 5.2.4 结果展示

### 5.3 LibCIMKernel
#### 5.3.1 编译
- LibCIMKernel依赖nlohmann库。
- nlohmann库已在3rdlibs和CMakeList中配置完成。
#### 5.3.2 运行
- 本程序为dll文件无需运行。
#### 5.3.3 注意事项
- LibCIMKernel使用案例详见TestSuit。
### 5.4 PyCIMKernel
#### 5.4.1 编译
- PyCIMKernel为LibCIMKernel库的python封装版本。
- 编译PyCIMKernel时要在文件 *LibCIMKernel/Include/Auxiliary/AuxiliaryDefine.hpp* 的19行增加一条宏定义语句 #define BUILDING_PYD
#### 5.4.2 运行
- 本程序为dll文件无需运行。
#### 5.4.3 注意事项
- PyCIMKernel使用案例详见TestSuit。
### 5.5 TestSuit
#### 5.5.1 编译
- TestSuit依赖LibCIMKernel和PyCIMKernel库。
- *需先编译LibCIMKernel和PyCIMKernel,再编译使用TestSuit。*
#### 5.5.2 运行
1. 编译完成后在编译输出目录会生成TestSuit.exe。
2. 将LibCIMKernel.dll拷贝至TestSuit.exe运行目录。
3. ***将TestSuit项目中的Assets文件夹拷贝至TestSuit.exe运行目录。***
4. 直接运行TestSuit.exe。
5. ***在程序运行目录会生成CIMDatasetDemo文件夹和Synthetic_Geometry.json文件。***
6. ***将Synthetic_Geometry.json文件拷贝至CIMDatasetDemo\SyntheticModel\Synthetic文件夹中。***
7. ***在CIMDatasetDemo\SyntheticModel\Synthetic中新建“texture”文件夹。(内嵌几何若使用到外部纹理,必须将纹理拷贝至“texture”文件夹中)***
8. ***将TestSuit项目中的Assets文件中的纹理(old road texture.dds、terriain.png)拷贝至texture文件夹中。***
9. CIMDatasetDemo可以使用CIM2KG或CIM2OSG进行可视化。
#### 5.5.3 注意事项
- TestSuit表达是内嵌几何。
- 因为在synthetic.json中引用的外部json路径为“./Synthetic_Geometry.json”,所以需要将Synthetic_Geometry.json拷贝至CIMDatasetDemo\SyntheticModel\Synthetic文件夹中,用户可以自行修改外部引用json路径。
### 5.6 CIMCreator
#### 5.6.1 编译
- CIMCreator依赖LibCIMKernel、xlnt库。
- xlnt库已在3rdlibs和CMakeList中配置完成。
- *需先编译LibCIMKernel,再编译使用CIMCreator。*
#### 5.6.2 运行
1. 编译完成后在编译输出目录会生成CIMCreator.exe。
2. 将LibCIMKernel.dll和xlnt.dll拷贝至CIMCreator.exe运行目录。
3. 控制台CD到CIMCreator.exe目录。
4. 控制台输入:程序有批量生成整个数据集和生成数据集中单个综合模型两中运行模式
- 批量生成模式:CIMCreator.exe --batchCreator --folderPath [数据文件路径] 。例如:CIMCreator.exe --batchCreator --folderPath D:\Assets。。
- 生成单个模型模式:CIMCreator.exe --newDataSet(可选) --cimInfoExcelPath [数据集BasicInfo.xlsx文件路径](可选)
--datasetPath [数据集路径] --standardPath [模式文件路径] --syntheticName [综合模型名称] --syntheticExcelPath [综合模型Excel文件路径] --add(可选)。
例如:CIMCreator.exe --newDataSet --cimInfoExcelPath C:\Users\HugeRabbit\Desktop\BasicInfo.xlsx --datasetPath D:\cimDataSet\testDataSet11
--standardPath D:\Schema\new\CIMStandard.json --syntheticName CIM2 --syntheticExcelPath D:\Schema\new\Excel\CIM2.xlsx --add*
[注1]--newDataSet和--cimInfoExcelPath必须同时存在,表示新建数据集,若数据集已创建,则可以省略这两个参数。
[注1]--Add参数表示向已有的综合模型中添加新的实体,若综合模型未创建,则--add参数省略,表示创建新的综合模型。
5. 生成的数据集可用CIM2OSG程序查看。
### 5.7 SchemaCreator
#### 5.7.1 编译
- SchemaCreator依赖LibCIMKernel、xlnt库。
- xlnt库已在3rdlibs和CMakeList中配置完成。
- *需先编译LibCIMKernel,再编译使用SchemaCreator。*
#### 5.7.2 运行
1. 编译完成后在编译输出目录会生成SchemaCreator.exe。
2. 将LibCIMKernel.dll和xlnt.dll拷贝至SchemaCreator.exe运行目录。
3. 控制台CD到SchemaCreator.exe目录。
4. 控制台输入:SchemaCreator.exe [输入xls文件路径] [输出模式文件(.json)的文件夹路径]。例:SchemaCreator.exe D:\Schema\old\0408_CIM1-6_schema.xlsx D:\Schema\convert
#### 5.7.3 结果展示

### 5.8 IFC2JSON
#### 5.8.1 编译
- IFC2JSON依赖IFC++库。
- IFC++库已在3rdlibs和CMakeList中配置完成。
#### 5.8.2 运行
1. 编译完成后在编译输出目录会生成IFC2JSON.exe
2. 控制台CD到IFC2JSON.exe目录
3. 控制台输入:IFC2JSON.exe [输入IFC路径] [输出JSON路径]。例:IFC2JSON.exe C:/test.ifc C:/test.json
4. 即生成解析后JSON。
#### 5.8.3 结果展示

## 6 对比OpenCIM V1.0
### 6.1 内容变化
1. BasicInfo.CIM中键不再使用中文,改为英文。与Schema和Synthetic文件保持一致。
2. **在所有文件中增加“TypeEnumDict”字段。用于表明文件中的枚举字段类型,如"SpatialSystemType": 1。**
3. **空间系统改为三类,分别为笛卡尔坐标系、投影坐标系和大地坐标系。新增笛卡尔坐标系,可以将整个CIM数据集不放置于真实地理位置中。**
4. Schema和Synthetic中取消了“Header”字段。Schema和Synthetic的基本信息统一在BasicInfo.CIM中储存。
5. Schema中增加了“BasisSet”字段。用于储存公理依据,公理依据的表达更加清晰。
6. “CorrespondingConcepts”改名为“ToConcepts”。指向更加清晰。
7. “Axioms”改名为“ToAxioms”。指向更加清晰。
8. “IncludeFile”中只需写明引用文件路径,而无需指明引用文件类型。Schema只能引用Schema,Synthetic只能引用Synthetic,无需指明。
9. **Transform增加“ParentTransform”字段。变换可以嵌套变换,方便整体变换,解决了先前变换无意义的问题。**
10. 几何增加了“CenterX”、“CenterY”、“CenterZ”、“PositiveDirection”、“Radius”字段,记录几何的最基本信息。在多数时候,实体定位、切分瓦片等功能仅需知道几何的中心点、半径等信息,而无需读取整个几何文件再进行计算。
11. **几何类型更改为“LINK”、“OBJP”、“STEP”,即外链型、网格表达(采用OBJ标准)、参数化表达(采用STEP标准)。**
12. 属性将“Source”字段修改为“PropertyType”字段。逻辑更加通顺。
### 6.2 结构变化
1. **在Synthetic中取消了空间系统、时间系统元素。空间系统移至BasicInfo.CIM中,即全CIM数据集的模型需统一空间系统。时间系统统一使用UTC北京时间。**
2. BasicInfo.CIM中“ExpressionModel”字段改为数组类型。解决表达模型可能有多个的问题。
3. “Id”字段进行拆分,“Code”修改为“Id”,“Comments”独立表达。逻辑更加通顺,注释与唯一标识无需绑定。
4. 不再区分“组件”、“系统”、“实体”,将几何、位置、属性、时间、实体、关系、演化全部用独立列表储存。增加读取和查询效率。
5. **几何、位置、属性、时间可以内嵌入实体。当几何、位置、属性、时间不存在复用时,可以直接写在实体内部。文件结构更加清晰,读取效率更高,减少了无效查找。**
6. **几何的“Description”字段,修改为数组型。便于存放海量字符。**
7. **外部数据中增加“Transform”。用于读取外部数据时直接通过外部数据+变换进行可视化。**
### 6.3 规范变化
1. **Synthetic中ExternalData与Entity完全分离。实体信息储存在Entity列表中,包括实体的几何、位置、属性、时间;实体可视化信息储存在ExternalData列表中(非内嵌几何时)。可视化时只需读取ExternalData列表,取出模型路径和变换,即可可视化,无需读取实体信息。在实体查询时,无需读取ExternalData,实体的基本几何信息已经写入几何中。**
2. **模型在可视化时,不再首先将模型归零,再进行放置,而是直接对模型进行变换,即Transform不再表达模型的位置,而是表达模型的变换。逻辑更加正确,且减少了储存数据量。**
### 6.4 接口变化
1. 各要素中储存的其他要素,可以直接通过要素接口访问,而无需首先获取Id,再去列表中查询。增加了读取效率。
## 7 Q&A
### 7.1 哪些地方会出现Transform?
在entity中会储存一个或多个transform,这个transform与entity中储存的一个或多个geometry组合可以形成location从而实现实体的定位。
在externaldata中也会储存一个或多个transform,externldata通过transform放置在正确位置上。
### 7.2 两个Transform的关系?
entity中的transform与externaldata中的transform无关,各自独立,但如果两者中的transform值相同,为减少储存,会将transform储存在transform列表中,两者会通过id调用同一个transform,仅为减少储存,并不代表需要相乘。
### 7.3 为什么要两个Transform?
- 如果仅在entity中储存transform
在externaldata中如果不储存transform,那无法直接通过读取external进行可视化。
例如:对于深圳100万建筑的osgb,所有建筑相对位置正确,只需要一个transform,就可以将数据可视化,如果不在externaldata中储存transform,则需要读取100万个实体逐一可视化,会极大降低效率。
- 如果仅在externaldata中储存transform
对于单文件多模型的情况,entity将无法确定transform。
例如:对于种植100颗树模型,需要一个树osgb和100个transform。这100个transform都会写入同一个externaldata中。如果entity中没有transfrom,通过entity的geometry找到对应的externaldata,将无法确实当前的entity的transform对应externaldata中100个transfrom中的哪一个。
## 8 贡献名单
开发单位:南京师范大学地理科学学院
项目负责人:周良辰 教授
开发人员:(排名不分先后) 仲旸、汪本胜、兰馨
联系方式:zhoulch@njnu.edu.cn