明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2327|回复: 13

[经验] 中心镜像

[复制链接]
发表于 2023-7-6 04:05:00 | 显示全部楼层 |阅读模式
原贴忘记是那个大佬的了,我想讨论的是希望有人能合并两个命令为一个命令来用
命令后框选对象直接空格X轴中心镜像,命令后框选对象加 D 则Y轴中心镜像
太多程序和命令,连本人都记不住,所以想着让同类命令能合并一起这样少记通用。
lee50310大佬就合并过隐藏显示命令,这次的想法和这个一样
http://bbs.mjtd.com/forum.php?mo ... mp;extra=#pid903644




快捷键  ggy  Y轴中心镜像
(defun c:ggy  (/ sc a b);;;;各自中心上下镜像
  (while (ssget)
    (vlax-for        obj
                (vla-get-ActiveSelectionSet
                  (vla-get-ActiveDocument (vlax-get-acad-object)))
        (if (not (VL-CATCH-ALL-ERROR-P
                   (VL-CATCH-ALL-APPLY
                     'vla-GetBoundingBox
                     (list obj 'a 'b))))
          (progn
            (setq bp(mapcar '*  '(0.5 0.5 0.5)(apply 'mapcar (cons '+ (mapcar 'vlax-safearray->list(list a b))))))
            (setq ep(list (1+ (car bp))  (cadr bp) (caddr bp)))
            (vla-transformby obj (vlax-tmatrix (mirror2dmat bp ep)))
            )
          )
        )
    )
  (princ)
  )

快捷键  ggx  X轴中心镜像
(defun c:ggx  (/ sc a b);;;;各自中心左右镜像
  (while (ssget)
    (vlax-for        obj
                (vla-get-ActiveSelectionSet
                  (vla-get-ActiveDocument (vlax-get-acad-object)))
        (if (not (VL-CATCH-ALL-ERROR-P
                   (VL-CATCH-ALL-APPLY
                     'vla-GetBoundingBox
                     (list obj 'a 'b))))
          (progn
            (setq bp(mapcar '*  '(0.5 0.5 0.5)(apply 'mapcar (cons '+ (mapcar 'vlax-safearray->list(list a b))))))
            (setq ep(list (car bp) (1+ (cadr bp)) (caddr bp)))
            (vla-transformby obj (vlax-tmatrix (mirror2dmat bp ep)))
            )
          )
        )
    )
  (princ)
  )

(defun mirror2dmat(sp ep / i a0 a1 a2 a3 t1 sp a b)
  (setq i '((-1 0 0) (0 -1 0)(0 0 1)))
  (setq a0(mapcar '- ep sp))
  (setq a1(distance a0 (list 0 0 0)))
  (setq a2(/ 1 a1))
  (setq a3(mapcar '(lambda(y)(* y a2)) a0)
        t1(mapcar '(lambda(x)(mapcar '(lambda(y)(* x y)) a3)) a3)
        t1(mapcar '(lambda(x)(mapcar '(lambda(y)(* 2 y)) x))t1)
        t1(mapcar '(lambda(x y)(mapcar '+ x y)) t1 i))
  (setq sp(mapcar '- sp (mapcar '(lambda(x)(apply '+ (mapcar '* x sp))) t1)))
  (setq a (car t1)
        b (cadr t1))
  (list
    (list (car a)(cadr a)(caddr a) (car sp))
    (list (car b)(cadr b)(caddr b) (cadr sp))
    '(0 0 1 0)
    '(0 0 0 1))
)


"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2023-7-6 07:59:01 | 显示全部楼层


(defun c:NM (/ a b bbmmi bp ep mirror2dmat sc);;;;
        (defun mirror2dmat(sp ep / i a0 a1 a2 a3 t1 sp a b)
                (setq i '((-1 0 0) (0 -1 0)(0 0 1)))
                (setq a0(mapcar '- ep sp))
                (setq a1(distance a0 (list 0 0 0)))
                (setq a2(/ 1 a1))
                (setq a3(mapcar '(lambda(y)(* y a2)) a0)
                        t1(mapcar '(lambda(x)(mapcar '(lambda(y)(* x y)) a3)) a3)
                        t1(mapcar '(lambda(x)(mapcar '(lambda(y)(* 2 y)) x))t1)
                        t1(mapcar '(lambda(x y)(mapcar '+ x y)) t1 i))
                (setq sp(mapcar '- sp (mapcar '(lambda(x)(apply '+ (mapcar '* x sp))) t1)))
                (setq a (car t1)
                        b (cadr t1))
                (list
                        (list (car a)(cadr a)(caddr a) (car sp))
                        (list (car b)(cadr b)(caddr b) (cadr sp))
                        '(0 0 1 0)
                        '(0 0 0 1))
        )
        (setq bbMMI nil)
  (while (ssget)
    (vlax-for  obj
                        (vla-get-ActiveSelectionSet
                                (vla-get-ActiveDocument (vlax-get-acad-object)))
                        (if (not (VL-CATCH-ALL-ERROR-P
                                                                 (VL-CATCH-ALL-APPLY
                                                                         'vla-GetBoundingBox
                                                                         (list obj 'a 'b))))
                                (progn               
                                        (OR
                                                bbMMI
                                                (PROGN
                                                        (initget "X D")
                                                        (if (not bbMMI) (setq bbMMI "X"))
                                                        (setq bbMMI
                                                                (cond
                                                                        ( (getkword (strcat "【瞎玩版】 \n请选择镜像轴[x轴(X) /y轴(D) ]<" bbMMI "> : " )))
                                                                        ( bbMMI )                       
                                                                )
                                                        )
                                                )
                                        )                                                       
                                        (cond
                                                ((= bbMMI "X")
                                                        (setq bp(mapcar '*  '(0.5 0.5 0.5)(apply 'mapcar (cons '+ (mapcar 'vlax-safearray->list(list a b))))))
                                                        (setq ep(list (car bp) (1+ (cadr bp)) (caddr bp)))
                                                        (vla-transformby obj (vlax-tmatrix (mirror2dmat bp ep)))                                                       
                                                )
                                                ((= bbMMI "D")
                                                        (setq bp(mapcar '*  '(0.5 0.5 0.5)(apply 'mapcar (cons '+ (mapcar 'vlax-safearray->list(list a b))))))
                                                        (setq ep(list (1+ (car bp))  (cadr bp) (caddr bp)))
                                                        (vla-transformby obj (vlax-tmatrix (mirror2dmat bp ep)))
                                                )
                                        )                                       
                                )
                        )
                )
        )
  (princ)
)



回复 支持 1 反对 0

使用道具 举报

发表于 2023-7-6 09:03:23 | 显示全部楼层
;;;通过点四向镜像
(defun c:mii (/ obj pt obj1 oldos)
  (princ "\n请选择四向镜像的对象:")
  (setq obj (ssget))
  (princ "\n请选择镜像点:")
  (setq pt (getpoint))
  (if (and obj pt)
    (progn
      (command ".undo" "BE")
      (setq oldos (getvar "osmode"))
      (setvar "osmode" 0)
      (command "_.mirror" obj "" pt (list (car pt)(+ (cadr pt) 10)) "N")
      (setq obj1 (entlast))
      (command "_.mirror" obj "" pt (list (+ (car pt) 10) (cadr pt)) "N")
      (command "_.mirror" obj1 "" pt (list (+ (car pt) 10) (cadr pt)) "N")
      (setvar "osmode" oldos)
      (command ".undo" "E")
    )
    (princ "\n没有选择对象或镜像点!")
  )
  (princ)
)
发表于 2023-7-6 06:30:10 | 显示全部楼层
你是起的真早
发表于 2023-7-6 08:25:28 | 显示全部楼层
可以减少记忆量
发表于 2023-7-6 11:07:40 | 显示全部楼层
(if (= (getstring  "[y轴镜像(d)/x轴镜像(空格)]:") "d") (c:ggy) (c:ggx))
发表于 2023-7-6 12:42:43 | 显示全部楼层
多谢楼主分享
发表于 2023-7-6 17:37:20 来自手机 | 显示全部楼层
start4444 发表于 2023-7-6 11:07
(if (= (getstring  "[y轴镜像(d)/x轴镜像(空格)]:") "d") (c:ggy) (c:ggx))

我也这么干,哈哈
 楼主| 发表于 2023-7-7 03:43:23 | 显示全部楼层
xj6019 发表于 2023-7-6 07:59
(defun c:NM (/ a b bbmmi bp ep mirror2dmat sc);;;;
        (defun mirror2dmat(sp ep / i a0 a1 a2 a3 t1 ...

感谢大佬,正是我想要的效果
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 12:56 , Processed in 0.162823 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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