All Forums
 Категория Visio
 Форум Вопросы и ответы
 Создание "умных" фигур
Author Previous Topic Topic Next Topic  

sensey

1 Posts

Posted - 06/15/2007 :  02:11:53
Добрый день, уважаемые участники форума!
Вопрос у меня следующий. Надо создать фигуру скажем в виде поделённого напополам вертикальной линией прямоугольника. Фишка в том, что в правую его сторону надо вставлять рисунок. Можно ли это сделать так, чтоб рисунок сразу связывался с основной фигурой и при её перемещении двигался синхронно
И ещё одно. Поидее в контекстном меню двухмерной фигуры в пункте "Поведение" можно настроить, чтоб по двойному щелчку на этой фигуре редактировался текст фигуры. Но почему-то это у меня не работает. Не подскажете, в чём тут дело или есть ли какой-то другой способ редактировать текст внутри фигуры?
Большое спасибо за помощь.

Michael

49 Posts

Posted - 06/15/2007 :  19:06:36
1. Можно привязать значения ячеек PinX и PinY добавленного рисунка к соответствующим значениям основной фигуры формулами.
Пусть основная фигура идет первым номером, тогда
в PinX рисунка добавляем формулу =GUARD(Sheet.1!PinX+Sheet.1!Width/2)
в PinY - =GUARD(Sheet.1!PinY-Sheet.1!Height/2)
устанавливаем позиционирование обоих объектов по левому верхнему углу
и получаем добавленный объект, левый верхний угол которого всегда расположен в центре основного объекта.
2. Редактирование текста фигуры выполняется нажатием F2.
Go to Top of Page

sars

17 Posts

Posted - 07/17/2008 :  08:59:57
Подскажите, можно ли и как реализовать такую штуку, чтобы шейп всегда отображался в видимой области страницы?
Go to Top of Page

Michael

49 Posts

Posted - 07/20/2008 :  14:37:03
А конкретнее?
Go to Top of Page

sars

17 Posts

Posted - 07/21/2008 :  09:12:15
Есть лист формата А4(вертикальное расположение), масштаб 50%. Добавляем на лист прямоугольник (40х20 мм) в верхнюю область листа(X=100 мм, Y=270 мм). Увеличиваем масштаб до 100% и прокручиваем страницу к нижней области листа.
Хотелось бы чтоб прямоугольник оказался в видимой области листа (например, в центре той части что я вижу).
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 07/21/2008 :  10:35:52
Реализовать можно, но для Visio такая задача очень необычна. Шейп обычно привязан к листу, а здесь Вы пытаетесь заставить его непрерывно перемещаться...
Без макросов скорее всего не реализуется.
С макросами сделать можно примерно так:
- написать обработчик для события WindowChanged или ViewChanged (уточнить практически по требуемому поведению);
- в обработчике с помощью GetViewRect ловить координаты видимой части страницы и в соответствии с ними изменять PinX, PinY перемещаемого шейпа.
Еще надо будет разобраться с противоречиями, если Вы захотите переместить этот шейп вручную. И обработчики инициализировать (например при открытии документа).
Go to Top of Page

sars

17 Posts

Posted - 07/21/2008 :  13:58:59
Спасибо за совет, получилось добиться перемещения шейпа по нажатию "кнопки", на которой весит процедура пересчитывающая кординаты шейпа. А как сделать, чтоб эта процедура выполнялась постоянно пока открыт документ (чтоб мне не жмакать постоянно "кнопку")?
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 07/21/2008 :  17:34:37
Вот код, демострирующий идею:
Dim WithEvents vw As Window
Dim doubleLeft As Double, doubleTop As Double, doubleWidth As Double, doubleHeight As Double

Private Sub Document_DocumentOpened(ByVal doc As IVDocument)
    Set vw = ActiveDocument.Application.Windows(1)
    RePos
End Sub

Private Sub vw_ViewChanged(ByVal Window As IVWindow)
    RePos
End Sub

Private Sub RePos()
    On Error Resume Next
    vw.GetViewRect doubleLeft, doubleTop, doubleWidth, doubleHeight
    ActivePage.Shapes(1).Cells("PinX") = doubleLeft + doubleWidth / 2
    ActivePage.Shapes(1).Cells("PinY") = doubleTop - doubleHeight / 2
    On Error GoTo 0
End Sub

При открытии документа объект vw (окно Visio) начинает генерировать события, в том числе и ViewChanged.
При каждом перемещении окна вызывается обработчик ViewChanged, который обращается к процедуре RePos.
Процедура RePos помещает первый шейп активной страницы в центр экрана.
On Error - простенькая защита от ошибки при выключении (надо бы покорректнее, но в задачу это не входит).
Go to Top of Page

sars

17 Posts

Posted - 07/22/2008 :  12:06:37
Класс!!! Большое спасибо :)
Но есть маленькая проблемка. Шейп(у меня это "легенда") я размещаю в правом верхнем углу. Коэффициенты, которые я подобрал идеально подходят для масштаба 100% (который устанавливается в меню Вид). Если я меняю масштаб, то эти коэффициенты уже не работают и шейп начинает смещаться ближе к центру, либо уходит за пределы видимой области.

Хотел использовать разные коеффициенты в зависимости от масштаба, но не смог найти параметр отвечающий за его текущее значение. Можете подсказать, есть такой и как называется? Или может, есть другой вариант попроще?

И второй вопрос: как лучше поступить при изменении масштаба, чтобы шейп менял свои размеры и размер шрифта?
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 07/22/2008 :  16:15:46
Если в меню "Вид", то это скорее всего Zoom.
Он читается как свойство окна. В моем примере это vw.Zoom
Принимает значение от 0,05 (5%) до 9,99 (999%).
А как поступить... - что-нибудь на что-нибудь домножать в зависимости от этого значения.
Но сама идея такого шейпа мне совершенно не нравится. А нельзя было эту легенду в окошке "Custom properties" показать? Или по клавише формочку с этими сведениями показывать. В крайнем случае свое прикрепленное окно приделать...
Go to Top of Page

sars

17 Posts

Posted - 07/23/2008 :  11:26:16
Спасибо!

Все это от скудного опыта и знаний :) Дело в том, что у меня в легенде отображаются шейпы (фигуры) с их описанием. В "Custom properties" на вряд ли получится такое изобразить. В форме я тоже не уверен, т.к. не представляю как на нее добавить фигуру?

Прикрепленное окно - это, то что обсуждалось здесь?
http://www.visio.artberg.ru/forum/topic.asp?TOPIC_ID=1794

Если так, то у меня не получилось его создать. Выдает следующую ошибку: Constants, fixed-length strings, arrays, user-defined types, and Declare statements not allowed as Public members of an object module. Видимо какая то проблема с объявлением констант ...
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)