Center mark и centerline

Автор Тема: Center mark и centerline  (Прочитано 7185 раз)

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

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

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

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Center mark и centerline
« : 10-09-2018, 00:37:13 »
Не так давно в Автокаде появились примитивы Center mark и centerline. Именно такие названия показывает пользователю OPM. Однако в API я вижу просто блоки. Причем даже не динамические (IsDynamic == false), хотя для пользователя выглядят как динамические, со всякими дергалками.
А как же отличить эти объекты от просто блоков? Мне надо отбросить все аннотации из списка объектов, а эти метки центра - явные аннотации. xData нет никакой. Имя у них со *, т.е. скрытый от пользователя блок, но это еще ни о чем не говорит.

Оффлайн AndruxaZ

  • ADN OPEN
  • Сообщений: 5
  • Карма: 2
Re: Center mark и centerline
« Ответ #1 : 10-09-2018, 07:13:07 »
Приветствую. Может быть можно отфильтровать по DXF коду. Оба этих примитива имеют реактор (102 . "{ACAD_REACTORS") (330 . <Имя объекта: b999900>) (102 . "}")

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Center mark и centerline
« Ответ #2 : 10-09-2018, 12:17:08 »
Специального API для этого нет. Похоже реализовано это через Overruling. Единственное, что я нашёл - это то что у таких BlockReference есть реактор на AssocDependency. Но это необходимое, но недостаточное условие для Centermark/Centerline



 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Center mark и centerline
« Ответ #3 : 10-09-2018, 12:54:50 »
Я на всякий случай создал запрос в ADN DevHelp - возможно они что-то подскажут.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Center mark и centerline
« Ответ #4 : 10-09-2018, 12:55:38 »
Я на всякий случай создал запрос в ADN DevHelp - возможно они что-то подскажут.
Спасибо!

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Center mark и centerline
« Ответ #5 : 10-09-2018, 18:19:01 »
Может у них в XData что-то записано?

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

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Center mark и centerline
« Ответ #6 : 10-09-2018, 18:34:24 »
Может у них в XData что-то записано?
не. ничего. чисто

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Center mark и centerline
« Ответ #7 : 11-09-2018, 10:00:14 »
Сегодня увидел статью http://adndevblog.typepad.com/autocad/2018/09/how-to-detect-centerline-and-centermark-entities.html - она не поможет? Правда, там ObjectARX...
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Center mark и centerline
« Ответ #8 : 11-09-2018, 10:39:11 »
Сегодня увидел статью http://adndevblog.typepad.com/autocad/2018/09/how-to-detect-centerline-and-centermark-entities.html - она не поможет? Правда, там ObjectARX...
Эту статью  Madhukar Moogala оперативно опубликовал как ответ на мой запрос в ADN DevHelp. Также он уточнил, что используемые методы Не-COM доступны только из ObjectARX. Так что из .NET к ним не добраться.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Center mark и centerline
« Ответ #9 : 11-09-2018, 10:54:25 »
Как все сложно... Я-то просто проигнорирую проблему, а те кому очень приспичит, могут, например, проанализировать состав блока - там наверняка характерные объекты найдутся....

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Center mark и centerline
« Ответ #10 : 11-09-2018, 11:21:24 »
Как все сложно... Я-то просто проигнорирую проблему, а те кому очень приспичит, могут, например, проанализировать состав блока - там наверняка характерные объекты найдутся....
Будем считать, что ответ мы получили, но он нас не совсем устраивает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Center mark и centerline
« Ответ #11 : 11-09-2018, 11:26:41 »
Будем считать, что ответ мы получили, но он нас не совсем устраивает.
Да. Отрицательный результат - тоже результат :)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Center mark и centerline
« Ответ #12 : 11-09-2018, 11:31:35 »
Будем считать, что ответ мы получили, но он нас не совсем устраивает.
Да. Отрицательный результат - тоже результат :)
Зато какая оперативность! Наверное в первый раз с таким сталкиваюсь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Center mark и centerline
« Ответ #13 : 11-09-2018, 11:35:50 »
Зато какая оперативность!
И какая изобретательность в создании проблем на пустом месте ;) Это вам не MLeader от Curve наследовать, тут аутсорсеры по круче поработали :)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Center mark и centerline
« Ответ #14 : 11-09-2018, 11:38:19 »
Зато какая оперативность!
И какая изобретательность в создании проблем на пустом месте ;) Это вам не MLeader от Curve наследовать, тут аутсорсеры по круче поработали :)
Ну не предназначены эти "недо-примитивы" для нормальной программной обработки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Center mark и centerline
« Ответ #15 : 11-09-2018, 11:52:26 »
Это вам не MLeader от Curve наследовать
Какая интересная подробность, не могли бы Вы ее развернуть? а то в AcDbMgd.dll этот класс вот так объявлен public class MLeader : Entity

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Center mark и centerline
« Ответ #16 : 11-09-2018, 11:55:26 »
Это вам не MLeader от Curve наследовать
Какая интересная подробность, не могли бы Вы ее развернуть? а то в AcDbMgd.dll этот класс вот так объявлен public class MLeader : Entity
Кстати, тоже обратил внимание на этот пассаж. И в ObjectARX и в .NET API (AcDb)MLeader наследуется от (AcDb)Entity.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Center mark и centerline
« Ответ #17 : 11-09-2018, 12:15:25 »
виноват, каюсь. MLeader в самом деле от Entity (хотя по логике должен быть как раз от блока, как таблицы и массивы). Просто один раз напоролся на странный объект Leader. Который попался на is Curve. Вот в памяти и отложилось, что с выносками бардак :)

Отмечено как Решение Александр Ривилис 11-09-2018, 12:47:31

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Center mark и centerline
« Ответ #18 : 11-09-2018, 12:47:02 »
avc,
Ну тогда за раскаяние вот тебе решение на .NET твоей задачи:

Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;
  5.  
  6. [assembly: CommandClass(typeof(TestCenterLine.CenterLine))]
  7.  
  8. namespace TestCenterLine
  9. {
  10.  
  11.   public class CenterLine
  12.   {
  13.  
  14.     [CommandMethod("TestCenter")]
  15.     public void MyCommand()
  16.     {
  17.       Document doc = Application.DocumentManager.MdiActiveDocument;
  18.       if (doc == null) return;
  19.       Editor ed = doc.Editor;
  20.       Database db = doc.Database;
  21.       PromptEntityOptions prOpt = new PromptEntityOptions("Выберите блок для проверки: ");
  22.       prOpt.SetRejectMessage("Это не блок!");
  23.       prOpt.AddAllowedClass(typeof(BlockReference), true);
  24.       PromptEntityResult prRes = ed.GetEntity(prOpt);
  25.       if (prRes.Status != PromptStatus.OK) return;
  26.       using (Transaction tr = doc.TransactionManager.StartTransaction())
  27.       {
  28.         BlockReference br = tr.GetObject(prRes.ObjectId, OpenMode.ForRead) as BlockReference;
  29.         try
  30.         {
  31.           ObjectIdCollection idCols = AssocAction.GetActionsDependentOnObject(br, false, true);
  32.           if (idCols.Count > 0)
  33.           {
  34.             foreach (ObjectId id in idCols)
  35.             {
  36.               ObjectId idAct = AssocAction.GetActionBody(id);
  37.               if (idAct.ObjectClass.Name == "AcDbCenterMarkActionBody")
  38.               {
  39.                 ed.WriteMessage("\nЭто CenterMark");
  40.                 break;
  41.               } else if (idAct.ObjectClass.Name == "AcDbCenterLineActionBody")  {
  42.                 ed.WriteMessage("\nЭто CenterLine");
  43.                 break;
  44.               }
  45.             }
  46.           }
  47.         } catch { };
  48.  
  49.         tr.Commit();
  50.       }
  51.  
  52.     }
  53.  
  54.   }
  55. }

В очередной раз благодари Madhukar Moogala. Он привёл код на ObjectARX, который удалось портировать в .NET
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Center mark и centerline
« Ответ #19 : 11-09-2018, 12:55:11 »
скорее  Huyau Liu.  код на .NET больше похож на апдейт с функцией getTypeOfSmartCenterObject... =о)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Center mark и centerline
« Ответ #20 : 11-09-2018, 13:05:32 »
скорее  Huyau Liu.
Нет. Вот исходник на ObjectARX:
Код - C++ [Выбрать]
  1. enum CenterType
  2. {
  3.   CenterMark = 0,
  4.   CenterLine
  5. };
  6. AcString SmartCenters[] = { L"CenterMark", L"CenterLine" };
  7.  
  8. Acad::ErrorStatus getTypeOfSmartCenterObject(const AcDbObjectId& blockRefObjId, CenterType& type)
  9. {
  10.   AcDbSmartObjectPointer pCenter(blockRefObjId, AcDb::kForRead, true);
  11.   if (pCenter.openStatus() != Acad::eOk)
  12.     return Acad::eNullEntityPointer;
  13.  
  14.   AcDbObjectIdArray actionIds;
  15.   Acad::ErrorStatus err = AcDbAssocAction::getActionsDependentOnObject(pCenter, false, true, actionIds);
  16.   if (!eOkVerify(err))
  17.     return err;
  18.  
  19.   for (int i = 0; i < actionIds.length(); i++)
  20.   {
  21.     AcDbObjectId actionBody = AcDbAssocAction::actionBody(actionIds[i]);
  22.     auto objClass = actionBody.objectClass();
  23.     AcString objClassName = objClass->name();
  24.  
  25.     if (objClassName == L"AcDbCenterMarkActionBody")
  26.     {
  27.       type = CenterType::CenterMark;
  28.       return Acad::eOk;
  29.     }
  30.     else if (objClassName == L"AcDbCenterLineActionBody")
  31.     {
  32.       type = CenterType::CenterLine;
  33.       return Acad::eOk;
  34.     }
  35.     else;
  36.   }
  37.  
  38.   return Acad::eNotApplicable;
  39.  
  40. }
  41.  
  42. void testIt()
  43. {
  44.  
  45.   ads_name ename;
  46.   ads_point pt;
  47.   AcDbObjectId objId = AcDbObjectId::kNull;
  48.   AcDbEntity* pEnt = nullptr;
  49.   if (RTNORM != acedEntSel(_T(""), ename, pt)) return;
  50.   if (!eOkVerify(acdbGetObjectId(objId, ename))) return;
  51.   if (!eOkVerify(acdbOpenAcDbEntity(pEnt, objId, AcDb::kForRead))) return;
  52.   //isCenterLineOrNot(pEnt);
  53.   CenterType type;
  54.   if (eOkVerify(getTypeOfSmartCenterObject(objId, type)))
  55.   {
  56.     acutPrintf(_T("CenterType : %s"), SmartCenters[type].kACharPtr());
  57.   }
  58.  
  59. }
  60.  
« Последнее редактирование: 11-09-2018, 14:09:53 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Center mark и centerline
« Ответ #21 : 11-09-2018, 14:07:26 »
скорее  Huyau Liu.  код на .NET больше похож на апдейт с функцией getTypeOfSmartCenterObject... =о)
Только сейчас увидел, что Madhukar Moogala обновил свою статью с дополнением от  Huyau Liu. Мне он о том от кого дополнение не написал. Короче говоря совместными усилиями этот вопрос закрыт.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Center mark и centerline
« Ответ #22 : 11-09-2018, 14:16:23 »
Всем спасибо! Вот это поддержка!
Переписал в виде хелпера:
Код - C# [Выбрать]
  1.     /// <summary>
  2.     /// Проверка, что блок является объектом CenterLine или CenterMark
  3.     /// </summary>
  4.     public static bool IsCenter(this BlockReference block)
  5.     {
  6.       if (block == null || block.IsErased) return false;
  7.       try
  8.       {
  9.         ObjectIdCollection idCols = AssocAction.GetActionsDependentOnObject(block, false, true);
  10.         if (idCols == null || idCols.Count == 0) return false;
  11.         foreach (ObjectId id in idCols)
  12.         {
  13.           ObjectId idAct = AssocAction.GetActionBody(id);
  14.           string name = idAct.ObjectClass.Name;
  15.           if (name == "AcDbCenterMarkActionBody" || name == "AcDbCenterLineActionBody")
  16.             return true;
  17.         }
  18.       }
  19.       catch { }
  20.       return false;
  21.     }

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Center mark и centerline
« Ответ #23 : 13-09-2018, 14:08:05 »
Ого, для меня целая "терра-инкогнита" открылась в AutoCAD API: AssocAction, AssocNetwork, AssocDependencies, AssocActionBody... Что это такое? Как это можно использовать? Что-то гугл никаких примеров не находит  :(
В справке, конечно, довольно обширное описание. Но без примера как-то сложно понять.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Center mark и centerline
« Ответ #24 : 13-09-2018, 14:15:30 »
Дмитрий Загорулькин,
Эти классы используются в Constraint API . Примеры и описание:
http://through-the-interface.typepad.com/through_the_interface/2011/08/a-simplified-net-api-for-accessing-autocad-parameters-and-constraints.html
http://adndevblog.typepad.com/autocad/2013/01/a-simplified-net-api-for-accessing-autocad-parameters-and-constraints.html
Полной обертки всех соответствующих классов для .NET нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение