最近要做一个CAD的插件,因为以前没有做过,十分费劲。这不,遇上了一个很奇怪的问题,折腾了一下午,到现在也没解决。
想法是这样的:我在一个dwg文件里定义了一个块,并且已经在模型空间里被引用了一次以上。我想通过程序找到每一个引用,输出它们的位置和缩放比率。相关程序如下:
从程序的执行结果来看,一直到 newBlockReferenceIdIterator 都是成功的。然而迭代过程却总是无法开始,实在是非常奇怪。而从作为源文件的dwg文件来看,应当是可以取到数据的。以下是dwg文件信息截图:
可以看到块定义和块引用都是正确的。但是程序中却无法通过 AcDbBlockReferenceIdIterator 取到任何引用信息?这是为什么呢?
想法是这样的:我在一个dwg文件里定义了一个块,并且已经在模型空间里被引用了一次以上。我想通过程序找到每一个引用,输出它们的位置和缩放比率。相关程序如下:
1if ((es = acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead)) == Acad::eOk)
2{
3 if ((es = pBlockTable->getAt(blockname, pBlockRecord, AcDb::kForRead)) == Acad::eOk)
4 {
5 ads_printf("pBlockTable->getAt()成功。\n"); //for test
6
7 AcDbBlockReferenceIdIterator* pIter;
8 if (pBlockRecord->newBlockReferenceIdIterator(pIter) == Acad::eOk)
9 {
10 ads_printf("pBlockRecord->newBlockReferenceIdIterator()成功。\n"); //for test
11 for (pIter->start(); !pIter->done(); pIter->step())
12 {
13 ads_printf("迭代中。\n"); //for test
14 AcDbBlockReference* pBlockRef = NULL;
15 if (pIter->getBlockReference(pBlockRef, AcDb::kForRead) == Acad::eOk)
16 {
17 i++;
18 ads_printf("第%d个图:", i);
19 AcGePoint3d pos = pBlockRef->position();
20 ads_printf("位置(%f,%f),", pos[0], pos[1]);
21 AcGeScale3d scale = pBlockRef->scaleFactors();
22 ads_printf("缩放因子(%f,%f)\n", scale[0], scale[1]);
23 }
24 }
25 delete pIter;
26 }
27 pBlockRecord->close();
28 }
29 pBlockTable->close();
30}
31
2{
3 if ((es = pBlockTable->getAt(blockname, pBlockRecord, AcDb::kForRead)) == Acad::eOk)
4 {
5 ads_printf("pBlockTable->getAt()成功。\n"); //for test
6
7 AcDbBlockReferenceIdIterator* pIter;
8 if (pBlockRecord->newBlockReferenceIdIterator(pIter) == Acad::eOk)
9 {
10 ads_printf("pBlockRecord->newBlockReferenceIdIterator()成功。\n"); //for test
11 for (pIter->start(); !pIter->done(); pIter->step())
12 {
13 ads_printf("迭代中。\n"); //for test
14 AcDbBlockReference* pBlockRef = NULL;
15 if (pIter->getBlockReference(pBlockRef, AcDb::kForRead) == Acad::eOk)
16 {
17 i++;
18 ads_printf("第%d个图:", i);
19 AcGePoint3d pos = pBlockRef->position();
20 ads_printf("位置(%f,%f),", pos[0], pos[1]);
21 AcGeScale3d scale = pBlockRef->scaleFactors();
22 ads_printf("缩放因子(%f,%f)\n", scale[0], scale[1]);
23 }
24 }
25 delete pIter;
26 }
27 pBlockRecord->close();
28 }
29 pBlockTable->close();
30}
31
从程序的执行结果来看,一直到 newBlockReferenceIdIterator 都是成功的。然而迭代过程却总是无法开始,实在是非常奇怪。而从作为源文件的dwg文件来看,应当是可以取到数据的。以下是dwg文件信息截图:
可以看到块定义和块引用都是正确的。但是程序中却无法通过 AcDbBlockReferenceIdIterator 取到任何引用信息?这是为什么呢?