明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1455|回复: 2

[提问] 自己写的lisp代码出了问题

[复制链接]
发表于 2014-4-25 20:01:17 | 显示全部楼层 |阅读模式
各位高手:
       小弟最近刚学习visual lisp 。自己写了个代码,出现了一些问题,出问题的那部分代码我已经高亮表示了,请大家帮忙分析分析。
       这个代码是为了画出避雷针的保护范围的。
      当我输入防雷等级2 避雷针根数3 避雷针高度8 输入距离5  输入长度1000  输入宽度1000  输入高度100  
时返回的提示信息是; 错误: 参数类型错误: fixnump: 3.0
     我自己设置的参数   i  也为空。程序如下:
(defun c:demo2 ()
  (setvar "cmdecho" 0)
  (setq osm (getvar "osmode"))
  (setvar "osmode" 0)
                                        ;提示用户输入相关数据
  (setq d1 (getint "\n防雷等级"))
  (setq n (getreal "\避雷针根数"))
  (setq hy (getreal "\避雷针高度"))
  (setq d0 (getreal "\n输入距离"))
  (setq l (getreal "\n输入长度"))
  (setq w (getreal "\n输入宽度"))
  (setq hx (getreal "\n输入高度"))
                                        ;绘制图纸
  (if (= d1 1) (setq hr 30.0))
  (if (= d1 2) (setq hr 45.0))
  (if (= d1 3) (setq hr 60.0))
  (if (/= d1 1)
    (progn
      (setq p1 (list 0 0))
      (setq p2 (list l w))
      (command "rectang" p1 p2)
      (if (= n 1)
        (progn
          (setq h (+ h0 hx))
          (setq r1 (abs (- (* 2 hr) h))) ;计算半径
          (setq r2 (abs (- (* 2 hx) h)))
          (setq r0 (sqrt (* r1 h)))
          (setq rx (sqrt (* r2 hx)))
          (setq r (abs (- r0 rx)))
          (setq pc (list (/ l 2) (/ w 2))) ;圆心坐标
          (command "circle" pc r)        ;计算楼顶保护范围
          (command "circle" pc r0)        ;计算底部保护范围
        )
      )
      (if (= n 2)
        (progn
          (setq z0 (/ w 2))
          (setq z1 (/ l 4))
          (setq z2 (* (/ l 4) 3))
          (setq pc1 (list z1 z0))        ;圆心坐标
          (setq pc2 (list z2 z0))
          (setq h (+ hx hy))
          (setq r0 (sqrt (* (abs(- (* 2 hr) h)) h))) ;计算半径
          (setq rx (sqrt (* (abs(- (* 2 hr) hx)) hx)))
          (setq r (abs (- r0 rx)))
          (setq a (* (- z1 z2) 0.5)) ;求两圆交点
          (setq b (/ (- z0 z0) 2))
          (setq d (sqrt (+ (* a a) (* b b))))
          (setq h (sqrt (abs (- (* r r) (* d d)))))
          (setq h1 (sqrt (abs (- (* r0 r0) (* d d)))))
          (setq k (/ h d))
          (setq k1 (/ h1 d))
          (setq x (/ (+ (car pc1) (car pc2)) 2))
          (setq y (/ (+ (cadr pc1) (cadr pc2)) 2))
          (setq p1 (list (+ x (* k b)) (- y (* k a)))) ;顶部两圆交点1
          (setq p2 (list (- x (* k b)) (+ y (* k a)))) ;顶部两圆交点2
          (setq p3 (list (+ x (* k1 b)) (- y (* k1 a)))) ;底部两圆交点1
          (setq p4 (list (- x (* k1 b)) (+ y (* k1 a)))) ;底部两圆交点2
          (command "pline" p1 "a" "ce" pc1 p2 "ce" pc2 p1 "cl")
          (command "pline" p3 "a" "ce" pc1 p4 "ce" pc2 p3 "cl")
        )
      )
      (if (> n 2)
        (progn
          (setq p (float n))
          (setq q1 (+ p 1.0))
          (setq z0 (/ w 2))
          (setq z1 (/ l q1))
          (setq z2 (* (/ 2 q1) l))
          (setq pc1 (list z1 z0))        ;前两根针的安放位置
          (setq pc2 (list z2 z0))
          (setq h (+ hx hy))
          (setq r0 (sqrt (* (abs(- (* 2 hr) h)) h))) ;计算半径
          (setq rx (sqrt (* (abs(- (* 2 hr) hx)) hx)))
          (setq r (abs (- r0 rx)))
          (setq a (* (- z1 z2) 0.5)) ;求两圆交点
          (setq b (/ (- z0 z0) 2))
          (setq d (sqrt (+ (* a a) (* b b))))
          (setq h (sqrt (abs (- (* r r) (* d d)))))
          (setq k (/ h d))
          (setq x1 (/ (+ (car pc1) (car pc2)) 2))
          (setq y1 (/ (+ (cadr pc1) (cadr pc2)) 2))
          (setq p1 (list (+ x1 (* k b)) (- y1 (* k a)))) ;两圆交点1
          (setq p2 (list (- x1 (* k b)) (+ y1 (* k a)))) ;两圆交点2
          (command "pline" p1 "a" "ce" pc1 p2 );前两根针的保护范围
          (command "")
          (repeat n                                    ;中间各针计算
              (setq i 2.0)
              (setq zm1 (* l (/ i q1)))
              (setq zn1 (* l (/ (+ i 1.0) q1)))
              (setq pcm1 (list zm1 z0))        ;圆心坐标
              (setq pcn1 (list zn1 z0))
              (setq a1 (* (- zm1 zn1) 0.5)) ;求两圆交点
              (setq d1 (sqrt (+ (* a1 a1) (* b b))))
              (setq h1 (sqrt (abs (- (* r r) (* d1 d1)))))
              (setq k1 (/ h1 d1))
              (setq xn1 (/ (+ (car pcm1) (car pcn1)) 2))
              (setq yn1 (/ (+ (cadr pcm1) (cadr pcn1)) 2))
              (setq pn (list (+ xn1 (* k1 b)) (- yn1 (* k1 a1)))) ;两圆交点1
              (command "pline" p1 "a" "ce" pcm1 pn  )
              (setq i (+ i 1.0))
          )
          (command "")
          (repeat n                                    
              (setq j 2.0)
              (setq zm2 (* l (/ j q1)))
              (setq zn2 (* l (/ (+ j 1.0) q1)))
              (setq pcm2 (list zm2 z0))        ;圆心坐标
              (setq pcn2 (list zn2 z0))
              (setq a2 (* (- zm2 zn2) 0.5)) ;求两圆交点
              (setq d2 (sqrt (+ (* a2 a2) (* b b))))
              (setq h2 (sqrt (abs (- (* r r) (* d2 d2)))))
              (setq k2 (/ h2 d2))
              (setq xn2 (/ (+ (car pcm2) (car pcn2)) 2))
              (setq yn2 (/ (+ (cadr pcm2) (cadr pcn2)) 2))
              (setq pm (list (- xn2 (* k2 b)) (+ yn2 (* k2 a2)))) ;两圆交点2
              (command "pline" p2 "a" "ce" pcn2 pm  )
              (setq j (+ j 1.0))
          )
          (command "")
          (setq zz (*(/ n q1) l) )
          (setq zdr (* (/ (- n 1) q1) l))
          (setq pcz (list zz z0))        ;最后两根针的安放位置
          (setq pcdr (list zdr z0))
          (setq a (* (- z1 z2) 0.5)) ;求两圆交点
          (setq d (sqrt (+ (* a a) (* b b))))
          (setq h (sqrt (abs (- (* r r) (* d d)))))
          (setq k (/ h d))
          (setq x (/ (+ (car pcz) (car pcdr)) 2))
          (setq y (/ (+ (cadr pcz) (cadr pcdr)) 2))
          (setq pz (list (+ x (* k b)) (- y (* k a)))) ;两圆交点1
          (setq pdr (list (- x (* k b)) (+ y (* k a)))) ;两圆交点2
          (command "pline" pz "a" "ce" pcz p2dr )       ;最后两根针的保护范围
          (command "")
        )
      )
    )
  )

  (if (= d1 1)
    (progn
      (setq p1 (list d0 d0))
      (setq p2 (list (+ l d0) (+ w d0)))
      (command "rectang" p1 p2)
      (if (= n 1)
        (progn
          (setq h (+ h0 hx))
          (setq r1 (abs (- (* 2 hr) h))) ;计算半径
          (setq r2 (abs (- (* 2 hx) h)))
          (setq r0 (sqrt (* r1 h)))
          (setq rx (sqrt (* r2 hx)))
          (setq r (abs (- r0 rx)))
          (setq pc (list (+ (/ l 2) d0) (/ w 2)))
          (command "circle" pc r)
          (command "circle" pc r0)
        )
      )
      (if (= n 2)
        (progn
          (setq z0 (/ w 2))
          (setq z1 (/ l 4))
          (setq z2 (* (/ l 4) 3))
          (setq pc1 (list 0 (+ d0 (/ w 2))))
          (setq pc2 (list (+ l (* 2 d0)) (+ (/ w 2) d0)))
          (setq h (+ hx hy))
          (setq r0 (sqrt (* (abs(- (* 2 hr) h)) h))) ;计算半径
          (setq rx (sqrt (* (abs(- (* 2 hr) hx)) hx)))
          (setq r (abs (- r0 rx)))
          (setq a (* (- z1 z2) 0.5)) ;求两圆交点
          (setq b (/ (- z0 z0) 2))
          (setq d (sqrt (+ (* a a) (* b b))))
          (setq h (sqrt (abs (- (* r r) (* d d)))))
          (setq h1 (sqrt (abs (- (* r0 r0) (* d d)))))
          (setq k (/ h d))
          (setq k1 (/ h1 d))
          (setq x (/ (+ (car pc1) (car pc2)) 2))
          (setq y (/ (+ (cadr pc1) (cadr pc2)) 2))
          (setq p1 (list (+ x (* k b)) (- y (* k a)))) ;顶部两圆交点1
          (setq p2 (list (- x (* k b)) (+ y (* k a)))) ;顶部两圆交点2
          (setq p3 (list (+ x (* k1 b)) (- y (* k1 a)))) ;底部两圆交点1
          (setq p4 (list (- x (* k1 b)) (+ y (* k1 a)))) ;底部两圆交点2
          (command "pline" p1 "a" "ce" pc1 p2 "ce" pc2 p1 "cl")
          (command "pline" p3 "a" "ce" pc1 p4 "ce" pc2 p3 "cl")
        )
      )
    )
  )

  (setvar "osmode" osm)
  (prin1)
)

这是现在画出的图

本帖子中包含更多资源

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

x
发表于 2014-4-25 21:13:31 | 显示全部楼层
本帖最后由 llsheng_73 于 2014-4-25 21:16 编辑

  1.   (setq n (getreal "\避雷针根数"))

此处得到的n会是一个实数
  1. (repeat n   ....)

(repeat 重复次数 ...)
这就有了矛盾,因为重复次数只能是整数,因为你不能叫它重复1.3次
虽然n=3.0和3在数值上相等,但它和你叫它重复1.3次没本质区别,所以这个地方n只能为整数3而不能为实数3.0

把我自己都绕晕了,不知道把你绕晕了没
总之把
  1.   (setq n (getreal "\避雷针根数"))
改为
  1.   (setq n (getint "\避雷针根数"))
就行
 楼主| 发表于 2014-5-11 21:25:53 | 显示全部楼层
谢谢,我明白了,问题已解决
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-24 19:43 , Processed in 0.196674 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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