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


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


回复
 
主题工具 搜索本主题 显示模式
旧 2009-04-29, 04:50 PM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 【转帖】jig之简单教程-----我的椭圆我做主 - 精华帖集合

jig之简单教程-----我的椭圆我做主 - 精华帖集合
www.dimcax.com
jig之简单教程-----我的椭圆我做主
, , ,
关键词: jig 一拖多 ucs 坐标变换 自动更改
下面我通过一个简单的教程来和大家讨论jig的做法。
程序目的,通过jig方式,选择两个角点,形成虚框,在ucs下创建椭圆,效果演示如下:
1、首先,新建一个objectarx工程。
选取mfc支持(当然也可以不要)。工程名字叫myellipsejig.
2、工程创建完毕后。现在采用向导方式创建一个jig类。
其中的class nme指的是jig类的名字,我取了ellipsejig
class to jig是指的是要拖动的对象,我这里要拖动的主对象是椭圆,所以类应该是acdbellipse,至于怎么实现一拖多,请看以后的代码。
number of inputs是指中间拖动过程中实现的输入,因为拖动前有一点是已知的,所以只要知道另外的一点就行了,数目应该是1。如果是创建多段线之类的,可能在1之上。
头文件和cpp文件让它自动命名,点finish其他让程序自动生成。
3、这样我们会看到程序自动生成一些函数和成员。
如果在vs2002下,可能下面的两句话要注释掉
ellipsejig.h
//acrx_declare_members(ellipsejig);
ellipsejig.cpp
//acrx_cons_define_members(ellipsejig, acedjig, 1)
否则的话程序编译好了,cad加载会出错退出。
然后我们添加一些自己的成员函数,为了直观起见,
注释掉//acdbellipse *mpentity ;并把所有的mpentity替换成m_pellipse
这是要拖动的主对象。
以下是要添加的:
//出错信息,两个角点,ucs的变换矩阵
acad::errorstatus m_es;
acgepoint3d m_pt1,m_pt2;
acgematrix3d m_xform;
//- 拖动的实体—椭圆,多段线及其id
acdbellipse* m_pellipse;
acdbpolyline* m_ppolyline;
acdbobjectid m_polylineid;
//线型比例,椭圆比率,主轴,法线
double m_ltscale;
double m_radiusratio;
acgevector3d m_majoraxis;
acgevector3d m_normal;
其中有些原有的我已经改名。对于成员函数,则加了如下:
ellipsejig(ads_point pt); //重载构造函数
acad::errorstatus getlinetype(); //获取线型
acedjig:: dragstatus startjig (); //改动了一下
acad::errorstatus appendentity(acdbentity * pent ,acdbobjectid & objid);//添加实体。
template<typename t> t abs(const t x); //绝对值函数,这个是为vs2002用的,2005版本用不着。
4、函数的说明:
我们对构造函数重载,得到我们需要的一些全局变量数值,例如线型比例,和ucs的变换矩阵。转化第一点ucs坐标为wcs坐标。这些完毕后转入到entity,然后转入到startjig
5、jig的流程一般如下:
构造函数()->startjig()->entity()->dimdata()->sampler()->getstartpoint()->getnextpoint()->update()->updatedimdata->
setdimvalue()->entity()->startjig();
其中startjig,开始拖动,对一些做初始化,譬如m_ppolyline,等.
getstartpoint,getnextpoint,是橡皮筋效果,跟多次输入有关,这里我省去了,合并到一个函数sampler,采样取点.update对采样的点进行更新.
sampler,update,entity,这几个是不能更改名称和参数的。
dimdata,updatadimdata,setdimvalue跟动态标注有关。
6、为了实现一拖多,必然要在startjig中定义多个类。
我这里定义了两个类型,acdbellipse,这是最终要创建的,acdbpolyline,这个是拖动时显示的,但拖动完毕后要删除的。你可以定义更多的。
startjig的函数流程,
先设置返回状态为knull,然后为了虚线框效果,加载线型获得线型比例,初始化虚线框为多段线,增加4个顶点,添加到数据库,完毕,打开多段线进行操作,如果处于正交模式,提示用户,两个角点连线水平或垂直,则无法创建椭圆。再创建一个椭圆类,开始拖动创建,这时候程序转到采样取点,
7、sampler取样函数的分析:
setspecialcursortype (acedjig::kcrosshair);
设置拖动时光标形式:kcrosshair为十字交叉线,其实设置为krectcursorye也是可以创建矩形框的,但是是实线,我想要的效果是虚线,setuserinputcontrols((userinputcontrols) (acedjig::kaccept3dcoordinates| acedjig::knonegativeresponseaccepted| acedjig::knozeroresponseaccepted));说的是用户输入的方式,大家自己去理解。
这时通过acquirepoint(m_pt2);获得点的坐标,如果想要橡皮筋效果,则是acquirepoint(m_pt2,m_pt1),这个时候如果取点正常,退出函数,转入update函数,
8、update函数分析:
因为取点时候,虽然是在ucs中,但得到的点仍然是wcs的,我们不能直接使用得到椭圆和多段线,要经过一些几何上的变换。所以需要通过acdbwcs2ucs转化为两个临时点,为了避免不在同一水平面上,要对z值统一。如果椭圆比率很少,或者两个角点水平或者垂直,将退出这个update函数。
然后修改多段线的法线为wcs法线,高度为第一点的z值,这步很重要,与下面的矩阵变换切切相关。为什么要这么做,因为这时候我们是当作在wcs中画。这时候修改多段线的端点为计算得到的端点。
椭圆中心点的坐标是这个矩形框的两个角点的中点, 然而主轴方向不一定是水平的,如果椭圆比率大于1,则改变主轴线方向,比率改为其倒数,并对多段线线型比例做调整。
这时候我们得到的数值如果不做坐标变换,是错误的,因为我们是在ucs中,而椭圆和多段线存储的数据是以wcs方式存储的。所以,转换椭圆的中心点和主轴为世界坐标,同时采用矩阵变换的方式变换矩形.如果缺少前面的设置矩形法线为wcs,高度为第一点的z值这一步,将导致变换的变换,得到一个跳动的矩形框。显然是违背我们的初衷的。
关于这段函数的计算和几何部分,不是很难,大家可以看代码去理解。
这之后,函数正确返回;若要动态标注则转入updatedimdata;这部分我就没编译运行了,大家如果有兴趣的话不妨做一下。
9、好了,现在函数又回转到startjig中。
这时候获得其他函数的返回值,如果中途取消或者其他错误,不能正常返回,则删除m_pellipse,正常返回则用append函数让自动添加。但是虚线框是要删除的,所以我们再打开m_ppolyline再进行删除操作。
10、我们还要为这个椭圆的拖动创建方式定义一个命令名:myellipse
这一步比较熟悉,我就不用介绍了,在命令函数中首先用户交互取得第一个角点,然后定义一个jig类,对其开始拖动.拖动完毕后,删除指针。
arx的各个版本可能会有差异,但都是大同小异,另外,如果你还想实现关键字,橡皮筋等效果不妨参考其他例子或者帮助。
上面说的不对之处,还望指教。
程序在编写的过程中得到ahlzl版主的帮助,在此致谢!
下面是程序的源码:
[ ]
不错啊。这种帖子多多益善。
c#最适合开发autocad,因为它拥有vb容易的特点,却具有vc++的强大功能。
楼主的jig用的很好哦,敬礼!
因為專業, 所以精彩 !!!
学习了,
学习,
好帖一定要顶的!
到处都找不到这样好的例子
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
回复


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

高级搜索
显示模式

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

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



所有的时间均为北京时间。 现在的时间是 09:50 PM.


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