Пользовательские скрипты

Главная Форум Средства разработки Топоматик Robur Пользовательские скрипты

Просмотр 9 сообщений - с 1 по 9 (из 9 всего)
  • Автор
    Сообщения
  • #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()
    Спасибо.

    Вложения:
    Вы должны войти для просмотра вложений.
    #5743
    Пивен Евгений
    Участник

    1

    #5747
    Пивен Евгений
    Участник

    Дополнительно к предыдущему сообщению прикрепляю текстовый файл с кодом, так как вышеизложенный не читаемый, как в текстовое поле форума вставлять код в рамке для нормального чтения я не знаю, кто знает подскажите.

    Вложения:
    Вы должны войти для просмотра вложений.
    #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]> »
    И в неё узел вставляется.
    Поэтому уточняю вопрос. Подскажите как правильно сформировать запрос на выбор нескольких структурных линий???
    Ниже прикреплю текстовый файл с рабочим кодом.
    Заранее спасибо.

    Вложения:
    Вы должны войти для просмотра вложений.
    #5764

    Здравствуйте.

    Когда я делаю запрос на структурные линии…

    Сначала получаем структурную линию:

    pline = actSfcLayer.SelectStructureLines(None, «Выберите структурные линии:»)
    if (pline == None):
    return

    Сейчас в pline находится структурная линия

    А дальше через несколько строк, pline переопределяется и становится структурной линией. Питон не строго типизирован
    и позволяет делать такие вещи без предупреждения.

    plines = []
    for item in cadview.SelectionSet:
    pline = Polyline3D()

    Теперь pline полилиния и вставить туда узел структурной линии нельзя

    #5767
    Пивен Евгений
    Участник

    Здравствуйте. Я предполагал что проблема в этом.
    Данную часть кода я оставил чтобы войти в цикл
    for pline in plines:
    Подскажите пожалуйста как поступить в данной ситуации, работая со структурными линиями, всё таки пройти этот цикл и на что поменять элемент «PolylineExtentions» в выражении «for pt in Topomatic.Cad.Foundation.PolylineExtentions.GetIntersections(pline, pt1.Vertex.Pos, pt2.Vertex.Pos):»
    Для наглядности прикреплю к письму данный код с комментариями.
    Спасибо.

    #5768
    Пивен Евгений
    Участник

    Прикреплённый код

    Вложения:
    Вы должны войти для просмотра вложений.
    #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 для этих целей не подходит? Подскажите как выйти из данной ситуации.
    Спасибо.

    #5881
    Пивен Евгений
    Участник

    Ригель конт. сети

    Вложения:
    Вы должны войти для просмотра вложений.
Просмотр 9 сообщений - с 1 по 9 (из 9 всего)
  • Для ответа в этой теме необходимо авторизоваться.