明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 985|回复: 8

帮忙编写一个镜像命令,开始的时候选择镜像线,后面镜像不用再选择

[复制链接]
发表于 2022-9-30 15:33:03 | 显示全部楼层 |阅读模式
2明经币
本帖最后由 loveu515 于 2022-9-30 17:13 编辑

求大神帮忙编写一个镜像命令
镜像命令开始的时候选择镜像线,后面镜像(后面再次用镜像命令的时候)不用再选择,默认一直是这条线,如果要换镜像线的话,输入一个命令再重新选择。

可以实现吗?

最佳答案

查看完整内容

我帮你写的这个应该很满足你了
发表于 2022-9-30 15:33:04 | 显示全部楼层
本帖最后由 纵横八方 于 2022-10-9 15:48 编辑

我帮你写的这个应该很满足你了

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2022-9-30 15:51:00 | 显示全部楼层
本帖最后由 ssyfeng 于 2022-9-30 15:57 编辑

试试是不是这个效果:
(defun c:tt (/ en en1 pt1 pt2)
  (vl-load-com)
  (setq en (car (entsel "\n选择镜像线:"))
                pt1 (vlax-curve-getStartPoint (vlax-ename->vla-object en))
                pt2 (vlax-curve-getendPoint (vlax-ename->vla-object en))
        )
        (while (and en pt1 pt2 (setq en1 (car (entsel "\n选择对象:"))))
                (vl-cmdf "MIRROR" en1 "" pt1 pt2 "n")
  )
  (princ)
)


本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2022-9-30 17:16:12 | 显示全部楼层
ssyfeng 发表于 2022-9-30 15:51
试试是不是这个效果:
(defun c:tt (/ en en1 pt1 pt2)
  (vl-load-com)

谢谢,你写的这个命令也很好用。我上面表达的不清楚,非常抱歉。是第一次用镜像命令的时候选择镜像线,后面再用镜像命令的时候不用再选择镜像线,默认上次的那条。可以实现吗?
回复

使用道具 举报

发表于 2022-10-7 14:06:46 | 显示全部楼层
(defun c:t1(/obj  p pt n pt1 pt2 ss)
  (if(or *test_en*(setq *test_en*(entsel "\n请选择镜像线:")))
    (progn
      (setq
        obj(vlax-ename->vla-object (car *test_en*))
        p(cadr *test_en*)
        pt(vlax-curve-getclosestpointto obj p)
        n(fix(vlax-curve-getparamatpoint obj pt))
        pt1(vlax-curve-getpointatparam obj n)
        pt2(vlax-curve-getpointatparam obj(1+ n))
      )
      (princ "\n请选择需镜像的图元:")
      (if(setq ss(ssget))(command ".mirror" ss "" "_non" pt1 "_non" pt2 ""))
    )
  )
  (prin1)
)
(defun c:t2()
  (setq *test_en* nil)
  (princ "\n已经消除T1命令镜像线")
  (prin1)
)
回复

使用道具 举报

 楼主| 发表于 2022-10-8 11:36:20 | 显示全部楼层
xtjd 发表于 2022-10-7 14:06
(defun c:t1(/obj  p pt n pt1 pt2 ss)
  (if(or *test_en*(setq *test_en*(entsel "\n请选择镜像线:"))) ...

感谢你的帮助,我运行的T1的时候提示“错误  参数太少”,是不是缺少支持啊
回复

使用道具 举报

发表于 2022-10-9 15:23:32 | 显示全部楼层
(defun c:MII(/ image_xunhuan);;;增强镜像-纵横八方
(DEFUN IMAGE_XUNHUAN(/ pt1 pt2 s2)
(VL-LOAD-COM)       
(initget "S")
(if (= (setq S2 (Fsxm-ssget+ "\n请选择镜像对象或【S设置镜像轴】:" "S :S" '((0 . "*LINE,ARC,CIRCLE,ELLIPSE,XLINE,POLYLINE,SPLINE,LWPOLYLINE")))) "S")
(PROGN (setq e1_enT (CAR (ENTSEL "\n请 点 选 镜 像 轴:")))
(IMAGE_XUNHUAN)
)
(PROGN
(if (= S2        NIL) (EXIT))
(SETQ pt1 (vlax-curve-getStartPoint (vlax-ename->vla-object e1_enT)))
(SETQ pt2 (vlax-curve-getendPoint (vlax-ename->vla-object e1_enT)))
(command "MIRROR" S2 "" "NON" pt1 "NON" pt2 "Y")
(IMAGE_XUNHUAN)
)
)
)

(IF (NULL e1_enT)
(PROGN (AND (setq e1_enT (CAR (ENTSEL "\n请 点 选 镜 像 轴:"))) (IMAGE_XUNHUAN)))
(PROGN (IMAGE_XUNHUAN))
)
)

;;参数:Msg:提示信息
;;参数:Kwd:选项关键字(支持多个关键字,如":E:S S",关键字之间用空格隔开,
                   ;其中"S"为额外选项关键字(应摒避CAD内置于SSGET中的关键字)
;;参数:Fil:选集过滤表
;;返回:选集或额外选项关键字
(defun Fsxm-ssget+ (Msg Kwd Fil / Kwd0 pt var stop result *ACAD* *DOC* Fsxm-Split  Pt2Str key_ssget)
        (setq *ACAD*  (vlax-get-acad-object))
        (setq *DOC*   (vla-get-ActiveDocument *ACAD*))
        ;;===============================================================
        ;;点化字串
        (defun Pt2Str (pt)
                (strcat (rtos (car pt) 2 20)
                        ","
                        (rtos (cadr pt) 2 20)
                        ","
                        (rtos (caddr pt) 2 20)
                        "\n"
                )
        )
        ;;===============================================================
        ;;;用分隔符解释字符串成表
        (defun Fsxm-Split (string strkey / po strlst xlen)
                (setq xlen (1+ (strlen strkey)))
                (while (setq po (vl-string-search strkey string))
                        (setq strlst (cons (substr string 1 po) strlst))
                        (setq string (substr string (+ po xlen)))
                )
                (reverse (cons string strlst))
        )
        ;;===============================================================
        (defun Fsxm-entsel (msg filter)
                (setq enp (entsel msg))
                (if (or (= (type enp) 'str)
                                        (and enp (ssget (cadr enp) filter));;点选
                                )
                        enp
                )
        )
        ;;===============================================================
        (cond
                ((cadr (ssgetfirst)) (command "SELECT" (cadr (ssgetfirst)) "") (setq result (ssget "" Fil)));;优化内容2:完善原程序在先选择后执行情况下,不过滤的bug,
                (t
                        (setq Kwd0 "W L C BOX ALL F WP CP G A R M P U AU SI")
                        (setq kwd (strcase kwd))
                        (setq kwd_lst (Fsxm-Split kwd " "))
                        (initget (strcat Kwd0 " " kwd))
                        (setq var (fsxm-entsel Msg Fil))
                        (if (OR (member "SI" kwd_lst)(member ":S" kwd_lst));;优化内容1:支持(ssget ":E:S")模式
                                (if (and var (listp var))
                                        (progn
                                                (setq stop T)
                                                (setq result(ssadd (car var)))
                                        )
                                )
                        )
                        (if (NOT stop)
                                (cond
                                        ((and
                                                 (listp var);;说明Fsxm-entsel空选
                                                 (/= 52 (getvar "errno"))
                                         )
                                                (vla-sendcommand *doc* (Pt2Str (cadr (grread t))))
                                                (setq key_lst(list ":E" "M" ":S" "SI" ":E:S" ":S:E" ""))
                                                (foreach x kwd_lst
                                                        (if (member x key_lst)
                                                                (cond
                                                                        ((or(= x ":E")(= x "M"))(setq  key_ssget        ":E"))
                                                                        ((or(= x ":S")(= x "SI"))(setq key_ssget        ":S"))
                                                                        ((or(= x ":E:S")(= x ":S:E")(= x ""))(setq key_ssget        x))
                                                                )
                                                        )
                                                )
                                               (if key_ssget
                                                        (setq result (ssget key_ssget Fil))
                                                        (setq result (ssget  Fil))
                                                )  ;;更新修正2022.5.12                     
                                        );;空选之后变框选
                                        ((member var (fsxm-split Kwd0 " "))
                                                (vla-sendcommand *doc* (strcat var "\n"))
                                                (setq result (ssget Fil))
                                        );响应用户手动输入的关键字(选择模式)
                                        (t (setq result var))
                                )
                        )
                )
        )
        result
)
;;================================================================================
;选择集与对象名表互转
(defun ss-enlst        (ss / enlst)
        (cond
                ((= (type ss) 'PICKSET)
                        (vl-remove-if-not '(lambda (x) (= (type x) 'ENAME)) (mapcar 'cadr (ssnamex SS)))
                )
                ((= (type ss) 'LIST)
                        (setq enlst (ssadd))
                        (last (mapcar '(lambda (x) (ssadd x enlst)) ss))
                )
        )
)
;;=====================================================================================================================
;;; grread捕捉子函数
;;; name为移动的图元名,pt为光标点
;;; 返回值:如果有捕捉点则返回捕捉点,无则返回光标点
;;;http://bbs.mjtd.com/forum.php?mo ... hlight=%B2%B6%D7%BD
(defun osnappt (name pt / color d h k lst nearpt nearpt2 osmo pt1 pt2 pt3 pt4 pt5 ptx pty x)
        (if name (entdel name))
        (redraw)
        (if (< (getvar "osmode") 16384);;打开捕捉
                (progn
                        (setq color (vla-get-autosnapmarkercolor (vla-get-drafting (vla-get-preferences (vlax-get-acad-object))))
                                h (/ (getvar "viewsize") (cadr (getvar "screensize"))) d (getvar "pickbox")
                                lst (list (* d h) (* (- d 0.5) h) (* (+ d 0.5) h)) k (* 1.5 d h))
                        (if (setq nearpt (osnap pt "_END,_CEN,_NOD,_QUA,_INS,_TAN,_EXT"))(setq osmo 1))
                        (if (and(setq nearpt2 (osnap pt "_NEA"))(not (equal nearpt nearpt2 k)))
                                (setq osmo 2 nearpt nearpt2))
                        (if (and(setq nearpt2 (osnap pt "_MID"))(equal nearpt nearpt2 k))
                                (setq osmo 3 nearpt nearpt2))
                        (if (and(setq nearpt2 (osnap pt "_INT"))(equal nearpt nearpt2 k))
                                (setq osmo 4 nearpt nearpt2))))
        (if name(entdel name))
        (if nearpt
                (progn
                        (setq ptx (car nearpt)pty (cadr nearpt))
                        (foreach x lst
                                (setq pt1 (list (- ptx x) (- pty x)) pt2 (list (+ ptx x) (- pty x))
                                        pt3 (list (+ ptx x) (+ pty x)) pt4 (list (- ptx x) (+ pty x))
                                        pt5 (list ptx (+ pty x)))
                                (cond
                                        ((= osmo 1)(grvecs (list color pt1 pt2 pt2 pt3 pt3 pt4 pt4 pt1)))
                                        ((= osmo 2)(grvecs (list color pt1 pt2 pt2 pt4 pt3 pt4 pt3 pt1)))
                                        ((= osmo 3) (grvecs (list color pt1 pt2 pt2 pt5 pt5 pt1)))
                                        ((= osmo 4) (grvecs (list color pt1 pt3 color pt2 pt4)))))
                        (setq pt nearpt)))
        pt
)
回复

使用道具 举报

 楼主| 发表于 2022-10-9 18:42:31 | 显示全部楼层
纵横八方 发表于 2022-9-30 15:33
我帮你写的这个应该很满足你了

感谢,正是我想要的。谢谢你的帮助。
我把这个镜像命令弄成了两个,一个是填的Y,一个是填的N,分别加载的,这样就可以一个命令是删除原对象的,一个是不删除的。
回复

使用道具 举报

发表于 2022-10-12 08:25:30 | 显示全部楼层
loveu515 发表于 2022-10-8 11:36
感谢你的帮助,我运行的T1的时候提示“错误  参数太少”,是不是缺少支持啊

在第一句斜杠后加个空格即可
(defun c:t1(/ obj  p pt n pt1 pt2 ss)

评分

参与人数 1明经币 +1 收起 理由
loveu515 + 1 可以了,你的这个也是我想要的效果,谢啦!.

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-23 14:33 , Processed in 0.158465 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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