Nico 发表于 2011-10-6 21:14:11

自己布局布置 为什么顺序有时对有时不对???

(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:15:01

本帖最后由 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)
)
                     

Nico 发表于 2011-10-18 16:44:23

没人顶自己来一个

caoyin 发表于 2011-10-19 01:11:25

想法不错,不用频繁切换布局(对于大图效率会大大降低)也能实现。
给你点建议:
1.图框中放置图层为Defpoints的2个点(0 . "POINT")对象,此2个点为图框的有效出图区域。在选择图框时候遍历块,得到2个点,得到视口放置的范围。
2.选择矩形或其他封闭曲线对象,提示用户指定视口比例、扭曲角度等信息,在布局中生成相同形状的曲线(比例不同),将视口附着到该曲线。。。
3.注意不能使用command,这样程序才趋于完美。
:)这个程序写起来要花点时间的……

caoyin 发表于 2011-10-19 01:38:53

补充:
1.当然配上对话框就更加好了
2.在选择曲线的时候可添加一个预览功能,思路:制作一个没有任何图像的幻灯片,加载,覆盖掉当前绘图区域,用grvecs函数模拟图框和曲线,提示用户给定视口在图框中的位置和角度,反复加载幻灯片和grvecs矢量绘制,用户确认所以信息后redraw重新显示图形。
-------------------------------------
要写好这个程序需要具备的技术:
1.计算图框有效绘图区域,vlax-for即可
2.预览:将曲线解析为若干直线,矢量绘制
3.trans函数的应用将模型空间的曲线数据转化为图纸空间数据,并调整角度,或通过矩阵变化实现
4.视口扭曲vla-put-TwistAngle,视口比例:vla-put-CustomScale
5.entmake或vla-add*创建对象,不要使用command,最后完成再提示切换布局

--------
先写这么多了,呵呵

Nico 发表于 2011-10-19 09:57:34

caoyin 发表于 2011-10-19 01:38 static/image/common/back.gif
补充:
1.当然配上对话框就更加好了
2.在选择曲线的时候可添加一个预览功能,思路:制作一个没有任何图像 ...

非常感谢,只是水平有限刚学的 lisp只会用一些简单的   
页: [1]
查看完整版本: 自己布局布置 为什么顺序有时对有时不对???