找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3549|回复: 12

[LISP程序]:布局视口编程求教

[复制链接]
发表于 2006-2-9 11:02:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
对下面的函数,为什么在模型窗口或布局1窗口中执行,会在布局1中创建新视口, 而不是期望的在布局2中创建新视口? 请帮忙指导.

  1. ;在布局2上创建一个视口
  2. (defun CPV2()
  3.   (vl-load-com)
  4.   (setq AcadObject   (vlax-get-acad-object)
  5.         AcadDocument (vla-get-ActiveDocument Acadobject)
  6.         mSpace       (vla-get-ModelSpace Acaddocument)
  7.         pSpace       (vla-get-PaperSpace AcadDocument)
  8.         LayoutSel    (vla-get-Layouts AcadDocument)

  9.   )
  10.   (setvar "TILEMODE" 0)

  11.   ;获得布局2对象Layout2
  12.   (setq Layout1(vla-item LayoutSel "布局1"))
  13.   (setq Layout2 (vla-item LayoutSel "布局2"))

  14.   ;设置Layou2为活动布局
  15.   (setq layoutSel(vla-get-Layouts AcadDocument))
  16.   (setq documentSel(vla-get-Documents AcadObject))
  17.   (setq name(vla-get-Name (vla-get-ActiveDocument AcadObject)))
  18.   (vla-put-ActiveLayout (vla-Item documentSel name) Layout2)
  19.   
  20.   (setq CenterPnt(vlax-make-safearray vlax-vbDouble '(0 . 2)))
  21.   (vlax-safearray-fill CenterPnt '(40 40 0))

  22.   (vla-AddPViewport pSpace CenterPnt 20 20)
  23. )

我跟踪了一下,在执行了(vla-put-ActiveLayout (vla-Item documentSel name) Layout2)后,SPace对象的Layout属性还是指向layout1,而不是Layout2
我没有找到设置sPace的Layout指向的函数,也许这是问题的症结所在.
还请各位网友继续给与指点.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2007-7-4 15:37:01 | 显示全部楼层
才看到。
(vla-put-activelayout AcadDocument (vla-item LayoutSel "布局2"))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-7-5 08:43:39 | 显示全部楼层
"布局2"没错啊!
能不能贴个像天正里面的"定义视口"
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-5 10:54:23 | 显示全部楼层
确实如2楼所示。
向Dream.Fei 深表谢意。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-7-5 21:12:18 | 显示全部楼层
一年前的帖子你也能等, 服!
帖个半成品的定义视口,还望高手来指点。

  1. (defun c:x1 (/ aout bl cen doc hei outsel p1 p2 ps pv wid)
  2.   (setq        doc    (vla-get-activedocument (vlax-get-acad-object))
  3.         outsel (vla-get-layouts doc)
  4.         aout   (vla-item outsel (getvar "ctab"))
  5.         ps     (vla-get-paperspace doc)
  6.   )
  7.   (if (/= (getvar "ctab") "Model")
  8.     (progn
  9.       (vlax-put doc 'activespace acmodelspace)
  10.       (if (setq p1 (getpoint "\n左下角:"))
  11.         (if (setq p2 (getcorner p1 "\n右上角:"))
  12.           (if (setq bl (getint "\n视口比例:"))
  13.             (progn
  14.               (setq cen        (list (/ (+ (car p1) (car p2)) 2.0)
  15.                               (/ (+ (cadr p1) (cadr p2)) 2.0)
  16.                               (/ (+ (caddr p1) (caddr p2)) 2.0)
  17.                         )
  18.                     bl        (/ 1.0 bl)
  19.                     wid        (* (abs (- (car p2) (car p1))) bl)
  20.                     hei        (* (abs (- (cadr p2) (cadr p1))) bl)
  21.               )
  22.               (vlax-put doc 'activelayout aout)
  23.               (setq pv (vla-addpviewport ps (fei-223 '(0 0)) wid hei))
  24.               (vlax-put pv 'customscale bl) ;_比例
  25.               (vlax-put pv 'viewporton :vlax-true) ;_显示模型
  26.               (vlax-put pv 'ucsiconatorigin :vlax-true)
  27.               (vlax-put pv 'displaylocked :vlax-true) ;_视口锁定
  28.             )
  29.           )
  30.         )
  31.       )
  32.     )
  33.     (alert "*** 不允许在模型空间使用该命令 ***")
  34.   )
  35.   (if pv
  36.     pv
  37.     (princ)
  38.   )
  39. )

视口大小及比例都没问题了,问题在于不能准确显示模型空间的对象。不知道视口与模型空间是怎么对应的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-6 13:49:56 | 显示全部楼层
"一年前的帖子你也能等",非也.能见到赐教,还是要表示谢意.
下面是当年该应用中的片断,供参考:


  1.   ;创建视口1
  2.         ...
  3.   (setq pviewportObj1 (vla-AddPViewport pSpace pvCenterPnt pvWidth1 pvHeight1));在图纸空间创建视口1

  4.   ;创建视口2
  5.         ...
  6.   (setq pviewportObj2 (vla-AddPViewport pSpace pvCenterPnt pvWidth2 pvHeight2));在图纸空间创建视口2

  7.   ;进入模型空间
  8.         ;准备要放入视口的对象
  9.         ...

  10.       ;设置布局中的视口
  11.       (vla-put-ActiveSpace AcadDocument acPaperSpace);从模型空间切换到上一个活动的图纸空间布局
  12.       (vla-put-ActiveLayout AcadDocument sdtLayout)
  13.       
  14.       (vla-Display pviewportObj2 :vlax-true);启用视口
  15.       (vla-put-MSpace Acaddocument :vlax-true);切换到模型空间
  16.       (vla-put-ActivePViewport Acaddocument pviewportObj2);将 pviewportObj2 置为当前

  17.       ;模型空间中,准备放入布局视口的范围
  18.       (setq LowerLeft(vlax-3d-point (list (car w1)(cadr w1) 0.0)) UpperRight(vlax-3d-point (list (car w2)(cadr w2) 0.0)))
  19.       (vla-ZoomWindow AcadObject LowerLeft UpperRight);在模型空间中进行范围缩放
  20.       (vla-put-MSpace Acaddocument :vlax-false);关闭模型空间编辑

  21.       (vla-Display pviewportObj1 :vlax-true);启用视口
  22.       (vla-put-MSpace Acaddocument :vlax-true);切换到模型空间
  23.       (vla-put-ActivePViewport Acaddocument pviewportObj1);将 pviewportObj1 置为当前

  24.       ;模型空间中,准备放入布局视口的范围
  25.       (setq CenterPoint(vlax-3d-point (list (car p0)(cadr p0) 0.0)))
  26.       (vla-ZoomCenter AcadObject CenterPoint 125.0);在模型空间中进行范围缩放
  27.       (vla-put-MSpace Acaddocument :vlax-false);关闭模型空间编辑

  28.         ;打印输出栓点图
  29.         ...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-6 13:50:30 | 显示全部楼层
"一年前的帖子你也能等",非也.能见到赐教,还是要表示谢意.
下面是当年该应用中的片断,供参考:


  1.   ;创建视口1
  2.         ...
  3.   (setq pviewportObj1 (vla-AddPViewport pSpace pvCenterPnt pvWidth1 pvHeight1));在图纸空间创建视口1

  4.   ;创建视口2
  5.         ...
  6.   (setq pviewportObj2 (vla-AddPViewport pSpace pvCenterPnt pvWidth2 pvHeight2));在图纸空间创建视口2

  7.   ;进入模型空间
  8.         ;准备要放入视口的对象
  9.         ...

  10.       ;设置布局中的视口
  11.       (vla-put-ActiveSpace AcadDocument acPaperSpace);从模型空间切换到上一个活动的图纸空间布局
  12.       (vla-put-ActiveLayout AcadDocument sdtLayout)
  13.       
  14.       (vla-Display pviewportObj2 :vlax-true);启用视口
  15.       (vla-put-MSpace Acaddocument :vlax-true);切换到模型空间
  16.       (vla-put-ActivePViewport Acaddocument pviewportObj2);将 pviewportObj2 置为当前

  17.       ;模型空间中,准备放入布局视口的范围
  18.       (setq LowerLeft(vlax-3d-point (list (car w1)(cadr w1) 0.0)) UpperRight(vlax-3d-point (list (car w2)(cadr w2) 0.0)))
  19.       (vla-ZoomWindow AcadObject LowerLeft UpperRight);在模型空间中进行范围缩放
  20.       (vla-put-MSpace Acaddocument :vlax-false);关闭模型空间编辑

  21.       (vla-Display pviewportObj1 :vlax-true);启用视口
  22.       (vla-put-MSpace Acaddocument :vlax-true);切换到模型空间
  23.       (vla-put-ActivePViewport Acaddocument pviewportObj1);将 pviewportObj1 置为当前

  24.       ;模型空间中,准备放入布局视口的范围
  25.       (setq CenterPoint(vlax-3d-point (list (car p0)(cadr p0) 0.0)))
  26.       (vla-ZoomCenter AcadObject CenterPoint 125.0);在模型空间中进行范围缩放
  27.       (vla-put-MSpace Acaddocument :vlax-false);关闭模型空间编辑

  28.         ;打印输出
  29.         ...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-7-6 20:53:22 | 显示全部楼层
呵呵,昨天搞到半夜才搞定,模拟天正定义视口。

注意事项:
1、由于在返回布局后移动使用的是系统函数grread,所以不能在移动过程中进行任何键盘操作。(事实上,我也并不觉得在布置视口的时候键盘操作的重要性)
2、如果想让视口出现在指定布局,则应该从这个布局发出命令。如果是在模型空间发出的命令,则会在第一个布局上创建视口。

疑问:
1、vla-addpviewport 没有问题,但为什么 vlax-invoke 'addpviewport却出错?


  1. (defun fei-viewport-add
  2.        (/ *acad* *adoc* *alot* *lotsel* *pspace* bl ctab hei loop mod p1 p2 pt pv vp vps wid)
  3.   (setq        *acad*         (vlax-get-acad-object) ;_应用程序
  4.         *adoc*         (vla-get-activedocument *acad*) ;_当前文档
  5.         *pspace* (vla-get-paperspace *adoc*) ;_图纸空间
  6.         *lotsel* (vla-get-layouts *adoc*) ;_选项卡集合
  7.         ctab         (getvar "ctab") ;_记录当前是模型还是图纸空间
  8.         *alot*         (vla-item *lotsel* (getvar "ctab")) ;_当前选项卡
  9.         loop         t
  10.   )
  11.   (vla-put-activespace *adoc* acmodelspace) ;_返回模型空间
  12.   (if (setq p1 (getpoint "\n 视口左下角:"))
  13.     (if        (setq p2 (getcorner p1 "\n 视口右上角:"))
  14.       (if (setq bl (getint "\n 视口比例:"))
  15.         (progn
  16.           (setq        bl  (/ 1.0 bl) ;_获取比例
  17.                 wid (* (abs (- (car p2) (car p1))) bl) ;_计算宽度
  18.                 hei (* (abs (- (cadr p2) (cadr p1))) bl) ;_计算长度
  19.           )
  20.           (if (= ctab "Model")
  21.             (vla-put-activespace *adoc* acpaperspace) ;_返回第一个选项卡
  22.             (vla-put-activelayout *adoc* *alot*) ;_返回存储前的选项卡
  23.           )
  24.           (setq pv (vla-addpviewport *pspace* (vlax-3d-point '(0 0)) wid hei)) ;_创建视口
  25.           (vla-put-viewporton pv :vlax-true) ;_显示模型
  26.           (vla-put-mspace *adoc* :vlax-true) ;_返回模型空间
  27.           (vlax-invoke *acad* 'zoomwindow p1 p2) ;_缩放操作以确定显示区域
  28.           (vla-put-mspace *adoc* :vlax-false) ;_返回图纸空间
  29.           (vla-put-customscale pv bl) ;_比例
  30.           (vla-put-ucsiconatorigin pv :vlax-true) ;_显示原点
  31.           (vla-put-displaylocked pv :vlax-true) ;_视口锁定
  32.           ;;_移动
  33.           (while loop
  34.             (setq pt  (vlax-get pv 'center)
  35.                   pt  (list (- (car pt) (/ wid 2.0))
  36.                             (- (cadr pt) (/ hei 2.0))
  37.                       )
  38.                   vps (grread t 4 0)
  39.                   vp  (cadr vps)
  40.                   mod (car vps)
  41.             )
  42.             (if        (= mod 5)
  43.               (vla-move pv (vlax-3d-point pt) (vlax-3d-point vp))
  44.               (setq loop nil)
  45.             )
  46.           )
  47.         )
  48.       )
  49.     )
  50.   )
  51.   (if pv
  52.     pv
  53.     nil
  54.   )
  55. )

另外聊个不关新建视口的问题:
vla-put-activelayout后,如果光标正好落在一个视口内,则会自动激活该视口(相当于发出 mspace命令)。如何能阻止?我想要的就是在跳转布局后,依然位于图纸空间,而不是自动激活模型空间。
试过在跳转后紧跟一句: vla-put-mspace doc :vlax-false,但没用。也试过直接发送pspace命令,但同样不能保证。
感觉只要跳转后光标位于视口内就一定会自动激活该视口,还望指点。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-9-5 18:08:13 | 显示全部楼层
不知多义线视口如何创建?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-9-5 19:26:34 | 显示全部楼层
好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!好!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 691个

财富等级: 财运亨通

发表于 2017-8-27 17:31:16 | 显示全部楼层
Fei 能否分享个完整程序?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 22个

财富等级: 恭喜发财

发表于 2021-7-29 01:03:50 | 显示全部楼层
也许这个刚好可以解决我的帖子问题,测试一下
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2023-9-21 09:43:40 | 显示全部楼层
如何在一个布局批量生成视口
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-4 17:14 , Processed in 0.539021 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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