关于acedDragGen的回调函数的问题。
我在它的回掉函数中执行下面的代码,画出来的东西不会真的画到图形里面(使用regen命令后画出来的东西全部丢失),而在其他地方确是可以的,不知道怎么回事?这个问题其实不影响我现在的程序,可是我还是想知道这是为什么?各位高手支招了!
谢谢!!!
AcDbObjectId createCircle(ads_point cp, ads_real r)
{
AcGePoint3d center(cp, cp, cp);
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),但在窗口很大,对象很小的情况下,直线会产生残影。不知为什么?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;
ads_matrix matrix0;
if(pArg==NULL){ //无参数
acutPrintf("\n需要至少3个参数:(NBT_SS_DRAG_MOVE SS pt0 msg ");
return RTERROR;
}
ads_name ss;
if(pArg->restype= RTPICKS){ //传送过来的第1个参数是选择集
//acedSSAdd(pArg->resval.rlname,NULL,ss);
ss=pArg->resval.rlname;
ss=pArg->resval.rlname;
}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=0.0;//令矩阵所有元素为0.0
for(i=0;i<=3;i++)
id=1.0;//令矩阵对角元素为1.0
id=100;
id=100;
}
/*
int dragsample(ads_point usrpt,ads_matrix matrix) //变换函数
{
ident_init(matrix);//初始化变换矩阵
matrix=matrix=usrpt;//设置变换矩阵为一致矩阵
return RTNORM;//返回 RTNORM,表示矩阵被修改.
}
*/
int dragsample(ads_point usrpt,ads_matrix matrix) //变换函数
{
ident_init(matrix);//初始化变换矩阵
matrix=usrpt-pt0;//设置变换矩阵为一致矩阵
matrix=usrpt-pt0;//设置变换矩阵为一致矩阵
matrix=usrpt-pt0;//设置变换矩阵为一致矩阵
DragGen_Line=create_DragGen_Line(pt0,usrpt);
return RTNORM;//返回 RTNORM,表示矩阵被修改.
}//-----------------------------------------------------------------------------
//----------
//回调函数
AcDbObjectId create_DragGen_Line(ads_point startPt,ads_point endPt)
{
AcGePoint3d pt0,pt1;
pt0=startPt*2-endPt;
pt0=startPt*2-endPt;
pt0=startPt*2-endPt;
pt1=startPt;
pt1=startPt;
pt1=startPt;
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;
}
页:
[1]