首先热烈祝贺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
分享到:
相关推荐
7. 数据库连接与管理:AutoCAD图形数据的管理往往需要结合数据库技术,开发者可能需要利用Java语言连接到数据库,读写AutoCAD图形文件的数据。 8. 网络编程:在某些情况下,AutoCAD二次开发可能涉及到网络功能,...
通过Java的AWT(Abstract Window Toolkit)或Swing库,可以创建与AutoCAD无缝集成的图形用户界面,提供更加直观和高效的用户体验。 总结来说,Java语言在处理AutoCAD图形数据方面的应用主要包括:1) 数据提取和解析...
在"Swing应用_cad绘图"这个主题中,我们可以探讨以下几个重要的知识点: 1. **Swing组件**:Swing提供了一系列的组件,如JButton、JLabel、JTextField、JFrame等,这些组件可以构建出功能齐全的用户界面。对于CAD...
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 是由 100%纯 Java 实现的,Swing 组件是用 Java 实现的轻量级组件,没有本地代码,不依赖操作系统的支持。这是它与 AWT 组件的最大区别。Swing 在不同的平台上表现一致,并且有能力提供本地窗口系统不支持的...
利用Swing编写的类2D的CAD画图软件,能实现一般的画图功能,包括画直线、矩形、椭圆、圆、正三角形(可旋转)、正五边形(可旋转)、正五角星(可旋转),能对以上所绘图形进行修改,包括颜色、大小、位置,并能在绘图过程...
Java Swing 是Java GUI开发的一个重要库,主要用于创建桌面应用程序。在这个"java Swing 文件批量上传 DEMO 源代码"中,我们关注的核心是利用Swing构建一个用户界面,实现文件和文件夹的批量上传功能。这涉及到多个...
首先,Swing提供了丰富的组件库,包括JButton、JLabel、JTextField、JTextArea、JComboBox、JCheckBox、JRadioButton等,这些组件可以组合使用以创建各种复杂界面。例如,JFrame是窗口的基础,JPanel则可以作为容器...
《使用Swing构建的简易图书管理系统详解》 在IT领域,开发用户友好的图形用户界面(GUI)是提升软件易用性的重要手段。Java的Swing库为开发者提供了丰富的组件和工具,使得创建桌面应用程序变得相对简单。本系统...
在Java Swing中,你可以创建出既美观又高效的程序界面,而且Swing完全使用Java编写,具有平台无关性。 本教程“Java Swing漂亮界面(超酷) Java Swing教程”着重于如何利用Swing来设计吸引人的、用户友好的GUI。在...
在Swing计算器中,开发者会使用诸如JButton、JFrame、JPanel等Swing组件来构建计算器的外观。JFrame作为主窗口,承载着整个计算器的布局;JPanel则用于组织各个按钮,形成计算器的按键区域。每个按钮通常都会关联一...
Creating Wizard Dialogs with Java Swing 使用Swing设计向导 官网示例 http://www.oracle.com/technetwork/articles/javase/wizard-136789.html
在Java中,Swing插件则通常是指支持在Web浏览器中运行Swing组件的技术,这使得基于Swing的应用程序可以在网络环境中更加便捷地分发和使用。 "Swing插件下载"是指寻找并安装这个特定的Java插件,以便在浏览器中运行...
- **AWT与Swing共存**:虽然理论上AWT和Swing组件可以混合使用,但推荐避免这样做,因为可能会导致不可预见的问题。特别是,直接在Swing组件上添加AWT组件可能会出现问题,而Swing提供了相应的替代组件,如JButton...
标题"auto_order.rar_JAVA Swing mvc_mvc java swing_swing mvc_swing mvc"暗示了这是一个关于使用Java Swing实现MVC模式的示例项目,可能专注于自动化订单处理。这个压缩包可能包含了源代码、相关的类和资源文件,...
2. **数据保存与加载**:项目涉及到配置界面的保存功能,这可能通过文件I/O实现,比如使用Properties类来读写配置文件,或者XML、JSON格式存储数据。用户设置的信息会被持久化,以便于下次启动时恢复。 3. **数据...
Swing 容器使用 Swing 中的容器是指能够容纳其他组件的组件,它们是构建 GUI 应用程序的基础。常用的 Swing 容器包括 JFrame、JPanel、JApplet 等。 JLabel 组件是 Swing 库中最基本的组件之一,它可以用来显示...
具体实现细节可能会涉及到 Spring 注解的使用、Swing 组件的定制、以及如何将两者协调工作等。 由于没有具体的代码示例,我们无法深入分析这个例子的实现方式。但是,通过理解 Spring 和 Swing 的基本概念和功能,...
用swing做的qq界面