All Forums
 Категория Visio
 Форум Вопросы и ответы
 Как подсчитать суммарную длину всех линий (прямых)
Author Previous Topic Topic Next Topic  

Graf

Russia
3 Posts

Posted - 07/18/2003 :  05:57:25
Есть ли в Visio 2002 встроенная функция или кто может макрос выслать. Задача такая - проект сети, убираю стены, двери и т.д. оставляю только короба определенного сечения на рабочем листе и хотелось бы подсчитать длины всех видимых линий (точнее просто сумму длин). Вручную считать долго и можно ошибиться, по-этому процесс нужно автоматизировать.

Tumanov

Russia
1198 Posts

Posted - 07/18/2003 :  07:51:42
Макроса нет, но алгоритм для его построения представляется довольно легко.
Только нужные короба надо рисовать одним типом шейпа (линии), чтобы он выделялся по имени, а стирать все остальное изображение не обязательно.
Перебирается вся коллекция шейпов на рисунке, выбираются для обсчета только нужные шейпы. В этих шейпах в секции Geometry описана вся конфигурация линии (даже если она ломанная, только круглые не годятся). Перебираются строки секции и складываются длины, высчитываемые по двум координатам. Обсчитанные шейпы красятся в какой-нибудь цвет, чтобы глазом было заметно, не пропустил ли чего. Пропуски могут быть, если линии были сгруппированы, тогда их надо будет разгруппировать и повторить процесс или макрос сделать похитрее, чтобы в группу залезал.
Потом останется только домножить на масштабы и все.

Вариант 2. Если все нужные линии нарисованы не ломанными, а просто отрезками линий, то можно воспользоваться Tools / Report / Shape Inventory. Отчет вывести в Excel, суммировать Width и домножить на отношение масштабов. Только здесь нельзя подкрасить обсчитанное, придется верить на слово :).
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 07/18/2003 :  08:01:22
Добавка. Может быть даже проще не по именам ориентироваться, а располагать эти и только эти линии на одном слое. Тогда просто в фильтре указывается этот слой.
Go to Top of Page

Graf

Russia
3 Posts

Posted - 07/18/2003 :  11:07:14
Как в фильтре указть нужный слой (все элементы находяться в разных слоях - узкий короб, широкий, лоток, розетка и т.д.) Допустим оставил на листе нужный слой (либо выделил необходимые элементы и "инструменты/отчет/новый/текущие выбранные фигуры/Window width/промежуточные суммы (ставлю на всякий случай все галки)/финишь. Далее открываю екселем полученный отчет и вижу много полей, но результатов похожих на реальные в чертеже (даже по одному конкретному отрезку) нет, хоть с учетом перемножения на масштаб хоть без этого (точность 4). И не понятно значение фразы /VisioRptDefField/@SummaryTypes (честно сказать с английским я не очень, а тут еще сокращения). В общем не получается у меня добиться результата - наверное я что-то не правильно делаю, поправьте меня если не трудно. Принцип я понял: надо средствами Visio выделить нужные мне объекты и получить по ним характеристики (в том числе и длин) каждого отдельно взятого объекта и далее эту таблицу перенести например в ексель и банально просуммировать данные из нужного столбца, а далее уже масштаб и все. Но как получить длины (особенно с моим плохим знанием английского) отрезков - я не знаю.

[/quote]
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 07/18/2003 :  12:30:32
На листе может оставаться все. Достаточно того, что Узкий Короб будет в отдельном слое.
Делаем Tools/Report и щелкаем New.
Текущие выбранные фигуры - не очень хорошо. Лучше взять чуть повыше - Shapes on the Current Page (у Вас это будет что-то типа - фигуры на текущей странице).
А теперь нажимаем кнопку справа Limit Selection. Ее могли перевсти как Условия Выбора, Ограничение Выбора или что-то похожее.
В окошке Property (Свойства) выбираем <Layer Name>, правее =, в самом правом - вводите имя нужного слоя.
Нажимаете Add (Добавить), потом OK.
Вот только теперь давите Next (Далее или что-то там), ставите те галочки, которые Вы хотите видеть в отчете. Главное, чтобы была галочка у Width.
На следующем экране можно просто нажать Next - не интересный экран.
Потом будет галочка, где сохранить эту конфигурацию - в рисунке или в отдельном файле. Выбираете, например, в рисунке и нажимаете Finish.
Попадаете опять в окошко со списком. Причем имя только что подготовленного отчета уже селектировано. Остается его только выполнить. Жмете Run или Выполнить.
Оно еще спросит в каком формате и куда записать результат, но тут уже никуда не свернешь.
Остается только найти результат там, куда скажете и посмотреть его.
Go to Top of Page

Graf

Russia
3 Posts

Posted - 07/18/2003 :  14:13:45
Tumanov СПАСИБААА, все прекрасно работает, поставил для вычисления длин в окне мастера определения отчета ширину. Далее все выполняется и я сразу в екселе открываю результат. Просто супер - проверил вручную - были верно (точность 2 знака после запятой) посчитаны все необходимые линии слоя и в нужном количестве. МНЕ НРАВИТЬСЯ ЭТА КОНФЕРЕНЦИЯ. ОТДЕЛЬНОЕ СПАСИБО Tumanovу
Go to Top of Page

oleg753

26 Posts

Posted - 02/15/2010 :  09:39:37
Tumanov "А теперь нажимаем кнопку справа Limit Selection. Ее могли перевсти как Условия Выбора, Ограничение Выбора или что-то похожее.
В окошке Property (Свойства) выбираем <Layer Name>, правее =, в самом правом - вводите имя нужного слоя.
Нажимаете Add (Добавить), потом OK"

Вот у меня при выборе В окошке Property (Свойства) выбираем <Layer Name>, справа, где должны быть названия слоев, ничего нет. Какой-то баг? Это относится только к выбору слоев.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 02/15/2010 :  16:12:07
А они появляются только тогда, когда в рисунке есть слои. Назначьте нескольким шейпам какие-нибудь слои, а потом делайте все остальное. Имеющиеся слои появятся в списке.
Go to Top of Page

oleg753

26 Posts

Posted - 02/16/2010 :  13:26:47
В рисунке слои есть и шейпы раскиданы по слоям. Выделеный шейп также лежит на слое.
Визио 2007
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 02/16/2010 :  15:54:24
Тогда не знаю...
Проверил в Visio 2007. У меня список слоев виден.
Так что, если это и баг, то не Visio 2007 в целом, а связанный именно с Вашим экземпляром Visio или какой-то особенностью чертежа.
Go to Top of Page

bdfy

Belarus
267 Posts

Posted - 02/17/2010 :  00:39:14
а можно ли найти длину коннектора ?
Go to Top of Page

GDK

Russia
90 Posts

Posted - 03/03/2010 :  13:33:59
Проще некуда. Там есть в шейп листе координаты точек. Ну а дальше цыкл по строкам раздела геометрии переменная для суммы и переменная для длины одного сегмента.
Ну а формула длины линии - L=((x1-x2)^2 + (y1-y2)^2)^0.5

Edited by - GDK on 03/05/2010 07:12:46
Go to Top of Page

bdfy

Belarus
267 Posts

Posted - 03/03/2010 :  23:08:10
в принципе все верно ) такой код и предложили
http://visguy.com/vgforum/index.php?topic=1468.0
Set shpObj = Application.ActiveWindow.Selection(1)
intSects = shpObj.GeometryCount
'Debug.Print iGeoCt

'// Test for zero geometry sections:
'm_iGeoCt = m_visShp.GeometryCount
                    If intSects = 1 Then
                        intCurrGeomSect = visSectionFirstComponent + 0
                        intRows = shpObj.RowCount(intCurrGeomSect)
                        
                        ' row label starts at 1
                        For intCtr = 2 To intRows - 1
                            ' get the previous row
                            lngBaseX = shpObj.CellsSRC(intCurrGeomSect, intCtr - 1, visX).ResultIU
                            lngBaseY = shpObj.CellsSRC(intCurrGeomSect, intCtr - 1, visY).ResultIU
                            ' get the new position
                            lngNewX = shpObj.CellsSRC(intCurrGeomSect, intCtr, visX).ResultIU
                            lngNewY = shpObj.CellsSRC(intCurrGeomSect, intCtr, visY).ResultIU
                            ' figure the changes and convert to absolute
                            deltaX = lngNewX - lngBaseX
                            deltaY = lngNewY - lngBaseY
                            lngLength = lngLength + Sqr((deltaX * deltaX) + (deltaY * deltaY))
                        Next intCtr
                    End If

lngLength = lngLength * 25.4 'to get mm not inches
Go to Top of Page

Surrogate

Russia
122 Posts

Posted - 11/16/2012 :  04:04:19  Visit Surrogate's Homepage
в визио 2010 есть возможность вычислять длину без макросов, в шейпшите! см. пост http://visio.getbb.ru/viewtopic.php?f=5&t=238

Оригинал статьи от MS http://blogs.msdn.com/b/visio/archive/2010/01/04/new-shapesheet-cells-and-functions-in-visio-2010.aspx

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)