В nano 20.х добавили функциональную панель "Инструменты" (в Autocad называлось палитра)
Сама по себе неплохая штука и порой весьма удобная..
Но местами весьма глючная, а глючная в плане того, что при вставке блоков путает порядок прорисовки и поднимает маскировку этих блоков на передний план.
В nano21 эту багу исправили.
В принципе казалось бы, в чем проблема..
открой блок на редактирование и утопи маскировку, ан нет, nana20 не умеет редактировать динамические блоки.
Да и статические после вставки нового блока с функциональной панели "Инструментов" каждый раз править, то еще удовольствие(((
Но решение достаточно простое
#if NC using Teigha.DatabaseServices; using Teigha.Runtime; using HostMgd.ApplicationServices; using HostMgd.EditorInput; #else using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Runtime; #endif namespace drz { public class Utils : IExtensionApplication { [CommandMethod("drz-WipBot", CommandFlags.Modal)] public void WipeoutToBotton() /*Топит маскировку внутри блоков */ { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; int count = 0; //using (Transaction tr = db.TransactionManager.StartOpenCloseTransaction())//вот нельзя тут так делать, только для UpgradeOpen(), DowngradeOpen(); //иначе Автокад валится, нане пофих using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); foreach (ObjectId btrId in bt) { BlockTableRecord btr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead); if (!btr.IsFromExternalReference && !btr.IsDependent && !btr.IsLayout)// not xref and not xref|block and not Layout { foreach (ObjectId id in btr) { Entity ent = tr.GetObject(id, OpenMode.ForRead) as Entity; if (ent != null) { Wipeout wpt = ent as Wipeout; if (wpt != null)//если маскировка { // получаем таблицу порядка отрисовки блока DrawOrderTable drawOrder = tr.GetObject(btr.DrawOrderTableId, OpenMode.ForWrite) as DrawOrderTable; ObjectIdCollection ids = new ObjectIdCollection(); ids.Add(wpt.ObjectId); drawOrder.MoveToBottom(ids);//топим маскировку count++; } } } } } tr.Commit(); } ed.Regen(); ed.WriteMessage( "Move to bottom in blocks " + count + " wipeout" ); } //----------------------------- public void Initialize() { Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; ed.WriteMessage("\n\"drz\" загружен"); ed.WriteMessage("\nВызов drz-WipBot"); } public void Terminate() { } } }
Проходит по всем описаниям блоков находит в них маскировки и топит их на дно.
вызов из командной строки drz-WipBot
Тестировался в nano20.1-21, Autocad2018-2021 (естественно в каждый CAD) надо загружать свою сборку (NETLOAD или APPLOAD)
Форум не позволяет загружать dll и архивы, поэтому ссылка на сборку и там же пример блоков которые режут линию под собой
Edited by doctorraz
ошибка в коде
0 Comments
Recommended Comments
There are no comments to display.