qssq 发表于 2019-11-18 10:28:37

希望大神帮改个画单线管

在明经论坛经常有些连续画弯头的程序效果是图a,希望大神能帮添加两个功能(1)可以自定义多段线的宽度(2)在弯头处加两条短线短线(长度为线宽的5倍,如图b所示。


qssq 发表于 2019-11-18 10:34:04

论坛有个画连续弯头的程序:http://bbs.mjtd.com/thread-93655-3-1.html

qssq 发表于 2019-11-18 10:49:38

这个程序也能实现图a的效果
(defun err (s)
   (if (and (/= s "console break")
      (/= s "Function cancelled")
      (/= s "quit/exit abort")
    )
(progn
    (setvar "osmode" oldos)   
    (setvar "autosnap" oldosn)
    (setvar "orthomode" oldor)
    (setq *error* olderr)
    (command "_.undo" "e")
   (setvar "cmdecho" oldcmd)
    (princ (strcat "\n程序出错或用户退出:" s))
)
   )
)
;;;备份系统变量
(defun bak ()
   (setq      oldcmd      (getvar "cmdecho"))
   (setvar "cmdecho" 0)
   (command "_.undo" "be")
   (setq      oldos      (getvar "osmode")
   oldosn (getvar "autosnap")
   oldor (getvar "orthomode")      
   olderr      *error*
   *error*      err
   )
)
;;恢复系统变量
(defun rebak ()
   (setvar "osmode" oldos)
   (setvar "autosnap" oldosn)
   (setvar "orthomode" oldor)
   (setq *error* olderr)
   (command "_.undo" "e")
   (setvar "cmdecho" oldcmd)
)
;求交点集函数-nth
;;经过测试,nth函数仅比assoc函数快一点点。
;;故此函数也可取消i,j变量,直接使用assoc函数
(defun ssinter (el / el1 obj1 obj2 ipts pts list1 outlst i j)
   (setq outlst (mapcar 'list el)
i      -1   ;obj1位置指针
n      0   ;交点数计数器
   )
   (while el
(setq obj1 (car el)
    list1 (nth (setq i (1+ i)) outlst) ;obj1已有的交点列表
    el (cdr el)
    el1 el
    j i   ;obj2位置指针
)
(while el1
    (setq obj2 (car el1)
   el1(cdr el1)
   j(1+ j)
    )
    ;;取交点
    (if (and (setq ipts (vla-intersectwith obj1 obj2 0))
   (setq ipts (vlax-variant-value ipts))
   (> (vlax-safearray-get-u-bound ipts 1) 0)
    )
(progn
    (setq ipts (vlax-safearray->list ipts)
   pts'();obj1,obj2交点临时列表变量
    )
    (while (> (length ipts) 0)
   (setq pts(cons (list (car ipts)
   (cadr ipts)
   (caddr ipts)
   )
   pts
    )
ipts (cdddr ipts)
   )
    )
    (setq list1 (append list1 pts) ;存obj1交点表,循环结束后再更新
   n   (+ n (length pts)) ;交点计数累加
    )
    ;;obj2的交点列表立即更新
    (setq
   outlst (subst (append (nth j outlst) pts)
   (nth j outlst)
   outlst
   )
    )
)
    )
)
;|   ;;当obj1存在交点,且非封闭曲线,添加两端点
(if (and (cdr list1) (not (vlax-curve-isClosed obj1)))
    (setq list1 (append list1
   (list (vlax-curve-getEndPoint obj1))
   (list (vlax-curve-getStartPoint obj1))
)
    )
)
(setq outlst (subst list1 (nth i outlst) outlst)) ;更新obj1交点列表 |;
   )
   outlst
)
;;点集排序及删除重复点函数
(defun InterSort (el / obj1 pts plst outlst)
   (setq outlst '())   ;empty list
   (foreach item el
(setq obj1 (car item)
    pts(cdr item)
    plst '()   ;empty list
)
(if pts    ;若无交点,则不修改该实体
    (progn
;;交点排序,列表为逆序
(setq
    pts (vl-sort
   pts
   (function (lambda (p1 p2)
   (< (vlax-curve-getParamAtPoint obj1 p1)
   (vlax-curve-getParamAtPoint obj1 p2)
   )
   )
   )
   )
)
;;剔除重复点并将列表顺序转正
(foreach p pts
    (if plst
   (if (not (equal p (car plst) 0.00001))
   (setq plst (cons p plst))
   )
   (setq plst (cons p plst))
    )
)
;;闭合曲线需再添加首个交点以使新实体完全封闭
(if (vlax-curve-isClosed obj1)
    (setq plst (cons (last plst) plst))
)
(setq plst   (cons (vlax-vla-object->ename obj1) plst)
   outlst (cons plst outlst)
)
    )
)
   )
   outlst
)
;;计算耗时
(defun xdl-getutime ()
   (* 86400 (getvar "tdusrtimer"))
)
;; 清理当前选择集
(defun Clearcset (/ cset)
(if (not (vl-catch-all-error-p   
(setq cset (vl-catch-all-apply 'vla-item (list(vlax-get-property (vlax-get-property (vlax-get-acad-object) 'activedocument ) 'selectionsets)"CURRENT")))
      )      
    )   
(vla-delete cset)
)
(princ)
)

(defun c:xlx( / elist ssg n t0)
   (VL-LOAD-COM)
   (setq pt_list1 '())
   (setq r (getreal (strcat "请输入倒角半径<" (rtos (getvar "filletrad"))
         ">"
      )
      )
   )
   (if (null r)
    (setq r (getvar "filletrad"))
    (setvar "filletrad" r)
)
;(setq ss (ssget '((0 . "line"))))
(bak)
(clearcset)
(if (setq ssg (ssget '((0 . "line"))))
    (vlax-for obj (vla-get-activeselectionset
      (vla-get-activedocument (vlax-get-acad-object))
    )
      (setq elist (cons obj elist)) ; ssg->elist
    )
(vlax-release-object obj)
)
(setq t0 (xdl-getutime))
(setq pt_list(InterSort (ssinter elist)))
(foreach pt pt_list
(setq pt_list1 (append (cdr pt)pt_list1))
)
(foreach pt pt_list1
;(setq pt (cadr pt))
    (progn
      (setq ss2 (ssget "c" pt pt))
      (setq en1 (ssname ss2 0))
    (setq en2 (ssname ss2 1))
      (if (and en1 en2)(command "fillet" en1 en2))
      )
    )
(rebak)
(princ (strcat "\n*****找到交点"
   (itoa n)
   "个,交点倒角操作操作共耗时"
   (rtos (- (xdl-getutime) t0) 2 3)
   "秒。*****"
)
)
(princ)
(prompt "<<xlx>>相连线批量倒角")
)
(prompt "<<xlx>>相连线批量倒角")
(princ)
页: [1]
查看完整版本: 希望大神帮改个画单线管