[求助][arx]如何根据鼠标在屏幕上面的移动轨迹画出它的相应cad实体?
[求助][arx]如何根据鼠标在屏幕上面的移动轨迹画出它的相应cad实体?
利用arx进行二次开发的时候,如何根据鼠标在屏幕上面的移动轨迹画出它的相应cad实体?请斑竹和各位高手赐教!谢谢!
我试过了,这个可以。是转载别处的代码
//而且目前所有的参考书上对acedjig类的使用都是以拖动一个椭圆为例(作者都互相抄袭)
//因此我就想,把要生成的系列图形定义成一个自定义实体,不就可以使用acedjig了吗!
class cmarectwindow : public acdbentity
{
public:
acrx_declare_members(cmarectwindow);
cmarectwindow();
virtual ~cmarectwindow();
virtual acad::errorstatus dwgoutfields(acdbdwgfiler* pfiler) const;
virtual acad::errorstatus dwginfields(acdbdwgfiler* pfiler);
virtual adesk::boolean worlddraw(acgiworlddraw* mode);
//设置插入基点
acad::errorstatus setstartpt(const acgepoint3d startpt);
//取得插入基点
acgepoint3d startpt();
private:
//成员变量,图形插入基点
acgepoint3d m_startpt;
};
///////////////cmarectwindow 类实现文件//////////////////
acrx_dxf_define_members(cmarectwindow, acdbentity,
acdb::kdhl_current, acdb::kmreleasecurrent,
acdbproxyentity::knooperation,
cmawindo_info, pgl_02);
cmarectwindow::cmarectwindow()
{
m_startpt.set(0.0, 0.0, 0.0);
}
cmarectwindow::~cmarectwindow()
{
// todo: clean up.
}
adesk::boolean cmarectwindow::worlddraw(acgiworlddraw* mode)
{
assertreadenabled();
acgepoint3d pt; //插入点
acgepoint3d pt1, pt2, pt3, pt4; //四个角点
acgevector3d vec;
acgevector3d normal(0.0, 0.0, 1.0);
//
pt = startpt();
//
vec.set(0, 50, 0);
pt1 = pt - vec;
pt4 = pt + vec;
vec.set(60, 0, 0);
pt2 = pt1 + vec;
pt3 = pt4 + vec;
acgepoint3d plinearray[5];
plinearray[0] = pt1;
plinearray[1] = pt2;
plinearray[2] = pt3;
plinearray[3] = pt4;
plinearray[4] = pt1;
//设置颜色为红色
mode->subentitytraits().setcolor(1);
//绘制矩形
mode->geometry().polyline(5, plinearray);
//绘制圆
mode->geometry().circle(pt, 30.0, normal);
return acdbentity::worlddraw(mode);
}
acad::errorstatus cmarectwindow::dwginfields(acdbdwgfiler* pfiler)
{
assertwriteenabled();
acad::errorstatus es;
if ((es = acdbentity::dwginfields(pfiler)) != acad::eok)
{
return es;
}
pfiler->readitem(&m_startpt);
return pfiler->filerstatus();
}
acad::errorstatus cmarectwindow::dwgoutfields(acdbdwgfiler* pfiler) const
{
assertreadenabled();
acad::errorstatus es;
if ((es = acdbentity::dwgoutfields(pfiler)) != acad::eok)
{
return es;
}
pfiler->writeitem(m_startpt);
return pfiler->filerstatus();
}
acgepoint3d cmarectwindow::startpt()
{
assertreadenabled();
return m_startpt;
}
acad::errorstatus cmarectwindow::setstartpt(const acgepoint3d startpt)
{
assertwriteenabled();
m_startpt = startpt;
return acad::eok;
}
/////////////////////////////////////////////
/////////////////////////////////////////////
/////////////////////////////////////////////
////////////拖动函数/////////////////////////
class pglyxqline : public acedjig
{
public:
pglyxqline();
void doit();
virtual dragstatus sampler();
virtual adesk::boolean update();
virtual acdbentity* entity() const;
private:
cmarectwindow *prectwindow;
acgepoint3d ptm, movept;
};
///////////////构造函数//////////////////////////////////////
pglyxqline:

glyxqline()
{
//
//
}
///////////////拖动图形/////////////////////////////////////
void
pglyxqline::doit()
{
prectwindow = new cmarectwindow;
if(!prectwindow)
{
acutprintf("****cmarectwindow对象不存在****");
return;
}
setdispprompt("\n指定位置: ");
acedjig::dragstatus stat = drag();
append();
}
//////////////捕获定点设备并作出分析////////////////////////
acedjig::dragstatus
pglyxqline::sampler()
{
dragstatus stat;
static acgepoint3d temppoint;
stat = acquirepoint(movept);
if (temppoint != movept)
temppoint = movept;
else if (stat == acedjig::knormal)
return acedjig::knochange;
return stat;
}
/////////更新数据///////并更新类成员变量的值/////////////////
adesk::boolean
pglyxqline::update()
{
ptm = movept;
prectwindow->setstartpt(ptm);
return adesk::ktrue;
}
//////////////////更新实体///////////////////////////////////
acdbentity*
pglyxqline::entity() const
{
return prectwindow;
}
////////////命令执行函数//////////////////////////////////////////////
void
create_tuxing()
{
//初始化一个拖动派生类实体
pglyxqline *pjig = new pglyxqline();
//拖动实体
pjig->doit();
delete pjig;
}
void
initapp()
{
acedregcmds->addcommand("pgl_yxq", "pglyxq", "pglyxq", acrx_cmd_modal, create_tuxing);
//自定义类初始化函数
cmarectwindow::rxinit();
acrxbuildclasshierarchy();
}
void
unloadapp()
{
acedregcmds->removegroup("pgl_yxq");
deleteacrxclass(cmarectwindow::desc());
}
extern "c" acrx::appretcode
acrxentrypoint(acrx::appmsgcode msg, void* appid)
{
switch (msg)
{
case acrx::kinitappmsg:
acrxdynamiclinker->unlockapplication(appid);
acrxdynamiclinker->registerappmdiaware(appid);
initapp();
break;
case acrx::kunloadappmsg:
unloadapp();
}
return acrx::kretok;
}
谢谢badboy518朋友的答案。正在认真学习中。。。
以上内容是我发布在晓东cad上的代码.
badboy518说的没有错,从这个程序中楼主可以找到你要的答案,如果把上面的程序搞懂了,你要的功能自然就能实现.
初始化一个样条曲线类的对象,然后开始拖动循环,在每一轮的循环中捕获定点设备的坐标并把它存入到一个数组里,然后马上更新对象,当拖动结束后把它加入到数据库中即可.原理跟我上面的程序是一样的,只不过把自定义实体换成样条曲线类的对象而已,原理很简单的.如果你需要完整的源代码和编译后的arx程序,你可以到晓东cad空间下载,谢谢使用!
突然间想到使用我的思路来实现的话可能很危险。
因为在cad中规定多边形的最大边数为1024,而多边形就是多段线,而多段线和样条曲线有没有这个限制我不知道,我想也应该有吧。
其次,用这种方法实现相当于屏幕上的线都是由一个个的点组成的,会引起图形的大小急剧增大,进而造成内存不足呢?
所以,还得想别的办法。