世人皆醉 发表于 2023-4-29 18:19:42

popup_list的值如何反馈到lisp中,并下次使用默认选择的值

我想知道如何将dcl对话框中的popup_list的key值转换到lisp函数中,并且下一次使用该命令是会重复上一次选择的key值,如下列代码所示,在DCL中的d5如何反馈到lisp中的c3d5,并下一次使用该命令时对话框显示上一次使用该命令时显示的值



(defun c:c3e(/p1 p2 p3 p4 p5 p6 p7 p8 e1 p9 d5 d6 d7 d8 d9 o0s pt1 i1 i2 i3 i4 i5 i6 i7 i8 i9 i10 i11 i12 i13 i14 i15 i16 i17 i18 i19) ;直管一键展开绘制
(setvar "cmdecho" 0) ;关闭普通命令提示信息
(setvar "osmode" 0);关闭对象捕捉状态
   (command "._undo" "_begin")
        (defun make-dclCS(/ lst_str str file f );;面板的界面显示dcl
                (setq lst_str
                        '(
                               "矩形直管口字型展开程序:dialog"
                               "{ // start dcl"
                               "label = \"矩形直管口字型展开程序\";"
                                 ":row{"
                               ":boxed_column{"
                               ":edit_box{label=\"直管序号为(个):\";key=\"d1\"; edit_width=10;}"
                               ":edit_box{label=\"直管长度为(mm):\";key=\"d2\"; edit_width=10;}"
                               ":edit_box{label=\"直管宽度为(mm):\";key=\"d3\"; edit_width=10;}"
                                 ":edit_box{label=\"直管高度为(mm):\";key=\"d4\"; edit_width=10;}"                                
                                 ":popup_list{label=\"板材厚度为(mm):\";key=\"d5\";list=\"1.5t\\n0.8t\\n1.0t\\n1.2t\\n2.0t\\n3.0t\"; edit_width=10;}"
                               "} "
                                 ":image{width=30;height=4;key=\"img1\"; color=-16;}} "
                               ":row{"":button{label=\"确定(&Q)\";key=\"accept\";
                               is_default=true;height=2;}"        ":button{label=\"取消(&C)\";key=\"cancel\";is_cancel=true;height=2;}"":button{label=\"帮助(&H)\";key=\"help\";is_cancel=true;height=2;}" "}"
                          
                               "fixed_width=true;"
                               "alignment=left;"
                               "} // end dll" ;结尾
                       )                     
                )
                (setq file (vl-filename-mktemp "DclTemp.dcl"))
                (setq f (open file "w"))
                (foreach str lst_str
                        (princ "\n" f)
                        (princ str f)
                )
                (close f)
                ;;返回
                file
        )
        ;;---------开始写面板调用函数
(defun getdata2() ;获取当前dcl界面里面控件key的当前值,并保存为全局变量,这里需要保存值的变量名字(JH bhd2 JR)尽量起的复杂一点,否则会引起全局变量冲突
    (setq c3d1(atof(get_tile "d1")))
    (setq c3d2(atof(get_tile "d2")))
    (setq c3d3(atof(get_tile "d3")))
    (setq c3d4(atof(get_tile "d4")))
    (setq c3d5(atof(get_tile "d5")))
        )
    (if (not c3d1)
   (progn (setq c3d1 1) ;判断变量是否存在并且为字符串,如果不是则进行初始化定义
          (setq c3d2 500);判断变量是否存在并且为字符串,如果不是则进行初始化定义
          (setq c3d3 500);判断变量是否存在并且为字符串,如果不是则进行初始化定义
          (setq c3d4 2697);判断变量是否存在并且为字符串,如果不是则进行初始化定义
          ));判断变量是否存在并且为字符串,如果不是则进行初始化定义



(if (= (setq dcl_id (load_dialog (setq Dcl_File(make-dclCS)))) 0)(progn(alert "\n无法显示对话框!")(exit)))
        (if Dcl_File(vl-file-delete Dcl_File));加载后删除DCL文件
(if(not (new_dialog "矩形直管口字型展开程序" dcl_id))(progn(alert "\n无法显示对话框!")(exit)))

          (start_image "img1")
          (setq max_x (dimx_tile "img1"))
          (setq max_y (dimy_tile "img1"))
          (slide_image 0 0 max_x max_y "D:/插件/sld/1.sld")
          (end_image);显示图形对话框
          (mode_tile "d1" 2);设置d1为焦点

(set_tile "d1" (rtos c3d1 2 2)) ;将对应key的全局变量传递给控件,以便显示界面的时候直接显示上次记忆的控件key值
(set_tile "d2" (rtos c3d2 2 2));将对应key的全局变量传递给控件
(set_tile "d3" (rtos c3d3 2 2));将对应key的全局变量传递给控件
(set_tile "d4" (rtos c3d4 2 2));将对应key的全局变量传递给控件



(action_tile "accept" "(getdata2)(done_dialog 1)") ;当按下确认按钮的时候保存控件值,然后退出界面,并执行对于功能函数
(action_tile "cancel" "(getdata2)(done_dialog 0)") ;当按下取消按钮的时候保存控件值,然后退出界面
(action_tile "help" "(getdata2)(done_dialog 2)")
(setq re (start_dialog))
(unload_dialog dcl_id)
   (cond ((= re 0)
(setq dss (get_tile "d5"))             
            (princ dss)
          )
           ((= re 2)
          
            (ALERT
      "\n 1ccccccc"      
       )
          
          )
          ((= re 1)
          (princ "\n单击了确定按钮"))))


lee50310 发表于 2023-4-29 18:19:43

本帖最后由 lee50310 于 2023-4-30 13:51 编辑

你的意思是 讓 每個 輸入項及選單 有記憶功能 ?

改好了,請參考看看!

世人皆醉 发表于 2023-4-30 08:27:04

(set_tile "d5" (rtos c3d5 2 2))

liuhe 发表于 2023-4-30 10:18:42

(START_LIST "LAY1")
    (MAPCAR 'ADD_LIST LAYL)
    (END_LIST)
    (set_tile "LAY1" (RTOS (vl-position LAY LAYL) 2 0))

这是我对图层popup_list的赋值,key是LAY1,list是图纸的图层列表。如果不对popup_list进行赋值,会自动选择字符串“0”,即图层列表中第一项作为默认值。如果想赋值上次的选择,你取得list中上次值的序号,用vl-position函数,然后把这个int转换成字符串,赋值给popup_list的key。(set_tile "LAY1" (RTOS (vl-position LAY LAYL) 2 0)),取得上次图层设定值在图层列表中序号,然后。。。。
页: [1]
查看完整版本: popup_list的值如何反馈到lisp中,并下次使用默认选择的值