明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1475|回复: 12

[提问] 各位大神帮忙看看,像这个填充lisp要怎么实现呢?

  [复制链接]
发表于 2015-7-7 19:18 | 显示全部楼层 |阅读模式
本帖最后由 _Levin 于 2015-7-7 19:21 编辑


用一个命令,点方框内任意一点,实现右边这个类似填充的功能,
里面的方块是30*30,
方块的框可以实现是8号颜色吗?然后交叉线是250号颜色,
剩下的是138号颜色
lisp应该要怎么写呢?

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2015-7-8 09:35 | 显示全部楼层
1.首先方框要矩形,并且是封闭的,没有多余控制点,
2.取出矩形长宽
3.用polar函数取出各个点坐标
4.建图层,设当前层
5.command画线
发表于 2015-7-8 11:08 | 显示全部楼层
本帖最后由 edata 于 2015-7-8 13:46 编辑

  1. (vl-load-com)
  2. (defun c:tt(/ p e1 e2 e3 pts1 pts2 bak_color bak_echo p1 p2 p3 p4 p5 p6 p7 p8)
  3.   (if(setq p(getpoint "\n指定点"))
  4.     (progn
  5.       (setq e1(entlast))
  6.       (setq bak_echo (getvar 'cmdecho))
  7.       (setvar 'cmdecho 0)
  8.       (command "-BOUNDARY" "_non" p "")
  9.       (setq e2(entlast))
  10.       (if(and (sk_eqh5 e1 e2) (sk_type e2 "LWPOLYLINE"))
  11.   (progn
  12.     (command "offset" "30" e2 "_non" p "")   
  13.     (setq e3(entlast))
  14.     (vla-put-color (vlax-ename->vla-object e3) 138)
  15.     (if (and (sk_eqh5 e2 e3) (sk_type e3 "LWPOLYLINE"))
  16.       (progn
  17.         (setq pts1(sk_getpt e2))
  18.         (setq pts2(sk_getpt e3))
  19.         (mapcar 'set '(p1 p2 p3 p4) (mapcar '(lambda(x)(trans x 0 1 )) pts1))
  20.         (mapcar 'set '(p5 p6 p7 p8) (mapcar '(lambda(x)(trans x 0 1 )) pts2))
  21.         (setq bak_color(getvar 'cecolor))
  22.         (setvar 'cecolor "8")        
  23.         (command "rectang" "_non" p1 "_non" p5)
  24.         (sk_mkdj (entlast))
  25.         (command "rectang" "_non" p2 "_non" p6)
  26.         (sk_mkdj (entlast))
  27.         (command "rectang" "_non" p3 "_non" p7)
  28.         (sk_mkdj (entlast))
  29.         (command "rectang" "_non" p4 "_non" p8)
  30.         (sk_mkdj (entlast))
  31.         (setvar 'cecolor bak_color)
  32.         (setvar 'cmdecho bak_echo)
  33.         (entdel e2)
  34.         )
  35.       )
  36.     )
  37.   )
  38.       )
  39.     )
  40.   (princ)
  41.   )
  42. (defun sk_eqh5(e1 e2)(not(equal (sk_dxf e1 5)(sk_dxf e2 5))))
  43. (defun sk_dxf(ent code)(cdr(assoc code(entget ent))))
  44. (defun sk_type(ent str)(equal (sk_dxf ent 0) str))
  45. (defun sk_getpt(ent)(mapcar 'cdr (vl-remove-if-not '(lambda(x)(= 10 (car x)))(entget ent))))
  46. (defun sk_mkdj(ent / p1 p2 p3 p4 pts bak_color)
  47.   (setq pts (sk_getpt ent))
  48.   (mapcar 'set '(p1 p2 p3 p4) (mapcar '(lambda(x)(trans x 0 1 )) pts))
  49.   (setq bak_color(getvar 'cecolor))
  50.   (setvar 'cecolor "250")
  51.   (command "line" "_non" p1 "_non" p3 "")
  52.   (command "line" "_non" p2 "_non" p4 "")
  53.   (setvar 'cecolor bak_color)
  54.   )
  55.    

点评

谢谢  发表于 2015-7-8 18:37

评分

参与人数 2明经币 +2 收起 理由
bzhjl + 1 乐于助人
lucas_3333 + 1 乐于助人

查看全部评分

发表于 2015-7-8 11:20 | 显示全部楼层
楼上体力活啊,如果有多余控制点的BOUNDARY,如下图,程序就会出错

本帖子中包含更多资源

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

x
 楼主| 发表于 2015-7-8 15:12 | 显示全部楼层
edata 发表于 2015-7-8 11:08

试试看,谢谢大神
 楼主| 发表于 2015-7-8 15:16 | 显示全部楼层
fan_zh 发表于 2015-7-8 11:20
楼上体力活啊,如果有多余控制点的BOUNDARY,如下图,程序就会出错

谁叫你要弄多两个控制点呢  那么你叫大神继续改进下

点评

bo命令建立的矩形很多情况下是不理想的  发表于 2015-7-8 15:44
 楼主| 发表于 2015-7-8 15:21 | 显示全部楼层
本帖最后由 _Levin 于 2015-7-8 15:27 编辑
edata 发表于 2015-7-8 11:08


大神,我这是几个rec画出来的方框,挨着一起填充就出错了。。怎么办
刚才还发现另一个问题,能做到连续填充的吗?
现在是点一下,变回了十字光标,又要按一下才能继续填充

本帖子中包含更多资源

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

x

点评

你是怎么画的框?  发表于 2015-7-8 15:32
发表于 2015-7-8 15:31 | 显示全部楼层
本帖最后由 cable2004 于 2015-7-8 15:55 编辑

(command "-BOUNDARY" "_non" p "") 会多节点


(defun c:tt ()
(setvar "CMDECHO" 0)
(if (setq ss (ssget '((0 . "LWPOLYLINE") (90 . 4)))) (progn
  (setq i -1 k 30)
  (repeat (sslength ss)
   (setq ent (entget(ssname ss (setq i (1+ i)))))
   (setq lst (list) pts (list))
   (foreach x ent (if (= (car x) 10) (setq lst (cons (cdr x) lst))))
   (mapcar '(lambda (x y)
                (setq ang (angle x y)
                      p1  (polar x ang k)
                      p2  (polar x (+ (* 0.25 pi) ang) (* (sqrt 2) k))
                      p3  (polar x (+ (* 0.5 pi) ang) k)
                      )
              (entmake-Line p2 p3)
              (entmake-Line p2 p1)
              (entmake-Line x p2)
              (entmake-Line p3 p1)
              (setq pts (cons p2 pts))
                 )
              (cons (last lst)lst)lst)
    (entmake-Line (car pts) (cadr pts))
    (entmake-Line (cadr pts) (caddr pts))
    (entmake-Line (caddr pts) (cadddr pts))
    (entmake-Line (cadddr pts) (car pts))
)))
(setvar "CMDECHO" 1)
(princ)
)

(defun entmake-Line (p1 p2 )
  (entmakex (list (cons 0 "LINE") (cons 10 p1)(cons 11 p2)(cons 62 1))))
发表于 2015-7-8 15:50 | 显示全部楼层
_Levin 发表于 2015-7-8 15:21
大神,我这是几个rec画出来的方框,挨着一起填充就出错了。。怎么办
刚才还发现另一个问题,能做 ...

目测没有关闭捕捉

在程序开头加上
(setvar 'osmode 0)

点评

是呀,cable2004修改完善了,谢谢他  发表于 2015-7-8 18:32
和捕捉没关系,是因为bo出来多了点,  发表于 2015-7-8 17:35
发表于 2015-7-8 16:14 | 显示全部楼层
(vl-load-com)
(defun c:tt(/ p e1 e2 e3 pts1 pts2 bak_color bak_echo p1 p2 p3 p4 p5 p6 p7 p8)
  (if(setq p(getpoint "\n指定点"))
    (progn
      (setq e1(entlast))
      (setq bak_echo (getvar 'cmdecho))
      (setvar 'cmdecho 0)
      (command "-BOUNDARY" "_non" p "")
      (setq e2(entlast))
      (if(and (sk_eqh5 e1 e2) (sk_type e2 "LWPOLYLINE"))
  (progn
    (command "offset" "30" e2 "_non" p "")   
    (setq e3(entlast))
    (vla-put-color (vlax-ename->vla-object e3) 138)
    (if (and (sk_eqh5 e2 e3) (sk_type e3 "LWPOLYLINE"))
      (progn
        (setq pts1(check (sk_getpt e2)))
        (setq pts2(check (sk_getpt e3)))
        (if (and (= 4 (length pts1))(= 4 (length pts2))) (progn
        (mapcar 'set '(p1 p2 p3 p4) (mapcar '(lambda(x)(trans x 0 1 )) pts1))
        (mapcar 'set '(p5 p6 p7 p8) (mapcar '(lambda(x)(trans x 0 1 )) pts2))
        (setq bak_color(getvar 'cecolor))
        (setvar 'cecolor "8")        
        (command "rectang" "_non" p1 "_non" p5)
        (sk_mkdj (entlast))
        (command "rectang" "_non" p2 "_non" p6)
        (sk_mkdj (entlast))
        (command "rectang" "_non" p3 "_non" p7)
        (sk_mkdj (entlast))
        (command "rectang" "_non" p4 "_non" p8)
        (sk_mkdj (entlast))
        (setvar 'cecolor bak_color)
        (setvar 'cmdecho bak_echo)
        (entdel e2)
        )))
      )
    )
  )
      )
    )
  (princ)
  )
(defun sk_eqh5(e1 e2)(not(equal (sk_dxf e1 5)(sk_dxf e2 5))))
(defun sk_dxf(ent code)(cdr(assoc code(entget ent))))
(defun sk_type(ent str)(equal (sk_dxf ent 0) str))
(defun sk_getpt(ent)(mapcar 'cdr (vl-remove-if-not '(lambda(x)(= 10 (car x)))(entget ent))))
(defun sk_mkdj(ent / p1 p2 p3 p4 pts bak_color)
  (setq pts (sk_getpt ent))
  (mapcar 'set '(p1 p2 p3 p4) (mapcar '(lambda(x)(trans x 0 1 )) pts))
  (setq bak_color(getvar 'cecolor))
  (setvar 'cecolor "250")
  (command "line" "_non" p1 "_non" p3 "")
  (command "line" "_non" p2 "_non" p4 "")
  (setvar 'cecolor bak_color)
  )

(defun check(lst / pts)
  (mapcar '(lambda (x y z)
             (if (null (equal (- (distance x z) (distance z y) (distance y x)) 0))
              (setq pts (cons y pts))
                 ))
              (cons (last lst)lst) lst (append (cdr lst) (list (car lst))))
  pts
)

点评

金钱全给你了,谢谢  发表于 2015-7-8 18:35
谢谢大神  发表于 2015-7-8 18:33

评分

参与人数 2明经币 +1 金钱 +68 收起 理由
_Levin + 18 很给力!
edata + 1 + 50 很给力!

查看全部评分

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

本版积分规则

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

GMT+8, 2024-5-2 08:40 , Processed in 0.358810 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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