明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1593|回复: 19

[提问] (求助)关于CAD原始的镜像功能的想法,求路过的大神看能不能实现

[复制链接]
发表于 2020-10-21 19:57:48 | 显示全部楼层 |阅读模式
本帖最后由 999999 于 2020-10-21 21:56 编辑

CAD原始的镜像命令是以光标垂直或水平以对称的形式镜像(以光标指定的两点为中线对称),请问大神能不能改造成以光标指定的两点(挨着两点完成镜像)


本帖子中包含更多资源

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

x
发表于 2020-10-23 14:46:10 | 显示全部楼层
本帖最后由 cq4920 于 2020-10-23 14:51 编辑
999999 发表于 2020-10-23 09:17
大神,您知道函数的链接哪吗

稍微整理了一下 原理不难

如果 选择 可以不分先后
再加个预览就更beautiful啦
有兴趣就再加个判断,如果不输入插入点,直接按空格,就原地翻转 ,如果输入A或者其他就垂直翻转,

  1. (defun c:tt(/ SS WK P1 P2 P3 P4 PT1 SS2)
  2. (MC:be1)
  3.   (setq ss (ssget))
  4.         (mc:Wk ss)
  5.         (setq wk (entlast)) ;获取选择集外框图元名
  6.          (progn
  7.                         (vl-load-com)
  8.                         (vla-getboundingbox (vlax-ename->vla-object wk) 'minpoint 'maxpoint)
  9.                         (setq p3 (vlax-safearray->list maxpoint)
  10.                                 p1 (vlax-safearray->list minpoint))
  11.                         (setq p2 (list (car p3) (cadr p1)))
  12.                         (setq p4 (list (car p1) (cadr p3)))
  13.       (COMMAND "_.erase"  wk "")
  14.                      )   
  15. (command "_.mirror" ss "" P2  P3 "n" "")            
  16. (setq ss2 (last_ent WK));;论坛里的一个函数
  17.    (setvar "OSMODE" os)
  18. ( setq pt1 (getpoint"\n指定放置位置"))
  19. (command "_.MOVE" ss2 "" p2 pt1)
  20. (MC:be11)      
  21. )

  22. ;;39外框
  23. (defun mc:wk (ss / oldos oldla  lst n obj minx miny maxx  maxy pt1
  24.          pt2 pt3 pt4)
  25.   (setq oldos (getvar "osmode"))
  26.   (setq oldla (getvar "clayer"))
  27.   (setvar "cmdecho" 0)
  28.   (setvar "osmode" 0)
  29.   (repeat (setq n (sslength ss))
  30.     (setq obj (vlax-ename->vla-object (ssname ss (setq n (1- n)))))
  31.     (vla-getboundingbox obj 'x 'y)
  32.     (setq lst (cons (vlax-safearray->list y)
  33.         (cons (vlax-safearray->list x) lst)
  34.         )
  35.     )
  36.   )
  37.   (setq  minx (car (vl-sort (mapcar 'car lst) '<))
  38.   miny (car (vl-sort (mapcar 'cadr lst) '<))
  39.   maxx (car (vl-sort (mapcar 'car lst) '>))
  40.   maxy (car (vl-sort (mapcar 'cadr lst) '>))
  41.   )
  42.   (setq pt1 (list minx miny))
  43.   (setq pt2 (list maxx miny))
  44.   (setq pt3 (list maxx maxy))
  45.   (setq pt4 (list minx maxy))
  46.         (entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") '(90 . 4) '(70 . 1) (cons 10 pt1) (cons 10 pt2) (cons 10 pt3) (cons 10 pt4)))
  47.   (setvar "osmode" oldos)
  48.   (setvar "clayer" oldla)
  49.   (setvar "cmdecho" 1)
  50.   (princ)
  51. )
  52. ;;40最后生产出的图元
  53. (defun last_ent (en / ss)
  54.         (if en
  55.                 (progn
  56.                         (setq ss (ssadd))
  57.                         (while (setq en (entnext en))
  58.                                 (if (not (member (cdr (assoc 0 (entget en)))
  59.                                                                          '("ATTRIB" "VERTEX" "SEQEND")
  60.                                                                  )
  61.                                                 )
  62.                                         (ssadd en ss)
  63.                                 );if
  64.                         );while
  65.                         (if (zerop (sslength ss)) (setq ss nil))
  66.                         ss
  67.                 );progn
  68.                 (ssget "_x")
  69.         );if
  70. )


  71. ;准备:控制回显和输入,捕捉,当前颜色
  72. (defun MC:be1()
  73.         (setq cm (getvar "cmdecho")
  74.                 os (getvar "osmode"))
  75.         (setvar "CMDECHO" 0)
  76.         (setvar "OSMODE" 0)
  77.         (command "color" "bylayer")
  78.         (command "_undo" "be"))        

  79. (defun Mc:be11 ()
  80.         (setvar "orthomode" 0)
  81.   (command "_undo" "e")
  82.   (setvar "OSMODE" os)
  83.         (setvar "cmdecho" cm))

回复 支持 1 反对 0

使用道具 举报

发表于 2020-10-22 18:03:50 | 显示全部楼层

(defun c:tt()

  (setq ss (ssget))
        (setq wk (mc:Wk ss)) ;获取选择集外框图元名
         (progn
                        (vl-load-com)
                        (vla-getboundingbox (vlax-ename->vla-object wk) 'minpoint 'maxpoint)
                        (setq p3 (vlax-safearray->list maxpoint)
                                p1 (vlax-safearray->list minpoint))
                        (setq p2 (list (car p3) (cadr p1)))
                        (setq p4 (list (car p1) (cadr p3)))
      (COMMAND "_.erase"  wk "")
                     )
       
        (setq e0 (entlast))
       
(command "MIRROR" ss p2 p4 “” “n”)       
       
setq ss2 (last_ent e0);;论坛里的一个函数
       
(        setq pt1 (getpoint))

(command "MOVE" ss2 p2 pt1)
       
)


大概思路就是这样 先镜像再移动 这样不仅可以水平镜像  还可以直接镜像再确定放在哪 这个是水平方向 垂直放线加个判断就好了  没开CAD 部分函数都在 论坛里了
发表于 2020-10-21 21:49:24 来自手机 | 显示全部楼层
上效果图才知道需求
 楼主| 发表于 2020-10-21 22:00:20 | 显示全部楼层
Bao_lai 发表于 2020-10-21 21:49
上效果图才知道需求

大神,图片后面上传了看不了        123             |321         就类似前面数字一样,,中间的竖线是指光标指定的两点,然后321就挨着光标的两点镜像,大神看懂了嘛
 楼主| 发表于 2020-10-21 22:01:39 | 显示全部楼层
999999 发表于 2020-10-21 22:00
大神,图片后面上传了看不了        123             |321         就类似前面数字一样,,中间的竖线是 ...

我指的是图形和数字的镜像都能这样实现哟
发表于 2020-10-22 01:46:49 来自手机 | 显示全部楼层
选择集求包围盒,镜像后移动,或者根据光标位置重新计算对称轴后镜像。
发表于 2020-10-22 08:00:17 | 显示全部楼层
mirrtext 设置为1,但是文字是反看的。
这种123 变 321文本信息的镜像,只能用 lisp 才能实现了。
发表于 2020-10-22 09:14:43 | 显示全部楼层
你这不是常规镜像功能,用论坛上的超级复制可以实现。
发表于 2020-10-22 09:17:56 | 显示全部楼层
8910 怎么处理?
 楼主| 发表于 2020-10-23 09:12:55 | 显示全部楼层
Bao_lai 发表于 2020-10-22 01:46
选择集求包围盒,镜像后移动,或者根据光标位置重新计算对称轴后镜像。

包围盒是什么意思,太过专业了吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-17 11:35 , Processed in 0.199395 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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