乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 25|回复: 16

[编程交流] 将文本项移动到(偏移量

[复制链接]

6

主题

25

帖子

19

银币

初来乍到

Rank: 1

铜币
30
发表于 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?)帮个忙?上图显示的是,下图是预期结果
 
 
-西蒙
184911fra0d9ad99nc7c90.jpg
184912k3ctcq6uoc3z6sud.jpg
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 17:54:38 | 显示全部楼层
嗨,西蒙,
 
请尝试以下程序并让我知道:
 
  1. (defun c:test  (/ sel int obj lst txt srt p pt c l e)
  2. ;;====================================================;;
  3. ;; Author: Tharwat Al Shoufi. Date: 10.Apr.2016    ;;
  4. ;; move single text objects to nearest line with 1.0    ;;
  5. ;; unit away on Y Axe.                ;;
  6. ;;====================================================;;
  7. (if (setq sel (ssget "_:L" '((0 . "LINE,TEXT"))))
  8.    (repeat (setq int (sslength sel))
  9.      (if (eq "LINE" (cdr (assoc 0 (entget (setq obj (ssname sel (setq int (1- int))))))))
  10.        (setq lst (cons obj lst))
  11.        (setq txt (cons obj txt))
  12.        )
  13.      )
  14.    )
  15. (if (and lst txt)
  16.    (mapcar '(lambda (xt)
  17.      (setq l nil
  18.            e (entget xt)
  19.            p (cdr (assoc 10 e))
  20.            )
  21.      (mapcar '(lambda (n)
  22.                 (setq c (vlax-curve-getclosestpointto n p)
  23.                       l (cons (list (distance c p) c) l)
  24.                       )
  25.                 )
  26.              lst)
  27.               (setq srt (vl-sort l '(lambda (j k) (< (car j) (car k)))))
  28.               (if (< (cadr (cadar srt)) (cadr p))
  29.                 (setq pt (polar (cadar srt) (* pi 0.5) 1.0))
  30.                 (setq pt (polar (cadar srt) (* pi 1.5) (1+ (cdr (assoc 40 e)))))
  31.                 )
  32.               (entmod (subst (cons 10 pt)
  33.                              (assoc 10 e)
  34.                              e))
  35.               )
  36.            txt
  37.            )
  38.    )
  39. (princ)
  40. )(vl-load-com)
回复

使用道具 举报

6

主题

25

帖子

19

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 17:56:39 | 显示全部楼层
你好Tharwat先生
 
 
这是可行的,行上的文本移到了正确的位置,但行下的文本移到了行上。它们应该向上移动到线的正下方,偏移量为1mm(请看我的第二张(下部)图片,与上部图片进行比较
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:01:38 | 显示全部楼层
是的,对不起,我完全忘记了线下的文字
没问题。
 
以上更新的代码
回复

使用道具 举报

6

主题

25

帖子

19

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 18:04:48 | 显示全部楼层
工作非常出色,非常感谢塔瓦。
 
 
我花了几个小时在这上面,你在几分钟内就做到了,真的很令人印象深刻
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:06:58 | 显示全部楼层
 
很好,非常欢迎你。
回复

使用道具 举报

6

主题

25

帖子

19

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 18:11:46 | 显示全部楼层
奇怪的是,Lisp程序在这里不起作用。唯一的区别是我在工作中使用2014年,在家中使用2009年。
 
 
lisp不会给出错误消息或崩溃,它会提示选择对象(我会这样做),然后可以看到对象正在工作(由出现的蓝色矩形证明),然后什么都没有,文本保持不变
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:16:22 | 显示全部楼层
你可能试图选择多行文字而不是单一文字!
回复

使用道具 举报

6

主题

25

帖子

19

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 18:18:07 | 显示全部楼层
 
不,它们只是普通的文字项目,不是多行文字
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:23:29 | 显示全部楼层
你需要上传一个样本图纸,让我仔细看看。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-12 23:56 , Processed in 0.368857 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表