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
|
|
|