TheSwamp

Code Red => .NET => Topic started by: Kerry on January 12, 2007, 02:05:14 AM

Title: Layouts
Post by: Kerry on January 12, 2007, 02:05:14 AM
I've started to play with Layouts .. heading towards Plotting [expect this to be a long path ]


Anyone want to give this a run .. ?
The routine is designed to display the Names of All Layouts defined in the Document.

The initialiser may be of interest too.
Code - C#: [Select]
  1. //
  2. // KDUB
  3. // Codehimbelonga kwb@theSwamp 20070112
  4. // For AC2007: MSVS2005
  5.  
  6. #region usingdeclarations
  7.  
  8. using System;
  9.  
  10. //// Assembly acdbmgd .. ObjectDBX.NET Managed Wrapper
  11. //// Assembly acmgd .. Autocad.NET Managed Wrapper
  12. using Autodesk.AutoCAD.ApplicationServices;
  13. using Autodesk.AutoCAD.DatabaseServices;
  14. using Autodesk.AutoCAD.EditorInput;
  15. using Autodesk.AutoCAD.Geometry;
  16. using Autodesk.AutoCAD.Runtime;
  17. using Autodesk.AutoCAD.Colors;
  18. #endregion
  19.  
  20. #region usingAliases
  21. // Forms : MessageBox,
  22. using System.Windows.Forms;
  23. // : DictionaryEntry,
  24. using System.Collections;
  25. //
  26. using System.Collections.Generic;
  27. // For StringCollection
  28. using System.Collections.Specialized;
  29. // For Plotting
  30. using Autodesk.AutoCAD.PlottingServices;
  31. //
  32. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  33. using AcEd = Autodesk.AutoCAD.EditorInput;
  34. using AcRx = Autodesk.AutoCAD.Runtime;
  35. using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;
  36. using DBTransMan = Autodesk.AutoCAD.DatabaseServices.TransactionManager;
  37.  
  38. #endregion
  39.  
  40.  
  41. [assembly: AcRx.CommandClass(typeof(kdubTestStuff.kdubTestClass))]
  42.  
  43. namespace kdubTestStuff
  44. {
  45.     /// <summary>
  46.     /// Summary for kdubTestStuff
  47.     /// </summary>
  48.     public class kdubTestClass : AcRx.IExtensionApplication
  49.     {
  50.         /// <summary>
  51.         /// ---------------------------------------------------------------------------------------------
  52.         /// </summary>
  53.  
  54.         [AcRx.CommandMethod("kbLAL")]
  55.         static public void
  56.             listAllLayouts()
  57.         {
  58.             AcDb.Database db = HostApplicationServices.WorkingDatabase;            
  59.             AcEd.Editor ed = AcadApp.DocumentManager.MdiActiveDocument.Editor;
  60.             try
  61.             {
  62.                 using (AcDb.Transaction
  63.                     tr = db.TransactionManager.StartTransaction())
  64.                 {
  65.                      AcDb.LayoutManager layoutMgr = AcDb.LayoutManager.Current;
  66.                      ed.WriteMessage("LayoutManager.CurrentLayout = " + layoutMgr.CurrentLayout + "\n");
  67.                      ed.WriteMessage("LayoutManager.Count = " + layoutMgr.LayoutCount.ToString() + "\n");
  68.  
  69.                      using (AcDb.DBDictionary
  70.                          layoutDict = (AcDb.DBDictionary)tr.GetObject(db.LayoutDictionaryId, AcDb.OpenMode.ForRead))
  71.                      {
  72.                         foreach (DictionaryEntry layoutEntry in layoutDict)
  73.                         {
  74.                             using (AcDb.Layout
  75.                                 layoutObj = (AcDb.Layout)tr.GetObject((AcDb.ObjectId)(layoutEntry.Value), AcDb.OpenMode.ForRead))
  76.                             {
  77.                                 ed.WriteMessage("Layout.LayoutName = " + layoutObj.LayoutName + "\n");
  78.                             }
  79.                         }
  80.                     }
  81.                 }
  82.             }
  83.             catch (System.Exception ex)
  84.             {
  85.                 MessageBox.Show(ex.ToString());
  86.             }
  87.         }
  88.         /// <summary>
  89.         /// ---------------------------------------------------------------------------------------------
  90.         /// </summary>
  91.         public void
  92.             Initialize()
  93.         {
  94.             //Let the user know what's happening while loading your stuff  
  95.             AcEd.Editor ed = AcadApp.DocumentManager.MdiActiveDocument.Editor;
  96.             ed.WriteMessage("\nLoading 'listAllLayouts' application ...");
  97.             ed.WriteMessage("\nConcept Code For AC2007, MSVS2005 :: kwb@theSwamp 20070112 ...");
  98.             ed.WriteMessage("\nUse kbLAL at command line to List all Current Layout Names\n");
  99.  
  100.         }
  101.         public void
  102.             Terminate()
  103.         {
  104.             //Nothing to see here yet, move along !
  105.  
  106.         }
  107.     }
  108. }

... and the obligatory piccy .. :-)
Title: Re: Layouts
Post by: Kerry on January 12, 2007, 02:22:09 AM
.. and these are the Locals after the first run through the foreach loop.

I'm finding that the Locals, the Browser/Reflection is helping me make a pretty good guess regarding whats going on.
Title: Re: Layouts
Post by: It's Alive! on January 12, 2007, 02:49:16 AM
Nice! works great here

I like this ...
Code: [Select]
using AcDb = Autodesk.AutoCAD.DatabaseServices;
using AcEd = Autodesk.AutoCAD.EditorInput;
using AcRx = Autodesk.AutoCAD.Runtime;

Hope you don’t mind me borrowing stuff  :-)

edit

And I do like the initialiser I’ve never seen this
Title: Re: Layouts
Post by: It's Alive! on January 12, 2007, 02:56:17 AM
layoutMgr does not need to be disposed because it’s not a "new" LayoutManager right?
Title: Re: Layouts
Post by: Kerry on January 12, 2007, 02:58:06 AM
It's a good learner Dan.

Re the 'borrowing'  ... whats round comes around .. I notices the concept on one of the chinese sites ages ago .. just starting to make use of it sometimes. I thought it may help me learn where everything comes from without increasing the keystroke count too much.
Title: Re: Layouts
Post by: Kerry on January 12, 2007, 03:03:34 AM
layoutMgr does not need to be disposed because it’s not a "new" LayoutManager right?

Thats my understanding ... but I'd be happy to be corrected.

And I do like the initialiser I’ve never seen this

Yeah, I became tired of forgetting the command Name I need to type to get test stuff to run  ;-)

When I use more that one callable method especially .. I just add an extra line to the Initialiser for each command.
Title: Re: Layouts
Post by: Kerry on January 12, 2007, 07:39:04 AM
Next one .. needs some refining ..

If anyone can see anything that looks questionable or could do with a rev' please yell.  :|

add this Method to the same class as the previous ..
Code - C#: [Select]
  1.        
  2.         [AcRx.CommandMethod("kbPSL")]
  3.         static public void
  4.             ListPlotStylesForLayouts()
  5.         {
  6.             AcDb.Database db = HostApplicationServices.WorkingDatabase;            
  7.             AcEd.Editor ed = AcadApp.DocumentManager.MdiActiveDocument.Editor;
  8.             //            
  9.             try
  10.             {
  11.                 using (AcDb.Transaction tr = db.TransactionManager.StartTransaction())
  12.                 {
  13.                     using (AcDb.DBDictionary layoutDict = (AcDb.DBDictionary)tr.GetObject
  14.                                              (db.LayoutDictionaryId, AcDb.OpenMode.ForRead))
  15.                     {
  16.                         foreach (DictionaryEntry layoutEntry in layoutDict)
  17.                         {
  18.                             using (AcDb.Layout  layoutObj = (AcDb.Layout)tr.GetObject
  19.                                                 ((AcDb.ObjectId)(layoutEntry.Value),AcDb.OpenMode.ForRead))
  20.                             {
  21.                                 string strStyleSheet = layoutObj.CurrentStyleSheet.ToString();
  22.                                 if (strStyleSheet.Length == 0)
  23.                                 {
  24.                                     ed.WriteMessage("Layout.LayoutName = " + layoutObj.LayoutName
  25.                                         + ", StyleSheet = " + "nada - tough luck" + "\n");
  26.                                 }
  27.                                 else
  28.                                 {
  29.                                     ed.WriteMessage("Layout.LayoutName = " + layoutObj.LayoutName
  30.                                         + ", StyleSheet = " + strStyleSheet + "\n");
  31.                                 }
  32.                             }
  33.                         }
  34.                     }
  35.                 }
  36.             }
  37.             catch (System.Exception ex)
  38.             {
  39.                 MessageBox.Show(ex.ToString());
  40.             }
  41.         }


and replace the  Initialize() Method with this ..
Code - C#: [Select]
  1.         public void
  2.             Initialize()
  3.         {
  4.             //Let the user know what's happening while loading your stuff  
  5.             AcEd.Editor ed = AcadApp.DocumentManager.MdiActiveDocument.Editor;
  6.            
  7.             ed.WriteMessage("\nConcept Code For AC2007, MSVS2005 :: kwb@theSwamp 20070112 ...");
  8.             ed.WriteMessage("\nUse kbLAL at command line to List all Current Layout Names\n");
  9.             ed.WriteMessage("\nUse kbPSL at command line to List PlotStyles For Layouts \n");
  10.         }
and the piccy ...
Title: Re: Layouts
Post by: Kerry on January 13, 2007, 01:09:49 AM
Next one :
Device Names for the Active Layout using COM ActiveX in C# [ no apologies ;-) ]

Add this to the usings and reference the COM Dll's..
Code - C#: [Select]
  1. //// COM Interop References
  2. //// AutoCAD 2007 Type Library
  3. //// AXDBLib AutoCAD/ObjectDBX Common 17.0 Type Library
  4. using AcInt = Autodesk.AutoCAD.Interop;
  5. using AcIntC = Autodesk.AutoCAD.Interop.Common;
  6.  

Add this to the main Class ..
Code - C#: [Select]
  1.         [AcRx.CommandMethod("kbPDN")]
  2.         static public void GetPlotDeviceNames()
  3.         {
  4.             AcEd.Editor ed = AcadApp.DocumentManager.MdiActiveDocument.Editor;
  5.  
  6.             // Use the COM ActiveX interface to extract the devices from the activeLayout
  7.             //
  8.             AcInt.AcadApplication appCOM = (AcInt.AcadApplication)AcadApp.AcadApplication;            
  9.             AcIntC.AcadLayout activeLayout = appCOM.ActiveDocument.ActiveLayout;
  10.            
  11.             // generic System.Object
  12.            Object plotDevices = activeLayout.GetPlotDeviceNames();
  13.             // Array of device Names
  14.            Array plotDeviceArray = (Array)plotDevices;
  15.            
  16.            //
  17.            ed.WriteMessage("\nPlot Device List for :"  + activeLayout.Name) ;
  18.            foreach (string nameStr in plotDeviceArray)  
  19.            {
  20.                ed.WriteMessage("\n " + nameStr);
  21.            }            
  22.         }
  23.  

And the Piccy

Title: Re: Layouts
Post by: Kerry on January 13, 2007, 01:41:54 AM
.. and the same from the managed API using PlottingServices ..

Add this to the usings ;
Code: [Select]
using AcPS = Autodesk.AutoCAD.PlottingServices;
Then add this to the Class
Code - C#: [Select]
  1.         [AcRx.CommandMethod("kbPDNN")]
  2.         static public void PlotDeviceNamesNet()
  3.         {
  4.             AcEd.Editor ed = AcadApp.DocumentManager.MdiActiveDocument.Editor;
  5.             ed.WriteMessage("\nPlot Device List In Net :"  );
  6.             foreach (AcPS.PlotConfigInfo pci in AcPS.PlotConfigManager.Devices )
  7.             {
  8.                 ed.WriteMessage("\n " + pci.DeviceName );
  9.             }
  10.         }
and the piccy .. same result !
Title: Re: Layouts
Post by: Kerry on January 13, 2007, 02:52:20 AM
This one was fun !! .. had a play with a generics list ..
not sure if it's correct [best way etc] , but it works !!!

Code - C#: [Select]
  1.         [AcRx.CommandMethod("kbPDN-1")]
  2.         static public void PlotDeviceNamesNet_1()
  3.         {
  4.             AcEd.Editor ed = AcadApp.DocumentManager.MdiActiveDocument.Editor;
  5.             ed.WriteMessage("\nPlot Device List In Net :");
  6.  
  7.             AcPS.PlotConfigInfoCollection plotDevices = AcPS.PlotConfigManager.Devices ;
  8.  
  9.             // use a bit of the NET generics
  10.             //
  11.             List<string>  plotDeviceList = new List<string>();
  12.  
  13.             //// lets build a list [collection]to use later ...
  14.            
  15.             foreach (AcPS.PlotConfigInfo pci in plotDevices )
  16.             {
  17.                 plotDeviceList.Add(pci.DeviceName);
  18.             }
  19.  
  20.             // Print it out just to proove it ..
  21.             foreach (string deviceName in plotDeviceList)
  22.             {
  23.                 ed.WriteMessage("\n " + deviceName);
  24.             }
  25.         }
  26.  
The debug Locals for the built List ..
.. and the command line piccy ..
Title: Re: Layouts
Post by: It's Alive! on January 13, 2007, 02:52:37 AM
Oh yea managed API version is much cleaner. I almost forgot all about that ActiveX stuff  :-o
Title: Re: Layouts
Post by: It's Alive! on January 13, 2007, 02:56:18 AM
.. had a play with a generics list ..

Ha! I was just doing the same thing!!! List<string>  plotDeviceList = new List<string>();
That’s funny
Title: Re: Layouts
Post by: Kerry on January 13, 2007, 02:58:58 AM
Great minds think alike, fools never differ  .. etc ... ;-)

Today has been a good day Dan !
Title: Re: Layouts
Post by: Kerry on January 13, 2007, 03:07:54 AM
Just a thought ..

If we can get a couple of people adding working Methods to this thread it won't take long before we start to understand the Plotting and Layouts Namespaces.  :|

... simple single purpose snippets will me fine, thank you !  :-)


Title: Re: Layouts
Post by: kdub_nz on March 11, 2023, 03:33:43 PM

Jeeeze , time flies !!
Title: Re: Layouts
Post by: Bryco on March 15, 2023, 02:49:22 PM
I got a lot of printing stuff from https://through-the-interface.typepad.com/through_the_interface/2007/10/allowing-select.html