Author |
Topic |
|
WaW
10 Posts |
Posted - 06/06/2008 : 02:17:15
|
Добрый день! Следующая проблемка. Имеется шейп, состоящий из двух простых линий. Как определить абсолютные координаты EndX и EndY одной из линий? |
|
Tumanov
Russia
1198 Posts |
Posted - 06/06/2008 : 04:16:27
|
Сначала из секции геометрии прочесть локальные координаты, затем перевести их в координаты родительского объекта. Если родительским окажется не страница, а группа (например, линии были сгруппированы), придется перейти к следующему родителю. |
|
|
GDK
Russia
90 Posts |
Posted - 06/06/2008 : 14:16:03
|
В Visio есть какая-то функция, которая для шейп-листа. Она как раз возвращает абсолютные координаты точки. Сам долго мучался с этим вопросом. Пороюсь в своих файликах поищу название этой ф-ции. По моему не требуется переходить к родительским объектам. |
|
|
GDK
Russia
90 Posts |
Posted - 06/06/2008 : 14:20:07
|
=PNTX(PAR(PNT(Sheet.2!Geometry1.X2,Sheet.2!Geometry1.Y2))) Какая-то из присутствующих в вышеуказанной строке. Вроде бы PAR. |
|
|
Tumanov
Russia
1198 Posts |
Posted - 06/06/2008 : 16:24:19
|
Par переводит координаты в систему координат родительского объекта. Если родительский объект - страница, то переведется в координаты страницы. |
|
|
Tumanov
Russia
1198 Posts |
Posted - 06/06/2008 : 16:41:59
|
Вот немного поподробнее про пересчет координат макросом. Компоненты задачи: 1. Чтение координат из секции геометрии 2. Преобразование координат в систему отсчета родительского шейпа 3. Если родителем является не страница, а шейп-группа, преобразование по п. 2 повторяется рекурсивно, пока не дойдем до страницы.
1. Чтение координат из секции геометрии Если sh - нужный шейп, i - номер строки в секции, то локальные координаты получаются так locX = sh.CellsSRC(visSectionFirstComponent, i, 0) locY = sh.CellsSRC(visSectionFirstComponent, i, 1) Если шейп представляет собой ломаную линию, то координаты всех точек можно распечатать так GeomRows = sh.RowCount(Visio.visSectionFirstComponent) For i = 1 To GeomRows - 1 locX = sh.CellsSRC(visSectionFirstComponent, i, 0) locY = sh.CellsSRC(visSectionFirstComponent, i, 1) Debug.Print locX * 25.4 & " mm", locY * 25.4 & " mm" Next GeomRows - количество строк геометрии в шейпе
2. Преобразование координат в систему отсчета родительского объекта Родительским объектом может быть либо группа, либо страница. И в том, и в другом случае все данные лежат в шейпе. Нужно взять координату центра шейпа (PinX), вычесть из нее локальную координату центра шейпа (LocPinX) и добавить прочитанную ранее локальную координату точки AbsX = Shape.Cells("PinX") - Shape.Cells("LocPinX") + x
3. Определение типа родительского объекта Родительский объект находится методом .Parent. Тип определяется по свойству .ObjectType. У страницы он имеет значение 14. У группы, как и у обычного шейпа - 17. Наша задача остановить рекурсию, когда обнаружим в качестве родительского шейпа страницу. Dim ShParent As Object Set ShParent = Shape.Parent If ShParent.ObjectType <> 14 Then ...
4. Теперь суммарный пример. Пересчет пары координат в координаты родительской системы выделим в отдельную процедуру ToP. Тестовый пример - Sub ttt() Предварительно рисуем на чистой странице ломаную, затем преобразуем ее в группу. В таком виде шейп ломаной будет доступен как Set sh = ActivePage.Shapes(2).Shapes(1) Приведенный ниже пример выведет в окно Immediate координаты вершин ломаной линии в системе координат страницы.
Sub ttt() Dim sh As Visio.Shape Dim Pg As Visio.Page 'Set sh = ActivePage.Shapes(1) Set sh = ActivePage.Shapes(2).Shapes(1) GeomRows = sh.RowCount(Visio.visSectionFirstComponent) For i = 1 To GeomRows - 1 locX = sh.CellsSRC(visSectionFirstComponent, i, 0) locY = sh.CellsSRC(visSectionFirstComponent, i, 1) Dim AbsX As Double, AbsY As Double ToP sh, locX, locY, AbsX, AbsY Debug.Print AbsX * 25.4 & " mm", AbsY * 25.4 & " mm" Next End Sub
Sub ToP(Shape As Visio.Shape, ByVal x As Double, ByVal y As Double, AbsX As Double, AbsY As Double) 'Рекурсивно пересчитывает координаты точки из локальных до страницы Dim ShParent As Object Dim aX As Double, aY As Double Set ShParent = Shape.Parent x1 = Shape.Cells("PinX") - Shape.Cells("LocPinX") + x y1 = Shape.Cells("PinY") - Shape.Cells("LocPinY") + y If ShParent.ObjectType <> 14 Then ToP ShParent, x1, y1, aX, aY AbsX = aX AbsY = aY Else AbsX = x1 AbsY = y1 End If End Sub
|
|
|
GDK
Russia
90 Posts |
Posted - 06/07/2008 : 10:06:50
|
Может быть ф-ция PAR по умолчанию пересчитывает локальные коорд. точек фигуры в координаты листа? Просто я сделал файл, в котором есть ломаная линия. Есть фигуры, которые должны располагаться вблизи точек ломаной линии (отслеживать координаты точек ломаной с помощью PAR). Эти фигуры не находятся ни в какой группе. Ломаная находится на листе(не в группе). Рисую линию. Группирую линию и ломаную(группа1). Пробую менять положение точек ломаной внутри группы. Всё работает. Рисую квадрат. Группирую квадрат и Группу1. Опять двигаю точки ломаной. Всё работает(фигурки не находясь сами ни в одной из групп продолжают располагаться вблизи точек ломаной). Значит PAR пересчитывает локальные координаты ломаной в координаты листа независимо от того находится ломаная в группе(ах) или нет. Если интересно могу скинуть файлик. |
|
|
WaW
10 Posts |
Posted - 06/26/2008 : 12:41:27
|
Спасибо за помощь. Попробую разобраться... |
|
|
ESV
Ukraine
21 Posts |
Posted - 08/18/2008 : 18:16:48
|
Вот такая функция возвращает X-ою координату шейпа в абсолютных координатах листа, независимо от уровня вложения шейпа:
PNTX(LOCTOLOC(PNT(LocPinX,LocPinY),Width,ThePage!PageWidth)) |
|
|
Tumanov
Russia
1198 Posts |
Posted - 08/18/2008 : 18:50:10
|
И даже =PNTX(LOCTOLOC(PNT(LocPinX,LocPinY),Blur,ThePage!PaperSource))
|
|
|
ESV
Ukraine
21 Posts |
Posted - 08/18/2008 : 19:12:44
|
О чем и речь! Так спрашивается зачем лохматить бабушку?© (это я про макросы). |
|
|
Tumanov
Russia
1198 Posts |
Posted - 08/18/2008 : 19:29:24
|
Ну так упустил из виду LocToLoc. Бывает... Зато попутно сколько полезного нарассказал |
|
|
GDK
Russia
90 Posts |
Posted - 09/08/2008 : 12:01:15
|
"Зачем бабушку лохматить" Ну да. Только вот справочник по функциям в VISIO на англ. и не сразу поймёшь какая функция для чего нужна. Не плохо было бы иметь что нибудь типа FAQ чисто про функции. Например по алфавиту Функция, назначение, "синтаксис", примеры замечания и т.п. А то найдёшь решение через пару дней работы, а оказывается делов на пару минут было, через месяц забудешь и опять велосипед выдумываешь. |
|
|
ESV
Ukraine
21 Posts |
Posted - 09/08/2008 : 20:49:03
|
quote: Originally posted by GDK
Только вот справочник по функциям в VISIO на англ. и не сразу поймёшь какая функция для чего нужна.
А вот для этого и существует даный форум. Если что не понимаешь - спрашивй, чем можем - поможем!!!
________________________________________________________
Не надо ломать друг-другу глаза, используйте [cоde][/cоde] |
Edited by - ESV on 09/08/2008 20:53:00 |
|
|
|
Topic |
|
|
|