明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2124|回复: 4

[已解答] lisp代码 求大侠加一下循环

[复制链接]
发表于 2014-1-12 06:33:42 | 显示全部楼层 |阅读模式
20明经币
下边的命令能实现点选矩形画窗扇,我是个菜鸟,只会简单拼凑代码,自己加循环老是出错 ,请教大侠如何加循环,能实现一次性选几十个矩形然后都画出窗扇呢,这个对我很重要,感激万分

(defun c:zs () ;左窗扇命令****************************************************************
(setvar "CMDECHO" 0)  (command ".undo" "g")
(setq kxmian 30 mkxmian 35 ztxmian 30 csxmian 41.5 msxmian 67 ktxingshi 2
       dajie 11 dajief2 5.5 blfx 7)
(setq ss (ssget '((0 . "LWPOLYLINE"))) i 0);选择多线段
(setvar "pdmode" 33)
(setvar "osmode" 0)
(setq plst (list))
(repeat (sslength ss)
  (setq ssn (ssname ss i) endata (entget ssn))
  (foreach x endata (if (= (car x) 10) (setq plst (cons (cdr x) plst))))
  (setq i (1+ i))
)
(setq tx (apply 'min (mapcar 'car plst)))
(setq ty (apply 'min (mapcar 'cadr plst)))
(setq tmaxx (apply 'max (mapcar 'car plst)))
(setq tmaxy (apply 'max (mapcar 'cadr plst)))
;LISP矩形坐标提取*********************************
(setq waiweiw (- tmaxx tx) waiweih (- tmaxy ty))
(setq pa (list tx ty))
(setq ww waiweiw hh waiweih)
  
(setq tmp (polar pa pi dajief2)
       wpa (polar tmp (/ pi -2) dajief2)
       wpb (polar wpa 0 (+ ww dajie))
       wpc (polar wpb (/ pi 2) (+ hh dajie))
       wpd (polar wpc pi (+ ww dajie))) ;计算
(command ".pline" wpa wpb wpc wpd "c")
(setq pb (polar pa 0 ww)  pc (polar pb (/ pi 2) hh) pd (polar pc pi ww)) ;计算
(setq tmp (polar pa 0 csxmian)) ;计算
(setq mp1 (polar tmp (/ pi 2) csxmian))
(setq mp2 (polar mp1 0 (- ww (* 2 csxmian))))
(setq mp3 (polar mp2 (/ pi 2) (- hh (* 2 csxmian))))
(setq mp4 (polar mp3 pi (- ww (* 2 csxmian))))
  
(sk_mkpl (list mp1 mp2 mp3 mp4) "细线5" 256 1)  
(command ".line" wpa mp1 "" ".line" wpb mp2 "" ".line" wpc mp3 "" ".line" wpd mp4 "")
   
(setq cblfx (- blfx 0))
(setq tmp2 (polar mp1 0 cblfx)  ;窗扇槽深
        bp1 (polar tmp2 (/ pi 2) cblfx)
        bp2 (polar bp1 0 (- (- ww (* 2 csxmian)) (* 2 cblfx)))
        bp3 (polar bp2 (/ pi 2) (- (- hh (* 2 csxmian)) (* 2 cblfx)))
        bp4 (polar bp3 pi (- (- ww (* 2 csxmian)) (* 2 cblfx))))
(sk_mkpl (list bp1 bp2 bp3 bp4) "细线1" 256 1)

(setq tmp3 (polar mp1 0 22))
(setq yp1 (polar tmp3 (/ pi 2) 22)
       yp2 (polar yp1 0 (- (- ww (* 2 csxmian)) (* 2 22)))
       yp3 (polar yp2 (/ pi 2) (- (- hh (* 2 csxmian)) (* 2 22)))
       yp4 (polar yp3 pi (- (- ww (* 2 csxmian)) (* 2 22))))

(setq lin1 (polar mp1 (/ pi 2) 22)) (setq lin2 (polar mp2 (/ pi 2) 22))
(setq lin3 (polar mp3 (/ pi -2) 22)) (setq lin4 (polar mp4 (/ pi -2) 22))
(if (= ktxingshi 1)
     (command ".line" lin1 lin2 "" ".line" lin4 lin3 "" ".line" yp2 yp3 "" ".line" yp4 yp1 "")
     (progn
      (sk_mkpl (list yp1 yp2 yp3 yp4) "细线5" 256 1)  
      (command ".line" yp1 mp1 "" ".line" yp2 mp2 "" ".line" yp3 mp3 "" ".line" yp4 mp4 "")
     )
)
(setq zd1 (polar yp1 (/ pi 2) (/(- (- hh (* 2 csxmian)) (* 2 22)) 2)))
(sk_mkpl (list yp3 zd1 yp2) "细线5" 256 1)

(setq peijian1 (polar pd (/ pi -2) 149));加入配件合页
(setq peijian2 (polar pa (/ pi 2) 149))
(setq peijian3 (polar pb (/ pi 2) (/ hh 2)))
(setq a1 "heye" a2 "czhishou")
(command "insert" a1 peijian1 1 1 0) (command "insert" a1 peijian2 1 1 0) (command "insert" a2 peijian3 1 1 0)
(command "LAYER" "SET" "细线5" "")
(setvar "OSMODE" 16383) (command ".undo" "e")
(princ)
)

;;;(setvar "clayer" "细线5") ;设置当前图层
;;;简单entmake生成直线&直线型多段线函数
;;;by edata @2014-1-10
;;;p10 起点 p11终点  l_lay "图层名" l_col 0-256
(defun sk_mkline(p10 p11 l_lay l_col)
  (entmake(list '(0 . "line")
                (cons 8 l_lay)
                (cons 62 l_col)
                (cons 10 p10)
                (cons 11 p11)
                ))
  )
;;;pts 多段线点表 l_lay "图层名" l_col 0-256 l_closed 1关闭 0打开
(defun sk_mkpl(pts l_lay l_col l_closed / pt)
   (entmake (append
              (list '(0 . "LWPOLYLINE")
                    '(100 . "AcDbEntity")
                    '(100 . "AcDbPolyline")
                    (cons 8 l_lay)
                    (cons 62 l_col)
                    (cons 90 (length pts))
                    (cons 70 l_closed)
                    )
      (mapcar '(lambda (pt)(cons 10 pt)) pts ))
  )
)
附件: 您需要 登录 才可以下载或查看,没有账号?注册

最佳答案

查看完整内容

-----------------------还有一个地方,将(setq plst (list)) 放置到repeat中。。另外,最后一个图层切换用(setvar "clayer" "细线5") ;设置当前图层 如果使用enmake生成线,不需要切换当前图层, 只有插入块的地方,需要切换, 插入块也可以用entmake生成,所以到最后,图层都不需要更改。
发表于 2014-1-12 06:33:43 | 显示全部楼层
-----------------------还有一个地方,将(setq plst (list))
放置到repeat中。。另外,最后一个图层切换用(setvar "clayer" "细线5") ;设置当前图层
如果使用enmake生成线,不需要切换当前图层,
只有插入块的地方,需要切换,
插入块也可以用entmake生成,所以到最后,图层都不需要更改。
  1. (defun c:zs () ;左窗扇命令****************************************************************
  2. (setvar "CMDECHO" 0)  (command ".undo" "g")
  3. (setq kxmian 30 mkxmian 35 ztxmian 30 csxmian 41.5 msxmian 67 ktxingshi 2
  4.        dajie 11 dajief2 5.5 blfx 7)
  5. (setq ss (ssget '((0 . "LWPOLYLINE"))) i 0);选择多线段
  6. (setvar "pdmode" 33)
  7. (setvar "osmode" 0)

  8. (repeat (sslength ss)
  9.   (setq plst (list))
  10.   (setq ssn (ssname ss i) endata (entget ssn))
  11.   (foreach x endata (if (= (car x) 10) (setq plst (cons (cdr x) plst))))
  12.   (setq i (1+ i))

  13. (setq tx (apply 'min (mapcar 'car plst)))
  14. (setq ty (apply 'min (mapcar 'cadr plst)))
  15. (setq tmaxx (apply 'max (mapcar 'car plst)))
  16. (setq tmaxy (apply 'max (mapcar 'cadr plst)))
  17. ;LISP矩形坐标提取*********************************
  18. (setq waiweiw (- tmaxx tx) waiweih (- tmaxy ty))
  19. (setq pa (list tx ty))
  20. (setq ww waiweiw hh waiweih)
  21.   
  22. (setq tmp (polar pa pi dajief2)
  23.        wpa (polar tmp (/ pi -2) dajief2)
  24.        wpb (polar wpa 0 (+ ww dajie))
  25.        wpc (polar wpb (/ pi 2) (+ hh dajie))
  26.        wpd (polar wpc pi (+ ww dajie))) ;计算
  27. (command ".pline" wpa wpb wpc wpd "c")
  28. (setq pb (polar pa 0 ww)  pc (polar pb (/ pi 2) hh) pd (polar pc pi ww)) ;计算
  29. (setq tmp (polar pa 0 csxmian)) ;计算
  30. (setq mp1 (polar tmp (/ pi 2) csxmian))
  31. (setq mp2 (polar mp1 0 (- ww (* 2 csxmian))))
  32. (setq mp3 (polar mp2 (/ pi 2) (- hh (* 2 csxmian))))
  33. (setq mp4 (polar mp3 pi (- ww (* 2 csxmian))))
  34.   
  35. (sk_mkpl (list mp1 mp2 mp3 mp4) "细线5" 256 1)  
  36. (command ".line" wpa mp1 "" ".line" wpb mp2 "" ".line" wpc mp3 "" ".line" wpd mp4 "")
  37.    
  38. (setq cblfx (- blfx 0))
  39. (setq tmp2 (polar mp1 0 cblfx)  ;窗扇槽深
  40.         bp1 (polar tmp2 (/ pi 2) cblfx)
  41.         bp2 (polar bp1 0 (- (- ww (* 2 csxmian)) (* 2 cblfx)))
  42.         bp3 (polar bp2 (/ pi 2) (- (- hh (* 2 csxmian)) (* 2 cblfx)))
  43.         bp4 (polar bp3 pi (- (- ww (* 2 csxmian)) (* 2 cblfx))))
  44. (sk_mkpl (list bp1 bp2 bp3 bp4) "细线1" 256 1)

  45. (setq tmp3 (polar mp1 0 22))
  46. (setq yp1 (polar tmp3 (/ pi 2) 22)
  47.        yp2 (polar yp1 0 (- (- ww (* 2 csxmian)) (* 2 22)))
  48.        yp3 (polar yp2 (/ pi 2) (- (- hh (* 2 csxmian)) (* 2 22)))
  49.        yp4 (polar yp3 pi (- (- ww (* 2 csxmian)) (* 2 22))))

  50. (setq lin1 (polar mp1 (/ pi 2) 22)) (setq lin2 (polar mp2 (/ pi 2) 22))
  51. (setq lin3 (polar mp3 (/ pi -2) 22)) (setq lin4 (polar mp4 (/ pi -2) 22))
  52. (if (= ktxingshi 1)
  53.      (command ".line" lin1 lin2 "" ".line" lin4 lin3 "" ".line" yp2 yp3 "" ".line" yp4 yp1 "")
  54.      (progn
  55.       (sk_mkpl (list yp1 yp2 yp3 yp4) "细线5" 256 1)  
  56.       (command ".line" yp1 mp1 "" ".line" yp2 mp2 "" ".line" yp3 mp3 "" ".line" yp4 mp4 "")
  57.      )
  58. )
  59. (setq zd1 (polar yp1 (/ pi 2) (/(- (- hh (* 2 csxmian)) (* 2 22)) 2)))
  60. (sk_mkpl (list yp3 zd1 yp2) "细线5" 256 1)

  61. (setq peijian1 (polar pd (/ pi -2) 149));加入配件合页
  62. (setq peijian2 (polar pa (/ pi 2) 149))
  63. (setq peijian3 (polar pb (/ pi 2) (/ hh 2)))
  64. (setq a1 "heye" a2 "czhishou")
  65. (command "insert" a1 peijian1 1 1 0) (command "insert" a1 peijian2 1 1 0) (command "insert" a2 peijian3 1 1 0)
  66. (setvar "clayer" "细线5") ;设置当前图层
  67.   )
  68. (setvar "OSMODE" 16383) (command ".undo" "e")
  69. (princ)
  70. )

  71. ;;;(setvar "clayer" "细线5") ;设置当前图层
  72. ;;;简单entmake生成直线&直线型多段线函数
  73. ;;;by edata @2014-1-10
  74. ;;;p10 起点 p11终点  l_lay "图层名" l_col 0-256
  75. (defun sk_mkline(p10 p11 l_lay l_col)
  76.   (entmake(list '(0 . "line")
  77.                 (cons 8 l_lay)
  78.                 (cons 62 l_col)
  79.                 (cons 10 p10)
  80.                 (cons 11 p11)
  81.                 ))
  82.   )
  83. ;;;pts 多段线点表 l_lay "图层名" l_col 0-256 l_closed 1关闭 0打开
  84. (defun sk_mkpl(pts l_lay l_col l_closed / pt)
  85.    (entmake (append
  86.               (list '(0 . "LWPOLYLINE")
  87.                     '(100 . "AcDbEntity")
  88.                     '(100 . "AcDbPolyline")
  89.                     (cons 8 l_lay)
  90.                     (cons 62 l_col)
  91.                     (cons 90 (length pts))
  92.                     (cons 70 l_closed)
  93.                     )
  94.       (mapcar '(lambda (pt)(cons 10 pt)) pts ))
  95.   )
  96. )

点评

跪谢啊,顶礼膜拜  发表于 2014-1-12 09:08
回复

使用道具 举报

发表于 2014-1-12 08:14:30 来自手机 | 显示全部楼层
没记错的话,应该是将你的repeat的结束括号移动(setvar "osmode"16383)之前。
回复

使用道具 举报

发表于 2014-1-12 09:48:08 | 显示全部楼层
entmake图块版
因为entmake生成的时候,设置了图层,如果图层不存在,会自动建立图层,除了层名,
其他的都是默认,图块名一定要存在,不然图块不插入。
  1. (defun c:zs () ;左窗扇命令****************************************************************
  2. (setvar "CMDECHO" 0)  (command ".undo" "g")
  3. (setq kxmian 30 mkxmian 35 ztxmian 30 csxmian 41.5 msxmian 67 ktxingshi 2
  4.        dajie 11 dajief2 5.5 blfx 7)
  5. (setq ss (ssget '((0 . "LWPOLYLINE"))) i 0);选择多线段
  6. (setvar "pdmode" 33)
  7. (setvar "osmode" 0)
  8. (if ss
  9. (repeat (sslength ss)
  10.   (setq plst (list))
  11.   (setq ssn (ssname ss i) endata (entget ssn))
  12.   (foreach x endata (if (= (car x) 10) (setq plst (cons (cdr x) plst))))
  13.   (setq i (1+ i))

  14. (setq tx (apply 'min (mapcar 'car plst)))
  15. (setq ty (apply 'min (mapcar 'cadr plst)))
  16. (setq tmaxx (apply 'max (mapcar 'car plst)))
  17. (setq tmaxy (apply 'max (mapcar 'cadr plst)))
  18. ;LISP矩形坐标提取*********************************
  19. (setq waiweiw (- tmaxx tx) waiweih (- tmaxy ty))
  20. (setq pa (list tx ty))
  21. (setq ww waiweiw hh waiweih)
  22.   
  23. (setq tmp (polar pa pi dajief2)
  24.        wpa (polar tmp (/ pi -2) dajief2)
  25.        wpb (polar wpa 0 (+ ww dajie))
  26.        wpc (polar wpb (/ pi 2) (+ hh dajie))
  27.        wpd (polar wpc pi (+ ww dajie))) ;计算
  28.   (sk_mkpl (list wpa wpb wpc wpd) "细线5" 256 1)
  29. ;(command ".pline" wpa wpb wpc wpd "c")
  30. (setq pb (polar pa 0 ww)  pc (polar pb (/ pi 2) hh) pd (polar pc pi ww)) ;计算
  31. (setq tmp (polar pa 0 csxmian)) ;计算
  32. (setq mp1 (polar tmp (/ pi 2) csxmian))
  33. (setq mp2 (polar mp1 0 (- ww (* 2 csxmian))))
  34. (setq mp3 (polar mp2 (/ pi 2) (- hh (* 2 csxmian))))
  35. (setq mp4 (polar mp3 pi (- ww (* 2 csxmian))))
  36.   
  37. (sk_mkpl (list mp1 mp2 mp3 mp4) "细线5" 256 1)
  38. (foreach n (list(list wpa mp1)(list wpb mp2)(list wpc mp3)(list wpd mp4)) (sk_mkline (car n)(cadr n) "细线5" 256))
  39. ;(command ".line" wpa mp1 "" ".line" wpb mp2 "" ".line" wpc mp3 "" ".line" wpd mp4 "")
  40.    
  41. (setq cblfx (- blfx 0))
  42. (setq tmp2 (polar mp1 0 cblfx)  ;窗扇槽深
  43.         bp1 (polar tmp2 (/ pi 2) cblfx)
  44.         bp2 (polar bp1 0 (- (- ww (* 2 csxmian)) (* 2 cblfx)))
  45.         bp3 (polar bp2 (/ pi 2) (- (- hh (* 2 csxmian)) (* 2 cblfx)))
  46.         bp4 (polar bp3 pi (- (- ww (* 2 csxmian)) (* 2 cblfx))))
  47. (sk_mkpl (list bp1 bp2 bp3 bp4) "细线1" 256 1)

  48. (setq tmp3 (polar mp1 0 22))
  49. (setq yp1 (polar tmp3 (/ pi 2) 22)
  50.        yp2 (polar yp1 0 (- (- ww (* 2 csxmian)) (* 2 22)))
  51.        yp3 (polar yp2 (/ pi 2) (- (- hh (* 2 csxmian)) (* 2 22)))
  52.        yp4 (polar yp3 pi (- (- ww (* 2 csxmian)) (* 2 22))))

  53. (setq lin1 (polar mp1 (/ pi 2) 22)) (setq lin2 (polar mp2 (/ pi 2) 22))
  54. (setq lin3 (polar mp3 (/ pi -2) 22)) (setq lin4 (polar mp4 (/ pi -2) 22))
  55. (if (= ktxingshi 1)
  56.   (foreach n (list(list lin1 lin2)(list lin4 lin3)(list yp2 yp3)(list yp4 yp1)) (sk_mkline (car n)(cadr n) "细线5" 256))
  57.      ;(command ".line" lin1 lin2 "" ".line" lin4 lin3 "" ".line" yp2 yp3 "" ".line" yp4 yp1 "")
  58.      (progn
  59.       (sk_mkpl (list yp1 yp2 yp3 yp4) "细线5" 256 1)
  60.       (foreach n (list(list yp1 mp1)(list yp2 mp2)(list yp3 mp3)(list yp4 mp4)) (sk_mkline (car n)(cadr n) "细线5" 256))
  61.       ;(command ".line" yp1 mp1 "" ".line" yp2 mp2 "" ".line" yp3 mp3 "" ".line" yp4 mp4 "")
  62.      )
  63. )
  64. (setq zd1 (polar yp1 (/ pi 2) (/(- (- hh (* 2 csxmian)) (* 2 22)) 2)))
  65. (sk_mkpl (list yp3 zd1 yp2) "细线5" 256 0);不闭合0

  66. (setq peijian1 (polar pd (/ pi -2) 149));加入配件合页
  67. (setq peijian2 (polar pa (/ pi 2) 149))
  68. (setq peijian3 (polar pb (/ pi 2) (/ hh 2)))
  69. (setq a1 "heye" a2 "czhishou")
  70.   (mk_blk a1 peijian1 "配件" 256)
  71.   (mk_blk a1 peijian2 "配件" 256)
  72.   (mk_blk a2 peijian3 "配件" 256)  
  73. ;(setvar "clayer" "细线5") ;设置当前图层
  74.   )
  75.   )
  76. (setvar "OSMODE" 16383) (command ".undo" "e")
  77. (princ)
  78. )

  79. ;;;(setvar "clayer" "细线5") ;设置当前图层
  80. ;;;简单entmake生成直线&直线型多段线函数
  81. ;;;by edata @2014-1-10
  82. ;;;p10 起点 p11终点  l_lay "图层名" l_col 0-256
  83. (defun sk_mkline(p10 p11 l_lay l_col)
  84.   (entmake(list '(0 . "line")
  85.                 (cons 8 l_lay)
  86.                 (cons 62 l_col)
  87.                 (cons 10 p10)
  88.                 (cons 11 p11)
  89.                 ))
  90.   )
  91. ;;;pts 多段线点表 l_lay "图层名" l_col 0-256 l_closed 1关闭 0打开
  92. (defun sk_mkpl(pts l_lay l_col l_closed / pt)
  93.    (entmake (append
  94.               (list '(0 . "LWPOLYLINE")
  95.                     '(100 . "AcDbEntity")
  96.                     '(100 . "AcDbPolyline")
  97.                     (cons 8 l_lay)
  98.                     (cons 62 l_col)
  99.                     (cons 90 (length pts))
  100.                     (cons 70 l_closed)
  101.                     )
  102.       (mapcar '(lambda (pt)(cons 10 pt)) pts ))
  103.   )
  104. )
  105. ;;;插入普通块简单版
  106. ;;;lk_name "块名" ipt 插入点 l_lay "图层名" l_col 0-256颜色
  107. (defun mk_blk(blk_name ipt l_lay l_col)
  108.   (entmake (list '(0 . "INSERT")
  109.                  (cons 8 l_lay)
  110.                  (cons 62 l_col)
  111.                  (cons 2 blk_name)
  112.                  (cons 10 ipt)
  113.                  )
  114.            )
  115.   )
回复

使用道具 举报

发表于 2014-1-12 13:50:19 | 显示全部楼层
本帖最后由 kwok 于 2014-1-12 13:52 编辑

看标题问题已解决,是不是要把悬赏币送出?
选最值答案就ok

点评

啊,是啊,马上点,新手不太懂,请多指点啊  发表于 2014-1-12 16:02
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-25 18:08 , Processed in 0.213417 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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