明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2812|回复: 1

关于acedDragGen的回调函数的问题。

[复制链接]
发表于 2003-7-3 18:08:00 | 显示全部楼层 |阅读模式
我在它的回掉函数中执行下面的代码,画出来的东西不会真的画到图形里面(使用regen命令后画出来的东西全部丢失),而在其他地方确是可以的,不知道怎么回事?

     这个问题其实不影响我现在的程序,可是我还是想知道这是为什么?各位高手支招了!

谢谢!!!
AcDbObjectId createCircle(ads_point cp, ads_real r)
{
        AcGePoint3d center(cp[0], cp[1], cp[2]);
        AcGeVector3d normal(0.0, 0.0, 1.0);
        AcDbCircle *pC = new AcDbCircle(center, normal, r);
        AcDbBlockTable *pBT;
        acdbCurDwg()->getBlockTable(pBT, AcDb::kForRead);
        AcDbBlockTableRecord *pBTR;
        pBT->getAt(ACDB_MODEL_SPACE, pBTR, AcDb::kForWrite);
        pBT->close();
        AcDbObjectId ObjId;
        pBTR->appendAcDbEntity(ObjId, pC);
        pBTR->close();
        pC->close();
       
        return ObjId;
}
发表于 2006-7-9 13:44:00 | 显示全部楼层
我在回调函数中使用了绘制直线功能(仿ET工具中的ACET-SS-DRAG-MOVE),但在窗口很大,对象很小的情况下,直线会产生残影。不知为什么?
  1. ads_point pt0;
  2. void ident_init(ads_matrix id);
  3. int dragsample(ads_point usrpt,ads_matrix matrix);
  4. AcDbObjectId create_DragGen_Line(ads_point startPt,ads_point endPt);
  5. AcDbObjectId DragGen_Line;
  6. int NBT_SS_DRAG_MOVE()
  7. {
  8. #ifdef OARXWIZDEBUG
  9. acutPrintf ("\nOARXWIZDEBUG - NBT_SS_DRAG_MOVE() called.");
  10. #endif // OARXWIZDEBUG
  11. // TODO: Implement the command
  12. resbuf *pArg =acedGetArgs () ;
  13. AcDbEntity *tline;
  14. int rc;
  15. ads_point return_pt; //基点
  16. char msg[256];
  17. ads_matrix matrix0;
  18. if(pArg==NULL){ //无参数
  19.   acutPrintf("\n需要至少3个参数:(NBT_SS_DRAG_MOVE SS pt0 msg [line] [angle] [scale]");
  20.   return RTERROR;
  21. }
  22. ads_name ss;
  23. if(pArg->restype= RTPICKS){ //传送过来的第1个参数是选择集
  24.   //acedSSAdd(pArg->resval.rlname,NULL,ss);
  25.   ss[0]=pArg->resval.rlname[0];
  26.   ss[1]=pArg->resval.rlname[1];
  27. }else{ //若不是选择集
  28.   acdbFail("第1个参数必须是选择集。");
  29.   return RTERROR;
  30. }
  31.     pArg=pArg->rbnext; //第2个参数
  32. if(pArg->restype= RTPOINT){ //传送过来的第2个参数是坐标点
  33.   ads_point_set(pArg->resval.rpoint,pt0);
  34. }else{ //若不是
  35.   acdbFail("第2个参数必须是坐标点。");
  36.   return RTERROR;
  37. }
  38. pArg=pArg->rbnext; //第3个参数
  39. if(pArg->restype= RTSTR){ //传送过来的第3个参数是字符串
  40.   strcpy(msg,pArg->resval.rstring);
  41. }else{ //若不是
  42.   acdbFail("第3个参数必须是字符串。");
  43.   return RTERROR;
  44. }
  45. rc=acedDragGen(  //调用acedDragGen()函数动态拖运选择集。
  46.   ss, //选择集
  47.   msg, //提示符
  48.   0,  //显示正常的光标(十字线)
  49.   dragsample,//指定变换函数.
  50.   return_pt);  //设置为给定的位置
  51. //acdbGetObjectId(DragGen_Line,tline);
  52. acdbOpenObject(tline,DragGen_Line,AcDb::kForWrite);//pobj:AcDbEntity *
  53. tline->erase();
  54. tline->close();
  55. acedSSFree(ss);
  56. if(rc==RTNORM){ //正常结束
  57.   dragsample(return_pt,matrix0);//根据拖运结果重新设置变换矩阵
  58.   //rc=acedXformSS(ss,matrix0); //对选择集进行缩放变换.
  59.   //if(rc==RTNORM) acutPrintf("\n完成!");
  60.   acedRetPoint(return_pt);
  61. }
  62. else
  63.   acedRetNil;
  64. return (RSRSLT) ;
  65. }
  66. void ident_init(ads_matrix id) //将矩阵id初始化为单位阵
  67. {
  68. int i,j;
  69. for (i=0;i<=3;i++)
  70.   for(j=0;j<=3;j++)
  71.    id[i][j]=0.0;  //令矩阵所有元素为0.0
  72.   for(i=0;i<=3;i++)
  73.    id[i][i]=1.0;  //令矩阵对角元素为1.0
  74.   id[0][3]=100;
  75.   id[1][3]=100;
  76. }
  77. /*
  78. int dragsample(ads_point usrpt,ads_matrix matrix) //变换函数
  79. {
  80. ident_init(matrix);  //初始化变换矩阵
  81. matrix[0][0]=matrix[1][1]=usrpt[X];  //设置变换矩阵为一致矩阵
  82. return RTNORM;  //返回 RTNORM,表示矩阵被修改.
  83. }
  84. */
  85. int dragsample(ads_point usrpt,ads_matrix matrix) //变换函数
  86. {
  87. ident_init(matrix);  //初始化变换矩阵
  88. matrix[0][T]=usrpt[X]-pt0[X];  //设置变换矩阵为一致矩阵
  89. matrix[1][T]=usrpt[Y]-pt0[Y];  //设置变换矩阵为一致矩阵
  90. matrix[2][T]=usrpt[Z]-pt0[Z];  //设置变换矩阵为一致矩阵
  91.     DragGen_Line=create_DragGen_Line(pt0,usrpt);
  92. return RTNORM;  //返回 RTNORM,表示矩阵被修改.
  93. }//-----------------------------------------------------------------------------
  94. //----------
  95. //回调函数
  96. AcDbObjectId create_DragGen_Line(ads_point startPt,ads_point endPt)
  97. {
  98. AcGePoint3d pt0,pt1;
  99. pt0[0]=startPt[0]*2-endPt[0];
  100. pt0[1]=startPt[1]*2-endPt[1];
  101. pt0[2]=startPt[2]*2-endPt[2];
  102. pt1[0]=startPt[0];
  103. pt1[1]=startPt[1];
  104. pt1[2]=startPt[2];
  105.    AcDbLine *pLine=new AcDbLine(pt0,pt1);
  106. AcDbBlockTable *pBT;
  107. acdbHostApplicationServices()->workingDatabase()
  108.   ->getSymbolTable(pBT,AcDb::kForRead);
  109.   AcDbBlockTableRecord *pBTR;
  110. pBT->getAt(ACDB_MODEL_SPACE, pBTR, AcDb::kForWrite);
  111. pBT->close();
  112. AcDbObjectId ObjId;
  113. pBTR->appendAcDbEntity(ObjId, pLine);
  114. pBTR->close();
  115. pLine->close();
  116. return ObjId;
  117. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 23:24 , Processed in 0.161762 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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