乐筑天下

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

[编程交流] Lisp插入多行文字(带字段)

[复制链接]

17

主题

127

帖子

110

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
85
发表于 2022-7-6 10:21:03 | 显示全部楼层 |阅读模式
我有一个程序,插入一个包含两个字段的多行文字字符串,除了字符串中的文字显示为字段代码而不是字段获得的结果之外,该程序工作得很好。但是,如果我在插入多行文字后双击它,文字将更改为它应该显示的内容。请参见下面的屏幕截图。我没有双击右边的文本,所以它显示了代码。
 
除了双击文本外,还有什么方法可以使文本按应有的方式显示吗?
 
朗尼
 
112104b13ft1fezwhbq0eg.jpg
 
插入SV。lsp
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:25:24 | 显示全部楼层
嗨,朗尼,
 
输入字段相当困难,因为您还必须输入文本、多行文字或属性的扩展字典,然后输入其中存储的ACAD_字段字典和其中存储的文本字典。。。
 
因此,解决方法是使用vla AddMText创建多行文字字段。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:30:39 | 显示全部楼层
作为对代码的粗略修改;
 
  1. (defun c:isv (/ pt1 pt1x pt1y zoneNUM zoneLTR mtstr) (vl-load-com)
  2. (and
  3.    (progn
  4.     (setq pt1 (getpoint "\nSpecify insertion point: "))
  5.     (setq pt1x (car pt1))
  6.     (setq pt1y (cadr pt1))
  7.     (cond
  8.       ((<= pt1x 5)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone8>%")))
  9.       ((and (<= pt1x 10)(> pt1x 5)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone7>%"))))
  10.       ((and (<= pt1x 15)(> pt1x 10)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone6>%"))))
  11.       ((and (<= pt1x 20)(> pt1x 15)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone5>%"))))
  12.       ((and (<= pt1x 25)(> pt1x 20)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone4>%"))))
  13.       ((and (<= pt1x 30)(> pt1x 25)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone3>%"))))
  14.       ((and (<= pt1x 35)(> pt1x 30)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone2>%"))))
  15.       ((> pt1x 35)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone1>%")))
  16.       )
  17.     (cond
  18.       ((<= pt1y 4.68)(setq zoneLTR "%<\\AcVar CustomDP.zonea>%"))
  19.       ((and (<= pt1y  9.34)(> pt1y  4.68)(setq zoneLTR "%<\\AcVar CustomDP.zoneb>%")))
  20.       ((and (<= pt1y 14.00)(> pt1y  9.34)(setq zoneLTR "%<\\AcVar CustomDP.zonec>%")))
  21.       ((and (<= pt1y 18.66)(> pt1y 14.00)(setq zoneLTR "%<\\AcVar CustomDP.zoned>%")))
  22.       ((and (<= pt1y 23.32)(> pt1y 18.66)(setq zoneLTR "%<\\AcVar CustomDP.zonee>%")))
  23.       ((> pt1y 23.32)(setq zoneLTR "%<\\AcVar CustomDP.zonef>%"))
  24.       )
  25.     (setq mtstr (strcat zoneNUM "-" zoneLTR))
  26.    )
  27.    (progn
  28.      (setq mobj
  29.        (vla-AddMText
  30.          (vlax-get
  31.            (vla-get-ActiveDocument
  32.              (vlax-get-acad-object)
  33.            )
  34.            (if (= 1 (getvar 'CVPORT)) 'Paperspace 'Modelspace)
  35.          )
  36.          (vlax-3D-point (trans pt1 1 0)) 0 mtstr
  37.        )
  38.      )
  39.      (vla-put-layer mobj "TEXT")
  40.      (vla-put-height mobj 0.188)
  41.      (vla-put-stylename mobj "romans")
  42.      (vla-put-attachmentpoint mobj acAttachmentpointmiddlecenter)
  43.    )
  44. )
  45. )
回复

使用道具 举报

17

主题

127

帖子

110

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
85
发表于 2022-7-6 10:31:58 | 显示全部楼层
 
哦,我明白了。虽然我在我的程序中使用了越来越多的VL命令,但我仍在研究新的命令,因此感谢您的建议。我将试用你的代码,稍后发布结果。再次感谢。
 
朗尼
回复

使用道具 举报

17

主题

127

帖子

110

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
85
发表于 2022-7-6 10:35:22 | 显示全部楼层
好的,李,我已经完全改变了齿轮,我希望你的Lisp程序超级能力可以修复我的Lisp程序。
 
在编写多行文字插入例程的同时,我还编写了一个非常类似的例程,用于插入具有属性的块。最近在黑板上有很多关于块属性编辑/提取/替换的讨论,所以我想我应该试着用这种方式来组合一些东西。
 
我想出的惯例本应有效。在用户定义的点插入块,并根据块在图形上的位置,使用适当的字段填充块的“1”(也是唯一)属性。然而,如果该块被移动到另一个位置,那么字段不会更新,因此我必须想出另一个例程来更新所有块。这就是我被困的地方。这是我的代码:
 
  1. (defun c:bu(/ Att1Tag ss_blocks NumBlocks Count Ename Attname
  2.       Att_Data Att_txt  pt1  pt1x pt1y mtstr
  3.       NewStr New_Attdata)
  4. (setq Att1Tag "SV")
  5. (setq ss_blocks (ssget "_X" '((0 . "INSERT")(2 . "SECT_VIEW"))))
  6. (setq NumBlocks (sslength ss_blocks))
  7. (setq Count 0)
  8. (repeat NumBlocks
  9.    (setq Ename (ssname ss_blocks Count))
  10.    (setq Attname Ename)
  11.    (while (= "ATTRIB" (dxf 0 (setq Attname (entnext Attname))))
  12.      (if (= Att1Tag (dxf 2 Attname))
  13.     (progn
  14.   (setq Att_Data (entget Attname))
  15.   (setq Att_txt (cdr (assoc 1 Att_Data)))
  16.   (setq pt1 (assoc 10 Att_Data))
  17.   (setq pt1x (cadr pt))
  18.   (setq pt1y (caddr pt))
  19.   (cond
  20.     ((<= pt1x 5)(setq zoneNUM (strcat "%<[url="file://\\AcVar"]\\AcVar[/url] CustomDP.zone8>%")))
  21.     ((and (<= pt1x 10)(> pt1x 5)(setq zoneNUM (strcat "%<[url="file://\\AcVar"]\\AcVar[/url] CustomDP.zone7>%"))))
  22.     ((and (<= pt1x 15)(> pt1x 10)(setq zoneNUM (strcat "%<[url="file://\\AcVar"]\\AcVar[/url] CustomDP.zone6>%"))))
  23.     ((and (<= pt1x 20)(> pt1x 15)(setq zoneNUM (strcat "%<[url="file://\\AcVar"]\\AcVar[/url] CustomDP.zone5>%"))))
  24.     ((and (<= pt1x 25)(> pt1x 20)(setq zoneNUM (strcat "%<[url="file://\\AcVar"]\\AcVar[/url] CustomDP.zone4>%"))))
  25.     ((and (<= pt1x 30)(> pt1x 25)(setq zoneNUM (strcat "%<[url="file://\\AcVar"]\\AcVar[/url] CustomDP.zone3>%"))))
  26.     ((and (<= pt1x 35)(> pt1x 30)(setq zoneNUM (strcat "%<[url="file://\\AcVar"]\\AcVar[/url] CustomDP.zone2>%"))))
  27.     ((> pt1x 35)(setq zoneNUM (strcat "%<[url="file://\\AcVar"]\\AcVar[/url] CustomDP.zone1>%")))
  28.     )
  29.   (cond
  30.     ((<= pt1y 4.68)(setq zoneLTR "%<[url="file://\\AcVar"]\\AcVar[/url] CustomDP.zonea>%"))
  31.     ((and (<= pt1y  9.34)(> pt1y  4.68)(setq zoneLTR "%<[url="file://\\AcVar"]\\AcVar[/url] CustomDP.zoneb>%")))
  32.     ((and (<= pt1y 14.00)(> pt1y  9.34)(setq zoneLTR "%<[url="file://\\AcVar"]\\AcVar[/url] CustomDP.zonec>%")))
  33.     ((and (<= pt1y 18.66)(> pt1y 14.00)(setq zoneLTR "%<[url="file://\\AcVar"]\\AcVar[/url] CustomDP.zoned>%")))
  34.     ((and (<= pt1y 23.32)(> pt1y 18.66)(setq zoneLTR "%<[url="file://\\AcVar"]\\AcVar[/url] CustomDP.zonee>%")))
  35.     ((> pt1y 23.32)(setq zoneLTR "%<[url="file://\\AcVar"]\\AcVar[/url] CustomDP.zonef>%"))
  36.     )
  37.   (setq mtstr (strcat zoneNUM "-" zoneLTR))
  38.   (setq NewStr mtstr)
  39.   (setq New_Attdata (subst (cons 1 NewStr)(assoc 1 Att_data) Att_Data))
  40.   (entmod New_Attdata)
  41.   (entupd (cdr (assoc 330 Att_Data)))
  42.   ); progn
  43. ); if
  44.      ); while
  45.    (setq Count (1+ Count))
  46.    ); repeat
  47. (redraw att1 1)
  48. (princ)
  49. )
  50. (defun dxf (code e)
  51. (cdr (assoc code (entget e)))
  52. )

 
 
所有名为“SECT_VIEW”的块都有标记“SV”,它们都通过该例程更新,但仅更新到最后一个计算的块计算的值。我的意思是,每个块应该根据它们在图形上的位置具有不同的值,但它们都具有与选择集的最后一个块相关的值(我相信)。
 
我哪里做错了?
 
朗尼
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:41:04 | 显示全部楼层
嗨,朗尼,
 
同样,除非为字段创建字典对象,否则必须使用VL来解决问题。
 
也许是这样?
 
当然,完全没有经过测试。
回复

使用道具 举报

17

主题

127

帖子

110

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
85
发表于 2022-7-6 10:42:30 | 显示全部楼层
李,
 
我收到以下错误:
 
**错误:错误的参数类型:VLA-OBJECT“SV”**
 
我试着查看你的代码来了解发生了什么,但我就像一个在外国的游客,只有高中的课程作为我理解语言的基础
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:48:20 | 显示全部楼层
我的错-这就是我写得太快的原因lol。
 
代码已更新
回复

使用道具 举报

17

主题

127

帖子

110

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
85
发表于 2022-7-6 10:52:40 | 显示全部楼层
你改变了什么?我一直在看它,我试图找出它的来龙去脉,但我一无所获。。。。
 
顺便说一句,非常感谢。它工作得很好!
 
朗尼
回复

使用道具 举报

17

主题

127

帖子

110

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
85
发表于 2022-7-6 10:54:40 | 显示全部楼层
哦,我修改了你的一行代码,以更好地反映你有多棒:
 
  1. ;; © Lee "The Superman of LISP" Mac 2010

 
 
 
朗尼
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-6 21:17 , Processed in 1.706184 second(s), 75 queries .

© 2020-2025 乐筑天下

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