自己布局布置 为什么顺序有时对有时不对???
(defun c:bk (/ num1 num2 enn ena en num xn snum s_all xn1 xn3 bn b1)(setvar "cmdecho" 0) ;关闭引用显示
(setvar "Tilemode" 0)
(setq num2 0)
(setq en (car (entsel "\n选择图框块:")))
(if (/= en nil)
;------------------------
(progn
(if (= (cdr (assoc 0 (entget en))) "INSERT") ;获得图元类型
;--------------------------
(progn
;------------------------------------------------------------ 选择视口框
(while (< num2 1)
(setvar "Tilemode" 1)
(setq ena (car (entsel "\n选择对象:")))
(if(/= ena nil)
(if (= (cdr (assoc 0 (entget ena))) "INSERT")
;获得图元类型
(progn
;; ----------------------------------------------切换到布局
(setvar "Tilemode" 0)
;;;复制块 视口-----------------(对象nn1 块基点xn 第二点 xn1=xnx+300 对象数量nu
(setq b1 (getvar "osmode")) ;取得捕捉设置
(setvar "osmode" 0);关闭对象捕捉
(setq xn (cdr (assoc 10 (entget en)))) ;块基点xn
(setq snum 1) ;计算起始值 = 1
;;;(setq s_all 0)
(setq xn1 (list (+ (car xn) 300) (cadr xn)))
(command "copy" en "" xn xn1)
(setq en (entlast))
(setq xn (cdr (assoc 10 (entget en))))
;选择复制生成的 块nn1
(setq
xn3
(list (+ (car xn1) 262.75) (- (cadr xn1) 174.5))
)
(command "_-vports" xn1 xn3)
(command "_.MSPACE")
(command "zoom" "o" ena "") ;模型空间对象视口中最大化
(command "_.PSPACE")
(setvar "osmode" b1);恢复对象捕捉
)
(print "请选择块")
)
(setq num2 2) ; 如果选择视口框 为空则退出程序
)
;--------------------------------------选择视口块
) ;while
)
)
(print "请选择块") ; /= "INSERT"
)
----------------------------
)
)
本帖最后由 Nico 于 2011-10-6 21:19 编辑
为什么顺序有时对有时不对???
以下才是比较自动化的
(defun c:bk(/ num1 num2 enn ena en num xn snum s_all xn1 xn3 bn b1)
(setvar "cmdecho" 0) ;关闭引用显示
(setq num1 1)
(setq enn(ssadd))
(while (/= num1 nil)
(setvar"Tilemode" 1)
(setq ena (car (entsel "\n选择对象:")))
(if (/= ena nil)
(progn
(if (= (cdr(assoc 0 (entget ena))) "INSERT") ;获得图元类型
(ssadd ena enn)
(print "请选择块")
))
(setq num1 nil)
)
)
;; ----------------------------------------------切换到布局
(setvar"Tilemode" 0)
;;;复制块 视口-----------------(对象nn1 块基点xn 第二点 xn1=xnx+300 对象数量num
(setq num20)
(while (< num2 1)
(setq en (car (entsel "\n选择图框块:")))
(if (/= en nil)
(progn
(if (= (cdr(assoc 0 (entget en))) "INSERT") ;获得图元类型
(progn
(setq num2 1)
(setq b1 (getvar "osmode")) ;取得捕捉设置
(setvar "osmode" 0) ;关闭对象捕捉
(setq xn (cdr(assoc 10 (entget en)))) ;块基点xn
(setq snum 1) ;计算起始值 = 1
;;;(setq s_all 0)
(setq num (sslength enn)) 块数量
(while (<= snum num) ; 当 snum <= 100 时 执行 <表达式>..... num 对象个数
(setq xn1(list (+ (car xn) 300) (cadr xn)))
(command "copy" en "" xn xn1)
(setq en (entlast))
(setq xn (cdr(assoc 10 (entget en)))) ;选择复制生成的 块nn1
(setq xn3(list (+ (car xn1) 262.75) (- (cadr xn1) 174.5)))
(command "_-vports" xn1 xn3)
(command "_.MSPACE")
(setq bn (ssname enn (1- snum))) ; 对象集enn
(command "zoom" "o" bn "") ;模型空间对象视口中最大化
(command "_.PSPACE")
;;; (setq s_all(+ snum s_all)) ; 新计算总和 =snum+前一次 的计算总和
(setq snum (1+ snum)) ; 设定 snum + 1
)
(setvar "osmode" b1) ;恢复对象捕捉
)
(progn
(setq num2 0)
(print "请选择块")
)
)
)
(setq num2 1)
)
)
(princ)
)
没人顶自己来一个 想法不错,不用频繁切换布局(对于大图效率会大大降低)也能实现。
给你点建议:
1.图框中放置图层为Defpoints的2个点(0 . "POINT")对象,此2个点为图框的有效出图区域。在选择图框时候遍历块,得到2个点,得到视口放置的范围。
2.选择矩形或其他封闭曲线对象,提示用户指定视口比例、扭曲角度等信息,在布局中生成相同形状的曲线(比例不同),将视口附着到该曲线。。。
3.注意不能使用command,这样程序才趋于完美。
:)这个程序写起来要花点时间的…… 补充:
1.当然配上对话框就更加好了
2.在选择曲线的时候可添加一个预览功能,思路:制作一个没有任何图像的幻灯片,加载,覆盖掉当前绘图区域,用grvecs函数模拟图框和曲线,提示用户给定视口在图框中的位置和角度,反复加载幻灯片和grvecs矢量绘制,用户确认所以信息后redraw重新显示图形。
-------------------------------------
要写好这个程序需要具备的技术:
1.计算图框有效绘图区域,vlax-for即可
2.预览:将曲线解析为若干直线,矢量绘制
3.trans函数的应用将模型空间的曲线数据转化为图纸空间数据,并调整角度,或通过矩阵变化实现
4.视口扭曲vla-put-TwistAngle,视口比例:vla-put-CustomScale
5.entmake或vla-add*创建对象,不要使用command,最后完成再提示切换布局
--------
先写这么多了,呵呵 caoyin 发表于 2011-10-19 01:38 static/image/common/back.gif
补充:
1.当然配上对话框就更加好了
2.在选择曲线的时候可添加一个预览功能,思路:制作一个没有任何图像 ...
非常感谢,只是水平有限刚学的 lisp只会用一些简单的
页:
[1]