(求助)关于CAD原始的镜像功能的想法,求路过的大神看能不能实现
本帖最后由 999999 于 2020-10-21 21:56 编辑CAD原始的镜像命令是以光标垂直或水平以对称的形式镜像(以光标指定的两点为中线对称),请问大神能不能改造成以光标指定的两点(挨着两点完成镜像)
本帖最后由 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))
(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
上效果图才知道需求
大神,图片后面上传了看不了 123 |321 就类似前面数字一样,,中间的竖线是指光标指定的两点,然后321就挨着光标的两点镜像,大神看懂了嘛 999999 发表于 2020-10-21 22:00
大神,图片后面上传了看不了 123 |321 就类似前面数字一样,,中间的竖线是 ...
我指的是图形和数字的镜像都能这样实现哟 选择集求包围盒,镜像后移动,或者根据光标位置重新计算对称轴后镜像。 mirrtext 设置为1,但是文字是反看的。
这种123 变 321文本信息的镜像,只能用 lisp 才能实现了。 你这不是常规镜像功能,用论坛上的超级复制可以实现。 8910 怎么处理? Bao_lai 发表于 2020-10-22 01:46
选择集求包围盒,镜像后移动,或者根据光标位置重新计算对称轴后镜像。
包围盒是什么意思,太过专业了吧
页:
[1]
2