天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 71|回复: 0

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

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
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);
}

 

 

 

 

objectARx实现多个实体的拖动效果
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 11:40 , Processed in 0.146860 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表