lfe011969 发表于 2022-7-6 10:21:03

Lisp插入多行文字(带字段)

我有一个程序,插入一个包含两个字段的多行文字字符串,除了字符串中的文字显示为字段代码而不是字段获得的结果之外,该程序工作得很好。但是,如果我在插入多行文字后双击它,文字将更改为它应该显示的内容。请参见下面的屏幕截图。我没有双击右边的文本,所以它显示了代码。
 
除了双击文本外,还有什么方法可以使文本按应有的方式显示吗?
 
朗尼
 

 
插入SV。lsp

Lee Mac 发表于 2022-7-6 10:25:24

嗨,朗尼,
 
输入字段相当困难,因为您还必须输入文本、多行文字或属性的扩展字典,然后输入其中存储的ACAD_字段字典和其中存储的文本字典。。。
 
因此,解决方法是使用vla AddMText创建多行文字字段。

Lee Mac 发表于 2022-7-6 10:30:39

作为对代码的粗略修改;
 

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

lfe011969 发表于 2022-7-6 10:31:58

 
哦,我明白了。虽然我在我的程序中使用了越来越多的VL命令,但我仍在研究新的命令,因此感谢您的建议。我将试用你的代码,稍后发布结果。再次感谢。
 
朗尼

lfe011969 发表于 2022-7-6 10:35:22

好的,李,我已经完全改变了齿轮,我希望你的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”,它们都通过该例程更新,但仅更新到最后一个计算的块计算的值。我的意思是,每个块应该根据它们在图形上的位置具有不同的值,但它们都具有与选择集的最后一个块相关的值(我相信)。
 
我哪里做错了?
 
朗尼

Lee Mac 发表于 2022-7-6 10:41:04

嗨,朗尼,
 
同样,除非为字段创建字典对象,否则必须使用VL来解决问题。
 
也许是这样?
 
当然,完全没有经过测试。

lfe011969 发表于 2022-7-6 10:42:30

李,
 
我收到以下错误:
 
**错误:错误的参数类型:VLA-OBJECT“SV”**
 
我试着查看你的代码来了解发生了什么,但我就像一个在外国的游客,只有高中的课程作为我理解语言的基础

Lee Mac 发表于 2022-7-6 10:48:20

我的错-这就是我写得太快的原因lol。
 
代码已更新

lfe011969 发表于 2022-7-6 10:52:40

你改变了什么?我一直在看它,我试图找出它的来龙去脉,但我一无所获。。。。
 
顺便说一句,非常感谢。它工作得很好!
 
朗尼

lfe011969 发表于 2022-7-6 10:54:40

哦,我修改了你的一行代码,以更好地反映你有多棒:
 
;; © Lee "The Superman of LISP" Mac 2010
 
 
 
朗尼
页: [1] 2
查看完整版本: Lisp插入多行文字(带字段)