- 积分
- 6485
- 明经币
- 个
- 注册时间
- 2002-7-30
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2006-7-9 13:44:00
|
显示全部楼层
我在回调函数中使用了绘制直线功能(仿ET工具中的ACET-SS-DRAG-MOVE),但在窗口很大,对象很小的情况下,直线会产生残影。不知为什么?- 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;
- }
复制代码 |
|