将文本项移动到(偏移量
我一直在编写一个lisp,将文本项移动到(偏移量)保留文本项X值的最近行。灵感:
在电缆图上工作时,文本项(由其他人)放置在离他们应该参考的线路(电缆)太远的地方
方法:
1) 选择文字和行项目
2) 分为两个不同的选择集
3) 求出从直线的Y值到每个文本项的XY坐标的垂直距离,求出最小di
站姿到最近的行,然后将文本项移动到最近行上方/下方1mm
笔记:
a) 无论是assoc 10还是assoc 11都可以完成这些线路——它们都是水平的
b) 如果我把每一行都“拼凑”起来,然后把文本拼凑起来,那就很容易了——但我想做的是enmass操作
下面的代码适用于行上方的选定文本项。但不是下面这些。考虑到这一点,我决定使用lambda表达式中的函数距离重新编写lisp,以保持值为正(因此找到最小距离),当这些问题开始时。。。
请你们中的一个天才(genii?)帮个忙?上图显示的是,下图是预期结果
-西蒙
嗨,西蒙,
请尝试以下程序并让我知道:
(defun c:test(/ sel int obj lst txt srt p pt c l e)
;;====================================================;;
;; Author: Tharwat Al Shoufi. Date: 10.Apr.2016 ;;
;; move single text objects to nearest line with 1.0 ;;
;; unit away on Y Axe. ;;
;;====================================================;;
(if (setq sel (ssget "_:L" '((0 . "LINE,TEXT"))))
(repeat (setq int (sslength sel))
(if (eq "LINE" (cdr (assoc 0 (entget (setq obj (ssname sel (setq int (1- int))))))))
(setq lst (cons obj lst))
(setq txt (cons obj txt))
)
)
)
(if (and lst txt)
(mapcar '(lambda (xt)
(setq l nil
e (entget xt)
p (cdr (assoc 10 e))
)
(mapcar '(lambda (n)
(setq c (vlax-curve-getclosestpointto n p)
l (cons (list (distance c p) c) l)
)
)
lst)
(setq srt (vl-sort l '(lambda (j k) (< (car j) (car k)))))
(if (< (cadr (cadar srt)) (cadr p))
(setq pt (polar (cadar srt) (* pi 0.5) 1.0))
(setq pt (polar (cadar srt) (* pi 1.5) (1+ (cdr (assoc 40 e)))))
)
(entmod (subst (cons 10 pt)
(assoc 10 e)
e))
)
txt
)
)
(princ)
)(vl-load-com)
你好Tharwat先生
这是可行的,行上的文本移到了正确的位置,但行下的文本移到了行上。它们应该向上移动到线的正下方,偏移量为1mm(请看我的第二张(下部)图片,与上部图片进行比较 是的,对不起,我完全忘记了线下的文字
没问题。
以上更新的代码 工作非常出色,非常感谢塔瓦。
我花了几个小时在这上面,你在几分钟内就做到了,真的很令人印象深刻
很好,非常欢迎你。 奇怪的是,Lisp程序在这里不起作用。唯一的区别是我在工作中使用2014年,在家中使用2009年。
lisp不会给出错误消息或崩溃,它会提示选择对象(我会这样做),然后可以看到对象正在工作(由出现的蓝色矩形证明),然后什么都没有,文本保持不变 你可能试图选择多行文字而不是单一文字!
不,它们只是普通的文字项目,不是多行文字 你需要上传一个样本图纸,让我仔细看看。
页:
[1]
2