几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量  


返回   几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 » 仿射空间:CAX软件开发(三)二次开发与程序设计 » CAD二次开发 » AutoCAD二次开发 » ObjectARX(C++)
用户名
密码
注册 帮助 会员 日历 银行 搜索 今日新帖 标记论坛为已读


回复
 
主题工具 搜索本主题 显示模式
旧 2009-04-16, 02:35 PM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 【转帖】[求助][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: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,而多边形就是多段线,而多段线和样条曲线有没有这个限制我不知道,我想也应该有吧。
其次,用这种方法实现相当于屏幕上的线都是由一个个的点组成的,会引起图形的大小急剧增大,进而造成内存不足呢?
所以,还得想别的办法。
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
回复


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

vB 代码开启
[IMG]代码开启
HTML代码关闭



所有的时间均为北京时间。 现在的时间是 04:40 AM.


于2004年创办,几何尺寸与公差论坛"致力于产品几何量公差标准GD&T | GPS研究/CAD设计/CAM加工/CMM测量"。免责声明:论坛严禁发布色情反动言论及有关违反国家法律法规内容!情节严重者提供其IP,并配合相关部门进行严厉查处,若內容有涉及侵权,请立即联系我们QQ:44671734。注:此论坛须管理员验证方可发帖。
沪ICP备06057009号-2
更多