jtm2020hyo 发表于 2021-10-27 11:13:56

工作表集视图的增量重新编号命令

SS-Renumber命令在Sheet Set Manager
// (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;


namespace Bushman.AutoCAD.SheetSetTools
{
    public class SheetSetCommands : Rtm.IExtensionApplication
    {
      const String ns = "bush"; // namespace
      ///
      /// Update the numeration for all sheets in the all opened sheet sets: numbering of
      /// each subgroup shall begin with 1.
      ///
      
      public void Renumber_All()
      {
            Renumber();
      }
      ///
      /// Update the numeration: to continue numbering on the basis of the first element
      /// in the each subset (in the all opened sheet sets).
      ///
      
      public void Renumber_all_bases_of_first()
      {
            Renumber(true);
      }
      ///
      /// To update numbering of all sheets in the all opened sheet sets.
      ///
      /// 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).
      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();
      }
      ///
      ///Recursive processing of the elements: change the sheet's number.
      ///
      /// An Editor for the output.
      /// Component of Sheet Set.
      /// The count of renumbered sheets in the sheet set.
      /// 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).
      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
    }
}
有人知道如何为Sheet Set View编辑此代码吗?
PD:Sheet Set View相当于Sheet Set Manager,但适用于AutoCAD的/AutoCAD Architecture的/AutoCAD MEP的项目管理器
**** Hidden Message *****
页: [1]
查看完整版本: 工作表集视图的增量重新编号命令