拟合的POLYLINE转SPLINE
(defun c:2ndss2spls ( / *error* arc2spl line2spl loop sss i ent ssss )
(vl-load-com)
(defun *error* ( msg )
(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
(if msg (prompt msg))
(princ)
)
(defun arc2spl ( e / make_spline points q1 q2 a pc f pe ps w )
(setq q1 (vlax-curve-GetStartParam e)
q2 (vlax-curve-GetEndParam e)
a(/ (- (vlax-curve-GetEndParam e) (vlax-curve-GetStartParam e)) 3.0) ; a - parameter interval... and angle
pc (mapcar ; pc - points on contur
(function
(lambda (p)
(vlax-curve-GetPointAtParam e p)
)
)
(list q1 (+ q1 a) (- q2 a) q2)
)
f(mapcar ; f - first deriv on pc
(function
(lambda (p)
(vlax-curve-GetFirstDeriv e p)
)
)
(list q1 (+ q1 a) (- q2 a) q2)
)
pe (mapcar ; pe - extra control points for spline construction
(function
(lambda (p1 p2 d1 d2)
(inters p1 (mapcar '+ p1 d1)
p2 (mapcar '+ p2 d2)
nil
)
)
)
pc (cdr pc) f (cdr f)
)
ps(list (car pc) (car pe) (cadr pc) (cadr pe) (caddr pc) (caddr pe) (cadddr pc)) ; ps - control points for spline
w (list 1.0 (cos (/ a 2)) 1.0 (cos (/ a 2)) 1.0 (cos (/ a 2)) 1.0); weights for spline
)
(defun make_spline ( pts )
(entmakex
(append
'((0 . "SPLINE") (100 . "AcDbEntity") (100 . "AcDbSpline")
(70 . 4) (71 . 2) (72 . 10) (73 . 7) (74 . 0)
(42 . 1.0e-010) (43 . 1.0e-010)
(40 . 0.0) (40 . 0.0) (40 . 0.0) (40 . 1.0) (40 . 1.0)
(40 . 2.0) (40 . 2.0) (40 . 3.0) (40 . 3.0) (40 . 3.0))
pts
)
)
)
(entdel e)
(make_spline (points ps w))
)
(defun line2spl ( e / sp ep d )
(setq sp (cdr (assoc 10 (entget e)))
ep (cdr (assoc 11 (entget e)))
d (distance sp ep)
)
(entdel e)
(entmakex
(list
'(0 . "SPLINE") '(100 . "AcDbEntity") '(100 . "AcDbSpline") '(210 0.0 0.0 1.0) '(71 . 1) '(73 . 2)
'(42 . 1.0e-010) '(43 . 1.0e-010) '(40 . 0.0) '(40 . 0.0) (cons 40 d) (cons 40 d) (cons 10 sp) (cons 10 ep)
)
)
)
(vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
(setq loop T)
(setq sss (ssget "_I"))
(if
(and
sss
(vl-some '(lambda ( x ) (wcmatch (cdr (assoc 0 (entget x))) "LINE,ARC,*POLYLINE")) (vl-remove-if 'listp (mapcar 'cadr (ssnamex sss))))
)
(setq loop nil)
)
(while loop
(setq sss (ssget "_:L" (list '(-4 . "<or") '(0 . "LINE,ARC,LWPOLYLINE") '(-4 . "<and") '(0 . "POLYLINE") '(-4 . "<or") '(70 . 0) '(70 . 1) '(70 . 8) '(70 . 9) '(70 . 128) '(70 . 129) '(-4 . "or>") '(-4 . "and>") '(-4 . "or>"))))
(if sss (setq loop nil))
)
(setq ssss (ssadd))
(repeat (setq i (sslength sss))
(setq ent (ssname sss (setq i (1- i))))
(cond
( (eq (cdr (assoc 0 (entget ent))) "LINE")
(line2spl ent)
(ssadd (entlast) ssss)
)
( (eq (cdr (assoc 0 (entget ent))) "ARC")
(arc2spl ent)
(ssadd (entlast) ssss)
)
( (eq (cdr (assoc 0 (entget ent))) "LWPOLYLINE")
(sssetfirst nil (ssadd ent))
(c:lw2spl)
(ssadd (entlast) ssss)
(sssetfirst nil nil)
)
( (and
(eq (cdr (assoc 0 (entget ent))) "POLYLINE")
(or
(eq (cdr (assoc 70 (entget ent))) 0)
(eq (cdr (assoc 70 (entget ent))) 1)
(eq (cdr (assoc 70 (entget ent))) 128)
(eq (cdr (assoc 70 (entget ent))) 129)
)
)
(command "_.CONVERTPOLY" "_L" ent)
(while (> (getvar 'cmdactive) 0) (command ""))
(sssetfirst nil (ssadd ent))
(c:lw2spl)
(ssadd (entlast) ssss)
(sssetfirst nil nil)
)
( (and
(eq (cdr (assoc 0 (entget ent))) "POLYLINE")
(or
(eq (cdr (assoc 70 (entget ent))) 8)
(eq (cdr (assoc 70 (entget ent))) 9)
)
)
(sssetfirst nil (ssadd ent))
(c:3p2spl)
(ssadd (entlast) ssss)
(sssetfirst nil nil)
)
)
)
(sssetfirst nil ssss)
(*error* nil)
)
(defun c:oldheavyfit2spl ( / *error* *adoc* ss pl sp e sss )
(vl-load-com)
(defun *error* ( m )
(vla-endundomark *adoc*)
(if m
(prompt m)
)
(princ)
)
(vla-startundomark (setq *adoc* (vla-get-activedocument (vlax-get-acad-object))))
(prompt "\nPick old heavy 2d polyline that is curve fited...")
(setq ss (ssget "_+.:E:S:L" (list '(0 . "POLYLINE") '(-4 . "<or") '(70 . 2) '(70 . 3) '(70 . 130) '(70 . 131) '(-4 . "or>"))))
(if ss
(progn
(setq pl (ssname ss 0))
(setq sp (vlax-curve-getstartpoint pl))
(command "_.EXPLODE" pl)
(while (< 0 (getvar 'cmdactive))
(command "")
)
(sssetfirst nil (ssget "_P"))
(c:2ndss2spls)
(setq sss (cadr (ssgetfirst)))
(setq e (car (nentselp (trans sp 0 1))))
(command "_.JOIN" e sss "")
)
)
(*error* nil)
)
函数 points :
**** Hidden Message *****
听说爆破一下就可以了,不知道是不是真的。很难遇到POLYLINE线,也无法验证 /db_自贡黄明儒_ 发表于 2017-7-14 13:14
自己画个2D POLYLINE不就验证了,你说的爆破一下是做什么? 变SPLINE ?
感谢版主的分享
谢谢
我以为是反过来..样条转多段线
好程序,謝謝分享!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
实用程序谢谢分享!!!
{:1_1:}回复看看 做好事业务的一样
进来学习哈,谢谢!
回复学习,谢谢分享
感谢自主分享程序 不会吧,还可以这样
多数是spline转polyline,这个牛逼谢谢分享