[100分]做过dxf研究的同志们进来

时间:2022-05-25 21:17:22
好久没有在csdn发主题帖了,最近终于遇到问题了,呵呵。
最近做毕业设计《dxf文件解读与应用》,我的任务就是读取dxf文件中的二维图元,把它们的坐标等信息存放在解读文件中。
读取图元倒是没有问题,现在我已经做出框架了,并已经能够读取点、线段和圆了。而且通吃R2.5\R2.6\R9\R10\R11-12\R13\R14\2000-2002\2004-2005-2006\2007-2008等各种版本的dxf文件。
程序能够读取dxf文件中的点、线段和圆等图形的坐标等信息,放在配置文件中。
格式如下:

[Point]
X=326.6078477381652
Y=240.5280832292311
[Point]
X=273.248217791049
Y=121.5363578482403
[Line]
StartX=203.7634235075645
StartY=157.2901380635241
EndX=346.8375975232752
EndY=176.0424335210514
[Circle]
X=193.1393992559836
Y=151.4289937780043
Radius=66.34630654827721


虽然程序写的差不多了,但是苦于对autocad不熟悉,导致对一些基本信息还是理解不很透彻,其实就是对dxf文件HEADER段的一些东西还有些疑问。分条说明。

1.关于dxf文件的度量单位读取问题(公制 or 英制)。
经过研究,在R14到autocad 2008版本的dxf文件中可以直接读取HEADER段的标题变量$measurement来获得度量单位,该变量的值为0时为英制,为1时是公制。
但是在R14以下的dxf文件中却没有变量$measurement。导致一些问题,经过分析,发现在R11、R12、R13版本的dxf中可以读取标题变量$DIMSTYLE来区分度量单位,该变量为值为ISO-25时为公制,为STANDARD时是英制。
但是新的问题又来了,在R2.5、R2.6、R9、R10版本的dxf中这两个变量都不存在。晕啊。。
请熟悉的朋友说明一下这种方法是否正确。

2.图纸大小问题。怎么读取?
我现在用的方法是读取HEADER段标题变量$EXTMAX得到图形范围右上角点的坐标,再读取$EXTMIN得到图形范围左下角点的坐标,然后计算出图纸大小。由于一直没有找到相关资料,这个问题到现在都是心里的一块石头。希望了解的朋友详细告知。

3.dxf或者说cad的坐标系问题,还有比例问题
因为后面有人要用我的程序生成数据,例如,要用我生成的配置文件中的圆去打孔,就涉及到一个坐标问题和比例问题,
比如上面的圆

[Circle]
X=193.1393992559836
Y=151.4289937780043
Radius=66.34630654827721

这是直接从dxf中读取的数据,X是圆心的X坐标,Y是圆心的Y坐标,Radius是圆的半径。
现在我就想问上面的数据是绝对数据么?对cad的比例不了解,如果cad里画图的时候用的比例不是1:1的话,那么生成的dxf文件的数据是相对的,还是按比例换算好的了??也就是说dxf文件中的数据都是绝对数据么??
还有别人读取这个圆的数据后,怎么确定圆的位置,虽然有坐标,但是这个坐标系是怎么建立的。是约定俗成的还是在dxf文件中有相应的信息说明。

就这几个问题了,请熟悉的朋友指点一下。
分数不多,解决问题,再加100分。

16 个解决方案

#1


AUTOCAD的问题,建议你直接开贴问SammyLan,他们公司的东西,他应该比较清楚...

或者直接开贴骂他,质问他,他们公司的东西怎么这么垃圾...嘿嘿...

#2


引用 1 楼 fetag 的回复:
AUTOCAD的问题,建议你直接开贴问SammyLan,他们公司的东西,他应该比较清楚... 
或者直接开贴骂他,质问他,他们公司的东西怎么这么垃圾...嘿嘿...

过儿说笑了,呵呵。

#3


可以参照ini文件的读法处理此文件

#4


UP

#5


引用 3 楼 bitxinhai 的回复:
可以参照ini文件的读法处理此文件

我不是说怎么读dxf文件,读文件一点问题都没有,上面的格式就是我的程序生成的ini文件,我写成这种格式是方面后面的人使用里面的数据。
我现在问的是dxf的标题段的具体问题。

#6


你最好去官方网站上看下dxf文件的说明

#7


都是很好的建议! 值得学习

#8


引用 6 楼 dizuo 的回复:
你最好去官方网站上看下dxf文件的说明

#9


我正在做一下图形平台, 其中写了一个比较可靠的cadIO类, 可以实现你的要求
是基于cadlib做的  在Baidu上搜cadlib可以下到
关于DXF组码也有一些资料 其中比较好用的一本电子书是"AutoCAD2002 DXF参考手册.chm"
在网上也可以下到  
但是要注意的是cadlib中对于dxf文件中的块的处理, 以及用户定义坐标系的处理有问题 
要自己改一下。
 

#10


引用 9 楼 caozl 的回复:
我正在做一下图形平台, 其中写了一个比较可靠的cadIO类, 可以实现你的要求 
是基于cadlib做的  在Baidu上搜cadlib可以下到 
关于DXF组码也有一些资料 其中比较好用的一本电子书是"AutoCAD2002 DXF参考手册.chm" 
在网上也可以下到   
但是要注意的是cadlib中对于dxf文件中的块的处理, 以及用户定义坐标系的处理有问题  
要自己改一下。 
 
你说的那个电子书我也有的,就是里面对HEADER段的标题变量只有简单的说明,不太详细,其实读dxf文件的图元我倒是没有问题的,程序已经写出来了,已经可以读点、线段和圆了,现在就是加功能块了,多支持几种图形。就是对cad的坐标系不太了解。还有dxf文件HEADER段的标题变量不是太熟悉,郁闷,如果解决不了就没有办法了,按照先前的进度继续写程序了。

#11


PS:
谢谢9楼caozl兄热心帮忙~~~

#12


仔细看了一下你的问题 
问题1:对于R14以前的版本不清楚  但你可以自己用文本比较工具对比一下空图  找一下不同的地方看看

问题2:这两个值按DXF组码的说明分别是
图形的 X、Y 和 Z 延伸到右上角(在 WCS 中)
和图形的 X、Y 和 Z 延伸到左下角(在 WCS 中)

而$PEXTMAX  10, 20, 30   图纸空间的 X、Y 和 Z 延伸的最大值
 $PEXTMIN 10, 20, 30   图纸空间的 X、Y 和 Z 延伸的最小值

问题3:不清楚你做到什么程序了  举个例子吧 
对于一个插入的块的信息来说  包括了块名、插入点、比例、角度等信息 
而如果你要打的孔是在一个块里的话  就应该处理这些信息, 否则就是错的  

#13


引用 12 楼 caozl 的回复:
仔细看了一下你的问题  
问题1:对于R14以前的版本不清楚  但你可以自己用文本比较工具对比一下空图  找一下不同的地方看看 

问题2:这两个值按DXF组码的说明分别是 
图形的 X、Y 和 Z 延伸到右上角(在 WCS 中) 
和图形的 X、Y 和 Z 延伸到左下角(在 WCS 中) 

而$PEXTMAX  10, 20, 30   图纸空间的 X、Y 和 Z 延伸的最大值 
 $PEXTMIN 10, 20, 30   图纸空间的 X、Y 和 Z 延伸的最小值 

问题3:不清楚你做到什么程…

多谢提醒。
问题1我再看一下。
问题2你说的$PEXTMAX和$PEXTMIN 我看了,不过他们的数据不是太大就是太小,应该不是定义图纸尺寸的。

$PEXTMIN
 10
1.000000000000000E+20
 20
1.000000000000000E+20
 30
1.000000000000000E+20
  9
$PEXTMAX
 10
-1.000000000000000E+20
 20
-1.000000000000000E+20
 30
-1.000000000000000E+20

问题3,我还没有考虑块中的图元定义,我现在读图元都是在ENTITIES段里读的。
我还没有研究过块,因为和不熟悉autocad,咋插入块都不知道,就是直接画点、线段、圆保存为dxf格式文件,然后发现它们都在ENTITIES段里定义,然后就直接在ENTITIES里面读图元了。我也知道要是涉及块的话,读图元就没有那么简单了。现在好像越来越复杂了。。。

#14


给你提几个意见和建议:
1、看一下CAD二次开发的书, 既然你是用C++的,可以看一下讲ObjectARX的,主要看一下CAD图形的数据库结构,可以帮助你理解DXF文件结构,特别是其中的容器对像,如符号表,词典,组,扩展记录等。
2、如果你只处理ENTITIES中的几种简单实体, 那做出来的东西没什么意义, 只是把DXF组码给翻译了一下, 把其中的简单数据给直接取出来, 而没有做任何计算。 那和DXF文件又有什么区别呢?
3、你试图用INI文件的结构去表示CAD图形。  这个思路是不明智的,  同样一张图, 用DWG文件可能只要2M,  用DXF文件就要20M,  用你的INI文件在不丢失数据的情况下至少也要100M。  最重要的是: 用程序去解析这个文件的效率也是不一样的!!!!    这个我们已经试过了, 同样的图纸存成XML再打开要比直接打开DXF文件要慢上几十倍以上。
4、去处理各种版本的DXF文件的意义不太大, 关键是你能不能先处理好一个版本,  只要能处理某一个版本,  其它的版本也不会是问题。
5、我们在处理的时候遇到过一些问题, 你可能也会碰到,  给你提个醒,
首先是块,  块的信息在BLOCKS中, 内容和ENTITIES一样, 要注意的是,块是可以嵌套的。 而且标注也是块。
第二个是布局,  布局就是视图下面的TAB上写的那个模型,布局1,布局2。 布局里也是可以画实体的。
第三个是用户坐标系引起的坐标与世界坐标系不一致。
目前只想到了这些, 希望不会误导你。

#15


引用 14 楼 caozl 的回复:
给你提几个意见和建议: 
1、看一下CAD二次开发的书, 既然你是用C++的,可以看一下讲ObjectARX的,主要看一下CAD图形的数据库结构,可以帮助你理解DXF文件结构,特别是其中的容器对像,如符号表,词典,组,扩展记录等。 
2、如果你只处理ENTITIES中的几种简单实体, 那做出来的东西没什么意义, 只是把DXF组码给翻译了一下, 把其中的简单数据给直接取出来, 而没有做任何计算。 那和DXF文件又有什么区别呢? 
3、你试图用I…

非常感谢caozl兄热心帮助....
其实我做出来框架的时候也想到了这一点,就是我的程序真的只是简单把dxf文件中的图形读出来又写进了另外一个文件,细想确实和dxf文件差不多,只是省略了dxf中图形的一些细节信息而已,现在想想也是的,一涉及到BLOCKS问题就多多了,呵呵。
任重道远啊..
感谢提醒,五一要封闭自己了。继续~~~

#16


lz要干嘛?

#1


AUTOCAD的问题,建议你直接开贴问SammyLan,他们公司的东西,他应该比较清楚...

或者直接开贴骂他,质问他,他们公司的东西怎么这么垃圾...嘿嘿...

#2


引用 1 楼 fetag 的回复:
AUTOCAD的问题,建议你直接开贴问SammyLan,他们公司的东西,他应该比较清楚... 
或者直接开贴骂他,质问他,他们公司的东西怎么这么垃圾...嘿嘿...

过儿说笑了,呵呵。

#3


可以参照ini文件的读法处理此文件

#4


UP

#5


引用 3 楼 bitxinhai 的回复:
可以参照ini文件的读法处理此文件

我不是说怎么读dxf文件,读文件一点问题都没有,上面的格式就是我的程序生成的ini文件,我写成这种格式是方面后面的人使用里面的数据。
我现在问的是dxf的标题段的具体问题。

#6


你最好去官方网站上看下dxf文件的说明

#7


都是很好的建议! 值得学习

#8


引用 6 楼 dizuo 的回复:
你最好去官方网站上看下dxf文件的说明

#9


我正在做一下图形平台, 其中写了一个比较可靠的cadIO类, 可以实现你的要求
是基于cadlib做的  在Baidu上搜cadlib可以下到
关于DXF组码也有一些资料 其中比较好用的一本电子书是"AutoCAD2002 DXF参考手册.chm"
在网上也可以下到  
但是要注意的是cadlib中对于dxf文件中的块的处理, 以及用户定义坐标系的处理有问题 
要自己改一下。
 

#10


引用 9 楼 caozl 的回复:
我正在做一下图形平台, 其中写了一个比较可靠的cadIO类, 可以实现你的要求 
是基于cadlib做的  在Baidu上搜cadlib可以下到 
关于DXF组码也有一些资料 其中比较好用的一本电子书是"AutoCAD2002 DXF参考手册.chm" 
在网上也可以下到   
但是要注意的是cadlib中对于dxf文件中的块的处理, 以及用户定义坐标系的处理有问题  
要自己改一下。 
 
你说的那个电子书我也有的,就是里面对HEADER段的标题变量只有简单的说明,不太详细,其实读dxf文件的图元我倒是没有问题的,程序已经写出来了,已经可以读点、线段和圆了,现在就是加功能块了,多支持几种图形。就是对cad的坐标系不太了解。还有dxf文件HEADER段的标题变量不是太熟悉,郁闷,如果解决不了就没有办法了,按照先前的进度继续写程序了。

#11


PS:
谢谢9楼caozl兄热心帮忙~~~

#12


仔细看了一下你的问题 
问题1:对于R14以前的版本不清楚  但你可以自己用文本比较工具对比一下空图  找一下不同的地方看看

问题2:这两个值按DXF组码的说明分别是
图形的 X、Y 和 Z 延伸到右上角(在 WCS 中)
和图形的 X、Y 和 Z 延伸到左下角(在 WCS 中)

而$PEXTMAX  10, 20, 30   图纸空间的 X、Y 和 Z 延伸的最大值
 $PEXTMIN 10, 20, 30   图纸空间的 X、Y 和 Z 延伸的最小值

问题3:不清楚你做到什么程序了  举个例子吧 
对于一个插入的块的信息来说  包括了块名、插入点、比例、角度等信息 
而如果你要打的孔是在一个块里的话  就应该处理这些信息, 否则就是错的  

#13


引用 12 楼 caozl 的回复:
仔细看了一下你的问题  
问题1:对于R14以前的版本不清楚  但你可以自己用文本比较工具对比一下空图  找一下不同的地方看看 

问题2:这两个值按DXF组码的说明分别是 
图形的 X、Y 和 Z 延伸到右上角(在 WCS 中) 
和图形的 X、Y 和 Z 延伸到左下角(在 WCS 中) 

而$PEXTMAX  10, 20, 30   图纸空间的 X、Y 和 Z 延伸的最大值 
 $PEXTMIN 10, 20, 30   图纸空间的 X、Y 和 Z 延伸的最小值 

问题3:不清楚你做到什么程…

多谢提醒。
问题1我再看一下。
问题2你说的$PEXTMAX和$PEXTMIN 我看了,不过他们的数据不是太大就是太小,应该不是定义图纸尺寸的。

$PEXTMIN
 10
1.000000000000000E+20
 20
1.000000000000000E+20
 30
1.000000000000000E+20
  9
$PEXTMAX
 10
-1.000000000000000E+20
 20
-1.000000000000000E+20
 30
-1.000000000000000E+20

问题3,我还没有考虑块中的图元定义,我现在读图元都是在ENTITIES段里读的。
我还没有研究过块,因为和不熟悉autocad,咋插入块都不知道,就是直接画点、线段、圆保存为dxf格式文件,然后发现它们都在ENTITIES段里定义,然后就直接在ENTITIES里面读图元了。我也知道要是涉及块的话,读图元就没有那么简单了。现在好像越来越复杂了。。。

#14


给你提几个意见和建议:
1、看一下CAD二次开发的书, 既然你是用C++的,可以看一下讲ObjectARX的,主要看一下CAD图形的数据库结构,可以帮助你理解DXF文件结构,特别是其中的容器对像,如符号表,词典,组,扩展记录等。
2、如果你只处理ENTITIES中的几种简单实体, 那做出来的东西没什么意义, 只是把DXF组码给翻译了一下, 把其中的简单数据给直接取出来, 而没有做任何计算。 那和DXF文件又有什么区别呢?
3、你试图用INI文件的结构去表示CAD图形。  这个思路是不明智的,  同样一张图, 用DWG文件可能只要2M,  用DXF文件就要20M,  用你的INI文件在不丢失数据的情况下至少也要100M。  最重要的是: 用程序去解析这个文件的效率也是不一样的!!!!    这个我们已经试过了, 同样的图纸存成XML再打开要比直接打开DXF文件要慢上几十倍以上。
4、去处理各种版本的DXF文件的意义不太大, 关键是你能不能先处理好一个版本,  只要能处理某一个版本,  其它的版本也不会是问题。
5、我们在处理的时候遇到过一些问题, 你可能也会碰到,  给你提个醒,
首先是块,  块的信息在BLOCKS中, 内容和ENTITIES一样, 要注意的是,块是可以嵌套的。 而且标注也是块。
第二个是布局,  布局就是视图下面的TAB上写的那个模型,布局1,布局2。 布局里也是可以画实体的。
第三个是用户坐标系引起的坐标与世界坐标系不一致。
目前只想到了这些, 希望不会误导你。

#15


引用 14 楼 caozl 的回复:
给你提几个意见和建议: 
1、看一下CAD二次开发的书, 既然你是用C++的,可以看一下讲ObjectARX的,主要看一下CAD图形的数据库结构,可以帮助你理解DXF文件结构,特别是其中的容器对像,如符号表,词典,组,扩展记录等。 
2、如果你只处理ENTITIES中的几种简单实体, 那做出来的东西没什么意义, 只是把DXF组码给翻译了一下, 把其中的简单数据给直接取出来, 而没有做任何计算。 那和DXF文件又有什么区别呢? 
3、你试图用I…

非常感谢caozl兄热心帮助....
其实我做出来框架的时候也想到了这一点,就是我的程序真的只是简单把dxf文件中的图形读出来又写进了另外一个文件,细想确实和dxf文件差不多,只是省略了dxf中图形的一些细节信息而已,现在想想也是的,一涉及到BLOCKS问题就多多了,呵呵。
任重道远啊..
感谢提醒,五一要封闭自己了。继续~~~

#16


lz要干嘛?