- UID
- 637905
- 积分
- 5
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2008-7-10
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
为了获得填充区域的边界,我试写了一个最简单的测试函数,测试图为,一个多义线构成的四边形填充区,其中倘若我只声明AcGePoint2dArray vertices;不对这个数组做任何额外的操作,调用 pHatch->getLoopAt(i,loopType,vertices,bluges);
我可以获得vertices值,但是程序继续运行,当HatchTransit()
运行结束时,弹出个对话框:Windows已在acad.exe上触发断点........程序就挂了。 再不断测试中,无意中,我给AcGePoint2dArray vertices,vertices中添加了一个对象(pt1),继续pHatch->getLoopAt(i,loopType,vertices,bluges);
程序运行正常,并正常结束。
虽然这样,让我再取填充边界时,索引直接从1开始就可以,但是这个奇怪的问题困扰了整整一个星期,请问哪位高手能给我指明问题的根结所在?我应该如何解决?是否是我的程序有问题?
谢谢
void HatchTransit()
{
AcDbDatabase *pDb = new AcDbDatabase(Adesk::kFalse);
CString DwgFilePath = L"C:\\5.dwg";
wchar_t *fDwgName = DwgFilePath.GetBuffer(DwgFilePath.GetLength() + 1);
pDb->readDwgFile(fDwgName);
AcDbBlockTable *pBT;
pDb->getSymbolTable(pBT,AcDb::kForRead);
AcDbBlockTableRecord *pBTR;
pBT->getAt(ACDB_MODEL_SPACE,pBTR,AcDb::kForRead);
pBT->close();
AcDbBlockTableRecordIterator *pBtRItr;
pBTR->newIterator(pBtRItr);
for (pBtRItr->start();!pBtRItr->done();pBtRItr->step())
{
AcDbEntity *pEntity;
pBtRItr->getEntity(pEntity,AcDb::kForRead);
const ACHAR* pEntName = (pEntity->isA())->name();
if (wcscmp(pEntName,_T("AcDbHatch")) == 0)
{
AcDbHatch *pHatch = AcDbHatch::cast(pEntity);
int iLoopNum = pHatch->numLoops();
AcGeVoidPointerArray edgePtrs;
AcGeIntArray edgetypes;
AcGePoint2dArray vertices;
AcGeDoubleArray bluges;
Adesk::Int32 loopType;
for (int i= 0; i<iLoopNum;i++)
{
loopType = pHatch->loopTypeAt(i);
AcGePoint2d pt1(2,3);//测试部分
vertices.append(pt1);
if (loopType & AcDbHatch::kPolyline)
{
pHatch->getLoopAt(i,loopType,vertices,bluges);
for (int m = 1;m<vertices.logicalLength();m++)
{
AcGePoint2d pt(vertices.at(m).x,vertices.at(m).y);
}
}
else
{
pHatch->getLoopAt(i,loopType,edgePtrs,edgetypes);
}
}
}
pEntity->close();
}
delete pBtRItr;
pBTR->close();
delete pDb;
} |
|