/*
* 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.ACSMCOMPONENTS19Lib.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 = ACSMCOMPONENTS19Lib;
[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) {
Array array = null;
component.GetDirectlyOwnedObjects(out 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) { Comp.IAcSmSheet sheet = (Comp.IAcSmSheet)item;
String cur_str_value = sheet.GetNumber();
Int32 int_value = 0;
Boolean is_int32 = Int32.TryParse(cur_str_value, out 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) { Comp.IAcSmPersist persist = (Comp.IAcSmPersist)item;
}
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
}
}