明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1214|回复: 14

[讨论] 请教关于如何获取镜像后的图元 !

[复制链接]
发表于 2020-9-1 21:11 | 显示全部楼层 |阅读模式
5明经币
   想跟各位老大请教个代码,代码想要达到的效果就是  执行镜像命令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)

最佳答案

查看完整内容

你感觉这样改造镜像命令好吗?就是每次都必须运行多余的代码,不管你要不要后续操作,上面那个多好啊,想要操作再搞 (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) )
发表于 2020-9-1 21:11 | 显示全部楼层
本帖最后由 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)
)
回复

使用道具 举报

发表于 2020-9-1 21:15 来自手机 | 显示全部楼层
用命令反应器
回复

使用道具 举报

 楼主| 发表于 2020-9-1 21:25 | 显示全部楼层
不会啊!老大!这个回复速度真是有点激动!!
回复

使用道具 举报

发表于 2020-9-1 23:46 来自手机 | 显示全部楼层
记得有个批量形心面积的代码,处理完闭合线段生成面预,从而获取星星面积,里面有个步骤就是删除生成的***,你可以找找,或者加我
回复

使用道具 举报

发表于 2020-9-2 09:26 | 显示全部楼层
有个笨方法但是很实用,倒退一步,提取entlast,再前进一步,提取新图元集合,同样适用 copy 操作,有个前提是镜像之后不能动,动了后退就没效了。
回复

使用道具 举报

发表于 2020-9-2 13:30 | 显示全部楼层
本帖最后由 xvjiex 于 2020-9-2 13:49 编辑

简单一点:
(command ".mirror" ent "" pt1 pt2 "n")
(command ".copy" ent "" pt1 pt2);ent为镜像后的图元,不用输入p。
回复

使用道具 举报

发表于 2020-9-2 14:02 | 显示全部楼层
;取得镜像或复制后的图元 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)
回复

使用道具 举报

 楼主| 发表于 2020-9-3 01:16 | 显示全部楼层
谢谢大家的热心及时回复,谢谢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)
回复

使用道具 举报

 楼主| 发表于 2020-9-3 23:07 | 显示全部楼层
start4444 发表于 2020-9-2 09:26
有个笨方法但是很实用,倒退一步,提取entlast,再前进一步,提取新图元集合,同样适用 copy 操作,有个前 ...

老大  拜托帮忙解决下我请教的这个选择镜像后图元的问题,这个问题对你来说肯定很简单,恳请帮忙解决下,我原来求助过的问题,也是你帮忙解决的。拜托了!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-16 13:41 , Processed in 0.138445 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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