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

WaW

10 Posts

Posted - 06/06/2008 :  02:17:15
Добрый день!
Следующая проблемка.
Имеется шейп, состоящий из двух простых линий.
Как определить абсолютные координаты EndX и EndY одной из линий?

Tumanov

Russia
1198 Posts

Posted - 06/06/2008 :  04:16:27
Сначала из секции геометрии прочесть локальные координаты, затем перевести их в координаты родительского объекта. Если родительским окажется не страница, а группа (например, линии были сгруппированы), придется перейти к следующему родителю.
Go to Top of Page

GDK

Russia
90 Posts

Posted - 06/06/2008 :  14:16:03
В Visio есть какая-то функция, которая для шейп-листа. Она как раз возвращает абсолютные координаты точки. Сам долго мучался с этим вопросом. Пороюсь в своих файликах поищу название этой ф-ции.
По моему не требуется переходить к родительским объектам.
Go to Top of Page

GDK

Russia
90 Posts

Posted - 06/06/2008 :  14:20:07
=PNTX(PAR(PNT(Sheet.2!Geometry1.X2,Sheet.2!Geometry1.Y2)))
Какая-то из присутствующих в вышеуказанной строке. Вроде бы PAR.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 06/06/2008 :  16:24:19
Par переводит координаты в систему координат родительского объекта.
Если родительский объект - страница, то переведется в координаты страницы.
Go to Top of Page

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
Go to Top of Page

GDK

Russia
90 Posts

Posted - 06/07/2008 :  10:06:50
Может быть ф-ция PAR по умолчанию пересчитывает локальные коорд. точек фигуры в координаты листа?
Просто я сделал файл, в котором есть ломаная линия. Есть фигуры, которые должны располагаться вблизи точек ломаной линии (отслеживать координаты точек ломаной с помощью PAR). Эти фигуры не находятся ни в какой группе. Ломаная находится на листе(не в группе). Рисую линию. Группирую линию и ломаную(группа1). Пробую менять положение точек ломаной внутри группы. Всё работает. Рисую квадрат. Группирую квадрат и Группу1. Опять двигаю точки ломаной. Всё работает(фигурки не находясь сами ни в одной из групп продолжают располагаться вблизи точек ломаной). Значит PAR пересчитывает локальные координаты ломаной в координаты листа независимо от того находится ломаная в группе(ах) или нет. Если интересно могу скинуть файлик.
Go to Top of Page

WaW

10 Posts

Posted - 06/26/2008 :  12:41:27
Спасибо за помощь.
Попробую разобраться...
Go to Top of Page

ESV

Ukraine
21 Posts

Posted - 08/18/2008 :  18:16:48
Вот такая функция возвращает X-ою координату шейпа в абсолютных координатах листа, независимо от уровня вложения шейпа:

PNTX(LOCTOLOC(PNT(LocPinX,LocPinY),Width,ThePage!PageWidth))
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 08/18/2008 :  18:50:10
И даже
=PNTX(LOCTOLOC(PNT(LocPinX,LocPinY),Blur,ThePage!PaperSource))
Go to Top of Page

ESV

Ukraine
21 Posts

Posted - 08/18/2008 :  19:12:44
О чем и речь! Так спрашивается зачем лохматить бабушку?© (это я про макросы).
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 08/18/2008 :  19:29:24
Ну так упустил из виду LocToLoc. Бывает...
Зато попутно сколько полезного нарассказал
Go to Top of Page

GDK

Russia
90 Posts

Posted - 09/08/2008 :  12:01:15
"Зачем бабушку лохматить" Ну да. Только вот справочник по функциям в VISIO на англ. и не сразу поймёшь какая функция для чего нужна. Не плохо было бы иметь что нибудь типа FAQ чисто про функции. Например по алфавиту Функция, назначение, "синтаксис", примеры замечания и т.п.
А то найдёшь решение через пару дней работы, а оказывается делов на пару минут было, через месяц забудешь и опять велосипед выдумываешь.
Go to Top of Page

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
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)