Главная › Форум › Средства разработки Топоматик Robur › Пользовательские скрипты
- В этой теме 8 ответов, 2 участника, последнее обновление 1 год, 7 месяцев назад сделано Пивен Евгений.
-
АвторСообщения
-
03.04.2023 в 15:09 #5741Пивен ЕвгенийУчастник
Здравствуйте. Доделываю скрипт для построения жёсткой поперечины или гибкого мостика для контактной сети. Изначально скрипт опирается на любой линейный объект и далее строит контактную сеть над всеми линейными объектами которые пересекает структурная линия между опорами, узлы строятся на структурной линии между опорами. Мне необходимо выбирать не любой линейный объект, а структурная линия проходящую по оси пути и опирающаяся на отметки головок рельса. А узлы на пересечении осей путей и ригеля мне необходимы по оси пути, а не на ригеле как в оригинале. Т.е. УЗ контактной сети (двойная стрелочка), должна быть привязана к отметке головки рельса, чтобы в последствии к точечному условному знаку контактной сети прицепить изолятор, для визуализации при использовании технологии информационного моделирования.
Запрос на структурную линию был переписан, сейчас запрашивается и выбирается именно структурная линия, а не любой линейный объект, все элементы строятся, но не получается вставить узлы в структурные по оси пути с отметками ГР, и в последствии получить интерполированные отметки этих узлов между соседними вершинами.
Координаты точки узла spt получаю вывожу на экран print(spt) вижу их, далее pindex1 = Topomatic.Sfc.PointEditor(surface).Add(spt) #Получаю индекс и строю точку в узле, на которую сажу точечный условный знак, а при вставке узла структурной линии на точку node = Topomatic.Sfc.StructureLineNode(pindex1, 0) #Узел не вставляется пишет TypeError: expected BugleVector3D, got StructureLineNode, хотя вроде бы делаю по аналогии с вставкой узла на линию между опорами.
Может кто-нибудь сможет подсказать что я делаю не так, как поступить в данной ситуации.@cmd(«dgt_flexible_crossbar_5»)
def act_dgt_flexible_crossbar_5(self, args):
#Гибкая поперечина контактной сети
cadview = self.CadView
actSfcLayer = SurfaceLayer.GetSurfaceLayer(cadview)
if (actSfcLayer == None):
Topomatic.Controls.Dialogs.MessageDlg.Show(‘Активная ЦММ не найдена’, System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Warning)
print ‘Активная ЦММ не найдена’
pline = actSfcLayer.SelectStructureLines(None, «Выберите структурные линии:»)
if (pline == None):
return
layer = self.ActiveSurfaceLayer
surface = self.ActiveSurface
plines = []
for item in cadview.SelectionSet:
pline = Polyline3D()
item.GetPolyline(pline)
plines.append(pline)
cadview.SelectionSet.Clear()
if (len(plines) == 0):
return
while (True):
result = False
UpdateLoop.BeginTransaction(actSfcLayer)
try:
index1 = self.select_console_point_5(actSfcLayer, layer, ‘Укажите первую опору’)
if (index1 < 0):
return
pt1 = actSfcLayer.Surface.Points[index1]
index2 = self.select_console_point_5(actSfcLayer, layer, ‘Укажите вторую опору’)
if (index2 < 0):
return
pt2 = actSfcLayer.Surface.Points[index2]
intersections = []
for pline in plines:
for pt in Topomatic.Cad.Foundation.PolylineExtentions.GetIntersections(pline, pt1.Vertex.Pos, pt2.Vertex.Pos):
station = clr.Reference[System.Double]()
offset = clr.Reference[System.Double]()
if (Topomatic.Cad.Foundation.PolylineExtentions.PosToStaOffset(pline, pt, station, offset)):
a = Topomatic.Cad.Foundation.PolylineExtentions.StaOffsetToPos(pline, station.Value, 0)
b = Topomatic.Cad.Foundation.PolylineExtentions.StaOffsetToPos(pline, station.Value + 0.1, 0)
angle = (b — a).Angle
l = (pt2.Vertex.Pos — pt1.Vertex.Pos).Length
spt = Topomatic.Sfc.SurfacePoint(Vector3D(pt, Topomatic.Cad.Foundation.MathHelper.Lerp(pt1.Vertex.Z, pt2.Vertex.Z, (pt — pt1.Vertex.Pos).Length / l)))#Получаю координаты точки узла
spt.IsDynamic = True
spt.IsSituation = True
spt.IsLocked = True
print(«spt:»)
print(spt)
actSfcLayer.Surface.Points.GetExtensiveInformation(index1).Rotation = angle
actSfcLayer.Surface.Points.GetExtensiveInformation(index2).Rotation = angle
pindex1 = Topomatic.Sfc.PointEditor(surface).Add(spt) #Получаю точку узла и ёё индекс
print(«pindex1:»)
print(pindex1)
actSfcLayer.Surface.Points.GetExtensiveInformation(pindex1).Rotation = angle
# pindex2 = Topomatic.Sfc.PointEditor(surface).Add(spt)
# surface.Points.GetExtensiveInformation(pindex2).Rotation = angle + System.Math.PI
node = Topomatic.Sfc.StructureLineNode(pindex1, 0) #Узел не вставляется пишет TypeError: expected BugleVector3D, got StructureLineNode
pline.Add(node)
self.ActiveSurfaceLayer.SelectionSet.SelectPoint(index1, True)
Topomatic.ApplicationPlatform.ApplicationHost.Current.Plugins.Execute(«insert_point_sign», System.Array[System.Object]([«87ba179f-4285-4b84-89a0-cdf4a06cc102»]))
cadview.SelectionSet.Clear()
self.ActiveSurfaceLayer.SelectionSet.SelectPoint(index2, True)
Topomatic.ApplicationPlatform.ApplicationHost.Current.Plugins.Execute(«insert_point_sign», System.Array[System.Object]([«87ba179f-4285-4b84-89a0-cdf4a06cc102»]))
cadview.SelectionSet.Clear()
self.ActiveSurfaceLayer.SelectionSet.SelectPoint(pindex1, True)
Topomatic.ApplicationPlatform.ApplicationHost.Current.Plugins.Execute(«insert_point_sign», System.Array[System.Object]([«c626cdd3-8e25-48e7-81db-4ad253271a53»]))
cadview.SelectionSet.Clear()
# self.ActiveSurfaceLayer.SelectionSet.SelectPoint(pindex2, True)
# Topomatic.ApplicationPlatform.ApplicationHost.Current.Plugins.Execute(«insert_point_sign», System.Array[System.Object]([«ce21650a-0416-42e8-ac51-86c8e18db94a»]))
# cadview.SelectionSet.Clear()
# intersections.append((pt, pindex1))
# intersections = sorted(intersections, key=lambda cpt: (cpt[0] — pt1.Vertex.Pos).Length
line = Topomatic.Sfc.StructureLine()
line.IsSituation = True
node = Topomatic.Sfc.StructureLineNode(index1, 0)
line.Add(node)
# for pt in intersections:
# node = Topomatic.Sfc.StructureLineNode(pt[1], 0)
# line.Add(node)
# node = Topomatic.Sfc.StructureLineNode(pt[2], 0)
# line.Add(node)
node = Topomatic.Sfc.StructureLineNode(index2, 0)
line.Add(node)
surface.StructureLines.Add(line)
self.ActiveSurfaceLayer.SelectionSet.SelectStructureLine(surface.StructureLines.Count — 1, True)
Topomatic.ApplicationPlatform.ApplicationHost.Current.Plugins.Execute(«insert_linear_sign», System.Array[System.Object]([«e2942d6f-a84e-43cf-aee0-ac38e5e81d1b»]))
cadview.SelectionSet.Clear()
result = True
finally:
if (result):
UpdateLoop.Commit(actSfcLayer)
else:
UpdateLoop.Rollback(actSfcLayer)
cadview.Unlock()
cadview.Invalidate()
Спасибо.Вложения:
Вы должны войти для просмотра вложений.04.04.2023 в 06:57 #5743Пивен ЕвгенийУчастник1
- Ответ изменён 1 год, 7 месяцев назад пользователем Пивен Евгений.
- Ответ изменён 1 год, 7 месяцев назад пользователем Пивен Евгений.
- Ответ изменён 1 год, 7 месяцев назад пользователем Пивен Евгений.
04.04.2023 в 07:14 #5747Пивен ЕвгенийУчастникДополнительно к предыдущему сообщению прикрепляю текстовый файл с кодом, так как вышеизложенный не читаемый, как в текстовое поле форума вставлять код в рамке для нормального чтения я не знаю, кто знает подскажите.
Вложения:
Вы должны войти для просмотра вложений.04.04.2023 в 07:42 #5749Пивен ЕвгенийУчастникКогда я делаю запрос на структурные линии через инструмент слоя
pline = surface_layer.SelectStructureLines(None, «Выберите структурные линии:»)
print(«pline:»)
print(pline)
Тогда при распечатке вижу «Accept» и узлы при этом запросе не вставляются.
Когда же в качестве эксперимента меняю запрос на выбор одной структурной линии
line = surface_layer.PeakOneStructureLine(lambda index: surface.StructureLines[index], «Укажите линию канализации»)
print(«line:»)
print(line)
Распечатываю результат и вижу нормальный результат по этой линии «<Topomatic.Sfc.StructureLine object at 0x000000000000002B [Topomatic.Sfc.StructureLine]> »
И в неё узел вставляется.
Поэтому уточняю вопрос. Подскажите как правильно сформировать запрос на выбор нескольких структурных линий???
Ниже прикреплю текстовый файл с рабочим кодом.
Заранее спасибо.Вложения:
Вы должны войти для просмотра вложений.05.04.2023 в 13:51 #5764Новаторов ВладимирХранительЗдравствуйте.
Когда я делаю запрос на структурные линии…
Сначала получаем структурную линию:
pline = actSfcLayer.SelectStructureLines(None, «Выберите структурные линии:»)
if (pline == None):
returnСейчас в pline находится структурная линия
А дальше через несколько строк, pline переопределяется и становится структурной линией. Питон не строго типизирован
и позволяет делать такие вещи без предупреждения.plines = []
for item in cadview.SelectionSet:
pline = Polyline3D()Теперь pline полилиния и вставить туда узел структурной линии нельзя
06.04.2023 в 02:05 #5767Пивен ЕвгенийУчастникЗдравствуйте. Я предполагал что проблема в этом.
Данную часть кода я оставил чтобы войти в цикл
for pline in plines:
Подскажите пожалуйста как поступить в данной ситуации, работая со структурными линиями, всё таки пройти этот цикл и на что поменять элемент «PolylineExtentions» в выражении «for pt in Topomatic.Cad.Foundation.PolylineExtentions.GetIntersections(pline, pt1.Vertex.Pos, pt2.Vertex.Pos):»
Для наглядности прикреплю к письму данный код с комментариями.
Спасибо.06.04.2023 в 02:06 #5768Пивен ЕвгенийУчастникПрикреплённый код
- Ответ изменён 1 год, 7 месяцев назад пользователем Пивен Евгений.
- Ответ изменён 1 год, 7 месяцев назад пользователем Пивен Евгений.
Вложения:
Вы должны войти для просмотра вложений.18.04.2023 в 06:20 #5880Пивен ЕвгенийУчастникЗдравствуйте.
В данном скрипте я выбрал структурные линии
pline = actSfcLayer.SelectStructureLines(None, «Выберите структурные линии:»)
if (pline == None):
return
Далее определил точки
try:
index1 = self.select_console_point_5(actSfcLayer, ‘Укажите первую опору’)
if (index1 < 0):
return
pt1 = actSfcLayer.Surface.Points[index1]
index2 = self.select_console_point_5(actSfcLayer, ‘Укажите вторую опору’)
if (index2 < 0):
return
pt2 = actSfcLayer.Surface.Points[index2]
Далее у меня не получается определиться с пересечением структурных линий и направлением между pt1 и pt2
В оригинале данное пересечение определяется между полилиниями и точками
for pt in Topomatic.Cad.Foundation.PolylineExtentions.GetIntersections(pline, pt1.Vertex.Pos, pt2.Vertex.Pos):
station = clr.Reference[System.Double]()
offset = clr.Reference[System.Double]()
if (Topomatic.Cad.Foundation.PolylineExtentions.PosToStaOffset(pline, pt, station, offset)):
a = Topomatic.Cad.Foundation.PolylineExtentions.StaOffsetToPos(pline, station.Value, 0)
b = Topomatic.Cad.Foundation.PolylineExtentions.StaOffsetToPos(pline, station.Value + 0.1, 0)
Каким образом здесь подменить полилинию на структурную линию? Может Topomatic.Cad.Foundation для этих целей не подходит? Подскажите как выйти из данной ситуации.
Спасибо.18.04.2023 в 06:22 #5881Пивен ЕвгенийУчастникРигель конт. сети
Вложения:
Вы должны войти для просмотра вложений. -
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.