All Forums
 Категория Visio
 Форум Вопросы и ответы
 Коннекторы
Author Previous Topic Topic Next Topic  

MJ

Russia
13 Posts

Posted - 11/07/2005 :  15:10:04
У меня построена сеть с устройствами в ней. Все соединено коннекторами.
Подскажите как лучше ее анализировать. Я беру какойнить шейп, устанавливаю его свойство, делая его начальным(User.Row_1 = "1" например). Потом по .FromConnects.FromSheet, .FromConnects.Count двигаюсь по ней и делаю анализ. Это все получается очень громоздко, особенно, когда у Шейпа несколько конекшнс. Может можно какнить по другому сделать анализ?

brace

Russia
358 Posts

Posted - 11/07/2005 :  16:50:50
что значит "анализировать сеть" ???
если надо извлекать данные из шейпов сети
то делай так Tools > Reports
Go to Top of Page

MJ

Russia
13 Posts

Posted - 11/08/2005 :  06:19:56
Дело в том,что мне не надо собирать инфу по шейпам, у меня питающая сеть DeviceNet. Мне для проверки ее работаспособности необходимо узнать где находится источники(один и более) и в зависимости от отдаленности каждого устройства от него проверить падение напряжения(чтоб не превышало определенной велечины), проблема в том, что необходимо учитывать не только удаленность, а также сколько узлов от устройства до источника. Вот и необходимо пробежаться по сети и оценить.

Edited by - MJ on 11/08/2005 09:15:20
Go to Top of Page

brace

Russia
358 Posts

Posted - 11/08/2005 :  09:18:09
когда тебе необходимо что то узнать
дык ... это и есть получить или собрать инфу с рисунка/схемы/чертежа
для этого и в визио есть Reports
естес...но что эту инфу сначала надо в шейпы заложить
для этого в визио есть Custom Properties
Go to Top of Page

MJ

Russia
13 Posts

Posted - 11/08/2005 :  09:37:33
Дык я знаю, что такое репортсы и я с ними уже работал. У меня проблема в другом. Например как мне узнать сколько узлов между двумя шейпами, если есть цепочка из шейпов соединенных коннекторами. Либо подсчитать сколько источников в ней и по как по отношению к источнику располагается шейп: левее него или правее. Я просто пытаюсь сделать проход от края(есть начальный шейп), до конца через коннектсы и мне необходимо узнать есть ли более простой какой нибудь способ, а то так получается слишком сложно.
Go to Top of Page

brace

Russia
358 Posts

Posted - 11/08/2005 :  10:18:09
сложно отвечать когда несколько задач/вопросов свалены в одну кучу
типа венегрет получается

посчитать кол-во определенного типа шейпов - это одна задача
определить кто левее а кто правее - это другая задача

Go to Top of Page

MJ

Russia
13 Posts

Posted - 11/08/2005 :  11:06:32
Ну а есть какиенить варианты по решению любой из них?
Go to Top of Page

brace

Russia
358 Posts

Posted - 11/08/2005 :  12:00:02
вот какую инфу собирает с чертежа простой отчет типа inventory

Master_Name;Displayed_Text;Shape_Name;Shape_ID;X_Location;Y_Location;Quantity:

если сделать его в Excel формате
то можно фильтровать данные как угодно
фильтр по полю X_Location покажет кто правее а кто левее.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 11/08/2005 :  20:14:22
quote:
Я просто пытаюсь сделать проход от края(есть начальный шейп), до конца через коннектсы и мне необходимо узнать есть ли более простой какой нибудь способ, а то так получается слишком сложно.

Да не так уж это и сложно...
Полезно только разделить задачи: сначала выбрать всю топологию в массив связей, а потом уже работать не с рисунком, а с этим массивом. Получится типовая задачка, не связанная с особенностями Visio.
Массив связей - как табличка. В каждой строке два ID шейпа.
Массив набирается через коннекторы. Берете любой шейп и обходите все его связи. Если очередной связи в массиве нет, добавляете ее. Потом переходите к следующему шейпу и т.д.
А потом уже по массиву можно набирать возможные пути, выбирать, если это нужно, кратчайший и т.д., то есть решать уже конечные задачи.
Будет-то всего 3-4 специальных функции...
Go to Top of Page

MJ

Russia
13 Posts

Posted - 11/10/2005 :  08:56:24
Спасибо за помощь. Раньше ответить не мог, т.к. инета не было . Попробую поработать с массивом
Go to Top of Page

MJ

Russia
13 Posts

Posted - 11/16/2005 :  06:42:42
Не могли бы вы показать пару функций работы с таким массивом(например нахождение минимального расстояния), или дать ссылку где это рассматривается? А то массив составил легко, а поработать с ним не получается
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 11/16/2005 :  18:13:14
Пожалуй, наиболее сложным элементом в Вашем случае является задача нахождения всех путей в сети. А уж какой из них короче, вычислить будет проще.
Задача легко решается с использованием рекурсивной функции, то есть вызывающей саму себя.
В приведенном ниже примере в каждом очередном узле функция FindPath вызывает себя для присоединенных узлов. Не для всех. Отбрасываются узлы, которые уже встретились однажды и зафиксированы в массиве Path. Отбрасывается также искомый узел - при его нахождении выводится путь к нему.
В качестве тестового взят массив из 6 узлов с 8 связями
1-2
1-5
2-3
2-5
5-3
5-4
3-6
4-6
Программа находит все 4 пути между узлами 5 и 6.
Кстати, для свободной ориентации в таких задачах очень полезно прочитать книгу Рода Стивенса "Готовые алгоритмы на Visual Basic". Она должна быть в сети в электронном виде на русском языке. Поищите.

------------------------------------------------
Private Sub Command1_Click()
PosPath = 0
Call SetArr 'Создание тестового массива
Call FindPath(5, 6) 'предлагается найти все пути от 5 к 6
End Sub
------------------------------------------------
Module1
------------------------------------------------
Dim FirstArray(2, 8) As Integer
Public PosPath As Integer
Public Path(100) As Integer
Sub FindPath(Nod1 As Integer, Nod2 As Integer)
'Nod1 - текущий узел, Nod2 - искомый
Dim i As Integer, j As Integer, k As Integer
Dim Flag As Integer
Dim s As String
Path(PosPath) = Nod1
For i = 0 To 7
k = Link(i, Nod1)
If k = Nod2 Then
s = ""
For j = 0 To PosPath
s = s & Path(j) & "-"
Next
Debug.Print s & Nod2
Else
If k > 0 Then
Flag = 0
For j = 0 To PosPath
If Path(j) = k Then Flag = 1
Next
If Flag = 0 Then
Debug.Print FirstArray(0, i), FirstArray(1, i)
PosPath = PosPath + 1 'перед рекурсией
Call FindPath(k, Nod2) 'Рекурсия
PosPath = PosPath - 1
End If
End If
End If
Next
End Sub
Function Link(Pos As Integer, Nod As Integer) As Integer
Link = 0
If FirstArray(0, Pos) = Nod Then Link = FirstArray(1, Pos)
If FirstArray(1, Pos) = Nod Then Link = FirstArray(0, Pos)
End Function
Sub SetArr()
FirstArray(0, 0) = 1
FirstArray(1, 0) = 2
FirstArray(0, 1) = 1
FirstArray(1, 1) = 5
FirstArray(0, 2) = 2
FirstArray(1, 2) = 3
FirstArray(0, 3) = 2
FirstArray(1, 3) = 5
FirstArray(0, 4) = 5
FirstArray(1, 4) = 3
FirstArray(0, 5) = 5
FirstArray(1, 5) = 4
FirstArray(0, 6) = 3
FirstArray(1, 6) = 6
FirstArray(0, 7) = 4
FirstArray(1, 7) = 6
End Sub
Go to Top of Page

MJ

Russia
13 Posts

Posted - 11/17/2005 :  07:35:31
Большое спас за помощь.
Go to Top of Page
  Previous Topic Topic Next Topic  
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)