![]() |
【转帖】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. |