明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 799|回复: 4

(解决了)带角度的镜像

[复制链接]
发表于 2023-6-4 10:53:17 | 显示全部楼层 |阅读模式
1明经币
本帖最后由 sandyvs 于 2023-6-5 20:53 编辑

已解决,

附件: 您需要 登录 才可以下载或查看,没有账号?注册
 楼主| 发表于 2023-6-5 11:01:53 | 显示全部楼层
本帖最后由 sandyvs 于 2023-6-5 14:47 编辑


(defun c:mij ( / ang ent moveDist moveToPoint moveVec pt0 pt1 pt2 pt3 ss ss1 vlaObj vlaObjCopy y)
  (vl-load-com)
  (setq ang (getangle "\n输入或指定角度:"))
  (setq ss(ssget))
  (setq pt1 (getpoint "\n指定镜像线的第一个点:"))
  (setq pt2 (getpoint pt1 "\n指定镜像线的第二个点:"))
  (setq ss1 (ssadd))
  (repeat (sslength ss)
    (setq ent (ssname ss 0)) ; 获取选择集中的第一个对象
    (setq pt0(lm-get-Centroid ent))
    (setq vlaObj (vlax-ename->vla-object ent)) ; 将实体名称转换为 VLA 对象
                (setq y (* -2 (- (cadr pt0) (cadr pt1))))
                (setq moveDist (/ y (s_tan ang)))
    (setq pt3 (mapcar '+ pt1 pt2))
    (setq pt3 (mapcar '/ pt3 '(2 2 2))) ; 计算镜像线中点
    (setq vlaObjCopy(vla-Mirror vlaObj (vlax-3D-point pt1) (vlax-3D-point pt2)) ); 镜像对象
    (ssadd (vlax-vla-object->ename vlaObjcopy) ss1)
    ; 计算从镜像线中点到镜像对象的移动矢量
    (setq moveVec (list moveDist 0.0 0.0))
    (setq moveToPoint (mapcar '+ pt3 moveVec))
    (vla-move vlaObjCopy (vlax-3D-point pt3) (vlax-3D-point moveToPoint)) ; 移动镜像对象
    (ssdel ent ss) ; 从选择集中删除已处理实体
  )
  (sssetfirst nil ss1)
  (cemi ss1)
  (princ)
)
(defun s_tan (A1);正切函数;输入弧角度如π。
(if (= (cos A1) 0) (sin A1) (/ (sin A1) (cos A1)))
)

(defun cemi  (ss / sc a b);;;;各自中心镜像---http://bbs.mjtd.com/forum.php?mo ... 5%D8%2B%BE%B5%CF%F1
  (if ss
    (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)));;左右镜像
            (setq ep(list (1+ (car bp))  (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))
)
(defun lm-get-Centroid (ty / obj pt x y)
        (setq obj (vlax-ename->vla-object ty))
        (vla-getboundingbox obj 'p1 'p2)
        (mapcar 'set'(x1 y1) (vlax-safearray->list p1 ))
        (mapcar 'set'(x2 y2) (vlax-safearray->list p2 ))
        (setq pt(list (/(+ x1 x2)2.0) (/(+ y1 y2)2.0)))
        pt
)

本帖子中包含更多资源

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

x

点评

只支持x轴y轴镜像,没加判断,多段线多于2个顶点会有问题。  发表于 2023-6-6 10:46
回复

使用道具 举报

发表于 2023-6-5 17:36:43 | 显示全部楼层
sandyvs 发表于 2023-6-5 11:01
(defun c:mij ( / ang ent moveDist moveToPoint moveVec pt0 pt1 pt2 pt3 ss ss1 vlaObj vlaObjCopy y)
...

  1. (defun c:mij ( / ang ent moveDist moveToPoint moveVec pt0 pt1 pt2 pt3 ss ss1 vlaObj vlaObjCopy y)
  2.   (vl-load-com)
  3.   (setq ang (getangle "\n输入或指定角度:"))
  4.   (setq ss(ssget))
  5.   (setq pt1 (getpoint "\n指定镜像线的第一个点:"))
  6.   (setq pt2 (getpoint pt1 "\n指定镜像线的第二个点:"))
  7.   (setq ss1 (ssadd) i 0)
  8.   (repeat (sslength ss)
  9.     (setq ent (ssname ss i)) ; 获取选择集中的第一个对象
  10.     (setq pt0(lm-get-Centroid ent))
  11.     (setq vlaObj (vlax-ename->vla-object ent)) ; 将实体名称转换为 VLA 对象
  12.                 (setq y (* -2 (- (cadr pt0) (cadr pt1))))
  13.                 (setq moveDist (/ y (s_tan ang)))
  14.     (setq pt3 (mapcar '+ pt1 pt2))
  15.     (setq pt3 (mapcar '/ pt3 '(2 2 2))) ; 计算镜像线中点
  16.     (setq vlaObjCopy(vla-Mirror vlaObj (vlax-3D-point pt1) (vlax-3D-point pt2)) ); 镜像对象
  17.     (ssadd (vlax-vla-object->ename vlaObjcopy) ss1)
  18.     ; 计算从镜像线中点到镜像对象的移动矢量
  19.     (setq moveVec (list moveDist 0.0 0.0))
  20.     (setq moveToPoint (mapcar '+ pt3 moveVec))
  21.     (vla-move vlaObjCopy (vlax-3D-point pt3) (vlax-3D-point moveToPoint)) ; 移动镜像对象
  22.                 (setq i (1+ i))
  23.   )
  24.   (cemi ss1)
  25.   (princ)
  26. )
  27. (defun s_tan (A1);正切函数;输入弧角度如π。
  28.         (if (= (cos A1) 0) (sin A1) (/ (sin A1) (cos A1)))
  29. )

  30. (defun cemi  (ss / sc a b);;;;各自中心镜像---http://bbs.mjtd.com/forum.php?mo ... 5%D8%2B%BE%B5%CF%F1
  31.   (if ss
  32.     (vlax-for obj
  33.                         (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object)))
  34.                         (if (not (VL-CATCH-ALL-ERROR-P  (VL-CATCH-ALL-APPLY  'vla-GetBoundingBox (list obj 'a 'b))))
  35.                                 (progn
  36.                                         (setq bp(mapcar '*  '(0.5 0.5 0.5)(apply 'mapcar (cons '+ (mapcar 'vlax-safearray->list(list a b))))))
  37.                                         ;(setq ep(list (car bp) (1+ (cadr bp)) (caddr bp)));;左右镜像
  38.                                         (setq ep(list (1+ (car bp))  (cadr bp) (caddr bp)));;上下镜像
  39.                                         (vla-transformby obj (vlax-tmatrix (mirror2dmat bp ep)))
  40.                                 )
  41.                         )
  42.                 )
  43.         )
  44.   (princ)
  45. )

  46. (defun mirror2dmat(sp ep / i a0 a1 a2 a3 t1 sp a b)
  47.   (setq i '((-1 0 0) (0 -1 0)(0 0 1)))
  48.   (setq a0(mapcar '- ep sp))
  49.   (setq a1(distance a0 (list 0 0 0)))
  50.   (setq a2(/ 1 a1))
  51.   (setq
  52.                 a3(mapcar '(lambda(y)(* y a2)) a0)
  53.                 t1(mapcar '(lambda(x)(mapcar '(lambda(y)(* x y)) a3)) a3)
  54.                 t1(mapcar '(lambda(x)(mapcar '(lambda(y)(* 2 y)) x))t1)
  55.                 t1(mapcar '(lambda(x y)(mapcar '+ x y)) t1 i)
  56.         )
  57.   (setq sp(mapcar '- sp (mapcar '(lambda(x)(apply '+ (mapcar '* x sp))) t1)))
  58.   (setq
  59.                 a (car t1)
  60.                 b (cadr t1)
  61.         )
  62.   (list
  63.     (list (car a)(cadr a)(caddr a) (car sp))
  64.     (list (car b)(cadr b)(caddr b) (cadr sp))
  65.     '(0 0 1 0)
  66.     '(0 0 0 1)
  67.         )
  68. )
  69. (defun lm-get-Centroid (ty / obj pt x y)
  70.         (setq obj (vlax-ename->vla-object ty))
  71.         (vla-getboundingbox obj 'p1 'p2)
  72.         (mapcar 'set'(x1 y1) (vlax-safearray->list p1 ))
  73.         (mapcar 'set'(x2 y2) (vlax-safearray->list p2 ))
  74.         (setq pt(list (/(+ x1 x2)2.0) (/(+ y1 y2)2.0)))
  75.         pt
  76. )
回复

使用道具 举报

 楼主| 发表于 2023-6-5 20:56:44 | 显示全部楼层

还是有问题。。

本帖子中包含更多资源

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

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 21:44 , Processed in 0.176208 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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