明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2808|回复: 12

根据不同的区域大小插入不同的块

  [复制链接]
发表于 2004-1-14 10:40:00 | 显示全部楼层 |阅读模式
这次又要麻烦飞版主了,上次你帮我解决的那个根据两个交点间距不同,插入不同的块,十分好用。这次我遇到了一个新的情况。你可以看看这张图。它是希望能够,根据不同的区域大小,插入不同的块,我想了很久也没什么好办法,你能帮助一下吗?
再次谢谢。

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2004-1-15 10:50:00 | 显示全部楼层
我做了一个可以点选的,要和1搂的图配合用,可能也只能这样了。
各位版主,有好办法可以实现复选,请跟帖告知,谢谢。

本帖子中包含更多资源

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

x
发表于 2004-1-15 12:28:00 | 显示全部楼层

  1. ;;有是有,只是要先框選到要插入圖塊的圍範,不夠完整
  2. ;;BY 龍龍仔(LUCAS)
  3. ;;-------------------------------------------------------------
  4. (defun GETINTERPOINTS (ENT2 / E2 PT3 PT4)
  5.   (setq E2 (entget ENT2))
  6.   (setq PT3 (cdr (assoc 10 E2)))
  7.   (setq PT4 (cdr (assoc 11 E2)))
  8.   (inters PT1 PT2 PT3 PT4)
  9. )
  10. (defun GETALLINTERS (SS / N I J ENT1 POINTS POINT S1 PT1 PT2)
  11.   (setq        N      (sslength SS)
  12.         POINTS '()
  13.   )
  14.   (setq I 0)
  15.   (repeat N
  16.     (setq ENT1 (ssname SS I))
  17.     (setq PT1 (cdr (assoc 10 (entget ENT1))))
  18.     (setq PT2 (cdr (assoc 11 (entget ENT1))))
  19.     (setq S1 (ssget "F" (list PT1 PT2)))
  20.     (setq J 0)
  21.     (repeat (sslength S1)
  22.       (if (and (setq POINT (GETINTERPOINTS (ssname S1 J)))
  23.                (not (member POINT POINTS))
  24.           )
  25.         (setq POINTS (append POINTS (list POINT)))
  26.       )
  27.       (setq J (1+ J))
  28.     )
  29.     (setq I (1+ I))
  30.   )
  31.   POINTS
  32. )

  33. (defun C:TTT (/ OS CMD SS PT_LIST)
  34.   (setq OS (getvar "osmode"))
  35.   (setq CMD (getvar "cmdecho"))
  36.   (setq SS (ssget '((0 . "LINE"))))
  37.   (command "_.undo" "be")
  38.   (setvar "osmode" 0)
  39.   (setvar "cmdecho" 0)
  40.   (setq PT_LIST (GETALLINTERS SS))
  41.   (setq
  42.     PT_LIST
  43.      (vl-sort PT_LIST
  44.               (function
  45.                 (lambda        (P1 P2)
  46.                   (cond        ((< (cadr P1) (cadr P2)) t)
  47.                         ((and (= (cadr P1) (cadr P2))
  48.                               (< (car P1) (car P2))
  49.                          )
  50.                          t
  51.                         )
  52.                         (t NIL)
  53.                   )
  54.                 )
  55.               )
  56.      )
  57.   )
  58.   (foreach ENT1        PT_LIST
  59.     (setq ENT (list (+ (car ENT1) 10) (+ (cadr ENT1) 10) 0.0))
  60.     (setq EN (entlast))
  61.     ;;---這步很未寫好,改善中
  62.     (command "_.boundary"
  63.              (mapcar '(lambda (X Y) (/ (+ X Y) 2.0))
  64.                      (polar ENT1 0.0 200.0)
  65.                      (polar ENT1 (* 0.5 pi) 300.0)
  66.              )
  67.              ""
  68.     )
  69.     ;;--
  70.     (setq EN1 (entlast))
  71.     (setq SS (ssget "C"
  72.                     (list (+ (car ENT) 1180) (+ (cadr ENT) 1180) 0.0)
  73.                     ENT
  74.                     '((0 . "INSERT,LINE"))
  75.              )
  76.     )
  77.     (setq SS1 (ssget "C"
  78.                      ENT
  79.                      (list (+ (car ENT) 1180) (+ (cadr ENT) 580) 0.0)
  80.                      '((0 . "INSERT,LINE"))
  81.               )
  82.     )
  83.     (setq SS2 (ssget "C"
  84.                      ENT
  85.                      (list (+ (car ENT) 580) (+ (cadr ENT) 580) 0.0)
  86.                      '((0 . "INSERT,LINE"))
  87.               )
  88.     )
  89.     (cond
  90.       ((and (not SS) (not (equal EN (entlast))))
  91.        (command "_.insert" "1100x1100" ENT1 "" "" "")
  92.        (command "_.erase" EN1 "")
  93.       )
  94.       ((and (not SS1) (not (equal EN (entlast))))
  95.        (command "_.insert" "1100x500" ENT1 "" "" "")
  96.        (command "_.erase" EN1 "")
  97.       )
  98.       ((and (not SS2) (not (equal EN (entlast))))
  99.        (command "_.insert" "500x500" ENT1 "" "" "")
  100.        (command "_.erase" EN1 "")
  101.       )
  102.     )
  103.   )
  104.   (command "_.undo" "e")
  105.   (setvar "osmode" OS)
  106.   (setvar "cmdecho" CMD)
  107. )
  108. ;;-------------------------------------------------------------
发表于 2004-1-15 18:54:00 | 显示全部楼层
已知条件是什么?是那个线框,还是交点?
发表于 2004-1-16 07:52:00 | 显示全部楼层

  1. ;;發現用inters交點精度不太好
  2. ;;BY 龍龍仔(LUCAS)
  3. ;;要先框選到要插入圖塊的圍範,不夠完整
  4. ;;-----------------------------------------------
  5. ;; CDNC5-02.LSP
  6. ;; Bill Kramer
  7. ;; Find all intersections between objects in
  8. ;; the selection set SS.
  9. ;; Process - Create drawing with intersecting lines and lwpolylines.
  10. ;;           Load function set
  11. ;;           Run command function INTLINES
  12. ;;           Intersections are marked with POINT objects on current layer
  13. (defun INTLINES        (/ SSL                        ;length of SS
  14.                  PTS                        ;returning list
  15.                  AOBJ1                        ;Object 1
  16.                  AOBJ2                        ;Object 2
  17.                  N1                        ;Loop counter
  18.                  N2                        ;Loop counter
  19.                  IPTS                        ;intersects
  20.                  A N NN        HOLDOSMODE)
  21.   (vl-load-com)
  22.   (command "_.UNDO" "_GROUP")
  23.   (setq HOLDOSMODE (getvar "OSMODE"))
  24.   (setvar "OSMODE" 0)
  25.   (setq SS (ssget '((0 . "*LINE,ARC,CIRCLE,ELLIPSE"))))
  26.   (setq        N1  0                                ;index for outer loop
  27.         SSL (sslength SS)
  28.   )                                        ; Outer loop, first through second to last
  29.   (while (< N1 (1- SSL))                ; Get object 1, convert to VLA object type
  30.     (setq AOBJ1        (ssname SS N1)
  31.           AOBJ1        (vlax-ename->vla-object AOBJ1)
  32.           N2        (1+ N1)
  33.     )                                        ;index for inner loop
  34. ;;; Inner loop, go through remaining objects
  35.     (while (< N2 SSL)                        ; Get object 2, convert to VLA object
  36.       (setq AOBJ2 (ssname SS N2)
  37.             AOBJ2 (vlax-ename->vla-object AOBJ2)
  38. ;;;Find intersections of Objects
  39.             IPTS  (vla-intersectwith
  40.                     AOBJ1
  41.                     AOBJ2
  42.                     0
  43.                   )                        ; variant result
  44.             IPTS  (vlax-variant-value IPTS)
  45.       )
  46. ;;;Variant array has values?
  47.       (if (> (vlax-safearray-get-u-bound IPTS 1) 0)
  48.         (progn                                ;array holds values, convert it
  49.           (setq        IPTS                        ;to a list.
  50.                  (vlax-safearray->list IPTS)
  51.           )
  52. ;;;Loop through list constructing points
  53.           (while (> (length IPTS) 0)
  54.             (setq PTS  (cons (list (car IPTS)
  55.                                    (cadr IPTS)
  56.                                    (caddr IPTS)
  57.                              )
  58.                              PTS
  59.                        )
  60.                   IPTS (cdddr IPTS)
  61.             )
  62.           )
  63.         )
  64.       )
  65.       (setq N2 (1+ N2))
  66.     )                                        ;inner loop end
  67.     (setq N1 (1+ N1))
  68.   )                                        ;outer loop end
  69.   (setvar "OSMODE" HOLDOSMODE)
  70.   (command "_.UNDO" "_END")
  71.   PTS
  72. )

  73. (defun C:TTT (/ OS CMD SS PT_LIST EN ENT1 EN1 ENT ARE)
  74.   (setq PT_LIST (INTLINES))
  75.   (setq CMD (getvar "cmdecho"))
  76.   (setvar "cmdecho" 0)
  77.   (command "_.undo" "be")
  78.   (setq OS (getvar "osmode"))
  79.   (setvar "osmode" 0)
  80.   (setq
  81.     PT_LIST
  82.      (vl-sort PT_LIST
  83.               (function
  84.                 (lambda        (P1 P2)
  85.                   (cond        ((< (cadr P1) (cadr P2)) t)
  86.                         ((and (equal (cadr P1) (cadr P2) 0.00001)
  87.                               (< (car P1) (car P2))
  88.                          )
  89.                          t
  90.                         )
  91.                         (t NIL)
  92.                   )
  93.                 )
  94.               )
  95.      )
  96.   )
  97.   (foreach ENT1        PT_LIST
  98.     (setq ENT (list (+ (car ENT1) 300.0) (+ (cadr ENT1) 300.0) 0.0))
  99.     (setq EN (entlast))
  100.     (vl-cmdf "_.boundary" ENT "")
  101.     (setq EN1 (entlast))
  102.     (if        (not (equal EN EN1))
  103.       (progn
  104.         (setq ARE (vla-get-area (vlax-ename->vla-object EN1)))
  105.         (cond
  106.           ((equal ARE (* 1200.0 1200.0) 0.001)
  107.            (vl-cmdf "_.insert" "1100x1100" ENT1 "" "" "")
  108.           )
  109.           ((equal ARE (* 1200.0 600.0) 0.001)
  110.            (vl-cmdf "_.insert" "1100x500" ENT1 "" "" "")
  111.           )
  112.           ((equal ARE (* 600.0 600.0) 0.001)
  113.            (vl-cmdf "_.insert" "500x500" ENT1 "" "" "")
  114.           )
  115.         )
  116.         (command "_.erase" EN1 "")
  117.       )
  118.     )
  119.   )
  120.   (setvar "osmode" OS)
  121.   (command "_.undo" "e")
  122.   (setvar "cmdecho" CMD)
  123.   (princ)
  124. )
  125. ;;-------------------------------------------------------------



2樓的程序不用那麼長

;;BY 龍龍仔(LUCAS)
(defun C:TT (/ CMD OS PT1 EN EN1 ARE ENT1)
  (defun AX:GETBOUNDINGBOX (ENT / LL UR)
    (vla-getboundingbox (vlax-ename->vla-object ENT) 'LL 'UR)
    (mapcar 'vlax-safearray->list (list LL UR))
  )
  (setq CMD (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (command "_.undo" "be")
  (setq OS (getvar "osmode"))
  (setvar "osmode" 0)
  (while (setq PT1 (getpoint "\n指定內部點: "))
    (setq EN (entlast))
    (vl-cmdf "_.boundary" PT1 "")
    (setq EN1 (entlast))
    (if        (not (equal EN EN1))
      (progn
        (setq ARE (vla-get-area (vlax-ename->vla-object EN1)))
        (setq ENT1 (car (AX:GETBOUNDINGBOX EN1)))
        (cond
          ((equal ARE (* 1200.0 1200.0) 0.001)
           (vl-cmdf "_.insert" "1100x1100" ENT1 "" "" "")
          )
          ((equal ARE (* 1200.0 600.0) 0.001)
           (vl-cmdf "_.insert" "1100x500" ENT1 "" "" "")
          )
          ((equal ARE (* 600.0 600.0) 0.001)
           (vl-cmdf "_.insert" "500x500" ENT1 "" "" "")
          )
        )
        (command "_.erase" EN1 "")
      )
    )
  )
  (setvar "osmode" OS)
  (command "_.undo" "e")
  (setvar "cmdecho" CMD)
  (princ)
)
 楼主| 发表于 2004-1-16 13:14:00 | 显示全部楼层
谢谢龙版主帮我改程序。

对于龙版主那个框选的程序我有点看不懂,我现在想多增加两个功能不知行不行?
1.能不能判断框中有东西就不要插块?
2.能不能自动实现,实际插的是同一个块,只是方向旋转90度。因为在同一张图中,长方形的
   块,可能是横放,也有可能是竖放。
详见附件。

万分感谢,若能实现,龙版主可帮了我一大忙了。

本帖子中包含更多资源

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

x
发表于 2004-1-16 16:12:00 | 显示全部楼层
本帖最后由 作者 于 2004-1-17 7:53:26 编辑


  1. ;;BY 龍龍仔(LUCAS)
  2. ;;要先框選到要插入圖塊的圍範,不夠完整
  3. ;;-----------------------------------------------
  4. ;;(setq SS (ssget '((0 . "*LINE") (8 . "right"))));;注意:選線的條件

  5. 1.能不能判斷框中有東西就不要插塊?(修正完成)

  6. (defun AX:GETBOUNDINGBOX (ENT / LL UR)
  7.   (vla-getboundingbox (vlax-ename->vla-object ENT) 'LL 'UR)
  8.   (mapcar 'vlax-safearray->list (list LL UR))
  9. )

  10. ;; CDNC5-02.LSP
  11. ;; Bill Kramer
  12. ;; Find all intersections between objects in
  13. ;; the selection set SS.
  14. ;; Process - Create drawing with intersecting lines and lwpolylines.
  15. ;;           Load function set
  16. ;;           Run vl-cmdf function INTLINES
  17. ;;           Intersections are marked with POINT objects on current layer
  18. (defun INTLINES        (/ SSL                        ;length of SS
  19.                  PTS                        ;returning list
  20.                  AOBJ1                        ;Object 1
  21.                  AOBJ2                        ;Object 2
  22.                  N1                        ;Loop counter
  23.                  N2                        ;Loop counter
  24.                  IPTS                        ;intersects
  25.                  A N NN        HOLDOSMODE)
  26.   (vl-load-com)
  27.   (vl-cmdf "_.UNDO" "_GROUP")
  28.   (setq HOLDOSMODE (getvar "OSMODE"))
  29.   (setvar "OSMODE" 0)
  30.   (setq SS (ssget '((0 . "*LINE") (8 . "right"))))
  31.   ;;注意:選線的條件
  32.   (setq        N1  0                                ;index for outer loop
  33.         SSL (sslength SS)
  34.   )                                        ; Outer loop, first through second to last
  35.   (while (< N1 (1- SSL))                ; Get object 1, convert to VLA object type
  36.     (setq AOBJ1        (ssname SS N1)
  37.           AOBJ1        (vlax-ename->vla-object AOBJ1)
  38.           N2        (1+ N1)
  39.     )                                        ;index for inner loop
  40. ;;; Inner loop, go through remaining objects
  41.     (while (< N2 SSL)                        ; Get object 2, convert to VLA object
  42.       (setq AOBJ2 (ssname SS N2)
  43.             AOBJ2 (vlax-ename->vla-object AOBJ2)
  44. ;;;Find intersections of Objects
  45.             IPTS  (vla-intersectwith
  46.                     AOBJ1
  47.                     AOBJ2
  48.                     0
  49.                   )                        ; variant result
  50.             IPTS  (vlax-variant-value IPTS)
  51.       )
  52. ;;;Variant array has values?
  53.       (if (> (vlax-safearray-get-u-bound IPTS 1) 0)
  54.         (progn                                ;array holds values, convert it
  55.           (setq        IPTS                        ;to a list.
  56.                  (vlax-safearray->list IPTS)
  57.           )
  58. ;;;Loop through list constructing points
  59.           (while (> (length IPTS) 0)
  60.             (setq PTS  (cons (list (car IPTS)
  61.                                    (cadr IPTS)
  62.                                    (caddr IPTS)
  63.                              )
  64.                              PTS
  65.                        )
  66.                   IPTS (cdddr IPTS)
  67.             )
  68.           )
  69.         )
  70.       )
  71.       (setq N2 (1+ N2))
  72.     )                                        ;inner loop end
  73.     (setq N1 (1+ N1))
  74.   )                                        ;outer loop end
  75.   (setvar "OSMODE" HOLDOSMODE)
  76.   (vl-cmdf "_.UNDO" "_END")
  77.   PTS
  78. )

  79. (defun C:TTT (/        OS CMD SS PT_LISTMAXY MAXX EN ENT1 EN1 EN2 ENT ARE)
  80.                                        
  81.   (defun SS1 (A B)
  82.     (ssget "C"
  83.            ENT1
  84.            (list (+ (car ENT1) A) (+ (cadr ENT1) B))
  85.            '((-4 . "<NOT")
  86.              (-4 . "<OR")
  87.              (8 . "right")
  88.              (0 . "DIMENSION")
  89.              (-4 . "OR>")
  90.              (-4 . "NOT>")
  91.             )
  92.     )
  93.   )

  94.   (setq PT_LIST (INTLINES))
  95.   (setq CMD (getvar "cmdecho"))
  96.   (setvar "cmdecho" 0)
  97.   (vl-cmdf "_.undo" "be")
  98.   (setq OS (getvar "osmode"))
  99.   (setvar "osmode" 0)
  100.   (setq
  101.     PT_LIST
  102.      (vl-sort
  103.        PT_LIST
  104.        (function
  105.          (lambda (P1 P2)
  106.            (cond
  107.              ((< (atof (rtos (cadr P1) 2 5)) (atof (rtos (cadr P2) 2 5)))
  108.               t
  109.              )
  110.              ((and
  111.                 (equal (rtos (cadr P1) 2 5) (rtos (cadr P2) 2 5))
  112.                 (< (atof (rtos (car P1) 2 5)) (atof (rtos (car P2) 2 5)))
  113.               )
  114.               t
  115.              )
  116.            )
  117.          )
  118.        )
  119.      )
  120.   )

  121.   (foreach ENT1        PT_LIST
  122.     ;;(300.0)數值在測試中
  123.     (setq ENT (list (+ (car ENT1) 300.0) (+ (cadr ENT1) 300.0) 0.0))
  124.     (setq EN (entlast))
  125.     (vl-cmdf "_.boundary" ENT "")
  126.     (setq EN1 (entlast))
  127.     (if        (not (equal EN EN1))
  128.       (progn
  129.         (setq ARE (vla-get-area (vlax-ename->vla-object EN1)))
  130.         (cond
  131.           ((equal ARE (* 1200.0 1200.0) 0.001)
  132.            (if (= (sslength (SS1 1200 1200)) 1)
  133.              (vl-cmdf "_.insert" "1100x1100" ENT1 "" "" "")
  134.            )
  135.           )
  136.           ((equal ARE (* 1200.0 600.0) 0.001)
  137.            (setq EN2 (AX:GETBOUNDINGBOX EN1))
  138.            (if (equal (- (cadadr EN2) (cadar EN2)) 1200 0.001)
  139.              (if (= (sslength (SS1 600 1200)) 1)
  140.                (progn
  141.                  (vl-cmdf "_.insert" "1100x500" ENT1 "" "" "90")
  142.                  (vl-cmdf "_.mirror"
  143.                           (entlast)
  144.                           ""
  145.                           ENT1
  146.                           (list (car ENT1) (+ 1 (cadr ENT1)))
  147.                           "y"
  148.                  )
  149.                )
  150.                ;;(vl-cmdf "_.move" (entlast) "" "0,0" "600,0")
  151.              )
  152.              (if (= (sslength (SS1 1200 600)) 1)
  153.                (vl-cmdf "_.insert" "1100x500" ENT1 "" "" "")
  154.              )
  155.            )
  156.           )
  157.           ((equal ARE (* 600.0 600.0) 0.001)
  158.            (if (= (sslength (SS1 600 600)) 1)
  159.              (vl-cmdf "_.insert" "500x500" ENT1 "" "" "")
  160.            )
  161.           )
  162.         )
  163.         (vl-cmdf "_.erase" EN1 "")
  164.       )
  165.     )
  166.   )
  167.   (setvar "osmode" OS)
  168.   (vl-cmdf "_.undo" "e")
  169.   (setvar "cmdecho" CMD)
  170.   (princ)
  171. )
  172. ;;-----------------------------
 楼主| 发表于 2004-1-19 09:14:00 | 显示全部楼层
谢谢龙版主,万分感谢。
 楼主| 发表于 2004-1-20 09:43:00 | 显示全部楼层
在程序中(setq SS (ssget '((0 . "*LINE") (8 . "right"))))这一句,
若改成(setq SS (ssget '((0 . "*LINE"))))便无法运行,不知能不能不把图层放进选择过滤器中?因为每张图的图层并不一定相同,如果只能选择right这一层上的线,程序的局限性太大。
谢谢龙版主。
发表于 2004-1-20 10:01:00 | 显示全部楼层
注意,有两个地方有这个right的,是不是都改了,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-27 12:58 , Processed in 0.197663 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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