明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 826|回复: 8

[提问] 求助:线偏移成一定宽度的填充,改成能批量操作

[复制链接]
发表于 2024-1-10 10:52:44 | 显示全部楼层 |阅读模式
50明经币
本帖最后由 cheefeel 于 2024-1-19 17:43 编辑

求助:将以下插件改成支持批量操作的。↓



执行命令后,
输入一个宽度值,选择目标线(多段线或直线),
①若直接确定→则以目标线为中心生成指定宽度的填充
②若指定方向→则按指定方向生成填充。





  1. ;;★ 线条宽度填充 (保留对象)————————————————————————————————————————
  2. (defun c:RV (/ d l l1 l2 l3 obj obj1 pt);;线条宽度填充(保留对象)
  3. (setq oldlay (getvar "CLAYER"))  ;把目前的图层记忆起来
  4.         (setvar "cmdecho" 0)(command "undo" "be")
  5.         (setq d (getdist "\n输入宽度:") l (car (entsel "\n选择对象:")) obj (vlax-ename->vla-object l) pt (getpoint"\n点击偏移方向 或【确定】居中:"))
  6.         (if pt (progn (command "offset" d l "non" pt "") (setq obj1 (vlax-ename->vla-object (setq l1 (entlast))))) (progn (vla-Offset obj (* d 0.5))(setq obj1 (vlax-ename->vla-object (setq l1 (entlast))))   (vla-Offset obj (* d -0.5)) (setq obj (vlax-ename->vla-object (setq l (entlast))))))
  7.         (entmake (list '(0 . "LINE") (cons 10 (vlax-curve-getEndPoint obj)) (cons 11 (vlax-curve-getEndPoint obj1)))) (setq l2 (entlast))
  8.         (entmake (list '(0 . "LINE") (cons 10 (vlax-curve-getstartPoint obj)) (cons 11 (vlax-curve-getstartPoint obj1))))         (setq l3 (entlast))
  9.         (command "hatch" "p" "solid"  (setq ss (ssadd) ss (ssadd l ss) ss (ssadd l1 ss) ss (ssadd l2 ss) ss (ssadd l3 ss)) "" "ERASE" (if pt (ssdel l ss) ss) "")     
  10.         (command "change" "l" "" "p" "LA" "★819 可见线条" "")
  11.         (command "undo" "e")(setvar "cmdecho" 1)
  12.         (princ)
  13. (setvar "clayer" oldlay)  ;把刚刚记忆起来的图层→变成目前的图层
  14. )
  15. ;;★ 线条宽度填充 (保留对象)————————————————————————————————————————
  16. (defun c:VR (/ d l l1 l2 l3 obj obj1 pt);;线条宽度填充(保留对象)
  17. (setq oldlay (getvar "CLAYER"))  ;把目前的图层记忆起来
  18.         (setvar "cmdecho" 0)(command "undo" "be")
  19.         (setq d (getdist "\n输入宽度:") l (car (entsel "\n选择对象:")) obj (vlax-ename->vla-object l) pt (getpoint"\n点击偏移方向 或【确定】居中:"))
  20.         (if pt (progn (command "offset" d l "non" pt "") (setq obj1 (vlax-ename->vla-object (setq l1 (entlast))))) (progn (vla-Offset obj (* d 0.5))(setq obj1 (vlax-ename->vla-object (setq l1 (entlast))))   (vla-Offset obj (* d -0.5)) (setq obj (vlax-ename->vla-object (setq l (entlast))))))
  21.         (entmake (list '(0 . "LINE") (cons 10 (vlax-curve-getEndPoint obj)) (cons 11 (vlax-curve-getEndPoint obj1)))) (setq l2 (entlast))
  22.         (entmake (list '(0 . "LINE") (cons 10 (vlax-curve-getstartPoint obj)) (cons 11 (vlax-curve-getstartPoint obj1))))         (setq l3 (entlast))
  23.         (command "hatch" "p" "solid"  (setq ss (ssadd) ss (ssadd l ss) ss (ssadd l1 ss) ss (ssadd l2 ss) ss (ssadd l3 ss)) "" "ERASE" (if pt (ssdel l ss) ss) "")     
  24.         (command "change" "l" "" "p" "LA" "★818 明装灯条" "")
  25.         (command "undo" "e")(setvar "cmdecho" 1)
  26.         (princ)
  27. (setvar "clayer" oldlay)  ;把刚刚记忆起来的图层→变成目前的图层
  28. )
  29. ;;★ 线条宽度填充 (到当前层)(移除对象)————————————————————————————————————————
  30. (defun c:RVV (/ d l l1 l2 l3 obj obj1 pt);;偏移填充->删除边线和原对象
  31. (setq oldlay (getvar "CLAYER"))  ;把目前的图层记忆起来
  32.         (setvar "cmdecho" 0)(command "undo" "be")
  33.         (setq d (getdist "\n输入宽度:") l (car (entsel "\n选择对象:")) obj (vlax-ename->vla-object l) pt (getpoint"\n点击偏移方向 或【确定】居中:"))
  34.         (if pt (progn (command "offset" d l "non" pt "") (setq obj1 (vlax-ename->vla-object (setq l1 (entlast))))) (progn (vla-Offset obj (* d 0.5))(setq obj1 (vlax-ename->vla-object (setq l1 (entlast))))   (vla-Offset obj (* d -0.5)) (vla-Delete obj) (setq obj (vlax-ename->vla-object (setq l (entlast))))))
  35.         (entmake (list '(0 . "LINE") (cons 10 (vlax-curve-getEndPoint obj)) (cons 11 (vlax-curve-getEndPoint obj1)))) (setq l2 (entlast))
  36.         (entmake (list '(0 . "LINE") (cons 10 (vlax-curve-getstartPoint obj)) (cons 11 (vlax-curve-getstartPoint obj1))))         (setq l3 (entlast))
  37.         (command "hatch" "p" "solid"  l l1 l2 l3 "" "ERASE" l l1 l2 l3 "")
  38.         (command "change" "l" "" "p" "LA" "★819 可见线条" "")
  39.         (command "undo" "e")(setvar "cmdecho" 1)
  40.         (princ)
  41. (setvar "clayer" oldlay)  ;把刚刚记忆起来的图层→变成目前的图层
  42. )
  43. ;;★ 线条宽度填充 (到当前层)(移除对象)————————————————————————————————————————
  44. (defun c:VRR (/ d l l1 l2 l3 obj obj1 pt);;偏移填充->删除边线和原对象
  45. (setq oldlay (getvar "CLAYER"))  ;把目前的图层记忆起来
  46.         (setvar "cmdecho" 0)(command "undo" "be")
  47.         (setq d (getdist "\n输入宽度:") l (car (entsel "\n选择对象:")) obj (vlax-ename->vla-object l) pt (getpoint"\n点击偏移方向 或【确定】居中:"))
  48.         (if pt (progn (command "offset" d l "non" pt "") (setq obj1 (vlax-ename->vla-object (setq l1 (entlast))))) (progn (vla-Offset obj (* d 0.5))(setq obj1 (vlax-ename->vla-object (setq l1 (entlast))))   (vla-Offset obj (* d -0.5)) (vla-Delete obj) (setq obj (vlax-ename->vla-object (setq l (entlast))))))
  49.         (entmake (list '(0 . "LINE") (cons 10 (vlax-curve-getEndPoint obj)) (cons 11 (vlax-curve-getEndPoint obj1)))) (setq l2 (entlast))
  50.         (entmake (list '(0 . "LINE") (cons 10 (vlax-curve-getstartPoint obj)) (cons 11 (vlax-curve-getstartPoint obj1))))         (setq l3 (entlast))
  51.         (command "hatch" "p" "solid"  l l1 l2 l3 "" "ERASE" l l1 l2 l3 "")
  52.         (command "change" "l" "" "p" "LA" "★818 明装灯条" "")
  53.         (command "undo" "e")(setvar "cmdecho" 1)
  54.         (princ)
  55. (setvar "clayer" oldlay)  ;把刚刚记忆起来的图层→变成目前的图层
  56. )





发表于 2024-1-10 14:16:53 | 显示全部楼层
批量操作时以哪个对象确定方向呢
回复

使用道具 举报

发表于 2024-1-10 22:38:37 | 显示全部楼层
;;★ 线条宽度填充 (保留对象)————————————————————————————————————————
(defun c:RV (/ d l l1 l2 l3 obj obj1 pt)
  ;;线条宽度填充(保留对象)
  (setq oldlay (getvar "CLAYER"))        ;把目前的图层记忆起来
  (setvar "cmdecho" 0)
  (command "undo" "be")
  (setq d (getdist "\n输入宽度:"))
  (princ "\n选择对象直线或多段线:")
  (setq
    ss (ssget
         '((-4 . "<OR") (0 . "line") (0 . "LWPOLYLINE") (-4 . "OR>"))
       )
  )
  (setq        pt (getpoint "\n点击偏移方向 或【确定】居中:")
  )
  (setq k 0)
  (if ss
    (progn
      (repeat (sslength ss)
        (setq l (ssname ss k))
        (setq obj (vlax-ename->vla-object l))
        (if pt
          (progn (command "offset" d l "non" pt "")
                 (setq obj1 (vlax-ename->vla-object (setq l1 (entlast))))
          )
          (progn (vla-Offset obj (* d 0.5))
                 (setq obj1 (vlax-ename->vla-object (setq l1 (entlast))))
                 (vla-Offset obj (* d -0.5))
                 (setq obj (vlax-ename->vla-object (setq l (entlast))))
          )
        )
        (entmake (list '(0 . "LINE")
                       (cons 10 (vlax-curve-getEndPoint obj))
                       (cons 11 (vlax-curve-getEndPoint obj1))
                 )
        )
        (setq l2 (entlast))
        (entmake (list '(0 . "LINE")
                       (cons 10 (vlax-curve-getstartPoint obj))
                       (cons 11 (vlax-curve-getstartPoint obj1))
                 )
        )
        (setq l3 (entlast))
        (command "hatch"
                 "p"
                 "solid"
                 (setq ss (ssadd)
                       ss (ssadd l ss)
                       ss (ssadd l1 ss)
                       ss (ssadd l2 ss)
                       ss (ssadd l3 ss)
                 )
                 ""
                 "ERASE"
                 (if pt
                   (ssdel l ss)
                   ss
                 )
                 ""
        )
        (command "change" "l" "" "p" "LA" "★819 可见线条" "")
        (setq k (1+ k))
      )
    )
  )
  (command "undo" "e")
  (setvar "cmdecho" 1)
  (princ)
  (setvar "clayer" oldlay)                ;把刚刚记忆起来的图层→变成目前的图层
)


回复

使用道具 举报

 楼主| 发表于 2024-1-19 17:38:37 来自手机 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2024-1-19 17:39:37 来自手机 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2024-1-19 17:41:46 | 显示全部楼层
ssyfeng 发表于 2024-1-10 14:16
批量操作时以哪个对象确定方向呢

确实是个问题!
如果单选,则可选偏移方式。
如果多选,则直接按居中处理结束命令可行否?
回复

使用道具 举报

发表于 2024-1-19 18:34:55 | 显示全部楼层
本帖最后由 xyp1964 于 2024-1-22 19:17 编辑

  1. (defun c:tt ()
  2.   "线条宽度填充(保留对象)"
  3.   (defun udist (bit kwd msg def bpt / inp)
  4.     (if def
  5.       (setq msg (strcat "\n" msg "<" (rtos def) ">: ")
  6.             bit (* 2 (fix (/ bit 2)))
  7.       )
  8.       (setq msg (strcat "\n" msg ": "))
  9.     )
  10.     (initget bit kwd)
  11.     (setq inp (if bpt (getdist msg bpt) (getdist msg)))
  12.     (if inp inp def)
  13.   )
  14.   (command "undo" "be")
  15.   (or dd (setq dd 10.))
  16.   (setq dd (Udist 7 "" "宽度<输入或鼠标直接量取>" dd nil))
  17.   (princ "\n选择对象直线或多段线:")
  18.   (setq i -1)
  19.   (if (setq ss (ssget '((0 . "line,LWPOLYLINE,arc"))))
  20.     (while (setq s1 (ssname ss (setq i (1+ i))))
  21.       (setq ob (vlax-ename->vla-object s1))
  22.       (vla-Offset ob (* dd 0.5))
  23.       (setq s2 (entlast))
  24.       (vla-Offset ob (* dd -0.5))
  25.       (setq s3 (entlast)
  26.             s4 (entmakex (list '(0 . "LINE")
  27.                                (cons 10 (vlax-curve-getStartPoint s2))
  28.                                (cons 11 (vlax-curve-getStartPoint s3))
  29.                          )
  30.                )
  31.             s5 (entmakex (list '(0 . "LINE")
  32.                                (cons 10 (vlax-curve-getEndPoint s2))
  33.                                (cons 11 (vlax-curve-getEndPoint s3))
  34.                          )
  35.                )
  36.       )
  37.       (command "-hatch" "p" "solid" "s" s2 s3 s4 s5 "" "")
  38.       (command "ERASE" s2 s3 s4 s5 "")
  39.     )
  40.   )
  41.   (command "undo" "e")
  42.   (princ)
  43. )


本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2024-1-20 14:22:29 | 显示全部楼层

这个确实是,居中偏移批量偏移了。
但是,能否同时支持单选的话允许指定偏移方向呢?


回复

使用道具 举报

发表于 2024-1-22 08:30:44 | 显示全部楼层
填充样式改成ANSI31为什么就执行不起来了呢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 23:45 , Processed in 0.167405 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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