cl082000 发表于 2022-7-6 12:53:54

AutoLISP中的多行文字

我想要一个代码,可以将计算结果输出到多行文字中。看起来并不难,但我似乎完成不了。这是我到目前为止得到的。
 

(defun c:davitcal (DAV)
(setq Z (getreal "Enter pipe section modulus:" ))
(setq W (getreal "Enter est. dead weight (FLG. + parts):" ))
(setq L (getreal "Enter length of moment arm:" ))
(setq S (getreal "Enter stress value for davit arm:" ))
(setq a (getreal "Enter mtext corner:" ))
(command "mtext" 0 a Z W L S)

 
它会吐出来,但不会关闭多行文字,我该怎么解决?
 
此外,如果可能的话,我希望多行文字以其最终形式阅读
 
Z=(无论setq Z数是多少)
W=(无论setq W数是多少)
L=(无论setq L数是多少)
S=(无论setq S数是多少)即:
 
Z=12.22
W=3800
L=45.3869
S=17100
 
到目前为止,它只是吐出数字
 
如果我屠宰了什么,我很抱歉。这对我来说是全新的。谢谢你的时间和努力。非常感谢您的回复。

Lee Mac 发表于 2022-7-6 12:59:07

没有被屠杀太多——只是被误导了
 
说到创建文本,我不会使用命令方法,而是选择使用entmake创建文本,甚至使用vla addMText创建文本。
 
如果您需要这些方法中的任何一种的进一步建议,请告诉我。
 

cl082000 发表于 2022-7-6 13:02:35

李非常感谢你的帮助,也感谢你没有把我的头扯下来
 
是的,我希望在任何一个方面都能得到一些帮助,这是最容易编码的。
 
在你回复之前,我会尽量使用这两种方法。谢谢你的帮助。

cl082000 发表于 2022-7-6 13:07:58

使用你建议的那些命令一点运气都没有帮助我

Lee Mac 发表于 2022-7-6 13:12:06

没问题-很乐意帮忙
 
好的,我再解释一下。我偏离命令调用方法的原因是,它们不仅会受到绘图设置(即OSNAP等)的影响,而且它们的提示(尤其是对于text/attdef/mtext命令)有时可能不一致,导致程序崩溃一半时间。此外,imo最好不要使用它们
 
此外,不要忘记,这些方法比任何命令调用都快10倍。
 
好的,那么备选方案。。。
 
entmake可能是您最容易遵循的方法,因为它不需要任何Visual LISP知识,您可以使用DXF参考来帮助您。
 
您需要为entmake函数提供一个点对列表,以及足够的信息来创建实体。
 
为了给你一个我所说的“点对”的例子,运行这个并点击一些现有的多行文字:
 
您将看到一个点对列表,其中包含有关多行文字对象的所有信息。通过查看此处,您可以看到列表中的每个项目所指的内容。
 
因此,要使用此方法创建多行文字,您需要构建一个虚线对列表。大多数信息都是标准的,不会随着对象的变化而变化,但您可以更改插入点、文本高度、内容等。
 
例如:
 
通过查看上面链接中提供的参考,可以看到每个代码的用途。
 
正如我所说,您必须为要创建的实体提供最低数量的信息,但您可以提供更多信息,这取决于您希望偏离默认值的程度。
 
至于vla-addMtext方法,除非你想使用这个方法,否则我不会深入讨论,因为它需要更多的类型,并且需要更多的视觉LISP结构的背景知识。
 
希望这能有所帮助,但如果你仍然被困,就大声喊,我会解释更多。
 
干杯
 

Lee Mac 发表于 2022-7-6 13:13:37

 
放松点。。。a请不要错过眨眼:

cl082000 发表于 2022-7-6 13:17:25

请漂亮,请!!!!!!!也谢谢你
所以我理解成对的点。
如何将在例程开始时设置的setq变量数值输入多行文字?

Lee Mac 发表于 2022-7-6 13:21:32

 
对不起,我只是觉得你上次的回答很直截了当。
 
好的,按照你想要的方式构建多行文字,可能是这样的:
 


(defun c:davitcal(/ z w l s a)
(setq Z (getreal "Enter pipe section modulus:"))
(setq W (getreal "Enter est. dead weight (FLG. + parts):"))
(setq L (getreal "Enter length of moment arm:"))
(setq S (getreal "Enter stress value for davit arm:"))
(setq a (getreal "Enter mtext corner:"))

(entmake
   (list
   (cons 0 "MTEXT")         ;; Entity Name
   (cons 100 "AcDbEntity")    ;; Subclass Marker
   (cons 410 "Model")         ;; Space
   (cons 8 "0")               ;; Layer
   (cons 100 "AcDbMText")   ;; Subclass Marker
   (cons 10 '(0 0 0))         ;; Insertion Point
   (cons 40 2.5)            ;; Text Height
   (cons 71 1)                ;; Attachment Point (top-left)
   (cons 1 (rtos Z))          ;; Text Content
   (cons 7 "Verdana")))       ;; Text Style

(princ))

Lee Mac 发表于 2022-7-6 13:25:59

不,DAV意味着函数需要在调用时提供一个参数。
 
键盘语法是以下字符串(defun c:。。。
 
请仔细阅读以下内容:
http://www.afralisp.net/lispa/lisp5.htm

cl082000 发表于 2022-7-6 13:30:11

谢谢你的阅读。帮我多了解一点。
 
运行以下代码:
 

(defun c:davitcal (/ z w l s)
(setq Z (getreal "Enter pipe section modulus:"))
(setq W (getreal "Enter est. dead weight (FLG. + parts):"))
(setq L (getreal "Enter length of moment arm:"))
(setq S (getreal "Enter stress value for davit arm:"))

   (entmake
   (list
   (cons 0 "MTEXT") ;; Entity Name
   (cons 100 "AcDbEntity") ;; Subclass Marker
   (cons 410 "Model") ;; Space
   (cons 8 "0") ;; Layer
   (cons 100 "AcDbMText") ;; Subclass Marker
   (cons 10 '(5.0 3.0 0)) ;; Insertion Point
   (cons 40 0.1) ;; Text Height
   (cons 71 5) ;; Attachment Point (Mid-Cent)
   (cons 1 "Z=(rtos Z)IN\\PW=(rtos W)#\\PL=(rtos L)IN\\PS=(rtos S)PSI") ;; Text Content
   (cons 7 "STANDARD"))) ;; Text Style


(princ))

 
请注意,当文本形成时(你真是太棒了,我的朋友让我走了这么远),它的格式正是我想要的,但是(rtos)值没有显示?你能得到数值,让它前后的另一个文本仍在阅读吗?这应该是最后一次修复。。。。
 
再次非常感谢你帮助我度过这段时间。
页: [1] 2
查看完整版本: AutoLISP中的多行文字