明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 912|回复: 3

[讨论] DCL界面卡着了

[复制链接]
发表于 2022-12-20 23:03:58 | 显示全部楼层 |阅读模式
初学DCL,点按钮的时候不会跳转执行命令,然后卡在界面了,怎么操作?

rect:dialog {
    label = "过滤设置" ;
    :column {
        fixed_width = true ;
        width = 100 ;
        :boxed_row {
            label = "过滤选项" ;
            :toggle {
                key = "type" ;
                label = "对象类型" ;
                value = "1" ;
            }
            :toggle {
                key = "blockname" ;
                label = "图块名" ;
                value = "0" ;
            }
            :button {
                key = "pickpt" ;
                label = "选择对象" ;
            }
        }
        spacer_1;
    }
    spacer_1;
    ok_cancel;
}





;;过滤选择
(DEFUN C:AA()
  ;DCL面板参数设置
  ;(if (null blockname-key)(setq blockname-key "1"))
  (defun defaults ()
    ;;第一次执行不加载DCL参数
    (if        (/ dcl_sb nil)
      (progn
        (alert "运行了")
        (set_tile "type" (itoa type-key))
        (set_tile "blockname" (itoa blockname-key))
      ) ;progn
    );if
    )


  ;根据按钮操作
  (defun do_type ()
    (princ "执行类型")
    (setq type-key (atoi temp))
    ;(setq type-key (atoi (get_TILE "type")))
    (princ type-key)
  )
  (defun do_blockname ()
    (princ "执行块名")
    (setq blockname-key (atoi temp))
    ;(setq blockname-key (atoi (get_TILE "blockname")))
    (princ blockname-key)
  )
  (defun do_pickpt ()
    (princ "执行对象选择")
    (setq ss (ssget (list (if (= typess 1)
                            (cons 0 "LINE")
                            (cons 0 "~none")
                          )
                          (if (= layer 1)
                            (cons 8 "WINDOW")
                            (cons 8 "~none")
                          )
                    )
             )
    )
  )


  (defun do_save ()
    (princ "执行确认")
    ;(list (get_TILE "type"))
    ;(setq type-key (atoi (get_TILE "type")))
    ;(setq blockname-key (atoi (get_TILE "blockname")))
    (setq ss (ssget (list (if (= typess 1)
                            (cons 0 "LINE")
                            (cons 0 "~none")
                          )
                          (if (= layer 1)
                            (cons 8 "WINDOW")
                            (cons 8 "~none")
                          )
                    )
             )
    )
    (done_dialog 1)
  )


  ;;加载DCl程序
  (SETQ DCL_ID (LOAD_DIALOG "F:/lsp/DCL/AA.DCL"));加载
  (NEW_DIALOG "rect" DCL_ID);记录id dcl中:dialog前的内容

  ;设置默认参数
  ;(SET_TILE "type" type-key);设定值
  ;(SET_TILE "blockname" blockname-key);设定值

  ;(defaults)
  ;读取当前值
  ;(MODE_TILE "RECT_W" 0);状态修改

  (ACTION_TILE "type" "(setq temp $value)(do_type)");获取面板更新后状态
  (ACTION_TILE "blockname" "(setq temp $value)(do_blockname)")
  (ACTION_TILE "pickpt" "(do_pickpt)(done_dialog)")
  (ACTION_TILE "accept" "(do_save)");获取面板更新后状态

  (START_DIALOG)(UNLOAD_DIALOG DCL_ID)

  (princ qqq)
  (princ)
)


发表于 2022-12-21 07:34:37 | 显示全部楼层
本帖最后由 vitalgg 于 2022-12-21 08:41 编辑

请牢牢记住,DCL是模态对话框,在与对话框交互时,不能使用任何与对话框之外的交互.
如 :
1、ssget 不带"x“ 或 "P" 的的操作,ssget函数,根据 sel_mode 参数的不同,有的需要交互,有的不需要交互。
2、get*系列,如 getint getstring getreal getpoint ,getcorner 等
3、command 系列:如 comand ,command-s vl-cmds 等


如果需要从绘图区传递数据,需要done_dialog退出对话框,与绘图区交互,取数据,设变量,再重新 new_dialog







本帖子中包含更多资源

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

x
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-12-20 23:28:35 | 显示全部楼层
可以跳转了,但不知道如何返回界面。将获得到数据写回界面例如edit box中。我这DCL没载文本框


;;过滤选择
(DEFUN C:AA()
  ;DCL面板参数设置
  ;(if (null blockname-key)(setq blockname-key "1"))
  (defun defaults ()
    ;;第一次执行不加载DCL参数
    (if        (/ dcl_sb nil)
      (progn
        (alert "运行了")
        (set_tile "type" (itoa type-key))
        (set_tile "blockname" (itoa blockname-key))
      ) ;progn
    );if
    )


  ;根据按钮操作
  (defun do_type ()
    (princ "执行类型")
    (setq type-key (atoi temp))
    ;(setq type-key (atoi (get_TILE "type")))
    (princ type-key)
  )
  (defun do_blockname ()
    (princ "执行块名")
    (setq blockname-key (atoi temp))
    ;(setq blockname-key (atoi (get_TILE "blockname")))
    (princ blockname-key)
  )
  (defun do_pickpt ()
    (princ "执行对象选择")
    (setq ss (ssget (list (if (= typess 1)
                            (cons 0 "LINE")
                            (cons 0 "~none")
                          )
                          (if (= layer 1)
                            (cons 8 "WINDOW")
                            (cons 8 "~none")
                          )
                    )
             )
    )
  )
  
  
  (defun do_save ()
    (princ "执行确认")
    ;(list (get_TILE "type"))
    ;(setq type-key (atoi (get_TILE "type")))
    ;(setq blockname-key (atoi (get_TILE "blockname")))
    (setq ss (ssget (list (if (= typess 1)
                            (cons 0 "LINE")
                            (cons 0 "~none")
                          )
                          (if (= layer 1)
                            (cons 8 "WINDOW")
                            (cons 8 "~none")
                          )
                    )
             )
    )
   
  )


  ;;加载DCl程序
  (SETQ DCL_ID (LOAD_DIALOG "F:/lsp/DCL/AA.DCL"));加载
  (NEW_DIALOG "rect" DCL_ID);记录id dcl中:dialog前的内容

  ;设置默认参数
  ;(SET_TILE "type" type-key);设定值
  ;(SET_TILE "blockname" blockname-key);设定值

  ;(defaults)
  ;读取当前值
  ;(MODE_TILE "RECT_W" 0);状态修改
  
  (ACTION_TILE "type" "(setq temp $value)(do_type)");获取面板更新后状态
  (ACTION_TILE "blockname" "(setq temp $value)(do_blockname)")
  (ACTION_TILE "pickpt" "(done_dialog 2)")
  (ACTION_TILE "accept" "(do_save)");获取面板更新后状态
  
  (setq what_next (start_dialog))
  (cond
      ((= 2 what_next)
       (progn
         (setq pt (getpoint "\n选择基点"))
         (done_dialog 1)
         )
      )
    )
  (UNLOAD_DIALOG DCL_ID)



  
  
  (princ qqq)
  (princ)
)
 楼主| 发表于 2022-12-21 11:18:58 | 显示全部楼层
vitalgg 发表于 2022-12-21 07:34
请牢牢记住,DCL是模态对话框,在与对话框交互时,不能使用任何与对话框之外的交互.
如 :
1、ssget 不带 ...

感谢,明白了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 06:24 , Processed in 0.178439 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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