找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5892|回复: 9

[飞鸟集] JIG之简单教程-----我的椭圆我做主

[复制链接]

已领礼包: 8121个

财富等级: 富甲天下

发表于 2013-5-7 22:53:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 Highflybird 于 2013-5-7 22:55 编辑

JIG之简单教程-----我的椭圆我做主
关键词: Jig 一拖多 UCS 坐标变换 自动更改
下面我通过一个简单的教程来和大家讨论JIG的做法。
程序目的,通过Jig方式,选择两个角点,形成虚框,在UCS下创建椭圆,效果演示如下:


3.gif


1、首先,新建一个objectARX工程,选取MFC支持(当然也可以不要)。工程名字叫MyEllipseJig.
2、工程创建完毕后。现在采用向导方式创建一个Jig类。
未标题-0.jpg


未标题-1.jpg


其中的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::ErrorStatusm_es;
AcGePoint3dm_pt1,m_pt2;
AcGeMatrix3dm_xform;
//- 拖动的实体—椭圆,多段线及其Id
AcDbEllipse*m_pEllipse;
AcDbPolyline*m_pPolyline;
AcDbObjectIdm_polylineId;
//线型比例,椭圆比率,主轴,法线
doublem_ltScale;
doublem_radiusRatio;
AcGeVector3dm_majorAxis;
AcGeVector3dm_normal;
其中有些原有的我已经改名。对于成员函数,则加了如下:
EllipseJig(ads_point pt); //重载构造函数
Acad::ErrorStatus GetLineType(); //获取线型
AcEdJig::DragStatus startJig ();//改动了一下
Acad::ErrorStatus AppendEntity(AcDbEntity * pEnt ,AcDbObjectId & objId);//添加实体。
template 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函数分析:


未标题-2.jpg


因为取点时候,虽然是在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的各个版本可能会有差异,但都是大同小异,另外,如果你还想实现关键字,橡皮筋等效果不妨参考其他例子或者帮助。
上面说的不对之处,还望指教。
下面是源代码:
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:MyEllipseJig.rar 
下载次数:49  文件大小:20.51 KB  售价:5D豆 [记录]
下载权限: 不限 以上  [免费赚D豆]



论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-5-10 17:30:35 | 显示全部楼层
非常不错,下了收藏,虽然还不懂。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-7-20 16:58:40 | 显示全部楼层
想问一下版主,为什么用向导方式新建一个jig类之后,什么也不添加,一运行就出错,比如AcDbrocket* mpEntity,就会报错,如果改成AcDbEntity*就没事。。
另,总显示说我这个.cpp文件的行尾不一致, 是什么情况?。。。
新手维艰啊

点评

AcDbrocket* 这个是啥?ARX好像没这个类吧?  详情 回复 发表于 2013-7-31 18:50
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-7-31 17:55:02 | 显示全部楼层
怎么用,不会呀
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-7-31 18:50:14 | 显示全部楼层
xiaozhu08108 发表于 2013-7-20 16:58
想问一下版主,为什么用向导方式新建一个jig类之后,什么也不添加,一运行就出错,比如AcDbrocket* mpEntit ...

AcDbrocket* 这个是啥?ARX好像没这个类吧?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-4-20 14:24:51 | 显示全部楼层
学习一下啊

点评

代码下载下来,运行后只有椭圆被拖动,没有虚线框,为何?  详情 回复 发表于 2014-11-23 13:50
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-11-23 13:50:47 | 显示全部楼层

代码下载下来,运行后只有椭圆被拖动,没有虚线框,为何?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-11-23 13:54:19 | 显示全部楼层
代码下载下来,运行后只有椭圆被拖动,没有虚线框,为何?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2015-3-25 09:47:27 | 显示全部楼层
学习了!!!!!:lol:lol:lol:lol:lol
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2015-4-30 09:36:12 | 显示全部楼层
谁有创建标注的例子:'(:'(:'(:'(:'(:'(
发来学习一下
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 00:08 , Processed in 0.208334 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表