明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2782|回复: 6

我调试的autolisp程序运行不稳定,怎么解决?

[复制链接]
发表于 2003-11-10 10:38:00 | 显示全部楼层 |阅读模式
最近,我开始学习autolisp,第一个例子,我做的是AutoCAD里的花园小径,在做到第五课之前,我基本都自己输入书上的源程序,而且调试通过。但在第五课,我发现程序加载没有问题,但是运行出现错误,提示为:“错误: 参数类型错误: stringp ni”
所以,我改用cad自带的turorial里面leson5里面的程序,同样在运行时出现这个错误,但花园小径的教材上说,到这课程序基本完成,能够实现课程开始提出的问题。所以,请文问过这个程序的朋友们,你们在学习过程中是否出现这个问题以及你们是怎么解决的?

第二个例子是《AutoCAD 2002 定制与开发》(清华大学出版社 郭朝勇等编著)上的绘制楼梯的程序,该程序我基本条是通过,但是在调试中发现运行不稳定,比如绘制台阶时,有时出现绘制的是斜线,还有填充,本应该填充砖墙,可有时填充的是别的短竖线。这两个问题在所绘制的楼梯在屏幕上显示很小时发生的几率高。还有原教材上有(setvar "cmdecho" 0)设置系统参数,但在调试中提示系统不允许修改,这跟问题有关吗?如果有关怎么解决呢?

朋友们,请帮帮我,我会非常感激的。
发表于 2003-11-10 11:52:00 | 显示全部楼层
你说的这些问题应该说完全可以排除系统不稳定的可能,因为都是一些常见的问题,是你的程序不正确。
你可以将你调试出错的程序贴上来,看看是哪儿出了问题。因为这些是常见的错误提示,无法具体说明错在哪儿
 楼主| 发表于 2003-11-10 12:12:00 | 显示全部楼层
;下面是c:ladder.lsp程序文件
;------------------------------------------------------------------
;  This function enable you to draw the outline of the staircase   
;------------------------------------------------------------------

(defun calculate_draw(pt_start stair_L        stair_H          stair_N   /
                              pt_Corner        pt_top          pt0            pt1
                              pt2        i          stepWidth stepHeight
                             )
    ;计算楼梯的其他绘图参数
    (setq pt_corner (POLAR pt_start 0.0 stair_L))
    (setq pt_top (POLAR pt_corner (/ pi 2.0) stair_H))
    (setq stepWidth (/ stair_L stair_N)
          stepHeight (/ stair_H stair_N)
    )
    (command "LINE" pt_start pt_corner pt_top "")
    (setq i 1)
    (setq pt0 pt_start)
    (while (<= i stair_N)
        (setq pt1 (POLAR pt0 (/ pi 2.0) stepHeight))
        (setq pt2 (POLAR pt1 0.0 stepWidth))
        (command "line" pt0 pt1 pt2 "")
        (setq pt0 pt2)
        (setq i (+ 1 i))
    )
)

;------------------------------------------------------------------
;  This function will hatch the area of the staircase with brick
;------------------------------------------------------------------

(defun lt_wall (p1 p2)
    (command "hatch" "BRICK" 10 0 "w" p1 p2 "")
    (command "zoom" "A")
)

;------------------------------------------------------------------
;  The defination of the initial image of the staircase            
;------------------------------------------------------------------

(defun initimg(image sld)
    (start_image image)
    (slide_image 0 0 (dimx_tile image)(dimy_tile image) sld)
    (end_image)
)

;------------------------------------------------------------------
;  The initailization of the parent dialogbox
;------------------------------------------------------------------

(defun dlg1 ()
    (initimg "ladder1" "ladder1")
    (set_tile "L" (rtos L 2 2))
    (set_tile "H" (rtos H 2 2))
    (set_tile "N" (rtos N 2 2))
    (action_tile "base" "(getdata1)(dlg2)")
    (action_tile "accept" "(getdata1)(done_dialog 1)")
    (action_tile "cancel" "(done_dialog 0)")
)


;------------------------------------------------------------------
;  This initialization of the child dialogbox   
;------------------------------------------------------------------

(defun dlg2 ()
    (if        (not (new_dialog "base_pt" id))
        (exit)
    )                                        ;
    (initimg "ladder2" "ladder2")
    (set_tile "x" (rtos x 2 2))
    (set_tile "y" (rtos y 2 2))
    (action_tile "pick" "(done_dialog 2)")
    (action_tile "accept" "(getdata2)(done_dialog 3)")
    (action_tile "cancel" "(done_dialog 4)")
    (setq what (start_dialog))
    (if        (= what 2)
        (done_dialog 2)
    )
)

;------------------------------------------------------------------
;  Get Datas from the parent dialogbox  
;------------------------------------------------------------------

(defun getdata1        ()
    (setq L (atof (get_tile "L")))
    (setq H (atof (get_tile "H")))
    (setq N (atof (get_tile "N")))
)


;------------------------------------------------------------------
; Get data from the child dialogbox   
;------------------------------------------------------------------

(defun getdata2        ()
    (setq x (atof (get_tile "x")))
    (setq y (atof (get_tile "y")))
)

;------------------------------------------------------------------
; The main function
;------------------------------------------------------------------
  
(defun c:ladder        (/ pt_base L H N what id x y pt_corner pt_top)
    (setvar "cmdecho" 0)
    (setq id (load_dialog "ladder"))
    (setq what 3
          L 1500
          H 1000
          N 20
          x 80
          y 50
    )
    (while (> what 1)
        (if (not (new_dialog "ladder" id))
            (exit)
        )
        (dlg1)
        (if (= what 2)
            (dlg2)
        )
        (if (/= what 2)
            (setq what (start_dialog))
        )
        (if (= what 2)
            (progn
                (initget 1)
                (setq pt_base (getpoint "\n楼梯左下角点位置:"))
                (setq x        (car pt_base)
                      y        (cadr pt_base)
                )
            )
        )
    )
    (setq pt_base (list x y))
    (if(= what 1)
        (progn
            (setq pt_corner (POLAR pt_base 0.0 L))
            (setq pt_top (POLAR pt_corner (/ pi 2.0) H))
            (calculate_draw pt_base L H N)
            
            (lt_wall pt_base pt_top)
        )
    )
    (unload_dialog id)
    (princ "\nddladder.lsp程序已调入,键入ladder绘制楼梯.")
    (princ)
)
;;;下面是对话框ladder.dcl程序文件
/*ladder.dcl*/
ladder:dialog{
label="楼梯参数设置";
:row{
        :image{width=35;
                height=9;
                key="ladder1";
                color=-2;
                }
        :column{:edit_box{label="总长度(L)";
                                key="L";
                        }
                :edit_box{label="总高度(H)";
                                key="H";
                        }
                :edit_box{label="楼梯台阶级数(N)";
                                key="N";
                        }
                :button{label="楼梯左下角点...";
                                key="base";
                        }
                }
        }
ok_cancel;
}
base_pt:dialog{
        label="确定楼梯的左下角点";
        :row{
                :image{width=20;
                        height=4;key="ladder2";color=-2;
                        }
                :boxed_column{label="左下角点";
                                :button{label="光标拾取<";
                                        key="pick";
                                        }
                                :edit_box{label="x坐标=";
                                          key="x";
                                          }
                                :edit_box{label="y坐标=";
                                          key="y";
                                          }          
                                }
        }
        ok_cancel;
        }

;还有两个幻灯片文件
发表于 2003-11-10 12:28:00 | 显示全部楼层
你说的第一个错误我这里没有出现,程序一直运行正常。
关于那个填充的问题,主要是选择物体时用了‘W’,窗选,如果窗选中的点PT1 PT2有一点在屏幕外面,就无法选中全部对象。
你将屏幕缩小,使之能放下整个画好的梯子,而且屏幕里最好不要有别的对象,你这样再试试。
刚开始学,遇到很多问题是很正常的,慢慢来,等你熟练以后就会好了
发表于 2003-11-10 20:03:00 | 显示全部楼层
没办法!一定要用心一行一行的看,以后碰到的问题还要多还要烦,不过多做以后经验多了,找出问题回愈来愈快的。
发表于 2003-11-11 03:52:00 | 显示全部楼层
经验!
经验多重要!如果你不知道,PLEASE PLAY GAMES。
 楼主| 发表于 2003-11-11 17:33:00 | 显示全部楼层
谢谢,meflying说的对,错误就是在那种情况下发生的,我没有注意到原因是这个。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-27 06:14 , Processed in 0.156018 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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