明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2926|回复: 11

[讨论] 双向偏移--学习while运用

[复制链接]
发表于 2016-10-13 21:40 | 显示全部楼层 |阅读模式
本帖最后由 hhh454 于 2016-10-14 00:49 编辑

看了好多关于while运用的帖子,也看了好多别人写的代码,我理解,就是有东西给while,他就会一直循环下去,没有就结束了。
下面是连续单选双向偏移的源码,带偏移后的改变线的颜色,或者改变线的图层,
  1. (defun c:tt()
  2.   (vl-load-com)
  3.   (princ "\n单选双向偏移")
  4.   (setq os (getvar 'osmode))
  5.   (setq cmd (getvar 'cmdecho))
  6.   (mapcar 'setvar (list 'osmode 'cmdecho) '(0 0))
  7.   (setq w (getreal "\n【偏移宽度】:"))
  8.   (while (setq enpline (car(entsel)))
  9.          (setvar 'osmode 0)
  10.          (vla-Offset (vlax-ename->vla-object enpline) (/ w 2.0))
  11.          (setq pline1 (entlast))
  12.          (command "change" pline1  "" "p" "c" "2" "" )
  13.          (vla-Offset (vlax-ename->vla-object enpline) (/ w -2.0))
  14.          (setq pline2 (entlast))
  15.          (command "change" pline2  "" "p" "la" "ngc6"  "" )
  16.    )
  17. (mapcar 'setvar (list 'osmode 'cmdecho) (list os cmd))
  18. (princ)
  19. )




下面请教高手,怎么能够在没有线的情况下,边画pline边偏移,连续生成双线,
下面是图片说明:

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
USER2128 + 1

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2020-9-8 13:05 | 显示全部楼层
999999 发表于 2020-9-8 11:57
强大呀,谢谢谢各位大神的讨论

坚持学习,支持一下
回复 支持 1 反对 0

使用道具 举报

发表于 2022-11-14 12:25 | 显示全部楼层
忘记这是哪位大佬的了,发下你们对比下,个人觉得这个好点
快捷键  gb  批量偏移
(defun c:gb (/ CLOCKWISEP OFFSET KD SS N EN kd0)
  (defun CLOCKWISEP (en / lw minp MaxP lst)
    (setq lw (vlax-ename->vla-object en))
    (vla-GetBoundingBox lw 'MinP 'MaxP)
    (setq
      minp (vlax-safearray->list minp)
      MaxP (vlax-safearray->list MaxP)
      lst  (mapcar
             (function
               (lambda (x)
                 (vlax-curve-getParamAtPoint
                   lw
                   (vlax-curve-getClosestPointTo lw x)
                   )
                 )
               )
             (list minp
                   (list (car minp) (cadr MaxP))
                   MaxP
                   (list (car MaxP) (cadr minp))
                   )
             )
      )
    (if (or
          (<= (car lst) (cadr lst) (caddr lst) (cadddr lst))
          (<= (cadr lst) (caddr lst) (cadddr lst) (car lst))
          (<= (caddr lst) (cadddr lst) (car lst) (cadr lst))
          (<= (cadddr lst) (car lst) (cadr lst) (caddr lst))
          )
      t
      )
    )
  (initget 7 "W N S  ")
  (setq kd0 (getkword "\n[向外偏移W/向内偏移N/双向偏移S]<W>"))
  (if (= "" kd0)
    (setq kd0 "W")
    )
  (initget 6)
  (setq offset (getreal "\n[输入偏移距离]<50>"))
  (if (null offset)
    (setq offset 50)
    )
  (initget 7 "Y N  ")
  (setq kd (getkword "\n[删除源对象<Y>/不删除源对象<N>]<N>:"))
  (if (= kd "")
    (setq kd "N")
    )
  (while (setq ss (ssget '((0 . "*polyline,arc,circle,line,SPLINE"))))
    (repeat (setq n (sslength ss))
      (setq en (ssname ss (setq n (1- n))))
      (cond
        ((or (= "ARC" (cdr (assoc 0 (entget en))))
             (= "CIRCLE" (cdr (assoc 0 (entget en))))
             )
         (cond ((= kd0 "W")
                (vla-offset (vlax-ename->vla-object en) offset)
                (vla-put-Color (vlax-ename->vla-object (entlast)) 1)
                )
               ((= kd0 "N")
                (vla-offset (vlax-ename->vla-object en) (- offset))
                (vla-put-Color (vlax-ename->vla-object (entlast)) 4)
                )
               (t
                (vla-offset (vlax-ename->vla-object en) offset)
                (vla-put-Color (vlax-ename->vla-object (entlast)) 1)
                (vla-offset (vlax-ename->vla-object en) (- offset))
                (vla-put-Color (vlax-ename->vla-object (entlast)) 4)
                )
               )
         )
        (t
         (cond ((= kd0 "W")
                (if (CLOCKWISEP en)
                  (vla-offset (vlax-ename->vla-object en) (- offset))
                  (vla-offset (vlax-ename->vla-object en) offset)
                  )
                  (vla-put-Color (vlax-ename->vla-object (entlast)) 1)
                )
               ((= kd0 "N")
                (if (CLOCKWISEP en)
                  (vla-offset (vlax-ename->vla-object en) offset)
                  (vla-offset (vlax-ename->vla-object en) (- offset))
                  )
                  (vla-put-Color (vlax-ename->vla-object (entlast)) 4)
                )
               (t
                (vla-offset (vlax-ename->vla-object en) offset)
                (vla-put-Color (vlax-ename->vla-object (entlast)) 1)
                (vla-offset (vlax-ename->vla-object en) (- offset))
                (vla-put-Color (vlax-ename->vla-object (entlast)) 4)
                )
               )
         )
        )
      (if (= kd "Y")
        (entdel en)
        )
      )
    )
  (princ)
  )
发表于 2022-11-13 20:50 | 显示全部楼层
437271963 发表于 2016-10-13 22:39
双向偏移对象,并改变偏移后的颜色。可以批量偏移,也可以点选偏移。

感谢老大,增加了删除
(defun c:oo (/ &k1 &kw1 val)
  (vl-load-com)
;;;  (fy_ErrorInit (append '("cmdecho" 0)) 1 nil)
  (setq        ooffooff**
         (if (setq val (getreal        (strcat        "\n板厚["
                                        (if ooffooff**
                                          (rtos ooffooff**)
                                          "18"
                                        )
                                        "]"
                                )
                       )
             )
           val
           (if ooffooff**
             ooffooff**
             18
           )
         )
  )
  (setq &kw1 (ssget '((0 . "Arc,Circle,Ellipse,*Line"))))
  (while (setq &k1 (ssname &kw1 0))
    (setq &kw1 (ssdel &k1 &kw1)
          &k1  (vlax-ename->vla-object &k1)
    )
    (if        (null (vl-catch-all-error-p
                (vl-catch-all-apply 'vla-offset (list &k1 ooffooff**))
              )
        )
      (vla-put-color (vlax-ename->vla-object (entlast)) 1)
    )
    (if        (null (vl-catch-all-error-p
                (vl-catch-all-apply 'vla-offset (list &k1 (- ooffooff**)))
              )
        )
      (vla-put-color (vlax-ename->vla-object (entlast)) 1)
    )
  )
  (if (not (getpoint "\n按鼠标左键不删除源对象 <空格删除>"))
    (vl-cmdf "_.ERASE" (ssget "p") "")
  )
  (princ)
;;;  (fy_ErrorEnd)
)
发表于 2016-10-13 22:39 | 显示全部楼层
双向偏移对象,并改变偏移后的颜色。可以批量偏移,也可以点选偏移。
  1. (defun c:tes ( / &k1 &kw1);点选或框选双向偏移对象;并改变颜色为红
  2. (vl-load-com)
  3. (princ "\n请选择要双向偏移的对象")
  4. (while (setq &kw1(ssget ":S" '((0 . "*LINE,CIRCLE,ARC,HELIX,ELLIPSE"))))
  5.   (while (setq &k1 (ssname &kw1 0))
  6.    (setq &kw1 (ssdel &k1 &kw1) &k1 (vlax-ename->vla-object &k1))
  7.    (if (null (vl-catch-all-error-p (vl-catch-all-apply 'vla-offset (list &k1 2.0))))
  8.     (vla-put-color (vlax-ename->vla-object (entlast)) 1)
  9.    )
  10.    (if (null (vl-catch-all-error-p (vl-catch-all-apply 'vla-offset (list &k1 -2.0))))
  11.     (vla-put-color (vlax-ename->vla-object (entlast)) 1)
  12.    )
  13.   )
  14. )
  15. (princ)
  16. )

评分

参与人数 1明经币 +1 收起 理由
USER2128 + 1 赞一个!

查看全部评分

 楼主| 发表于 2016-10-13 22:46 | 显示全部楼层
437271963 发表于 2016-10-13 22:39
双向偏移对象,并改变偏移后的颜色。可以批量偏移,也可以点选偏移。

谢谢,我想要的功能是画完一条pline线,自动偏移,然后接着再画一条,再自动偏移,请看我第二个图片
发表于 2016-10-14 08:27 | 显示全部楼层
repeat 用这个怎么样?
发表于 2016-10-14 08:49 | 显示全部楼层
给你完整的代码:
  1. (defun c:tt()
  2.   (vl-load-com)
  3.   (princ "\n单选双向偏移")
  4.   (setq os (getvar 'osmode))
  5.   (setq cmd (getvar 'cmdecho))
  6.   (mapcar 'setvar (list 'osmode 'cmdecho) '(0 0))
  7.   (or (setq w (getreal "\n【偏移宽度】/<10.0>:"))
  8.       (setq w 10.0)
  9.       )
  10.   (while (or (setq enpline (car(entsel"\n拾线偏移,回车则画线偏移:")))
  11.        (and (setq pt1 (getpoint"\n开始绘制PL线的起点/<退出>."))
  12.       (setq pt2 (getpoint pt1 "\n开始绘制PL线的第2点/<退出>."))
  13.       (progn
  14.         (setq L-en (entlast));先设置最后一次的图元为L-en
  15.         (princ "\n继续绘制PL线,回车结束画线.")
  16.         (command "_.pline" "_non" pt1 pt2)
  17.         (while (>(getvar 'cmdactive)0)(command pause))
  18.         (setq enpline (entnext L-en))
  19.         );end progn
  20.       );end and
  21.        );end or


  22.          (setvar 'osmode 0)
  23.          (vla-Offset (vlax-ename->vla-object enpline) (/ w 2.0))
  24.          (setq pline1 (entlast))
  25.          (command "change" pline1  "" "p" "c" "2" "" )
  26.          (vla-Offset (vlax-ename->vla-object enpline) (/ w -2.0))
  27.          (setq pline2 (entlast))
  28.          (command "change" pline2  "" "p" "la" "ngc6"  "" )
  29. ;         (command "change" pline2  "" "p" "c" "2" "" )
  30.    )
  31. (mapcar 'setvar (list 'osmode 'cmdecho) (list os cmd))
  32. (princ)
  33. )


评分

参与人数 1明经币 +1 金钱 +5 收起 理由
hhh454 + 1 + 5 感谢,里面有很多的函数运用,

查看全部评分

发表于 2020-9-8 11:57 | 显示全部楼层
强大呀,谢谢谢各位大神的讨论
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 04:22 , Processed in 0.211418 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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