明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1976|回复: 2

[分享]练LSP就要从小练起

[复制链接]
发表于 2006-12-22 13:50 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2006-12-23 12:30:16 编辑

我在看一本电子书的时间看到的小程序题,现在拿出来大家也练练!

答案请大家往下看,这些程序是我按书上的提示后自己又写的,如果有看过这本书的就能看出来我的程序跟书上的有些不一样!
其中第一个图对应LSP001,第二个图对应LSP002,依此往下推.现在我也刚练到第十个,再弄再发!


(defun c:lsp001(/ p1 ww hh ww3 hh2 p2 p3 p4 p5 p6 p7 p8)
  (setvar "osmode" 0);取消捕捉
  (setvar "cmdecho" 0);取消提示
  (setq p1(getpoint "\n左下角点:"))
  (setq ww(getdist p1 "\n宽度[100]:"))
  (if (null ww) (setq ww 100.0))
  (setq hh(getdist p1 "\n高度[50]:"))
  (if (null hh) (setq hh 50.0))
  (setq ww3(/ ww 3)
 hh2(/ hh 2)
  )
  (setq p2(polar p1 0 ww)
 p3(polar p2 (/ pi 2) hh)
 p4(polar p3 pi ww3)
 p5(polar p4 (* pi 1.5) hh2)
 p6(polar p5 pi ww3)
 p7(polar p6 (/ pi 2) hh2)
 p8(polar p7 pi ww3)
 )
  (command "pline" p1 p2 p3 p4 p5 p6 p7 p8 "c")
  (prin1)
)

(defun c:lsp002(/ p1 p2 p3 p4 rr en1 en2 en3)
  (setvar "cmdecho" 0)
  (setvar "osmode" 0)
  (setq p1(getpoint "\n第一角点:")
 p3(getcorner p1 "\n另一角点:")
 p2(list (car p3) (cadr p1))
 p4(list (car p1) (cadr p3))
 rr(getdist p1 "\n圆半径<5>:")
 )
  (if (null rr) (setq rr 5.0))
  (command "circle" p1 rr)
  (setq en1(entlast))
  (command "line" (polar p1 pi (+ rr 3)) (polar p1 0 (+ rr 3)) "")
  (setq en2(entlast))
  (command "line" (polar p1 (* pi 1.5) (+ rr 3)) (polar p1 (/ pi 2) (+ rr 3)) "")
  (setq en3(entlast))
  (command "copy" en1 en2 en3 "" "m" p1 p2 p3 p4 "")
  (princ)
)


(defun c:lsp003(/ p1 p2 p3 p4 dd ang1 ang2)
  (setvar "cmdecho" 0)
  (setq p1(getpoint "\n第一角点:")
 p3(getcorner p1 "\n另一角点:")
 p2(list (car p3) (cadr p1))
 p4(list (car p1) (cadr p3))
 )
  (command "pline" p1 p3 p2 p4 "c")
  (setq dd(/ (distance p1 p4) 2)
 ang1(angle p2 p3)
 ang2(angle p4 p1)
 )
  (command "arc" p2 "e" ;|端点:|;(polar p2 ang1 dd) "a" 180;e:端点a度数p2作为起点
    "arc" (polar p2 ang1 dd) "e" p3 "a" 180
    "arc" p4 "e" (polar p4 ang2 dd) "a" 180
    "arc" (polar p4 ang2 dd) "e" p1 "a" 180
    )
  (prin1)
)

(defun c:lsp004(/ p1 p2 dd a1 mid h ce en1 en2 en3)
  (setvar "cmdecho" 0)
  (setvar "osmode" 0)
  (setq p1(getpoint "\n第一点:")
 p2(getpoint p1 "\n第二点:")
 dd(distance p1 p2)
 a1(angle p1 p2)
 mid(polar p1 a1 (/ dd 2));最早画那一边的中点
 h(* (/ 1 (sqrt 3)) (/ dd 2));一边中点到图形中心的距离
 ce(polar mid (+ a1 (/ pi 2)) h);整个图形的中心
 )
  (command "line" p1 p2 "")
  (setq en1(entlast))
  (command "arc" p1 "e" p2 "a" 180)
  (setq en2(entlast))
  (command "circle" "2p" "tan" mid
    (polar mid (+ a1 (* pi 1.5)) (/ dd 2))
    )
  (setq en3(entlast))
  (command "array" en1 en2 en3 "" "p" ce 3 "" "")
  (prin1)
)


(defun c:lsp005(/ p1 p2 p3 p4 p5 di12 di23 di34 di45 di51 max_dd min_dd
  max_pt min_pt max_pt1 min_pt1 max_pt2 min_pt2 cc)
  (setvar "cmdecho" 0)
  (setvar "osmode" 0)
  (setq p1(getpoint "\n起点:"))
  (command "pline" p1)
  (setq p2(getpoint p1 "\n第二点"))
  (command p2)
  (setq p3(getpoint p2 "\n第三点"))
  (command p3)
  (setq p4(getpoint p3 "\n第四点"))
  (command p4)
  (setq p5(getpoint p4 "\n第五点"))
  (command p5 "c")
  (setq di12(distance p1 p2)
 di23(distance p2 p3)
 di34(distance p3 p4)
 di45(distance p4 p5)
 di51(distance p5 p1)
 )
  (setq cc '()
 cc(cons (list di12 p1 p2) cc)
 cc(cons (list di23 p2 p3) cc)
 cc(cons (list di34 p3 p4) cc)
 cc(cons (list di45 p4 p5) cc)
 cc(cons (list di51 p5 p1) cc)
 max_dd(max di12 di23 di34 di45 di51)
 min_dd(min di12 di23 di34 di45 di51)
 max_pt(assoc max_dd cc)
 max_pt1(cadr max_pt)
 max_pt2(caddr max_pt)
 max_ptm(polar max_pt1 (angle max_pt1 max_pt2) (/ max_dd 2))
 min_pt(assoc min_dd cc)
 min_pt1(cadr min_pt)
 min_pt2(caddr min_pt)
 )
  (command "arc" max_pt1 "e" max_ptm "a" 180
    "arc" max_ptm "e" max_pt2 "a" 180
    "arc" min_pt1 "e" min_pt2 "a" 180
    )
  (prin1)
)


(defun c:lsp006(/ p1 p2 p3 p4 int ww hh cirl ang2 ang1)
  (setvar "cmdecho" 0)
  (setvar "osmode" 0)
  (setq p1(getpoint "\n第一角点:")
 p3(getcorner p1 "\n第二角点:")
 p2(list (car p3) (cadr p1))
 p4(list (car p1) (cadr p3))
 )
  (command "rectang" p1 p3)
  (setq int(inters p1 p3 p2 p4))
  (setq ww(distance p1 p2)
 hh(distance p2 p3)
 ang1(angle p1 p3)
 ang2(angle p2 p4)
 cirl(/ (min ww hh) 2)
 )
  (command "circle" int cirl)
  (setq en1(entlast))
  (command "line" p1 p3 "")
  (setq en2(entlast))
  (command "line" p2 p4 "")
  (setq en3(entlast))
  (command "trim" en1 ""
    (list en2 (polar p1 ang1 1))
    (list en2 (polar p3 (+ ang1 pi) 1))
    (list en3 (polar p2 ang2 1))
    (list en3 (polar p4 (+ ang2 pi) 1)) ""
    )
  (prin1)
)


(defun c:lsp007(/ p1 p2 p3 p4 p5 p6 p7 p8
  int ww hh cirl)
  (setvar "cmdecho" 0)
  (setvar "osmode" 0)
  (setq p1(getpoint "\n第一角点:")
 p3(getcorner p1 "\n另一角点")
 p2(list (car p3) (cadr p1))
 p4(list (car p1) (cadr p3))
 )
  (command "rectang" p1 p3)
  (setq int(inters p1 p3 p2 p4)
 ww(distance p1 p2)
 hh(distance p2 p3)
 cirl(/ (min ww hh) 2)
 )
  (if (>= ww hh);如果长大于宽则横着画
    (setq
 p5(polar int (angle int p1) cirl)
 p6(polar int (angle int p2) cirl)
 p7(polar int (angle int p3) cirl)
 p8(polar int (angle int p4) cirl)
 )
    )
  (if (< ww hh);如果宽大于长则转90度
    (setq
       p8(polar int (angle int p1) cirl)
 p5(polar int (angle int p2) cirl)
 p6(polar int (angle int p3) cirl)
 p7(polar int (angle int p4) cirl)
 )
    )
  (command "arc" p5 "e" p6 "r" cirl
    "arc" p7 "e" p6 "r" cirl
    "arc" p7 "e" p8 "r" cirl
    "arc" p5 "e" p8 "r" cirl
    "line" p6 p8 ""
    "line" p5 p7 ""
    )
  (prin1)
)

(defun c:lsp008(/ nn p1 p2 ww str_hh hh ang pbas)
  (setvar "cmdecho" 0)
  (setvar "osmode" 0)
  (setq nn(getint "\n阶数:"))
  (if (null nn) (setq nn 5))
  (setq p1(getpoint "\n第一点:")
 p2(getpoint p1 "\n第二点:")
 ww(distance p1 p2)
 str_hh(strcat "\n高度:<" (rtos ww 2) ">:")
 hh(getdist p1 str_hh)
 )
  (if (null hh) (setq hh ww))
  (setq ang(angle p1 p2)
 pbas p2
 )
  (command "pline" p1 pbas)
  (repeat nn;循环nn次(阶数)
    (setq pbas(polar pbas (+ ang (/ pi 2)) (/ hh nn)))
    (command pbas)
    (setq pbas(polar pbas (+ ang pi) (/ ww nn)))
    (command pbas)
    )
  (command "c")
  (prin1)
)


(defun c:lsp009(/ p1 pr d n ang r p2 cc os cm)
  (setq os(getvar "osmode")
        cm(getvar "cmdecho")
 )
  (setvar "cmdecho" 0)
  (setvar "osmode" 0);取消捕捉以免做出图不符合想像
  (setq p1(getpoint "\n基准点:")
 pr(getpoint p1 "\n圆半径点:")
 d(getdist "\n圆间距:")
 n(getint "\n重复次数:")
 )
  (setq ang(angle p1 pr)
 r(distance p1 pr)
 p2(polar p1 ang (* r 2))
 cc 1
 )
  (repeat n
    (setvar "cecolor" (rtos cc 2 0));设置颜色
    (command "circle" "2p" p1 p2)
    (setq p2(polar p2 ang d))
    (setq cc(1+ cc));改变颜色
    )
  (command "circle" "2p" p1 p2)
  (setvar "osmode" os)
  (setvar "cmdecho" cm)
  (prin1)
)


(defun c:lsp010(/ os cm ce rr n p1 ang p2)
  (setq os(getvar "osmode")
        cm(getvar "cmdecho")
 )
  (setvar "cmdecho" 0)
  (setvar "osmode" 0)
  (setq ce(getpoint "\n中心:")
 rr(getdist ce "\n半径:")
 n(getint "\n等分数:")
 )
  (if (null rr) (setq rr 50))
  (if (null n) (setq n 10))
  (setq ang(/ pi n 0.5)
     p1(polar ce 0 rr)
 p2(polar ce ang rr)
 )
  (command "pline" ce p1 "a" "a" 180 p2 "")
  (command "array" (entlast) ce "" "p" ce n "" "")
  (setvar "osmode" os)
  (setvar "cmdecho" cm)
  (prin1)
)

(defun c:lsp011(/ cm os ce r1 r2 n p0 p1 p2 ang)
  (setq cm(getvar "cmdecho")
 os(getvar "osmode")
 )
  (setvar "osmode" 0)
  (setvar "cmdecho" 0)
  (setq ce(getpoint "\n中心点:")
 r1(getdist ce "\n小圆半径:")
 r2(getdist ce "\n大圆半径:")
 n(getint "\n等分数:")
 )
  (if (null n) (setq n 10))
  (if (>= r1 r2) (alert "错误:小圆半径大于大圆,请重输入!!"))
  (if (< r1 r2)
    (progn
    (setq ang(/ pi n 0.5)
   p0(polar ce 0 r1)
   p1(polar ce 0 r2)
   p2(polar ce ang r2)
   ;这是多余的程序,本不需要这句p3(polar ce ang r1)
   )
    (command "circle" ce r1)
    (command "pline" p0 p1 "a" "a" 180 p2 "")
    (command "array" (entlast) ce "" "p" ce n "" "")
    )
  )
)


(defun c:lsp012(/ cm os ce r1 en1 ce2 r2 nn ang angdd ang ang1 ang2)
  (setq cm(getvar "cmdecho")
 os(getvar "osmode")
 )
  (setvar "osmode" 0)
  (setvar "cmdecho" 0)
  (setq ce(getpoint "\n中心点:")
 r1(getdist ce "\n大圆半径:")
 )
  (command "circle" ce r1)
  (setq en1(entlast))
  (command "circle" ce "d" r1)
  (setq ce2(polar ce 0 r1)
 r2(getdist ce2 "\n小圆半径:")
 nn(getint "\n重复次数:<8>")
 )
  (if (null nn) (setq nn 8))
  (setq ang 0 ss (ssadd))
  (setq angdd(/ (* pi 2) nn))
  (repeat nn
    (command "circle" ce2 r2)
    (setq ss(ssadd (entlast) ss))
    (setq ang(+ ang angdd))
    (setq ce2(polar ce ang r1))
    )
  (setq ang 0)
  (repeat nn
    (command "trim" ss "" (polar ce ang r1) "");剪切时选中小圆圆心
    (setq ang(+ ang angdd))
    )
  (setq ang1(/ angdd -2.0)
 ang2 (+ ang1 angdd)
 ang 0
 )
  (repeat nn
    (command "trim" (polar ce ang1 r1) (polar ce ang2 r1) ""
      (polar ce ang (- r1 r2)) ""
      )
    (setq ang1(+ ang1 angdd)
   ang2 (+ ang2 angdd)
   ang (+ ang angdd)
   )
    )
  (setvar "osmode" os)
  (setvar "cmdecho" cm)
  (prin1)
)

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
mccad + 1 【好评】 好好学习,天天向上

查看全部评分

发表于 2006-12-22 17:20 | 显示全部楼层
天哪,什么玩意儿,一点儿也看不懂
发表于 2006-12-22 20:32 | 显示全部楼层
编程关键是想方法。其他的好说。你这条路是走对了。给自已找些课题是必需的。不然永远也学不会LISP。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-12 06:13 , Processed in 0.164804 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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