Center mark и centerline

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

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

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

  • 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 видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение