利用AutoLISP语言编写的脚本,实现模型空间选择矩形框,实现批量创建视口布局的功能。
1、APPLOAD 加载插件。

2,绘制矩形框,方向线。

3,输入CTSK命令启动插件,根据命令行提示输入相关参数。

4,布局视口指定位置,批量创建成功。
;批量视口2.0
;命令:CTSK
;作者:创特空间
;网站:www.chuangtekongjian.cn
;插件用于批量生成视口
;1.仅能识别矩形视口框。
;2.当不给定方向线时,视口生成顺序为选择图框顺序,可以整体框选所有图框,顺序默认为从右到左。
;3.给定方向线,视口根据方向依次排列。
;4.视口显示比例可自定义。
;5.可选择视口生成起点,根据命令行提示操作。
;6.可以选择生成视口是否锁定,根据命令行提示操作。
(vl-load-com)
(defun c:CTSK()
(princ "\n选取视口框...")
(setq ss (ssget))
(setq refEnt (car (entsel "\n请选择方向参考线(多段线),如不选请直接右键/回车: ")))
(if refEnt (setq refVla (vlax-ename->vla-object refEnt)) (setq refVla nil))
(setq i 0)
(setq n 0)
(setq dx 10.0)
(initget 4)
(setq dxIn (getdist (strcat "\n视口间隔(纸空间单位) <" (rtos dx 2 2) ">: ")))
(if dxIn (setq dx dxIn))
(setq sc 1.0)
(initget 6)
(setq scIn (getreal (strcat "\n视口比例(1:n),请输入n <" (rtos sc 2 2) ">: ")))
(if scIn (setq sc scIn))
(command "TILEMODE" "0")
(setq q (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setq vp1 (getpoint "请选择视口插入点:"))
(setq vpx1 (nth 0 vp1))
(setq vpy1 (nth 1 vp1))
(initget 1 "Y N")
(setq skl (getkword "\n视口是否锁定[锁定(Y)/不锁定(N)]:"))
(setq ssList nil)
(while (< i (sslength ss))
(setq ssn (ssname ss i))
(setq ssdata (entget ssn))
(if (and (= (cdr (assoc 0 ssdata)) "LWPOLYLINE") (= (cdr (assoc 90 ssdata)) 4))
(progn
(setq sortParam 0.0)
(if refVla
(progn
(saetq boxVla (vlax-ename->vla-object ssn))
(setq intPts (vlax-invoke refVla 'IntersectWith boxVla 0))
(if (and intPts (>= (length intPts) 3))
(setq sortParam (vlax-curve-getParamAtPoint refVla (vlax-curve-getClosestPointTo refVla (list (car intPts) (cadr intPts) (caddr intPts)))))
)
)
)
(setq ssList (append ssList (list (list ssn sortParam))))
)
)
(setq i (+ i 1))
)
(if refVla
(setq ssList (vl-sort ssList '(lambda (a b) (< (cadr a) (cadr b)))))
)
(setq i 0)
(while (< i (length ssList))
(setq ssn (car (nth i ssList)))
(setq ssdata (entget ssn))
(progn
(setq Lst (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) ssdata)))
(setq p1 (nth 0 Lst))
(setq p2 (nth 1 Lst))
(setq p3 (nth 2 Lst))
(setq p4 (nth 3 Lst))
(setq uc1_ok nil)
(if refVla
(progn
(setq boxVla (vlax-ename->vla-object ssn))
(setq intPts (vlax-invoke refVla 'IntersectWith boxVla 0))
(if (and intPts (>= (length intPts) 6))
(progn
(setq ptsList nil idx 0)
(while (< idx (length intPts))
(setq ptsList (append ptsList (list (list (nth idx intPts) (nth (+ idx 1) intPts) (nth (+ idx 2) intPts)))))
(setq idx (+ idx 3))
)
(setq ptsList (vl-sort ptsList '(lambda (a b) (< (vlax-curve-getParamAtPoint refVla (vlax-curve-getClosestPointTo refVla a)) (vlax-curve-getParamAtPoint refVla (vlax-curve-getClosestPointTo refVla b))))))
(setq PtIn (car ptsList) PtOut (last ptsList))
(setq vecD (list (- (car PtOut) (car PtIn)) (- (cadr PtOut) (cadr PtIn))))
(setq lenD (distance '(0 0) vecD))
(if (> lenD 1e-6)
(progn
(setq U (list (/ (car vecD) lenD) (/ (cadr vecD) lenD)))
(setq V (list (cadr U) (- (car U))))
(setq ptVals (mapcar '(lambda (p)
(list p
(+ (* (car p) (car U)) (* (cadr p) (cadr U)))
(+ (* (car p) (car V)) (* (cadr p) (cadr V)))
)
)
(list p1 p2 p3 p4)))
(setq ptsSortU (vl-sort ptVals '(lambda (a b) (< (cadr a) (cadr b)))))
(setq backPts (list (nth 0 ptsSortU) (nth 1 ptsSortU)))
(setq fwdPts (list (nth 2 ptsSortU) (nth 3 ptsSortU)))
(if (> (caddr (nth 0 backPts)) (caddr (nth 1 backPts)))
(setq BR (car (nth 0 backPts)) BL (car (nth 1 backPts)))
(setq BR (car (nth 1 backPts)) BL (car (nth 0 backPts)))
)
(if (> (caddr (nth 0 fwdPts)) (caddr (nth 1 fwdPts)))
(setq FR (car (nth 0 fwdPts)) FL (car (nth 1 fwdPts)))
(setq FR (car (nth 1 fwdPts)) FL (car (nth 0 fwdPts)))
)
(setq uc1 BR uc2 FR uc3 BL)
(setq w_box (distance BR FR) h_box (distance BR BL))
(setq uc1_ok T)
)
)
)
)
)
)
(if (not uc1_ok)
(progn
(setq uc1 p4)
(setq uc2 (list (- (nth 0 p3) (nth 0 p4)) (- (nth 1 p3) (nth 1 p4))))
(setq uc3 (list (distance p1 p2) (distance p2 p3)))
(setq w_box (distance p1 p2) h_box (distance p2 p3))
)
)
(setq w_box_scaled (/ w_box sc))
(setq h_box_scaled (/ h_box sc))
(setq vpx2 (+ vpx1 w_box_scaled))
(setq vpy2 (+ vpy1 h_box_scaled))
(setq vp1 (list vpx1 vpy1))
(setq vp2 (list vpx2 vpy2))
(command "PSPACE")
(command "zoom" "w" vp1 vp2)
(command "-vports" vp1 vp2)
(command "MSPACE")
(command "UCS" "w")
(if uc1_ok
(command "UCS" "_3" uc1 uc2 uc3)
(command "UCS" uc1 uc2 uc3)
)
(command "plan" "c")
(command "zoom" "w" (list 0 0) (list w_box h_box))
(setq scaleVal (/ 1.0 sc))
(setq scaleStr (strcat (rtos scaleVal 2 8) "XP"))
(command "zoom" "s" scaleStr)
(if (= skl "Y")
(command "-vports" "L" "on" vp1 "si")
)
(setq n (+ n 1))
(setq vpx1 (+ vpx1 dx))
(setq vpx1 (+ vpx1 w_box_scaled))
)
(setq i (+ i 1))
)
(command "PSPACE")
(command "zoom" "e")
(setvar "OSMODE" q)
(prin1)
)
插件下载: https://pan.baidu.com/s/1e4-szqjClSa-sjAjMKhbng?pwd=z5uy 提取码: z5uy