明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2068|回复: 5

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

[复制链接]
发表于 2011-10-6 21:14:11 | 显示全部楼层 |阅读模式
  1. (defun c:bk (/ num1 num2 enn ena en num xn snum s_all xn1 xn3 bn b1)
  2.   (setvar "cmdecho" 0)      ;关闭引用显示
  3.   (setvar "Tilemode" 0)
  4.   (setq num2 0)
  5.   (setq en (car (entsel "\n选择图框块:")))
  6.   (if (/= en nil)
  7.     ;------------------------
  8.     (progn
  9.       (if (= (cdr (assoc 0 (entget en))) "INSERT") ;获得图元类型
  10.   ;--------------------------
  11.   (progn

  12.           ;------------------------------------------------------------   选择视口框
  13.     (while (< num2 1)
  14.       (setvar "Tilemode" 1)
  15.       (setq ena (car (entsel "\n选择对象:")))
  16.       (if  (/= ena nil)
  17.         (if (= (cdr (assoc 0 (entget ena))) "INSERT")
  18.           ;获得图元类型
  19.     (progn
  20.       ;; ----------------------------------------------  切换到  布局
  21.       (setvar "Tilemode" 0)
  22. ;;;  复制块   视口  -----------------  (对象  nn1   块基点xn   第二点 xn1=xnx+300   对象数量  nu
  23.       (setq b1 (getvar "osmode")) ;取得捕捉设置
  24.       (setvar "osmode" 0)  ;关闭对象捕捉  
  25.       (setq xn (cdr (assoc 10 (entget en)))) ;块基点xn
  26.       (setq snum 1)    ;计算起始值 = 1
  27. ;;;  (setq s_all 0)
  28.       (setq xn1 (list (+ (car xn) 300) (cadr xn)))
  29.       (command "copy" en "" xn xn1)
  30.       (setq en (entlast))
  31.       (setq xn (cdr (assoc 10 (entget en))))
  32.           ;选择复制生成的 块nn1
  33.       (setq
  34.         xn3
  35.          (list (+ (car xn1) 262.75) (- (cadr xn1) 174.5))
  36.       )
  37.       (command "_-vports" xn1 xn3)
  38.       (command "_.MSPACE")
  39.       (command "zoom" "o" ena "") ;模型空间对象视口中最大化
  40.       (command "_.PSPACE")
  41.       (setvar "osmode" b1)  ;恢复对象捕捉
  42.     )
  43.     (print "请选择块")
  44.         )
  45.         (setq num2 2)    ; 如果选择视口框 为空  则  退出程序
  46.       )
  47.           ;--------------------------------------  选择视口块
  48.     )        ;while
  49.   )
  50.       )
  51.       (print "请选择块")    ; /= "INSERT"
  52.     )
  53.     ----------------------------
  54.   )
  55. )

本帖子中包含更多资源

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

x
 楼主| 发表于 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 num2  0)
  (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)
  )
                     

 楼主| 发表于 2011-10-18 16:44:23 | 显示全部楼层
没人顶  自己来一个
发表于 2011-10-19 01:11:25 | 显示全部楼层
想法不错,不用频繁切换布局(对于大图效率会大大降低)也能实现。
给你点建议:
1.图框中放置图层为Defpoints的2个点(0 . "POINT")对象,此2个点为图框的有效出图区域。在选择图框时候遍历块,得到2个点,得到视口放置的范围。
2.选择矩形或其他封闭曲线对象,提示用户指定视口比例、扭曲角度等信息,在布局中生成相同形状的曲线(比例不同),将视口附着到该曲线。。。
3.注意不能使用command,这样程序才趋于完美。
:)这个程序写起来要花点时间的……
发表于 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,最后完成再提示切换布局

--------
先写这么多了,呵呵
 楼主| 发表于 2011-10-19 09:57:34 | 显示全部楼层
caoyin 发表于 2011-10-19 01:38
补充:
1.当然配上对话框就更加好了
2.在选择曲线的时候可添加一个预览功能,思路:制作一个没有任何图像 ...

非常感谢,只是水平有限  刚学的 lisp  只会用一些简单的   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-25 05:11 , Processed in 0.143384 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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