|
高级会员
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
|
【转帖】关于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;
}
|