/*
* SheetSetTools. © Andrey Bushman, 2013
* AutoCAD 2014 x64 Enu
*
* COMMANDS:
* SS-RENUMBER-ALL - Update the numeration for all sheets in the all opened sheet sets:
* numbering of each subgroup shall begin with 1.
*
* SS-RENUMBER-ALL-BASES-OF-FIRST - Update the numeration: to continue numbering on the
* basis of the first element in the each subset (in the all opened sheet sets).
*
* AutoCAD references:
* AcCoreMgd.dll
* AcDbMgd.dll
* AcMgd.dll
* Interop.ACSMCOMPONENTS22Lib.dll
*/
using System;
using cad = Autodesk.AutoCAD.ApplicationServices.Application;
using App = Autodesk.AutoCAD.ApplicationServices;
using Db = Autodesk.AutoCAD.DatabaseServices;
using Ed = Autodesk.AutoCAD.EditorInput;
using Rtm = Autodesk.AutoCAD.Runtime;
using Comp = ACSMCOMPONENTS22Lib;
[assembly: Rtm.ExtensionApplication(typeof(Bushman.AutoCAD.SheetSetTools.SheetSetCommands))]
[assembly: Rtm.CommandClass(typeof(Bushman.AutoCAD.SheetSetTools.SheetSetCommands))]
namespace Bushman.AutoCAD.SheetSetTools
{
public class SheetSetCommands : Rtm.IExtensionApplication
{
const String ns = "bush"; // namespace
/// <summary>
/// Update the numeration for all sheets in the all opened sheet sets: numbering of
/// each subgroup shall begin with 1.
/// </summary>
[Rtm.CommandMethod(ns, "ss-renumber-all", Rtm.CommandFlags.Modal)]
public void Renumber_All()
{
Renumber();
}
/// <summary>
/// Update the numeration: to continue numbering on the basis of the first element
/// in the each subset (in the all opened sheet sets).
/// </summary>
[Rtm.CommandMethod(ns, "ss-renumber-all-bases-of-first", Rtm.CommandFlags.Modal)]
public void Renumber_all_bases_of_first()
{
Renumber(true);
}
/// <summary>
/// To update numbering of all sheets in the all opened sheet sets.
/// </summary>
/// <param name="continue_numbering">True - to continue numbering on the basis
/// of the first element in the each subset (in the all opened sheet sets);
/// False - Numbering of each subgroup shall begin with 1 (in the all opened
/// sheet sets).</param>
void Renumber(Boolean continue_numbering = false)
{
App.Document doc = cad.DocumentManager.MdiActiveDocument;
Db.Database db = doc.Database;
Ed.Editor ed = doc.Editor;
Comp.AcSmSheetSetMgr mng = new Comp.AcSmSheetSetMgr();
Comp.IAcSmEnumDatabase enumerator = mng.GetDatabaseEnumerator();
enumerator.Reset();
Comp.AcSmDatabase smDb = null;
while ((smDb = enumerator.Next()) != null)
{
smDb.LockDb(db);
String fname = smDb.GetFileName();
Comp.AcSmSheetSet sheetset = smDb.GetSheetSet();
String name = sheetset.GetName();
String descr = sheetset.GetDesc();
ed.WriteMessage("\nSheet Set name: {0}\n", name);
Int32 ren_count = 0; // count of renamed sheets.
Comp.IAcSmEnumComponent encomp = sheetset.GetSheetEnumerator();
encomp.Reset();
Comp.IAcSmComponent component = null;
while ((component = encomp.Next()) != null)
{
ProcessElement(ed, component, ref ren_count, continue_numbering);
}
encomp.Reset();
smDb.UnlockDb(db, true);
ed.WriteMessage("Renumbered sheets count: {0}\n", ren_count);
}
enumerator.Reset();
}
/// <summary>
/// Recursive processing of the elements: change the sheet's number.
/// </summary>
/// <param name="ed">An Editor for the output.</param>
/// <param name="component">Component of Sheet Set.</param>
/// <param name="ren_count">The count of renumbered sheets in the sheet set.</param>
/// <param name="continue_numbering">True - to continue numbering on the basis
/// of the first element in the each subset (in the all opened sheet sets);
/// False - Numbering of each subgroup shall begin with 1 (in the all opened
/// sheet sets).</param>
void ProcessElement(Ed.Editor ed, Comp.IAcSmComponent component,
ref Int32 ren_count, Boolean continue_numbering)
{
component.GetDirectlyOwnedObjects(out Array array);
if (array != null)
{
Int32 sheet_number = 1;
Boolean basis_of_first = continue_numbering;
foreach (var item in array)
{
if (item is Comp.IAcSmSubset)
{
ProcessElement(ed, (Comp.IAcSmSubset)item, ref ren_count, continue_numbering);
}
else if (item is Comp.IAcSmSheet sheet)
{
String cur_str_value = sheet.GetNumber();
Boolean is_int32 = Int32.TryParse(cur_str_value, out int int_value);
if (!is_int32 || (!basis_of_first && int_value != sheet_number))
{
sheet.SetNumber(sheet_number.ToString());
++ren_count;
}
else if (basis_of_first)
{
sheet_number = int_value;
}
++sheet_number;
basis_of_first = false;
}
else if (item is Comp.IAcSmPersist persist)
{
}
else
{
ed.WriteMessage("Unknown object: {0}", item.GetType().ToString());
}
}
}
}
#region IExtensionApplication Members
public void Initialize()
{
App.Document doc = cad.DocumentManager.MdiActiveDocument;
Ed.Editor ed = doc.Editor;
ed.WriteMessage("\nSheetSetTools. © Andrey Bushman, 2013\n\n");
}
public void Terminate()
{
// Empty body.
}
#endregion
}
}