明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1185|回复: 10

求助lisp插件中参数的记忆设置

[复制链接]
发表于 2023-12-30 13:30:55 | 显示全部楼层 |阅读模式
  1. (defun C:vv()
  2.   (setq p1(getpoint"请指定第一点"))
  3.   (setq ld(getreal "\n请输入离结构基准面高度:"))
  4.   (setq dd(getreal"\n请输入距边距离左侧负数右侧正数:"))
  5.   (setq x (car p1))
  6.   (setq y (cadr p1))
  7.   (setq pa(list (+ x dd) (+ y (- 250 ld))))
  8.   (setq pb(list (+ x dd) (+ y (- 800 ld))))
  9.   (setq pc(list (+ x dd) (+ y (- 1500 ld))))
  10.   (setq pd(list (+ x dd) (+ y (- 2300 ld))))
  11.   (setq pe(list (+ x dd) (+ y (- 2800 ld))))
  12.   (command "circle"pa"d""30")
  13.   (command "circle"pb"d""30")
  14.   (command "circle"pc"d""30")
  15.   (command "circle"pd"d""30")
  16.   (command "circle"pe"d""30")
  17. )
如何让1d在程序运行中记忆上一次参数;如何在程序运行前设置(250/800/1500/2300/2800)参数?请教各位大神,本人小白一个。
发表于 2023-12-30 14:11:25 | 显示全部楼层
(defun c:vv ( / p1 x y pa pb pc pd pe )
  (setq p1(getpoint"请指定第一点"))
  (setq *ld* (cond ((getreal (strcat "\n请输入离结构基准面高度[" (rtos (setq *ld* (cond (*ld*)( 100 )))) "] ")))(*ld*)))
  (setq *dd* (cond ((getreal (strcat "\n请输入距边距离左侧负数右侧正数[" (rtos (setq *dd* (cond (*dd*)( 100 )))) "] ")))(*dd*)))
  (setq x (car p1))
  (setq y (cadr p1))
  (setq pa(list (+ x *dd*) (+ y (- 250 *ld*))))
  (setq pb(list (+ x *dd*) (+ y (- 800 *ld*))))
  (setq pc(list (+ x *dd*) (+ y (- 1500 *ld*))))
  (setq pd(list (+ x *dd*) (+ y (- 2300 *ld*))))
  (setq pe(list (+ x *dd*) (+ y (- 2800 *ld*))))
  (command "circle"pa"d""30")
  (command "circle"pb"d""30")
  (command "circle"pc"d""30")
  (command "circle"pd"d""30")
  (command "circle"pe"d""30")
)
发表于 2023-12-30 14:39:37 | 显示全部楼层
是不是这样的?
  1. (initget 7 "1 2 3 4 5  ")
  2.         (or ld (setq ld "1"))
  3.   (setq ld (getkword (strcat "\n[250(1)/800(2)/1500(3)/2300(4)/2800(5)]<" ld ">:")))
  4.        
 楼主| 发表于 2023-12-30 15:28:59 | 显示全部楼层
maiko 发表于 2023-12-30 14:11
(defun c:vv ( / p1 x y pa pb pc pd pe )
  (setq p1(getpoint"请指定第一点"))
  (setq *ld* (cond (( ...

感谢,1d的参数的记忆功能效果实现了。可能我没表述清楚代码中的250/800/1500/2300/2800我想在插件命令启动后提示设置5个高度尺寸(这是变量),这5个变量只设置一次就行,不用带记忆功能(直到下次重新加载启动的时候再设置)。变量的默认值可以用250、800、1500、2300、2800。
 楼主| 发表于 2023-12-30 15:36:24 | 显示全部楼层

感谢,可能我没表述清楚代码中的250/800/1500/2300/2800我想在插件命令启动后提示设置5个高度尺寸(这是变量),这5个变量只设置一次就行,不用带记忆功能(直到下次重新加载启动的时候再设置)。变量的默认值可以用250、800、1500、2300、2800。1d是每次操作的时候可能设置或者不设置(要带记忆上一次设置功能)
发表于 2023-12-30 15:46:50 | 显示全部楼层
184235521 发表于 2023-12-30 15:36
感谢,可能我没表述清楚代码中的250/800/1500/2300/2800我想在插件命令启动后提示设置5个高度 ...

变量超过三个就需要用dcl了 单搞一个dcl设置 应该可行
发表于 2023-12-31 20:17:41 | 显示全部楼层
(defun C:vv(/ p1 dd x y pt pb pc pd pe ld)
  (setq p1(getpoint"请指定第一点"))
  (setq ld(getreal "\n请输入离结构基准面高度:"))
  (setq dd(getreal"\n请输入距边距离左侧负数右侧正数:"))
        (if (= nil ld)(setq ld *ld*)(setq *ld* ld))
        (if (not *a*)  (setq *a* (getint"输入250")))
        (if (= nil *a*)(setq *a* 250))
        (if (not *b*)  (setq *b* (getint"输入800")))
        (if (= nil *b*)(setq *b* 800))
        (if (not *c*)  (setq *c* (getint"输入1500")))
        (if (= nil *c*)(setq *c* 1500))
        (if (not *d*)  (setq *d* (getint"输入2300")))
        (if (= nil *d*)(setq *d* 2300))
        (if (not *e*)  (setq *e* (getint"输入2800")))
        (if (= nil *e*)(setq *e* 2800))
  (setq x (car p1))
  (setq y (cadr p1))
  (setq pa(list (+ x dd) (+ y (- *a* ld))))
  (setq pb(list (+ x dd) (+ y (- *b* ld))))
  (setq pc(list (+ x dd) (+ y (- *c* ld))))
  (setq pd(list (+ x dd) (+ y (- *d* ld))))
  (setq pe(list (+ x dd) (+ y (- *e* ld))))
  (command "circle"pa"d""30")
  (command "circle"pb"d""30")
  (command "circle"pc"d""30")
  (command "circle"pd"d""30")
  (command "circle"pe"d""30")
)
看看是否是你想要的结果。
发表于 2023-12-31 20:45:53 | 显示全部楼层
本帖最后由 hhh454 于 2023-12-31 20:53 编辑

输入数据多,用dcl好一点,程序输入数据一次后,关闭文件前都会记忆数据,关闭文件后,数据清空,需要重新输入。
对话框没有给定输入框的宽度参数,所以长短不一,不太美观,不影响使用。

  1. ;对话框程序开始:
  2. (defun ngc-dcl()
  3. (setq Dcl_File (vl-filename-mktemp nil nil ".Dcl"))
  4. (setq f_dcl (open Dcl_File "w"))
  5. ;;下面的对话框名称,和下面的对应,可以改成自己的名称,要上下对应:
  6. (write-line "sjct33:dialog{label=\"可视化DCL\";:row{:boxed_column{ label = \"春婵工具\";:row{:column{:row{:edit_box{key = \"edit3\"; label = \"输入离结构基准面高度\" ;}}:row{:edit_box{key = \"edit4\"; label = \"输入距边距离左侧负数右侧正数\" ;}}:row{:edit_box{key = \"edit5\"; label = \"输入pa距离\" ;}}:row{:edit_box{key = \"edit6\"; label = \"输入pb距离\" ;}}:row{:edit_box{key = \"edit7\"; label = \"输入pc距离\" ;}}:row{:edit_box{key = \"edit8\"; label = \"输入pd距离\" ;}}:row{:edit_box{key = \"edit9\"; label = \"输入pe距离\" ;}}:row{:edit_box{key = \"edit10\"; label = \"输入圆直径\" ;}}:row{:text{key = \"txt11\"; label = \"春婵绘图工具\" ;}}}}}}ok_cancel;}" f_dcl)
  7. (close f_dcl)Dcl_File)
  8. ;;主程序开始:-------------------------------
  9. (defun c:tt ()
  10.   (setvar "cmdecho" 0) ;_关闭命令提示
  11.   (setq osmode_bak (getvar "osmode")) ;_记录捕捉
  12.   (setvar "osmode" 0) ;_关闭捕捉
  13.   (setq dcl_id (load_dialog (setq Dcl_File (ngc-dcl))));;对话框加载
  14.   (vl-file-delete Dcl_File);;加载后删除DCL文件
  15.   (SETQ CHK 0);;设置关键联动默认变量为0
  16.   (NEW_DIALOG "sjct33" DCL_ID);;此处为对话框名称,和上面对应,要上下对应
  17.   (setq keys '("edit3" "edit4" "edit5" "edit6" "edit7" "edit8" "edit9" "edit10" "txt11" "accept" "cancel"));对话框key值列表
  18.   (foreach key keys (if (eval (read (strcat key "_bak"))) (set_tile key (eval (read (strcat key "_bak"))))))
  19.   (ACTION_TILE "accept" "(SETQ CHK 1)(备份数据)(DONE_DIALOG 1)");;确定按钮动作关联
  20.   (START_DIALOG)
  21.   (读取对话框数据);;此处为读取对话框数据的地方
  22.   (UNLOAD_DIALOG DCL_ID)
  23.   (运行程序);;此处为主要程序运行
  24.   (setvar "osmode" osmode_bak) ;_还原捕捉
  25.   (setvar "cmdecho" 1) ;_打开命令提示
  26.   (PRINC))
  27. (DEFUN 读取对话框数据 ()
  28.   (SETQ T1 (read edit3_bak))
  29.   (SETQ T2 (read edit4_bak))
  30.   (SETQ T3 (read edit5_bak))
  31.   (SETQ T4 (read edit6_bak))
  32.   (SETQ T5 (read edit7_bak))
  33.   (SETQ T6 (read edit8_bak))
  34.   (SETQ T7 (read edit9_bak))
  35.   (SETQ T8 (read edit10_bak))
  36. )
  37. (defun 备份数据( / key)(foreach key keys (set (read (strcat key "_bak")) (get_tile key))))
  38. (DEFUN 运行程序 ()
  39.   (IF (= CHK 1) ;;此处为自定义条件和执行,可以改成其他的关联方式
  40.       (progn
  41.         (setq p1(getpoint"请指定第一点"))
  42.         (setq x (car p1)
  43.               y (cadr p1))
  44.         (setq pa(list (+ x T2) (+ y (- T3 T1)))
  45.               pb(list (+ x T2) (+ y (- T4 T1)))
  46.               pc(list (+ x T2) (+ y (- T5 T1)))
  47.               pd(list (+ x T2) (+ y (- T6 T1)))
  48.               pe(list (+ x T2) (+ y (- T7 T1))))
  49.         (command "circle" pa "d" t8)
  50.         (command "circle" pb "d" t8)
  51.         (command "circle" pc "d" t8)
  52.         (command "circle" pd "d" t8)
  53.         (command "circle" pe "d" t8)
  54.           );;end progn
  55.      );;end if
  56.   )
  57.       ;;程序结束-----------------------------------

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2024-1-4 09:36:22 | 显示全部楼层
咏郡 发表于 2023-12-31 20:17
(defun C:vv(/ p1 dd x y pt pb pc pd pe ld)
  (setq p1(getpoint"请指定第一点"))
  (setq ld(getreal  ...

非常感谢,这就是我要的效果。
 楼主| 发表于 2024-1-4 09:38:10 | 显示全部楼层
hhh454 发表于 2023-12-31 20:45
输入数据多,用dcl好一点,程序输入数据一次后,关闭文件前都会记忆数据,关闭文件后,数据清空,需要重新 ...

感谢,因本人是小白,文化低对DCL一窍不通。感谢指点,以后慢慢了解。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 07:03 , Processed in 0.171639 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表