找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2325|回复: 36

[分享]:spline->pl的高效代码

[复制链接]
发表于 2004-1-7 09:32:18 | 显示全部楼层 |阅读模式

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

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

×
:2204.12.11.23.58
下面的代码有些漏洞,在25楼有完善过的代码~
aro斑竹在23楼的代码也非常好~

这是我刚刚写完的一段将spline转换为pl的代码,主函数通过对自身的递归调用,求出满足拟合精度的顶点表。
当然也可以用于圆弧,圆,椭圆弧,椭圆,带圆弧的复义线,spline化的复义线转换为全部直线段的复义线。

转贴请注明出处,谢谢 [/COLOR]

  1.   [FONT=courier new];__2004.01.08.08.27_____________________________________
  2. ;__样条曲线--〉复义线___BY__WKAI__晓东CAD论坛___________
  3. (defun c:tt (/ pts min_distacne vlo st_par ed_par ent n )
  4.   (setq        vlo             (vlax-ename->vla-object (setq ent (car (entsel "\n选择spline:"))))
  5.         st_par             (vlax-curve-getstartparam vlo)
  6.         ed_par             (vlax-curve-getendparam vlo)
  7.         pts             (list (vlax-curve-getstartpoint vlo))
  8.         min_distacne (/ (vlax-curve-getdistatparam vlo ed_par) 1000.0)
  9.         ;;;_拟合精度,即拟合复义线与spline的最大距离。默认为spline长度的千分一
  10.         n            0
  11.         )
  12.   (t1 vlo st_par ed_par)
  13.   (command "pline")(foreach n pts(command n))(command)
  14.   (princ (strcat "\n创建一条顶点数为" (itoa(length pts))"的复义线。"))(princ)
  15. )
  16. ;________________________________________________________
  17. ;________________________________________________________
  18. (defun t1 (vl_obj start_par end_par / dis_m_m ed_p ed_pt mid_p mid_pt mid_pt_vlo st_p st_pt)
  19.   (setq        st_p           start_par
  20.         ed_p           end_par
  21.         st_pt           (vlax-curve-getpointatparam vl_obj st_p)
  22.         ed_pt           (if (vlax-curve-getpointatparam vl_obj ed_p)
  23.                      (vlax-curve-getpointatparam vl_obj ed_p)
  24.                      (vlax-curve-getendpoint vl_obj)
  25.                    )
  26.         mid_pt           (mapcar '(lambda (x y) (/ (+ x y) 2.0)) st_pt ed_pt)
  27.         mid_pt_vlo (vlax-curve-getpointatparam vl_obj (/ (+ st_p ed_p) 2.0))
  28.         mid_p           (vlax-curve-getparamatpoint vl_obj mid_pt_vlo)
  29.         dis_m_m           (distance mid_pt_vlo mid_pt)
  30.   )
  31.   (if (> dis_m_m min_distacne)
  32.     (progn
  33.       (t1 vl_obj st_p mid_p)
  34.       (t1 vl_obj mid_p ed_p)
  35.     )
  36.     (setq pts (append pts (list mid_pt_vlo) (list ed_pt)))
  37.   )
  38. )
  39. ;________________________________________________________
  40. ;________________________________________________________
  41. (princ "\n样条曲线--〉复义线___BY__WKAI__晓东CAD论坛")  [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-1-7 10:05:07 | 显示全部楼层
是否增加一个 (equal  dis_m_m min_distacne 0.001) 就可以处理近似直线部分的 Spline 或者 含弧段的 Pline。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-1-7 10:23:00 | 显示全部楼层
本来就可以用于 "近似直线部分的 Spline 或者 含弧段的 Pline" 呀~

这段代码关于递归的算法有BUG,还没搞清楚问题所在
:|
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-1-8 02:24:01 | 显示全部楼层
给你把问题搞复杂了吧.干吗还用递归?递归并不高效.
eachy不是写过吗.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-1-8 07:57:04 | 显示全部楼层
已经改好了~
:)

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

使用道具 举报

发表于 2004-1-8 12:47:46 | 显示全部楼层
转换为全部弧线段的复义线效果會比較好
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-1-8 13:42:27 | 显示全部楼层
最初由 LUCAS 发布
[B]转换为全部弧线段的复义线效果會比較好 [/B]


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

使用道具 举报

发表于 2004-1-8 16:19:43 | 显示全部楼层
我也貼一種別類的方法,它不用設精度,,程式未優化不便公開s2p.fas簡體版(for spline & ellipse to pline)


把你的PTS兩點中加一點(曲線上中間點),再利用PLINE指令畫出即可
從以下就知道有多簡單!!

指令: _pline
指定起點:
目前的線寬是 0.0000
指定下一點或 [弧(A)/半寬(H)/長度(L)/復原(U)/寬度(W)]: A

輸入弧終點選項或
[角度(A)/中心點(CE)/方向(D)/半寬(H)/直線(L)/半徑(R)/第二點(S)/復原(U)/寬度(W)]:
S

指定弧的第二點:
指定弧的終點:
指定弧的終點或
[角度(A)/中心點(CE)/閉合(CL)/方向(D)/半寬(H)/直線(L)/半徑(R)/第二點(S)/復原(U)/
寬度(W)]: S

指定弧的第二點:
指定弧的終點:
指定弧的終點或
[角度(A)/中心點(CE)/閉合(CL)/方向(D)/半寬(H)/直線(L)/半徑(R)/第二點(S)/復原(U)/
寬度(W)]:
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-1-8 21:02:51 | 显示全部楼层
传的程序没提示,和你帖子说的不一样,但是已经达到部分转换优化的目的了,只是曲度大处点还多了些
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-1-9 07:51:29 | 显示全部楼层
最初由 wkai 发布
[B]

有没有相关代码?
学习学习~ [/B]

  1. ;;__2004.01.08.08.27_____________________________________
  2. ;;__样条曲线--〉复义线___BY__WKAI__晓东CAD论坛___________
  3. ;;Modify BY LUCAS
  4. (defun C:TT (/ PTS MIN_DISTACNE VLO ST_PAR ED_PAR ENT N LEN)
  5.   (setq        VLO             (vlax-ename->vla-object
  6.                        (setq ENT (car (entsel "\n选择Spline,Ellipse,Arc,Circle: ")))
  7.                      )
  8.         ST_PAR             (vlax-curve-getstartparam VLO)
  9.         ED_PAR             (vlax-curve-getendparam VLO)
  10.         PTS             (list (vlax-curve-getstartpoint VLO))
  11.         MIN_DISTACNE (/ (vlax-curve-getdistatparam VLO ED_PAR) 2000.0)
  12.                                         ; 1000→2000 BY LUCAS
  13. ;;;_拟合精度,即拟合复义线与spline的最大距离。默认为spline长度的千分一
  14.         N             0
  15.   )
  16.   (T1 VLO ST_PAR ED_PAR)

  17.   ;;BY LUCAS
  18.   ;;------------------------------------
  19.   (command "_.PLINE" (nth 0 PTS) "A")
  20.   (setq        N   1
  21.         LEN (/ (length PTS) 2)
  22.   )
  23.   (repeat LEN
  24.     (command "S" (nth N PTS) (nth (1+ N) PTS))
  25.     (setq N (+ N 2))
  26.   )
  27.   (command "")
  28.   ;;-------------------------------------

  29.   ;|
  30.   (command "pline")
  31.   (foreach N PTS (command N))
  32.   (command)
  33.   |;

  34.   (princ (strcat "\n创建一条顶点数为"
  35.                  (itoa LEN)
  36.                  "的复义线。"
  37.          )
  38.   )
  39.   (princ)
  40. )
  41. ;;________________________________________________________
  42. ;;________________________________________________________
  43. (defun T1 (VL_OBJ    START_PAR END_PAR         /           DIS_M_M   ED_P
  44.            ED_PT     MID_P     MID_PT         MID_PT_VLO             ST_P
  45.            ST_PT
  46.           )
  47.   (setq        ST_P           START_PAR
  48.         ED_P           END_PAR
  49.         ST_PT           (vlax-curve-getpointatparam VL_OBJ ST_P)
  50.         ED_PT           (if (vlax-curve-getpointatparam VL_OBJ ED_P)
  51.                      (vlax-curve-getpointatparam VL_OBJ ED_P)
  52.                      (vlax-curve-getendpoint VL_OBJ)
  53.                    )
  54.         MID_PT           (mapcar '(lambda (X Y) (/ (+ X Y) 2.0)) ST_PT ED_PT)
  55.         MID_PT_VLO (vlax-curve-getpointatparam VL_OBJ (/ (+ ST_P ED_P) 2.0))
  56.         MID_P           (vlax-curve-getparamatpoint VL_OBJ MID_PT_VLO)
  57.         DIS_M_M           (distance MID_PT_VLO MID_PT)
  58.   )
  59.   (if (> DIS_M_M MIN_DISTACNE)
  60.     (progn
  61.       (T1 VL_OBJ ST_P MID_P)
  62.       (T1 VL_OBJ MID_P ED_P)
  63.     )
  64.     (setq PTS (append PTS (list MID_PT_VLO) (list ED_PT)))
  65.   )
  66. )
  67. ;;________________________________________________________
  68. ;;________________________________________________________
  69. (princ "\n样条曲线--〉复义线___BY__WKAI__晓东CAD论坛")
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-1-9 10:03:27 | 显示全部楼层
跟我想的不一样,我以为你说用圆弧拟合是为了减少顶点数~

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

使用道具 举报

发表于 2004-1-9 10:39:20 | 显示全部楼层
俺是个新手,不知这些代码该如何插入?求教各位大大
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-1-10 00:41:19 | 显示全部楼层
不过cad自己的 拟合过的pline线炸开是直线,那反过去也应该是直线吧.

其实看你们的意思无非是这样,写的简单点:

  1. [php]
  2. (defun C:TT ( / ed_par n pt vlo)
  3.   (setq        VLO(vlax-ename->vla-object
  4.              (car(entsel "\n选择Spline,Ellipse: ")))
  5.         ED_PAR             (vlax-curve-getendparam VLO)
  6.         PT             (vlax-curve-getendpoint VLO)
  7.         n            (/ ED_PAR 2000.0)                               
  8.   )
  9.   (command "_.PLINE" pt "a")
  10.   (repeat 1000
  11.     (command "S")
  12.     (repeat 2(command(vlax-curve-getpointatparam VLO(setq ED_PAR(- ED_PAR n)))))
  13.   )
  14.   (command "")
  15. )





  16. ;;;如果光直线
  17. (defun C:TT ( / ed_par n pt vlo)
  18.   (setq        VLO(vlax-ename->vla-object
  19.              (car(entsel "\n选择Spline,Ellipse: ")))
  20.         ED_PAR             (vlax-curve-getendparam VLO)
  21.         PT             (vlax-curve-getendpoint VLO)
  22.         n            (/ ED_PAR 1000.0)                               
  23.   )
  24.   (command "_.PLINE" pt )
  25.   (repeat 1000
  26.     (command(vlax-curve-getpointatparam VLO(setq ED_PAR(- ED_PAR n))))
  27.   )
  28.   (command "")
  29. )

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

使用道具 举报

发表于 2004-1-10 03:00:02 | 显示全部楼层
之所有要“复杂”,就是要“优化”。这个才是重点。
如果要简单,还有更简单的。

;另外一种方法

  1. (defun tt2 (e)
  2.   (setq mspace (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
  3.         obj (vlax-ename->vla-object e)
  4.         vlst (vla-get-controlpoints obj))
  5.   (vla-addpolyline mspace vlst)
  6. )


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

使用道具 举报

 楼主| 发表于 2004-1-11 00:15:49 | 显示全部楼层
最初由 aeo 发布
[B]不过cad自己的 拟合过的pline线炸开是直线,那反过去也应该是直线吧.
其实看你们的意思无非是这样,写的简单点:
[/B]


统统等分一千份的做法,对很短的曲线,尤其是很直的曲线是不是有点太过分了~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 17:10 , Processed in 0.372649 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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