Выбор сегментов полилинии

Автор Тема: Выбор сегментов полилинии  (Прочитано 3916 раз)

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

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

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Добрый день! Как можно подсветить подобъект составного объекта ? Интересует выбор сегмента полилинии. Приведенный ниже код не помог, поскольку полученный подобъект не находится в базе...

Код - vb.net [Выбрать]
  1.     <CommandMethod("Test1", CommandFlags.Modal)>
  2.     Public Sub Test1()
  3.  
  4.         '' Запрос текущего документа, редактора и базы данных
  5.         Dim acDocument = Core.Application.DocumentManager.MdiActiveDocument
  6.         Dim acEditor = acDocument.Editor
  7.         Dim acDatabase = acDocument.Database
  8.  
  9.         '' Запрос объекта
  10.         Dim prmtSelectOpts = New PromptSelectionOptions()
  11.         prmtSelectOpts.MessageForAdding = vbCrLf & "Выберите отрезок или полилинию : "
  12.         prmtSelectOpts.SingleOnly = True
  13.         prmtSelectOpts.SinglePickInSpace = True
  14.         prmtSelectOpts.ForceSubSelections = True '' Выбор только подобъектов объектов
  15.  
  16.         Dim prmtSelectResult As PromptSelectionResult = acEditor.GetSelection(prmtSelectOpts)
  17.         If (prmtSelectResult.Status <> PromptStatus.OK) Then Return
  18.  
  19.         Dim acSelectSet As SelectionSet = prmtSelectResult.Value
  20.         Dim acSelectObj As SelectedObject = acSelectSet(0)
  21.  
  22.         Dim acValidTypes() As Type = {GetType(Line), GetType(Polyline), GetType(Polyline2d), GetType(Polyline3d)}
  23.         Dim acValidType = CheckType(acSelectObj.ObjectId, acValidTypes)
  24.         If Not acValidType Then
  25.             acEditor.WriteMessage("Выбран объект неверного типа...")
  26.             Return
  27.         End If
  28.  
  29.         '' Выполняем доступ к объекту по его ObjectId
  30.         Using acTransaction As Transaction = acDatabase.TransactionManager.StartTransaction()
  31.             Dim acCurve As Curve = acTransaction.GetObject(acSelectObj.ObjectId, OpenMode.ForWrite)
  32.             Dim acSelSubObj As SelectedSubObject() = acSelectObj.GetSubentities()
  33.  
  34.             Dim acSubObjType = acSelSubObj(0).FullSubentityPath.SubentId.Type
  35.             Dim acValidLine = acSubObjType = SubentityType.Edge
  36.             If Not acValidLine Then
  37.                 acEditor.WriteMessage("Неправильный тип подобъекта: " & acSubObjType.ToString() & ", повторите снова...")
  38.                 Return
  39.             End If
  40.  
  41.             Dim acSubEntityId As SubentityId = acSelSubObj(0).FullSubentityPath.SubentId
  42.  
  43.             '' Создаём путь к подобъекту для использования в GetSubentity
  44.             Dim subEntityPath As FullSubentityPath = New FullSubentityPath(New ObjectId() {acCurve.ObjectId}, acSubEntityId)
  45.  
  46.             Dim asSubEntity As Entity = acCurve.GetSubentity(subEntityPath)
  47.             acEditor.WriteMessage("Тип подобъекта : " & asSubEntity.ToString())
  48.  
  49.             '' ????????????????????????????
  50.             asSubEntity.Highlight()
  51.             '' ????????????????????????????
  52.  
  53.             acTransaction.Commit()
  54.         End Using
  55.     End Sub
  56.  
  57.     Private Function CheckType(ObjId As ObjectId,
  58.                                acTypes() As Type) As Boolean
  59.         Dim acResult As Boolean = False
  60.         For Each acType In acTypes
  61.             acResult = ObjId.ObjectClass.IsDerivedFrom(RXClass.GetClass(acType))
  62.             If acResult Then Exit For
  63.         Next
  64.         Return acResult
  65.     End Function

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Выбор сегментов полилинии
« Ответ #1 : 15-03-2018, 11:54:30 »
Присоединяюсь к вопросу. Я ничего подобного в АПИ не нашел и изобретал свой велисипед с использованием Transient графики. Нарисовать/стереть кривую с помощью Transient элементарно и все работает. Но когда подобъекты из блоков подсветить пытаюсь Автокад фаталит. Было бы здорово, если что-то знает варианты без костылей и фаталов.
Транзитная графика обсуждалась тут http://adn-cis.org/forum/index.php?topic=2827.msg10199;topicseen#msg10199

Отмечено как Решение Phil 15-03-2018, 14:26:55

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus

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

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Re: Выбор сегментов полилинии
« Ответ #3 : 15-03-2018, 13:45:32 »
Думаю, приведенный пример был бы удобнее без необходимости указывать номер сегмента:
Код - C# [Выбрать]
  1.         [CommandMethod("HighlightPolySeg")]
  2.         public static void HighlightPolySeg()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Editor ed = doc.Editor;
  7.  
  8.             //Ask user to select polyline
  9.             PromptEntityOptions peo = new PromptEntityOptions("\nSelect a polyline: ");
  10.             peo.SetRejectMessage("\nMust be a polyline...");
  11.             peo.AddAllowedClass(typeof(Polyline), true);
  12.             PromptEntityResult per = ed.GetEntity(peo);
  13.             if (per.Status != PromptStatus.OK) return;
  14.  
  15.             ObjectId cid = per.ObjectId;
  16.             Point3d pp = per.PickedPoint;
  17.  
  18.             using (Transaction Tx = db.TransactionManager.StartTransaction())
  19.             {
  20.                 Curve curve = Tx.GetObject(cid, OpenMode.ForRead) as Curve;
  21.                 Point3d cp = curve.GetClosestPointTo(pp, false);
  22.                 double acParam = curve.GetParameterAtPoint(cp);
  23.                 int sid = Convert.ToInt32(Math.Truncate(acParam) + 1);
  24.  
  25.                 //Define subentpath for segment
  26.                 FullSubentityPath path = new FullSubentityPath(new ObjectId[] { curve.Id }, new SubentityId(SubentityType.Edge, new IntPtr(sid)));
  27.  
  28.                 //Highlight segment
  29.                 curve.Highlight(path, true);
  30.             }
  31.         }
  32.     }

Только вот почему этот код не прокатывает с Polyline3d ? Ведь это родственные классы через предка Curve? и используемые методы - только от Curve...
« Последнее редактирование: 16-03-2018, 10:22:18 от Phil »

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Выбор сегментов полилинии
« Ответ #4 : 15-03-2018, 13:58:25 »
Попробуйте так:
Код - C# [Выбрать]
  1. peo.AddAllowedClass(typeof(Polyline2d), true);
  2. peo.AddAllowedClass(typeof(Polyline3d), true);

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

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Re: Выбор сегментов полилинии
« Ответ #5 : 15-03-2018, 14:03:41 »
Попробуйте так:
Код - C# [Выбрать]
peo.AddAllowedClass(typeof(Polyline2d), true);
peo.AddAllowedClass(typeof(Polyline3d), true);

Это понятно, но после этого возникает ошибка "NotApplicable"

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Выбор сегментов полилинии
« Ответ #6 : 15-03-2018, 14:27:11 »
Это понятно, но после этого возникает ошибка "NotApplicable"
Сначала начал было ваш код тестить, а потом меня осенило - открыл автокад, создал обычную полилинию, зажал Ctrl, ткнул в сегмент - выбрался сегмент. Повторил с 3Д полилинией - ничего не выбирается. Значит ответ прост - автокад просто физически не делает того, что вы хотите =)

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Выбор сегментов полилинии
« Ответ #7 : 15-03-2018, 14:33:37 »
...И подобъекты в блоке не выбирает и много еще чего. Так что метод крайне не универсальный. Возвращаемся к прорисовке новыми объектами поверх имеющихся?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выбор сегментов полилинии
« Ответ #8 : 15-03-2018, 14:54:15 »
Возвращаемся к прорисовке новыми объектами поверх имеющихся?
Конечно. А как же иначе?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Re: Выбор сегментов полилинии
« Ответ #10 : 16-03-2018, 10:24:06 »
...И подобъекты в блоке не выбирает и много еще чего. Так что метод крайне не универсальный. Возвращаемся к прорисовке новыми объектами поверх имеющихся?
Можно какой-нибудь примерчик работающий, с использованием упомянутой выше Transient графики?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выбор сегментов полилинии
« Ответ #11 : 18-03-2018, 01:15:27 »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение