Author |
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 |
|
|
MJ
Russia
13 Posts |
Posted - 11/08/2005 : 06:19:56
|
Дело в том,что мне не надо собирать инфу по шейпам, у меня питающая сеть DeviceNet. Мне для проверки ее работаспособности необходимо узнать где находится источники(один и более) и в зависимости от отдаленности каждого устройства от него проверить падение напряжения(чтоб не превышало определенной велечины), проблема в том, что необходимо учитывать не только удаленность, а также сколько узлов от устройства до источника. Вот и необходимо пробежаться по сети и оценить. |
Edited by - MJ on 11/08/2005 09:15:20 |
|
|
brace
Russia
358 Posts |
Posted - 11/08/2005 : 09:18:09
|
когда тебе необходимо что то узнать дык ... это и есть получить или собрать инфу с рисунка/схемы/чертежа для этого и в визио есть Reports естес...но что эту инфу сначала надо в шейпы заложить для этого в визио есть Custom Properties |
|
|
MJ
Russia
13 Posts |
Posted - 11/08/2005 : 09:37:33
|
Дык я знаю, что такое репортсы и я с ними уже работал. У меня проблема в другом. Например как мне узнать сколько узлов между двумя шейпами, если есть цепочка из шейпов соединенных коннекторами. Либо подсчитать сколько источников в ней и по как по отношению к источнику располагается шейп: левее него или правее. Я просто пытаюсь сделать проход от края(есть начальный шейп), до конца через коннектсы и мне необходимо узнать есть ли более простой какой нибудь способ, а то так получается слишком сложно. |
|
|
brace
Russia
358 Posts |
Posted - 11/08/2005 : 10:18:09
|
сложно отвечать когда несколько задач/вопросов свалены в одну кучу типа венегрет получается
посчитать кол-во определенного типа шейпов - это одна задача определить кто левее а кто правее - это другая задача
|
|
|
MJ
Russia
13 Posts |
Posted - 11/08/2005 : 11:06:32
|
Ну а есть какиенить варианты по решению любой из них? |
|
|
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 покажет кто правее а кто левее.
|
|
|
Tumanov
Russia
1198 Posts |
Posted - 11/08/2005 : 20:14:22
|
quote: Я просто пытаюсь сделать проход от края(есть начальный шейп), до конца через коннектсы и мне необходимо узнать есть ли более простой какой нибудь способ, а то так получается слишком сложно.
Да не так уж это и сложно... Полезно только разделить задачи: сначала выбрать всю топологию в массив связей, а потом уже работать не с рисунком, а с этим массивом. Получится типовая задачка, не связанная с особенностями Visio. Массив связей - как табличка. В каждой строке два ID шейпа. Массив набирается через коннекторы. Берете любой шейп и обходите все его связи. Если очередной связи в массиве нет, добавляете ее. Потом переходите к следующему шейпу и т.д. А потом уже по массиву можно набирать возможные пути, выбирать, если это нужно, кратчайший и т.д., то есть решать уже конечные задачи. Будет-то всего 3-4 специальных функции... |
|
|
MJ
Russia
13 Posts |
Posted - 11/10/2005 : 08:56:24
|
Спасибо за помощь. Раньше ответить не мог, т.к. инета не было . Попробую поработать с массивом |
|
|
MJ
Russia
13 Posts |
Posted - 11/16/2005 : 06:42:42
|
Не могли бы вы показать пару функций работы с таким массивом(например нахождение минимального расстояния), или дать ссылку где это рассматривается? А то массив составил легко, а поработать с ним не получается |
|
|
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
|
|
|
MJ
Russia
13 Posts |
Posted - 11/17/2005 : 07:35:31
|
Большое спас за помощь. |
|
|
|
Topic |
|
|
|