千里之行,始于足下

酌贪泉而觉爽,处涸辙而犹欢

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  最近要做一个CAD的插件,因为以前没有做过,十分费劲。这不,遇上了一个很奇怪的问题,折腾了一下午,到现在也没解决。

  想法是这样的:我在一个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

  从程序的执行结果来看,一直到 newBlockReferenceIdIterator 都是成功的。然而迭代过程却总是无法开始,实在是非常奇怪。而从作为源文件的dwg文件来看,应当是可以取到数据的。以下是dwg文件信息截图:


  可以看到块定义和块引用都是正确的。但是程序中却无法通过 AcDbBlockReferenceIdIterator 取到任何引用信息?这是为什么呢?
posted on 2006-05-11 23:28  sunwaywei  阅读(1738)  评论(4编辑  收藏  举报