(defun c:11(/ dxnamep0 p1 p2 p3)
(if (setq dxname (entsel "\n选择五角星:"))
(progn
(setq p1 (getreal "\n向右距离:"))
(setq p2 (getreal "\n向上距离:"))
(setq p0 (osnap (cadr dxname) "nea"))
(setq p3 (list (+ (car p0) p1) (+ (cadr p0) p2)))
(command "copy" dxname "" p0 p3)
)
)
(princ))
qazxswk 发表于 2024-8-31 16:18
你这句话,我看了很久,明白大概的意思,你意思,是不是选择对象,然后在命令行直接输入:200,500然后 ...
嗯嗯,就是这样的,实现了第一种,就是想着两种方式,第二种就是先点击起点P0,在分别点击P0-P1(表示横向距离)和P0-P2(表示纵向距离),最后移动(复制)到P1和P2的交点(P1,P2) qazxswk 发表于 2024-8-31 16:35
我简化了 统一网名 网友的代码,你看看行不行。
嗯,就是这样,实现了第一种方式👍👍👍👍👍👍👍 (defun c:tt(/ dat dxlx en i lst p0 p1 p2 p3 pt pt1 pt2 ptlst sl ss)
(setq ss(ssget))
(setq i 0 lst nil sl (sslength ss))
(repeat sl
(setq en (ssname ss i));取图元名
(setq dat (entget en))
(setq dxlx (cdr (assoc 0 dat)));获取对象的类型
(if(= dxlx "LWPOLYLINE")(setq coobj en))
(cond
((= dxlx "POINT")
(setq pt (cdr(assoc 10 dat)))
(setq lst (cons pt lst))
);假设是点对象
((= dxlx"LINE")
(setq pt1 (cdr(assoc 10 dat)))
(setq pt2 (cdr(assoc 11 dat)))
(if (not (member pt1 lst))(setq lst (cons pt1 lst)))
(if (not (member pt2 lst))(setq lst (cons pt2 lst)))
);假设是2条直线相交
((= dxlx"DIMENSION")
(setq pt1 (cdr(assoc 13 dat)))
(setq pt2 (cdr(assoc 14 dat)))
(if (not (member pt1 lst))(setq lst (cons pt1 lst)))
(if (not (member pt2 lst))(setq lst (cons pt2 lst)))
);假设是标注
)
(setq i (1+ i))
)
(cond
((= (length lst) 1)
(setq p0 (nth 0 lst))
(setq p1 (getreal "\n向右距离:"))
(setq p2 (getreal "\n向上距离:"))
)
((= (length lst) 3)
(setq
ptlst (vl-sort lst (function (lambda (e1 e2)(< (car e1) (car e2)))))
p2 (nth 0 ptlst) p0 (nth 1 ptlst) p1 (nth 2 ptlst);取得3个点
p1(distance p0 p1);向右距离
p2(distance p0 p2);向上距离
)
)
)
(setq p3 (list(+(car p0)p1)(+(cadr p0)p2)))
(command "copy" coobj "" p0 p3)
(princ)
)
把能想到几种情况都写进去了
1、已有五角星和一个点
2、已有五角星和三个点
3、已有五角星和两条直线
4、已有五角星和2个标注 统一网名 发表于 2024-9-2 15:58
(defun c:tt(/ dat dxlx en i lst p0 p1 p2 p3 pt pt1 pt2 ptlst sl ss)
(setq ss(ssget))
(setq i 0 l ...
优秀优秀👍👍👍👍👍👍,已经解决了,非常感谢
页:
1
[2]