45448767 发表于 2011-6-17 23:12

关于 lisp 的编程 问题 谢谢

(define c:ABC() (vl-load-com) (command "setvar""osmode""0")
(setq p1 (getpoint "\n确定第一个点,\n")) (if(/=p1 null)(command "point" """" p1))
(setq p2 (getpoint p1 "\n 确定第二个点,\n"))
(command "line" p1 p2 "" )
(setq p3 (getpoint p2 "\n 确定第三个点,\n")) (command"line" p2 p3 "")
(command"line" p1 p3 "")
(command"circle""3p" p1,p2,p3) )


请问下这个程序能否 根据 3个点 画出一个圆 ,如果不能可否帮忙改下?还有加载后怎么运行??谢谢

45448767 发表于 2011-6-17 23:14

在线等。。。

qdlyq 发表于 2011-6-18 00:24

编程比较难

45448767 发表于 2011-6-18 02:10

还有,能否在下面的程序旁注释每一步说明?谢谢
(defun c:thenumber(/ mylayers mylayout)
(vl-load-com)
(setq mylayers (vla-get-count(vla-get-layers(vla-get-ActiveDocument (vlax-get-Acad-Object)))))
(print "the number of mylayers=")(prin1 mylayers)
(setq mylayout (vla-get-count(vla-get-layouts(vla-get-ActiveDocument (vlax-get-Acad-Object)))))
(print "the number of mylayout=")(prin1 mylayout)
(princ));

woaishuijia 发表于 2011-6-18 08:02

本帖最后由 woaishuijia 于 2011-6-18 08:06 编辑

一楼的程序不能用,因为它存在几处致命的错误.
一.括号必须是半角字符,而现在第一个左括号是全角
二.函数"defun"你写成了"define"
三.条件判断语句中"/="函数与变量"p1"之间缺少一个半角空格
四.空值"nil"你写成了"null",这是一个函数
五.用单点命令画p1点时,不应该有那两组双引号,应该是(command "point" p1)
六.用三点画圆命令时三个点参数之间不应该是逗号,必须是半角空格

另外还有一些不合理的地方,需要加以改进.比如
一.应尽可能使用局部变量,不要偷懒.等你真正学会了编程,开始写大一点的程序时会明白局部变量有多么重要.
二.程序中取消了对象捕捉,在程序运行结束时要给用户改回去,否则人家辛辛苦苦设置的对象捕捉模式被你轻而易举地消灭了.
还有几处就不细说了.

下面是修改后的程序(defun c:ABC (/ oldos p1 p2 p3)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq p1 (getpoint "\n确定第一个点\n"))
(if (/= p1 nil)
    (progn
      (command "point" p1)
      (setq p2 (getpoint p1 "\n 确定第二个点\n"))
      (if (/= p2 nil)
      (progn
          (command "line" p1 p2 "")
          (setq p3 (getpoint p2 "\n 确定第三个点\n"))
          (if (/= p3 nil)
            (progn (command "line" p2 p3 "")
                   (command "line" p1 p3 "")
                   (command "circle" "3p" p1 p2 p3)
            )
          )
      )
      )
    )
)
(setvar "osmode" oldos)
(princ)
)加载后在命令行键入函数名称(对本程序是ABC)就可以运行程序了

四楼的程序注释(defun c:thenumber (/ mylayers mylayout)
(vl-load-com)                                ;加载Visual LISP模块
(setq        mylayers
       (vla-get-count
           (vla-get-layers
             (vla-get-ActiveDocument
             (vlax-get-Acad-Object)        ;获取CAD进程对象
             )                                ;获取该CAD进程的活动文档对象
           )                                ;获取该文档的图层集合对象
       )                                ;获取该集合的元素数量
)                                        ;把得到的当前CAD文档的图层数量赋值给局部变量
(print "the number of mylayers=")
(prin1 mylayers)                        ;在命令行输出当前CAD文档的图层数量
(setq        mylayout
       (vla-get-count
           (vla-get-layouts
             (vla-get-ActiveDocument
             (vlax-get-Acad-Object)        ;获取CAD进程对象
             )                                ;获取该CAD进程的活动文档对象
           )                                ;获取该文档的布局集合对象
       )                                ;获取该集合的元素数量
)                                        ;把得到的当前CAD文档的布局数量赋值给局部变量
(print "the number of mylayout=")
(prin1 mylayout)                        ;在命令行输出当前CAD文档的布局数量
(princ)                                ;空打印,用于清空本自定义函数的返回值,不让命令行产生多余的输出
)

五面怪 发表于 2011-6-30 10:34

楼上是高手。
页: [1]
查看完整版本: 关于 lisp 的编程 问题 谢谢