Search the Community
Showing results for tags 'purge'.
-
Version 1.0.0
3 downloads
Простой LISP для очистки от аннотативных масштабов, c выводом количества АМ и подтверждения от пользователя на удаление. Думаю может пригодиться кому для пределки под себя. Внимание: Файл содержит большое количество аннотативных масштабов. Рекомендуется удалить масштабы, запустив команду -ОЧИСТИТЬ и выбрав опцию AНнотативные масштабы --- (497148) В подобных файлах, работает с задержкой. -
Version 2023-05-25
21 downloads
Собрала все способы очистки в одну кучу для nanoCAD, что смогла подправила. Постаралась не сломать под AutoCAD, но проверить не было возможности. Основные команды: AutoPurge - очистка со всеми битами (_kpblc-autostart-purge xxxx), см. https://autolisp.ru/2014/03/24/clear-dwg-at-opening/; full_clean - собрала очистку с аудитом в 3 прохода всего, что только можно по следам: Замечание: в AutoCAD чистилась история построения твердых тел, а в нане подобъектов не находит. Вместо этого добавила чистку sorTTabl для (_kpblc-autostart-purge 16) -
nanoCAD 6.0 Plus Для начала были написаны следующие методы расширения: /* © Andrey Bushman, 2014 * ExtensionMethods.cs */ using System; using System.Collections.Generic; using System.Linq; using System.Text; #if TEIGHA_CLASSIC using Db = Teigha.DatabaseServices; using Rt = Teigha.Runtime; using Gm = Teigha.Geometry; #endif #if NANOCAD using cad = HostMgd.ApplicationServices.Application; using Ap = HostMgd.ApplicationServices; using Ed = HostMgd.EditorInput; #elif BRICSCAD using cad = Bricscad.ApplicationServices.Application; using Ap = Bricscad.ApplicationServices; using Ed = Bricscad.EditorInput; #elif AUTOCAD using cad = Autodesk.AutoCAD.ApplicationServices.Application; using Ap = Autodesk.AutoCAD.ApplicationServices; using Db = Autodesk.AutoCAD.DatabaseServices; using Ed = Autodesk.AutoCAD.EditorInput; using Rt = Autodesk.AutoCAD.Runtime; using Gm = Autodesk.AutoCAD.Geometry; #endif namespace Bushman.CAD { public delegate void WriteMessage(String format, params Object[] args); public static class ExtensionMethods { public static Db.ObjectId[] GetDBObjectIds(this Db.Database db) { Db.ObjectId[] ids = GetDBObjectIds(db, (n => true)); return ids; } public static Db.ObjectId[] GetDBObjectIds(this Db.Database db, Func<Db.ObjectId, Boolean> filter) { // Check arguments if (null == db) throw new ArgumentNullException("null == db"); if (null == filter) throw new ArgumentNullException("null == filter"); if (db.IsDisposed) throw new ArgumentException("true == db.IsDisposed"); // ------------------- Int32 approxNum = db.ApproxNumObjects; List<Db.ObjectId> ids = new List<Db.ObjectId>(); for (Int64 i = db.BlockTableId.Handle.Value; i < db.Handseed.Value && approxNum > 0; ++i) { Db.Handle h = new Db.Handle(i); Db.ObjectId id = Db.ObjectId.Null; Boolean parseResult = db.TryGetObjectId(h, out id); if (parseResult) { --approxNum; if (filter(id)) { ids.Add(id); } } } return ids.ToArray(); } public static Int64 PurgeAll(this Db.Database db, out Db.ObjectId[] notRemovedIds, out String errMsg) { // check args if (null == db) throw new ArgumentNullException("null == db"); if (db.IsDisposed) throw new ArgumentException("db.IsDisposed"); //-------------- Db.ObjectId[] ids = null; Db.ObjectIdCollection _ids = null; Int64 rmObjCount = 0; List<Db.ObjectId> errIds = new List<Db.ObjectId>(); StringBuilder sb = new StringBuilder(); do { ids = db.GetDBObjectIds(n => !n.IsErased && !n.IsEffectivelyErased && !errIds.Contains(n)); _ids = new Db.ObjectIdCollection(ids); db.Purge(_ids); using (Db.Transaction tr = db.TransactionManager .StartOpenCloseTransaction()) { foreach (Db.ObjectId id in _ids) { if (!id.IsErased && !id.IsEffectivelyErased) { Db.DBObject obj = tr.GetObject(id, Db.OpenMode .ForWrite, false, true); try { obj.Erase(); ++rmObjCount; } catch (Exception ex) { errIds.Add(id); sb.AppendFormat("ObjectId: {0}. ClassName = " + "\"{1}\". Error message: \"{2}\".\n", id, id.ObjectClass.Name, ex.Message); } } } tr.Commit(); } } while (0 != _ids.Count); notRemovedIds = errIds.ToArray(); errMsg = sb.ToString(); return rmObjCount; } } } Затем, на основе этих методов была написана команда: /* Commands.cs * © Andrey Bushman, 2014 */ using System; using System.Collections.Generic; using System.Linq; using System.Diagnostics; using System.IO; #if TEIGHA_CLASSIC using Db = Teigha.DatabaseServices; using Rt = Teigha.Runtime; using Gm = Teigha.Geometry; #endif #if NANOCAD using cad = HostMgd.ApplicationServices.Application; using Ap = HostMgd.ApplicationServices; using Ed = HostMgd.EditorInput; #elif BRICSCAD using cad = Bricscad.ApplicationServices.Application; using Ap = Bricscad.ApplicationServices; using Ed = Bricscad.EditorInput; #elif AUTOCAD using cad = Autodesk.AutoCAD.ApplicationServices.Application; using Ap = Autodesk.AutoCAD.ApplicationServices; using Db = Autodesk.AutoCAD.DatabaseServices; using Ed = Autodesk.AutoCAD.EditorInput; using Rt = Autodesk.AutoCAD.Runtime; using Gm = Autodesk.AutoCAD.Geometry; #endif [assembly: Rt.ExtensionApplication(typeof(Bushman.CAD.ProxyCommands))] [assembly: Rt.CommandClass(typeof(Bushman.CAD.ProxyCommands))] namespace Bushman.CAD { public sealed class ProxyCommands : Rt.IExtensionApplication { public void Initialize() { Ap.Document doc = cad.DocumentManager.MdiActiveDocument; if (null == doc) return; Ed.Editor ed = doc.Editor; ed.WriteMessage("\n{0}\n", Path.GetFileName(this.GetType().Assembly .Location)); ed.WriteMessage("{0}\n\n", "© Andrey Bushman, 2014"); ed.WriteMessage("{0}:\n", "Commands"); ed.WriteMessage("{0}\n\n", "purgeAll - purge all in the current" + "Database."); } public void Terminate() { } [Rt.CommandMethod("purgeAll", Rt.CommandFlags.Modal)] public void Command_PurgeAll() { Ap.Document doc = cad.DocumentManager.MdiActiveDocument; if (null == doc) return; Ed.Editor ed = doc.Editor; Db.Database db = doc.Database; using (doc.LockDocument()) { Db.ObjectId[] notRemovedIds = null; String errMsg = null; Int64 count = db.PurgeAll(out notRemovedIds, out errMsg); ed.WriteMessage("Removed objects count: {0}\n", count); #if DEBUG ed.WriteMessage(errMsg); ed.WriteMessage("Not removed objects count: {0}\n", notRemovedIds.Length); #endif } } } } В результате работы команды (текущая вкладка - Модель) получаем следующий вывод: После выполнения команды курсор мыши перестаёт отображаться в пространстве Model. Если курсор увести на палитры, то он появляется. При попытке запустить команду Audit (или любую др. команду), либо при попытке переключения на какой-нибудь Layout, получаем аварийное завершение работы nanoCAD.