Получение геометрических точек трассы в плане и профиле

Автор Тема: Получение геометрических точек трассы в плане и профиле  (Прочитано 16510 раз)

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

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Здравствуйте.
по следам этой темы: https://adn-cis.org/forum/index.php?topic=1705.msg6332#msg6332
Работаю в CIV3D 2022 с трассой ж.д., решил написать код в скрипте Python в Dynamo, задача такая: необходимо получить геометрические точки трассы в плане и профиле, нашёл способ как это сделать, в документации к CIV3D 2022 есть вот это: https://help.autodesk.com/view/CIV3D/2022/ENU/?guid=f749f05f-cda4-c1f1-ce11-c2ab30092f92
, но работает это свойство пикетов трассы как-то странно, на этой странице гайда: https://help.autodesk.com/view/CIV3D/2022/ENU/?guid=037d0484-72fd-d894-dcbd-27a506d88880
, показано что с помощью этого свойства должны выдаваться все точки геометрии, и плана и профиля, однако, у меня так не вышло, подскажите может кто-то сталкивался с такой проблемой и как её решили?

Вот сам код, он еще в работе, так что сильно не ругайте :)

Код - Python [Выбрать]
  1. # Load the Python Standard and DesignScript Libraries
  2. import sys
  3. import clr
  4.  
  5. # Add Assemblies for AutoCAD and Civil3D
  6. clr.AddReference("AcMgd")
  7. clr.AddReference("AcCoreMgd")
  8. clr.AddReference("AcDbMgd")
  9. clr.AddReference("AecBaseMgd")
  10. clr.AddReference("AecPropDataMgd")
  11. clr.AddReference("AeccDbMgd")
  12.  
  13. # Import references from AutoCAD
  14. from Autodesk.AutoCAD.Runtime import *
  15. from Autodesk.AutoCAD.ApplicationServices import *
  16. from Autodesk.AutoCAD.EditorInput import *
  17. from Autodesk.AutoCAD.DatabaseServices import *
  18. # from Autodesk.AutoCAD.Geometry import *
  19. # from Autodesk.Civil import *
  20.  
  21. # Import references from Civil3D
  22. from Autodesk.Civil.ApplicationServices import *
  23. from Autodesk.Civil.DatabaseServices import *
  24.  
  25. from Autodesk.Civil.DatabaseServices import AlignmentGeometryPointStationType
  26.  
  27. # The inputs to this node will be stored as a list in the IN variables.
  28. dataEnteringNode = IN
  29.  
  30. adoc = Application.DocumentManager.MdiActiveDocument
  31. editor = adoc.Editor
  32. A = IN[0]
  33. ListPK = IN[1]
  34. with adoc.LockDocument():
  35.     with adoc.Database as db:
  36.  
  37.         with db.TransactionManager.StartTransaction() as t:
  38.             # Place your code below
  39.            
  40.             # GeometryPointSelector.SelectAll
  41.            
  42.             align = A.InternalDBObject
  43.             # Station = []
  44.             # Vse to4ki geometrii
  45.             statAll = align.GetStationSet(StationTypes.All)
  46.             # Точки геометрии
  47.             statGeom = align.GetStationSet(StationTypes.GeometryPoint)
  48.             # Точки основных пикетов - da tex 4to idut u menia kazdyje 100m dopustim
  49.             statMajo = align.GetStationSet(StationTypes.Major)
  50.             # Точки чего? eto Station Equation, nepravelnyje pikety, t.e. pikety sdvinutyje ot pravlenyx (kotoryje kazdyje 100m). iz Civil dostupny po Alignment Priperties->station control.
  51.             statEqua = align.GetStationSet(StationTypes.Equation)
  52.             # Вывод данных о точках геометрии
  53.             statSupTrPo = align.GetStationSet(StationTypes.OffsetTargetCurveOnly)
  54.            
  55.             st_All = []
  56.             st_All1 = []
  57.             st_Geom = []
  58.             st_Geom1 = []
  59.             st_Mj0 = []
  60.             st_Mj = []
  61.             st_Mj1 = []
  62.             st_Eq = []
  63.             st_STP0 = []
  64.             st_STP1 = []
  65.             st_All.append("ПК ВСЕХ\nточек геометрии")
  66.             st_All1.append("Названия ВСЕХ\nточек геометрии")
  67.             st_Geom.append("ПК точек\nгоризонтальной геометрии")
  68.             st_Geom1.append("Названия точек\nгоризонтальной геометрии")
  69.             st_Eq.append("Неправильные\nПК")
  70.             st_Mj1.append("Названия основных ПК")
  71.             st_Mj0.append("основные ПК")
  72.             st_STP0.append("Station.RawStation")
  73.             st_STP1.append("Station.StationType")
  74.             for Station in statAll:
  75.                 st_All.append(Station.RawStation)
  76.                 st_All1.append(Station.StationType)
  77.             for Station in statGeom:
  78.                 st_Geom.append(Station.RawStation)
  79.                 st_Geom1.append(Station.StationType)
  80.             for Station in statMajo:
  81.                 st_Mj0.append(Station.RawStation)
  82.                 st_Mj1.append(Station.StationType)
  83.             for Station in statEqua:
  84.                 st_Eq.append(Station.RawStation)
  85.             for Station in statSupTrPo:
  86.                 st_STP0.append(Station.RawStation)
  87.                 st_STP1.append(Station.StationType)
  88.             x = 0
  89.             st_Geom_2 = []
  90.             st_Geom_2.append(("Enumeration ВСЕХ\nточек геометрии"))
  91.             # while len(statAll) > x:
  92.             #     st_Geom_2.append(statAll[x].GeometryStationType)
  93.             #     x += 1
  94.  
  95.             # for Station in statSupTrPo:
  96.             #     st_Geom_2.append(Station.GeometryStationType)
  97.            
  98.             for Station in statAll:
  99.                 st_Geom_2.append(Station.GeometryStationType)
  100.            
  101.             # oProfile = t.GetObject(align.GetProfileIds()[0], OpenMode.ForRead)
  102.            
  103.             t.Commit()
  104.             pass
  105.  
  106. # Assign your output to the OUT variable.
  107. OUT = st_All, st_All1, st_Geom_2
  108. # OUT = oProfile.GetType(), dir(oProfile)



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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
на этой странице гайда: https://help.autodesk.com/view/CIV3D/2022/ENU/?guid=037d0484-72fd-d894-dcbd-27a506d88880
, показано что с помощью этого свойства должны выдаваться все точки геометрии, и плана и профиля
Где об этом сказано? Это вообще-то не свойство, а перечисление.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Прошу прощения, я неверно выразился, я так понимаю, что свойство "GeometryStationType Property" должно выдавать результат как "
Код - C# [Выбрать]
  1. C#
  2.  
  3. public AlignmentGeometryPointStationType GeometryStationType { get; set; }
", или я ошибаюсь?

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Прошу прощения, я неверно выразился, я так понимаю, что свойство "GeometryStationType Property" должно выдавать результат как "
Код - C# [Выбрать]
  1. C#
  2.  
  3. public AlignmentGeometryPointStationType GeometryStationType { get; set; }
", или я ошибаюсь?
Да. Свойство GeometryStationType, а результат - перечисление AlignmentGeometryPointStationType
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
необходимо получить геометрические точки трассы в плане и профиле
Добрый день! Сперва надо определиться, что значит "геометрические точки трассы в профиле"? Трасса - абсолютно плоский объект, всегда лежит в плоскости XY. У неё нет отметок в профиле. Точнее - они всегда 0.
Чтобы найти геометрические точки трассы в плане, я пользовался таким способом:
Код - C# [Выбрать]
  1.         /// <summary>
  2.         /// Gets the geometry points of the alignment
  3.         /// </summary>      
  4.         /// <returns>List of points</returns>
  5.         public IList<Point> GetPoints()
  6.         {
  7.             List<Point> ret = new List<Point>();
  8.             C3dDb.Station[] stationSet = AeccAlignment
  9.                 .GetStationSet(C3dDb.StationTypes.GeometryPoint);
  10.             foreach (C3dDb.Station data in stationSet)
  11.             {
  12.                 Point point = Point.ByCoordinates
  13.                     (data.Location.X, data.Location.Y);
  14.                 ret.Add(point);
  15.             }
  16.             return ret;
  17.        
Полностью класс можно глянуть тут: https://github.com/zagor-dmtr/IterisCivilDynamo/blob/master/IterisCivilDynamo/Alignments/Alignment.cs

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Да. Свойство GeometryStationType, а результат - перечисление AlignmentGeometryPointStationType
Так вот в перечислении AlignmentGeometryPointStationType должны присутствовать, судя по странице гайда https://help.autodesk.com/view/CIV3D/2022/ENU/?guid=037d0484-72fd-d894-dcbd-27a506d88880 и данные геометрии профиля, профиль FG для рассматриваемой трассы построен.
Добрый день! Сперва надо определиться, что значит "геометрические точки трассы в профиле"? Трасса - абсолютно плоский объект, всегда лежит в плоскости XY. У неё нет отметок в профиле. Точнее - они всегда 0.
Чтобы найти геометрические точки трассы в плане, я пользовался таким способом:
Все верно Дмитрий, я тоже получал точки этим способом, но это точки чисто по геометрии плана трассы, а мне требуются точки геометрии профиля, и они вроде должны быть, но их нет.
Вывод результатов в Excel производил нодами Dynamo.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Так значения для профилей этого перечисления скорее всего используются где-то в методах для профилей, а к трассе не применяются. Поэтому, когда к трассе примените его значения для профиля, получите либо ничего, либо что-то невнятное.
Просто сами подумайте - по трассе может быть построено множество профилей. Причём, у профилей в одной и той же точке могут быть разные отметки. Как вы получите набор точек, если не укажете по какому профилю их брать?
А профиль - это уже отдельный объект. Да, он связан с трассой, но всё равно - отдельный. Надо у трассы брать коллекцию её профилей, из этой коллекции извлекать нужный профиль (если он там один - то первый попавшийся). И уже по этому профилю получать точки.
Это требуется, я правильно понял?

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Дмитрий Загорулькин, Wart,
Думаю, что это универсальное перечисление, которое может использоваться в методах как для трасы, так и для профиля. Метод использования для трассы я вижу (свойство GeometryStationType), а вот для профиля ничего подобного не нашел. Возможно они не публичные или вообще не реализованы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Возможно они не публичные или вообще не реализованы.
Скорее всего, второе. Я тоже не нашёл )

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Так это перечисление скорее всего используется где-то в методах для профилей, а к трассе не применяется.
Не согласен, если посмотреть "Member name" для "AlignmentGeometryPointStationType Enumeration", то будет видно что свойство "GeometryStationType Property " должно собирать все характерные точки с плана и профиля, плюс возвышение рельсов.
Как вы получите набор точек, если не укажете по какому профилю их брать?
Вот здесь я думаю, что на трассу создается один единственный профиль(в окончательном варианте к выдаче документации),
А профиль - это уже отдельный объект.
да, это я знаю,
Просто сами подумайте - по трассе может быть построено множество профилей.
но для моих задач используется одна трасса-один профиль.
В линейном проектировании, ну по крайней мере у нас, используется именно такой принцип, одна трасса-один профиль, если профиль другой, то это уже другая трасса.
Надо у трассы брать коллекцию её профилей, из этой коллекции извлекать нужный профиль (если он там один - то первый попавшийся). И уже по этому профилю получать точки.
Это требуется, я правильно понял?
Вот я и думаю, может я не правильно что то делаю? Может как то по другому нужно покрутить методы и свойства трассы(пикетажа), или профиля?
Возможно они не публичные или вообще не реализованы.
Ну как так то??? :o не может быть :-[

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Ну как так то??? :o не может быть :-[
Очень может быть.
Не согласен, если посмотреть "Member name" для "AlignmentGeometryPointStationType Enumeration", то будет видно что свойство "GeometryStationType Property " должно собирать все характерные точки с плана и профиля, плюс возвышение рельсов.
Никому и ничего оно не должно.
Вот здесь я думаю, что на трассу создается один единственный профиль(в окончательном варианте к выдаче документации),
Это вы так думаете. А Civil 3D думает иначе.
но для моих задач используется одна трасса-один профиль.
В линейном проектировании, ну по крайней мере у нас, используется именно такой принцип, одна трасса-один профиль, если профиль другой, то это уже другая трасса.
Как это может быть связано с тем, что для одной трассы в Civil 3D может быть несколько профилей?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Как это может быть связано с тем, что для одной трассы в Civil 3D может быть несколько профилей?
Александр, я с вами полностью согласен, в Civil 3D возможно построение нескольких профилей на трассу, но вот это мне не понятно:
Никому и ничего оно не должно.
, ведь если оно есть в документации, и оно даже частично работает(результат на скрине в первом сообщении), то может быть можно как то его вытащить, может это я что то не так делаю?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Да скорее всего, всё правильно делаете. Но проблема может быть в самой реализации API. Насколько я помню, мне тоже не удалось найти какое-то практическое применение этому методу получения пикетов по трассе. То он выдавал не то что надо, то совсем не выдавал. Я попробую покопаться в своих старых кодах, может что-то найду по этому вопросу.
Если бы мне надо было получить точки вертикальной геометрии по одному-единственному профилю, то я бы получил его через GetProfileIds, взял бы из этой коллекции первый Id, открыл бы его как Profile и уже там искал бы нужные точки.

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

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

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Wart,
Кстати, обрати внимание, что в той колонке, где у тебя должны быть только значения из перечисления AlignmentGeometryPointStationType, есть числа, которые не присутствуют в этом перечислении.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение