brawleyman 发表于 2022-7-6 15:23:22

记住上次使用的LISP行

我正在寻找一个简单的例程,可以记住你最后的输入。
 
我现在的例行程序是“输入下降距离以增加总长度”,所以每次我都必须输入数字。我希望它能够记住最后一个输入是什么,并在“enter drop distance”语句之后说出来,然后右键单击应用它以继续执行例程。我想这样说:
 
输入要添加到总长度的下降距离:
 
当10为时,它需要是最后一个输入的任何值,无论是10或15或任何值。有办法吗?谢谢

Lee Mac 发表于 2022-7-6 15:35:46

确实有——看看这个:
 
http://www.cadtutor.net/forum/showthread.php?t=30948

Lee Mac 发表于 2022-7-6 15:40:52

ASMI的例子很好,但我喜欢使用setenv,这样LISP即使在完成后也能记住值。

brawleyman 发表于 2022-7-6 15:46:27

李·麦克,
 
以下是我一直在编写的代码,您曾多次帮助我:
 

(defun c:dis ()
   (setvar "CMDECHO" 0)
   (setq num 1)
   (setq drop (getint "\nEnter drop distance to add to total length <***this is where I want the last distance displayed***>: "))
   (setq drop (* 12 drop))
   (setq pt (getpoint "\nSelect path to next device:"))
   (setq x1 (car pt))
   (setq y1 (cadr pt))
   (setq lensum (+ drop))
   (while
   (setq pt (getpoint pt))
   (setq x2 (car pt))
   (setq y2 (cadr pt))
   (setq xdiff (abs (- x1 x2)))
   (setq ydiff (abs (- y1 y2)))
   (setq len (+ xdiff ydiff))
   (setq lensum (+ len lensum))
   (setq segsum (strcat "---> TOTAL LENGTH: " (rtos (/ lensum 12) 2 0)))
   (setq x1 x2)(setq y1 y2)
   )
(princ "\n")(princ segsum)
(princ)
)

 
大多数情况下,我用10作为我10英尺的下降距离。然而,有时一个项目必须与每个设备有15英尺或20英尺的下降距离。我只想拥有它,这样当我第一次打开一个图形并使用这个lisp时,我第一次键入10(或任何标准),以获得我的距离,然后,我只需右键单击(或输入),它就会自动应用该数字,而无需每次键入。
 
我仍在努力阅读和理解lisp,所以我不能挑出我需要使这项工作的小部分。谢谢你,李!

Lee Mac 发表于 2022-7-6 15:54:51

试试这个:
 

(defun c:dis (/ num drop pt x1 y1 lensum x2 y2 xdiff ydiff len segsum)
   (setvar "CMDECHO" 0)
   (setq num 1)
   (or (getenv "DROP:DIST") (setenv "DROP:DIST" "0"))
   (if
   (setq drop (getint (strcat "\nEnter drop distance to add to total length <"
                  (getenv "DROP:DIST")
                  "> :"
            ) ;_end strcat
          ) ;_end getint
   ) ;_end setq
      (setenv "DROP:DIST" (rtos drop))
   ) ;_end if
   (setq drop (* 12 (atof (getenv "DROP:DIST"))))
   (setq pt (getpoint "\nSelect path to next device:"))
   (setq x1 (car pt))
   (setq y1 (cadr pt))
   (setq lensum (+ drop))
   (while
   (setq pt (getpoint pt))
      (setq x2 (car pt))
      (setq y2 (cadr pt))
      (setq xdiff (abs (- x1 x2)))
      (setq ydiff (abs (- y1 y2)))
      (setq len (+ xdiff ydiff))
      (setq lensum (+ len lensum))
      (setq segsum (strcat "---> TOTAL LENGTH: " (rtos (/ lensum 12) 2 0)))
      (setq x1 x2)
      (setq y1 y2)
   ) ;_end while
   (princ "\n")
   (princ segsum)
   (princ)
) ;_end defun

brawleyman 发表于 2022-7-6 15:59:18

 
没有按我需要的方式工作。我最初设置它,这样我就可以输入“10”,然后将其转换为10英尺。你刚才给我的那个只允许我输入英寸,我不能输入10’,因为它需要一个整数。可以设置成我只需要输入10,然后转换成10英尺吗?谢谢

brawleyman 发表于 2022-7-6 16:04:51

好的,这是最终产品!我对它进行了测试,然后重新测试,以确保尺寸相加。
 

;This function will calculate the distance a length of wire travels, at right angles, from one device to the next.
(defun c:dis ()
   (setvar "CMDECHO" 0)
   (setq num 1)
   (or (getenv "DROP:DIST") (setenv "DROP:DIST" "10"))
      (if
      (setq drop (getint (strcat "\nEnter drop distance to add to total length <"(getenv "DROP:DIST")">: ")))
      (setenv "DROP:DIST" (rtos (* 12 drop)))
      )
   (setq drop (* 12 (atof (getenv "DROP:DIST"))))
   (setq pt (getpoint "\nSelect path to next device:"))
   (setq x1 (car pt))
   (setq y1 (cadr pt))
   (setq lensum (+ drop))
   (while
   (setq pt (getpoint pt))
      (setq x2 (car pt))
      (setq y2 (cadr pt))
      (setq xdiff (abs (- x1 x2)))
      (setq ydiff (abs (- y1 y2)))
      (setq len (+ xdiff ydiff))
      (setq lensum (+ len lensum))
      (setq segsum (strcat "---> TOTAL LENGTH: " (rtos (/ lensum 12) 2 0)))
      (setq x1 x2)
      (setq y1 y2)
   )
   (princ "\n")(princ segsum)
   (princ)
)

 
这个LISP例程对于任何需要计算导线移动距离并包括下降距离的人来说都非常有用(对于我们来说,我们的导线在天花板上运行,然后下降5英尺到设备,然后备份5英尺到导管,因此我一直在说10英尺)。我们的布线布局始终在正交或XY坐标中运行,本例程仅计算正交或XY坐标,因此您可以单击以“L”形隔开的两个设备,它得到的是该距离,而不是从一个到另一个的直线。
 
这是李·麦克的道具,他帮了我的忙,并且达到了我想要的程度。谢谢我希望这个例行公事也能帮助其他人。
 
哦,如果有人感兴趣的话,我创建了一个LISP,它只在X和Y坐标中绘制导管线,并将边缘圆角到你想要的任何位置,你只需要在使用它之前设置圆角。它还可以绘制“N”形的导管。

Lee Mac 发表于 2022-7-6 16:13:11

好样的斗士,很高兴你能成功

BIGAL 发表于 2022-7-6 16:21:49

为什么不直接检查一个值是否存在,而不是setenv?
 
(if(=dropdist nil)(setq dropdist 10.0))在代码顶部,甚至可能在defun之外
 
一旦您更改dropdist,它将在整个会话中保持不变。
 
然后,您每次选中“drop”,如果其为零或0.0,您按下“回车键”dropdist是您设置的值,例如10,则它不会更改dropdist值,否则使用新值。
 

(setq insul\U ht(getint“\n输入绝缘ht mm:))
(如果(=insul\U ht nil)
(setq insul\U ht 90)
)

Lee Mac 发表于 2022-7-6 16:29:52

嗨,比格尔,谢谢你的建议
 
我使用了setenv,因为它将保留其值。
页: [1]
查看完整版本: 记住上次使用的LISP行