chpmould 发表于 2011-6-18 16:57:04

取得选择集包围盒

本帖最后由 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;
}

highflybird 发表于 2011-6-18 22:40:55

楼主的代码都抄的错误百出。

这里给出修改后的。以后说不定也可以用的着。

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:09

本帖最后由 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);

chpmould 发表于 2011-6-19 09:11:49

highflybird 发表于 2011-6-18 22:40 static/image/common/back.gif
楼主的代码都抄的错误百出。

这里给出修改后的。以后说不定也可以用的着。

非常感谢你的指导和热心,我再去试试
页: [1]
查看完整版本: 取得选择集包围盒