找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2546|回复: 5

[ARX函数]:acedDragGen与AcedJig类讨论

[复制链接]
发表于 2006-3-9 20:30:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
贴上一个acedDragGen 的例子,后面有AcedJig的例子,都是拖动多个实体的例子。希望有高手来发表高见。此程序有很多Bug如没有判断用户输入等。
ads_name ss;
int gen(0);
ads_point bp;
void ident_init(ads_matrix id)
{
int i, j;
for (i = 0; i <= 3; i ++)
  for (j = 0; j <= 3; j ++)
   id[j] = 0.0;
for (i = 0; i <= 3; i ++)
  id = 1.0;
}

void ucs2wcs(ads_point pt)
{
        struct resbuf fromrb, torb;
        fromrb.restype = RTSHORT;
        fromrb.resval.rint = 1; // UCS  

        torb.restype = RTSHORT;
        torb.resval.rint = 0; //WCS
       
        acedTrans(pt, &fromrb, &torb, FALSE, pt);
        return;
}
int dragfunc(ads_point usrpt, ads_matrix matrix)
{
        //隐藏原来的实体
        if(gen ==0)
        {
                long len=0;
                acedSSLength(ss,&len);
                for(long i=0;i<len;i++)
                {
                        ads_name ent;
                        acedSSName(ss,i,ent);
                        acedRedraw(ent,2);
                }
        }
        ucs2wcs(usrpt);
        matrix[0][T] = usrpt[X] - bp[X];
        matrix[1][T] = usrpt[Y] - bp[Y];
        matrix[2][T] = usrpt[Z] - bp[Z];
        return RTNORM;
}

// ----- DragGen._MyDragGen command (do not rename)
        static void DragGen_MyDragGen(void)
        {
                // Add your code for command DragGen._MyDragGen here
                ads_point rpt;
                acedSSGet(NULL,NULL,NULL,NULL, ss);
                acedGetPoint(NULL,"\n选择基点:",bp);
                ucs2wcs(bp);
                int rt = acedDragGen(ss, "\n选择插入点:", 0, dragfunc, rpt);
                if(rt==RTNORM||rt==RTCAN)
                {
                        ucs2wcs(rpt);
                        ads_matrix mat;
                        ident_init(mat);
                        mat[0][T] = rpt[X] - bp[X];
                        mat[1][T] = rpt[Y] - bp[Y];
                        mat[2][T] = rpt[Z] - bp[Z];
                        acedXformSS(ss,mat);
                }
                gen = 0;

                acedSSFree(ss);
        }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-3-19 00:32:07 | 显示全部楼层
此程序实现了最基本的拖动方式,但ucs2wcs函数已经有标准的arx函数
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-23 22:25:58 | 显示全部楼层
应加入事务控制,保证临时加入实体在用户取消绘制时可以完全取消绘制
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-26 12:34:08 | 显示全部楼层
谢谢,我觉得添加事务控制这个建议很好!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-4-19 15:59:32 | 显示全部楼层
添加事务处理有用吗,好像用不上呀,我觉得dragfunc应改为下面这样,否则按Esc键会将实体隐藏。
void DragGen(void)
{
        // Add your code for command DragGen._MyDragGen here
        ads_point rpt;
       

        acedSSGet(NULL,NULL,NULL,NULL, ss);
       
        acedGetPoint(NULL,"\n选择基点:",bp);
       
        ucs2wcs(bp);
       
//        typedef int (*scnf) (ads_point, ads_matrix);

        int rt = acedDragGen(ss, "\n选择插入点:", 0, dragfunc, rpt);
       
        switch(rt)
        {
        case RTCAN:
                {
                        long len=0;
                       
                        acedSSLength(ss,&len);
                       
                        for(long i=0;i <len; i++)
                        {
                                ads_name ent;
                               
                                acedSSName(ss,i,ent);
                               
                                acedRedraw(ent,1);
                        }
                                        }
                break;
        case RTNORM:
                {       
                        ucs2wcs(rpt);
                        AcGeMatrix3d mat;
                        ads_matrix   mat2;
                        mat.setToTranslation
                                (
                                AcGeVector3d(               
                                rpt[X] - bp[X],
                                rpt[Y] - bp[Y],
                                rpt[Z] - bp[Z])
                                );
                        AcGeMatrixToAdsMatrix(mat,mat2);
                        acedXformSS(ss,mat2);
                                        }
                break;
        }
       
        acedSSFree(ss);
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-30 16:05:41 | 显示全部楼层
顺便问个问题:拖动过程中,如果修改了实体数据,例如:实体是PL线,修改了PL线的点,则实体在拖动过程中在捕捉关闭的情况下,鼠标静止不动时实体会隐藏。这是什么原因啊???
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 01:07 , Processed in 0.412383 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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