明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 9193|回复: 26

反画出填充边界线,并关联边界线与填充!(申请编LISP)

  [复制链接]
发表于 2007-7-15 18:51:00 | 显示全部楼层 |阅读模式

如题,有一CAD2000格式的文件,已经有填充图案,可没有边界线,如何反画出填充边界线,并关联边界线与填充!期待高手编LISP!!!

(我知道CAD2006版本有,可不知道怎么提出里面的lisp功能文件)

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2007-7-19 10:30:00 | 显示全部楼层

;;; HATCHB.LSP ver 2.0
;;; Recreates hatch boundary by selecting a hatch
;;; Boundary is created in current layer/color/linetype in WCS
;;; By Jimmy Bergmark
;;; Copyright (C) 1997-2003 JTB World, All Rights Reserved
;;; Website: www.jtbworld.com
;;; E-mail: info@jtbworld.com
;;; 2000-02-12 - First release
;;; 2000-03-27 - Counterclockwise arc's and ellipse's fixed
;;;              Objects created joined to lwpolyline if possible
;;;              Error-handling, undo of command
;;;              Can handle PLINETYPE = 0,1,2
;;; 2000-03-30 - Integrating hatchb and hatchb14
;;;              Selection of many hatches
;;;              Splines supported if closed.
;;; 2001-04-02 - Fixed bug with entmake of line with no Z for r14
;;; 2001-07-31 - Removed an irritating semicolon to enable polylines to be created.
;;; 2001-10-04 - Changed mail and homepage so it's easy to find when new versions comes up.
;;; 2003-02-06 - Minor fix
;;; 2003-02-17 - Area returned if no islands is found since it's not consistant
;;; 2003-05-19 - Fix to take PEDITACCEPT variable used in AutoCAD 2004 into account
;;; Tested on AutoCAD r14, 2000, 2000i, 2002, 2004
;;; should be working on older versions too.

(defun c:hb () (c:hatchb)) ; this line can be commented out if there is an existing command called hb
(defun c:hatchb (/     es    blay  ed1   ed2   loops1      bptf  part
             et    noe   plist ic    bul   nr    ang1  ang2  obj *ModelSpace* *PaperSpace*
             space cw errexit undox olderr oldcmdecho ss1 lastent en1 en2 ss lwp
             list->variantArray 3dPoint->2dPoint A2k ent i ss2
             knot-list controlpoint-list kn cn pos xv bot area hst
            )
(setq A2k (>= (substr (getvar "ACADVER") 1 2) "15"))
(if A2k
   (progn
     (defun list->variantArray (ptsList / arraySpace sArray)
       (setq arraySpace
          (vlax-make-safearray
        vlax-vbdouble
        (cons 0 (- (length ptsList) 1))
          )
       )
       (setq sArray (vlax-safearray-fill arraySpace ptsList))
       (vlax-make-variant sArray)
     )
     (defun areaOfObject (en / curve area)
       (if en
     (if A2k
       (progn
         (setq curve (vlax-ename->vla-object en))
         (if
           (vl-catch-all-error-p
         (setq
           area
            (vl-catch-all-apply 'vlax-curve-getArea (list curve))
         )
           )
        nil
        area
         )
       )
       (progn
         (command "._area" "_O" en)
         (getvar "area")
       )
     )
       )
     )
   )
)
(if A2k
  (defun 3dPoint->2dPoint (3dpt)
    (list (float (car 3dpt)) (float (cadr 3dpt)))
  )
)

  (defun errexit (s)
    (princ "\nError:  ")
    (princ s)
    (restore)
  )

  (defun undox ()
    (command "._ucs" "_p")
    (command "._undo" "_E")
    (setvar "cmdecho" oldcmdecho)
    (setq *error* olderr)
    (princ)
  )

  (setq olderr  *error*
        restore undox
        *error* errexit
  )
  (setq oldcmdecho (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (command "._UNDO" "_BE")
  (if A2k (progn
    (vl-load-com)
    (setq *ModelSpace* (vla-get-ModelSpace
                         (vla-get-ActiveDocument (vlax-get-acad-object))
                       )
          *PaperSpace* (vla-get-PaperSpace
                         (vla-get-ActiveDocument (vlax-get-acad-object))
                       )
    ))
  )


; For testing purpose
; (setq A2k nil)
  
  (if (/= (setq ss2 (ssget '((0 . "HATCH")))) nil)
   (progn
    (setq i 0)
    (setq area 0)
    (setq bMoreLoops nil)
    (while (setq ent (ssname ss2 i))
      (setq ed1 (entget ent))
      (if (not (equal (assoc 210 ed1) '(210 0.0 0.0 1.0))) (princ "\nHatch not in WCS!"))
      (setq xv (cdr (assoc 210 ed1)))
      (command "._ucs" "_w")
      (setq loops1 (cdr (assoc 91 ed1))) ; number of boundary paths (loops)
      (if (and A2k (= (strcase (cdr (assoc 410 ed1))) "MODEL"))
        (setq space *ModelSpace*)
        (setq space *PaperSpace*)
      )
      (repeat loops1
        (setq ed1 (member (assoc 92 ed1) ed1))
        (setq bptf (cdr (car ed1))) ; boundary path type flag
        (setq ic (cdr (assoc 73 ed1))) ; is closed
        (setq noe (cdr (assoc 93 ed1))) ; number of edges
    (setq bot (cdr (assoc 92 ed1))) ; boundary type
    (setq hst (cdr (assoc 75 ed1))) ; hatch style
        (setq ed1 (member (assoc 72 ed1) ed1))
        (setq bul (cdr (car ed1))) ; bulge
        (setq plist nil)
        (setq blist nil)
        (cond
          ((> (boole 1 bptf 2) 0) ; polyline
           (repeat noe
             (setq ed1 (member (assoc 10 (cdr ed1)) ed1))
             (setq plist (append plist (list (cdr (assoc 10 ed1)))))
             (setq blist (append blist
                                 (if (> bul 0)
                                   (list (cdr (assoc 42 ed1)))
                                   nil
                                 )
                         )
             )
           )
           (if A2k (progn
             (setq polypoints
                    (apply 'append
                           (mapcar '3dPoint->2dPoint plist)
                    )
             )
             (setq VLADataPts (list->variantArray polypoints))
             (setq obj (vla-addLightweightPolyline space VLADataPts))
             (setq nr 0)
             (repeat (length blist)
               (if (/= (nth nr blist) 0)
                 (vla-setBulge obj nr (nth nr blist))
               )
               (setq nr (1+ nr))
             )
             (if (= ic 1)
               (vla-put-closed obj T)
             )
            )
            (progn
              (if (= ic 1)
                (entmake '((0 . "POLYLINE") (66 . 1) (70 . 1)))
                (entmake '((0 . "POLYLINE") (66 . 1)))
              )
              (setq nr 0)
              (repeat (length plist)
                (if (= bul 0)
                  (entmake (list (cons 0 "VERTEX")
                                 (cons 10 (nth nr plist))
                           )
                  )
                  (entmake (list (cons 0 "VERTEX")
                                 (cons 10 (nth nr plist))
                                 (cons 42 (nth nr blist))
                           )
                  )
                )
                (setq nr (1+ nr))
              )
              (entmake '((0 . "SEQEND")))
            )
           )
          )
          (t ; not polyline
           (setq lastent (entlast))
           (setq lwp T)
           (repeat noe
             (setq et (cdr (assoc 72 ed1)))
             (cond
               ((= et 1) ; line
                (setq ed1 (member (assoc 10 (cdr ed1)) ed1))
                (if A2k
                  (vla-AddLine
                    space
                    (vlax-3d-point (cdr (assoc 10 ed1)))
                    (vlax-3d-point (cdr (assoc 11 ed1)))
                  )
                  (entmake
                    (list
                      (cons 0 "LINE")
                      (list 10 (cadr (assoc 10 ed1)) (caddr (assoc 10 ed1)) 0)
                      (list 11 (cadr (assoc 11 ed1)) (caddr (assoc 11 ed1)) 0)
            ;  (cons 210 xv)
                    )
                  )
                )
                (setq ed1 (cddr ed1))
               )
               ((= et 2) ; circular arc
                 (setq ed1 (member (assoc 10 (cdr ed1)) ed1))
                 (setq ang1 (cdr (assoc 50 ed1)))
                 (setq ang2 (cdr (assoc 51 ed1)))
                 (setq cw (cdr (assoc 73 ed1)))
                 (if (equal ang2 6.28319 0.00001)
                   (progn
                     (if A2k
                       (vla-AddCircle
                         space
                         (vlax-3d-point (cdr (assoc 10 ed1)))
                         (cdr (assoc 40 ed1))
                       )
                       (entmake (list (cons 0 "CIRCLE")
                                      (assoc 10 ed1)
                                      (assoc 40 ed1)
                                )
                       )
                     )
                     (setq lwp nil)
                   )
                   (if A2k
                     (vla-AddArc
                       space
                       (vlax-3d-point (cdr (assoc 10 ed1)))
                       (cdr (assoc 40 ed1))
                       (if (= cw 0)
                         (- 0 ang2)
                         ang1
                       )
                       (if (= cw 0)
                         (- 0 ang1)
                         ang2
                       )
                     )
                     (entmake (list (cons 0 "ARC")
                                    (assoc 10 ed1)
                                    (assoc 40 ed1)
                                    (cons 50
                                          (if (= cw 0)
                                            (- 0 ang2)
                                            ang1
                                          )
                                    )
                                    (cons 51
                                          (if (= cw 0)
                                            (- 0 ang1)
                                            ang2
                                          )
                                    )
                              )
                     )
                   )
                 )
                 (setq ed1 (cddddr ed1))
               )
               ((= et 3) ; elliptic arc
                (setq ed1 (member (assoc 10 (cdr ed1)) ed1))
                (setq ang1 (cdr (assoc 50 ed1)))
                (setq ang2 (cdr (assoc 51 ed1)))
                (setq cw (cdr (assoc 73 ed1)))
                (if A2k (progn
                  (setq obj (vla-AddEllipse
                              space
                              (vlax-3d-point (cdr (assoc 10 ed1)))
                              (vlax-3d-point (cdr (assoc 11 ed1)))
                              (cdr (assoc 40 ed1))
                            )
                  )
                  (vla-put-startangle obj (if (= cw 0) (- 0 ang2) ang1))
                  (vla-put-endangle obj (if (= cw 0) (- 0 ang1) ang2))
                 )
                 (princ "\nElliptic arc not supported!")
                )
                (setq lwp nil)
               )
               ((= et 4) ; spline
                (setq ed1 (member (assoc 94 (cdr ed1)) ed1))
                (setq knot-list nil)
                (setq controlpoint-list nil)
        (setq kn (cdr (assoc 95 ed1)))
                (setq cn (cdr (assoc 96 ed1)))
                (setq pos (vl-position (assoc 40 ed1) ed1))
                (repeat kn
                  (setq knot-list (cons (cons 40 (cdr (nth pos ed1))) knot-list))
                  (setq pos (1+ pos))
                )
                (setq pos (vl-position (assoc 10 ed1) ed1))
                (repeat cn
                  (setq controlpoint-list (cons (cons 10 (cdr (nth pos ed1))) controlpoint-list))
                  (setq pos (1+ pos))
                )
                (setq knot-list (reverse knot-list))
                (setq controlpoint-list (reverse controlpoint-list))
                (entmake (append
                       (list '(0 . "SPLINE"))
                               (list (cons 100 "AcDbEntity"))
                               (list (cons 100 "AcDbSpline"))
                               (list (cons 70 (+ 1 8 (* 2 (cdr (assoc 74 ed1))) (* 4 (cdr (assoc 73 ed1))))))
                               (list (cons 71 (cdr (assoc 94 ed1))))
                               (list (cons 72 kn))
                               (list (cons 73 cn))
                               knot-list
                               controlpoint-list
                      )
                )
        (setq ed1 (member (assoc 10 ed1) ed1))
                (setq lwp nil)
               )
             ) ; end cond
           ) ; end repeat noe
           (if lwp (progn
             (setq en1 (entnext lastent))
             (setq ss (ssadd))
             (ssadd en1 ss)
             (while (setq en2 (entnext en1))
               (ssadd en2 ss)
               (setq en1 en2)
             )
         (if (= (getvar "peditaccept") 1)
               (command "_.pedit" (entlast) "_J" ss "" "")
           (command "_.pedit" (entlast) "_Y" "_J" ss "" "")
         )
          ))

          ) ; end t
        ) ; end cond
;    Tries to get the area on islands but it's not clear how to know if an island is filled or not
;    and if it should be substracted or added to the total area.
;    (if (or (= bot 0) (= (boole 1 bot 1) 1)) (setq area (+ area (areaOfObject (entlast)))))
;    (if (and (/= hst 1) (/= bot 0) (= (boole 1 bot 1) 0)) (setq area (- area (areaOfObject (entlast)))))
;    (princ "\n") (princ bot) (princ "\n") (princ hst) (princ "\n")
;    (princ (areaOfObject (entlast)))
      ) ; end repeat loops1
      (if (= loops1 1) (setq area (+ area (areaOfObject (entlast)))) (setq bMoreLoops T))
      (setq i (1+ i))
    )
   )
  )
  (if (and area (not bMoreLoops)) (progn
    (princ "\nTotal Area = ")
    (princ area)
  ))
  (restore)
  (princ)
)

回复 支持 2 反对 0

使用道具 举报

发表于 2010-8-22 23:58:00 | 显示全部楼层

在FSXM那里找到一个绘制关联填充边界,很好用。

 

可惜没有源码。

本帖子中包含更多资源

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

x
回复 支持 1 反对 0

使用道具 举报

发表于 2020-10-18 10:28:29 | 显示全部楼层
zgyxn 发表于 2007-7-19 10:30
;;; HATCHB.LSP ver 2.0 ;;; Recreates hatch boundary by selecting a hatch ;;; Boundary is created in  ...

大神的历害,有源码,有能实现功能,,顶起
发表于 2007-7-15 18:58:00 | 显示全部楼层
我觉得这是有难度的,在网上看到关于填充生成边界的帖子,都不是很完美!!
发表于 2007-7-16 10:56:00 | 显示全部楼层
这个功能的确很难,要做到像R2006那样,估计得吃透图案填充的dxf码。
 楼主| 发表于 2007-7-16 13:16:00 | 显示全部楼层

湘源控规---->工具--->已经能够反画出填充边界线,并实现关联了!!真是高啊,哪位高人可以把它单独提取出来!!!!

本帖子中包含更多资源

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

x
发表于 2007-7-16 18:00:00 | 显示全部楼层
jaminth发表于2007-7-15 18:51:00如题,有一CAD2000格式的文件,已经有填充图案,可没有边界线,如何反画出填充边界线,并关联边界线与填充!期待高手编LISP!!!(我知道CAD2006版本有,可不知道怎么提出里面的lisp功能文件)

2006自带的吗?在哪里?还不知道,请说说
 楼主| 发表于 2007-7-16 20:19:00 | 显示全部楼层

 

双击欲反画的填充图案,调出填充工具面板,......按提示操作即可!

本帖子中包含更多资源

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

x
发表于 2007-7-16 22:23:00 | 显示全部楼层
  1. ;Takes a hatch ename or elist and creates an new associative version of
  2. ;the hatch along with new boundary objects.
  3. ;Returns the ename of the new hatch if successful.
  4. ;
  5. (defun acet-hatch-remake ( e1 / na lst loop loop2 edge )
  6. (if (equal (type e1) 'ENAME)
  7.      (setq na e1
  8.            e1 (entget na)
  9.      );setq then
  10.      (setq na (cdr (assoc -1 e1)));setq else
  11. );if
  12. (setq lst (acet-hatch-loop-make e1))   ;; make the boundary edges  
  13. (entmake e1)      ;; make a copy of the hatch
  14. (setq na (entlast)
  15.        e1 (entget na)
  16.        e1 (acet-hatch-edge-id-remove-all e1)   ;; remove the existing boundary object references
  17. );setq
  18. (acet-hatch-boundary-assoc-db e1 lst T)  ;; add the new ones
  19. (setq e1 (entget na))
  20. (acet-hatch-update na)
  21. na
  22. );defun acet-hatch-remake
acet(就是express tools啦)的函数.参考一下
发表于 2007-7-16 22:35:00 | 显示全部楼层
不用ET行不
 楼主| 发表于 2007-7-17 13:34:00 | 显示全部楼层
你的文件无痕.怎么用?
发表于 2007-7-17 21:40:00 | 显示全部楼层

没办法直接用(如果不装et工具的话)

仅仅是拿出来参考.不是用来解决问题:P

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

本版积分规则

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

GMT+8, 2024-11-17 08:54 , Processed in 0.227568 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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