Перейти к содержанию
  • записей
    7
  • комментариев
    10
  • просмотров
    766

NET Переместить маскировку в блоке на задний план


doctorraz

92 просмотра

В nano  20.х добавили функциональную панель "Инструменты" (в Autocad называлось палитра)

Сама по себе неплохая штука и порой весьма удобная.. 

Но местами весьма глючная, а глючная в плане того, что при вставке блоков путает порядок прорисовки и поднимает маскировку этих блоков на передний план.

Спойлер

image.png.7272304427ec9180111ece44bccd437b.png

В 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)

Спойлер

image.png.7ac6ed6a44526d85dd51caf806d556f6.png

Форум не позволяет загружать dll и архивы, поэтому ссылка на сборку и там же пример блоков которые режут линию под собой

Изменено пользователем doctorraz
ошибка в коде

0 Комментариев


Рекомендуемые комментарии

Комментариев нет

Гость
Добавить комментарий...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...