Simon1976 发表于 2022-7-5 17:49:05

将文本项移动到(偏移量

我一直在编写一个lisp,将文本项移动到(偏移量)保留文本项X值的最近行。
灵感:
在电缆图上工作时,文本项(由其他人)放置在离他们应该参考的线路(电缆)太远的地方
方法:
1) 选择文字和行项目
2) 分为两个不同的选择集
3) 求出从直线的Y值到每个文本项的XY坐标的垂直距离,求出最小di
站姿到最近的行,然后将文本项移动到最近行上方/下方1mm
笔记:
a) 无论是assoc 10还是assoc 11都可以完成这些线路——它们都是水平的
b) 如果我把每一行都“拼凑”起来,然后把文本拼凑起来,那就很容易了——但我想做的是enmass操作
下面的代码适用于行上方的选定文本项。但不是下面这些。考虑到这一点,我决定使用lambda表达式中的函数距离重新编写lisp,以保持值为正(因此找到最小距离),当这些问题开始时。。。
 
 
请你们中的一个天才(genii?)帮个忙?上图显示的是,下图是预期结果
 
 
-西蒙

Tharwat 发表于 2022-7-5 17:54:38

嗨,西蒙,
 
请尝试以下程序并让我知道:
 

(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)

Simon1976 发表于 2022-7-5 17:56:39

你好Tharwat先生
 
 
这是可行的,行上的文本移到了正确的位置,但行下的文本移到了行上。它们应该向上移动到线的正下方,偏移量为1mm(请看我的第二张(下部)图片,与上部图片进行比较

Tharwat 发表于 2022-7-5 18:01:38

是的,对不起,我完全忘记了线下的文字
没问题。
 
以上更新的代码

Simon1976 发表于 2022-7-5 18:04:48

工作非常出色,非常感谢塔瓦。
 
 
我花了几个小时在这上面,你在几分钟内就做到了,真的很令人印象深刻

Tharwat 发表于 2022-7-5 18:06:58

 
很好,非常欢迎你。

Simon1976 发表于 2022-7-5 18:11:46

奇怪的是,Lisp程序在这里不起作用。唯一的区别是我在工作中使用2014年,在家中使用2009年。
 
 
lisp不会给出错误消息或崩溃,它会提示选择对象(我会这样做),然后可以看到对象正在工作(由出现的蓝色矩形证明),然后什么都没有,文本保持不变

Tharwat 发表于 2022-7-5 18:16:22

你可能试图选择多行文字而不是单一文字!

Simon1976 发表于 2022-7-5 18:18:07

 
不,它们只是普通的文字项目,不是多行文字

Tharwat 发表于 2022-7-5 18:23:29

你需要上传一个样本图纸,让我仔细看看。
页: [1] 2
查看完整版本: 将文本项移动到(偏移量