図面のすべてのジオメトリはレイアウトに含まれます。モデル空間ジオメトリは、Model という名前の 1 つのレイアウトに含まれます。モデル空間レイアウトの名前は変更できません。また、図面あたり 1 つのモデル空間レイアウトのみを作成できるため、他のモデル空間レイアウトを作成することはできません。
ペーパー空間ジオメトリもレイアウト上に含まれます。図面は、それぞれが異なる印刷環境設定を持つ多数のペーパー空間レイアウトを持つことができます。ペーパー空間レイアウトの名前は変更できます。
BlockTable の「*MODEL_SPACE」BlockTableRecord には、モデル空間レイアウト内のすべてのジオメトリが含まれています。図面に複数のペーパー空間レイアウトがある可能性があるため、BlockTable の「*PAPER_SPACE」BlockTableRecord は、最後のアクティブなペーパー空間レイアウトを指します。
図面内のレイアウトを使用するには、2 つの方法があります。現在の図面で作業している場合は、LayoutManager インタフェース クラスによって表されるレイアウト マネージャを使用できます。現在の図面で作業していない場合は、レイアウトの名前の付いたディクショナリを使用する必要があります。現在の図面で作業している場合でも、レイアウトの名前の付いたディクショナリで作業できますが、レイアウト マネージャを使用すると、特定のタスクを簡単に実行できます。
この例では、レイアウト マネージャを使用して、現在の図面にあるレイアウトを一覧表示します。
Imports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.Geometry ' List all the layouts in the current drawing <CommandMethod("ListLayouts")> _ Public Shared Sub ListLayouts() ' Get the current document and database Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument Dim acCurDb As Database = acDoc.Database ' Get the layout dictionary of the current database Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() Dim lays As DBDictionary = _ acTrans.GetObject(acCurDb.LayoutDictionaryId, OpenMode.ForRead) acDoc.Editor.WriteMessage(vbLf & "Layouts:") ' Step through and list each named layout and Model For Each item As DBDictionaryEntry In lays acDoc.Editor.WriteMessage(vbLf & " " & item.Key) Next ' Abort the changes to the database acTrans.Abort() End Using End Sub
using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; // List all the layouts in the current drawing [CommandMethod("ListLayouts")] public void ListLayouts() { // Get the current document and database Document acDoc = Application.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; // Get the layout dictionary of the current database using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { DBDictionary lays = acTrans.GetObject(acCurDb.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary; acDoc.Editor.WriteMessage("\nLayouts:"); // Step through and list each named layout and Model foreach (DBDictionaryEntry item in lays) { acDoc.Editor.WriteMessage("\n " + item.Key); } // Abort the changes to the database acTrans.Abort(); } }
この例では、新しいレイアウトを作成し、レイアウト マネージャを使用して現在のレイアウトに設定します。
Imports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.Geometry ' Create a new layout with the LayoutManager <CommandMethod("CreateLayout")> _ Public Shared Sub CreateLayout() ' Get the current document and database Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument Dim acCurDb As Database = acDoc.Database ' Get the layout and plot settings of the named pagesetup Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() ' Reference the Layout Manager Dim acLayoutMgr As LayoutManager = LayoutManager.Current ' Create the new layout with default settings Dim objID As ObjectId = acLayoutMgr.CreateLayout("newLayout") ' Open the layout Dim acLayout As Layout = acTrans.GetObject(objID, _ OpenMode.ForRead) ' Set the layout current if it is not already If acLayout.TabSelected = False Then acLayoutMgr.CurrentLayout = acLayout.LayoutName End If ' Output some information related to the layout object acDoc.Editor.WriteMessage(vbLf & "Tab Order: " & acLayout.TabOrder & _ vbLf & "Tab Selected: " & acLayout.TabSelected & _ vbLf & "Block Table Record ID: " & _ acLayout.BlockTableRecordId.ToString()) ' Save the changes made acTrans.Commit() End Using End Sub
using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; // Create a new layout with the LayoutManager [CommandMethod("CreateLayout")] public void CreateLayout() { // Get the current document and database Document acDoc = Application.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; // Get the layout and plot settings of the named pagesetup using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { // Reference the Layout Manager LayoutManager acLayoutMgr = LayoutManager.Current; // Create the new layout with default settings ObjectId objID = acLayoutMgr.CreateLayout("newLayout"); // Open the layout Layout acLayout = acTrans.GetObject(objID, OpenMode.ForRead) as Layout; // Set the layout current if it is not already if (acLayout.TabSelected == false) { acLayoutMgr.CurrentLayout = acLayout.LayoutName; } // Output some information related to the layout object acDoc.Editor.WriteMessage("\nTab Order: " + acLayout.TabOrder + "\nTab Selected: " + acLayout.TabSelected + "\nBlock Table Record ID: " + acLayout.BlockTableRecordId.ToString()); // Save the changes made acTrans.Commit(); } }
この例では、外部図面に格納されているレイアウトを現在の図面に読み込みます。
Imports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.Geometry ' Import a layout from an external drawing <CommandMethod("ImportLayout")> _ Public Shared Sub ImportLayout() ' Get the current document and database Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument Dim acCurDb As Database = acDoc.Database ' Specify the layout name and drawing file to work with Dim layoutName As String = "MAIN AND SECOND FLOOR PLAN" Dim filename As String = "C:\AutoCAD\Sample\Sheet Sets\Architectural\A-01.dwg" ' Create a new database object and open the drawing into memory Dim acExDb As Database = New Database(False, True) acExDb.ReadDwgFile(filename, FileOpenMode.OpenForReadAndAllShare, True, "") ' Create a transaction for the external drawing Using acTransEx As Transaction = acExDb.TransactionManager.StartTransaction() ' Get the layouts dictionary Dim layoutsEx As DBDictionary = _ acTransEx.GetObject(acExDb.LayoutDictionaryId, OpenMode.ForRead) ' Check to see if the layout exists in the external drawing If layoutsEx.Contains(layoutName) = True Then ' Get the layout and block objects from the external drawing Dim layEx As Layout = _ layoutsEx.GetAt(layoutName).GetObject(OpenMode.ForRead) Dim blkBlkRecEx As BlockTableRecord = _ acTransEx.GetObject(layEx.BlockTableRecordId, OpenMode.ForRead) ' Get the objects from the block associated with the layout Dim idCol As ObjectIdCollection = New ObjectIdCollection() For Each id As ObjectId In blkBlkRecEx idCol.Add(id) Next ' Create a transaction for the current drawing Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() ' Get the block table and create a new block ' then copy the objects between drawings Dim blkTbl As BlockTable = _ acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForWrite) Using blkBlkRec As New BlockTableRecord blkBlkRec.Name = "*Paper_Space" & CStr(layoutsEx.Count() - 1) blkTbl.Add(blkBlkRec) acTrans.AddNewlyCreatedDBObject(blkBlkRec, True) acExDb.WblockCloneObjects(idCol, _ blkBlkRec.ObjectId, _ New IdMapping(), _ DuplicateRecordCloning.Ignore, _ False) ' Create a new layout and then copy properties between drawings Dim layouts As DBDictionary = _ acTrans.GetObject(acCurDb.LayoutDictionaryId, OpenMode.ForWrite) Using lay As New Layout lay.LayoutName = layoutName lay.AddToLayoutDictionary(acCurDb, blkBlkRec.ObjectId) acTrans.AddNewlyCreatedDBObject(lay, True) lay.CopyFrom(layEx) Dim plSets As DBDictionary = _ acTrans.GetObject( _ acCurDb.PlotSettingsDictionaryId, _ OpenMode.ForRead) ' Check to see if a named page setup was assigned to the layout, ' if so then copy the page setup settings If lay.PlotSettingsName <> "" Then ' Check to see if the page setup exists If plSets.Contains(lay.PlotSettingsName) = False Then plSets.UpgradeOpen() Using plSet As New PlotSettings(lay.ModelType) plSet.PlotSettingsName = lay.PlotSettingsName plSet.AddToPlotSettingsDictionary(acCurDb) acTrans.AddNewlyCreatedDBObject(plSet, True) Dim plSetsEx As DBDictionary = _ acTransEx.GetObject( _ acExDb.PlotSettingsDictionaryId, _ OpenMode.ForRead) Dim plSetEx As PlotSettings = _ plSetsEx.GetAt( _ lay.PlotSettingsName).GetObject( _ OpenMode.ForRead) plSet.CopyFrom(plSetEx) End Using End If End If End Using End Using ' Regen the drawing to get the layout tab to display acDoc.Editor.Regen() ' Save the changes made acTrans.Commit() End Using Else ' Display a message if the layout could not be found in the specified drawing acDoc.Editor.WriteMessage(vbLf & "Layout '" & layoutName & _ "' could not be imported from '" & filename & "'.") End If ' Discard the changes made to the external drawing file acTransEx.Abort() End Using ' Close the external drawing file acExDb.Dispose() End Sub
using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; // Import a layout from an external drawing [CommandMethod("ImportLayout")] public void ImportLayout() { // Get the current document and database Document acDoc = Application.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; // Specify the layout name and drawing file to work with string layoutName = "MAIN AND SECOND FLOOR PLAN"; string filename = "C:\\AutoCAD\\Sample\\Sheet Sets\\Architectural\\A-01.dwg"; // Create a new database object and open the drawing into memory Database acExDb = new Database(false, true); acExDb.ReadDwgFile(filename, FileOpenMode.OpenForReadAndAllShare, true, ""); // Create a transaction for the external drawing using (Transaction acTransEx = acExDb.TransactionManager.StartTransaction()) { // Get the layouts dictionary DBDictionary layoutsEx = acTransEx.GetObject(acExDb.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary; // Check to see if the layout exists in the external drawing if (layoutsEx.Contains(layoutName) == true) { // Get the layout and block objects from the external drawing Layout layEx = layoutsEx.GetAt(layoutName).GetObject(OpenMode.ForRead) as Layout; BlockTableRecord blkBlkRecEx = acTransEx.GetObject(layEx.BlockTableRecordId, OpenMode.ForRead) as BlockTableRecord; // Get the objects from the block associated with the layout ObjectIdCollection idCol = new ObjectIdCollection(); foreach (ObjectId id in blkBlkRecEx) { idCol.Add(id); } // Create a transaction for the current drawing using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { // Get the block table and create a new block // then copy the objects between drawings BlockTable blkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForWrite) as BlockTable; using (BlockTableRecord blkBlkRec = new BlockTableRecord()) { int layoutCount = layoutsEx.Count - 1; blkBlkRec.Name = "*Paper_Space" + layoutCount.ToString(); blkTbl.Add(blkBlkRec); acTrans.AddNewlyCreatedDBObject(blkBlkRec, true); acExDb.WblockCloneObjects(idCol, blkBlkRec.ObjectId, new IdMapping(), DuplicateRecordCloning.Ignore, false); // Create a new layout and then copy properties between drawings DBDictionary layouts = acTrans.GetObject(acCurDb.LayoutDictionaryId, OpenMode.ForWrite) as DBDictionary; using (Layout lay = new Layout()) { lay.LayoutName = layoutName; lay.AddToLayoutDictionary(acCurDb, blkBlkRec.ObjectId); acTrans.AddNewlyCreatedDBObject(lay, true); lay.CopyFrom(layEx); DBDictionary plSets = acTrans.GetObject(acCurDb.PlotSettingsDictionaryId, OpenMode.ForRead) as DBDictionary; // Check to see if a named page setup was assigned to the layout, // if so then copy the page setup settings if (lay.PlotSettingsName != "") { // Check to see if the page setup exists if (plSets.Contains(lay.PlotSettingsName) == false) { plSets.UpgradeOpen(); using (PlotSettings plSet = new PlotSettings(lay.ModelType)) { plSet.PlotSettingsName = lay.PlotSettingsName; plSet.AddToPlotSettingsDictionary(acCurDb); acTrans.AddNewlyCreatedDBObject(plSet, true); DBDictionary plSetsEx = acTransEx.GetObject(acExDb.PlotSettingsDictionaryId, OpenMode.ForRead) as DBDictionary; PlotSettings plSetEx = plSetsEx.GetAt(lay.PlotSettingsName).GetObject( OpenMode.ForRead) as PlotSettings; plSet.CopyFrom(plSetEx); } } } } } // Regen the drawing to get the layout tab to display acDoc.Editor.Regen(); // Save the changes made acTrans.Commit(); } } else { // Display a message if the layout could not be found in the specified drawing acDoc.Editor.WriteMessage("\nLayout '" + layoutName + "' could not be imported from '" + filename + "'."); } // Discard the changes made to the external drawing file acTransEx.Abort(); } // Close the external drawing file acExDb.Dispose(); }