Author Topic: Incremental renumber command for Sheet Set View  (Read 151 times)

0 Members and 1 Guest are viewing this topic.

jtm2020hyo

  • Newt
  • Posts: 188
Incremental renumber command for Sheet Set View
« on: October 27, 2021, 11:13:56 AM »
SS-Renumber command renumber Sheet Sets in the Sheet Set Manager


Code: [Select]
// (C) Copyright 2019 by 
//
using System;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;

/*
 * 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.ACSMCOMPONENTS23Lib.dll
 */


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 = ACSMCOMPONENTS23Lib;

[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
    }
}



Anyone know how to edit this code for Sheet Set View?




PD: Sheet Set View is the equivalent to Sheet Set Manager but for AutoCAD Civil3D's / AutoCAD Architecture's / AutoCAD MEP's Project Manager