yebeans 发表于 2008-5-15 13:56:00

AcDbDatabase从dwg文件读取数据后,获取图像范围错误如何解决?

<p>用一个AcDbDatabase从dwg文件中读取数据,然后计算这个dwg图形的包围框。</p><p>原来是打开块表之后用AcDbExtents::addBlockExt,但是统计的相当不准确。</p><p>后来改成AcDbDatabase::extmax 和AcDbDatabase::extmin就很准确了。</p><p>但是有些图形(可能是什么软件自动生成的)用这种方法获取的就是空数据的范围(1.0000E20),但是用AutoCAD打开的话,执行extmin和extmax获取系统常量的数值却又是对的~之前加了AcDbDatabase::updateExt也没有效果。有没有什么办法通过arx更新数据库的extmin和extmax常量?</p>

hbird 发表于 2008-5-15 16:42:00

将源代码粘出来吧

yebeans 发表于 2008-5-15 17:16:00

代码简化一下就是下面这样。主要可能也跟数据有关,可能是什么软件生成的dwg,然后没有记录extmax和extmin常量,怎么统计或者更新这个常量?
{
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();
}

yebeans 发表于 2008-5-15 17:48:00

<p>补充一点:就是那个图如果用CAD打开另存之后就能获得正确的extmax和extmin,应该是做了什么处理,找了很多资料也没有解决。</p><p>因为数据很多,也不可能每张都用CAD去另存一下,不知道arx能不能处理好~</p>

hbird 发表于 2008-5-20 17:46:00

<p>我测试过你的代码</p><p>能够得出正确坐标</p><p>acdbCurDwg()-&gt;updateExt();&nbsp;&nbsp;&nbsp; <br/>AcGePoint3d minPt = acdbCurDwg()-&gt;extmin() ;<br/>AcGePoint3d maxPt = acdbCurDwg()-&gt;extmax() ;<br/>(R14的代码,和你的差不多)</p><p>如果注释掉updateExt这个方法,结果和你的一样.所以你先检查一下updateExt执行结果.</p><p>另外,方法二取得的坐标值是不对的,原因我没有深究.</p><p>PS:你插入的是一个空的DWG文件吗?如果是,换一个试试</p>

yebeans 发表于 2008-5-21 13:42:00

<p>多谢楼上。</p><p>问题就是我的那些图,不是空图,但是用原始图形无法获取正确边界,如果用CAD打开就可以获取到正确的,另存以后也可以。但是不知道为什么会这样。</p><p>用CAD存的图一般不调用updateExt也没有问题。都能获得正确的结果。应该是CAD统计更新了extmax和extmin.不知道它是怎么统计的。</p>
页: [1]
查看完整版本: AcDbDatabase从dwg文件读取数据后,获取图像范围错误如何解决?