明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 738|回复: 3

[已解答] 请朋友们帮忙排查一个问题吧,关于dcl控件的

[复制链接]
发表于 2014-12-19 18:04 | 显示全部楼层 |阅读模式
40明经币
本帖最后由 dragoon33333 于 2014-12-19 19:43 编辑

大家好,我已经学习lisp三个月了,这几天编写了一个小程序,程序的代码有一部分是从网上搜的,有一部分自己写的。随着功能的增加,出现了一个错误。自己排查了一下午,没找到问题根源。请大家帮忙排查一下。
这个程序是采用dcl控件设置参数,然后根据桩号、坐标跟相关参数进行自动布桩的,中午的时候基本运行的没问题了,但是没备份,下午添加了一些判断后,直接出错了。
程序启动 tt1

附件: 您需要 登录 才可以下载或查看,没有账号?注册
发表于 2014-12-20 09:49 | 显示全部楼层
  1. (defun c:tt1();此部分是测试代码用
  2. (vl-load-com)
  3. (settc)
  4. (setwz)
  5. (bzform_load)
  6. (princ)
  7. )
  8. (defun bzform_load( / dcl_id Dialog_Return key keys Dcl_File)
  9. (setq dcl_id (load_dialog (setq Dcl_File (Write_Dcl_bzform))));对话框加载
  10. (vl-file-delete Dcl_File);加载后删除DCL文件
  11. (setq Dialog_Return 2)
  12. (while (> Dialog_Return 1);循环控制对话框是否结束
  13.   (new_dialog "bzform" dcl_id);建立窗体
  14. ;-->-->-对话框初始化->-->--
  15.   (setq keys '("Text4" "Command1" "Combo1" "Combo2" "Text1" "Text2" "Check1" "Text3" "Text5" "Check2" "Combo3" "Check3" "Command2" "accept" "cancel" "Command3"))
  16.   (start_list "Combo1");下拉列表 {"Combo1"} 初始化
  17.   (mapcar 'add_list tclist);添加列表项
  18.   (end_list)
  19.   (start_list "Combo2");下拉列表 {"Combo2"} 初始化
  20.   (mapcar 'add_list wzlist);添加列表项
  21.   (end_list)
  22.   (start_list "Combo3");下拉列表 {"Combo3"} 初始化
  23.   (mapcar 'add_list tclist);添加列表项
  24.   (end_list)
  25.   (foreach key keys ;全部控件的初始化
  26.    (if (eval (read (strcat key "_bak"))) (set_tile key (eval (read (strcat key "_bak")))));控件内容
  27.    (mapcar 'set_tile
  28.     '("combo1" "Text5" "Text3" "Text2" "Text1" "combo2" "combo3" "Check1" "Check2" "Check3")
  29.     '("0" "5" "10" "0" "20" "0" "0" "1" "1" "1")
  30.    )
  31.    (action_tile key "(Action_bzform_Keys $$key $$value)");点击动作
  32.   )
  33. ;--<--<-对话框初始化完成-<--<--
  34.   (setq Dialog_Return (start_dialog));开启对话框(用户可见)
  35. )
  36. (unload_dialog dcl_id);退出时卸载对话框
  37. (princ);防止函数回显
  38. )
  39. (defun Action_bzform_Keys (key value);全部控件的点击动作触发
  40. (cond
  41.   ((= key "accept");{确认按钮}
  42.    (Get_bzform_Data)
  43.    (setgd)
  44.    (setjd)
  45.    (setbj)
  46.    (buzhuang)
  47.    (setq tclist nil wzlist nil zdlist nil)
  48.    (redraw)
  49.    (done_dialog 1);对话框退出返回主函数 传递给Dialog_Return值为1
  50.   )
  51.   ((= key "cancel");{取消按钮}
  52.    (setq tclist nil wzlist nil zdlist nil)
  53.    (done_dialog 0);对话框退出返回主函数 传递给Dialog_Return值为0
  54.   )
  55.   ((= key "Command1"); {"选择"} (按钮)
  56.    (readzh)
  57.   )
  58.   ((= key "Combo1"); {} (下拉列表)
  59.    (if (= "1" (get_tile "Check3"))
  60.     (set_tile "Combo3" (get_tile "Combo1"))
  61.    )
  62.   )
  63.   ((= key "Combo2"); {} (下拉列表)
  64.    ()
  65.   )
  66.   ((= key "Check1"); {"是否绘制圆圈"} (多选按钮)
  67.    ()
  68.   )
  69.   ((= key "Check2"); {"是否绘制中线"} (多选按钮)
  70.    ()
  71.   )
  72.   ((= key "Combo3"); {} (下拉列表)
  73.    (if (/= (get_tile "Combo1") (get_tile "Combo3"))
  74.     (set_tile "Check3" "0")
  75.     (set_tile "Check3" "1")
  76.    )
  77.   )
  78.   ((= key "Check3"); {"图层同桩号"} (多选按钮)
  79.    (if (= "1" (get_tile "Check3"))
  80.     (set_tile "Combo3" (get_tile "Combo1"))
  81.    )
  82.   )
  83.   ((= key "Command2"); {"保存设置"} (按钮)
  84.    ()
  85.   )
  86.   ((= key "Command3"); {"测试按钮"} (按钮)
  87.    (test1)
  88.   )
  89.   ((= key "Text1"); {"高度"} (输入框)
  90.    ()
  91.   )
  92.   ((= key "Text2"); {"旋转角度"} (输入框)
  93.    ()
  94.   )
  95.   ((= key "Text3"); {"圆圈半径"} (输入框)
  96.    ()
  97.   )
  98.   ((= key "Text5"); {"线宽"} (输入框)
  99.    ()
  100.   )
  101. )
  102. )
  103. (defun Get_bzform_Data( / key);临时生成Dcl文件 返回文件名
  104. (foreach key keys
  105.   (set (read (strcat key "_bak")) (get_tile key));每个控件都赋给一个变量 用于下次开启初始化
  106. )
  107. )
  108. (defun Write_Dcl_bzform( / Dcl_File file str);制作dcl控件
  109. (setq Dcl_File (vl-filename-mktemp nil nil ".Dcl"))
  110. (setq file (open Dcl_File "w"))
  111. (foreach str '(
  112.   "bzform:dialog{"
  113.   " label="布桩设置";"
  114.   " :boxed_column{"
  115.   "  label="选择桩点坐标文件";"
  116.   "  :row{"
  117.   "   :edit_box{key="Text4";label="文件路径:";width=50;}"
  118.   "   :button{key="Command1";label="选择";width=4;}"
  119.   "  }"
  120.   " }"
  121.   " :boxed_column{"
  122.   "  label="桩号设置项";"
  123.   "  :row{"
  124.   "   :popup_list{key="Combo1";label="图层:";width=14.55;}"
  125.   "   :popup_list{key="Combo2";label="文字样式:";width=15.75;}"
  126.   "  }"
  127.   "  :row{"
  128.   "   :edit_box{key="Text1";label="高度:";width=6.15;}"
  129.   "   :edit_box{key="Text2";label="旋转角度:";width=4.95;}"
  130.   "   :text{key="Label3";width=16.95;}"
  131.   "  }"
  132.   "  :row{"
  133.   "   :toggle{key="Check1";label="是否绘制圆圈";width=14.55;}"
  134.   "   :edit_box{key="Text3";label="圆圈半径:";width=6.15;}"
  135.   "   :text{key="Label4";width=15.75;}"
  136.   "  }"
  137.   " }"
  138.   " :boxed_column{"
  139.   "  label="中线设置项";"
  140.   "  :row{"
  141.   "   :toggle{key="Check2";label="是否绘制中线";width=14.55;}"
  142.   "   :popup_list{key="Combo3";label="图层:";width=10.95;}"
  143.   "   :toggle{key="Check3";label="图层同桩号";width=12.15;}"
  144.   "   :edit_box{key="Text5";label="线宽:";width=6.15;}"
  145.   "  }"
  146.   " }"
  147.   " :row{"
  148.   "  :button{key="Command2";label="保存设置";width=9.75;}"
  149.   "  :button{key="accept";label="确定";width=13.35;is_default=true;}"
  150.   "  :button{key="cancel";label="取消";width=13.35;is_cancel=true;}"
  151.   "  :button{key="Command3";label="测试控件";width=9.75;}"
  152.   " }"
  153.   "}"
  154.   )
  155.   (write-line str file)
  156. )
  157. (close file)
  158. Dcl_File
  159. )
  160. (defun readzh ( / pe fel);打开txt文件获取其中坐标成表
  161. (setq path (getfiled "打开坐标文件" "C:/Users/anmeng/Desktop/" "txt" 0))
  162. (setq screw_list nil)
  163. (if path (progn
  164.   (setq pe (open path "r"))
  165.   (setq fel T)
  166.   (while (/= fel nil)
  167.    (setq fel (read-line pe))
  168.    (setq screw_list (cons fel screw_list))
  169.   )
  170.   (close pe)
  171.   (setq screw_list (cdr (reverse (cdr screw_list))))
  172. )
  173.   (if (= nil (get_tile "Text4")) (alert "请选取坐标文件")
  174.   (progn
  175.    (setq pe (open (get_tile "Text4") "r"))
  176.    (setq fel T)
  177.    (while (/= fel nil)
  178.     (setq fel (read-line pe))
  179.     (setq screw_list (cons fel screw_list))
  180.    )
  181.    (close pe)
  182.    (setq screw_list (cdr (reverse (cdr screw_list))))
  183.   ))
  184. )
  185. (set_tile "Text4" path)
  186. )
  187. (defun test1 ()
  188. (setq abh (get_tile "combo1"))
  189. (alert abh)
  190. (setq abi (get_tile "combo2"))
  191. (alert abi)
  192. (setq abj (get_tile "combo3"))
  193. (alert abj)
  194. (setq wztc (nth (read (get_tile "Combo1")) tclist))
  195. (alert wztc)
  196. )
  197. (defun setgd ();获取文字高度
  198. (if (= nil (get_tile "Text1"))
  199.   (setq gd (atof Text1_bak))
  200.   (setq gd (atof (get_tile "Text1")))
  201. )
  202. )
  203. (defun setjd ();获取文字旋转角度
  204. (if (= nil (get_tile "Text2"))
  205.   (setq jd Text2_bak)
  206.   (setq jd (get_tile "Text2"))
  207. )
  208. )
  209. (defun setbj ();获取圆圈半径
  210. (if (= nil (get_tile "Text3"))
  211.   (setq bj (atof Text3_bak))
  212.   (setq bj (atof (get_tile "Text3")))
  213. )
  214. )
  215. (defun settc ( / tc tcm);获取图层集合的表
  216. (vlax-for tcm (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
  217. (progn
  218.   (setq tc (vla-get-name tcm))
  219.   (setq tclist (cons tc tclist))
  220. ))
  221. (setq tclist (reverse tclist))
  222. )
  223. (defun setwz ( / wz wzm);获取文字样式集合的表
  224. (vlax-for wzm (vla-get-textstyles (vla-get-activedocument (vlax-get-acad-object)))
  225. (if (/= (vla-get-name wzm) "Annotative")
  226. (progn
  227. (setq wz (vla-get-name wzm))
  228. (setq wzlist (cons wz wzlist))
  229. )))
  230. (setq wzlist (reverse wzlist))
  231. )
  232. (defun buzhuang()
  233. (setq wztc (nth (read (get_tile "Combo1")) tclist))
  234. (setq wzys (nth (read (get_tile "Combo2")) wzlist))
  235. (foreach pt0 screw_list;按每个点写桩号
  236.   (setq pt1 (parse pt0 "\t"))
  237.   (entmake (append (list '(0 . "MTEXT") '(100 . "AcDbEntity") '(100 . "AcDbMText") (cons 50 (angtof jd 0)) (cons 1 (car pt1)) (cons 7 wzys) (cons 40 gd) (cons 8 wztc) (list 10 (distof (cadr pt1) 2) (distof (caddr pt1) 2) 0)))
  238.   )
  239.   (if (= "1" (get_tile "Check1"));如果选中画圈复选框,则画圈
  240.   (entmake (append (list '(0 . "CIRCLE") '(100 . "AcDbEntity") '(100 . "AcDbCircle") (cons 40 bj) (cons 8 wztc) (list 10 (distof (cadr pt1) 2) (distof (caddr pt1) 2) 0)))
  241.   )
  242. )
  243. )
  244. (if (= "1" (get_tile "Check2"));如果选中画线复选框,则画线
  245. (progn
  246.   (setq zxz (atof (get_tile "Text5")))
  247.   (foreach zd screw_list
  248.    (setq zd1 (parse zd "\t"))
  249.    (setq zd2 (list 10 (distof (cadr zd1) 2) (distof (caddr zd1) 2)))
  250.    (setq zdlist (cons zd2 zdlist))
  251.   )
  252.   (entmake (append (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 43 zxz) (cons 90 (length screw_list)) (cons 8 wztc)) zdlist)
  253.   )
  254. ))
  255. )
  256. (defun parse (str delim / lst pos);以字符截断字符串

  257. (while (setq pos (vl-string-search delim str))
  258.   (setq lst (cons (substr str 1 pos) lst)
  259.         str (substr str (+ pos 2)))
  260. )
  261. (if (> (strlen str) 0)
  262.   (setq lst (cons str lst))
  263. )
  264. (reverse lst)
  265. )
回复

使用道具 举报

 楼主| 发表于 2014-12-20 10:17 | 显示全部楼层
ZZXXQQ 发表于 2014-12-20 09:49

谢谢版主,已经排查出来了,是(princ)的问题。
然后在功能完善的过程中,还有句代码过不了“(list 10 (+ (* 2 bj) (distof (cadr pt1))) 2)”,
麻烦您帮忙看看这句代码有问题吗?
回复

使用道具 举报

 楼主| 发表于 2014-12-20 10:48 | 显示全部楼层
ZZXXQQ 发表于 2014-12-20 09:49

已经解决了,闭括号放错位置了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 06:47 , Processed in 0.197525 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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