最近做毕业设计《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
过儿说笑了,呵呵。
#3
可以参照ini文件的读法处理此文件
#4
UP
#5
我不是说怎么读dxf文件,读文件一点问题都没有,上面的格式就是我的程序生成的ini文件,我写成这种格式是方面后面的人使用里面的数据。
我现在问的是dxf的标题段的具体问题。
#6
你最好去官方网站上看下dxf文件的说明
#7
都是很好的建议! 值得学习
#8
#9
我正在做一下图形平台, 其中写了一个比较可靠的cadIO类, 可以实现你的要求
是基于cadlib做的 在Baidu上搜cadlib可以下到
关于DXF组码也有一些资料 其中比较好用的一本电子书是"AutoCAD2002 DXF参考手册.chm"
在网上也可以下到
但是要注意的是cadlib中对于dxf文件中的块的处理, 以及用户定义坐标系的处理有问题
要自己改一下。
是基于cadlib做的 在Baidu上搜cadlib可以下到
关于DXF组码也有一些资料 其中比较好用的一本电子书是"AutoCAD2002 DXF参考手册.chm"
在网上也可以下到
但是要注意的是cadlib中对于dxf文件中的块的处理, 以及用户定义坐标系的处理有问题
要自己改一下。
#10
你说的那个电子书我也有的,就是里面对HEADER段的标题变量只有简单的说明,不太详细,其实读dxf文件的图元我倒是没有问题的,程序已经写出来了,已经可以读点、线段和圆了,现在就是加功能块了,多支持几种图形。就是对cad的坐标系不太了解。还有dxf文件HEADER段的标题变量不是太熟悉,郁闷,如果解决不了就没有办法了,按照先前的进度继续写程序了。
#11
PS:
谢谢9楼caozl兄热心帮忙~~~
谢谢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:不清楚你做到什么程序了 举个例子吧
对于一个插入的块的信息来说 包括了块名、插入点、比例、角度等信息
而如果你要打的孔是在一个块里的话 就应该处理这些信息, 否则就是错的
问题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
多谢提醒。
问题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。 布局里也是可以画实体的。
第三个是用户坐标系引起的坐标与世界坐标系不一致。
目前只想到了这些, 希望不会误导你。
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
非常感谢caozl兄热心帮助....
其实我做出来框架的时候也想到了这一点,就是我的程序真的只是简单把dxf文件中的图形读出来又写进了另外一个文件,细想确实和dxf文件差不多,只是省略了dxf中图形的一些细节信息而已,现在想想也是的,一涉及到BLOCKS问题就多多了,呵呵。
任重道远啊..
感谢提醒,五一要封闭自己了。继续~~~
#16
lz要干嘛?
#1
AUTOCAD的问题,建议你直接开贴问SammyLan,他们公司的东西,他应该比较清楚...
或者直接开贴骂他,质问他,他们公司的东西怎么这么垃圾...嘿嘿...
或者直接开贴骂他,质问他,他们公司的东西怎么这么垃圾...嘿嘿...
#2
过儿说笑了,呵呵。
#3
可以参照ini文件的读法处理此文件
#4
UP
#5
我不是说怎么读dxf文件,读文件一点问题都没有,上面的格式就是我的程序生成的ini文件,我写成这种格式是方面后面的人使用里面的数据。
我现在问的是dxf的标题段的具体问题。
#6
你最好去官方网站上看下dxf文件的说明
#7
都是很好的建议! 值得学习
#8
#9
我正在做一下图形平台, 其中写了一个比较可靠的cadIO类, 可以实现你的要求
是基于cadlib做的 在Baidu上搜cadlib可以下到
关于DXF组码也有一些资料 其中比较好用的一本电子书是"AutoCAD2002 DXF参考手册.chm"
在网上也可以下到
但是要注意的是cadlib中对于dxf文件中的块的处理, 以及用户定义坐标系的处理有问题
要自己改一下。
是基于cadlib做的 在Baidu上搜cadlib可以下到
关于DXF组码也有一些资料 其中比较好用的一本电子书是"AutoCAD2002 DXF参考手册.chm"
在网上也可以下到
但是要注意的是cadlib中对于dxf文件中的块的处理, 以及用户定义坐标系的处理有问题
要自己改一下。
#10
你说的那个电子书我也有的,就是里面对HEADER段的标题变量只有简单的说明,不太详细,其实读dxf文件的图元我倒是没有问题的,程序已经写出来了,已经可以读点、线段和圆了,现在就是加功能块了,多支持几种图形。就是对cad的坐标系不太了解。还有dxf文件HEADER段的标题变量不是太熟悉,郁闷,如果解决不了就没有办法了,按照先前的进度继续写程序了。
#11
PS:
谢谢9楼caozl兄热心帮忙~~~
谢谢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:不清楚你做到什么程序了 举个例子吧
对于一个插入的块的信息来说 包括了块名、插入点、比例、角度等信息
而如果你要打的孔是在一个块里的话 就应该处理这些信息, 否则就是错的
问题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
多谢提醒。
问题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。 布局里也是可以画实体的。
第三个是用户坐标系引起的坐标与世界坐标系不一致。
目前只想到了这些, 希望不会误导你。
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
非常感谢caozl兄热心帮助....
其实我做出来框架的时候也想到了这一点,就是我的程序真的只是简单把dxf文件中的图形读出来又写进了另外一个文件,细想确实和dxf文件差不多,只是省略了dxf中图形的一些细节信息而已,现在想想也是的,一涉及到BLOCKS问题就多多了,呵呵。
任重道远啊..
感谢提醒,五一要封闭自己了。继续~~~
#16
lz要干嘛?