明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2317|回复: 35

[经验] 分享一个我自己最常用的命令【拉伸或者移动至需要的距离】

[复制链接]
发表于 2024-1-22 11:40 | 显示全部楼层 |阅读模式
本帖最后由 菜卷鱼 于 2024-2-23 10:43 编辑

  1. ;;命令名: SQ
  2. ;;功能:选取一段距离,拉伸或者移动至需要的距离【只支持X或者Y方向】
  3. ;; by 菜卷鱼

  4. ;;使用方式:
  5. ;|先指定起点(参考点),再指定终点(目的点)或指定X方向或者Y方向,
  6. 如果没有指定方向,就会在指定终点之后自动选择终点相对于起点X轴与Y轴数字较大的方向,再选择要拉伸的对象(选择方式与S拉伸或者Move命令一样)|;
  7. ;;其余说明
  8. ;|这个程序写出来很多年了,虽然很简单,但是是我使用最频繁的命令,替代了大部分场景下的S(Stretch)命令
  9. 虽然也支持替代Move,但是用得少,因为Stretch可以替代Move
  10. 正常情况下,我们Stretch都是有个预期结果,比如初始距离100,我们想移动到500,就要先脑子里计算一下,然后输入400,整数还好,有些非整数可能需要敲计算器
  11. 这个命令,预期结果是把一段距离拉伸到500,选取初始距离之后,直接输入结果500就行,就是不管现在距离是多少,也不需要管中间计算|;

  12. ;;;照着左下角命令提示进行操作
  13. (defun c:sq (/         *error*   PT     DT       sv_pt_x
  14.        sv_pt_y   sv_di_x   sv_di_y   sv_drict  sv_ss
  15.        sep       sv_npt   eqkey     sv_x_abs  sv_y_abs
  16.        sv_nvpt   numrange
  17.       )
  18.   (defun numrange (num pre mode / n dw up s n1 n2)
  19.     (setq n (fix (/ num pre)))
  20.     (setq dw (* pre n 1.0))
  21.     (setq up (+ dw pre))
  22.     (cond
  23.       ((= mode 1) (setq s up))
  24.       ((= mode -1) (setq s dw))
  25.       (t
  26.        (setq n1  (- up num)
  27.        n2  (- num dw)
  28.        )
  29.        (if (>= n1 n2)
  30.    (setq s dw)
  31.    (setq s up)
  32.        )
  33.       )
  34.     )
  35.     s
  36.   )
  37.   (setq *error* cmderr)
  38.   (setq eqkey 0)
  39.   (if (= sv_cmd nil)
  40.     (setq sv_cmd "Stretch")
  41.   )
  42.   (mapcar 'princ
  43.     (list
  44.       "距离修正<选取一段距离Move或Stretch成需要的距离>"
  45.       "\n指定起点或设置[移动对象(M)/拉伸对象(S)]"
  46.       "<"
  47.       (substr sv_cmd 1 1)
  48.       ">:"
  49.     )
  50.   )
  51.   (initget 1 "Move Stretch")
  52.   (setq pt (getpoint))
  53.   (while
  54.     (or (= pt "Move") (= pt "Stretch"))
  55.      (setq sv_cmd pt)
  56.      (mapcar 'princ
  57.        (list "\n指定起点或设置[移动对象(M)/拉伸对象(S)]:"
  58.        "<"
  59.        (substr sv_cmd 1 1)
  60.        ">"
  61.        )
  62.      )
  63.      (initget 1 "Move Stretch")
  64.      (setq pt (getpoint))
  65.   )
  66.   (initget 1 "Xdirection Ydirection Auto")
  67.   (setq dt (getpoint pt "\n指定终点或[X方向(X)/Y方向(Y)/自动(A)]<A>:"))
  68.   (while (/= (member dt (list "Xdirection" "Ydirection")) NIL)
  69.     (cond ((= dt "Xdirection") (setq eqkey 1))
  70.     ((= dt "Ydirection") (setq eqkey 2))
  71.     ((= dt "Auto") (setq eqkey 0))
  72.     )
  73.     (initget 1 "Xdirection Ydirection Auto")
  74.     (setq dt
  75.      (getpoint pt "\n指定终点或[X方向(X)/Y方向(Y)/自动(A)]<A>:")
  76.     )
  77.   )
  78.   (setq sv_pt_x (car pt))
  79.   (setq sv_pt_y (cadr pt))
  80.   (setq sv_di_x (car dt))
  81.   (setq sv_di_y (cadr dt))
  82.   (setq sv_x_abs (abs (- sv_pt_x sv_di_x)))
  83.   (setq sv_y_abs (abs (- sv_pt_y sv_di_y)))
  84.   (cond
  85.     ((= eqkey 1)
  86.      (setq sv_di sv_x_abs
  87.      sv_drict "X"
  88.      )
  89.     )
  90.     ((= eqkey 2)
  91.      (setq sv_di sv_y_abs
  92.      sv_drict "Y"
  93.      )
  94.     )
  95.     ((= eqkey 0)
  96.      (if (> sv_x_abs sv_y_abs)
  97.        (setq sv_di sv_x_abs
  98.        sv_drict "X"
  99.        )
  100.        (setq sv_di sv_y_abs
  101.        sv_drict "Y"
  102.        )
  103.      )
  104.     )
  105.   )

  106.   (mapcar 'princ
  107.     (list "\n选取<" sv_drict ">方向距离: " sv_di)
  108.   )
  109.   (if (numberp osv_num)
  110.     (mapcar
  111.       'princ
  112.       (list
  113.   "\n上一次"
  114.   osv_num
  115.   "\n修改至[对齐(空)/同上一次(S)/精度十(F)/百(H)千(T)]<对齐>:"
  116.       )
  117.     )
  118.     (princ "\n修改至[对齐(空)/精度十(F)/百(H)千(T)]<对齐>:")
  119.   )

  120.   (initget "Same Fix Hdd Ths")
  121.   (setq sv_num (getdist))
  122.   (if (and (numberp sv_num)
  123.      (/= sv_num 0)
  124.       )
  125.     (setq osv_num sv_num)
  126.   )
  127.   (cond
  128.     ((= sv_num nil) (setq sv_num 0))
  129.     ((= sv_num "Same") (setq sv_num osv_num))
  130.     ((= sv_num "Fix") (setq sv_num (numrange sv_di 10 0)))
  131.     ((= sv_num "Hdd") (setq sv_num (numrange sv_di 100 0)))
  132.     ((= sv_num "Ths") (setq sv_num (numrange sv_di 1000 0))
  133.     )
  134.   )
  135.   (cond
  136.     ((and (= sv_drict "X") (> (- sv_pt_x sv_di_x) 0))
  137.      (setq sv_num (- 0 sv_num))
  138.     )
  139.     ((and (= sv_drict "X") (< (- sv_pt_x sv_di_x) 0))
  140.      (setq sv_num sv_num)
  141.     )
  142.     ((and (= sv_drict "Y") (> (- sv_pt_y sv_di_y) 0))
  143.      (setq sv_num (- 0 sv_num))
  144.     )
  145.     ((and (= sv_drict "Y") (< (- sv_pt_y sv_di_y) 0))
  146.      (setq sv_num sv_num)
  147.     )
  148.   )

  149.   (cond  ((= sv_drict "X")
  150.    (setq sv_nvpt (list (+ sv_di_x (- sv_num (- sv_di_x sv_pt_x)))
  151.            sv_di_y
  152.            0
  153.            )
  154.    )
  155.   )
  156.   ((= sv_drict "Y")
  157.    (setq sv_nvpt (list sv_di_x
  158.            (+ sv_di_y (- sv_num (- sv_di_y sv_pt_y)))
  159.            0
  160.            )
  161.    )
  162.   )
  163.   )
  164.   (princ sv_num)
  165.   (princ "\n选取要移动的对象:")
  166.   (setq sv_ss (ssget))
  167.   (while (null sv_ss) (setq sv_ss (ssget)))
  168.   (setvar "cmdecho" 0)
  169.   (command "_.undo" "_be")
  170.   (setq *error* undoerr)
  171.   (command sv_cmd sv_ss "" "non" dt "non" sv_nvpt)
  172. ;;;;如果你的电脑不支持"non",就用下面的方式,non的作用是取消捕捉
  173. ;;;;(setq osmode  (getvar 'osmode))
  174. ;;;;(setvar 'osmode 0)
  175. ;;;;(command sv_cmd sv_ss ""  dt sv_nvpt)
  176. ;;;;(setvar 'osmode osmode)
  177.   (command "_.undo" "_e")
  178.   (setvar "cmdecho" 1)
  179.   (prin1)
  180. )



  (command sv_cmd sv_ss "" "non" dt "non" sv_nvpt)
如果你的电脑不支持"non",就用下面的方式,non的作用是取消捕捉
(setq osmode  (getvar 'osmode))
(setvar 'osmode 0)
(command sv_cmd sv_ss ""  dt sv_nvpt)
(setvar 'osmode osmode)




本帖子中包含更多资源

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

x

评分

参与人数 8明经币 +8 收起 理由
USER2128 + 1 赞一个!
tomonkey239 + 1 很给力!
菜鸟初来乍到 + 1 很给力!
hubeiwdlue + 1 赞一个!
1028695446 + 1 很给力!
tigcat + 1 很给力!
飞雪神光 + 1 很给力!
xj6019 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-1-27 15:59 | 显示全部楼层
自用的小程序,分享一下,利用是对象捕捉中的捕捉自(from)
(defun c:sfr (/ *error* ss pt1 pt2)
  (defun *error* (msg)
    (setvar "autosnap" 63)
  )
  (prompt "\n★功能:将图形拉伸到指定的尺寸.\n")
  (setvar "cmdecho" 0)
  (setvar "orthomode" 1)
  (if (and
        (setq ss (ssget))
        (setq pt1 (getpoint "\n指定基点:"))
        (setq pt2 (getpoint pt1 "\n指定起点:"))
      )
    (command "_.stretch" ss "" "non" pt1 "from" "non"  pt2 pause)
  )
  (setvar "autosnap" 63)
  (princ)
)

评分

参与人数 2明经币 +2 收起 理由
hubeiwdlue + 1 很给力!
USER2128 + 1 赞一个!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-1-23 17:32 | 显示全部楼层
zxp2007 发表于 2024-1-22 17:07
这个功能 燕秀工具箱有类似的 并且做的很完善。不清楚是不是LISP开发的

燕秀的我没用过,不喜欢开机有广告
我的没那么完善,毕竟代码就那么一点,对我个人来说够用了
回复 支持 1 反对 0

使用道具 举报

发表于 2024-1-22 12:21 | 显示全部楼层
大佬,神速啊,这么快就出手了
发表于 2024-1-22 13:19 | 显示全部楼层
谢谢楼主分享好用工具
发表于 2024-1-22 13:48 | 显示全部楼层
你好,能否给个gif演示?
发表于 2024-1-22 15:54 来自手机 | 显示全部楼层
感谢大神无私分享
发表于 2024-1-22 17:07 | 显示全部楼层
这个功能 燕秀工具箱有类似的 并且做的很完善。不清楚是不是LISP开发的
发表于 2024-1-23 01:41 | 显示全部楼层
感谢大佬分享
发表于 2024-1-23 08:05 | 显示全部楼层
不咋好用啊
发表于 2024-1-23 09:10 | 显示全部楼层
谢谢楼主分享。
发表于 2024-1-23 09:33 | 显示全部楼层
谢谢楼主分享.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 15:48 , Processed in 1.019468 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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