999999 发表于 2020-10-21 19:57:48

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

本帖最后由 999999 于 2020-10-21 21:56 编辑

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


cq4920 发表于 2020-10-23 14:46:10

本帖最后由 cq4920 于 2020-10-23 14:51 编辑

999999 发表于 2020-10-23 09:17
大神,您知道函数的链接哪吗
稍微整理了一下 原理不难

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

(defun c:tt(/ SS WK P1 P2 P3 P4 PT1 SS2)
(MC:be1)
(setq ss (ssget))
      (mc:Wk ss)
      (setq wk (entlast)) ;获取选择集外框图元名
         (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 "")
                     )   
(command "_.mirror" ss "" P2P3 "n" "")            
(setq ss2 (last_ent WK));;论坛里的一个函数
   (setvar "OSMODE" os)
( setq pt1 (getpoint"\n指定放置位置"))
(command "_.MOVE" ss2 "" p2 pt1)
(MC:be11)      
)

;;39外框
(defun mc:wk (ss / oldos oldlalst n obj minx miny maxxmaxy pt1
         pt2 pt3 pt4)
(setq oldos (getvar "osmode"))
(setq oldla (getvar "clayer"))
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(repeat (setq n (sslength ss))
    (setq obj (vlax-ename->vla-object (ssname ss (setq n (1- n)))))
    (vla-getboundingbox obj 'x 'y)
    (setq lst (cons (vlax-safearray->list y)
      (cons (vlax-safearray->list x) lst)
      )
    )
)
(setqminx (car (vl-sort (mapcar 'car lst) '<))
miny (car (vl-sort (mapcar 'cadr lst) '<))
maxx (car (vl-sort (mapcar 'car lst) '>))
maxy (car (vl-sort (mapcar 'cadr lst) '>))
)
(setq pt1 (list minx miny))
(setq pt2 (list maxx miny))
(setq pt3 (list maxx maxy))
(setq pt4 (list minx maxy))
      (entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") '(90 . 4) '(70 . 1) (cons 10 pt1) (cons 10 pt2) (cons 10 pt3) (cons 10 pt4)))
(setvar "osmode" oldos)
(setvar "clayer" oldla)
(setvar "cmdecho" 1)
(princ)
)
;;40最后生产出的图元
(defun last_ent (en / ss)
      (if en
                (progn
                        (setq ss (ssadd))
                        (while (setq en (entnext en))
                              (if (not (member (cdr (assoc 0 (entget en)))
                                                                         '("ATTRIB" "VERTEX" "SEQEND")
                                                               )
                                                )
                                        (ssadd en ss)
                              );if
                        );while
                        (if (zerop (sslength ss)) (setq ss nil))
                        ss
                );progn
                (ssget "_x")
      );if
)


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

(defun Mc:be11 ()
      (setvar "orthomode" 0)
(command "_undo" "e")
(setvar "OSMODE" os)
      (setvar "cmdecho" cm))

cq4920 发表于 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 部分函数都在 论坛里了

Bao_lai 发表于 2020-10-21 21:49:24

上效果图才知道需求

999999 发表于 2020-10-21 22:00:20

Bao_lai 发表于 2020-10-21 21:49
上效果图才知道需求

大神,图片后面上传了看不了      123             |321         就类似前面数字一样,,中间的竖线是指光标指定的两点,然后321就挨着光标的两点镜像,大神看懂了嘛

999999 发表于 2020-10-21 22:01:39

999999 发表于 2020-10-21 22:00
大神,图片后面上传了看不了      123             |321         就类似前面数字一样,,中间的竖线是 ...

我指的是图形和数字的镜像都能这样实现哟

Bao_lai 发表于 2020-10-22 01:46:49

选择集求包围盒,镜像后移动,或者根据光标位置重新计算对称轴后镜像。

mokson 发表于 2020-10-22 08:00:17

mirrtext 设置为1,但是文字是反看的。
这种123 变 321文本信息的镜像,只能用 lisp 才能实现了。

cghdy 发表于 2020-10-22 09:14:43

你这不是常规镜像功能,用论坛上的超级复制可以实现。

mikewolf2k 发表于 2020-10-22 09:17:56

8910 怎么处理?

999999 发表于 2020-10-23 09:12:55

Bao_lai 发表于 2020-10-22 01:46
选择集求包围盒,镜像后移动,或者根据光标位置重新计算对称轴后镜像。

包围盒是什么意思,太过专业了吧
页: [1] 2
查看完整版本: (求助)关于CAD原始的镜像功能的想法,求路过的大神看能不能实现