明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3321|回复: 5

[源码] DCL面板设置参数并存入dwg文件

[复制链接]
发表于 2014-10-19 09:51:10 | 显示全部楼层 |阅读模式
下面这个代码大师们可以无视,不过对新手应该还是能有不少帮助的

第一次搞DCL,翻遍论坛,折腾出来了,后来又开始考虑,可以将这个功能函数化,就更方便了,于是吭哧吭哧的又折腾了老半天,到这会儿愣是还没折腾出来,故顺便请教下大师们,怎么将这个功能通用函数化。
我的设想是把初始设置的第一部分搞成表,但是没折腾出来,有个无法达到目的的次品,就放二楼了

;;参数设置  2014.10.18
(defun c:tt ();/ key lst 全局比例表 全局比例 灯具功率
  (vl-load-com)
  ;;内部函数开始
  ;;初始设置
  (defun 初始设置()
    (setq 全局比例 (vlax-ldata-put "ddict" "全局比例" '("100" "200" "300") T)
          房间照度 (vlax-ldata-put "ddict" "房间照度" '("300" "500" "200" "100" "75" "50" "30") T)
          灯光通量 (vlax-ldata-put "ddict" "灯光通量" '("5000" "2500" "1800") T)
          灯具功率 (vlax-ldata-put "ddict" "灯具功率" "56" T)
          )
    )
  ;;显示参数值
  (defun parasetilvalue()
    (showlst "全局比例" 全局比例)
    (showlst "房间照度" 房间照度)
    (showlst "灯光通量" 灯光通量)
    (set_tile "灯具功率" 灯具功率)
    )
  ;;显示列表
  (defun showlst (key lst)               
    (start_list key)
    (mapcar 'add_list lst)
    (end_list)
  )

  ;;内部函数结束
  ;;第一次运行赋值
  (if (not (vlax-ldata-get "ddict" "灯光通量" nil T)) (初始设置))
  ;;第一次以后运行获取参数值
  (setq 全局比例 (vlax-ldata-get "ddict" "全局比例" nil T)
        房间照度 (vlax-ldata-get "ddict" "房间照度" nil T)
        灯光通量 (vlax-ldata-get "ddict" "灯光通量" nil T)
        灯具功率 (vlax-ldata-get "ddict" "灯具功率" nil T)
        )
  ;建立临时dcl
  (setq tempname (vl-filename-mktemp "temp.dcl") filen (open tempname "w"))
  (foreach stream
    '("paraset:dialog{"
      "\n  label=\"参数设置\";"
      "\n  :popup_list{label=\"全局比例:\"; key=\"全局比例\";}"
      "\n  :popup_list{label=\"房间照度:\"; key=\"房间照度\";}"
      "\n  :popup_list{label=\"灯光通量:\"; key=\"灯光通量\";}"
      "\n  :edit_box{label=\"灯具功率:\"; key=\"灯具功率\";}"
      "\n  :row { :button { label = \"确认\" ; key = \"确认\" ;  is_default = true ;   }"
      "\n  :button { label = \"默认\" ; key = \"默认\" ; }}}"
     ; "\n    :button { key = \"取消\" ; label = \"取消\" ; is_cancel = true ; } } }"
     ; "\n    :spacer_1{is_default=true;}}}"
      )
  (princ stream filen));在临时dcl中写入以上数据
  (close filen);关闭文件
  (setq dclname tempname)
  (setq dcl_re (load_dialog dclname)) ;加载临时dcl
  (if (not (new_dialog "paraset" dcl_re)) (exit))
  (parasetilvalue);显示参数
  ;(showlst "全局比例" 全局比例)
; (action_tile "取消" "(done_dialog)")
  (action_tile "全局比例" "(setq 全局比例 (cons(nth(atoi $value) 全局比例)(vl-remove(nth(atoi $value) 全局比例) 全局比例)))")
  (action_tile "房间照度" "(setq 房间照度 (cons(nth(atoi $value) 房间照度)(vl-remove(nth(atoi $value) 房间照度) 房间照度)))")
  (action_tile "灯光通量" "(setq 灯光通量 (cons(nth(atoi $value) 灯光通量)(vl-remove(nth(atoi $value) 灯光通量) 灯光通量)))")
  (action_tile "灯具功率" "(setq 灯具功率 $value)")
  (action_tile "确认" "(done_dialog 1)");定义OK按钮的动作
  (action_tile "默认" "(初始设置)(parasetilvalue)")
  (setq std (start_dialog))
  (unload_dialog dcl_re);卸载
  (vl-file-delete dclname);删除临时dcl文件
  ;;确认后,更新参数值
  (if (= std 1)
    (progn
      (vlax-ldata-put "ddict" "全局比例" 全局比例 T)
      (vlax-ldata-put "ddict" "房间照度" 房间照度 T)
      (vlax-ldata-put "ddict" "灯光通量" 灯光通量 T)
      (vlax-ldata-put "ddict" "灯具功率" 灯具功率 T)
      )
    );if
  (princ)
)

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2014-10-19 09:52:59 | 显示全部楼层
被我越折腾越不行了
;;参数设置  2014.10.18
(defun c:tt (/ newpopuplst popuplst 全局比例 房间照度 灯光通量);/ key lst 全局比例表 全局比例 灯具功率
  (vl-load-com)
  ;;内部函数开始
  ;;初始设置
  (defun 初始设置()
    (setq popuplst (list(list "全局比例" '("100" "200" "300"))
                        (list "房间照度" '("300" "500" "200" "100" "75" "50" "30"))
                        (list "灯光通量" '("5000" "2500" "1800"))
                        )
          )
    ;遍历赋值;同(vlax-ldata-put "ddict" "全局比例" '("100" "200" "300") T)
    (vlax-ldata-put "ddict" "popuplst" popuplst T)
    (foreach x popuplst (vlax-ldata-put "ddict" (car x) (cadr x) T))
    (setq 灯具功率 (vlax-ldata-put "ddict" "灯具功率" "56" T))
    )
  ;;显示参数值
  (defun parasetilvalue()
    (foreach x popuplst (showlst (car x) (cadr x)))
    (set_tile "灯具功率" 灯具功率)
    )
  ;;显示列表
  (defun showlst (key lst)               
    (start_list key)
    (mapcar 'add_list lst)
    (end_list)
  )
  ;;更新popuplst列表
  (defun relst (name i lst / oldlst newlst)
    (setq oldlst (cadr(assoc name lst)))
    (setq newlst (cons (nth i oldlst) (vl-remove (nth i oldlst) oldlst) ))
    (setq lst (vl-remove-if '(lambda(x) (= (car x) name)) lst))
    (setq lst (cons (list name newlst) lst))
    lst
    ;(setq popuplst (entmod (subst (cons name newlst) (assoc name lst) lst)))
    )


  ;;内部函数结束
  ;;第一次运行初始化赋值以后则直接获取储存的参数值
  (if (setq popuplst (vlax-ldata-get "ddict" "popuplst" nil T))
    (setq 灯具功率 (vlax-ldata-get "ddict" "灯具功率" nil T))
    (初始设置)
    )
  
  ;建立临时dcl
  (setq tempname (vl-filename-mktemp "temp.dcl") filen (open tempname "w"))
  (foreach stream
    '("paraset:dialog{"
      "\n  label=\"参数设置\";"
      "\n  :popup_list{label=\"全局比例:\"; key=\"全局比例\";}"
      "\n  :popup_list{label=\"房间照度:\"; key=\"房间照度\";}"
      "\n  :popup_list{label=\"灯光通量:\"; key=\"灯光通量\";}"
      "\n  :edit_box{label=\"灯具功率:\"; key=\"灯具功率\";}"
      "\n  :row { :button { label = \"确认\" ; key = \"确认\" ;  is_default = true ;   }\n"
      "    :button { label = \"默认\" ; key = \"默认\" ; }}} \n"
     ; "    :button { key = \"取消\" ; label = \"取消\" ; is_cancel = true ; } } }\n"
     ; ":spacer_1{is_default=true;}}}"
      )
  (princ stream filen));在临时dcl中写入以上数据
  (close filen);关闭文件
  (setq dclname tempname)
  (setq dcl_re (load_dialog dclname)) ;加载临时dcl
  (if (not (new_dialog "paraset" dcl_re)) (exit))
  ;(showpopup)
  (parasetilvalue);显示参数
  ;(showlst "全局比例" 全局比例)
; (action_tile "取消" "(done_dialog)")
  ;(foreach x popuplst (action_tile (car x) "(set (read(car x)) (atoi $value))"))
  (action_tile "全局比例" "(setq 全局比例 (atoi $value))")
  (action_tile "房间照度" "(setq 房间照度 (atoi $value))")
  (action_tile "灯光通量" "(setq 灯光通量 (atoi $value))")
  (action_tile "灯具功率" "(setq 灯具功率 $value)")
  (action_tile "确认" "(done_dialog 1)");定义OK按钮的动作
  (action_tile "默认" "(初始设置)(parasetilvalue)")
  (setq std (start_dialog))
  (unload_dialog dcl_re);卸载
  (vl-file-delete dclname);删除临时dcl文件
  ;;确认后,更新参数值
  (if (= std 1)
    (progn
      ;(setq newpopuplst popuplst)
      ;|(foreach x popuplst (if (not (read (car x)))
                            (setq newpopuplst (relst (car x) (eval(read (car x))) newpopuplst))
                            )
        )|;
      ;(setq popuplst newpopuplst)
      ;(setq popuplst (foreach x popuplst (if (not (read (car x))) (relst (car x) (eval(read (car x))) popuplst))))
      (setq popuplst (relst "全局比例" 全局比例 popuplst))
      (setq popuplst (relst "房间照度" 房间照度 popuplst))
      (setq popuplst (relst "灯光通量" 灯光通量 popuplst))
      (vlax-ldata-put "ddict" "popuplst" popuplst T)
      (foreach x popuplst (vlax-ldata-put "ddict" (car x) (cadr x) T))
      (vlax-ldata-put "ddict" "灯具功率" 灯具功率 T)
      )
    );if
  (princ)
)
发表于 2019-6-26 10:09:04 | 显示全部楼层
非常有帮助,感谢了
发表于 2019-7-19 14:38:09 | 显示全部楼层
有用很好学习了
发表于 2021-11-19 23:28:13 | 显示全部楼层
7年后的今天看见你这个程序受益匪浅啊  写入属性这个很好
发表于 2022-3-26 11:30:42 | 显示全部楼层
本帖最后由 mercio 于 2022-3-26 11:33 编辑

学习一下,怎么写入图里的
vlax-ldata-put (AutoLISP/ActiveX)


Stores LISP data in a drawing dictionary or an object


您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 09:50 , Processed in 0.188015 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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