明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5484|回复: 12

[已解答] 求大神帮忙写个偏移画矩形的lisp

[复制链接]
发表于 2014-4-29 16:05:43 | 显示全部楼层 |阅读模式
本帖最后由 那个猎人 于 2014-4-29 16:07 编辑

我是做设计的,平时玻璃提料需要在分格的基础上四周偏移才能出玻璃尺寸。不知能不能实现自动生成玻璃轮廓。
具体过程是这样的,点击白色中间区域,先判断区域内是否为矩形,不是就提示。是矩形的话就提示输入左右上下需要偏移的距离(A,B,C,D),可以为正负,然后根据四个尺寸,每个边偏移相应的距离,生成红色或者粉红色的玻璃轮廓。
求大神帮忙。

本帖子中包含更多资源

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

x
发表于 2014-4-29 16:13:40 | 显示全部楼层
命题不难,可是发错版块了
http://bbs.mjtd.com/thread-100603-1-1.html
 楼主| 发表于 2014-4-29 17:09:03 | 显示全部楼层
Andyhon 发表于 2014-4-29 16:13
命题不难,可是发错版块了
http://bbs.mjtd.com/thread-100603-1-1.html

哈哈,新手不知道,那我转过去。
发表于 2014-4-30 12:31:16 | 显示全部楼层
莫非是这个玩意?


(defun c:qqq (/ a b c d ent lst n name pt)
  (defun jspt (pt a b) (list (+ (car pt) a) (+ (cadr pt) b)))
  (setvar "cmdecho" 0)
  (command "_boundary" (getpoint "\n拾取内部点:") "")
  (if (and (setq ent (entget (setq name (entlast))))
        (= (cdr (assoc 0 ent)) "LWPOLYLINE")(= (cdr (assoc 90 ent)) 4))
    (progn (entdel name) (setq lst '())
      (foreach n ent(if (= (car n) 10) (setq lst (cons (cdr n) lst))))
      (if (null lstbak001) (setq lstbak001 '(10.0 10.0 10.0 10.0)))
      (setq a (car lstbak001)   b (cadr lstbak001) c (caddr lstbak001) d (cadddr lstbak001))
      (if (setq n (getreal (strcat "\n向左偏移:<" (rtos a) ">"))) (setq a n))
      (if (setq n (getreal (strcat "\n向上偏移:<" (rtos b) ">"))) (setq b n))
      (if (setq n (getreal (strcat "\n向右偏移:<" (rtos c) ">"))) (setq c n))
      (if (setq n (getreal (strcat "\n向下偏移:<" (rtos d) ">"))) (setq d n))
      (setq lstbak001 (list a b c d))
      (setq lst (list (jspt (car lst) c (* -1 d)) (jspt (cadr lst) (* -1 a) (* -1 d))
      (jspt (caddr lst) (* -1 a) b) (jspt (cadddr lst) c b) (jspt (car lst) c (* -1 d))))
      (entmake (append(list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 (length lst)))
      (mapcar  '(lambda (pt) (cons 10 pt)) lst )))))
  (princ)
)

评分

参与人数 1明经币 +1 收起 理由
那个猎人 + 1 赞一个!

查看全部评分

 楼主| 发表于 2014-4-30 15:25:24 | 显示全部楼层
langjs 发表于 2014-4-30 12:31
莫非是这个玩意?

先赞一个,谢谢哈。就是这样,不过能否这样
1.先输入左右上下四个距离,然后点击生成偏移框,再点击又生成偏移框。就是输入一次距离后可以连续点击生成框。
2.这个遇到非四边形的会执行boundary命令生成轮廓,能否判断非四边形后删除生成的轮廓。
 楼主| 发表于 2014-4-30 17:03:01 | 显示全部楼层
langjs 发表于 2014-4-30 12:31
莫非是这个玩意?

大神你好,我在lisp方面是个菜鸟,研究了半天,一句话一句话的查帮助,加上注释才搞明白。然后因为我想先输入距离,再连续点击,所以我把输入距离放到前面,但是怎么能够连续点击不会弄,请大神指点啊

(defun c:qqq (/ a b c d ent lst n name pt)
  (defun jspt (pt a b)
                (list (+ (car pt) a) (+ (cadr pt) b))
   )
   (if (null lstbak001)
                        (setq lstbak001 '(10.0 10.0 10.0 10.0));默认四边偏移距离
           )
      (setq a (car lstbak001)   b (cadr lstbak001) c (caddr lstbak001) d (cadddr lstbak001));四边偏移量定义为变量
      (if (setq n (getreal (strcat "\n向左偏移:<" (rtos a) ">")))
                        (setq a n);定义变量a,若输入实数则存入a;若无输入,则a为默认值
           )
      (if (setq n (getreal (strcat "\n向上偏移:<" (rtos b) ">")))
                        (setq b n)
           )
      (if (setq n (getreal (strcat "\n向右偏移:<" (rtos c) ">")))
                        (setq c n)
           )
      (if (setq n (getreal (strcat "\n向下偏移:<" (rtos d) ">")))
                        (setq d n)
           )
      (setq lstbak001 (list a b c d));四边偏移值存入数组
  (setvar "cmdecho" 0)
  (command "_boundary" (getpoint "\n拾取内部点:") "");创建边界
  (if (and (setq ent (entget (setq name (entlast))))
        (= (cdr (assoc 0 ent)) "LWPOLYLINE")(= (cdr (assoc 90 ent)) 4));判断边界是否为四个顶点的多段线
    (progn (entdel name) (setq lst '())
      (foreach n ent
                        (if (= (car n) 10)
                                (setq lst (cons (cdr n) lst));遍历边界组合,将顶点存入lst内
                        )
           )
            (setq lst (list (jspt (car lst) c (* -1 d)) ;边界第一点(右下角点)x坐标加c,y坐标减d
                                          (jspt (cadr lst) (* -1 a) (* -1 d));边界第二点(左下角点)x坐标减a,y坐标减d
                                          (jspt (caddr lst) (* -1 a) b);边界第三点(左上角点)x坐标减a,y坐标加b
                                          (jspt (cadddr lst) c b);边界第四点(右上角点)x坐标加c,y坐标加b
                                          (jspt (car lst) c (* -1 d));边界第一点(右下角点)x坐标加c,y坐标减d,这个点不加,生成的矩形不闭合
                                 ));通过变换,将偏移后的矩形顶点的二维坐标点存入lst中
      (entmake (append (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 (length lst)))
                                                (mapcar  '(lambda (pt) (cons 10 pt)) lst ))))
          (entdel name)
          )
  (princ)
)

 楼主| 发表于 2014-4-30 18:47:33 | 显示全部楼层
langjs 发表于 2014-4-30 12:31
莫非是这个玩意?

我加了个重复1000次,然后就可以一直重复了,要退出就按esc,请大神们指教,新手哈,请多多鼓励哦

(defun c:qqq (/ a b c d ent lst n name pt)
  (defun jspt (pt a b)
                (list (+ (car pt) a) (+ (cadr pt) b))
   )
   (if (null lstbak001)
                        (setq lstbak001 '(10.0 10.0 10.0 10.0));默认四边偏移距离
           )
      (setq a (car lstbak001)   b (cadr lstbak001) c (caddr lstbak001) d (cadddr lstbak001));四边偏移量定义为变量
      (if (setq n (getreal (strcat "\n向左偏移:<" (rtos a) ">")))
                        (setq a n);定义变量a,若输入实数则存入a;若无输入,则a为默认值
           )
      (if (setq n (getreal (strcat "\n向上偏移:<" (rtos b) ">")))
                        (setq b n)
           )
      (if (setq n (getreal (strcat "\n向右偏移:<" (rtos c) ">")))
                        (setq c n)
           )
      (if (setq n (getreal (strcat "\n向下偏移:<" (rtos d) ">")))
                        (setq d n)
           )
      (setq lstbak001 (list a b c d));四边偏移值存入数组
  (setvar "cmdecho" 0)
  (repeat 1000
  (setq point (getpoint "\n拾取内部点:"))
  (command "_boundary" point "");创建边界
  (if (and (setq ent (entget (setq name (entlast))))
        (= (cdr (assoc 0 ent)) "LWPOLYLINE")(= (cdr (assoc 90 ent)) 4));判断边界是否为四个顶点的多段线
    (progn (entdel name) (setq lst '())
      (foreach n ent
                        (if (= (car n) 10)
                                (setq lst (cons (cdr n) lst));遍历边界组合,将顶点存入lst内
                        )
           )
            (setq lst (list (jspt (car lst) c (* -1 d)) ;边界第一点(右下角点)x坐标加c,y坐标减d
                                          (jspt (cadr lst) (* -1 a) (* -1 d));边界第二点(左下角点)x坐标减a,y坐标减d
                                          (jspt (caddr lst) (* -1 a) b);边界第三点(左上角点)x坐标减a,y坐标加b
                                          (jspt (cadddr lst) c b);边界第四点(右上角点)x坐标加c,y坐标加b
                                          (jspt (car lst) c (* -1 d));边界第一点(右下角点)x坐标加c,y坐标减d,这个点不加,生成的矩形不闭合
                                 ));通过变换,将偏移后的矩形顶点的二维坐标点存入lst中
      (entmake (append (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 (length lst)))
                                                (mapcar  '(lambda (pt) (cons 10 pt)) lst ))))
          (entdel name)
          )
          )
  (princ)
)
发表于 2014-4-30 20:38:01 | 显示全部楼层
那个猎人 发表于 2014-4-30 18:47
我加了个重复1000次,然后就可以一直重复了,要退出就按esc,请大神们指教,新手哈,请多多鼓励哦

(de ...

循环的话把  (repeat 1000   改成  (while   
发表于 2014-4-30 21:35:29 | 显示全部楼层
  1. (defun c:qqq (/ a b c d ent lst n name pt)
  2. (defun jspt (pt a b) (mapcar '+ pt (list a b)))
  3. (if (null lstbak001)
  4.   (setq lstbak001 '(10.0 10.0 10.0 10.0));默认四边偏移距离
  5. )
  6. (setq a (car lstbak001) b (cadr lstbak001) c (caddr lstbak001) d (cadddr lstbak001));四边偏移量定义为变量
  7. (if (setq n (getreal (strcat "\n向左偏移:<" (rtos a) ">")))
  8.   (setq a n);定义变量a,若输入实数则存入a;若无输入,则a为默认值
  9. )
  10. (if (setq n (getreal (strcat "\n向上偏移:<" (rtos b) ">")))
  11.   (setq b n)
  12. )
  13. (if (setq n (getreal (strcat "\n向右偏移:<" (rtos c) ">")))
  14.   (setq c n)
  15. )
  16. (if (setq n (getreal (strcat "\n向下偏移:<" (rtos d) ">")))
  17.   (setq d n)
  18. )
  19. (setq lstbak001 (list a b c d));四边偏移值存入数组
  20. (setvar "cmdecho" 0)
  21. (while (setq point (getpoint "\n拾取内部点:"))
  22.   (command "_boundary" point "");创建边界
  23.   (if (and (setq ent (entget (setq name (entlast))))
  24.         (= (cdr (assoc 0 ent)) "LWPOLYLINE")(= (cdr (assoc 90 ent)) 4));判断边界是否为四个顶点的多段线
  25.   (progn
  26.    (setq lst '())
  27.    (foreach n ent
  28.     (if (= (car n) 10)
  29.      (setq lst (cons (cdr n) lst));遍历边界组合,将顶点存入lst内
  30.     )
  31.    )
  32.    (setq lst (list (jspt (car lst) c (- d)) ;边界第一点(右下角点)x坐标加c,y坐标减d
  33.     (jspt (cadr lst) (- a) (- d));边界第二点(左下角点)x坐标减a,y坐标减d
  34.     (jspt (caddr lst) (- a) b);边界第三点(左上角点)x坐标减a,y坐标加b
  35.     (jspt (cadddr lst) c b);边界第四点(右上角点)x坐标加c,y坐标加b
  36.     (jspt (car lst) c (- d));边界第一点(右下角点)x坐标加c,y坐标减d,这个点不加,生成的矩形不闭合
  37.    ));通过变换,将偏移后的矩形顶点的二维坐标点存入lst中
  38.    (entmake
  39.     (append
  40.      (list
  41.       '(0 . "LWPOLYLINE")
  42.       '(100 . "AcDbEntity")
  43.       '(100 . "AcDbPolyline")
  44.       (cons 90 (length lst))
  45.      )
  46.      (mapcar '(lambda (pt) (cons 10 pt)) lst)
  47.     )
  48.    )
  49.   ))
  50.   (entdel name)
  51. )
  52. (princ)
  53. )
发表于 2014-4-30 21:58:11 | 显示全部楼层
搞得好复杂
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-21 09:55 , Processed in 0.192647 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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