|
objectARx实现多个实体的拖动效果
在AutoCAD的二次开发中,如何才能实现多个实体的拖动效果呢? 通常情况下,在ObjectARX中可以通过派生AcEdJig类来实现拖动过程。由于AcEdJig::entity()只能返回单个实体的指针,需要用户自定义的一个实体类。本文介绍通过构造选择集的方式实现预期效果。本人学艺不精,在此只是分享一下个人项目中的一点经验,不对之处请斧正。废话少说,上代码:
//函数声明
int dragfunc(ads_point usrpt,ads_matrix matrix); //回调函数
void ucs2wcs(ads_point pt);//用户坐标和世界坐标之间的转换
void redrawEntity(ads_name& pickset,bool isRedraw = false);//隐藏或重绘entities
//将entities加入选择集
bool addEntities2Pickset(AcDbObjectIdArray &entIds,ads_name& pickset)
{
int len=entIds.length();
if(len<=0)
return false;
for(int i=0;i<len;i++)
{
ads_name entname;
acdbGetAdsName(entname,entIds[i]); //获取实体名
acedSSAdd(entname,pickset,pickset);//加入选择集
acedSSFree(entname);//注意释放对象
}
return true;
}
//将初始化矩阵
void ident_init(ads_matrix mat)
{
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
{
if(i==j)
mat[i][j]=1.0;
else
mat[i][j]=0.0;
}
}
//创建多个实体的拖动效果,输入参数为拖动实体的id,此处为多个
bool CreatDragEntities(AcDbObjectIdArray &entIds)
{
if(entIds.length() <= 0)
return false;
ads_name pickset;
acedSSAdd(NULL,NULL,pickset);//构造空选择集
if(!addEntities2Pickset(EntIds,pickset))//将实体装入选择集
{
acedSSFree(pickset);
return false;
}
ads_matrix mat;
ident_init(mat);//初始化为单位矩阵
//ads_point rpt;
//memset(rpt,0x0,sizeof(ads_real)*3);//初始化
ads_point endpt;
redrawEntity(pickset);//隐藏实体
int rt=acedDragGen(pickset,_T("\n选择插入点(enter原点):"),2,dragfunc,endpt);
if(rt==RTNONE)//没有选取点
{
acedPrompt(_T("原点插入\n"));
redrawEntity(pickset,true);
acedSSFree(pickset);
return false;
}
if(rt!=RTNORM)//选取失败
{
acedSSFree(pickset);
return false;
}
mat[0][T]=endpt[X];
mat[1][T]=endpt[Y];
mat[2][T]=endpt[Z];
acedXformSS(pickset,mat);
redrawEntity(pickset,true);
acedSSFree(pickset);
return true;
}
void redrawEntity(ads_name& pickset,bool isRedraw = false) //重绘实体
{
long len=0;
acedSSLength(pickset,&len);
int drawParam = isRedraw ? 1 : 2;
for(int i=0;i<len;i++)
{
ads_name ent;
acedSSName(pickset,i,ent);
acedRedraw(ent,drawParam);
acedSSFree(ent);
}
}
int dragfunc(ads_point usrpt,ads_matrix matrix)
{
ident_init(matrix);
ucs2wcs(usrpt);
matrix[0][T]=usrpt[X];
matrix[1][T]=usrpt[Y];
matrix[2][T]=usrpt[Z];
return RTNORM;
}
void ucs2wcs(ads_point pt)
{
struct resbuf fromrb,torb;
fromrb.restype=RTSHORT;
fromrb.resval.rint=1;
torb.restype=RTSHORT;
torb.resval.rint=0;
acedTrans(pt,&fromrb,&torb,FALSE,pt);
}
ads_name ss;
if (acedSSGet(NULL , NULL , NULL , NULL , ss) != RTNORM) {return;}
AcDbObjectIdArray EntIds=SSToIds(ss);
CreatDragEntities(EntIds); |
|