All Forums
 Категория Visio
 Форум Вопросы и ответы
 При положении шейпа на страницу
Author Previous Topic Topic Next Topic  

Евгений

88 Posts

Posted - 01/13/2005 :  18:46:26
Мне нужно такое поведение документа:

Юзер положил шейп на страницу, и, если он полностью содержится в другом шейпе, то присваивает себе некую пропертю от содержащего его "родительского" шейпа.

Ковыряю в Document_Shape_Added. Пока это выглядит так:
Private Sub Document_ShapeAdded(ByVal shape As IVShape)
    Dim page As Visio.page
    Set page = shape.Parent
    For Each sh In page.Shapes
        If Inside(sh, shape) Then
            shape.Parent = sh
        End If
    Next
    MsgBox shape.Parent 'just for testing
End Sub


Несколько вопросов:
1. Что такое "IVShape"? Почему не Visio.Shape? Инет молчит.
2. В этом коде просто хочу определить нижний шейп как родитель для нового шейпа. В линии, где происходит присваивание, получаю exception. Что делать? Может, это из-за того, что шейп передается через значение?
3. Функция Inside(sh, shape) должна проверить, находится ли sh в shape. Как ее заимплементировать? Может, есть готовая реализация? Можно брать проперти шейпа такие, как "PinX", "PinY". Подскажите, у меня нет опыта с обращением с пропертями и даже с правильной декларацией функций.

Спасибо заранее.

Tumanov

Russia
1198 Posts

Posted - 01/13/2005 :  21:48:44
Такое поведение достигается не так.
В Вашем случае нужно найти на странице все шейпы, на которые попадет данный шейп, причем целиком. Для этого есть функция
objRet = object.SpatialNeighbors(relation, tolerance, flags[,resultRoot])
Returns a Selection object that represents the shapes that meet certain criteria in relation to a specified shape.
object - это Ваш новый шейп shape.
relation должно быть равно visSpatialContainedIn (в крайнем случае - наоборот - visSpatialContain :)
tolerance какой-нибудь маленький, в дюймах
flags скорее всего удовлетворит нулевой.
Вам будет возвращена коллекция шейпов Selection, удовлетворяющая данному условию. Если она пустая, значит ни одного такого шейпа нет.
Константы смотрятся через Object Browser в Visual Basic Editor'е.
--------------------
Есть похожие полезные свойства: SpatialSearch, DistanceFromPoint, SpatialRelation...
Насчет фокусов с "shape.parent =..." - по-моему такое не укладывается в объектную модель Visio. Да вроде по условиям и не нужны Вам такие отношения.
PinX, PinY, естественно, тоже использовать можно, но в данном случае больше подходит то, что я сказал выше.
Почему IV - не знаю :(
Go to Top of Page

Евгений

88 Posts

Posted - 01/14/2005 :  12:30:19
Г-н Туманов, в очередной раз спасибо! Не все сразу заработало, но после некоторых исправлений удалось получить желанный результат! Используя это property (кстати, почему то, что в объектных языках называется методом, в VB причисляется к пропертям?), удалось также исследовать наложения шейпов (overlaps).
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)