明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 依然小小鸟

[提问] 带状图如何批量布局和套图框?

[复制链接]
 楼主| 发表于 2021-4-9 16:52:40 | 显示全部楼层
Atsai 发表于 2021-3-23 16:27
http://bbs.mjtd.com/thread-113576-1-1.html

适用于图块的框。

从来没有成功过 你那里有你测试成功的 测试图吗 辛苦共享一下
回复

使用道具 举报

 楼主| 发表于 2021-4-9 17:01:18 | 显示全部楼层
tranney 发表于 2021-3-24 01:42
他的我用过,很好用

你那里有完整的代码 或者程序吗  他网址里面的代码 不全
回复

使用道具 举报

发表于 2021-4-10 21:33:43 | 显示全部楼层
依然小小鸟 发表于 2021-4-9 17:01
你那里有完整的代码 或者程序吗  他网址里面的代码 不全

  1. (defun MAT:mxp (m p)
  2.   (reverse (cdr (reverse (MAT:mxv m (append p '(1.0))))))
  3. )

  4. (defun MAT:mxm (m q)
  5.   (mapcar (function (lambda (r) (MAT:mxv (MAT:trp q) r))) m)
  6. )

  7. (defun Mat:DispToMatrix        (mat disp)
  8.   (append
  9.     (mapcar 'append mat (mapcar 'list disp))
  10.     '((0. 0. 0. 1.))
  11.   )
  12. )
  13. (defun MAT:mxv (m v)
  14.   (mapcar (function (lambda (r) (apply '+ (mapcar '* r v)))) m)
  15. )

  16. (defun MAT:trp (m)
  17.   (apply 'mapcar (cons 'list m))
  18. )
  19. (defun MAT:Trans1 (from to Org Ang / Mat Rot Inv Cen)
  20.   (setq Mat (mapcar (function (lambda (v) (trans v from to T)))
  21.                     '((1. 0. 0.) (0. 1. 0.) (0. 0. 1.))
  22.             )
  23.   )
  24.   (if (not (equal ang 0 1e-14))
  25.     (setq Rot (list (list (cos ang) (- (sin ang)) 0.)
  26.                     (list (sin ang) (cos ang) 0.)
  27.                     (list 0. 0. 1.)
  28.               )
  29.           mat (MAT:mxm mat Rot)
  30.     )
  31.   )
  32.   (setq Cen (trans Org to from))
  33.   (setq Inv (mat:trp mat))
  34.   (list
  35.     (Mat:DispToMatrix Inv (mat:mxv Inv (mapcar '- Cen)))        ;from->to (trans pt from to)
  36.     (Mat:DispToMatrix mat Cen)                                         ;to->from (trans pt to from)
  37.   )
  38. )

  39. (defun Mat:EntityMatrix (Ent / z dxf Cen obj an m1 mat Inv org)
  40.   (setq dxf (entget ent))
  41.   (if (setq Cen (cdr (assoc 10 dxf)))                                ;Insertpoint,center or startpoint,etc.
  42.     (if (null (caddr Cen))
  43.       (setq Cen (append Cen '(0.0)))
  44.     )
  45.     (setq Cen '(0 0 0))
  46.   )
  47.   (setq obj (vlax-ename->vla-object Ent))                       
  48.   (if (and (vlax-property-available-p obj 'elevation)                ;If it has elevation value.
  49.            (wcmatch (vla-get-objectname obj) "*Polyline")        ;It's a "AcDb2dPolyline" or "AcDbPolyline" object
  50.       )
  51.     (setq z   (vla-get-elevation obj)
  52.           Cen (list (car Cen) (cadr Cen) (+ (caddr Cen) z))        ;add elevation value
  53.     )
  54.   )
  55.   (if (vlax-property-available-p obj 'rotation)                 ;if it has a rotaion angle
  56.     (setq an (vla-get-rotation obj))
  57.     (setq an 0)
  58.   )
  59.   (MAT:Trans1 0 Ent Cen an)                                         ;return two matrices, the first is WCS->OCS,the second is OCS->WCS
  60. )

  61. (defun HH:Ent4pt (ent   Flag   /   ENT   LST   MAT   MAT1   MATLST  MATRIX
  62.     MAXPT   MINPT   OBJ   ORIGIN  REVMAT  UCSFLAG WCSORG  X   XDIR
  63.     YDIR   ZDIR
  64.    )
  65.   ;;1 矩阵的变换与逆变换
  66.   (defun GetMatrix (lst org Revflag / I J MAT)
  67.     (setq mat (vlax-make-safearray vlax-vbDouble '(0 . 3) '(0 . 3)))
  68.     (setq i 0)
  69.     (repeat 3
  70.       (vlax-safearray-put-element mat i 3 (nth i org))     ;平移变换
  71.       (setq j 0)
  72.       (repeat 3
  73. (if RevFlag
  74.    (vlax-safearray-put-element mat i j (nth j (nth i lst))) ;角度逆变换
  75.    (vlax-safearray-put-element mat i j (nth i (nth j lst))) ;角度的变换
  76. )
  77. (setq j (1+ j))
  78.       )
  79.       (setq i (1+ i))
  80.     )
  81.     (vlax-safearray-put-element mat 3 3 1)
  82.     mat           ;返回矩阵
  83.   )
  84.   ;;2 本程序主程序
  85.   (cond ((= (type ent) 'ENAME)
  86.   (setq obj (vlax-ename->vla-object ent))
  87. )
  88. ((= (type ent) 'VLA-OBJECT) (setq obj ent))
  89. (T (exit))
  90.   )
  91.   (and Flag
  92.        (setq Mat (Mat:EntityMatrix ent))
  93.        (setq Mat1 (cadr Mat))
  94.        (setq Mat (car Mat))
  95.   )
  96.   (setq UcsFlag (getvar "WORLDUCS"))
  97.   (if (= UcsFlag 0)         ;UCS与WCS不同
  98.     (setq UcsFlag T         ;设置标志位为true
  99.    xdir   (getvar "UCSXDIR")       ;X方向矢量
  100.    ydir   (getvar "UCSYDIR")       ;Y方向矢量
  101.    zdir   (MAT:vxv xdir ydir)       ;X和Y的方向矢量的叉积
  102.    origin  (getvar "UCSORG")       ;原点
  103.    WcsOrg  (trans '(0 0 0) 0 1)       ;WCS的原点相对UCS的坐标
  104.    matLst  (list xdir ydir zdir)       ;旋转的变换矩阵表
  105.    matrix  (GetMatrix matLst origin nil)      ;从WCS到UCS(ocs)的变换矩阵
  106.    revMat  (GetMatrix matLst WcsOrg T)      ;从UCS(ocs)到WCS的变换矩阵
  107.     )
  108.     (setq UcsFlag nil)         ;否则不予变换
  109.   )
  110.   ;;在UCS下先变换物体到WCS下,取得物体的包围框,然后把物体变换回到UCS
  111.   (cond ((and Flag UcsFlag) (vla-TransformBy obj (vlax-tmatrix Mat)))
  112. (UcsFlag (vla-TransformBy obj revMat))
  113. (Flag (vla-TransformBy obj (vlax-tmatrix Mat)))
  114.   )
  115.   (vla-GetBoundingBox obj 'minPt 'maxPt)      ;得到包围框
  116.   (setq minPt (vlax-safearray->list minPt))
  117.   (setq maxPt (vlax-safearray->list maxPt))
  118.   (cond ((and Flag UcsFlag) (vla-TransformBy obj (vlax-tmatrix Mat1)))
  119. (UcsFlag (vla-TransformBy obj matrix))
  120. (Flag (vla-TransformBy obj (vlax-tmatrix Mat1)))
  121.   )
  122.   (setq lst (list minPt
  123.     (list (car maxPt) (cadr minpt) (caddr minPt))
  124.     maxPt
  125.     (list (car minpt) (cadr maxPt) (caddr minPt))
  126.      )
  127.   )
  128.   (COND (Flag nil)
  129. (UcsFlag (setq mat1 (vlax-safearray->list matrix)))
  130.   )
  131.   (cond ((or Flag UcsFlag)
  132.   (setq lst (mapcar '(lambda (x) (mat:mxp mat1 x)) lst)) ;wcs坐标
  133.   (setq lst (mapcar '(lambda (x) (trans x ent 1)) lst))
  134. )
  135.   )
  136.   lst
  137. )


  138. (defun c:zcai_skd (/ cp cl cs vpl os vplyes l0 svpc ptlst ssvp)
  139.   (vl-load-com)
  140. (princ "\n说明:批量 图块(可旋转)产生视口")
  141.   (setvar "cmdecho" 0) ; Turn off command line echoing
  142.   (setq cp (getvar "ctab")) ; Store current tab name
  143.   (setq cl (getvar "clayer")) ; Store current layer name
  144.   (setq cs (getvar "osmode")) ; Store current osnap mode
  145.   (setq vpl "0-批量视口") ; ==>> Assume using Viewport layer for viewport frames, change code value here if needed <<==
  146.   (setq os (getvar "osmode")) ;读取锁点原设定
  147.   (setvar "osmode" 0)

  148.   (setq        nselect
  149.          (getstring
  150.            "\n选择排序方式,(1)自选顺序(2)左->右(3)右->左(4)上->下(5)下->上:预设(1)"
  151.          )
  152.   )

  153.   (if (= nselect "")
  154.     (setq nselect "1")
  155.   )

  156.   (if (/= cp "Model") ; Must be started from a layout tab to establish destination, quit quietly if on Model tab
  157.     (progn
  158.       (setq vplyes 0) ; Assume viewport doesn't exist
  159.       (setq l0 (tblnext "LAYER" 1)) ; Get past 0 layer in layer list
  160.       (while (setq layers (tblnext "LAYER"))
  161.         ;; Loop through layer list collection
  162.         (setq ln (cdr (assoc 2 layers))) ; Extract layer name from list
  163.         (if (= (strcase ln) (strcase vpl))
  164.           (setq vplyes 1)
  165.         ) ; Check if viewport layer exists
  166.       )
  167.       (if (= vplyes 0)
  168.         (command "layer" "NEW" vpl "COLOR" "RED" vpl "")
  169.       ) ; Make viewport layer and assign color to magenta if doesn't exist
  170.       (setvar "clayer" vpl) ; Change to viewport layer
  171.       (command "layer"
  172.                "ON"
  173.                (strcat "0," vpl)
  174.                "UNLOCK"
  175.                (strcat "0," vpl)
  176.                ""
  177.       ) ; Turn on and unlock viewport and 0 layer
  178.       (command "zoom" "ALL") ; View entire layout tab
  179.       (setvar "ctab" "Model") ; Activate Model tab
  180.       (command "zoom" "E") ; View entire Model Space area
  181.       (setq ss nil)
  182.       (if (setq ss (ssget '((0 . "INSERT"))))
  183.         (progn
  184.           (setq        l (sslength ss)
  185.                 i 0
  186.           )

  187.           (setq ent_lst nil)
  188.           (repeat (sslength ss)
  189.             (setq ent_lst (append ent_lst (list (ssname ss i)))
  190.                   i          (1+ i)
  191.             )
  192.           )

  193.           (princ "\n") ; Clean up command line
  194.           (setvar "ctab" cp) ; Return to layout tab program was started from
  195.           (command "pspace") ; Switch to Paper Space of layout tab

  196.           (setq ptlst nil)
  197.           (setq ptlst (HH:Ent4pt (nth 0 ent_lst) T))
  198.           (setq vpc1 (nth 0 ptlst))
  199.           (setq vpc2 (nth 1 ptlst))
  200.           (setq vpc3 (nth 2 ptlst))
  201.           (setq vpc4 (nth 3 ptlst))
  202.           (setq sf 1.0)
  203.           (setq vpyd (* sf (distance vpc2 vpc3)))


  204.           (defun viewpnts (/ a b c d x)
  205.             (setq b (getvar "viewsize")
  206.                   c (car (getvar "screensize"))
  207.                   d (cadr (getvar "screensize"))
  208.                   a (* b (/ c d))
  209.                   x (setq x (getvar "viewctr"))
  210.                   x (trans x 1 2)
  211.                   c (list (- (car x) (/ a 2.0)) (- (cadr x) (/ b 2.0)) 0.0)
  212.                   d (list (+ (car x) (/ a 2.0)) (+ (cadr x) (/ b 2.0)) 0.0)
  213.                   c (trans c 2 1)
  214.                   d (trans d 2 1)
  215.             )
  216.             (list c d)
  217.           )

  218.           (setq c (nth 0 (viewpnts)))
  219.           (setq d (nth 1 (viewpnts)))

  220.           (setq mvpc (list (/ (+ (car c) (car d)) 2.0) (/ (+ (cadr c) (cadr d)) 2.0) 0.0))
  221.           (command "zoom" "C" mvpc (rtos (* (* 2 l) vpyd)))


  222.           (setq        svpc
  223.                  (getpoint
  224.                    "\n选择插入点:"
  225.                  )
  226.           ) ; Can't change layout tabs manually here


  227.           (cond
  228.             ((= nselect "1")
  229.              (setq ent_lst ent_lst)
  230.             )

  231.             ((= nselect "2")
  232.              (progn
  233.                ;;按X座标排序
  234.                (setq
  235.                  ent_lst (vl-sort ent_lst
  236.                                   '(lambda (e1 e2)
  237.                                      (<        (cadr (assoc 10 (entget e1)))
  238.                                         (cadr (assoc 10 (entget e2)))
  239.                                      )
  240.                                    )
  241.                          )
  242.                )
  243.                ;;按X座标排序
  244.              )
  245.             )

  246.             ((= nselect "3")
  247.              (progn
  248.                ;;按X座标排序
  249.                (setq
  250.                  ent_lst (vl-sort ent_lst
  251.                                   '(lambda (e1 e2)
  252.                                      (>        (cadr (assoc 10 (entget e1)))
  253.                                         (cadr (assoc 10 (entget e2)))
  254.                                      )
  255.                                    )
  256.                          )
  257.                )
  258.                ;;按X座标排序
  259.              )
  260.             )

  261.             ((= nselect "4")
  262.              (progn
  263.                ;;按Y座标排序
  264.                (setq
  265.                  ent_lst (vl-sort ent_lst
  266.                                   '(lambda (e1 e2)
  267.                                      (>        (caddr (assoc 10 (entget e1)))
  268.                                         (caddr (assoc 10 (entget e2)))
  269.                                      )
  270.                                    )
  271.                          )
  272.                )
  273.                ;;按Y座标排序
  274.              )
  275.             )

  276.             ((= nselect "5")
  277.              (progn
  278.                ;;按Y座标排序
  279.                (setq
  280.                  ent_lst (vl-sort ent_lst
  281.                                   '(lambda (e1 e2)
  282.                                      (<        (caddr (assoc 10 (entget e1)))
  283.                                         (caddr (assoc 10 (entget e2)))
  284.                                      )
  285.                                    )
  286.                          )
  287.                )
  288.                ;;按Y座标排序
  289.              )
  290.             )
  291.           )

  292.           (mapcar
  293.             '(lambda (ssn)
  294.                (setq ptlst nil)
  295.                (setq ptlst (HH:Ent4pt ssn T))
  296.                (setq vpc1 (nth 0 ptlst))
  297.                (setq vpc2 (nth 1 ptlst))
  298.                (setq vpc3 (nth 2 ptlst))
  299.                (setq vpc4 (nth 3 ptlst))

  300.                (setq sf 1.0)
  301.                (setq vpxd (* sf (distance vpc1 vpc2)))
  302.                ;; Determine horizontal length of selected window
  303.                (setq vpyd (* sf (distance vpc2 vpc3)))
  304.                ;; Determine vertical height of selected window
  305.                (setq
  306.                  vpc
  307.                   (list        (/ (+ (car vpc1) (car vpc3)) 2.0)
  308.                         (/ (+ (cadr vpc1) (cadr vpc3)) 2.0)
  309.                         0.0
  310.                   )
  311.                )
  312.                ;; Determine center point of selected model window

  313.                (command        "mview"
  314.                         (list (car svpc) (cadr svpc))
  315.                         (strcat "@" (rtos vpxd) "," (rtos vpyd))
  316.                )
  317.                ;; Create Paper Space viewport

  318.                (setq ssvp nil)

  319.                (setq ssvp (ssget "L"))
  320.                ;; Start selection set with last viewport frame


  321.                (command        "zoom"
  322.                         "w"
  323.                         (list (car svpc) (cadr svpc))
  324.                         (strcat "@" (rtos vpxd) "," (rtos vpyd))
  325.                )

  326.                
  327.                (command "mspace")
  328.                ;; Open viewport window to Model Space

  329.                (command "ucsicon" "ON")
  330.                ;; Turn on UCS icon for viewport

  331.                (command "ucs" "Z" "non" vpc1 "non" vpc2)

  332.                (command "Plan" "")

  333.                (command "ucs" "WORLD") ; Reset UCS to WCS

  334.                (command "zoom" "C" vpc (rtos vpyd))
  335.                ;; Center view of viewport window using determined point
  336.                (command "zoom" "SCALE" (strcat (rtos sf) "XP"))
  337.                ;; Set zoom scale of viewport window

  338.                (command "vports" "LOCK" "ON" ssvp "")
  339.                ;; Lock scale and position of model in viewport
  340.                (command "pspace")
  341.                ;; Close viewport window

  342.                (setq w (distance vpc1 vpc2))
  343.                (setq svpc (polar svpc 0 (* 1.5 w)))

  344.              )
  345.             ent_lst
  346.           )
  347.         )
  348.       )
  349.     )
  350.     (princ "\n这个LISP程式只能在Layout(布局)使用!")
  351.     ;; Need to start on a layout tab so program knows where to create the new viewports
  352.   )
  353.   (command "zoom" "all")
  354.   (setvar "ctab" cp) ; Reset to stored tab name
  355.   (setvar "clayer" cl) ; Reset to stored layer name
  356.   (setvar "osmode" os) ;回复锁点原设定
  357.   (princ)
  358. )
回复

使用道具 举报

发表于 2021-4-10 21:34:44 | 显示全部楼层
命令为zcai_skd
回复

使用道具 举报

发表于 2021-6-18 18:05:23 | 显示全部楼层

运行失败,什么情况
回复

使用道具 举报

发表于 2021-6-22 10:56:01 | 显示全部楼层

咝谐晒
回复

使用道具 举报

 楼主| 发表于 2021-6-22 12:14:47 | 显示全部楼层

成功了吗
回复

使用道具 举报

发表于 2021-6-25 17:49:56 | 显示全部楼层

成功了…不過,還在適試中!
回复

使用道具 举报

 楼主| 发表于 2021-6-26 09:47:40 | 显示全部楼层
p-3-ianlcc 发表于 2021-6-25 17:49
成功了…不過,還在適試中!

怎么操作呢
回复

使用道具 举报

发表于 2021-6-28 09:46:31 | 显示全部楼层

您好
我是COPY「tranney」所提供的CODE使用
命令是:zcai_skd
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 14:53 , Processed in 0.189671 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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