![]() |
【转帖】[求助][arx]如何根据鼠标在屏幕上面的移动轨迹画出它的相应cad实体?
[求助][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::pglyxqline() { // // } ///////////////拖动图形///////////////////////////////////// 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,而多边形就是多段线,而多段线和样条曲线有没有这个限制我不知道,我想也应该有吧。 其次,用这种方法实现相当于屏幕上的线都是由一个个的点组成的,会引起图形的大小急剧增大,进而造成内存不足呢? 所以,还得想别的办法。 |
所有的时间均为北京时间。 现在的时间是 11:57 PM. |