- 积分
- 8662
- 明经币
- 个
- 注册时间
- 2018-7-10
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 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
)
|
|