Сброс draw order при db.WblockCloneObject

Автор Тема: Сброс draw order при db.WblockCloneObject  (Прочитано 6916 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте!
Копирую объекты из одного чертежа в другой, при этом слетает порядок следования объектов внутри блоков и маскировка wipeout всегда оказывается сверху и скрывает другие объекты. Как можно изменить это поведение? Маскировка внутри блока для того чтобы при накрытии блоком другой геометрии не приходилось делать обрывы по контуру.


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Сброс draw order при db.WblockCloneObject
« Ответ #1 : 07-04-2020, 18:27:10 »
Версия AutoCAD? Если до 2015 включительно, то не лечится. Нужно самостоятельно изменить порядок после копирования. На форуме обсуждали.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Сброс draw order при db.WblockCloneObject
« Ответ #2 : 07-04-2020, 19:01:49 »
ACAD 2015. Есть какой-нибудь пример как можно менять порядок объектов внутри блоков?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Сброс draw order при db.WblockCloneObject
« Ответ #3 : 07-04-2020, 19:23:35 »
ACAD 2015. Есть какой-нибудь пример как можно менять порядок объектов внутри блоков?
Можешь поискать, но я не помню готовых примеров. Выложи чертеж с одним таким блоком и укажи куда нужно поставить маскировку (подозреваю, что она должна быть последней).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Сброс draw order при db.WblockCloneObject
« Ответ #4 : 07-04-2020, 19:32:01 »
Выложи чертеж с одним таким блоком и укажи куда нужно поставить маскировку (подозреваю, что она должна быть последней)
Маскировка действительно снизу всего, скрывает то что под всей вставкой блока.

Отмечено как Решение Atomohod 08-04-2020, 10:42:17

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Сброс draw order при db.WblockCloneObject
« Ответ #5 : 07-04-2020, 21:07:00 »
Вот образец кода:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7.  
  8. // This line is not mandatory, but improves loading performances
  9. [assembly: CommandClass(typeof(WipeoutToBottom.MyCommands))]
  10.  
  11. namespace WipeoutToBottom
  12. {
  13.   public class MyCommands
  14.   {
  15.     [CommandMethod("WipeoutToBottom")]
  16.     public void WipeoutToBottomHandler()
  17.     {
  18.       Document doc = Application.DocumentManager.MdiActiveDocument;
  19.       if (doc == null) return;
  20.       Editor ed = doc.Editor;
  21.       Database db = doc.Database;
  22.       PromptEntityOptions prOpt =
  23.         new PromptEntityOptions("Выберите вставку блока: ");
  24.       prOpt.SetRejectMessage("Это не блок!");
  25.       prOpt.AddAllowedClass(typeof(BlockReference), true);
  26.       PromptEntityResult prRes = ed.GetEntity(prOpt);
  27.       if (prRes.Status != PromptStatus.OK)
  28.         return;
  29.       using (Transaction tr = doc.TransactionManager.StartTransaction())
  30.       {
  31.         BlockReference br = (BlockReference) tr.GetObject(prRes.ObjectId, OpenMode.ForRead);
  32.         BlockTableRecord btr = (BlockTableRecord)tr.GetObject(br.BlockTableRecord, OpenMode.ForRead);
  33.         ObjectIdCollection idsWipeout = new ObjectIdCollection();
  34.         foreach (ObjectId id in btr) {
  35.           if (id.ObjectClass.IsDerivedFrom(RXClass.GetClass(typeof(Wipeout)))) {
  36.             idsWipeout.Add(id);
  37.           }
  38.         }
  39.         if (idsWipeout.Count > 0) {
  40.           DrawOrderTable dot = (DrawOrderTable)tr.GetObject(btr.DrawOrderTableId, OpenMode.ForWrite);
  41.           dot.MoveToBottom(idsWipeout);
  42.         }
  43.         tr.Commit();
  44.       }
  45.       ed.Regen();
  46.     }
  47.   }
  48. }

Так это выглядит:



Так как у тебя блок динамический, то тебе нужно будет проделать аналогичную процедуру со всеми BlockTableRecord анонимных блоков, порожденных этим блоком.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение