找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1871|回复: 2

[求助]:关于acedDragGen的回调函数的问题

[复制链接]

已领礼包: 1个

财富等级: 恭喜发财

发表于 2006-7-9 13:53:00 | 显示全部楼层 |阅读模式

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

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

×
我在它的回掉函数中执行下面的代码,画出来直线(仿ET工具中的ACET-SS-DRAG-MOVE),但在窗口很大,对象很小的情况下,前一次绘制的直线会产生残影。需要运行REGEN才能消除。不知为什么?

  1.   [FONT=courier new]
  2. ads_point pt0;
  3. void ident_init(ads_matrix id);
  4. int dragsample(ads_point usrpt,ads_matrix matrix);
  5. AcDbObjectId create_DragGen_Line(ads_point startPt,ads_point endPt);
  6. AcDbObjectId DragGen_Line;



  7. int NBT_SS_DRAG_MOVE()
  8. {
  9. #ifdef OARXWIZDEBUG
  10.   acutPrintf ("\nOARXWIZDEBUG - NBT_SS_DRAG_MOVE() called.");
  11. #endif // OARXWIZDEBUG
  12.   
  13.   // TODO: Implement the command
  14.   resbuf *pArg =acedGetArgs () ;
  15.   AcDbEntity *tline;
  16.   int rc;
  17.   ads_point return_pt; //基点
  18.   char msg[256];
  19.   ads_matrix matrix0;
  20.   if(pArg==NULL){ //无参数
  21.    acutPrintf("\n需要至少3个参数:(NBT_SS_DRAG_MOVE SS pt0 msg [line] [angle] [scale]");
  22.    return RTERROR;
  23.   }
  24.   ads_name ss;
  25.   if(pArg->restype= RTPICKS){ //传送过来的第1个参数是选择集
  26.    //acedSSAdd(pArg->resval.rlname,NULL,ss);
  27.    ss[0]=pArg->resval.rlname[0];
  28.    ss[1]=pArg->resval.rlname[1];
  29.   }else{ //若不是选择集
  30.    acdbFail("第1个参数必须是选择集。");
  31.    return RTERROR;
  32.   }
  33.      pArg=pArg->rbnext; //第2个参数
  34.   if(pArg->restype= RTPOINT){ //传送过来的第2个参数是坐标点
  35.    ads_point_set(pArg->resval.rpoint,pt0);
  36.   }else{ //若不是
  37.    acdbFail("第2个参数必须是坐标点。");
  38.    return RTERROR;
  39.   }
  40.   pArg=pArg->rbnext; //第3个参数
  41.   if(pArg->restype= RTSTR){ //传送过来的第3个参数是字符串
  42.    strcpy(msg,pArg->resval.rstring);
  43.   }else{ //若不是
  44.    acdbFail("第3个参数必须是字符串。");
  45.    return RTERROR;
  46.   }
  47.   rc=acedDragGen(  //调用acedDragGen()函数动态拖运选择集。
  48.    ss, //选择集
  49.    msg, //提示符
  50.    0,  //显示正常的光标(十字线)
  51.    dragsample,//指定变换函数.
  52.    return_pt);  //设置为给定的位置
  53.   //acdbGetObjectId(DragGen_Line,tline);
  54.   acdbOpenObject(tline,DragGen_Line,AcDb::kForWrite);//pobj:AcDbEntity *
  55.   tline->erase();
  56.   tline->close();
  57.   acedSSFree(ss);
  58.   if(rc==RTNORM){ //正常结束
  59.    dragsample(return_pt,matrix0);//根据拖运结果重新设置变换矩阵
  60.    //rc=acedXformSS(ss,matrix0); //对选择集进行缩放变换.
  61.    //if(rc==RTNORM) acutPrintf("\n完成!");
  62.    acedRetPoint(return_pt);
  63.   }
  64.   else
  65.    acedRetNil;
  66.   return (RSRSLT) ;
  67. }
  68. void ident_init(ads_matrix id) //将矩阵id初始化为单位阵
  69. {
  70.   int i,j;
  71.   for (i=0;i<=3;i++)
  72.    for(j=0;j<=3;j++)
  73.     id[i][j]=0.0;  //令矩阵所有元素为0.0
  74.    for(i=0;i<=3;i++)
  75.     id[i][i]=1.0;  //令矩阵对角元素为1.0
  76.    id[0][3]=100;
  77.    id[1][3]=100;
  78. }
  79. /*
  80. int dragsample(ads_point usrpt,ads_matrix matrix) //变换函数
  81. {
  82.   ident_init(matrix);  //初始化变换矩阵
  83.   matrix[0][0]=matrix[1][1]=usrpt[X];  //设置变换矩阵为一致矩阵
  84.   return RTNORM;  //返回 RTNORM,表示矩阵被修改.
  85. }
  86. */
  87. int dragsample(ads_point usrpt,ads_matrix matrix) //变换函数
  88. {
  89.   ident_init(matrix);  //初始化变换矩阵
  90.   matrix[0][T]=usrpt[X]-pt0[X];  //设置变换矩阵为一致矩阵
  91.   matrix[1][T]=usrpt[Y]-pt0[Y];  //设置变换矩阵为一致矩阵
  92.   matrix[2][T]=usrpt[Z]-pt0[Z];  //设置变换矩阵为一致矩阵
  93.      DragGen_Line=create_DragGen_Line(pt0,usrpt);
  94.   return RTNORM;  //返回 RTNORM,表示矩阵被修改.
  95. }//-----------------------------------------------------------------------------
  96. //----------
  97. //回调函数
  98. AcDbObjectId create_DragGen_Line(ads_point startPt,ads_point endPt)
  99. {
  100.   AcGePoint3d pt0,pt1;
  101.   pt0[0]=startPt[0]*2-endPt[0];
  102.   pt0[1]=startPt[1]*2-endPt[1];
  103.   pt0[2]=startPt[2]*2-endPt[2];
  104.   pt1[0]=startPt[0];
  105.   pt1[1]=startPt[1];
  106.   pt1[2]=startPt[2];
  107.     AcDbLine *pLine=new AcDbLine(pt0,pt1);
  108.   AcDbBlockTable *pBT;
  109.   acdbHostApplicationServices()->workingDatabase()
  110.    ->getSymbolTable(pBT,AcDb::kForRead);
  111.    AcDbBlockTableRecord *pBTR;
  112.   pBT->getAt(ACDB_MODEL_SPACE, pBTR, AcDb::kForWrite);
  113.   pBT->close();
  114.   AcDbObjectId ObjId;
  115.   pBTR->appendAcDbEntity(ObjId, pLine);
  116.   pBTR->close();
  117.   pLine->close();
  118.   return ObjId;
  119. }
  120.   [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-7-11 11:19:41 | 显示全部楼层
晕了,鼠标动一下就添加一个实体????一定有问题。
论坛上有这方面的例子,搜一下,就知道了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

 楼主| 发表于 2006-7-11 13:23:10 | 显示全部楼层
其回调函数添加的实体是不保存的呀?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 14:33 , Processed in 0.299809 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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