`
xiaozhonghua
  • 浏览: 254135 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

用Swing读写AutoCAD图纸

 
阅读更多

首先热烈祝贺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
分享到:
评论
23 楼 beihan007 2010-11-27  
truesmile 写道
ray_linn 写道
又见twaver广告贴。。。。

前后搜索了一下,只有这里出现了twaver。
果然是两眼一闭,满嘴乱喷,我穿越到csdn或者网易了吗?

顶。。。。看都没看完内容就开始喷了。。。
22 楼 toshi2002 2010-11-26  
果然是有图有真相啊 版主砍了这个帖子吧
21 楼 qianhd 2010-11-26  
ray_linn 写道
truesmile 写道
ray_linn 写道
又见twaver广告贴。。。。

前后搜索了一下,只有这里出现了twaver。
果然是两眼一闭,满嘴乱喷,我穿越到csdn或者网易了吗?



有个功能叫"编辑”,当然这个“编辑”是发生在我吐槽之后了。。。。 twaver用在哪里,楼上的已经说得很清楚了。


人要小白,学什么都没用。


未编辑前 大概如此


20 楼 androidleader 2010-11-26  
ray_linn 写道
小中华就是在twaver里任职吧?他的文章系列的截图(ERP)完全是twaver的产品。。。。所有的号称“Swing“的n把刀,哪一贴离开twaver了。。。。楼上的希望共享。。。twaver价格可不便宜


twaver的刀啊
19 楼 ninja9turtle 2010-11-26  
androidleader 写道
ninja9turtle 写道
有没有做过visio格式导入导出的同学,我朋友有个项目需要这样的功能,可以交流一下


做过,很不容易的。

能否分享一下经验
18 楼 ray_linn 2010-11-26  
小中华就是在twaver里任职吧?他的文章系列的截图(ERP)完全是twaver的产品。。。。所有的号称“Swing“的n把刀,哪一贴离开twaver了。。。。楼上的希望共享。。。twaver价格可不便宜
17 楼 androidleader 2010-11-26  
ninja9turtle 写道
有没有做过visio格式导入导出的同学,我朋友有个项目需要这样的功能,可以交流一下


做过,很不容易的。
16 楼 hb315 2010-11-26  
你不是要共享吗?在那里呀!
15 楼 hb315 2010-11-26  
楼主呀!关于DXF的读写资料很多,开源的也不少,你这样发图不发代码,有意义吗?
就晒晒图呀!
14 楼 buyajun 2010-11-26  
等于没说。
能不能贴一个 demo 程序,哪怕它的 helloworld 程序

楼主太自私了
13 楼 select*from爱 2010-11-26  
能在上面实现类似ObjectARX开发吗
12 楼 楚天阔 2010-11-25  
继续膜拜楼主来
11 楼 ray_linn 2010-11-25  
truesmile 写道
ray_linn 写道
又见twaver广告贴。。。。

前后搜索了一下,只有这里出现了twaver。
果然是两眼一闭,满嘴乱喷,我穿越到csdn或者网易了吗?



有个功能叫"编辑”,当然这个“编辑”是发生在我吐槽之后了。。。。 twaver用在哪里,楼上的已经说得很清楚了。


人要小白,学什么都没用。
10 楼 qianhd 2010-11-25  
得到dxf中的图形数据 然后转换成twaver的element吧?

twaver的拓扑图确实做的不错
只可惜楼主不针对这个实现开题
老针对在拓扑上的应用
9 楼 kjj 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解析显示对吧,我这样理解可以么
8 楼 xiaozhonghua 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的项目。
7 楼 ninja9turtle 2010-11-25  
有没有做过visio格式导入导出的同学,我朋友有个项目需要这样的功能,可以交流一下
6 楼 i2534 2010-11-25  
本来冲着xiaozhonghua的问头来看看,结果又发现了ray_linn哥,这个帖子即使没有内容,也值了
5 楼 mybw7601 2010-11-25  
kjj 写道
楼主可以详细说说怎么读取显示么,我现在正想用java读取这个dwg!!


DWG是二进制格式,Java读取DWG没有见过,C++或者.Net的不少,看看这个:http://www.woutware.com/
4 楼 truesmile 2010-11-25  
ray_linn 写道
又见twaver广告贴。。。。

前后搜索了一下,只有这里出现了twaver。
果然是两眼一闭,满嘴乱喷,我穿越到csdn或者网易了吗?

相关推荐

    应用Java语言进行AutoCAD2000二次开发.pdf

    7. 数据库连接与管理:AutoCAD图形数据的管理往往需要结合数据库技术,开发者可能需要利用Java语言连接到数据库,读写AutoCAD图形文件的数据。 8. 网络编程:在某些情况下,AutoCAD二次开发可能涉及到网络功能,...

    用JAVA语言处理AutoCAD图形数据的研究.pdf

    通过Java的AWT(Abstract Window Toolkit)或Swing库,可以创建与AutoCAD无缝集成的图形用户界面,提供更加直观和高效的用户体验。 总结来说,Java语言在处理AutoCAD图形数据方面的应用主要包括:1) 数据提取和解析...

    swing应用_cad绘图

    在"Swing应用_cad绘图"这个主题中,我们可以探讨以下几个重要的知识点: 1. **Swing组件**:Swing提供了一系列的组件,如JButton、JLabel、JTextField、JFrame等,这些组件可以构建出功能齐全的用户界面。对于CAD...

    Swing插件下载,swing下载,java-swing下载,swing-plugin

    在Java中,Swing插件则通常是指支持在Web浏览器中运行Swing组件的技术,这使得基于Swing的应用程序可以在网络环境中更加便捷地分发和使用。 "Swing插件下载"是指寻找并安装这个特定的Java插件,以便在浏览器中运行...

    swing-layout-1.0.3

    swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3...

    swing教程 swing教程

    Swing 是由 100%纯 Java 实现的,Swing 组件是用 Java 实现的轻量级组件,没有本地代码,不依赖操作系统的支持。这是它与 AWT 组件的最大区别。Swing 在不同的平台上表现一致,并且有能力提供本地窗口系统不支持的...

    Java_2D类CAD制图系统

    利用Swing编写的类2D的CAD画图软件,能实现一般的画图功能,包括画直线、矩形、椭圆、圆、正三角形(可旋转)、正五边形(可旋转)、正五角星(可旋转),能对以上所绘图形进行修改,包括颜色、大小、位置,并能在绘图过程...

    java Swing 文件批量上传 DEMO 源代码

    Java Swing 是Java GUI开发的一个重要库,主要用于创建桌面应用程序。在这个"java Swing 文件批量上传 DEMO 源代码"中,我们关注的核心是利用Swing构建一个用户界面,实现文件和文件夹的批量上传功能。这涉及到多个...

    java swing漂亮界面 超酷 javaswing教程

    首先,Swing提供了丰富的组件库,包括JButton、JLabel、JTextField、JTextArea、JComboBox、JCheckBox、JRadioButton等,这些组件可以组合使用以创建各种复杂界面。例如,JFrame是窗口的基础,JPanel则可以作为容器...

    用swing制作的简单图书管理系统

    《使用Swing构建的简易图书管理系统详解》 在IT领域,开发用户友好的图形用户界面(GUI)是提升软件易用性的重要手段。Java的Swing库为开发者提供了丰富的组件和工具,使得创建桌面应用程序变得相对简单。本系统...

    java swing漂亮界面(超酷) javaswing教程

    在Java Swing中,你可以创建出既美观又高效的程序界面,而且Swing完全使用Java编写,具有平台无关性。 本教程“Java Swing漂亮界面(超酷) Java Swing教程”着重于如何利用Swing来设计吸引人的、用户友好的GUI。在...

    swing计算器,swing计算器 swing计算器

    在Swing计算器中,开发者会使用诸如JButton、JFrame、JPanel等Swing组件来构建计算器的外观。JFrame作为主窗口,承载着整个计算器的布局;JPanel则用于组织各个按钮,形成计算器的按键区域。每个按钮通常都会关联一...

    Creating Wizard Dialogs with Java Swing 使用Swing设计向导

    Creating Wizard Dialogs with Java Swing 使用Swing设计向导 官网示例 http://www.oracle.com/technetwork/articles/javase/wizard-136789.html

    AWT与Swing使用区别

    - **AWT与Swing共存**:虽然理论上AWT和Swing组件可以混合使用,但推荐避免这样做,因为可能会导致不可预见的问题。特别是,直接在Swing组件上添加AWT组件可能会出现问题,而Swing提供了相应的替代组件,如JButton...

    auto_order.rar_JAVA Swing mvc_mvc java swing_swing mvc_swing mvc

    标题"auto_order.rar_JAVA Swing mvc_mvc java swing_swing mvc_swing mvc"暗示了这是一个关于使用Java Swing实现MVC模式的示例项目,可能专注于自动化订单处理。这个压缩包可能包含了源代码、相关的类和资源文件,...

    Swing小管理项目源码

    2. **数据保存与加载**:项目涉及到配置界面的保存功能,这可能通过文件I/O实现,比如使用Properties类来读写配置文件,或者XML、JSON格式存储数据。用户设置的信息会被持久化,以便于下次启动时恢复。 3. **数据...

    swing容器使用

    Swing 容器使用 Swing 中的容器是指能够容纳其他组件的组件,它们是构建 GUI 应用程序的基础。常用的 Swing 容器包括 JFrame、JPanel、JApplet 等。 JLabel 组件是 Swing 库中最基本的组件之一,它可以用来显示...

    spring+swing的例子

    具体实现细节可能会涉及到 Spring 注解的使用、Swing 组件的定制、以及如何将两者协调工作等。 由于没有具体的代码示例,我们无法深入分析这个例子的实现方式。但是,通过理解 Spring 和 Swing 的基本概念和功能,...

    用swing做的qq界面

    用swing做的qq界面

Global site tag (gtag.js) - Google Analytics