Author |
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 и домножить на отношение масштабов. Только здесь нельзя подкрасить обсчитанное, придется верить на слово :).
|
|
|
Tumanov
Russia
1198 Posts |
Posted - 07/18/2003 : 08:01:22
|
Добавка. Может быть даже проще не по именам ориентироваться, а располагать эти и только эти линии на одном слое. Тогда просто в фильтре указывается этот слой.
|
|
|
Graf
Russia
3 Posts |
Posted - 07/18/2003 : 11:07:14
|
Как в фильтре указть нужный слой (все элементы находяться в разных слоях - узкий короб, широкий, лоток, розетка и т.д.) Допустим оставил на листе нужный слой (либо выделил необходимые элементы и "инструменты/отчет/новый/текущие выбранные фигуры/Window width/промежуточные суммы (ставлю на всякий случай все галки)/финишь. Далее открываю екселем полученный отчет и вижу много полей, но результатов похожих на реальные в чертеже (даже по одному конкретному отрезку) нет, хоть с учетом перемножения на масштаб хоть без этого (точность 4). И не понятно значение фразы /VisioRptDefField/@SummaryTypes (честно сказать с английским я не очень, а тут еще сокращения). В общем не получается у меня добиться результата - наверное я что-то не правильно делаю, поправьте меня если не трудно. Принцип я понял: надо средствами Visio выделить нужные мне объекты и получить по ним характеристики (в том числе и длин) каждого отдельно взятого объекта и далее эту таблицу перенести например в ексель и банально просуммировать данные из нужного столбца, а далее уже масштаб и все. Но как получить длины (особенно с моим плохим знанием английского) отрезков - я не знаю.
[/quote] |
|
|
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 или Выполнить. Оно еще спросит в каком формате и куда записать результат, но тут уже никуда не свернешь. Остается только найти результат там, куда скажете и посмотреть его. |
|
|
Graf
Russia
3 Posts |
Posted - 07/18/2003 : 14:13:45
|
Tumanov СПАСИБААА, все прекрасно работает, поставил для вычисления длин в окне мастера определения отчета ширину. Далее все выполняется и я сразу в екселе открываю результат. Просто супер - проверил вручную - были верно (точность 2 знака после запятой) посчитаны все необходимые линии слоя и в нужном количестве. МНЕ НРАВИТЬСЯ ЭТА КОНФЕРЕНЦИЯ. ОТДЕЛЬНОЕ СПАСИБО Tumanovу |
|
|
oleg753
26 Posts |
Posted - 02/15/2010 : 09:39:37
|
Tumanov "А теперь нажимаем кнопку справа Limit Selection. Ее могли перевсти как Условия Выбора, Ограничение Выбора или что-то похожее. В окошке Property (Свойства) выбираем <Layer Name>, правее =, в самом правом - вводите имя нужного слоя. Нажимаете Add (Добавить), потом OK"
Вот у меня при выборе В окошке Property (Свойства) выбираем <Layer Name>, справа, где должны быть названия слоев, ничего нет. Какой-то баг? Это относится только к выбору слоев. |
|
|
Tumanov
Russia
1198 Posts |
Posted - 02/15/2010 : 16:12:07
|
А они появляются только тогда, когда в рисунке есть слои. Назначьте нескольким шейпам какие-нибудь слои, а потом делайте все остальное. Имеющиеся слои появятся в списке. |
|
|
oleg753
26 Posts |
Posted - 02/16/2010 : 13:26:47
|
В рисунке слои есть и шейпы раскиданы по слоям. Выделеный шейп также лежит на слое. Визио 2007 |
|
|
Tumanov
Russia
1198 Posts |
Posted - 02/16/2010 : 15:54:24
|
Тогда не знаю... Проверил в Visio 2007. У меня список слоев виден. Так что, если это и баг, то не Visio 2007 в целом, а связанный именно с Вашим экземпляром Visio или какой-то особенностью чертежа. |
|
|
bdfy
Belarus
267 Posts |
Posted - 02/17/2010 : 00:39:14
|
а можно ли найти длину коннектора ? |
|
|
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 |
|
|
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 |
|
|
Surrogate
Russia
122 Posts |
|
|
Topic |
|