明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: dyzf1314

框选进行批量倒圆

    [复制链接]
 楼主| 发表于 2012-4-23 20:32:42 | 显示全部楼层
本帖最后由 dyzf1314 于 2012-4-23 20:56 编辑
xiaxiang 发表于 2012-4-23 15:45
依楼主附图来看
可以试一下如下代码

晚上回家再试了下,对于下图的中选择其中的一个图形可以实现批量倒圆,



但是附件DWG文件不知道为什么,不能实现批量的操作,单独的红色或者黑色部分的都可以实现批量操作,
但如果一起选中,CAD报错如下,能解决吗?

Command: xlx
半径:150
Select objects: Specify opposite corner: 10 found
Select objects:  ; error: bad argument type: 2D/3D point: nil

另外,我想问下,如果在全部倒好圆的图形,能否再次运行lisp,把倒圆角的数值改为0,再恢复到初始的图形呢?









本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2012-4-23 20:59:56 | 显示全部楼层
本帖最后由 dyzf1314 于 2012-4-23 21:01 编辑
【KAIXIN】 发表于 2012-4-23 19:38
怎么是多谢我呢?

帮忙看看我上面的问题??
发表于 2012-4-24 00:15:51 | 显示全部楼层
我怀疑楼主用的是金山快译且额外附带了中对中翻译。
发表于 2012-4-24 08:08:27 | 显示全部楼层
明经论坛上的朋友很无私啊,让我们这些新手学到了很多,不过自己技术底子差,为论坛做不了什么,惭愧
发表于 2012-4-24 14:34:07 | 显示全部楼层
对程序进行了重写

  1. ;出错处理
  2. (defun err (s)
  3.    (if (and (/= s "console break")
  4.       (/= s "Function cancelled")
  5.       (/= s "quit/exit abort")
  6.     )
  7.   (progn
  8.     (setvar "osmode" oldos)     
  9.     (setvar "autosnap" oldosn)
  10.     (setvar "orthomode" oldor)
  11.     (setq *error* olderr)
  12.     (command "_.undo" "e")
  13.      (setvar "cmdecho" oldcmd)
  14.     (princ (strcat "\n程序出错或用户退出:" s))
  15.   )
  16.    )
  17. )
  18. ;;;备份系统变量
  19. (defun bak ()
  20.    (setq        oldcmd        (getvar "cmdecho"))
  21.    (setvar "cmdecho" 0)
  22.    (command "_.undo" "be")
  23.    (setq        oldos        (getvar "osmode")
  24.    oldosn (getvar "autosnap")
  25.    oldor (getvar "orthomode")        
  26.    olderr        *error*
  27.    *error*        err
  28.    )
  29. )
  30. ;;恢复系统变量
  31. (defun rebak ()
  32.    (setvar "osmode" oldos)  
  33.    (setvar "autosnap" oldosn)
  34.    (setvar "orthomode" oldor)
  35.    (setq *error* olderr)
  36.    (command "_.undo" "e")
  37.    (setvar "cmdecho" oldcmd)
  38. )
  39. ;求交点集函数-nth
  40. ;;经过测试,nth函数仅比assoc函数快一点点。
  41. ;;故此函数也可取消i,j变量,直接使用assoc函数
  42. (defun ssinter (el / el1 obj1 obj2 ipts pts list1 outlst i j)
  43.    (setq outlst (mapcar 'list el)
  44.   i      -1   ;obj1位置指针
  45.   n      0   ;交点数计数器
  46.    )
  47.    (while el
  48.   (setq obj1 (car el)
  49.     list1 (nth (setq i (1+ i)) outlst) ;obj1已有的交点列表
  50.     el (cdr el)
  51.     el1 el
  52.     j i   ;obj2位置指针
  53.   )
  54.   (while el1
  55.     (setq obj2 (car el1)
  56.    el1  (cdr el1)
  57.    j  (1+ j)
  58.     )
  59.     ;;取交点
  60.     (if (and (setq ipts (vla-intersectwith obj1 obj2 0))
  61.    (setq ipts (vlax-variant-value ipts))
  62.    (> (vlax-safearray-get-u-bound ipts 1) 0)
  63.     )
  64.   (progn
  65.     (setq ipts (vlax-safearray->list ipts)
  66.    pts  '()  ;obj1,obj2交点临时列表变量
  67.     )
  68.     (while (> (length ipts) 0)
  69.    (setq pts  (cons (list (car ipts)
  70.      (cadr ipts)
  71.      (caddr ipts)
  72.    )
  73.    pts
  74.     )
  75.   ipts (cdddr ipts)
  76.    )
  77.     )
  78.     (setq list1 (append list1 pts) ;存obj1交点表,循环结束后再更新
  79.    n     (+ n (length pts)) ;交点计数累加
  80.     )
  81.     ;;obj2的交点列表立即更新
  82.     (setq
  83.    outlst (subst (append (nth j outlst) pts)
  84.    (nth j outlst)
  85.    outlst
  86.    )
  87.     )
  88.   )
  89.     )
  90.   )
  91. ;|   ;;当obj1存在交点,且非封闭曲线,添加两端点
  92.   (if (and (cdr list1) (not (vlax-curve-isClosed obj1)))
  93.     (setq list1 (append list1
  94.    (list (vlax-curve-getEndPoint obj1))
  95.    (list (vlax-curve-getStartPoint obj1))
  96.   )
  97.     )
  98.   )
  99.   (setq outlst (subst list1 (nth i outlst) outlst)) ;更新obj1交点列表 |;
  100.    )
  101.    outlst
  102. )
  103. ;;点集排序及删除重复点函数
  104. (defun InterSort (el / obj1 pts plst outlst)
  105.    (setq outlst '())   ;empty list
  106.    (foreach item el
  107.   (setq obj1 (car item)
  108.     pts  (cdr item)
  109.     plst '()   ;empty list
  110.   )
  111.   (if pts    ;若无交点,则不修改该实体
  112.     (progn
  113.   ;;交点排序,列表为逆序
  114.   (setq
  115.     pts (vl-sort
  116.    pts
  117.    (function (lambda (p1 p2)
  118.      (< (vlax-curve-getParamAtPoint obj1 p1)
  119.      (vlax-curve-getParamAtPoint obj1 p2)
  120.      )
  121.    )
  122.    )
  123.      )
  124.   )
  125.   ;;剔除重复点并将列表顺序转正
  126.   (foreach p pts
  127.     (if plst
  128.    (if (not (equal p (car plst) 0.00001))
  129.      (setq plst (cons p plst))
  130.    )
  131.    (setq plst (cons p plst))
  132.     )
  133.   )
  134.   ;;闭合曲线需再添加首个交点以使新实体完全封闭
  135.   (if (vlax-curve-isClosed obj1)
  136.     (setq plst (cons (last plst) plst))
  137.   )
  138.   (setq plst   (cons (vlax-vla-object->ename obj1) plst)
  139.      outlst (cons plst outlst)
  140.   )
  141.     )
  142.   )
  143.    )
  144.    outlst
  145. )
  146. ;;计算耗时
  147. (defun xdl-getutime ()
  148.    (* 86400 (getvar "tdusrtimer"))
  149. )
  150. ;; 清理当前选择集
  151. (defun Clearcset (/ cset)
  152.   (if (not (vl-catch-all-error-p     
  153.   (setq cset (vl-catch-all-apply 'vla-item (list(vlax-get-property (vlax-get-property (vlax-get-acad-object) 'activedocument ) 'selectionsets)"CURRENT")))
  154.       )      
  155.     )   
  156.   (vla-delete cset)  
  157.   )
  158.   (princ)
  159.   )
  160.   
  161. (defun c:xlx( / elist ssg n t0)
  162.    (VL-LOAD-COM)
  163.    (setq pt_list1 '())
  164.    (setq r (getreal (strcat "请输入倒角半径<" (rtos (getvar "filletrad"))
  165.          ">"
  166.         )
  167.       )
  168.    )
  169.    (if (null r)
  170.     (setq r (getvar "filletrad"))
  171.     (setvar "filletrad" r)
  172.   )
  173.   ;(setq ss (ssget '((0 . "line"))))
  174.   (bak)
  175.   (clearcset)
  176.   (if (setq ssg (ssget '((0 . "line"))))
  177.     (vlax-for obj (vla-get-activeselectionset
  178.       (vla-get-activedocument (vlax-get-acad-object))
  179.     )
  180.       (setq elist (cons obj elist)) ; ssg->elist
  181.     )
  182. (vlax-release-object obj)
  183.   )
  184.   (setq t0 (xdl-getutime))
  185.   (setq pt_list(InterSort (ssinter elist)))
  186.   (foreach pt pt_list
  187.   (setq pt_list1 (append (cdr pt)pt_list1))
  188.   )
  189.   (foreach pt pt_list1
  190.   ;(setq pt (cadr pt))
  191.     (progn
  192.       (setq ss2 (ssget "c" pt pt))
  193.         (setq en1 (ssname ss2 0))
  194.     (setq en2 (ssname ss2 1))
  195.         (if (and en1 en2)(command "fillet" en1 en2))
  196.       )
  197.     )
  198. (rebak)
  199. (princ (strcat "\n*****找到交点"
  200.    (itoa n)
  201.    "个,交点倒角操作操作共耗时"
  202.    (rtos (- (xdl-getutime) t0) 2 3)
  203.    "秒。*****"
  204.   )
  205.   )
  206.   (princ)
  207.   (prompt "<<xlx>>相连线批量倒角")
  208.   )
  209.   (prompt "<<xlx>>相连线批量倒角")
  210.   (princ)

点评

半径为0就是批量延长线相交嘻嘻。本人只会说不会做哈  发表于 2012-6-10 23:30

评分

参与人数 1明经币 +1 收起 理由
flytoday + 1 半径为0时就不行哦~

查看全部评分

发表于 2012-4-24 14:38:24 | 显示全部楼层
另外,我想问下,如果在全部倒好圆的图形,能否再次运行lisp,把倒圆角的数值改为0,再恢复到初始的图形呢?

针对这个问题前面有帖子进行过讨论。除非对生成的圆弧进行标记,不然逆向容易出错!
如无必要,可以不做这种尝试。
发表于 2012-6-10 16:21:31 | 显示全部楼层
xiaxiang 发表于 2012-4-23 15:45
依楼主附图来看
可以试一下如下代码

这个实用,顶起!
发表于 2012-6-10 16:25:38 | 显示全部楼层
aaacjh 发表于 2012-6-10 16:21
这个实用,顶起!

呵呵,刚好在线,说两句。
其实这个并不是完美的程序,处理复杂的三维投影会出错的!
完美版本不便公开罢了。。。

点评

难道公开的都是自己认为不完美的?哈....  发表于 2012-6-12 23:59
发表于 2012-6-17 09:10:43 | 显示全部楼层
能不能实现这样的,假如说第一次倒角2,想修改一下倒角半径,比如说0  或者是4,运行一下程序,重新输入半径,可以实现圆角变为0或者4,   另,能不能加入对多义线的支持
发表于 2012-8-14 14:40:53 | 显示全部楼层
xiaxiang 发表于 2012-4-24 14:34
对程序进行了重写

能不能加入对多义线的支持
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-20 06:18 , Processed in 0.176926 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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