请教关于如何获取镜像后的图元 !
想跟各位老大请教个代码,代码想要达到的效果就是执行镜像命令MI后,接下来输入移动或复制命令时,可输入P键,能获取到镜像后的图元,方便操作,正常镜像命令后输入P是获取的镜像前的图元。此问题论坛上很早就有相关讨论,但没找到完整能用的代码,水平太有限,拼凑了半天论坛上的代码也没有成功,恳请大佬出手相助! 谢谢! 附上在论坛搜到的一段代码,应该是Caoyin老大写的:;;获取在图元 ent 之后产生的图元的选择集 ,ent不存在时返回nil
(defun entbackss(ent / backss)
(if ent
(progn
(setq backss (ssadd))
(while (setq ent (entnext ent))
(if (not (member (cdr (assoc 0 (entget ent)))
'("ATTRIB" "VERTEX" "SEQEND")))
(setq backss (ssadd ent backss))
)
)
(if (zerop (sslength backss))
(setq backss NIL)
)
backss
)
)
)
(princ)
本帖最后由 start4444 于 2020-9-6 02:23 编辑
你感觉这样改造镜像命令好吗?就是每次都必须运行多余的代码,不管你要不要后续操作,上面那个多好啊,想要操作再搞
(defun c:tt5 (/ enlast entx ss ss_new)
(setq ss (ssget) enlast (entlast))
(command "MIRROR" ss "" pause pause pause)
(setq ss_new (ssadd))
(if (while (setq entx (entnext enlast)) (setq ss_new (ssadd entx ss_new) enlast entx)) (setq ss ss_new))
(command "select" ss "")
(princ)
) 用命令反应器 不会啊!老大!这个回复速度真是有点激动!! 记得有个批量形心面积的代码,处理完闭合线段生成面预,从而获取星星面积,里面有个步骤就是删除生成的***,你可以找找,或者加我 有个笨方法但是很实用,倒退一步,提取entlast,再前进一步,提取新图元集合,同样适用 copy 操作,有个前提是镜像之后不能动,动了后退就没效了。 本帖最后由 xvjiex 于 2020-9-2 13:49 编辑
简单一点:
(command ".mirror" ent "" pt1 pt2 "n")
(command ".copy" ent "" pt1 pt2);ent为镜像后的图元,不用输入p。 ;取得镜像或复制后的图元 ZZXXQQ 2020-9-2
(defun ssplast ( / sslast)
(if (setq ss (ssget "P"))
(repeat (setq i (sslength ss))
(setq a (entlast))
(ssadd a sslast)
(ssdel a)
)
(repeat i
(ssdel (ssname (setq i (1- i))))
)
sslast
)
)
(princ) 谢谢大家的热心及时回复,谢谢Z版,我把以前在咱们论坛上搜到的优化过的复制命令给各位老大过目下,这个命令可以达到复制命令后,可以用P来选择复制后的图元,我尝试改为镜像命令,调试了几次没有成功,水平太菜,没办法,恳请各位根据这个代码调整后,能用于镜像命令,(代码作者忘了是哪位大佬了,见谅!)
(defun c:tt ()
(setq a (cadr (ssgetfirst)))
(if a
(setq ss a)
(setq ss (ssget))
)
(setvar "cmdecho" 0)
(command "undo" "g")
(if ss
(progn
(initget "M ")
(setq p1 (getpoint "\n多重复制(M)/指定基点: "))
(cond
((= p1 "M")
(princ "\n多重复制....")
(setq pt Nil)
(setq p1 (getpoint "指定基点: "))
(princ "\n")
(if p1
(progn
(princ "\n已指定基准点\n")
(while (not (equal p1 pt 1e-4))
(setq ent (entlast))
(setq pt p1)
(princ "指定下一点: ")
(vl-cmdf "copy" ss "" "non" pt pause)
(setq tempss ss)
(setq ss (entbackss ent))
(setq p1 (getvar "lastpoint"))
)
(command "._erase" ss "")
(command "select" tempss "")
)
(princ "\n未指定基准点,程序结束\n")
)
)
(T
(if p1
(progn
(setq ent (entlast))
(princ "指定下一点: ")
(command "copy" ss "" "non" p1 pause)
(setq tempss ss)
(setq pt (getvar "lastpoint"))
(setq ss (entbackss ent))
(if (null ss)
(setq ss (ssadd))
)
(if (equal p1 pt 1e-4)
(progn
(command "._erase" ss "")
(command "select" tempss "")
)
(command "select" ss "")
)
)
)
)
)
)
)
(command "undo" "e")
(princ))
;;获取在图元 ent 之后产生的图元的选择集 ,ent不存在时返回nil
(defun entbackss(ent / backss)
(if ent
(progn
(setq backss (ssadd))
(while (setq ent (entnext ent))
(if (not (member (cdr (assoc 0 (entget ent)))
'("ATTRIB" "VERTEX" "SEQEND")))
(setq backss (ssadd ent backss))
)
)
(if (zerop (sslength backss))
(setq backss NIL)
)
backss
)
)
)
(princ) start4444 发表于 2020-9-2 09:26
有个笨方法但是很实用,倒退一步,提取entlast,再前进一步,提取新图元集合,同样适用 copy 操作,有个前 ...
老大拜托帮忙解决下我请教的这个选择镜像后图元的问题,这个问题对你来说肯定很简单,恳请帮忙解决下,我原来求助过的问题,也是你帮忙解决的。拜托了!:handshake
页:
[1]
2