用C#写的CGM解析程序

石油行业常用CGM(Computer Graphics Metafile)计算机图形元文件格式来保存一些图件,从参加工作没多久就遇到过许多的CGM读取和输出软件或工具。像SDI公司的cgmoffice等都可以很好地编辑cgm文件。由于cgm格式设计得较早,虽然许多理念很不错,设计的图形元素复杂,但还是有一些先天不足,其中最大的问题是对中文的支持,再就是支持多种版本(V1到V4),并且还可以定制,称为profile,而一些公司出于成本的考虑,通常只支持V1或V2,一些复杂的元素就不再考虑了。

这些CGM文件的版本低一些也是好事,至少我们做编程的可以少花些时间就可以读取一些构造图了。在石油行业应用中常用的CGM版本实际上还是V1,在构造图里,用到的CGM命令并不多,统计后可以有一些惊异的发现。所以自己用C#编程来解析CGM也是一个可能的任务了。

看到许多刚刚参加工作的学生很快就会遇到此类问题,估计也要动手尝试自己解析CGM格式,这里把一些主要思路介绍一下。

CGM的官方文档实际上就是三个:

(1)ISO_IEC_8632-1_1999(E).pdf,CGM的ISO规范part1,总体介绍

(2)ISO_IEC_8632-3_1999(E).pdf,CGM的ISO规范part3(注意第2部分被ISO组织作废了),二进制格式介绍

(3)ISO_IEC_8632-4_1999(E).pdf,CGM的ISO规范part4(文本格式介绍,实际应用中很少用,一般不用看)

另外军方的有一个规范(MIL-STD-2301-1993-CGM.doc )写得比较细,把二进制编码的排列方式都写出来了。

值得一提的是CGM PIP规范,如果要显示带地震剖面的图形的这类CGM文件时,这个PIP也要能读才行。

可以从网上借鉴的一些相关源代码有:

(1)cgmviewer-1.00-java.rar,一个人用JAVA的Applet写的浏览cgm的小程序,功能很弱

(2)ralcgm.rar 这个源代码内容很多很全,但确实不容易看懂,也不容易移植

(3)胜利油田的一个朋友在工作站上用c语言写的读写cgm的程序,代码较乱,注释也很少,可以输出cgm

(4)Larson的CGMLibrary,1998 larson公司做的一个开放源码的cgm library,从1998年后好像就不免费了,但源代码还是可以参考的,还有一个cgmlib3.pdf的API手册有200多页。

另外还可以参考的就是发表在期刊杂志上的与CGM有关的几篇论文,这些论文篇幅都不长,可以作为入门手册来读读。

CGM的测试文件由NIST提供过2个版本,一个是2.0,一个是3.0,见这个网址http://www.itl.nist.gov/div897/ctg/cgm_form.htm,谁能把这些内容都正确显示了,才能算是一个cgm的商业软件。

自己解析CGM的过程还是相当曲折的,最后用INT公司的Carnac.NET来显示所有解析出来的图元(Carnac.NET里面可以输出CGM文件,但不能读CGM),附整个程序的类图一张。

原文发布于微信公众号 - 申龙斌的程序人生(slbGTD)

原文发表时间:2016-10-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏WeTest质量开放平台团队的专栏

如何编写高效手游自动化测试脚本?

WeTest基于引擎的自动化测试,能够深入到游戏战斗内部进行适配和性能测试。在实际执行过程中,如何更简单、更高效地编写自动化脚本?本文重点阐述下面3个问题的解决...

1243
来自专栏何俊林

VLC框架总结(二)VLC源码及各modules功能介绍

一般情况下,播放一个音视频分为4个步骤 1、access访问 2、demux解复杂 3、decode解码 4、output输出 access:访问 可以理解为接...

2945
来自专栏牛客网

2018腾讯、美团C++后台研发实习生面经

1960
来自专栏Golang语言社区

在 Go 语言中,如何正确的使用并发

Glyph Lefkowitz最近写了一篇启蒙文章,其中他详细的说明了一些关于开发高并发软件的挑战,如果你开发软件但是没有阅读这篇问题,那么我建议你阅读一篇。这...

1810
来自专栏小巫技术博客

那些Android中的性能优化tips

792
来自专栏数据结构与算法

万能pb_ds头文件—bits/extc++.h

c++中自带了一些非常强大却鲜为人知的功能库—pd_ds库 里面含有红黑树(rb_tree),哈希表(gp_hash_table),可持久化平衡树(rope)等...

3406
来自专栏牛客网

腾讯一面应用开发

最遗憾的,叫写冒泡排序都能写数组溢出,非科班面对算法题真的紧张。凉凉。 面试官是做php的,我用java。 问了http和https的区别。 答: 后者是前者的...

2726
来自专栏前端大白专栏

最近在学习react-native 为之后的找工作做准备

1849
来自专栏SDNLAB

SDNLAB技术分享(十六):SPRING/Segment Routing

前言:本人的所有技术分享仅以传播IT行业的通用网络技术知识为目的, 不包含任何厂家特定的软硬件功能/特性的实现细节以及roadmap等厂家私密信息. 本次分享借...

37014
来自专栏Java技术

初探性能优化--2个月到4小时的性能提升!

一直不知道性能优化都要做些什么,从哪方面思考,直到最近接手了一个公司的小项目,可谓麻雀虽小五脏俱全。让我这个编程小白学到了很多性能优化的知识,或者说一些思考方式...

621

扫码关注云+社区