明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2045|回复: 7

[已解答] 请教用lisp调用DCL单选键值后,程序无法正常运行。

[复制链接]
发表于 2016-1-1 07:55:40 | 显示全部楼层 |阅读模式
一下是程序:

(defun c:aa()
        (setq cmdmode (getvar "cmdecho"))
        (setvar "cmdecho" 0)

  (if (= (tblsearch "layer" "0_RDCAD") nil)
    (command "layer" "n" "0_RDCAD" "c" "2" "0_RDCAD" "")
    )
(if (= (tblsearch "layer" "1_RDCAD") nil)
    (command "layer" "n" "1_RDCAD" "c" "3" "1_RDCAD" "")
    )
(if (= (tblsearch "layer" "2_RDCAD") nil)
    (command "layer" "n" "2_RDCAD" "c" "1" "2_RDCAD" "")
    )
(if (= (tblsearch "layer" "3_RDCAD") nil)
    (command "layer" "n" "3_RDCAD" "c" "4" "3_RDCAD" "")
    )
(if (= (tblsearch "layer" "4_RDCAD") nil)
    (command "layer" "n" "4_RDCAD" "c" "7" "4_RDCAD" "")
    )
          (dcl_ganlu)
        (prin1)
)


(defun dcl_ganlu()
     (setq dcl_id (load_dialog "gan.dcl"))       
        (new_dialog "NextSetting" dcl_id)
        (def_ganlu)
        (action_tile "bilihuizhi" "(setq ddtype 1)")
        (action_tile "dengjuhuizhi" "(setq ddtype 2)")
          (action_tile "xinjian" "(setq ddtype 3)")
          (action_tile "yuanyou" "(setq ddtype 4)")
          (action_tile "chaichu" "(setq ddtype 5)")
        (action_tile "accept" "(ok_bili)")
        (setq dd (start_dialog))
        (if (= dd 1)
          (draw_ganlu)
          )
    (unload_dialog dcl_id)
)

(defun def_ganlu()
  (if (= bl_draw nil)
    (set_tile "bili_draw" "4000")
    (set_tile "bili_draw" (rtos bl_draw))
  )
)
(defun ok_bili()
  (setq bl_draw (atof (get_tile "bili_draw")))
  (done_dialog 1)
)



(DEFUN draw_ganlu ()
  (setq ls 2.25 ;设定直线上面的字偏离直线的距离为ls
        zg 2.5 ;设定字高zg
        r 1.5)               ;电杆半径
  (command "-style" "Standard" "" 0 "" "" "" "" "")    ;切换到默认的字体
  (graphscr) ;切换到图形窗口
  (setq oce (getvar "cmdecho"))  
  (setvar "cmdecho" 0)
  (setq bl bl_draw
  ;(setq bl (getint "\n请输入比例<推荐4000>,1:")
        p1 (getpoint "\n杆路的起点:")         
  )
(setq osm (getvar "osmode"))  ;储存对象捕捉的系统变量
(setvar "osmode" 0)           ;关闭对象捕捉
(while (setq a1 (getangle p1 "\n杆路的方向<右键退出/Esc退出>:"))   
(while (setq len (getdist "\n请输入杆距<米>:"))
(while ((= ddtype 1) (SETQ d (/ (* len 1000) bl))))
(while ((= ddtype 2) (SETQ d 15)))
;(setq  d (SETQ d 15))
; (setq  d (/ (* len 1000) bl))
(setq
    p2 (polar p1 a1 d)     ;计算p2的坐标   
    p11 (polar P1 a1 r)
    p22 (polar p1 a1 (- d r))
    p3 (list (/ (+ (car p1) (car p2)) 2.0) (/ (+ (cadr p1) (cadr p2)) 2.0)) ;计算p1p2的中点p3的坐标
)
(PROGN
                  (cond ((= ddtype 3) (command "layer" "s" "1_RDCAD" "")
                                       (command "pline" p11 "w" 0.5 0.5 p22 "")
                                    (command ".circle" p2 r))
                       ((= ddtype 4) (command "layer" "s" "0_RDCAD" "")
                                    (command "pline" p11 "w" 0.25 0.25 p22 "")
                                    (command ".circle" p2 r))
                        ((= ddtype 5) (command "layer" "s" "3_RDCAD" "")
                                    (command "pline" p11 "w" 0.2 0.2 p22 "")
                                    (command ".circle" p2 r))
    ))



; (command ".line" p11 p22 "")
; (command ".circle" p2 r)

(if (and  (> a1 (* pi 0.5))(< a1 (* pi 1.5)))
    (setq a2 (angle p2 p1))
    (setq a2 a1)
)
(setq
     p5 (polar p3 (+ a2 (/ pi 2)) ls) ;计算直线上面的文字位置
)
  (command "layer" "s" "0" "")
  (command ".text" "m" p5 zg (/ (* a2 180) pi) (rtos len 2 1)) ;以中央对齐的方式写直线上面的字:米
  (setq p1 p2)                  
)      
)      
(setvar "osmode" osm)         
(setvar "cmdecho" oce)
  (princ)
)

一下是DCL文件:
NextSetting : dialog{
      label = "杆路绘制设置";
  :row{
         :boxed_row{
                label="间距绘制方式";
                :radio_column{
                                key="ratio1";
                                :radio_button{label="按比例绘制"; key="bilihuizhi";}
                                :radio_button{label="等间距绘制"; key="dengjuhuizhi";}
                        spacer_1;
                        spacer_1;
                }
                :column{
                        :edit_box{label="比例 1:";key="bili_draw";edit_width=6;}
                        :text{label="15"; key="valRatio2";}
                        spacer_1;
                        spacer_1;
                        }
                }
:boxed_column{
     label="布放类别";
                :radio_column{
                                :radio_button{label="新建"; key="xinjian";}
                                :radio_button{label="原有"; key="yuanyou";}
                                :radio_button{label="拆除"; key="chaichu";}

                       
                }

                        }


               
}         
  ok_cancel;

}

现在的问题是:
(while ((= ddtype 1) (SETQ d (/ (* len 1000) bl))))
(while ((= ddtype 2) (SETQ d 15)))
;(setq  d (SETQ d 15))
; (setq  d (/ (* len 1000) bl))

我把这个改为(setq  d (SETQ d 15))或者(setq  d (/ (* len 1000) bl))后程序可以运行,但是加了选择后程序就无法运行了。请教这个程序该怎么修改。
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2016-1-1 19:34:28 | 显示全部楼层
  1. (defun c:aa()
  2.   (setq cmdmode (getvar "cmdecho"))
  3.   (setvar "cmdecho" 0)
  4.   (command "layer" "m" "0_RDCAD" "c" "2" "" "")
  5.   (command "layer" "m" "1_RDCAD" "c" "3" "" "")
  6.   (command "layer" "m" "2_RDCAD" "c" "1" "" "")
  7.   (command "layer" "m" "3_RDCAD" "c" "4" "" "")
  8.   (command "layer" "m" "4_RDCAD" "c" "7" "" "")
  9.   (dcl_ganlu)
  10.   (prin1)
  11. )
  12. (defun dcl_ganlu()
  13. (if (> (setq dcl_id (load_dialog "gan.dcl")) 0) (progn
  14.   (if (new_dialog "NextSetting" dcl_id) (progn
  15.    (def_ganlu)
  16.    (action_tile "bilihuizhi" "(setq ddtype 1)")
  17.    (action_tile "dengjuhuizhi" "(setq ddtype 2)")
  18.    (action_tile "xinjian" "(setq ddtype 3)")
  19.    (action_tile "yuanyou" "(setq ddtype 4)")
  20.    (action_tile "chaichu" "(setq ddtype 5)")
  21.    (action_tile "accept" "(ok_bili)(done_dialog 1)")
  22.    (setq dd (start_dialog))
  23.   )
  24.    (princ "\n无法显示对话框!")
  25.   )
  26.   (unload_dialog dcl_id)
  27. )
  28.   (princ "\n无法加载对话框!")
  29. )
  30. (if (= dd 1) (draw_ganlu))
  31. )
  32. (defun def_ganlu ()
  33.   (set_tile "bili_draw" (if bl_draw (rtos bl_draw 2) "4000"))
  34. )
  35. (defun ok_bili ()
  36. (setq bl_draw (atof (get_tile "bili_draw")))
  37. )
  38. (defun draw_ganlu ()
  39.   (setq ls 2.25 ;设定直线上面的字偏离直线的距离为ls
  40.         zg 2.5 ;设定字高zg
  41.         r 1.5) ;电杆半径
  42.   (setvar "TEXTSTYLE" "Standard")    ;切换到默认的字体
  43.   (graphscr) ;切换到图形窗口
  44.   (setq oce (getvar "cmdecho"))  
  45.   (setvar "cmdecho" 0)
  46.   (setq bl bl_draw
  47.   ;(setq bl (getint "\n请输入比例<推荐4000>,1:")
  48.         p1 (getpoint "\n杆路的起点:")         
  49.   )
  50.   (setq osm (getvar "osmode"))  ;储存对象捕捉的系统变量
  51.   (setvar "osmode" 0)           ;关闭对象捕捉
  52.   (while (setq a1 (getangle p1 "\n杆路的方向<右键退出/Esc退出>:"))   
  53.    (while (setq len (getdist "\n请输入杆距<米>:"))
  54.     (if (= ddtype 1) (SETQ d (/ (* len 1000) bl)))
  55.     (if (= ddtype 2) (SETQ d 15))
  56. ;(setq d (SETQ d 15))
  57. ; (setq d (/ (* len 1000) bl))
  58.     (setq p2 (polar p1 a1 d)     ;计算p2的坐标   
  59.           p11 (polar P1 a1 r)
  60.           p22 (polar p1 a1 (- d r))
  61.           p3 (list (/ (+ (car p1) (car p2)) 2.0) (/ (+ (cadr p1) (cadr p2)) 2.0)) ;计算p1p2的中点p3的坐标
  62.     )
  63.     (cond
  64.      ((= ddtype 3)
  65.       (command "layer" "s" "1_RDCAD" "")
  66.       (command "pline" p11 "w" 0.5 0.5 p22 "")
  67.       (command ".circle" p2 r)
  68.      )
  69.      ((= ddtype 4)
  70.       (command "layer" "s" "0_RDCAD" "")
  71.       (command "pline" p11 "w" 0.25 0.25 p22 "")
  72.       (command ".circle" p2 r)
  73.      )
  74.      ((= ddtype 5)
  75.       (command "layer" "s" "3_RDCAD" "")
  76.       (command "pline" p11 "w" 0.2 0.2 p22 "")
  77.       (command ".circle" p2 r)
  78.      )
  79.     )
  80. ; (command ".line" p11 p22 "")
  81. ; (command ".circle" p2 r)
  82.     (if (< (* pi 0.5) a1 (* pi 1.5))
  83.      (setq a2 (angle p2 p1))
  84.      (setq a2 a1)
  85.     )
  86.     (setq p5 (polar p3 (+ a2 (/ pi 2)) ls)) ;计算直线上面的文字位置
  87.     (command "layer" "s" "0" "")
  88.     (command ".text" "m" p5 zg (/ (* a2 180) pi) (rtos len 2 1)) ;以中央对齐的方式写直线上面的字:米
  89.     (setq p1 p2)                  
  90.    )
  91.   )
  92.   (setvar "osmode" osm)         
  93.   (setvar "cmdecho" oce)
  94.   (princ)
  95. )
 楼主| 发表于 2016-1-1 21:40:05 | 显示全部楼层
Z版,程序还是不行,提示: 错误: 参数类型错误: numberp: nil,把(if (= ddtype 1) (SETQ d (/ (* len 1000) bl)))和    (if (= ddtype 2) (SETQ d 15))这两行屏蔽掉改为(setq d (SETQ d 15))或者 (setq d (/ (* len 1000) bl)),程序就可以运行,不过只有对于的功能。
发表于 2016-1-3 19:18:31 | 显示全部楼层

本帖子中包含更多资源

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

x
发表于 2016-1-4 09:40:21 来自手机 | 显示全部楼层
楼主也做通信的吗?哈哈
发表于 2016-1-4 09:43:06 来自手机 | 显示全部楼层
你这个程序做的有点死,比如杆子高度,电杆直径
 楼主| 发表于 2016-1-4 14:40:21 来自手机 | 显示全部楼层
rdhhb 发表于 2016-1-4 09:43
你这个程序做的有点死,比如杆子高度,电杆直径

你也是做通信的?你有好的程序发来用用呗。
发表于 2016-1-6 20:05:23 | 显示全部楼层
发个图片给你看看

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-5-21 00:55 , Processed in 0.602137 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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