明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1511|回复: 5

[已解答] 请教调用子程序的问题。

[复制链接]
发表于 2014-3-27 07:57 | 显示全部楼层 |阅读模式
原有程序有很多参数是相同的,是通过菜单宏命令调用的,现在想改为带DCL文件的,这样可以完全用命令调用,问题是,不知道该如何改写调用参数的子程序。
下面是源文件:
(defun c:ysyl()
        (setq cmdmode (getvar "cmdecho"))
        (setvar "cmdecho" 0)
          (dcl_yl)
        (prin1)
)
(defun dcl_yl()
        (setq dcl_id (load_dialog "yl.dcl"))       
        (new_dialog "yl" dcl_id)
        (def_ysyl)
        (action_tile "新建圆形电杆引上管" "(setq ddtype 1) (ok_ysyl)")
        (action_tile "原有圆形电杆引上管" "(setq ddtype 2) (ok_ysyl)")
        (action_tile "新建三角电杆引上管" "(setq ddtype 3) (ok_ysyl)")
        (action_tile "原有三角电杆引上管" "(setq ddtype 4) (ok_ysyl)")
        (action_tile "新设预留" "(setq ddtype 5) (ok_ysyl)")
        (action_tile "accept" "(ok_ysyl)")
        (setq dd (start_dialog))
        (if (= dd 1) (draw_ysyl))
    (unload_dialog dcl_id)

)
(defun def_ysyl()
        (if (= bl_ysyl nil)
        (set_tile "bili" "1")
        (set_tile "bili" (rtos bl_ysyl)))
        (setq sldkey_list '("新建圆形电杆引上管" "原有圆形电杆引上管" "新建三角电杆引上管" "原有三角电杆引上管" "新设预留"))
        (setq sld_list '("新建圆形电杆引上管" "原有圆形电杆引上管" "新建三角电杆引上管" "原有三角电杆引上管" "新设预留"))
        (mapcar 'show_sld sldkey_list sld_list)
          (setq ddtype 1)
        (mode_tile "新建三角电杆引上管" 3)
)


(defun show_sld(key sld)
        (setq x (dimx_tile key))
        (setq y (dimy_tile key))
        (start_image key)
        (fill_image 0 0 x y -2)
        (slide_image 0 0 x y  sld)
        (end_image)
)
(defun ok_ysyl()
        (setq bl_ysyl (atof (get_tile "bili")))
        (done_dialog 1)
)

(defun draw_ysyl()
        (setvar "cmdecho" 0)
        (command "layer" "s" "0" "")
        (setq pt0 (getpoint "\n 请输入插入点:"))
   (if (= pt0 nil)
     quit       
(progn
    (setq pt0 (list (car pt0) ( cadr pt0)))
        (setq r0 (/ (* (getangle pt0 "\n 请输入旋转角度值:") 180) pi))
        (cond ((= ddtype 1) (command "insert" "新建圆形电杆引上管" "x" bl_ysyl "y" bl_ysyl "r" r0 pt0 ))
              ((= ddtype 2) (command "insert" "原有圆形电杆引上管" "x" bl_ysyl "y" bl_ysyl "r" r0 pt0))
              ((= ddtype 3) (command "insert" "新建三角电杆引上管" "x" bl_ysyl "y" bl_ysyl "r" r0 pt0))
              ((= ddtype 4) (command "insert" "原有三角电杆引上管" "x" bl_ysyl "y" bl_ysyl "r" r0 pt0))
              ((= ddtype 5) (command "insert" "新设预留" "x" bl_ysyl "y" bl_ysyl "r" r0 pt0))
         )
        (draw_ysyl)
    )

(setvar "CMDECHO" cmdmode)
        (prin1)
)

需要调用的子程序:
;;;hxn--需要指定绘制点(H),旋转方向(X),不进行块分解(N).
(defun c:hxn ()
  (setvar "cmdecho" 0)
  (command "insert" a "s" "1")
  (princ "\n请指定绘制点:")
  (command pause)
  (princ "\n请指定旋转方向(0):")
  (command pause)
  (princ)
) ;_ 结束defun

想把(defun draw_ysyl()这个里面改为调用hxn这个子程序。请问该如何修改。
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-3-27 09:36 | 显示全部楼层
改一下:(defun c:hxn ()=>(defun draw_ysyl()
然后把(defun draw_ysyl()这个子程序全去掉
试试.
 楼主| 发表于 2014-3-29 15:13 | 显示全部楼层
(defun c:hxn ()=>(defun draw_ysyl()
这句在什么地方修改?
 楼主| 发表于 2014-4-1 06:40 | 显示全部楼层
将(defun draw_ysyl()
        (setvar "cmdecho" 0)
        (command "layer" "s" "0" "")
        (setq pt0 (getpoint "\n 请输入插入点:"))
   (if (= pt0 nil)
     quit        
(progn
    (setq pt0 (list (car pt0) ( cadr pt0)))
        (setq r0 (/ (* (getangle pt0 "\n 请输入旋转角度值:") 180) pi))
        (cond ((= ddtype 1) (command "insert" "新建圆形电杆引上管" "x" bl_ysyl "y" bl_ysyl "r" r0 pt0 ))
              ((= ddtype 2) (command "insert" "原有圆形电杆引上管" "x" bl_ysyl "y" bl_ysyl "r" r0 pt0))
              ((= ddtype 3) (command "insert" "新建三角电杆引上管" "x" bl_ysyl "y" bl_ysyl "r" r0 pt0))
              ((= ddtype 4) (command "insert" "原有三角电杆引上管" "x" bl_ysyl "y" bl_ysyl "r" r0 pt0))
              ((= ddtype 5) (command "insert" "新设预留" "x" bl_ysyl "y" bl_ysyl "r" r0 pt0))
         )
        (draw_ysyl)
    )

(setvar "CMDECHO" cmdmode)
        (prin1)
)

修改为
(defun draw_ysyl(/ a)
        (setvar "cmdecho" 0)
        (command "layer" "s" "0" "")
     (progn
      (cond  ((= ddtype 1)(setq a "新建三角电杆引上管")( c:hxn ))
             ((= ddtype 2)(setq a "原有三角电杆引上管")( c:hxn ))
             ((= ddtype 3) (setq a "新建圆形电杆引上管")( c:hnn ))
                 ((= ddtype 4) (setq a "原有圆形电杆引上管")( c:hnn ))
                 ((= ddtype 5) (setq a "新设预留")( c:hxn ))
         )
      (draw_ysyl)
  )
(setvar "CMDECHO" cmdmode)
        (prin1)
)
可以成功调用。就是不知道还有没有更简单的方法
发表于 2014-4-1 08:04 | 显示全部楼层
本帖最后由 ZZXXQQ 于 2014-4-1 08:24 编辑
  1. (defun c:ysyl()
  2.   (setq cmdmode (getvar "cmdecho"))
  3.   (setvar "cmdecho" 0)
  4.   (dcl_yl)
  5.   (prin1)
  6. )
  7. (defun dcl_yl()
  8.   (if (> (setq dcl_id (load_dialog "yl.dcl")) 0) (progn
  9.    (if (new_dialog "yl" dcl_id) (progn
  10.     (def_ysyl)
  11.     (action_tile "新建圆形电杆引上管" "(setq ddtype 1) (ok_ysyl)")
  12.     (action_tile "原有圆形电杆引上管" "(setq ddtype 2) (ok_ysyl)")
  13.     (action_tile "新建三角电杆引上管" "(setq ddtype 3) (ok_ysyl)")
  14.     (action_tile "原有三角电杆引上管" "(setq ddtype 4) (ok_ysyl)")
  15.     (action_tile "新设预留" "(setq ddtype 5) (ok_ysyl)")
  16.     (action_tile "accept" "(ok_ysyl)")
  17.     (setq dd (start_dialog))
  18.    )
  19.     (princ "\n无法显示对话框!")
  20.    )
  21.    (unload_dialog dcl_id)
  22. )
  23.   (princ "\n无法加载对话框!")
  24. )
  25. (if (= dd 1) (draw_ysyl))
  26. )
  27. (defun def_ysyl()
  28.   (if (= bl_ysyl nil)
  29.   (set_tile "bili" "1")
  30.   (set_tile "bili" (rtos bl_ysyl)))
  31.   (setq sldkey_list '("新建圆形电杆引上管" "原有圆形电杆引上管" "新建三角电杆引上管" "原有三角电杆引上管" "新设预留"))
  32.   (setq sld_list '("新建圆形电杆引上管" "原有圆形电杆引上管" "新建三角电杆引上管" "原有三角电杆引上管" "新设预留"))
  33.   (mapcar 'show_sld sldkey_list sld_list)
  34.   (setq ddtype 1)
  35.   (mode_tile "新建三角电杆引上管" 3)
  36. )
  37. (defun show_sld(key sld)
  38.   (setq x (dimx_tile key))
  39.   (setq y (dimy_tile key))
  40.   (start_image key)
  41.   (fill_image 0 0 x y -2)
  42.   (slide_image 0 0 x y  sld)
  43.   (end_image)
  44. )
  45. (defun ok_ysyl()
  46.   (setq bl_ysyl (atof (get_tile "bili")))
  47.   (done_dialog 1)
  48. )
  49. (defun draw_ysyl()
  50.   (setvar "cmdecho" 0)
  51.   (setvar "clayer" "0")
  52.   (while (setq pt0 (getpoint "\n 请输入插入点:"))
  53. ;    (setq r0 (/ (* (getangle pt0 "\n 请输入旋转角度值:") 180) pi))
  54.     (command "-insert" (nth (1- ddtype) sld_list) pt0 bl_ysyl "" PAUSE)
  55.   )
  56.   (setvar "CMDECHO" cmdmode)
  57.   (prin1)
  58. )
 楼主| 发表于 2014-4-3 06:25 | 显示全部楼层
本帖最后由 lxdz443 于 2014-4-3 06:26 编辑

如果我现在需要把ok_ysyl这个子程序去掉,并需要保留单击图片就可以选择,不需要双击图片后才能做出选择,我现在把ok_ysy这个子程序注释掉后,只能双击图片才能调用相关key值。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-7 01:04 , Processed in 0.179046 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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