Lisp插入多行文字(带字段)
我有一个程序,插入一个包含两个字段的多行文字字符串,除了字符串中的文字显示为字段代码而不是字段获得的结果之外,该程序工作得很好。但是,如果我在插入多行文字后双击它,文字将更改为它应该显示的内容。请参见下面的屏幕截图。我没有双击右边的文本,所以它显示了代码。除了双击文本外,还有什么方法可以使文本按应有的方式显示吗?
朗尼
插入SV。lsp 嗨,朗尼,
输入字段相当困难,因为您还必须输入文本、多行文字或属性的扩展字典,然后输入其中存储的ACAD_字段字典和其中存储的文本字典。。。
因此,解决方法是使用vla AddMText创建多行文字字段。 作为对代码的粗略修改;
(defun c:isv (/ pt1 pt1x pt1y zoneNUM zoneLTR mtstr) (vl-load-com)
(and
(progn
(setq pt1 (getpoint "\nSpecify insertion point: "))
(setq pt1x (car pt1))
(setq pt1y (cadr pt1))
(cond
((<= pt1x 5)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone8>%")))
((and (<= pt1x 10)(> pt1x 5)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone7>%"))))
((and (<= pt1x 15)(> pt1x 10)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone6>%"))))
((and (<= pt1x 20)(> pt1x 15)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone5>%"))))
((and (<= pt1x 25)(> pt1x 20)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone4>%"))))
((and (<= pt1x 30)(> pt1x 25)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone3>%"))))
((and (<= pt1x 35)(> pt1x 30)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone2>%"))))
((> pt1x 35)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone1>%")))
)
(cond
((<= pt1y 4.68)(setq zoneLTR "%<\\AcVar CustomDP.zonea>%"))
((and (<= pt1y9.34)(> pt1y4.68)(setq zoneLTR "%<\\AcVar CustomDP.zoneb>%")))
((and (<= pt1y 14.00)(> pt1y9.34)(setq zoneLTR "%<\\AcVar CustomDP.zonec>%")))
((and (<= pt1y 18.66)(> pt1y 14.00)(setq zoneLTR "%<\\AcVar CustomDP.zoned>%")))
((and (<= pt1y 23.32)(> pt1y 18.66)(setq zoneLTR "%<\\AcVar CustomDP.zonee>%")))
((> pt1y 23.32)(setq zoneLTR "%<\\AcVar CustomDP.zonef>%"))
)
(setq mtstr (strcat zoneNUM "-" zoneLTR))
)
(progn
(setq mobj
(vla-AddMText
(vlax-get
(vla-get-ActiveDocument
(vlax-get-acad-object)
)
(if (= 1 (getvar 'CVPORT)) 'Paperspace 'Modelspace)
)
(vlax-3D-point (trans pt1 1 0)) 0 mtstr
)
)
(vla-put-layer mobj "TEXT")
(vla-put-height mobj 0.188)
(vla-put-stylename mobj "romans")
(vla-put-attachmentpoint mobj acAttachmentpointmiddlecenter)
)
)
)
哦,我明白了。虽然我在我的程序中使用了越来越多的VL命令,但我仍在研究新的命令,因此感谢您的建议。我将试用你的代码,稍后发布结果。再次感谢。
朗尼 好的,李,我已经完全改变了齿轮,我希望你的Lisp程序超级能力可以修复我的Lisp程序。
在编写多行文字插入例程的同时,我还编写了一个非常类似的例程,用于插入具有属性的块。最近在黑板上有很多关于块属性编辑/提取/替换的讨论,所以我想我应该试着用这种方式来组合一些东西。
我想出的惯例本应有效。在用户定义的点插入块,并根据块在图形上的位置,使用适当的字段填充块的“1”(也是唯一)属性。然而,如果该块被移动到另一个位置,那么字段不会更新,因此我必须想出另一个例程来更新所有块。这就是我被困的地方。这是我的代码:
(defun c:bu(/ Att1Tag ss_blocks NumBlocks Count Ename Attname
Att_Data Att_txtpt1pt1x pt1y mtstr
NewStr New_Attdata)
(setq Att1Tag "SV")
(setq ss_blocks (ssget "_X" '((0 . "INSERT")(2 . "SECT_VIEW"))))
(setq NumBlocks (sslength ss_blocks))
(setq Count 0)
(repeat NumBlocks
(setq Ename (ssname ss_blocks Count))
(setq Attname Ename)
(while (= "ATTRIB" (dxf 0 (setq Attname (entnext Attname))))
(if (= Att1Tag (dxf 2 Attname))
(progn
(setq Att_Data (entget Attname))
(setq Att_txt (cdr (assoc 1 Att_Data)))
(setq pt1 (assoc 10 Att_Data))
(setq pt1x (cadr pt))
(setq pt1y (caddr pt))
(cond
((<= pt1x 5)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone8>%")))
((and (<= pt1x 10)(> pt1x 5)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone7>%"))))
((and (<= pt1x 15)(> pt1x 10)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone6>%"))))
((and (<= pt1x 20)(> pt1x 15)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone5>%"))))
((and (<= pt1x 25)(> pt1x 20)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone4>%"))))
((and (<= pt1x 30)(> pt1x 25)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone3>%"))))
((and (<= pt1x 35)(> pt1x 30)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone2>%"))))
((> pt1x 35)(setq zoneNUM (strcat "%<\\AcVar CustomDP.zone1>%")))
)
(cond
((<= pt1y 4.68)(setq zoneLTR "%<\\AcVar CustomDP.zonea>%"))
((and (<= pt1y9.34)(> pt1y4.68)(setq zoneLTR "%<\\AcVar CustomDP.zoneb>%")))
((and (<= pt1y 14.00)(> pt1y9.34)(setq zoneLTR "%<\\AcVar CustomDP.zonec>%")))
((and (<= pt1y 18.66)(> pt1y 14.00)(setq zoneLTR "%<\\AcVar CustomDP.zoned>%")))
((and (<= pt1y 23.32)(> pt1y 18.66)(setq zoneLTR "%<\\AcVar CustomDP.zonee>%")))
((> pt1y 23.32)(setq zoneLTR "%<\\AcVar CustomDP.zonef>%"))
)
(setq mtstr (strcat zoneNUM "-" zoneLTR))
(setq NewStr mtstr)
(setq New_Attdata (subst (cons 1 NewStr)(assoc 1 Att_data) Att_Data))
(entmod New_Attdata)
(entupd (cdr (assoc 330 Att_Data)))
); progn
); if
); while
(setq Count (1+ Count))
); repeat
(redraw att1 1)
(princ)
)
(defun dxf (code e)
(cdr (assoc code (entget e)))
)
所有名为“SECT_VIEW”的块都有标记“SV”,它们都通过该例程更新,但仅更新到最后一个计算的块计算的值。我的意思是,每个块应该根据它们在图形上的位置具有不同的值,但它们都具有与选择集的最后一个块相关的值(我相信)。
我哪里做错了?
朗尼 嗨,朗尼,
同样,除非为字段创建字典对象,否则必须使用VL来解决问题。
也许是这样?
当然,完全没有经过测试。 李,
我收到以下错误:
**错误:错误的参数类型:VLA-OBJECT“SV”**
我试着查看你的代码来了解发生了什么,但我就像一个在外国的游客,只有高中的课程作为我理解语言的基础 我的错-这就是我写得太快的原因lol。
代码已更新 你改变了什么?我一直在看它,我试图找出它的来龙去脉,但我一无所获。。。。
顺便说一句,非常感谢。它工作得很好!
朗尼 哦,我修改了你的一行代码,以更好地反映你有多棒:
;; © Lee "The Superman of LISP" Mac 2010
朗尼
页:
[1]
2