找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3119|回复: 24

[研讨] 视口的图层解冻的VLA方法

[复制链接]

已领礼包: 1742个

财富等级: 堆金积玉

发表于 2013-10-5 11:33:59 | 显示全部楼层 |阅读模式

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

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

×
下面是COMMAND的方法:

;解冻指定视口的指定图层 视口名(图元名),图层列表
;(xx-jdjd-name s1 lst)
(defun xx-jdjd-name (s1 lst)
  (foreach x lst
    (if(and(member (cons 331 (tblobjname "layer" x)) (entget s1)))
      (command "_.vplayer" "t" x "s" s1 "" "")
    )
  )
  (princ)
)


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

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-5 12:47:58 来自手机 | 显示全部楼层

回帖奖励 +1 D豆

本帖最后由 st788796 于 2013-10-5 12:51 编辑

以前尝试过,没有找到方法,貌似这个涉及到视口的Xdata,还有Xrecord,应该还有哪个词典记录
而且这个Xdata是和词典关联,不是简单去除Xdata就能解冻,正因为麻烦Autodesk才提供了vplayer命令

点评

看来是LISP不行了,可怜的DCL不能调用COMMAND  详情 回复 发表于 2013-10-5 14:11
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

 楼主| 发表于 2013-10-5 14:11:16 | 显示全部楼层
st788796 发表于 2013-10-5 12:47
以前尝试过,没有找到方法,貌似这个涉及到视口的Xdata,还有Xrecord,应该还有哪个词典记录
而且这个Xdat ...

看来是LISP不行了,可怜的DCL不能调用COMMAND

点评

我记得老猫说可以调用COMMAND的。。我记错了??  详情 回复 发表于 2013-10-5 16:43
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

发表于 2013-10-5 16:43:58 | 显示全部楼层
炫翔 发表于 2013-10-5 14:11
看来是LISP不行了,可怜的DCL不能调用COMMAND

我记得老猫说可以调用COMMAND的。。我记错了??

点评

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

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

发表于 2013-10-5 17:06:11 | 显示全部楼层
炫翔 发表于 2013-10-5 14:11
看来是LISP不行了,可怜的DCL不能调用COMMAND

  1. ;这是新手写的LISP   没用到子函数,也没有记录功能

  2. (defun c:tt ()
  3.   (setq A (getdist "\n--->请输入第一个数"))  ;用子函数代替这行 让它有记忆功能
  4.   (setq B (getdist "\n--->请输入第二个数"))职;用子函数代替这行

  5.   (setq AB (+ A B))
  6.   (princ AB)
  7. )
  8. ;如果我需要记忆功能,还要写一些IF





  9. ;这是炫版主的 通用函数  有记忆功能的get XXXX
  10. (defun xx-angle (msg def chushi / inp)
  11.   (if (= def nil) (setq def  chushi))
  12.   (setq msg (strcat "\n->请输入提示文字" msg "<" (angtos def) ">:"))   
  13.   (setq inp (getangle msg))
  14.   (if inp inp def)
  15. )


  16. ;请教   如何才能将炫版主的 通用函数 代入最上面的LISP

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

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

 楼主| 发表于 2013-10-5 17:13:00 | 显示全部楼层
  1. ;功能:距离输入格式化。
  2. ;(xx-dist msg def chushi)
  3. ;参数   msg: 字符串用以提示用户来输入距离值。
  4. ;       def: 变量(字符串)或字符串,固定的缺省值。
  5. ;    chushi: 为没有输入任何时为初始值
  6. ;获取值:返回实数。
  7. ;(setq dist (xx-dist "距离" dist 2.2))
  8. (defun xx-dist (msg def chushi / inp)
  9.   (if (= def nil) (setq def chushi))
  10.   (setq msg (strcat "\n->请确定" msg "(或直接点两点量取) <" (rtos def) ">:"))
  11.   (setq inp(getdist msg))
  12.   (if inp inp def)
  13. )

点评

麻烦直接照我的例子写完整好吗??  详情 回复 发表于 2013-10-5 18:26
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

发表于 2013-10-5 18:26:18 | 显示全部楼层

麻烦直接照我的例子写完整好吗??

点评

不要为了函数而写函数,在实践中锤炼  详情 回复 发表于 2013-10-5 20:26
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-5 20:26:54 来自手机 | 显示全部楼层
ysq101 发表于 2013-10-5 18:26
麻烦直接照我的例子写完整好吗??

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-6 11:27:43 | 显示全部楼层
搜到一个 VBA 例,用了一个“另类”方法,先把原 Viewport 删除然后按要求的图层控制再新建一个Viewport,

原文如下:

After several request and users saying "Hey you can't do that in VBA"   here we go. With the tweedle dee to the tweedle dum of Freezing Layers in a PaperSpace View Port.   You got it, THAW a layer in a PaperSpace ViewPort!
First we build a test wrapper to run vpLayerOn
Sub testVplayerOn()
     Dim strLayer As String
     Dim objPviewport As AcadPViewport
     Dim Pt1 As  Variant
     Dim strPrompt As String

     On Error GoTo err_selectVPobjectsToFreeze

     ' set an undo mark in the drawing
     ThisDrawing.StartUndoMark

     If ThisDrawing.ActiveSpace =  acModelSpace Then
         MsgBox "This program only works with  PaperSpace Viewports" & vbCr & _
                 "Please go to PaperSpace", vbCritical
         Exit Sub
     End If
    ' let's get into Paper Space
     ThisDrawing.MSpace = False

     ' Select a viewport
     ThisDrawing.Utility.GetEntity objPviewport, Pt1, "Select  ViewPort:"

     strPrompt = "Enter Layer Name to thaw in Veiw Port: "

     ' Ask the user for a layer to thaw in  the Paperspace View port
     strLayer = ThisDrawing.Utility.GetString(True,  strPrompt)


     ' run the main program that does the grunt of the work
     ' yhea for vpLayer on!

     VpLayerOn strLayer, objPviewport

     ' Place an end to the undo mark
     ThisDrawing.EndUndoMark

     ' exit this sub
     Exit Sub
     ' error handling
err_selectVPobjectsToFreeze:
     MsgBox Err.Description, vbInformation
     Err.Clear
     ThisDrawing.EndUndoMark

End Sub

' Next the VpLayerOn!
Sub VpLayerOn(strLayer As String, objPviewport As AcadPViewport)
     Dim XdataType As Variant
     Dim XdataValue As Variant
     Dim newXdataType As Variant
     Dim newXdataValue As Variant
     Dim I As  Integer
     Dim counter As Integer
     Dim Pt1 As  Variant
     Dim varCenter As Variant
     Dim dblWidth As Double
     Dim dblHeight As Double
     Dim objViewPortNew As AcadPViewport

     ' Get the Xdata from the Viewport
     objPviewport.GetXData "ACAD", XdataType, XdataValue

     For I = LBound(XdataType) To UBound(XdataType)
         ' Look for  frozen Layers in this viewport
         If XdataType(I) = 1003 Then
             ' Set the counter AFTER the position of the Layer frozen  layer(s)
             counter = I +  1
             ' Match the layer we are looking for and exit the sub --
             ' bingo we  have the frozen layer location
!
             If UCase(XdataValue(I)) = UCase(strLayer) Then Exit For
         End If
     Next


     ' Layer not found in this Mview
     If counter = 0 Then Exit Sub

    ' pull Width Height and Center from  selected veiwport
     dblWidth = objPviewport.Width
     dblHeight = objPviewport.Height
     varCenter = objPviewport.Center

     ' set the Xdata for the layer that is  beeing frozen
     newXdataType = XdataType
     newXdataValue = XdataValue

     ' work throught the remaining  array...
     For I = counter To UBound(XdataType)
         ReDim Preserve newXdataType(I - 1)
         ReDim Preserve newXdataValue(I - 1)
         newXdataType(I - 1) = XdataType(I)
         newXdataValue(I - 1) = XdataValue(I)

     Next

     'objViewPortNew.SetXData XdataType,  XdataValue
     Set objViewPortNew =  ThisDrawing.PaperSpace.AddPViewport(varCenter, dblWidth, dblHeight)
     ' Apply xdata to new Pviewport
     objViewPortNew.SetXData newXdataType, newXdataValue
     ' Put the new viewPort on the same  layer as the original viewport
     objViewportNew.Layer = objPviewport.Layer
     ' Refresh viewport!!
     ThisDrawing.MSpace = False
     objViewPortNew.Display (False)
     objViewPortNew.Display (True)
     ThisDrawing.Utility.Prompt ("Done!" & vbCr)

     ' Delete Old viewport
     objPviewport.Delete
End Sub


点评

看不懂VBA  发表于 2013-10-6 11:33

评分

参与人数 1D豆 +5 收起 理由
炫翔 + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-6 11:41:50 | 显示全部楼层
看懂思想就行,关键几句
vla-getxdata
vla-add viewports
vla-setxdata
vla-delete viewport

评分

参与人数 1D豆 +5 收起 理由
炫翔 + 5 技术引导讨论和指点奖!

查看全部评分

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-6 16:06:11 | 显示全部楼层
本帖最后由 st788796 于 2013-10-6 16:07 编辑

看了看 DXF , 列出所选视口冻结图层,也许把 1003 组码去掉就可以实现解冻!
  1. (defun c:tt (/ e el ac lst)
  2.   (if (and
  3. (zerop (getvar "tilemode"))
  4. (setq e (car (entsel)))
  5. (setq el (entget e '("*")))
  6. (= (cdr (assoc 0 el)) "VIEWPORT")
  7.       )
  8.     (progn
  9.       (setq ac (cdadr (assoc -3 el)))
  10.       (if (setq lst (vl-remove-if-not '(lambda (x) (= (car x) 1003)) ac))
  11. (foreach x lst
  12.    (princ "\n")
  13.    (princ x)
  14. )
  15. (princ "\nNone Layer Freeze!")
  16.       )
  17.     )
  18.   )
  19.   (princ)
  20. )

点评

没这么简单,只是更新的组码  详情 回复 发表于 2013-10-6 16:10
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

 楼主| 发表于 2013-10-6 16:10:41 | 显示全部楼层
st788796 发表于 2013-10-6 16:06
看了看 DXF , 列出所选视口冻结图层,也许把 1003 组码去掉就可以实现解冻!

没这么简单,只是更新的组码

点评

用 VLA 可以 (vla-getxdata vp "ACAD" 'xd 'xt) 获取扩展数据 (safearray-value xd) (safearray-vlaue xt) 两者是对应的 ,只要移除 xd 中1003 对应的 xt 数据,然后将 xd xt 用 setxdata 赋予 vla-add 的新视口  详情 回复 发表于 2013-10-6 16:47
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-6 16:47:14 | 显示全部楼层
炫翔 发表于 2013-10-6 16:10
没这么简单,只是更新的组码

用 VLA 可以
(vla-getxdata vp "ACAD" 'xd 'xt) 获取扩展数据
(safearray-value xd)
(safearray-vlaue xt) 两者是对应的 ,只要移除 xd 中1003 对应的 xt 数据,然后将 xd xt 用 setxdata 赋予 vla-add 的新视口就可以实现解冻
当然 vla-add 时要从原视口取出视口数据

点评

如果数据很庞大,也许会卡死  详情 回复 发表于 2013-10-6 17:55
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

 楼主| 发表于 2013-10-6 17:55:51 | 显示全部楼层
st788796 发表于 2013-10-6 16:47
用 VLA 可以
(vla-getxdata vp "ACAD" 'xd 'xt) 获取扩展数据
(safearray-value xd)

如果数据很庞大,也许会卡死

点评

有多大?在里面都卡不死,你读一下能卡死?! vla可以冻结,那解冻就是把新建的视口少冻结那几个解冻图层  详情 回复 发表于 2013-10-6 19:02
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-6 19:02:40 来自手机 | 显示全部楼层
本帖最后由 st788796 于 2013-10-6 19:42 编辑
炫翔 发表于 2013-10-6 17:55
如果数据很庞大,也许会卡死


有多大?在里面都卡不死,你读一下能卡死?!
vla可以冻结,那解冻就是把新建的视口少冻结那几个解冻图层,这样想就有代码了

比如有一个包括冻结图层 1 2 3 的视口,要把图层 1 3 解冻,只要新建一个视口,设置这个视口仅包括冻结图层 2
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 09:12 , Processed in 0.351999 second(s), 70 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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