介绍
JT是西门子公司推出的PLM通用三维格式,设计为一个开放、高效率的、紧凑,持久性存储的产品数据格式,用于产品可视化、协作和CAD数据共享。JT文件格式包括多方面的数据,以及对曲面边的精准表示,产品和制造业的相关信息,元数据信息,这些信息都可以文件系统导出可以被产品数据管理系统(PDM)导入到软件里。它已被定为ISO标准(IS 14306-1), 能在PLM整个全生命周期中使用。更多信息,请访问https://www.plm.automation.siemens.com/en/products/open/jtopen/index.shtml。
JT格式文件主要存储模型的可视化网格,并采用各种技术对网格进行压缩;但也支持存储精确几何数据BREP,或者存储与模型匹配的Parasolid格式内容(这样通用性更好),存入同一个文件。
其版本最开始或仅为内部使用,在 JT File Format 8.0 和8.1时有广泛使用(当前似乎已找不到比8.0更前的格式文件)。从版本8.1开始,可以在网上找到相应的格式说明文件。ISO14306-2012基于西门子JT9.5版本,最新发布的有JT10.0版本。
jt文件基本组织结构
- Data Segment 采用 GUID 来做标识,可以支持部分加载文件,不同类型的数据存储为不同的 Segment
- LSG Segment 包含一系列对象(Elements)形成一种有向无环的图示结构。对应表述模型的可视化数据与属性,并按层次等级表述组件之间的关联。
- Shape LOD Segment 对应LOD层次划分的几何模型定义数据,比如顶点,多边形,向量等。这部分会采用一些压缩算法对数据进行压缩。
- JT B-Rep Segment 为jt格式自定义的B-Rep存储,比较少见到JT B-Rep段的存储。
- XT B-Rep Segment 为Parasolid的B-Rep存储,对应精确几何数据,由于x_t更常用,所以通用性更好。
- PMI Data Segment, Wireframe Segment, 等,这样可以保持和MCAD数据源的数据同步,这些数据也是以延迟加载特性存在的
jt格式内容解析,难点在于那些压缩算法的处理上,其它的或者是zlib,或者是lzma通用性压缩,处理上应该不是难点。
网格压缩
3D网格数据一般分为两部分,一部分为拓扑(哪些顶点组成三角形/多边形);另一部分为几何(顶点数据)。
Google的draco库介绍
谷歌开源3D数据压缩算法 Draco 在线看片再也不用缓冲了?,相比通用压缩算法,针对3D数据的特点而开发的压缩可以有更大比率的压缩,这一领域现在也已经被研究二三十年了。
draco 支持输入点云与网格,分别为ply,obj输入格式,压缩后变为draco自身的格式,可解压输出为ply,obj。在拓扑的压缩上,draco里边有一个非常经典 EdgeBreaker 编码过程,(draco还支持设置压缩程度,当最高为10时,似乎变换成为一种序列模式,这个是什么样的原理不大清楚),EdgeBreaker基于区域增长原理遍历网格,英文资料可以在https://www.cc.gatech.edu/~jarek/edgebreaker/内找到,此外这方面的国产论文也是满天飞的,资料很好找;在几何的压缩上,没有细看draco的处理模式,可能采用了有损的压缩方式。点云的特点是只有几何而没有拓扑,所以draco可以省略掉拓扑方面的处理。
Simens的jt
jt文件还支持装配、部件的组织结构,这是ply,obj,cml,...等等一系列文件所不具备的。jt8.0版本的没有对拓扑的专门处理,而9.0版开始采用了一种对偶网格(中文表述或不准确,英文名称为Dual Vertex-Facet Mesh,示范代码类名为DualVFMesh)的方法进行压缩,对偶网格方面的国产论文很少,只找到2~3篇提高对偶网格的,自身并不介绍该方法,相比EdgeBreaker,对偶网格除支持三角形网格之外,还同时支持四边形,五边形等多边的模式,搞不大清楚为什么对偶网格方面的论文会比较少,不过如果仅依靠论文,掌握这些算法估计很难。在其他方面,jt还采用位长度编码,算术编码,8.0版还有一个Huffman编码,此外在位长度压缩上,9.0版与8.0版有所不同。
Dual Vertex-Facet Mesh 大体上是这样的,比如一个矩形体,划分三角网格之后,一般是8个顶点,12个三角形;反过来,把三角形当成顶点,顶点当成面,示例图示如上,将这样表述后得到的东东压缩后存储。
没有去比较draco和jt的压缩能力,如前所述,二者所针对的行业与需求是有所差别的。
我认为draco格式相比jt,最大的缺点是不能表述装配组件,这样与CAD模型文件比较不能一一对应。
支持解析jt的库
- 西门子自己的 JT Open Toolkit,提供60天试用版本,支持公司或者个人申请,价格不知道。
- OCC提供的TKJT 提供的开源版本是2009年的,很久没有更新,最近发现opencascade-7.2.0里将TKJT作为高级库提供,支持jt文件读写,但是需要money方可得到。
可解析 jt格式文件 的osg插件
在文末提供一个我自己写的支持解析jt文件的osg插件,基于OpenSceneGraph 3.6.3开发,使用vs2017编译,不过还比较简陋,jt8.1版的支持度相对好一些,9.0~9.5版还缺少Chopper解码,测试也还不够,大批9.0以上的文件估计无法支持,当前主要特性如下:
- 仅显示解析网格数据,未应用颜色
- 尚不支持多线程,延迟加载网格数据
- 代码架构与TKJT不同,理论上可以支持jt格式的写入,TKJT仅考虑显示jt
- 在解码编码方面为规避TKJT的版权约束,采用jt iso文件所提供的代码为蓝本改进,这个过程有点蛋疼,不过可以不用理会TKJT开源许可证,理论上还可以做到支持编码压缩。
当前仅提供Debug版的插件,还只算是Demo级别,之所以现在就发出来,是因为准备暂时中止这一方面的探索,想对前面这好几个月在这方面的花费时间与精力做一个备份,以后再视情况与机会改进。
插件 基于OpenSceneGraph 3.6.3 VS2017编译
本插件已更新,具体见后边的文章
osgviewer_with_jt
使用方法:osgviewer butterflyvalve.jt