Как получить набор координат из объекта polyline3d

Автор Тема: Как получить набор координат из объекта polyline3d  (Прочитано 10748 раз)

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

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Подскажите, как получить координаты X,Y, Z из Polyline3d.

Класс Polyline имеет функции: GetPoint3dAt и GetPoint2dAt,
а в классе Poliline3d нет таких функций?

Преобразовать polyline3d в polyline не получается

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Прям вот под рукой лежало  :D
Код - C# [Выбрать]
  1. public static Dictionary<int, Point3d> GetPlinePoints(ObjectId plineObjId, Transaction tr)
  2.         {
  3.             var dic = new Dictionary<int, Point3d>();
  4.  
  5.             var dbObj = tr.GetObject(plineObjId, OpenMode.ForRead);
  6.             var lwp = dbObj as Polyline; // If a "lightweight" (or optimized) polyline
  7.             if (lwp != null)
  8.             {
  9.                 var vn = lwp.NumberOfVertices;
  10.                 for (var i = 0; i < vn; i++)
  11.                 {
  12.                     dic.Add(i, lwp.GetPoint3dAt(i));
  13.                 }
  14.             }
  15.             else
  16.             {
  17.                 var p2D = dbObj as Polyline2d; // If an old-style, 2D polyline
  18.                 if (p2D != null)
  19.                 {
  20.                     var i = 0;
  21.                     // Use foreach to get each contained vertex
  22.                     foreach (ObjectId vId in p2D)
  23.                     {
  24.                         var v2D = (Vertex2d)tr.GetObject(vId, OpenMode.ForRead);
  25.                         dic.Add(i, v2D.Position);
  26.                         i++;
  27.                     }
  28.                 }
  29.                 else
  30.                 {
  31.                     var p3D = dbObj as Polyline3d;// If an old-style, 3D polyline
  32.                     if (p3D != null)
  33.                     {
  34.                         var i = 0;
  35.                         // Use foreach to get each contained vertex
  36.                         foreach (ObjectId vId in p3D)
  37.                         {
  38.                             var v3D = (PolylineVertex3d)tr.GetObject(vId, OpenMode.ForRead);
  39.                             dic.Add(i, v3D.Position);
  40.                             i++;
  41.                         }
  42.                     }
  43.                     else dic = null;
  44.                 }
  45.             }
  46.             return dic;
  47.         }

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Спасибо, попробую.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Выделил оффтоп в отдельную тему: http://adn-cis.org/forum/index.php?topic=3236.0
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Прям вот под рукой лежало  :D
Не проверять корректность параметров - плохая привычка.
Код - C# [Выбрать]
  1. Dictionary<int, Point3d> dict = GetPlinePoints(ObjectId.Null, null);

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Андрей Бушман, если честно - это даже не рабочий код. Я его не использую и давно удалил. Просто прикинул его когда осваивал различия между видами полилиний))

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Я его не использую и давно удалил.
Так удалил, что он даже "под рукой лежал"? ;)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Еще один вариант универсального решения (для Polyline, Polyline2d, Polyline3d), основанный на особенности параметризации кривой (Curve) в случае полилиний:

Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6. using Autodesk.AutoCAD.Geometry;
  7. using Autodesk.AutoCAD.EditorInput;
  8.  
  9. [assembly: CommandClass(typeof(GetVerts.PlineUtils))]
  10.  
  11. namespace GetVerts
  12. {
  13.   public class PlineUtils
  14.   {
  15.     public static Dictionary<int, Point3d> GetPlinePoints(ObjectId id)
  16.     {
  17.       Dictionary<int, Point3d> dic = new Dictionary<int, Point3d>();
  18.       using (Curve cv = id.Open(OpenMode.ForRead, true) as Curve) {
  19.         if (cv == null || (!(cv is Polyline) && !(cv is Polyline2d) && !(cv is Polyline3d)))
  20.           throw new Autodesk.AutoCAD.Runtime.Exception(ErrorStatus.NotThatKindOfClass);
  21.  
  22.         int startParam = Convert.ToInt32(cv.StartParam);
  23.         int endParam = Convert.ToInt32(cv.EndParam - (cv.Closed ? 1.0 : 0.0));
  24.         for (int i = startParam; i <= endParam; i++) {
  25.           dic.Add(i, cv.GetPointAtParameter(i));
  26.         }
  27.       }
  28.       return dic;
  29.     }
  30.  
  31.     // Для тестирования
  32.     [CommandMethod("TestPoly", CommandFlags.Modal)]
  33.     public void TestPoly()
  34.     {
  35.       Document doc = Application.DocumentManager.MdiActiveDocument;
  36.       if (doc == null) return;
  37.       Editor ed = doc.Editor;
  38.       PromptEntityOptions pr = new PromptEntityOptions("\nВыберите полилинию");
  39.       pr.SetRejectMessage("Это не полилиния");
  40.       pr.AddAllowedClass(typeof(Polyline), false);
  41.       pr.AddAllowedClass(typeof(Polyline2d), false);
  42.       pr.AddAllowedClass(typeof(Polyline3d), false);
  43.       PromptEntityResult rs = ed.GetEntity(pr);
  44.       if (rs.Status == PromptStatus.OK) {
  45.         try {
  46.           Dictionary<int, Point3d> dic = GetPlinePoints(rs.ObjectId);
  47.           foreach (KeyValuePair<int, Point3d> el in dic) {
  48.             ed.WriteMessage("\nVert:{0} ({1})", el.Key, el.Value);
  49.           }
  50.         }
  51.         catch (System.Exception ex){
  52.           ed.WriteMessage("{0}", ex);
  53.         }
  54.       }
  55.     }
  56.   }
  57. }
« Последнее редактирование: 03-12-2015, 00:03:53 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение