- UID
- 281509
- 积分
- 1054
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2005-6-21
- 最后登录
- 1970-1-1
|
发表于 2006-7-6 22:46:22
|
显示全部楼层
提供一个参考程序,自己去研究
Adesk::Boolean WJRedGeFun::SelectByWin(AcGePoint3d winPt1, AcGePoint3d winPt2,
AcDbObjectIdArray &IDarrys, int entStyle,
BOOL isByWin)
{
int ret; //选择是否成功
long setLen; //选择集的长度
char sbuf[10]; //选择实体的类型
ads_name ssname,eName; //选择集的名称
struct resbuf rb; //选择集的过滤条件链表
AcDbObjectId eId;
rb.restype=0;
switch(entStyle)
{
case 0://选择所有实体
break;
case 1://选择直线实体
strcpy(sbuf,"WJREDLINE");
rb.resval.rstring=sbuf;
rb.rbnext=NULL;
break;
case 2://选择曲线实体
strcpy(sbuf,"WJREDSPLINE");
rb.resval.rstring=sbuf;
rb.rbnext=NULL;
break;
case 3://选择矩形
strcpy(sbuf,"WJREDRECTANGLE");
rb.resval.rstring=sbuf;
rb.rbnext=NULL;
break;
case 4://选择点
strcpy(sbuf,"WJREDPOINT");
rb.resval.rstring=sbuf;
rb.rbnext=NULL;
break;
case 5://选择圆
strcpy(sbuf,"WJREDCIRCLE");
rb.resval.rstring=sbuf;
rb.rbnext=NULL;
break;
case 6://文字
strcpy(sbuf,"WJREDMTEXT");
rb.resval.rstring=sbuf;
rb.rbnext=NULL;
break;
//以下为组合选择
case 101://选择直线、矩形
rb=*acutBuildList(-4,"<or",RTDXF0,"WJREDLINE",
RTDXF0,"WJREDRECTANGLE",
-4,"or>",0);
break;
case 102://选择直线、矩形和曲线实体
rb=*acutBuildList(-4,"<or",RTDXF0,"WJREDLINE",
RTDXF0,"WJREDRECTANGLE",
RTDXF0,"WJREDSPLINE",
-4,"or>",0);
break;
case 103://选择直线/矩形/曲线/点/圆实体
rb=*acutBuildList(-4,"<or",RTDXF0,"WJREDLINE",
RTDXF0,"WJREDRECTANGLE",
RTDXF0,"WJREDSPLINE",
RTDXF0,"WJREDPOINT",
RTDXF0,"WJREDCIRCLE",
-4,"or>",0);
break;
default://退出系统选择失败
return Adesk::kFalse;
}
if(isByWin)
{
if(entStyle>0)
ret=acedSSGet("W",asDblArray(winPt1),asDblArray(winPt2),&rb,ssname);
else
ret=acedSSGet("W",asDblArray(winPt1),asDblArray(winPt2),NULL,ssname);
}
else
{
if(entStyle>0)
ret=acedSSGet("C",asDblArray(winPt1),asDblArray(winPt2),&rb,ssname);
else
ret=acedSSGet("C",asDblArray(winPt1),asDblArray(winPt2),NULL,ssname);
}
if(ret!=RTNORM) return Adesk::kFalse; //退出系统选择失败
acedSSLength(ssname,&setLen);
for(int i=0;i<setLen;i++)
{
acedSSName(ssname,i,eName);
acdbGetObjectId(eId,eName);
IDarrys.append(eId);
}
acedSSFree(ssname);
return Adesk::kTrue;
} |
|