明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2642|回复: 13

[已解答] entmake绘制半椭圆,遇到问题? 组码41的意义? 已解决。

[复制链接]
发表于 2015-8-19 10:58:39 | 显示全部楼层 |阅读模式
本帖最后由 fl202 于 2015-8-21 13:08 编辑

普通CAD做法:绘制椭圆,做辅助线,剪切后为类似与弧的曲线,旋转该曲线。
现在编程做法:用entmake绘制椭圆(注意是非全的椭圆),用grread根据用户坐标进行旋转。

问题:不知道组码11 和41  42 的关系 ,请大侠指点。生成全椭圆没有问题,生成半椭圆(0,90,180,270°为起始点的椭圆)也没有问题,但生成其它角度的椭圆(如起始角度30°,终止角度210°的椭圆)就不行了???

查看椭圆的组码: 10 为圆心,11为长轴半径,40为长短轴半径比例系数,41为起点坐标,42为终点坐标。
1 生成全椭圆,命令行输入:
(entmake (list '(0 . "ELLIPSE") '(100 . "AcDbEntity")'(100 . "AcDbEllipse")(cons 10 (getpoint "point:"))(cons 11 (list 500 0 0))   (cons 40 0.6) (cons 41 0.0)  (cons 42  6.28319)  ) )
生成成功,属性为:
((-1 . <图元名: 7ffffbae1e0>) (0 . ELLIPSE) (330 . <图元名: 7ffffb089f0>) (5 . 1EE6) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 . AcDbEllipse) (10 3700.89 559.586 0.0) (11 500.0 0.0 0.0) (210 0.0 0.0 1.0) (40 . 0.6) (41 . 0.0) (42 . 6.28319))
2 生成起点角度30°,终止角度150°的半椭圆,命令行输入:
(entmake (list '(0 . "ELLIPSE") '(100 . "AcDbEntity")'(100 . "AcDbEllipse")(cons 10 (getpoint "point:"))(cons 11 (list 500 0  0))   (cons 40 0.6) (cons 41 (/ pi 6))  (cons 42  (/ pi 1.2) )  ) )
生成成功,但图形不是我想要的。属性为:
((-1 . <图元名: 7ffffbae1f0>) (0 . ELLIPSE) (330 . <图元名: 7ffffb089f0>) (5 . 1EE7) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 . AcDbEllipse) (10 4650.9 -251.795 0.0) (11 500.0 0.0 0.0) (210 0.0 0.0 1.0) (40 . 0.6) (41 . 0.523599) (42 . 2.61799))
属性显示角度为30,150°,实际测量椭圆起始角度19.1°,终止角度160.9°。
命令: (/ (* 180 0.523599 ) pi)
30.0
命令: (/ (* 180 2.61799) pi)
150.0

请问是怎么回事?感觉组码(11 500.0 0.0 0.0) (11 -500.0 0.0 0.0) (11  0.0  -500.0 0.0) (11  0.0 500.0 0.0)对于图形都有影响。 请问11与41 、42 组码的关系是怎么回事?谢谢!




本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2015-8-19 17:38:51 | 显示全部楼层
http://bbs.xdcad.net/thread-316213-1-1.html

41、42的弧度角是相对于点10和点11的角度,如果要用程序计算该点,要先按标准椭圆(即长轴水平放置)用41和42组码计算,再按从点10到点11的角度进行坐标变换,这样就可以求出椭圆的起始点和结束点的坐标值了。

有人解惑吗?谢谢!
发表于 2015-8-19 22:14:29 | 显示全部楼层
建议换种方式,采用VLA的方式
因为直接用entmake生成,会涉及到一个算法,而用vla不用考虑这个问题。
entmake组码 40 长短轴比例,当比例不为1的时候,起始角度41 和结束角度 42,会根据比例而变化,具体怎么计算,可以自己研究研究。
如果比例是1,那么,起始和结束是你想要的结果。不为1,那么需要计算,vla方式不用计算。系统自己计算赋值。想研究这个算法,你可以参下面的资料。
参考资料:
https://en.wikipedia.org/wiki/Eccentric_anomaly
http://www.autodesk.com/techpubs ... r_option_dxf_06.htm
http://www.theswamp.org/index.php?topic=44021.msg492861#msg492861

  1. (defun c:tt (/ en obj)
  2.   (setq        en (entmakex (list '(0 . "ELLIPSE")
  3.                            '(100 . "AcDbEntity")
  4.                            '(100 . "AcDbEllipse")
  5.                            (cons 10 (getpoint "point:"))
  6.                            (cons 11 (list 500 0 0))
  7.                            (cons 40 0.6)
  8.                            (cons 41 0)
  9.                            (cons 42 (* 2 pi))
  10.                      )
  11.            )
  12.   )
  13.   (setq obj (vlax-ename->vla-object en))
  14.   (vla-put-startangle obj (/ pi 6))
  15.   (vla-put-endangle obj (/ pi 1.2))
  16. )
 楼主| 发表于 2015-8-20 12:19:31 | 显示全部楼层
谢谢e大解惑!原来和40长短轴比例还有关系!
中心点为(h,k),主轴平行于x轴时,标准方程为:
(x-h)&#178;/a&#178;+(y-k)&#178;/b&#178;=1 (a>b>0)      
tan( ang1)= abs( y) / abs( x)
a 为长轴半径, b为短轴半径。该点到中心点的角度为ang1, 联立两方程式,可以求取该坐标点。

e大的方法更简单,谢谢!

发表于 2015-8-20 16:05:42 | 显示全部楼层
本帖最后由 edata 于 2015-8-21 13:16 编辑

终于把这个算法弄出来了,昨天因为高于90的角度计算不正确,所有一直没感确定这个算法的正确,经过多次测试,发现大于90小于270°的角度值用tan算出来需要减掉180°,最终完善了这个转换算法。
椭圆41 42 组码值要转换才能实现所见即所得。
组码10是中心点 11 是长半轴的值和方向,40是长短轴比例,41是起始角度参数(不一定等于起始角度)
42是结束角度参数。
组码11的值x值为长半轴值,x,y值构成一个点,和中心点组码10构成角度,等于椭圆的旋转角度。
以上是我对椭圆的研究所得,个人意见,仅供参考。
对于坐标点,可以参考LEE_mac的函数,通过起始角参数,比例,中心点,不管是否平行x轴,直接获得。
当然,平行X轴,有个公式直接可以用。
(list (* (cos ang) a) (* (sin ang) b))
ang是组码41或42的值 a是长半轴 b是短半轴的值(短半轴=组码11的X值*组码40值)
得到的点是相对于中心点(0 0)的坐标,可以通过计算得到起点或终点坐标,如果不平行于X轴,还得将结果按组码11与10的角度旋转。
下面是角度转参数算法例子
  1. ;;tan函数
  2. (defun tan (ang)
  3.   (/ (sin ang) (cos ang))
  4. )
  5. ;;角度转弧度
  6. (defun ang->rad(ang)
  7.   (* pi (/ ang 180.0))
  8.   )
  9. ;;当角度值大于90-270时,需要减掉180
  10. ;(angtos (- (atan (/  (tan (ang->b 271)) 0.6)) pi))
  11. ;tan(StartAngle) = ratio * tan(StratParam)
  12. ;(atan (* 0.6 (tan (/ pi 6.0))))
  13. ;;椭圆真实角度转参数
  14. ;;(椭圆起始角在组码中是起始参数)
  15. ;;(sk_el_ang->Par 真实弧度 长短轴比例值-组码40值)
  16. ;;所谓真实角度指的是起点或终点与长轴方向的夹角
  17. (defun sk_el_ang->Par(ang ratio)
  18.   (if(and (> ang (* pi 0.5))(<= ang (* pi 1.5)))
  19.     (- (atan (/  (tan ang) ratio)) pi)
  20.     (atan (/  (tan ang) ratio))
  21.     )
  22.   )
  23. (defun c:tt()
  24.   (entmake (list '(0 . "ELLIPSE")
  25.                  '(100 . "AcDbEntity")
  26.                  '(100 . "AcDbEllipse")
  27.                  (cons 10 (getpoint "point:"))
  28.                  (cons 11 (list 500 500 0))
  29.                  (cons 40 0.6)
  30.                  (cons 41 (sk_el_ang->Par(ang->rad 30) 0.6))
  31.                  (cons 42 (sk_el_ang->Par(ang->rad 150) 0.6))
  32.                  )
  33.            )  
  34.   )
 楼主| 发表于 2015-8-21 12:55:59 | 显示全部楼层
本帖最后由 fl202 于 2015-8-21 13:04 编辑
edata 发表于 2015-8-20 16:05
终于把这个算法弄出来了,昨天因为高于90的角度计算不正确,所有一直没感确定这个算法的正确,经过多次测试 ...

再次感谢!

e大的角度计算,起点90,终点270°时有点问题。已修正。并增加旋转椭圆。
  1. (defun sk_el_ang->Par(ang ratio / 1ang1)  
  2. ; 关键的子函数,其它可以自己编写了。嫌麻烦的收币下载。
  3. ; 11组码的点与'(0 0)的距离是长轴半径a,与'(0 0)的角度是椭圆旋转的角度。
  4.     (setq 1ang1 (atan (/  (tan ang) ratio)) )   
  5.    (cond
  6.    ((and (> ang (* pi 0.5))(<= ang (* pi 1.5))) (setq 1ang1 (+ pi 1ang1)) )
  7.    ((and (< ang (* pi 2))(> ang (* pi 1.5))) (setq 1ang1 (+ pi pi 1ang1)) )
  8.    )
  9.    1ang1
  10. )

本帖子中包含更多资源

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

x

点评

第18行: (if(and (> ang (* pi 0.5))(<= ang (* pi 1.5)))  发表于 2015-8-21 13:08
发表于 2015-8-21 12:58:50 | 显示全部楼层
fl202 发表于 2015-8-21 12:55
再次感谢!

e大的角度计算,起点90,终点270°时有点问题。已修正。

怎么个个都要收币? edata热心帮你没收币啊
 楼主| 发表于 2015-8-21 13:17:24 | 显示全部楼层
sibelle_hu 发表于 2015-8-21 12:58
怎么个个都要收币? edata热心帮你没收币啊

整个帖子看一遍,自己就编出来了。也是一个学习成长的过程。

不愿意学习的就收币了。。。这程序用处不大,没有赚币的意思。
发表于 2015-8-21 15:32:32 | 显示全部楼层
谢谢楼主的分享
发表于 2015-8-23 20:41:36 | 显示全部楼层
没研究过椭圆..学习..
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-20 09:19 , Processed in 0.199717 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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