几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量

几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 (http://www.dimcax.com/hust/index.php)
-   ObjectARX(C++) (http://www.dimcax.com/hust/forumdisplay.php?f=34)
-   -   【转帖】acdbdatabase从dwg文件读取数据后,获取图像范围错误如何解决? (http://www.dimcax.com/hust/showthread.php?t=6059)

yang686526 2009-04-14 02:47 PM

【转帖】acdbdatabase从dwg文件读取数据后,获取图像范围错误如何解决?
 
acdbdatabase从dwg文件读取数据后,获取图像范围错误如何解决?
acdbdatabase从dwg文件读取数据后,获取图像范围错误如何解决?
用一个acdbdatabase从dwg文件中读取数据,然后计算这个dwg图形的包围框。
原来是打开块表之后用acdbextents::addblockext,但是统计的相当不准确。
后来改成acdbdatabase::extmax 和acdbdatabase::extmin就很准确了。
但是有些图形(可能是什么软件自动生成的)用这种方法获取的就是空数据的范围(1.0000e20),但是用autocad打开的话,执行extmin和extmax获取系统常量的数值却又是对的~之前加了acdbdatabase::updateext也没有效果。有没有什么办法通过arx更新数据库的extmin和extmax常量?
将源代码粘出来吧
代码简化一下就是下面这样。主要可能也跟数据有关,可能是什么软件生成的dwg,然后没有记录extmax和extmin常量,怎么统计或者更新这个常量?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24{
acgepoint3d ptmin ,ptmax ;
acdbdatabase* pdb = new acdbdatabase(adesk::kfalse);
acad::errorstatus es = pdb->readdwgfile(strdwgfile) ;
if ( es != acad::eok) {
return ereadfilefail;
}
//方法1:这里的ptmin 为 1.00000e20,ptmax为-1.000000e19。
pdb->updateext(true);
ptmin = pdb->extmin();
ptmax = pdb->extmax();
//方法2:打开块表计算包围框。
acdbblocktable *pblocktable;
pdb->getsymboltable(pblocktable, acdb::kforwrite);
pblocktable->getat(acdb_model_space, pblocktablerecord, acdb::kforwrite);
pblocktable->close();
acdbextents extent;
extent.addblockext(pblocktablerecord);
ptmin = extent.minpoint();
ptmax = extent.maxpoint();
}
补充一点:就是那个图如果用cad打开另存之后就能获得正确的extmax和extmin,应该是做了什么处理,找了很多资料也没有解决。
因为数据很多,也不可能每张都用cad去另存一下,不知道arx能不能处理好~
我测试过你的代码
能够得出正确坐标
acdbcurdwg()->updateext();
acgepoint3d minpt = acdbcurdwg()->extmin() ;
acgepoint3d maxpt = acdbcurdwg()->extmax() ;
(r14的代码,和你的差不多)
如果注释掉updateext这个方法,结果和你的一样.所以你先检查一下updateext执行结果.
另外,方法二取得的坐标值是不对的,原因我没有深究.
ps:你插入的是一个空的dwg文件吗?如果是,换一个试试
多谢楼上。
问题就是我的那些图,不是空图,但是用原始图形无法获取正确边界,如果用cad打开就可以获取到正确的,另存以后也可以。但是不知道为什么会这样。
用cad存的图一般不调用updateext也没有问题。都能获得正确的结果。应该是cad统计更新了extmax和extmin.不知道它是怎么统计的。


所有的时间均为北京时间。 现在的时间是 04:44 PM.