xiabin68 发表于 2013-2-2 22:28 
慢慢学吧,这个程序可以变的很精间的,,方便大家学习,没有用自定义函数,,,你试着改吧,,,
附上源码: - (defun get_pline-vertexs (e / i v lst)
- (setq i -1)
- (while (setq v (vlax-curve-getpointatparam e (setq i (1+ i))))
- (setq lst (cons v lst))
- )
- (reverse lst)
- )
- (defun makelwpline(lst)
- (entmake (append (list '(0 . "LWPOLYLINE")
- '(100 . "AcDbEntity")
- '(100 . "AcDbPolyline")
- (cons 90 (length lst))
- )
- (mapcar '(lambda (pt) (cons 10 pt)) lst)
- )
- )
- )
- (defun drawagain(lst / p1 p2 )
- (if(cadr lst)
- (progn
- (vla-GetWidth obj n 'sw 'ew)
- (setq p1(car lst)p2(cadr lst))
- (if(not(=(setq sw(eval 'sw))(setq ew(eval 'ew))0.0))
- (setq reclst(cons(list p1 p2)reclst) widindex(cons (list n sw ew) widindex))
- )
- (setq n(1+ n))
- (if(cadr lst)(drawagain(cdr lst)))
- )
- )
- )
- (defun makenewlst(lst / px py dislst)
- (setq px (caar lst) py (cadar lst))
- (mapcar '(lambda(x)(setq dislst(cons(vlax-curve-getDistAtPoint obj x)dislst)))lst)
- (mapcar '(lambda(x)(setq newplst(cons (list (+ x px)py)newplst)))(reverse dislst))
- (setq newplst (reverse newplst))
- )
- (defun c:tt(/ obj plst n inp newplst reclst widindex oldosm oldcol)
- (command "ucs" "w")
- (setq obj(vlax-ename->vla-object (car(entsel"\n选择多段线"))))
- (if obj
- (progn
- (setq plst(get_pline-vertexs obj) n 0 inp(getpoint"\n展直插入点"))
- (makenewlst plst)
- (makelwpline newplst)
- (drawagain newplst)
- (setq obj(vlax-ename->vla-object(entlast)))
- (vla-move obj (vlax-3d-point(car plst))(vlax-3d-point inp))
- (mapcar '(lambda(x)(apply 'vla-setwidth (cons obj x))) (reverse widindex))
- (setq oldosm (getvar 'osmode))
- (setq oldcol (getvar 'cecolor))
- (setvar 'osmode 0)
- (setvar 'cecolor "2")
- (foreach x reclst
- (command "rectang" (list(caar x)(+ 5(cadar x)))(list(caadr x)(+ 10(cadadr x))))
- (vla-move (vlax-ename->vla-object(entlast)) (vlax-3d-point(car plst))(vlax-3d-point inp))
- )
- )
- )
- (setvar 'osmode oldosm)
- (setvar 'cecolor oldcol)
- (command "ucs" "p")
- (princ)
- )
-
-
|