_Levin 发表于 2015-7-7 19:18:35

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

本帖最后由 _Levin 于 2015-7-7 19:21 编辑

http://bbs.mjtd.com/forum.php?mod=image&aid=89082&size=300x300&key=d8f9c4d8ffe3e1c2&nocache=yes&type=fixnone
用一个命令,点方框内任意一点,实现右边这个类似填充的功能,
里面的方块是30*30,
方块的框可以实现是8号颜色吗?然后交叉线是250号颜色,
剩下的是138号颜色
lisp应该要怎么写呢?

fan_zh 发表于 2015-7-8 09:35:44

1.首先方框要矩形,并且是封闭的,没有多余控制点,
2.取出矩形长宽
3.用polar函数取出各个点坐标
4.建图层,设当前层
5.command画线

edata 发表于 2015-7-8 11:08:11

本帖最后由 edata 于 2015-7-8 13:46 编辑

(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(sk_getpt e2))
      (setq pts2(sk_getpt e3))
      (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)
)
   

fan_zh 发表于 2015-7-8 11:20:10

楼上体力活啊,如果有多余控制点的BOUNDARY,如下图,程序就会出错

_Levin 发表于 2015-7-8 15:12:37

edata 发表于 2015-7-8 11:08 static/image/common/back.gif


试试看,谢谢大神

_Levin 发表于 2015-7-8 15:16:12

fan_zh 发表于 2015-7-8 11:20 static/image/common/back.gif
楼上体力活啊,如果有多余控制点的BOUNDARY,如下图,程序就会出错

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

_Levin 发表于 2015-7-8 15:21:31

本帖最后由 _Levin 于 2015-7-8 15:27 编辑

edata 发表于 2015-7-8 11:08 static/image/common/back.gif

http://bbs.mjtd.com/forum.php?mod=image&aid=89094&size=300x300&key=b6546d7d46ec838c&nocache=yes&type=fixnone
大神,我这是几个rec画出来的方框,挨着一起填充就出错了。。怎么办
刚才还发现另一个问题,能做到连续填充的吗?
现在是点一下,变回了十字光标,又要按一下才能继续填充

cable2004 发表于 2015-7-8 15:31:33

本帖最后由 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))))

fan_zh 发表于 2015-7-8 15:50:16

_Levin 发表于 2015-7-8 15:21 static/image/common/back.gif
大神,我这是几个rec画出来的方框,挨着一起填充就出错了。。怎么办
刚才还发现另一个问题,能做 ...

目测没有关闭捕捉

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

cable2004 发表于 2015-7-8 16:14:34

(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
)
页: [1] 2
查看完整版本: 各位大神帮忙看看,像这个填充lisp要怎么实现呢?