- UID
- 84199
- 积分
- 71
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2003-10-5
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
由于原来的那个帖子我不能继续回复,只好再贴一个
这是一个完整的测试函数,大家自己定义一个命令就可以了;
注意:
画的多一线(多边形)尺寸近两大一点,因为最大便宜距离达到了40。
定点的横坐标都大于10000;可以先画一个,然后移动到(10000,0)
得到的结果:一条在原位置,三条在原点附近
预期的结果是:四条线得位置应该在原位置
[program]
void testPlOffset()
{
AcDbEntity* ent=NULL;
ads_name en;
ads_point pt;
int rc = acedEntSel("\nPlease select Pline:", en, pt);
if (rc != RTNORM) {
acutPrintf("\nNothing selected.");
return ;
}
AcDbObjectId eId=NULL;
acdbGetObjectId(eId, en);
acdbOpenObject(ent, eId, kForWrite);
//acdbOpenObject(ent, eId, kForRead);
//上面打开状态只能为kForWrite,如果是kForRead,则在运行时出错
//根据getOffsetCurves的声明,打开状态设为kForRead应该是可以的
if(ent==NULL)
return;
AcDbPolyline* pl=NULL;
pl=AcDbPolyline::cast(ent);
if(pl==NULL)
{
ent->close();
acutPrintf("\npl NUll");
return;
}
AcDbExtents ext;
pl->getGeomExtents(ext);
//把这个判断注释掉,可以测试一般位置的多一线,横坐标小雨9600的运行结果正常与预期结果相同(这个横坐标边界我没法确定)
if(ext.minPoint().x<10000)
{
acutPrintf("\nPosion error!");
pl->close();
return;
}
AcDbVoidPtrArray vs02,vd04,vd03;
AcDbPolyline* pls02=NULL;
AcDbPolyline* pld04=NULL;
AcDbPolyline* pld03=NULL;
AcDbEntity* ent1=NULL;
pl->getOffsetCurves(30,vd04);
pl->getOffsetCurves(20,vd03);
pl->getOffsetCurves(10,vs02);
AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
AcDbBlockTable *pBlockTable;
pDb->getBlockTable(pBlockTable, AcDb::kForRead);
AcDbBlockTableRecord *pBlockRec;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockRec, AcDb::kForWrite);
AcDbObjectId objId;
if(vd04.length()!=0)
{
pld04=AcDbPolyline::cast((AcDbEntity*)vd04.first());
if(pld04!=NULL)
{
pBlockRec->appendAcDbEntity(objId, pld04);
pld04->close();
}
for(int i=1;i<vd04.length();i++)
{
ent1=(AcDbEntity*)vd04.at(i);
delete ent1;
}
}
if(vd03.length()!=0)
{
pld03=AcDbPolyline::cast((AcDbEntity*)vd03.first());
if(pld03!=NULL)
{
pBlockRec->appendAcDbEntity(objId, pld03);
pld03->close();
}
for(int i=1;i<vd03.length();i++)
{
ent1=(AcDbEntity*)vd03.at(i);
delete ent1;
}
}
if(vs02.length()!=0)
{
pls02=AcDbPolyline::cast((AcDbEntity*)vs02.first());
if(pls02!=NULL)
{
pBlockRec->appendAcDbEntity(objId, pls02);
pls02->close();
}
for(int i=1;i<vs02.length();i++)
{
ent=(AcDbEntity*)vs02.at(i);
delete ent;
}
}
pl->close();
pBlockRec->close();
pBlockTable->close();
}
[/program] |
|