![]() |
【转帖】关于aceddraggen的回调函数的问题。
关于aceddraggen的回调函数的问题。
关于aceddraggen的回调函数的问题。 我在它的回掉函数中执行下面的代码,画出来的东西不会真的画到图形里面(使用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; } 我在回调函数中使用了绘制直线功能(仿et工具中的acet-ss-drag-move),但在窗口很大,对象很小的情况下,直线会产生残影。不知为什么? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 ads_point pt0; void ident_init(ads_matrix id); int dragsample(ads_point usrpt,ads_matrix matrix); acdbobjectid create_draggen_line(ads_point startpt,ads_point endpt); acdbobjectid draggen_line; int nbt_ss_drag_move() { #ifdef oarxwizdebug acutprintf ("\noarxwizdebug - nbt_ss_drag_move() called."); #endif // oarxwizdebug // todo: implement the command resbuf *parg =acedgetargs () ; acdbentity *tline; int rc; ads_point return_pt; //基点 char msg[256]; ads_matrix matrix0; if(parg==null){ //无参数 acutprintf("\n需要至少3个参数:(nbt_ss_drag_move ss pt0 msg [line] [angle] [scale]"); return rterror; } ads_name ss; if(parg->restype= rtpicks){ //传送过来的第1个参数是选择集 //acedssadd(parg->resval.rlname,null,ss); ss[0]=parg->resval.rlname[0]; ss[1]=parg->resval.rlname[1]; }else{ //若不是选择集 acdbfail("第1个参数必须是选择集。"); return rterror; } parg=parg->rbnext; //第2个参数 if(parg->restype= rtpoint){ //传送过来的第2个参数是坐标点 ads_point_set(parg->resval.rpoint,pt0); }else{ //若不是 acdbfail("第2个参数必须是坐标点。"); return rterror; } parg=parg->rbnext; //第3个参数 if(parg->restype= rtstr){ //传送过来的第3个参数是字符串 strcpy(msg,parg->resval.rstring); }else{ //若不是 acdbfail("第3个参数必须是字符串。"); return rterror; } rc=aceddraggen( //调用aceddraggen()函数动态拖运选择集。 ss, //选择集 msg, //提示符 0, //显示正常的光标(十字线) dragsample,//指定变换函数. return_pt); //设置为给定的位置 //acdbgetobjectid(draggen_line,tline); acdbopenobject(tline,draggen_line,acdb::kforwrite);//pobj:acdbentity * tline->erase(); tline->close(); acedssfree(ss); if(rc==rtnorm){ //正常结束 dragsample(return_pt,matrix0);//根据拖运结果重新设置变换矩阵 //rc=acedxformss(ss,matrix0); //对选择集进行缩放变换. //if(rc==rtnorm) acutprintf("\n完成!"); acedretpoint(return_pt); } else acedretnil; return (rsrslt) ; } void ident_init(ads_matrix id) //将矩阵id初始化为单位阵 { int i,j; for (i=0;i<=3;i++) for(j=0;j<=3;j++) id[i][j]=0.0; //令矩阵所有元素为0.0 for(i=0;i<=3;i++) id[i][i]=1.0; //令矩阵对角元素为1.0 id[0][3]=100; id[1][3]=100; } /* int dragsample(ads_point usrpt,ads_matrix matrix) //变换函数 { ident_init(matrix); //初始化变换矩阵 matrix[0][0]=matrix[1][1]=usrpt[x]; //设置变换矩阵为一致矩阵 return rtnorm; //返回 rtnorm,表示矩阵被修改. } */ int dragsample(ads_point usrpt,ads_matrix matrix) //变换函数 { ident_init(matrix); //初始化变换矩阵 matrix[0][t]=usrpt[x]-pt0[x]; //设置变换矩阵为一致矩阵 matrix[1][t]=usrpt[y]-pt0[y]; //设置变换矩阵为一致矩阵 matrix[2][t]=usrpt[z]-pt0[z]; //设置变换矩阵为一致矩阵 draggen_line=create_draggen_line(pt0,usrpt); return rtnorm; //返回 rtnorm,表示矩阵被修改. }//----------------------------------------------------------------------------- //---------- //回调函数 acdbobjectid create_draggen_line(ads_point startpt,ads_point endpt) { acgepoint3d pt0,pt1; pt0[0]=startpt[0]*2-endpt[0]; pt0[1]=startpt[1]*2-endpt[1]; pt0[2]=startpt[2]*2-endpt[2]; pt1[0]=startpt[0]; pt1[1]=startpt[1]; pt1[2]=startpt[2]; acdbline *pline=new acdbline(pt0,pt1); acdbblocktable *pbt; acdbhostapplicationservices()->workingdatabase() ->getsymboltable(pbt,acdb::kforread); acdbblocktablerecord *pbtr; pbt->getat(acdb_model_space, pbtr, acdb::kforwrite); pbt->close(); acdbobjectid objid; pbtr->appendacdbentity(objid, pline); pbtr->close(); pline->close(); return objid; } |
| 所有的时间均为北京时间。 现在的时间是 03:38 AM. |