取得选择集包围盒
本帖最后由 chpmould 于 2011-6-18 16:57 编辑这是我在网上下载的一个[取得选择集包围盒]子程序,调试不能通过,请高手帮看看是什么原因
BOOL GetSSExtents(ads_name ss, ads_point &maxpt, ads_point &minpt)
{
long len;
int ret=ads_sslength(ss,&len);
if(ret!=RTNORM||len<1) return FALSE;
AcDbObjectId objId;
ads_name ename;
AcDbEntity *pEnt;
AcDbExtents extent;
AcGePoint3d pt1,pt2;
ads_ssname (ss, 0, ename);
acdbGetObjectId(objId,ename);
acdbOpenObject(pEnt,objId,AcDb::kForRead);
pEnt->getGeomExtents(extent);
pt1=extent.maxPoint();
pt2=extent.minPoint();
pEnt->close();
//主要是这里调试不能通过,请帮看看是什么原因
for(int i=0;igetGeomExtents(extent);
if(pt1extent.minPoint()||pt2>extent.minPoint())
pt2=extent.minPoint();
//主要是这里调试不能通过,请帮看看是什么原因
pEnt->close();
}
maxpt=pt1;
maxpt=pt1;
maxpt=pt1;
minpt=pt2;
minpt=pt2;
minpt=pt2;
return TRUE;
}
楼主的代码都抄的错误百出。
这里给出修改后的。以后说不定也可以用的着。
Acad::ErrorStatus GetSSExtents(ads_name ss, ads_point &maxpt, ads_point &minpt)
{
long len;
int ret=ads_sslength(ss,&len);
if(ret!=RTNORM || len<1)
return Acad::eInvalidInput;
maxpt= LDBL_MAX;
//maxpt= LDBL_MAX;
//maxpt= LDBL_MAX;
//minpt= LDBL_MIN;
//minpt= LDBL_MIN;
//maxpt= LDBL_MIN;
AcDbObjectId objId;
ads_name ename;
AcDbEntity *pEnt=NULL;
AcDbExtents extent;
AcGePoint3d pt1,pt2;
for (long i = 0;i < len;i++)
{
if (acedSSName(ss, i, ename) != RTNORM || \
acdbGetObjectId(objId,ename) !=Acad::eOk || \
acdbOpenObject(pEnt,objId,AcDb::kForRead) !=Acad::eOk || \
pEnt->getGeomExtents(extent) !=Acad::eOk)
{
continue;
}
pt1=extent.maxPoint();
pt2=extent.minPoint();
pEnt->close();
if (maxpt==LDBL_MAX)
{
maxpt=pt1.x;
maxpt=pt1.y;
maxpt=pt1.z;
minpt=pt2.x;
minpt=pt2.y;
minpt=pt2.z;
}
//下面的段应该写成函数的,太啰嗦了。
if (pt1.x > maxpt) maxpt=pt1.x;
if (pt1.y > maxpt) maxpt=pt1.y;
if (pt1.z > maxpt) maxpt=pt1.z;
if (pt2.x < minpt) minpt=pt2.x;
if (pt2.y < minpt) minpt=pt2.y;
if (pt2.z < minpt) minpt=pt2.z;
}
return Acad::eOk;
}
本帖最后由 highflybird 于 2011-6-18 22:42 编辑
回复 chpmould 的帖子
简单的测试代码:
ads_name sel;
int ret=acedSSGet(NULL,NULL,NULL,NULL,sel);
if( ret!=RTNORM)
{
acedSSFree(sel);
return;
}
ads_point maxpt,minpt;
if (GetSSExtents(sel,maxpt,minpt) != Acad::eOk)
{
acutPrintf(_T("\n获取失败,请检查选择集!"));
return;
}
acedGrDraw(minpt,maxpt,1,1); highflybird 发表于 2011-6-18 22:40 static/image/common/back.gif
楼主的代码都抄的错误百出。
这里给出修改后的。以后说不定也可以用的着。
非常感谢你的指导和热心,我再去试试
页:
[1]