论坛首页 Java企业应用论坛

用Swing读写AutoCAD图纸

浏览 20705 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2010-11-24   最后修改:2010-11-24

首先热烈祝贺JavaEye重新开放,特共享近期的一个技术成果!

项目中客户死活要求要支持AutoCAD图纸的导入导出,以便电信局方可以将各种资源CAD图纸进行管理,包括局所庭院图、建筑楼层平面图、机房平面图,等等。更重要的是,要求能够对图纸内容进行修改,并保存回去。寻找了很久,始终没有发现功能较好的基于Swing的工具或开发包能做到这一点,于是只能死命自己写了。

先上图看一下成果:读取并显示一个几兆大的火车车厢图纸:


首先我们先看看AutoCAD的几种文件格式:
1. DWG:是原始图纸格式,包含了图纸所有的信息,Autodesk公司出于安全考虑没有给出详细的格式说明
2. DWF:比DWG文件小很多,用于其他用户浏览,添加备注等,不能编辑
3. DXF:是用于和其他CAD系统交换数据的文件格式,分二进制和ASCII格式,AutoCAD的帮助里包含了DXF文件的详细描述

虽然Open Design Specification(http://www.opendesign.com)对DWG文件格式有很详细的介绍(http://www.opendesign.com/files/guestdownloads/OpenDesign_Specification_for_.dwg_files.pdf),但是研究其二进制格式的复杂程度可想而知,因此公开的ASCII格式的DXF文件格式成为了与AutoCAD数据交换的首选。

进入正题之前,我们先来了解一下DXF文件的格式,具体规范在Autodesk的网站有详细说明(http://usa.autodesk.com/adsk/servlet/item?siteID=123112&id=12272454&linkID=10809853, 另外, 这里还有个中文的http://docs.autodesk.com/ACD/2011/CHS/filesDXF/WSfacf1429558a55de185c428100849a0ab7-5f35.htm):
1. DXF文件由组码(Group Code)和值(Value)组成,Group Code和Value都分别占一行,Group Code是整数(从-5到1071),Value可以是整数、十六进制整数、布尔值(0或者1)、浮点数(进度可以达到16位小数)或者字符串。
2. Group Code确定了下一行Value的意义,有些Group Code有明确的意义(比如0代表entity类型,8代表Layer Name,9代表变量名并只用在HEADER段,62代表颜色),有些Group Code的代表一类值(比如10代表一个点的x值,11代表y值,12代表z值,这个点可能是一个Circle的中心点,也可能是一个Line的起始点/结束点等)。
3. DXF文件共分为7个段(Section):
3.1 HEADER,包含了一系列和图纸相关的变量信息,每个变量由给出变量名称的组码 9 指定,其后是提供变量值的组。比如AutoCAD版本,坐标系的最小、最大值等。
3.2 CLASSES,包含了在BLOCKS,ENTITIES和OBJECTS段用到的类的定义,比如LWPOLYLINE
3.3 TABLES,包含各种表,比如图层(Layer)、线条类型(LTYPE)等;每个表可以包含多个条目
3.4 BLOCKS,包含构成图形中每个块参照的块定义和图形图元,由一系列Entity组成
3.5 ENTITIES,包含各种图形对象,也叫图元(Entity),比如点(POINT)、线(LINE),圆(CIRCLE),弧(ARC),多边形(LWPOLYLINE)等,是我们解析的重点
3.6 OBJECTS,包括非图形对象的数据,供 AutoLISP 以及 ObjectARX 应用程序所使用
3.7 THUMBNAILIMAGE,包含DXF文件的缩略图
4. 每个Section以Group Code(0)和Value(SECTION)开始,以Group Code(0)和Value(ENDSEC)结束

 

 

 

注意点:
1 绝对值小于1E-3或者大于1E7的非零double数据转化成String时,JDK默认会用科学计数法
表示,具体可以参考JDK文档,所以需要用DecimalFormat特殊处理一把,参考DxfUtils.toString(double value)
2 MText的text字段包含了一些格式信息,可以通过DxfUtils.stripMText(String text)过滤
3 HEADER段的$HANDSEED变量代表下一个可用的句柄,可以用这个变量的值作为新加的Entity的句柄值,然后这个变量的值要加1
4 AutoCAD的坐标原点在左下,Java的坐标原点在左上,通过TransformContext进行转换

 其他Java DXF开源项目:
http://sourceforge.net/projects/dxf/
http://sourceforge.net/projects/ycad

 

 

 

  • 大小: 83.1 KB
   发表时间:2010-11-24  
又见twaver广告贴。。。。
0 请登录后投票
   发表时间:2010-11-25   最后修改:2010-11-25
楼主可以详细说说怎么读取显示么,我现在正想用java读取这个dwg!!
0 请登录后投票
   发表时间:2010-11-25  
ray_linn 写道
又见twaver广告贴。。。。


拜托,好好看看内容再说!不要以为Swing的图形展示就是TWaver!天大着呢,不要坐在井里。
0 请登录后投票
   发表时间:2010-11-25  
ray_linn 写道
又见twaver广告贴。。。。

前后搜索了一下,只有这里出现了twaver。
果然是两眼一闭,满嘴乱喷,我穿越到csdn或者网易了吗?
0 请登录后投票
   发表时间:2010-11-25  
kjj 写道
楼主可以详细说说怎么读取显示么,我现在正想用java读取这个dwg!!


DWG是二进制格式,Java读取DWG没有见过,C++或者.Net的不少,看看这个:http://www.woutware.com/
0 请登录后投票
   发表时间:2010-11-25  
本来冲着xiaozhonghua的问头来看看,结果又发现了ray_linn哥,这个帖子即使没有内容,也值了
0 请登录后投票
   发表时间:2010-11-25  
有没有做过visio格式导入导出的同学,我朋友有个项目需要这样的功能,可以交流一下
0 请登录后投票
   发表时间:2010-11-25  
mybw7601 写道
kjj 写道
楼主可以详细说说怎么读取显示么,我现在正想用java读取这个dwg!!


DWG是二进制格式,Java读取DWG没有见过,C++或者.Net的不少,看看这个:http://www.woutware.com/

我只搞了DXF,DWG那东西比较复杂了,是二进制的,而且也是AUTODESK私有的格式,和MS的WORD类似,一直没有正式公开过其格式,而且随着版本2000/2002/2008的不停的变化和加东西,很难搞。目前还没有见到JAVA能处理DWG的项目。
0 请登录后投票
   发表时间:2010-11-25   最后修改:2010-11-25
xiaozhonghua 写道
mybw7601 写道
kjj 写道
楼主可以详细说说怎么读取显示么,我现在正想用java读取这个dwg!!


DWG是二进制格式,Java读取DWG没有见过,C++或者.Net的不少,看看这个:http://www.woutware.com/

我只搞了DXF,DWG那东西比较复杂了,是二进制的,而且也是AUTODESK私有的格式,和MS的WORD类似,一直没有正式公开过其格式,而且随着版本2000/2002/2008的不停的变化和加东西,很难搞。目前还没有见到JAVA能处理DWG的项目。

从楼主的截图来看,是java界面啊,是不是autocad可以把图纸导出为dxf格式,然后再用java解析显示对吧,我这样理解可以么
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics