乐筑天下

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

[编程交流] 标题栏中属性的文本

[复制链接]

7

主题

15

帖子

7

银币

初来乍到

Rank: 1

铜币
37
发表于 2022-7-5 16:27:02 | 显示全部楼层 |阅读模式
大家好,
 
我有几十个图形,其中有人使用文本,而不是将其添加到标题栏的属性值中。
 
文本位于属性的位置上方。我需要一种方法将文本推送到属性值。其中一些标题栏具有相当多的属性,因此复制/粘贴文本值非常繁琐。
 
我几乎可以肯定的是,我过去对此有Lisp程序的毛病,但我找不到。
 
任何帮助都将不胜感激。
 
干杯
 
法学博士
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 16:33:54 | 显示全部楼层
快速书写:
  1. (defun c:attfix ( / blk ent enx idx lst sel )
  2.    (if (and (setq sel (LM:ssget "\nSelect text containing attribute values: " '("_:L" ((0 . "TEXT,MTEXT")))))
  3.             (setq blk (LM:ssget "\nSelect block to be populated: " '("_+.:E:S:L" ((0 . "INSERT") (66 . 1)))))
  4.        )
  5.        (progn
  6.            (repeat (setq idx (sslength sel))
  7.                (setq enx (entget (ssname sel (setq idx (1- idx))))
  8.                      lst (cons (cons (cdr (assoc 10 enx)) (cdr (assoc 1 enx))) lst)
  9.                )
  10.            )
  11.            (setq ent (entnext (ssname blk 0))
  12.                  enx (entget ent)
  13.            )
  14.            (while (= "ATTRIB" (cdr (assoc 0 enx)))
  15.                (entmod (subst (cons 1 (nearesttext (cdr (assoc 10 enx)) lst)) (assoc 1 enx) enx))
  16.                (setq ent (entnext ent)
  17.                      enx (entget  ent)
  18.                )
  19.            )
  20.        )
  21.    )
  22.    (princ)
  23. )
  24. (defun nearesttext ( pnt lst / dis rtn tmp )
  25.    (setq rtn (cdar lst)
  26.          dis (distance pnt (caar lst))
  27.    )
  28.    (foreach itm (cdr lst)
  29.        (if (< (setq tmp (distance pnt (car itm))) dis)
  30.            (setq rtn (cdr itm)
  31.                  dis tmp
  32.            )
  33.        )
  34.    )
  35.    rtn
  36. )
  37. ;; ssget  -  Lee Mac
  38. ;; A wrapper for the ssget function to permit the use of a custom selection prompt
  39. ;; msg - [str] selection prompt
  40. ;; arg - [lst] list of ssget arguments
  41. (defun LM:ssget ( msg arg / sel )
  42.    (princ msg)
  43.    (setvar 'nomutt 1)
  44.    (setq sel (vl-catch-all-apply 'ssget arg))
  45.    (setvar 'nomutt 0)
  46.    (if (not (vl-catch-all-error-p sel)) sel)
  47. )
  48. (princ)

 
原文不会被删除(以防万一!);不考虑没有相应文本项的属性。
回复

使用道具 举报

7

主题

15

帖子

7

银币

初来乍到

Rank: 1

铜币
37
发表于 2022-7-5 16:43:19 | 显示全部楼层
 
 
李非常感谢你的帮助!它适用于大多数属性,但在某些属性上似乎有些奇怪。左边是文本,右边是标题栏,绿色文本仍显示不匹配。
 
 
 
172708fcjqu8up883ip3s3.jpg
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 16:52:39 | 显示全部楼层
谢谢Rlx
 
请尝试以下操作:
  1. (defun c:attfix ( / blk ent enx idx lst sel )
  2.    (if (and (setq sel (LM:ssget "\nSelect text containing attribute values: " '("_:L" ((0 . "TEXT,MTEXT")))))
  3.             (setq blk (LM:ssget "\nSelect block to be populated: " '("_+.:E:S:L" ((0 . "INSERT") (66 . 1)))))
  4.        )
  5.        (progn
  6.            (repeat (setq idx (sslength sel))
  7.                (setq enx (entget (ssname sel (setq idx (1- idx))))
  8.                      lst (cons (cons (textboxcen enx) (cdr (assoc 1 enx))) lst)
  9.                )
  10.            )
  11.            (setq ent (entnext (ssname blk 0))
  12.                  enx (entget ent)
  13.            )
  14.            (while (= "ATTRIB" (cdr (assoc 0 enx)))
  15.                (entmod (subst (cons 1 (nearesttext (textboxcen enx) lst)) (assoc 1 enx) enx))
  16.                (setq ent (entnext ent)
  17.                      enx (entget  ent)
  18.                )
  19.            )
  20.        )
  21.    )
  22.    (princ)
  23. )
  24. (defun textboxcen ( enx )
  25.    (mapcar '/ (apply 'mapcar (cons '+ (text-box enx))) '(4.0 4.0 4.0))
  26. )
  27. (defun nearesttext ( pnt lst / dis rtn tmp )
  28.    (setq rtn (cdar lst)
  29.          dis (distance pnt (caar lst))
  30.    )
  31.    (foreach itm (cdr lst)
  32.        (if (< (setq tmp (distance pnt (car itm))) dis)
  33.            (setq rtn (cdr itm)
  34.                  dis tmp
  35.            )
  36.        )
  37.    )
  38.    rtn
  39. )
  40. ;; The following function is based on code by gile
  41. (defun text-box ( enx / bpt hgt jus lst ocs org rot wid )
  42.    (cond
  43.        (   (wcmatch  (cdr (assoc 00 enx)) "ATTRIB,TEXT")
  44.            (setq bpt (cdr (assoc 10 enx))
  45.                  rot (cdr (assoc 50 enx))
  46.                  lst (textbox enx)
  47.                  lst (list (car lst) (list (caadr lst) (cadar lst)) (cadr lst) (list (caar lst) (cadadr lst)))
  48.            )
  49.        )
  50.        (   (= "MTEXT" (cdr (assoc 00 enx)))
  51.            (setq ocs  (cdr (assoc 210 enx))
  52.                  bpt  (trans (cdr (assoc 10 enx)) 0 ocs)
  53.                  rot  (angle '(0.0 0.0) (trans (cdr (assoc 11 enx)) 0 ocs))
  54.                  wid  (cdr (assoc 42 enx))
  55.                  hgt  (cdr (assoc 43 enx))
  56.                  jus  (cdr (assoc 71 enx))
  57.                  org  (list (cond ((member jus '(2 5 ) (/ wid -2.0)) ((member jus '(3 6 9)) (- wid))      (0.0))
  58.                             (cond ((member jus '(1 2 3)) (- hgt))      ((member jus '(4 5 6)) (/ hgt -2.0)) (0.0))
  59.                       )
  60.                  lst  (list org (mapcar '+ org (list wid 0)) (mapcar '+ org (list wid hgt)) (mapcar '+ org (list 0 hgt)))
  61.            )
  62.        )
  63.    )
  64.    (if lst
  65.        (   (lambda ( m ) (mapcar '(lambda ( p ) (mapcar '+ (mxv m p) bpt)) lst))
  66.            (list
  67.                (list (cos rot) (sin (- rot)) 0.0)
  68.                (list (sin rot) (cos rot)     0.0)
  69.               '(0.0 0.0 1.0)
  70.            )
  71.        )
  72.    )
  73. )
  74. ;; Matrix x Vector  -  Vladimir Nesterovsky
  75. ;; Args: m - nxn matrix, v - vector in R^n
  76. (defun mxv ( m v )
  77.    (mapcar '(lambda ( r ) (apply '+ (mapcar '* r v))) m)
  78. )
  79. ;; ssget  -  Lee Mac
  80. ;; A wrapper for the ssget function to permit the use of a custom selection prompt
  81. ;; msg - [str] selection prompt
  82. ;; arg - [lst] list of ssget arguments
  83. (defun LM:ssget ( msg arg / sel )
  84.    (princ msg)
  85.    (setvar 'nomutt 1)
  86.    (setq sel (vl-catch-all-apply 'ssget arg))
  87.    (setvar 'nomutt 0)
  88.    (if (not (vl-catch-all-error-p sel)) sel)
  89. )
  90. (princ)
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 17:02:43 | 显示全部楼层
 
 
太棒了我希望15年前有这样一个用户,他不仅使用文本,有时甚至会分解标题栏,并使用attdef的文本。到目前为止,他的大部分小手艺都已修复,但我们有很多图纸,所以谁知道呢,也许其中一些可能仍然存在;-)
 
 
gr.Rlx
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:03:46 | 显示全部楼层
 
我不知道更糟糕的是什么,标题栏爆炸还是维度爆炸…:大声笑:
回复

使用道具 举报

51

主题

481

帖子

457

银币

后起之秀

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

铜币
262
发表于 2022-7-5 17:14:50 | 显示全部楼层
 
据我所知
-新用户不知道什么是attributeblock(是的,他不知道什么是attribute)和/或想要通过更改维度值进行欺骗
-客户要求CAD文件,而顾问不想发布CAD文件,尤其是他花费时间和金钱创建的典型细节。
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:19:51 | 显示全部楼层
@李:你为什么不用边界框来确定文本的中心呢?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:22:11 | 显示全部楼层
 
ActiveX boundingbox方法对于旋转文本、位于与WCS平面不平行的平面中的文本不会返回理想的结果,对于多行文字,boundingbox方法将扩展到多行文字窗口,而不是文本内容的边缘。
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:29:23 | 显示全部楼层
我理解你对多行文字的看法,但对于普通文本,因为边界框是围绕文本框计算的,文本的中心和边界框的中心始终是同一点。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-8-20 18:03 , Processed in 1.130497 second(s), 75 queries .

© 2020-2025 乐筑天下

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