objectARx实现多个实体的拖动效果

来源:互联网 发布:激光切割机编程软件 编辑:程序博客网 时间:2024/04/29 13:10

 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);
}

ps:本文只是示意过程,对部分返回值和输入参数未做检查。