求助lisp插件中参数的记忆设置
(defun C:vv()(setq p1(getpoint"请指定第一点"))
(setq ld(getreal "\n请输入离结构基准面高度:"))
(setq dd(getreal"\n请输入距边距离左侧负数右侧正数:"))
(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")
)
如何让1d在程序运行中记忆上一次参数;如何在程序运行前设置(250/800/1500/2300/2800)参数?请教各位大神,本人小白一个。 (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")
) 是不是这样的?(initget 7 "1 2 3 4 5")
(or ld (setq ld "1"))
(setq ld (getkword (strcat "\n<" ld ">:")))
maiko 发表于 2023-12-30 14:11
(defun c:vv ( / p1 x y pa pb pc pd pe )
(setq p1(getpoint"请指定第一点"))
(setq *ld* (cond (( ...
感谢:handshake,1d的参数的记忆功能效果实现了。可能我没表述清楚代码中的250/800/1500/2300/2800我想在插件命令启动后提示设置5个高度尺寸(这是变量),这5个变量只设置一次就行,不用带记忆功能(直到下次重新加载启动的时候再设置)。变量的默认值可以用250、800、1500、2300、2800。 飞雪神光 发表于 2023-12-30 14:39
是不是这样的?
感谢:handshake,可能我没表述清楚代码中的250/800/1500/2300/2800我想在插件命令启动后提示设置5个高度尺寸(这是变量),这5个变量只设置一次就行,不用带记忆功能(直到下次重新加载启动的时候再设置)。变量的默认值可以用250、800、1500、2300、2800。1d是每次操作的时候可能设置或者不设置(要带记忆上一次设置功能) 184235521 发表于 2023-12-30 15:36
感谢,可能我没表述清楚代码中的250/800/1500/2300/2800我想在插件命令启动后提示设置5个高度 ...
变量超过三个就需要用dcl了 单搞一个dcl设置 应该可行 (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")
)
看看是否是你想要的结果。 本帖最后由 hhh454 于 2023-12-31 20:53 编辑
输入数据多,用dcl好一点,程序输入数据一次后,关闭文件前都会记忆数据,关闭文件后,数据清空,需要重新输入。
对话框没有给定输入框的宽度参数,所以长短不一,不太美观,不影响使用。
;对话框程序开始:
(defun ngc-dcl()
(setq Dcl_File (vl-filename-mktemp nil nil ".Dcl"))
(setq f_dcl (open Dcl_File "w"))
;;下面的对话框名称,和下面的对应,可以改成自己的名称,要上下对应:
(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)
(close f_dcl)Dcl_File)
;;主程序开始:-------------------------------
(defun c:tt ()
(setvar "cmdecho" 0) ;_关闭命令提示
(setq osmode_bak (getvar "osmode")) ;_记录捕捉
(setvar "osmode" 0) ;_关闭捕捉
(setq dcl_id (load_dialog (setq Dcl_File (ngc-dcl))));;对话框加载
(vl-file-delete Dcl_File);;加载后删除DCL文件
(SETQ CHK 0);;设置关键联动默认变量为0
(NEW_DIALOG "sjct33" DCL_ID);;此处为对话框名称,和上面对应,要上下对应
(setq keys '("edit3" "edit4" "edit5" "edit6" "edit7" "edit8" "edit9" "edit10" "txt11" "accept" "cancel"));对话框key值列表
(foreach key keys (if (eval (read (strcat key "_bak"))) (set_tile key (eval (read (strcat key "_bak"))))))
(ACTION_TILE "accept" "(SETQ CHK 1)(备份数据)(DONE_DIALOG 1)");;确定按钮动作关联
(START_DIALOG)
(读取对话框数据);;此处为读取对话框数据的地方
(UNLOAD_DIALOG DCL_ID)
(运行程序);;此处为主要程序运行
(setvar "osmode" osmode_bak) ;_还原捕捉
(setvar "cmdecho" 1) ;_打开命令提示
(PRINC))
(DEFUN 读取对话框数据 ()
(SETQ T1 (read edit3_bak))
(SETQ T2 (read edit4_bak))
(SETQ T3 (read edit5_bak))
(SETQ T4 (read edit6_bak))
(SETQ T5 (read edit7_bak))
(SETQ T6 (read edit8_bak))
(SETQ T7 (read edit9_bak))
(SETQ T8 (read edit10_bak))
)
(defun 备份数据( / key)(foreach key keys (set (read (strcat key "_bak")) (get_tile key))))
(DEFUN 运行程序 ()
(IF (= CHK 1) ;;此处为自定义条件和执行,可以改成其他的关联方式
(progn
(setq p1(getpoint"请指定第一点"))
(setq x (car p1)
y (cadr p1))
(setq pa(list (+ x T2) (+ y (- T3 T1)))
pb(list (+ x T2) (+ y (- T4 T1)))
pc(list (+ x T2) (+ y (- T5 T1)))
pd(list (+ x T2) (+ y (- T6 T1)))
pe(list (+ x T2) (+ y (- T7 T1))))
(command "circle" pa "d" t8)
(command "circle" pb "d" t8)
(command "circle" pc "d" t8)
(command "circle" pd "d" t8)
(command "circle" pe "d" t8)
);;end progn
);;end if
)
;;程序结束-----------------------------------
咏郡 发表于 2023-12-31 20:17
(defun C:vv(/ p1 dd x y pt pb pc pd pe ld)
(setq p1(getpoint"请指定第一点"))
(setq ld(getreal...
非常感谢:handshake,这就是我要的效果。 hhh454 发表于 2023-12-31 20:45
输入数据多,用dcl好一点,程序输入数据一次后,关闭文件前都会记忆数据,关闭文件后,数据清空,需要重新 ...
感谢:handshake,因本人是小白,文化低对DCL一窍不通。感谢指点,以后慢慢了解。
页:
[1]
2