Message 1 of 12
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
I need to update an old 2014 VB.net to renumber sheet sets to Autocad 2020.
I'm using VS 2017 and VS 2019.
I tried to do changes to the code as was recommended in other posts but I always have errors.
Original post :
http://www.theswamp.org/index.php?topic=45672.msg508180#msg508180
here my version:
///tlbimp acsmcomponents19.tlb /out:Interop.ACSMCOMPONENTS19Lib.dll /namespace:AcSm /machine:x64 ///tlbimp acsmcomponents23.tlb /out:Interop.ACSMCOMPONENTS23Lib.dll /namespace:AcSm /machine:x64 ///"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\TlbImp.exe" "C:\Autodesk\ObjectARX_for_AutoCAD_2020_Win_64_bit\inc-x64\acsmcomponents23.tlb" /out:"C:\Autodesk\ObjectARX_for_AutoCAD_2020_Win_64_bit\inc-x64\Interop.ACSMCOMPONENTS23Lib.dll" /namespace:AcSm /machine:x64 /* * SheetSetTools. © Andrey Bushman, 2013, original * Modified to work with AUTOCAD 2020 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 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 = 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 } }
So, How can I do it? (If possible, explain with a step to step)
Solved! Go to Solution.