Jully 发表于 2011-3-24 15:52:16

样条曲线表示任意图形

在AutoCAD中,对于一个任意图形(如直线、圆弧、多段线、样条曲线等组合),能否用样条曲线把这个图形统一表示出来???请求大家指点!!!

http://space.mjtd.com/xwb/images/bgimg/icon_logo.png 该贴已经同步到 Jully的微博

mandala 发表于 2011-4-15 21:28:10

本帖最后由 mandala 于 2011-4-15 21:44 编辑

如果这个图形是连续的话,可以将其连成一条多段线。用样条曲线的话,我好像只能想到用多段线相连后,再每隔一个小单位长度取一个点,然后连起来。但用样条曲线连线,会使图形失真。有必要去这么连吗?

mandala 发表于 2011-4-15 21:37:57

本帖最后由 mandala 于 2011-4-15 21:39 编辑

可以参考一下我写的一个lsp,其中连线的模糊距离设置为0.1,你可按需要修改。

;;子程序,将输入选择集ssp中的LINE,POLYLINE,LWPOLYLINE,SPLINE,ARC,circle,统一变成LWPOLYLINE,
;;如果其中有首尾相连的线,则连接成一条LWPOLYLINE,
;;最后返回一个名为xss的选择集。
(defun connectbypline (ssp / a xss xn ent)
(acet-autoload2 '("FLATTENSUP.LSP" (acet-flatn ss hide)))
;;加载flatten函数
(setq a   0
xss (ssadd)
) ;_ 结束setq
(if
    (and (= (sslength ssp) 1)
(or (= (cdr (assoc 0 (entget (ssname ssp 0)))) "LWPOLYLINE")
      (= (cdr (assoc 0 (entget (ssname ssp 0)))) "POLYLINE")
) ;_ 结束or
    ) ;_ 结束and
   (ssadd (ssname ssp 0) xss)
   ;;当选中的仅有一条pline的时候另作处理。
   (progn
       ;;如果有很多图元的话,全部变成pline并加入选择集xss:
       (repeat (sslength ssp)
(setq xn (ssname ssp a))
(setq ent (entget xn))
(cond
    ((= (cdr (assoc 0 ent)) "LWPOLYLINE")
   (ssadd xn xss)
    )
    ((= (cdr (assoc 0 ent)) "POLYLINE")
   (ssadd xn xss)
    )
    ((= (cdr (assoc 0 ent)) "LINE")
   (command "pedit" xn "y" "")
   (setq xn (entlast))
   (ssadd xn xss)
    )
    ((= (cdr (assoc 0 ent)) "SPLINE")
   (setq ss (ssadd))
   (ssadd xn ss)
   (acet-flatn ss nil)
   (setq xn (entlast))
   (ssadd xn xss)
    )
    ((= (cdr (assoc 0 ent)) "ARC")
   (command "pedit" xn "y" "")
   (setq xn (entlast))
   (ssadd xn xss)
    )
    ((= (cdr (assoc 0 ENT)) "CIRCLE")
   ;;圆的处理比较复杂
   (setq cp (cdr (assoc 10 ent))
    r(cdr (assoc 40 ent))
   ) ;_ 结束setq
   (entmake
       (setq lst (list
   '(0 . "LWPOLYLINE")
   '(100 . "AcDbEntity")
   '(67 . 0)
   '(410 . "Model")
   '(100 . "AcDbPolyline")
   '(90 . 2)
   '(70 . 129)
   (cons 10 (polar cp 0 r))
   '(40 . 0)
   '(41 . 0)
   '(42 . -1)
   (cons 10 (polar cp pi r))
   '(40 . 0)
   '(41 . 0)
   '(42 . -1)
   );list
       )    ;setq
   )    ;entmake
   (command "_matchprop" xn (entlast) "")
   (entdel xn)
   (setq xn (entlast))
   (ssadd xn xss)
    )
)    ;cond
(setq a (+ a 1))
       )    ;repeat,以上将每个图元都变成pline并加入了选择集。
       (command "pedit" "m" xss "" "j" 0.1 "")
       ;;把能连的连上。
       (setq xss xss)
   )   ;progn
)   ;if
) ;_ 结束defun


raimo 发表于 2011-4-16 07:16:07

本帖最后由 raimo 于 2011-4-16 07:17 编辑

直接多段线闭合选择范围就好啦,样条曲线点数太多,如果用自动的更难保证合适的分段数
页: [1]
查看完整版本: 样条曲线表示任意图形