明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 596|回复: 2

希望大神帮改个画单线管

[复制链接]
发表于 2019-11-18 10:28 | 显示全部楼层 |阅读模式
1明经币
在明经论坛经常有些连续画弯头的程序效果是图a,希望大神能帮添加两个功能(1)可以自定义多段线的宽度(2)在弯头处加两条短线短线(长度为线宽的5倍,如图b所示。


附件: 您需要 登录 才可以下载或查看,没有账号?注册
 楼主| 发表于 2019-11-18 10:34 | 显示全部楼层
论坛有个画连续弯头的程序:http://bbs.mjtd.com/thread-93655-3-1.html
回复

使用道具 举报

 楼主| 发表于 2019-11-18 10:49 | 显示全部楼层
这个程序也能实现图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)
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-7 06:32 , Processed in 0.243705 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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