Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Phil от 15-03-2018, 11:34:47

Название: Выбор сегментов полилинии
Отправлено: Phil от 15-03-2018, 11:34:47
Добрый день! Как можно подсветить подобъект составного объекта ? Интересует выбор сегмента полилинии. Приведенный ниже код не помог, поскольку полученный подобъект не находится в базе...

Код - 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
Название: Re: Выбор сегментов полилинии
Отправлено: avc от 15-03-2018, 11:54:30
Присоединяюсь к вопросу. Я ничего подобного в АПИ не нашел и изобретал свой велисипед с использованием Transient графики. Нарисовать/стереть кривую с помощью Transient элементарно и все работает. Но когда подобъекты из блоков подсветить пытаюсь Автокад фаталит. Было бы здорово, если что-то знает варианты без костылей и фаталов.
Транзитная графика обсуждалась тут http://adn-cis.org/forum/index.php?topic=2827.msg10199;topicseen#msg10199 (http://adn-cis.org/forum/index.php?topic=2827.msg10199;topicseen#msg10199)
Название: Re: Выбор сегментов полилинии
Отправлено: Александр Пекшев aka Modis от 15-03-2018, 12:24:51
Highlighting a polyline segment (http://adndevblog.typepad.com/autocad/2012/07/highlighting-a-polyline-segment.html)
Название: Re: Выбор сегментов полилинии
Отправлено: Phil от 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...
Название: Re: Выбор сегментов полилинии
Отправлено: Александр Пекшев aka Modis от 15-03-2018, 13:58:25
Попробуйте так:
Код - C# [Выбрать]
  1. peo.AddAllowedClass(typeof(Polyline2d), true);
  2. peo.AddAllowedClass(typeof(Polyline3d), true);
Название: Re: Выбор сегментов полилинии
Отправлено: Phil от 15-03-2018, 14:03:41
Попробуйте так:
Код - C# [Выбрать]
peo.AddAllowedClass(typeof(Polyline2d), true);
peo.AddAllowedClass(typeof(Polyline3d), true);

Это понятно, но после этого возникает ошибка "NotApplicable"
Название: Re: Выбор сегментов полилинии
Отправлено: Александр Пекшев aka Modis от 15-03-2018, 14:27:11
Это понятно, но после этого возникает ошибка "NotApplicable"
Сначала начал было ваш код тестить, а потом меня осенило - открыл автокад, создал обычную полилинию, зажал Ctrl, ткнул в сегмент - выбрался сегмент. Повторил с 3Д полилинией - ничего не выбирается. Значит ответ прост - автокад просто физически не делает того, что вы хотите =)
Название: Re: Выбор сегментов полилинии
Отправлено: avc от 15-03-2018, 14:33:37
...И подобъекты в блоке не выбирает и много еще чего. Так что метод крайне не универсальный. Возвращаемся к прорисовке новыми объектами поверх имеющихся?
Название: Re: Выбор сегментов полилинии
Отправлено: Александр Ривилис от 15-03-2018, 14:54:15
Возвращаемся к прорисовке новыми объектами поверх имеющихся?
Конечно. А как же иначе?
Название: Re: Выбор сегментов полилинии
Отправлено: Александр Ривилис от 15-03-2018, 14:57:39
Еще варианты для блока:
http://through-the-interface.typepad.com/through_the_interface/2006/12/highlighting_an.html
http://adndevblog.typepad.com/autocad/2013/11/drawableoverrule-to-highlight-entities-in-nested-block-references-and-xrefs.html
Название: Re: Выбор сегментов полилинии
Отправлено: Phil от 16-03-2018, 10:24:06
...И подобъекты в блоке не выбирает и много еще чего. Так что метод крайне не универсальный. Возвращаемся к прорисовке новыми объектами поверх имеющихся?
Можно какой-нибудь примерчик работающий, с использованием упомянутой выше Transient графики?
Название: Re: Выбор сегментов полилинии
Отправлено: Александр Ривилис от 18-03-2018, 01:15:27
Этот например: http://adn-cis.org/ispolzovanie-tranzitnoj-grafiki.html