明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4096|回复: 8

[求助]偏移并清除原对象。

[复制链接]
发表于 2002-8-18 17:24:00 | 显示全部楼层 |阅读模式
各位热情洋溢的cad高手:
你们好!
     

     能否用lisp帮我编一个偏移命令。要求偏移后原对象被清除。而且该lisp能直接贴在acadr14.lsp和acad2000doc.lsp中应用!
     学生感激之情将如长江之水滔滔不绝······
发表于 2002-8-18 20:56:00 | 显示全部楼层

程序如内

本帖最后由 mccad 于 2002-8-18 20:56:51 编辑

(defun c:OFFDEL(/ oldcmdecho ofdist dist)
  (princ " OFFDEL 偏移并删除源对象")
  (setq oldcmdecho(getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (setq ofdist(getvar "OFFSETDIST"))
  (if (> ofdist 0)
    (progn
      (initget "T")
      (setq dist(getdist (strcat "\n指定偏移距离或 [通过(T)] <" (rtos ofdist) ">:")))
      (if (= dist nil)
        (setq dist ofdist)
      )
      (if (or(= dist "T")(= dist "t"))
        (offwithpnt)
        (offwithdist dist)
      )
    )
    (progn
      (initget "T")
      (setq dist(getdist "\n指定偏移距离或 [通过(T)] <通过>:"))
      (if(= dist nil)
        (setq dist "T")
      )
      (if (or(= dist "T")(= dist "t"))
        (offwithpnt)
        (offwithdist dist)
      )
    )
  )
  (setvar "cmdecho" oldcmdecho)
  (princ"\n该命令由明经通道http://www.mjtd.com制作")
  (princ)
  )

(defun offwithdist( dist / obj pnt)
  (while(setq obj(entsel "\n选择要偏移的对象或 <退出>:"))
    (setq pnt(getpoint"\n指定点以确定偏移所在一侧:"))
    (command "._offset" dist obj pnt "")
    (entdel (car obj))
  )
  (setvar "offsetdist" dist)
  (princ)
)

(defun offwithpnt(/ obj pnt)
  (while (setq obj(entsel "\n选择要偏移的对象或 <退出>:"))
    (setq pnt(getpoint"\n指定通过点:"))
    (command "._offset" "T" obj pnt "")
    (entdel (car obj))
  )
  (setvar "offsetdist" -1)
  (princ)
)

;程序改了一下,完全仿OFFSET命令的提示。
 楼主| 发表于 2002-8-19 00:19:00 | 显示全部楼层

感谢信···

谢谢版主的创作!我试了试很好用。
就是有一点与被仿效的OFFSET命令不一样。原命令在选中无法偏移的对象时有提示,并且命令无法执行下去;OFFDEL命令执行过程中即使选取了无法偏移的对象后,仍然提示“指定点以确定偏移所在一侧”,如果继续执行命令,该对象就被消除了。
 楼主| 发表于 2002-8-19 11:33:00 | 显示全部楼层

是否有改进的可能?

发表于 2002-8-19 12:41:00 | 显示全部楼层

有,程序改好了,如内

(defun c:OFFDEL        (/ oldcmdecho ofdist dist)
  (princ " OFFDEL 偏移并删除源对象")
  (setq oldcmdecho (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (setq ofdist (getvar "OFFSETDIST"))
  (if (> ofdist 0)
    (progn
      (initget "T")
      (setq dist (getdist (strcat "\n指定偏移距离或 [通过(T)] <"
                                  (rtos ofdist)
                                  ">:"
                          )
                 )
      )
      (if (= dist nil)
        (setq dist ofdist)
      )
      (if (or (= dist "T") (= dist "t"))
        (offwithpnt)
        (offwithdist dist)
      )
    )
    (progn
      (initget "T")
      (setq dist (getdist "\n指定偏移距离或 [通过(T)] <通过>:"))
      (if (= dist nil)
        (setq dist "T")
      )
      (if (or (= dist "T") (= dist "t"))
        (offwithpnt)
        (offwithdist dist)
      )
    )
  )
  (setvar "cmdecho" oldcmdecho)
  (princ "\n该命令由明经通道 http://www.mjtd.com 制作")
  (princ)
)

(defun offwithdist (dist / obj pnt)
  (while (setq obj
                (I:entself
                  "\n选择要偏移的对象或 <退出>:"
                  '((0
                     .
                     "Arc,Circle,Ellipse,Line,LightweightPolyline,Polyline,Spline,XLine"
                    )
                   )
                )
         )
    (setq pnt (getpoint "\n指定点以确定偏移所在一侧:"))
    (command "._offset" dist obj pnt "")
    (entdel (car obj))
  )
  (setvar "offsetdist" dist)
  (princ)
)

(defun offwithpnt (/ obj pnt)
  (while (setq obj
                (I:entself
                  "\n选择要偏移的对象或 <退出>:"
                  '((0
                     .
                     "Arc,Circle,Ellipse,Line,LightweightPolyline,Polyline,Spline,XLine"
                    )
                   )
                )
         )
    (setq pnt (getpoint "\n指定通过点:"))
    (command "._offset" "T" obj pnt "")
    (entdel (car obj))
  )
  (setvar "offsetdist" -1)
  (princ)
)

(defun I:EntSelF (Msg Filter / EntN pbDist PtPick ssPick)
  (while (not EntN)
    (setq EntN (if Msg
                 (entsel Msg)
                 (entsel)
               )
    )
    (if        (= (getvar "ErrNo") 52)
      (setq EntN "Exit")
    )
  )
  (cond
    ((/= EntN "Exit")
     (setq
       pbDist (abs
                (/
                  (*
                    (/
                      (getvar "ickBox")
                      (cadr (getvar "ScreenSize"))
                    )
                    (getvar "ViewSize")
                  )
                  (sin (* 0.25 pi))
                )
              )
       PtPick (cadr EntN)
     )
     (if (setq ssPick (ssget "_C"
                             (polar PtPick (* 1.25 pi) pbDist)
                             (polar PtPick (* 0.25 pi) pbDist)
                             Filter
                      )
         )
       (cons
         (ssname ssPick 0)
         (list PtPick)
       )
     )
    )
  )
)
 楼主| 发表于 2002-8-19 15:24:00 | 显示全部楼层

经过反复折腾后的建议——再改:)

尊敬的版主:   您好!

    首先感谢您在百忙中抽出时间无私的为我们编写lisp。经过我(一个对cad认识极肤浅的人)刚才在r14and2002版本中,在对各种对象在各种坐标中反复应用,得出不成熟的一些认识:
   
    1、前一个offdel虽然存在与offset有差异的局部情况,但与后一个offdel编辑相同对象时,显得更为稳定(会不会是后一个offdel增加的功能抑制了它的正常发挥?:);
    2、offset在各种坐标下应用均正常。前后两个offdel在编辑对象与当前坐标的xy平面垂直或者不在xy同一平面上时,效果根本无法令人满意。特别是对circle、闭合pline的编辑;
    3、在测试过程中我主要使用前后offdel编辑circle、闭合的pline、spline、arc、line。
    4、一番摆弄之余,让我领略到lisp的博大深邃,深感个人的渺小和学习的必要。渴望得到论坛的版主与同仁志士的引导和帮助!
    谢谢!
 楼主| 发表于 2002-8-20 18:49:00 | 显示全部楼层

是不是改起来比较麻烦呢?

发表于 2012-5-30 20:45:59 | 显示全部楼层
现在向这么认真的回帖真的已经绝迹了
发表于 2012-5-31 14:04:36 | 显示全部楼层
人是不满足的动物。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-21 23:49 , Processed in 0.207922 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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