Message 1 of 6
Create Layout
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
I'm able to kind of create a new Layout and a viewport, the layout shows up but doesn't appear to be correctly created. If I try to zoom within layout I get an error message of "eBadPaperspaceView". Within Autocad I have to toggle back and forth between the layouts to have it work as expected w/in Autocad. Not quite sure what step I'm missing. Zoom is from the .NET developer's guide, but I don't think that code is my problem.
Thanks
{code}
Private Shared Function CreateNewLayout(ByVal i As Integer) As ObjectId
Dim doc As Document = Application.DocumentManager.MdiActiveDocument
Dim ed As Editor = doc.Editor
Dim doclock As DocumentLock = doc.LockDocument()
Dim db As Database = doc.Database
Dim trm As Autodesk.AutoCAD.DatabaseServices.TransactionManager = db.TransactionManager
Try
Using tr As Transaction = trm.StartTransaction()
Dim oLayoutManager As LayoutManager = Autodesk.AutoCAD.DatabaseServices.LayoutManager.Current
Try
Dim oLayoutObjId As ObjectId
oLayoutObjId = oLayoutManager.CreateLayout("StructureReport" & i)
Dim oLayout As Layout = tr.GetObject(oLayoutObjId, OpenMode.ForWrite)
oLayout.Initialize()
' initialize the layout
ed.Regen()
CreateNewLayout = oLayoutObjId
Catch
Exit Function
End Try
tr.Commit()
End Using
doclock.Dispose()
Catch
End Try
End Function
Private Shared Function CreateNewViewport(ByVal sLayoutName As String, ByVal oCntrPt As Point3d) As Boolean
'' Get the current document and database, and start a transaction
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Dim ed As Editor = acDoc.Editor
Dim acCurDb As Database = acDoc.Database
Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
'' Open the Block table for read
Dim acBlkTbl As BlockTable
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
'' Open the Block table record Paper space for write
Dim acBlkTblRec As BlockTableRecord
acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.PaperSpace), OpenMode.ForWrite)
Dim objId As ObjectId
For Each objId In acBlkTbl
Dim oBlockTableRec As BlockTableRecord = DirectCast(acTrans.GetObject(objId, OpenMode.ForWrite), BlockTableRecord)
If oBlockTableRec.IsLayout Then
Dim oLayout As Layout
oLayout = DirectCast(acTrans.GetObject(oBlockTableRec.LayoutId, OpenMode.ForWrite), Layout)
If oLayout.LayoutName = sLayoutName Then
Dim oBlkTableRec As BlockTableRecord = acTrans.GetObject(oLayout.BlockTableRecordId, OpenMode.ForWrite)
'' Create a Viewport
Dim acVport As Viewport = New Viewport()
acVport.SetDatabaseDefaults()
acVport.CenterPoint = New Point3d(4.25, 5.5, 0)
acVport.Width = 8.5
acVport.Height = 11.0
'' Add the new object to the block table record and the transaction
oBlkTableRec.AppendEntity(acVport)
acTrans.AddNewlyCreatedDBObject(acVport, True)
'' Change the view direction
acVport.ViewDirection = New Vector3d(0, 0, 1)
Dim oLayoutManager As LayoutManager = LayoutManager.Current
oLayoutManager.CurrentLayout = sLayoutName
'' Enable the viewport
acVport.On = True
acVport.CustomScale = 1
'' Set the new viewport current via an imported ObjectARX function
acedSetCurrentVPort(acVport.UnmanagedObject)
Zoom(New Point3d(), New Point3d(), oCntrPt, 1)
CreateNewViewport = True
Exit For
End If
End If
Next
acTrans.Commit()
End Using
End Function
{code}
Thanks
{code}
Private Shared Function CreateNewLayout(ByVal i As Integer) As ObjectId
Dim doc As Document = Application.DocumentManager.MdiActiveDocument
Dim ed As Editor = doc.Editor
Dim doclock As DocumentLock = doc.LockDocument()
Dim db As Database = doc.Database
Dim trm As Autodesk.AutoCAD.DatabaseServices.TransactionManager = db.TransactionManager
Try
Using tr As Transaction = trm.StartTransaction()
Dim oLayoutManager As LayoutManager = Autodesk.AutoCAD.DatabaseServices.LayoutManager.Current
Try
Dim oLayoutObjId As ObjectId
oLayoutObjId = oLayoutManager.CreateLayout("StructureReport" & i)
Dim oLayout As Layout = tr.GetObject(oLayoutObjId, OpenMode.ForWrite)
oLayout.Initialize()
' initialize the layout
ed.Regen()
CreateNewLayout = oLayoutObjId
Catch
Exit Function
End Try
tr.Commit()
End Using
doclock.Dispose()
Catch
End Try
End Function
Private Shared Function CreateNewViewport(ByVal sLayoutName As String, ByVal oCntrPt As Point3d) As Boolean
'' Get the current document and database, and start a transaction
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Dim ed As Editor = acDoc.Editor
Dim acCurDb As Database = acDoc.Database
Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
'' Open the Block table for read
Dim acBlkTbl As BlockTable
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
'' Open the Block table record Paper space for write
Dim acBlkTblRec As BlockTableRecord
acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.PaperSpace), OpenMode.ForWrite)
Dim objId As ObjectId
For Each objId In acBlkTbl
Dim oBlockTableRec As BlockTableRecord = DirectCast(acTrans.GetObject(objId, OpenMode.ForWrite), BlockTableRecord)
If oBlockTableRec.IsLayout Then
Dim oLayout As Layout
oLayout = DirectCast(acTrans.GetObject(oBlockTableRec.LayoutId, OpenMode.ForWrite), Layout)
If oLayout.LayoutName = sLayoutName Then
Dim oBlkTableRec As BlockTableRecord = acTrans.GetObject(oLayout.BlockTableRecordId, OpenMode.ForWrite)
'' Create a Viewport
Dim acVport As Viewport = New Viewport()
acVport.SetDatabaseDefaults()
acVport.CenterPoint = New Point3d(4.25, 5.5, 0)
acVport.Width = 8.5
acVport.Height = 11.0
'' Add the new object to the block table record and the transaction
oBlkTableRec.AppendEntity(acVport)
acTrans.AddNewlyCreatedDBObject(acVport, True)
'' Change the view direction
acVport.ViewDirection = New Vector3d(0, 0, 1)
Dim oLayoutManager As LayoutManager = LayoutManager.Current
oLayoutManager.CurrentLayout = sLayoutName
'' Enable the viewport
acVport.On = True
acVport.CustomScale = 1
'' Set the new viewport current via an imported ObjectARX function
acedSetCurrentVPort(acVport.UnmanagedObject)
Zoom(New Point3d(), New Point3d(), oCntrPt, 1)
CreateNewViewport = True
Exit For
End If
End If
Next
acTrans.Commit()
End Using
End Function
{code}