最近要做一个CAD的插件,因为以前没有做过,十分费劲。这不,遇上了一个很奇怪的问题,折腾了一下午,到现在也没解决。
想法是这样的:我在一个dwg文件里定义了一个块,并且已经在模型空间里被引用了一次以上。我想通过程序找到每一个引用,输出它们的位置和缩放比率。相关程序如下:
从程序的执行结果来看,一直到 newBlockReferenceIdIterator 都是成功的。然而迭代过程却总是无法开始,实在是非常奇怪。而从作为源文件的dwg文件来看,应当是可以取到数据的。以下是dwg文件信息截图:
可以看到块定义和块引用都是正确的。但是程序中却无法通过 AcDbBlockReferenceIdIterator 取到任何引用信息?这是为什么呢?
想法是这样的:我在一个dwg文件里定义了一个块,并且已经在模型空间里被引用了一次以上。我想通过程序找到每一个引用,输出它们的位置和缩放比率。相关程序如下:
1
if ((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
if ((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 test6

7
AcDbBlockReferenceIdIterator* pIter;8
if (pBlockRecord->newBlockReferenceIdIterator(pIter) == Acad::eOk)9
{10
ads_printf("pBlockRecord->newBlockReferenceIdIterator()成功。\n"); //for test11
for (pIter->start(); !pIter->done(); pIter->step())12
{13
ads_printf("迭代中。\n"); //for test14
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 取到任何引用信息?这是为什么呢?



浙公网安备 33010602011771号