找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5994|回复: 19

[LISP函数]:SPLINE转PLINE的小程序

[复制链接]
发表于 2006-8-30 23:12:53 | 显示全部楼层 |阅读模式

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

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

×
在CADALYST上看到的一个SPLINE转PLINE的程序。各位看看

  1.   [FONT=courier new]
  2. ;;CADALYST 12/03 AutoLISP Solutions  SPLINE-TO-PLINE.LSP
  3. ;;(c) 2003 Tony Hotchkiss

  4. (defun spline-to-pline (/ i)
  5.   (vl-load-com)
  6.   (setq        *thisdrawing* (vla-get-activedocument
  7.                         (vlax-get-acad-object)
  8.                       ) ;_ end of vla-get-activedocument
  9.         *modelspace*  (vla-get-ModelSpace *thisdrawing*)
  10.   ) ;_ end of setq
  11.   (setq spline-list (get-spline))
  12.   (setq i (- 1))
  13.   (if spline-list
  14.     (progn
  15.       (setq msg "\nN鷐ero de segmentos <100>: ")
  16.       (initget 6)
  17.       (setq num (getint msg))
  18.       (if (or (= num 100) (= num nil))
  19.         (setq num 100)
  20.       ) ;_ end of if
  21.       (repeat (length spline-list)
  22.         (setq splobj (nth (setq i (1+ i)) spline-list))
  23.         (convert-spline splobj num)
  24.       ) ;_ end of repeat
  25.     ) ;_ end of progn
  26.   ) ;_ end of if
  27. ) ;_ end of spline-to-pline

  28. (defun get-spline (/ spl-list obj spline no-ent i)
  29.   (setq        spl-list nil
  30.         obj         nil
  31.         spline         "AcDbSpline"
  32.         selsets         (vla-get-selectionsets *thisdrawing*)
  33.         ss1         (vlax-make-variant "ss1")
  34.   ) ;_ end of setq
  35.   (if (= (vla-get-count selsets) 0)
  36.     (setq ssobj (vla-add selsets ss1))
  37.   ) ;_ end of if
  38.   (vla-clear ssobj)
  39.   (setq no-ent 1)
  40.   (while no-ent
  41.     (prompt "\nSeleccione splines: ")
  42.     (vla-Selectonscreen ssobj)
  43.     (if        (> (vla-get-count ssobj) 0)
  44.       (progn
  45.         (setq no-ent nil)
  46.         (setq i (- 1))
  47.         (repeat        (vla-get-count ssobj)
  48.           (setq
  49.             obj        (vla-item ssobj
  50.                           (vlax-make-variant (setq i (1+ i)))
  51.                 ) ;_ end of vla-item
  52.           ) ;_ end of setq
  53.           (cond
  54.             ((= (vlax-get-property obj "ObjectName") spline)
  55.              (setq spl-list
  56.                     (append spl-list (list obj))
  57.              ) ;_ end of setq
  58.             )
  59.           ) ;_ end-of cond
  60.         ) ;_ end of repeat
  61.       ) ;_ end of progn
  62.       (prompt "\nNo hay entidades seleccionadas. Int閚talo de nuevo.")
  63.     ) ;_ end of if
  64.     (if        (and (= nil no-ent) (= nil spl-list))
  65.       (progn
  66.         (setq no-ent 1)
  67.         (prompt "\nNo hay splines seleccionadas.")
  68.         (quit)
  69.       ) ;_ end of progn
  70.     ) ;_ end of if
  71.   ) ;_ end of while  
  72.   (vla-delete (vla-item selsets 0))
  73.   spl-list
  74. ) ;_ end of get-spline

  75. (defun convert-spline (splobj n / i)
  76.   (setq        point-list   nil
  77.         2Dpoint-list nil
  78.         z-list             nil
  79.         spl-lyr             (vlax-get-property splobj 'Layer)
  80.         startSpline  (vlax-curve-getStartParam splobj)
  81.         endSpline    (vlax-curve-getEndParam splobj)
  82.         i             (- 1)
  83.   ) ;_ end of setq
  84.   (repeat (+ n 1)
  85.     (setq i (1+ i))
  86.     (setq p (vlax-curve-getPointAtParam
  87.               splobj
  88.               (* i
  89.                  (/ (- endspline startspline) n)
  90.               ) ;_ end of *
  91.             ) ;_ end of vlax-curve-getPointAtParam
  92.     ) ;_ end of setq
  93.     (setq 2Dp               (list (car p) (cadr p))
  94.           2Dpoint-list (append 2Dpoint-list 2Dp)
  95.           point-list   (append point-list p)
  96.           z               (caddr p)
  97.           z-list       (append z-list (list z))
  98.     ) ;_ end of setq
  99.   ) ;_ end of repeat
  100.   (setq summ (apply '+ z-list))
  101.   (setq        arraySpace
  102.          (vlax-make-safearray
  103.            vlax-vbdouble ; element type
  104.            (cons 0
  105.                  (- (length point-list) 1)
  106.            ) ; array dimension
  107.          ) ;_ end of vlax-make-safearray
  108.   ) ;_ end of setq
  109.   (setq vert-array (vlax-safearray-fill arraySpace point-list))
  110.   (vlax-make-variant vert-array)
  111.   (if (and (= :vlax-true (vlax-get-property splobj 'IsPLanar))
  112.            (= summ 0.0)
  113.       ) ;_ end of and
  114.     (setq plobj        (add-polyline
  115.                   2Dpoint-list
  116.                   vla-AddLightweightPolyline
  117.                 ) ;_ end of add-polyline
  118.     ) ;_ end of setq
  119.     (setq plobj        (add-polyline
  120.                   point-list
  121.                   vla-Add3DPoly
  122.                 ) ;_ end of add-polyline
  123.     ) ;_ end of setq
  124.   ) ;_ end of if
  125.   (vlax-put-property plobj 'Layer spl-lyr)
  126.   (vla-delete splobj)
  127.   (vlax-release-object splobj)
  128. ) ;_ end of convert-spline

  129. (defun add-polyline (pt-list poly-func)
  130.   (setq        arraySpace
  131.          (vlax-make-safearray
  132.            vlax-vbdouble
  133.            (cons 0
  134.                  (- (length pt-list) 1)
  135.            ) ; array dimension
  136.          ) ;_ end of vlax-make-safearray
  137.   ) ;_ end of setq
  138.   (setq        vertex-array
  139.          (vlax-safearray-fill arraySpace pt-list)
  140.   ) ;_ end of setq
  141.   (vlax-make-variant vertex-array)
  142.   (setq        plobj (poly-func
  143.                 *modelspace*
  144.                 vertex-array
  145.               ) ;_ end of poly-func
  146.   ) ;_ end of setq
  147. ) ;_ end of add-polyline

  148. (defun c:s2p ()
  149.   (spline-to-pline)
  150.   (princ)
  151. ) ;_ end of c:s2p

  152. (prompt
  153.   "SPLINE-TO-PLINE by Tony Hotchkiss. Entrar S2P para iniciar"
  154. ) ;_ end of prompt

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

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-8-31 08:19:07 | 显示全部楼层
再贴另外一个 S2P

  1. ;;;CADALYST 01/06  Tip 2082: Spline2Pline2.lsp         Spline to Polyline Conversion - Update
  2. ;;;(c) 2006 Cadalyst and Lloyd Beachy + narrator
  3. ;; Spline2Pline2.lsp (c) 2005 Lloyd Beachy + narrator
  4. ;; Routine to convert splines to plines
  5. (Defun C:S2P2 (/ ss pt#        cmdecho        osmode clayer count ent        lay lng        pt-list
  6.                cnt)
  7.   (vl-load-com)
  8.   (setq        ss        (ssget '((0 . "spline")))
  9.         multi#        (getint
  10.                   "Please specify number of polyline points by a multiplicator of spline's control points, leave default for the same number <1>:"
  11.                 )
  12.         cmdecho        (getvar "cmdecho")
  13.         osmode        (getvar "osmode")
  14.         clayer        (getvar "clayer")
  15.         count        0 ;_spline counter
  16.   ) ;_end setq
  17.   (if (null multi#)
  18.     (setq multi# 1)
  19.   )
  20.   (setvar "cmdecho" 0)
  21.   (command ".undo" "begin") ;_begin undo group
  22.   (setvar "osmode" 0)
  23.   (repeat (sslength ss) ;_repeat for each spline
  24.     (setq ent          (vlax-ename->vla-object (ssname ss count)) ;_change spline to vla-object
  25.           lay          (vlax-get-property ent "layer") ;_spline's layer
  26.           cp#          (vlax-get-property ent "numberofcontrolpoints") ;_spline's control points number
  27.           lng          (vlax-curve-getDistAtPoint ent (vlax-curve-getEndPoint ent)) ;_length of spline
  28.           pt-list (list (vlax-curve-getStartPoint ent)) ;_coords for start of spline
  29.           cnt          1.0                        ;segment counter
  30.           pt#          (* cp# multi#)
  31.     ) ;_end setq
  32.     (repeat pt# ;_repeat for each segment
  33.       (setq pt-list
  34.              (cons (vlax-curve-getPointAtDist ent (* lng (/ cnt pt#)))
  35.                    pt-list
  36.              )
  37.       ) ;_add segment's point to pt-list
  38.       (setq cnt (1+ cnt)) ;_counter to next segment
  39.     ) ;_end segment repeat
  40.     (setq cnt 0) ;_pline counter
  41.     (setvar "clayer" lay) ;_match spline's layer
  42.     (command ".pline" ;_start "pline" command
  43.              (repeat (length pt-list) ;_repeat for each point
  44.                (command (nth cnt pt-list)) ;_enter current point
  45.                (setq cnt (1+ cnt)) ;_counter to next point
  46.                "" ;_return value to close "pline" command
  47.              ) ;_end point repeat
  48.     ) ;_end command
  49.     (setq count (1+ count)) ;_counter to next spline
  50.   ) ;_end spline repeat
  51.   (command ".erase" ss "")
  52.   (setvar "osmode" osmode)
  53.   (setvar "clayer" clayer)
  54.   (command ".undo" "end") ;_end of undo group
  55.   (setvar "cmdecho" cmdecho)
  56.   (princ) ;_exit quietly
  57. ) ;_end C:S2P
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-8-31 09:06:47 | 显示全部楼层
请让我也来凑热闹:)我没有编过这个,只能好好学习了
具体帖子可见:
http://www.theswamp.org/index.php?topic=1804.0;all
首先
CAB根据楼主的要求发了两个现成的
1.这个不知道作者,精度还可以

  1. (defun c:sptrace (/ ent spline cur pl end keep)
  2. (setq cur nil)
  3. (setq pl '((0 . "LWPOLYLINE")
  4.      (100 . "AcDbEntity")
  5.      (67 . 0)
  6.      (8 . "0")
  7.      (100 . "AcDbPolyline")
  8.      (90 . 7)
  9.      (70 . 0)
  10.      (43 . 0.0)
  11.      (38 . 0.0)
  12.      (39 . 0.0)
  13.     )
  14.    )
  15. (setq end '(210 0.0 0.0 1.0));define polyline group codes
  16. (while (not (progn (princ "\rSelect Spline: ") ;select spline to convert
  17.     (setq spline (ssget ":s" '((0 . "SPLINE"))))
  18.      )
  19. )
  20. )
  21. (initget "Yes No")
  22. (setq keep (getkword "Keep Original Spline [Yes/No]: "));keep original line or not
  23. (setq spline (ssname spline 0)); get ename
  24. (if (/= keep "No")
  25.    (progn
  26.      (entmake (entget spline));copy spline
  27.      (setq spline (entlast));get ename of new spline
  28.      )
  29.    )
  30. (setq ent spline); copy ename to new variable
  31. (command "splinedit" ent "refine" "elevate" 26 "x" "x");add extra control points
  32. (setq ent (entget ent)); get data for spline
  33. (setq pl (subst (assoc 8 ent) (assoc 8 pl) pl)); set polylines layer to same as spline
  34. (if (= (rem (cdr (assoc 70 ent)) 2) 1);is spline closed
  35.    (setq pl (subst (cons 70 1) (assoc 70 pl) pl));set polyline closed
  36.    (setq pl (subst (cons 70 0) (assoc 70 pl) pl));set polyline open
  37. )
  38. (repeat (length ent);loop
  39.    (progn
  40.      (if (eq (car (car ent)) 10);get control point data
  41. (setq cur (append cur (list (car ent))))
  42.      )
  43.      (setq ent (cdr ent));get next element in list
  44.    )
  45. )
  46. (setq pl (subst (cons 90 (length cur)) (assoc 90 pl) pl));set number of points in polyline
  47. (repeat (length cur);loop
  48.    (progn;add polyline point data
  49.      (setq pl
  50.     (append
  51.       pl
  52.       (list (car cur) (cons 40 0.0) (cons 41 0.0) (cons 42 0.0))
  53.     )
  54.      )
  55.      (setq cur (cdr cur));get next element in list
  56.    )
  57. )
  58. (setq pl (append pl (list end)));add normal vector to polyline data
  59. (entmake pl);make polyline
  60. (entdel (cdr (assoc -1 (entget spline))));entdel spline, original or copy
  61. (princ);exit quietly
  62. )


2.Mauricio Ferman的,精度一般,可能是方法问题

  1. ;Convert SPLINES to PLINES - Mauricio Ferman??2001
  2. (defun c:spl2pl (/ splines plinetype osmode i spl ed codepair)
  3.   (if
  4.     (setq splines (ssget (list (cons 0 "spline"))))
  5.      (progn
  6.        (if
  7.          (zerop (setq plinetype (getvar "plinetype")))
  8.           (setvar "plinetype" 1)
  9.        ) ;if
  10.        (setq osmode (getvar "osmode"))
  11.        (setvar "osmode" 0)
  12.        (setq i 0)
  13.        (while
  14.          (setq spl (ssname splines i))
  15.           (setq i  (1+ i)
  16.                 ed (entget spl)
  17.           ) ;setq
  18.           (command ".pline")
  19.           (foreach
  20.                     codepair
  21.                             ed
  22.             (if
  23.               (= 10 (car codepair))
  24.                (command (cdr codepair))
  25.             ) ;if
  26.           ) ;foreach
  27.           (command "")
  28.           (command ".pedit" "l" "s" "")
  29.        ) ;while
  30.        (if plinetype
  31.          (setvar "plinetype" plinetype)
  32.        )
  33.        (setvar "osmode" osmode)
  34.      ) ;progn
  35.   ) ;if
  36.   (princ)
  37. ) ;defun


3.Columbia(也是theswamp一位高手)写了一个子函数,我稍微加了一个运行函数test和一个绘制函数
这个直接有误差控制,可以模拟的很好

  1. ;;add this rountine to draw
  2. (defun c:test (/ a ptlst)
  3.   (setq a (car (entsel))
  4.         tol 10
  5.   )
  6.   (setq ptlst (spline->pline a tol))
  7.   (make_pline ptlst 2)
  8. )


  9. (vl-load-com)
  10. ;Spline->Pline
  11. (defun Spline->Pline (oSpline tol / 1stPoint dist fullLength lastPoint plinePoints point)
  12.   (setq 1stPoint (vlax-curve-getPointAtParam oSpline (vlax-curve-getStartParam oSpline))
  13.         lastPoint (vlax-curve-getPointAtParam oSpline (vlax-curve-getEndParam oSpline))
  14.         fullLength (vlax-curve-getdistatparam oSpline (vlax-curve-getendparam oSpline))
  15.         dist 0
  16.         plinePoints (list 1stPoint)
  17.   )
  18.   (while (< (setq dist (+ dist tol)) fullLength)   
  19.     (if (setq point (vlax-curve-getPointAtDist oSpline dist))
  20.       (setq plinePoints (append plinePoints (list point)))
  21.     )
  22.   )
  23.   (setq plinePoints (append plinePoints (list lastpoint)))
  24. ;;; Use the variable plinePoints (which is a list of vertex points)
  25. ;;; and whatever method you like to use for adding a polyline
  26. ;;; to the drawing.
  27. )

  28. ;;;makepline
  29. (defun make_pline(lst color)
  30. (entmakex
  31.   (append
  32.     (list
  33.       '(0 . "LWPOLYLINE")
  34.       '(100 . "AcDbEntity")
  35.       '(100 . "AcDbPolyline")
  36.       (cons 90 (length lst))
  37.       '(70 . 0)
  38.       (cons 62 color)
  39.     ) ;_  list
  40.     (mapcar '(lambda (x) (cons 10 x)) lst)
  41.   ) ;_  append
  42. )
  43. )


4.CAB在COLUMBIA的基础上进行一些批量处理,会删除原spline的
第一个用COMMAND

  1. (defun c:spl2pl(/ usrlay usrosm usrplw ent pdist idx ss )
  2.   (setq usrosm (getvar "osmode"))
  3.   (setq usrplw (getvar "plinewid"))
  4.   (setvar "plinewid" 0 )
  5.   (setvar "osmode" 0 )
  6.   (setq pdist 36) ; distance between points on new pline
  7.   (if (setq ss (ssget '((0 . "SPLINE")))); get all splines
  8.     (progn
  9.       (setq idx (sslength ss))
  10.       (while (>= (setq idx (1- idx)) 0)
  11.         (setq ent (ssname ss idx))
  12.         (if (setq plist (Spline->Pline ent pdist))
  13.           (progn
  14.             (command "._pline" )
  15.             (mapcar '(lambda (x) (command x)) plist)
  16.             (command "")
  17.             (command "._change" "_Last" "" "_P" "_LA" (cdr(assoc 8(entget ent)))"")
  18.             (entdel ent)
  19.           ) ; progn
  20.         ); endif
  21.       ) ; while
  22.     ) ; progn
  23.     (prompt "\nNo splines in drawing.")
  24.   ) ;endif
  25.   (setvar "osmode" usrosm)
  26.   (setvar "plinewid" usrplw)
  27.   (princ)
  28. );defun

第二个用ENTMAKE

  1. (defun c:spl2pl(/ usrlay usrosm usrplw ent pdist idx ss pl plist pentlst)
  2.   (setq pdist 36) ; distance between points on new pline
  3.   (setq pentlst '((0 . "LWPOLYLINE")
  4.      (100 . "AcDbEntity")
  5.      (67 . 0)
  6.      (8 . "0")
  7.      (100 . "AcDbPolyline")
  8.      (90 . 7)
  9.      (70 . 0)
  10.      (43 . 0.0)
  11.      (38 . 0.0)
  12.      (39 . 0.0)
  13.     )
  14.    )
  15.   (setq end '(210 0.0 0.0 1.0));define polyline group codes
  16.   (if (setq ss (ssget  '((0 . "SPLINE")))); get all splines
  17.     (progn
  18.       (setq idx (sslength ss))
  19.       (while (>= (setq idx (1- idx)) 0)
  20.         (setq ent (ssname ss idx)
  21.               pl pentlst)
  22.         (if (setq plist (Spline->Pline ent pdist))
  23.           (progn
  24.             (foreach x plist
  25.               (setq pl (append pl
  26.                         (list (cons 10 (list (car x)(cadr x)))
  27.                               (cons 40 0.0)
  28.                               (cons 41 0.0)
  29.                               (cons 42 0.0))))
  30.             )
  31.             ;;set number of points in polyline
  32.             (setq pl (append
  33.                        (subst (cons 90 (length plist)) (assoc 90 pl) pl)
  34.                        pl
  35.                        (list end))
  36.             )
  37.             ;;  update layer
  38.             (setq pl (subst (assoc 8 (entget ent)) (assoc 8 pl) pl))
  39.             (entmake pl);make polyline
  40.             (entdel ent)
  41.           ) ; progn
  42.         ); endif
  43.       ) ; while
  44.     ) ; progn
  45.     (prompt "\nNo splines in drawing.")
  46.   ) ;endif
  47.   (princ)
  48. )


从这个学习中看到,spline2pline的处理方法
caddog和eachy兄贴的都用了vlax-curve函数,不知名作者采用了splinedit的refine方法,Mauricio Ferman采用了直接提取控制
点的方法,精度应该就差了,而columbia和cab用的仍然是vlax-curve的方法,应该说,这种精度可以人为选择,可以达到很高水平。据说还有一种转成DXF 12格式再导入的方法,应该也是一种没有程序时候的变通方法吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-8-31 13:18:21 | 显示全部楼层
综合 2 楼 和 Mauricio Ferman 的方法就可以写出纯 Lisp 简单而实用的 Spline -〉Pline 程序。

有兴趣的可以对比下各个程序的效果

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

使用道具 举报

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

使用道具 举报

发表于 2006-8-31 14:37:18 | 显示全部楼层
这个问题还应该引伸为插点合并和自动加入。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-8-31 15:41:31 | 显示全部楼层
上面几个程序归纳起来有几种方法:

1 用 Param 对整条线均分,这种方法很容易想到,早期这样写的居多

2 在第一种方法上改进,利用 Spline 控制点,在控制点间等分,这种方法可以改进第一种方法中的取点不合理的地方,尤其在转折处的改善

3 还有一种方法就是利用 Pline 的样条化,利用 Spline 的控制点绘制 Pline ,然后执行样条化。但是这种方法对曲率变换较大的 SPline 将产生很大的偏离。

还看过  ARX 对这种模拟的处理,好像是什么弓高比,ARX 中提供了相应的一些函数,考虑到执行效率是无法使用在 Lisp 中的.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

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

使用道具 举报

发表于 2006-9-1 07:38:45 | 显示全部楼层
这是我以前做的程序,还有抽稀线功能模块!采用的是另外一种方法  精度很高
http://www.xdcad.net/forum/showt ... 2530879#post2530879
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-9-1 08:26:47 | 显示全部楼层
4 楼的方法应该和这种转化类似,精度由 CAD 控制,只是不用 DXFOUT ,利用 Pline-〉样条化 作为过渡,Pline 样条化的线就是一段段的 Line ,由这一段段 Line 的 Point 影射到 Spline 上就是那些拟和点。

前面的几个程序都是分开来做,没有完成最后一步将点影射到Spline后再次生成 Pline
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2006-9-1 12:19:07 | 显示全部楼层
没想到我抛了一块砖,引来众位这么多玉:)一定好好地学习学习。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-9-1 13:23:55 | 显示全部楼层
转贴lucas以前的一篇

  1. ;;利用OFFSET特性(对SPLINE & ELLIPSE  OFFSET后会增加控制点)
  2. ;;SPLINE & ELLIPSE TO PLINE
  3. ;;BY  龙龙仔(LUCAS)
  4. (defun C:S2P (/ HOLDOSMODE HOLDECHO SSS SSL N N1 ENT PT_LIST NUMPT ED PT PT1)
  5.   ;;T. Tanzillo
  6.   (defun VLISP-REMOVE-IF-NOT (KEY LST)
  7.     (mapcar 'cdr
  8.      (vl-remove-if-not
  9.        '(lambda (E) (eq (car E) KEY))
  10.        LST
  11.      )
  12.     )
  13.   )

  14.   (defun MIDPOINT (PT1 PT2)
  15.     (mapcar
  16.       '(lambda (X Y)
  17.   (* 0.5 (+ X Y))
  18.        )
  19.       PT1
  20.       PT2
  21.     )
  22.   )

  23.   (setq HOLDECHO (getvar "cmdecho"))
  24.   (setvar "cmdecho" 0)
  25.   (command "_.undo" "group")
  26.   (setq HOLDOSMODE (getvar "osmode"))
  27.   (setvar "osmode" 0)
  28.   (prompt "\n选取SPLINE,ELLIPSE:")
  29.   (setq SSS (ssget '((0 . "ELLIPSE,SPLINE"))))
  30.   (setq SSL (sslength SSS)
  31. N   0
  32.   )
  33.   (repeat SSL
  34.     (prompt (strcat "\r余 " (itoa (- SSL N)) " 个物件     "))
  35.     (setq ENT (vlax-ename->vla-object (ssname SSS N)))
  36.     (vl-catch-all-apply
  37.       'vla-offset
  38.       (list ENT 0.001)
  39.     )
  40.     (setq ENT (entlast))
  41.     (vl-catch-all-apply
  42.       'vla-offset
  43.       (list (vlax-ename->vla-object ENT) -0.001)
  44.     )
  45.     (entdel ENT)
  46.     (setq ENT (entlast))
  47.     (setq PT_LIST (VLISP-REMOVE-IF-NOT 10 (setq ED (entget ENT))))
  48.     (setq ENT (vlax-ename->vla-object ENT))
  49.     (setq N1 0)
  50.     (vl-cmdf "_.pline" (nth N1 PT_LIST) "A")
  51.     (if (or (and (= (cdr (assoc 0 ED)) "ELLIPSE")
  52.    (= (cdr (assoc 42 ED)) (* pi 2))
  53.      )
  54.      (and (= (cdr (assoc 0 ED)) "SPLINE")
  55.    (= (logand (cdr (assoc 70 ED)) 1) 1)
  56.      )
  57. )
  58.       (setq NUMPT (- (length PT_LIST) 2))
  59.       (setq NUMPT (- (length PT_LIST) 1))
  60.     )
  61.     (repeat NUMPT
  62.       (setq PT (vlax-curve-getclosestpointto
  63.    ENT
  64.    (MIDPOINT (nth N1 PT_LIST)
  65.       (setq PT1 (nth (1+ N1) PT_LIST))
  66.    )
  67.         )
  68.       )
  69.       (vl-cmdf "S"
  70.         (vlax-curve-getclosestpointto ENT PT)
  71.         (vlax-curve-getclosestpointto ENT PT1)
  72.       )
  73.       (setq N1 (1+ N1))
  74.     )
  75.     (if (or (and (= (cdr (assoc 0 ED)) "ELLIPSE")
  76.    (= (cdr (assoc 42 ED)) (* pi 2))
  77.      )
  78.      (and (= (cdr (assoc 0 ED)) "SPLINE")
  79.    (= (logand (cdr (assoc 70 ED)) 1) 1)
  80.      )
  81. )
  82.       (vl-cmdf "CL")
  83.       (vl-cmdf "")
  84.     )
  85.     (vla-delete ENT)
  86.     (setq N (1+ N))
  87.   )
  88.   (setvar "osmode" HOLDOSMODE)
  89.   (command "_.undo" "end")
  90.   (setvar "cmdecho" HOLDECHO)
  91.   (princ)
  92. )


第一次测试:
http://fs3.139.com/1/1021/dreamsky_lxx/photo/200691133350179.jpg
贴不上图,只好给个连接
评分标准:
优化 1~3
精度 1~3
越大越好
打*号表示可以通过输入数字调整精度。
考虑到评测时有主观观测的误差,结果仅作参考


下面是用到xdapi,因无cad2004,没有进行测试

  1. ;;; 命令curve2pl
  2. ;;; 功能:循环多选circle,ellipse,arc,spline用
  3. ;;;      polyline模拟,生成的多义线类型由当前
  4. ;;;      系统的plinetype变量控制。
  5. ;;; 程序在一次循环中提示一次是否删除旧的曲线
  6. ;;; 请加载xdrx_api

  7. (defun c:curve2pl (/ ss ptl e sel #del_curve_flag #is_closed)
  8.   (defun #is_closed (name / tf1)
  9.     (setq tf1 t)
  10.     (cond
  11.       ((= "ARC" name)
  12.     (setq tf1 nil)
  13.       )
  14.       ((= "ELLIPSE" name)
  15.     (if (> (abs (- (xdrx_getentdxf 42) (xdrx_getentdxf 41))) 1e-5)
  16.       (setq tf1 nil)
  17.     )
  18.       )
  19.       ((= "SPLINE" name)
  20.     (if (= (logand (xdrx_getentdxf 70) 1) 0)
  21.       (setq tf1 nil)
  22.     )
  23.       )
  24.     )
  25.     tf1
  26.   )

  27.   (while (progn
  28.       (prompt "\n请选取要用多义线模拟的circle,arc,ellipse,spline<退出>:")
  29.       (setq ss (ssget '((0 . "circle,arc,ellipse,spline"))))
  30.      )
  31.     (xdrx_setsstodb ss 0)
  32.     (while (setq e (xdrx_getentdata 0))
  33.       (setq ptl (xdrx_getsamplept e))
  34.       (if (not #del_curve_flag)
  35.     (progn
  36.       (initget 0 "Yes No")
  37.       (if (not (setq sel (getkword (strcat "\n是否删除旧的曲线<Yes>:"))))
  38.         (setq #del_curve_flag "Yes")
  39.         (setq #del_curve_flag sel)
  40.       )
  41.     )
  42.       )
  43.       (if (= "Yes" #del_curve_flag)
  44.     (entdel e)
  45.       )
  46.       (apply
  47.     'command
  48.     (cons "pline" ptl)
  49.       )
  50.       (if (#is_closed (xdrx_getentdxf 0))
  51.     (command "c")
  52.     (command "")
  53.       )
  54.     )
  55.   )
  56.   (princ)
  57. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 00:56 , Processed in 0.257351 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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