明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 919|回复: 10

[源码] (SDSCALE)对象距离缩放(只改变对象距离位置,不改变对象大小)

[复制链接]
发表于 2021-6-24 09:10:11 | 显示全部楼层 |阅读模式
本帖最后由 fangmin723 于 2021-6-24 11:21 编辑

;;说明:对象距离缩放(只改变对象距离位置,不改变对象大小) by 忘霄 2021.5.12
(defun C:SDSCALE(/ *error* bf-mat-translation ent iscpy mat n nmidpt obj omidpt p0 pc0 pc1 pc2 sca scae scas ss)
        (vl-load-com)
        (defun *error*(msg)
                (if (= iscpy T) (command-S "_.ERASE" ss ""))
                (prin1)
        )
        ;;;name:BF-Mat-Translation
        ;;;desc:根据矢量计算平移矩阵
        ;;;arg:v:平移矢量
        ;;;return:4X4的平移矩阵
        ;;;exampleBF-Mat-Translation '(1 0 0))
        (defun BF-Mat-Translation (v)
                (list
                        (list 1. 0. 0. (float (car v)))
                        (list 0. 1. 0. (float (cadr v)))
                        (list 0. 0. 1. (float (caddr v)))
                        (list 0. 0. 0. 1.)
                )
        )
        (if (and (setq ss (ssget)) (setq p0 (getpoint "\n指定距离缩放中心点:")))
                (progn
                        (setq iscpy nil n -1)
                        (initget "C c R r")
                        (setq sca (getdist p0 "\n指定缩放比例或 [复制(C)/参照(R)] <1.00>:"))
                        (if (or (= p0 "") (= p0 nil)) (setq sca 1.0))
                        (while (= (type sca) 'STR)
                                (setq sca (strcase sca))
                                (cond
                                        ((and (not iscpy) (equal sca "C"))
                                                (command "_.COPY" ss "" "non" '(0 0 0) "non" '(0 0 0))
                                                (setq iscpy T)
                                                (initget "R r")
                                                (setq sca (getdist p0 "指定缩放比例或 [参照(R)] <1.00>:"))
                                                (if (or (= p0 "") (= p0 nil)) (setq sca 1.0))
                                        )
                                        ((equal sca "R")
                                                (setq pc0 (getpoint "\n指定参照长度 <1.00>:"))
                                                (if (or (= pc0 "") (= pc0 nil))
                                                        (progn
                                                                (setq pc0 p0 scas 1.0 pc2 (getpoint pc0 "\n指定新长度<1.00>:"))
                                                                (if (or (= pc2 "") (= pc2 nil))
                                                                        (setq scae 1.0)
                                                                        (setq scae (distance pc0 pc2))
                                                                )
                                                        )
                                                        (progn
                                                                (setq pc1 (getpoint pc0 "指定第二点:"))
                                                                (if (or (= pc1 "") (= pc1 nil))
                                                                        (setq scas 1.0)
                                                                        (progn
                                                                                (setq scas (distance pc0 pc1) pc2 (getpoint pc0 "\n指定新长度<1.00>:"))
                                                                                (if (or (= pc2 "") (= pc2 nil))
                                                                                        (setq scae 1.0)
                                                                                        (setq scae (distance pc0 pc2))
                                                                                )
                                                                        )
                                                                )
                                                        )
                                                )
                                                (setq sca (/ scae scas))
                                        )
                                )
                        )
                        (while (setq ent (ssname ss (setq n (1+ n))))
                                (setq obj (vlax-ename->vla-object ent))
                                (vla-GetBoundingBox obj 'mn 'mx)
                                (setq omidpt (mapcar '* (mapcar '+ (vlax-safearray->list mn) (vlax-safearray->list mx)) (list 0.5 0.5 0.5)))
                                (setq nmidpt (polar p0 (angle p0 omidpt) (* sca (distance p0 omidpt))))
                                (setq mat (vlax-make-safearray vlax-vbDouble '(0 . 3) '(0 . 3)))
                                (vlax-safearray-fill mat (BF-Mat-Translation (mapcar '- nmidpt omidpt)))
                                (vla-TransformBy obj mat)
                        )
                )
        )
        (prin1)
)
(princ "\n对象距离缩放:SDSCALE!")
(prin1)

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2021-6-24 11:12:52 | 显示全部楼层
非常好用,谢谢大神!
发表于 2021-6-25 20:33:36 | 显示全部楼层
顶起顶起,,谢谢楼主的无私奉献,一个好的想法和功能实现了
发表于 2024-1-12 11:44:34 | 显示全部楼层
如果能支持三维对象的3坐标缩放,那就跟橱柜的爆炸功能一样强大了

点评

可以试试下帖代码  发表于 2024-1-13 10:21
发表于 2024-1-13 10:16:04 | 显示全部楼层
本帖最后由 xyp1964 于 2024-1-13 10:20 编辑

  1. (defun c:tt ()
  2.   "对象距离缩放(只改变对象距离位置,不改变对象大小)"
  3.   (defun Ureal (bit kwd msg def / inp)
  4.     (if def
  5.       (setq msg (strcat "\n" msg "<" (rtos def 2) ">: ")
  6.             bit (* 2 (fix (/ bit 2)))
  7.       )
  8.       (setq msg (strcat "\n" msg ": "))
  9.     )
  10.     (initget bit kwd)
  11.     (setq inp (getreal msg))
  12.     (if inp inp def)
  13.   )
  14.   (defun cen (s1 / x y a b)
  15.     (vla-GetBoundingBox (vlax-ename->vla-object s1) 'a 'b)
  16.     (mapcar '(lambda (x y) (* (+ x y) 0.5))(vlax-safearray->list a)(vlax-safearray->list b))
  17.   )
  18.   (defun ss2list (ss)
  19.     (vl-remove-if-not'(lambda (x) (equal (type x) 'ENAME))(mapcar 'cadr (ssnamex ss)))
  20.   )
  21.   ;;
  22.   (or sc (setq sc 2.))
  23.   (setq sc (Ureal 7 "" "缩放比例" sc))
  24.   (if (and (setq ss (ssget))
  25.            (setq p0 (getpoint "\n缩放基点<退出>: "))
  26.       )
  27.     (setq lst (mapcar '(lambda (x)
  28.                          (setq p1 (cen x)
  29.                                dd (* (distance p0 p1) sc)
  30.                                p2 (polar p0 (angle p0 p1) dd)
  31.                          )
  32.                          (command "move" x "" "non" p1 "non" p2)
  33.                        )
  34.                       (ss2list ss)
  35.               )
  36.     )
  37.   )
  38.   (princ)
  39. )
发表于 2024-1-13 10:18:43 | 显示全部楼层
本帖最后由 xyp1964 于 2024-1-13 10:51 编辑

  1. (defun c:tt ()
  2.   "对象距离缩放(只改变对象距离位置,不改变对象大小)"
  3.   (xyp-Start)
  4.   (or sc (setq sc 2.))
  5.   (setq sc (Ureal 7 "" "缩放比例" sc))
  6.   (princ "\n选择实体<退出>: ")
  7.   (if (and (setq ss (ssget))(setq p0 (getpoint "\n缩放中心<退出>: ")))
  8.     (mapcar '(lambda (x)
  9.                (setq p1 (xyp-9pt x 5) dd (* (distance p0 p1) sc)p2 (polar p0 (angle p0 p1) dd))
  10.                (xyp-move x p1 p2)
  11.              )
  12.             (xyp-ss2list ss)
  13.     )
  14.   )
  15.   (xyp-End)
  16. )
发表于 2024-1-13 15:40:18 | 显示全部楼层
潇湘飞雨 发表于 2024-1-12 11:44
如果能支持三维对象的3坐标缩放,那就跟橱柜的爆炸功能一样强大了

感谢院长指导~  我去测试下
发表于 2024-1-13 16:03:14 | 显示全部楼层

院长,已测试

十分感谢,代码已实现对三维对象的支持,
目前缩放的对象都在同一平面上
实现Z轴的缩放是否可行?
可否赐教

本帖子中包含更多资源

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

x
发表于 2024-1-13 16:41:20 | 显示全部楼层
本帖最后由 xyp1964 于 2024-1-13 16:47 编辑


  1. (defun c:tt ()
  2.    "对象距离缩放(只改变对象距离位置,不改变对象大小)"
  3.   (xyp-Start)
  4.   (or sc (setq sc 2.))
  5.   (setq sc (Ureal 7 "" "缩放比例" sc))
  6.   (princ "\n选择实体<退出>: ")
  7.   (if (and (setq ss (ssget))
  8.            (setq p0 (getpoint "\n缩放中心<退出>: "))
  9.       )
  10.     (mapcar '(lambda (x)
  11.                (setq p1 (xyp-9pt x 5)
  12.                      dd (* (distance p0 p1) sc)
  13.                      p2 (xyp-PtAlong2PtByDist p0 p1 dd)
  14.                 )
  15.                (xyp-move  x p1 p2)
  16.              )
  17.             (xyp-ss2list ss)
  18.     )
  19.   )
  20.   (xyp-End)
  21. )



本帖子中包含更多资源

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

x
发表于 2024-1-15 08:58:24 | 显示全部楼层

帅炸了~   已测试   非常完美!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-27 10:19 , Processed in 0.204274 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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