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

Borg

Kazakhstan
20 Posts

Posted - 01/18/2006 :  12:47:17
Народ во какая задача.
Во первый приложение пишется на c# с помощью компонента DrawingControl.
Во-вторых необходимо создать шейп на который можно было нажимать в определённом месте и получить идин результат, а нажав в другом другой как в Visual Studio 2005 ClassDiagram.
И в третих может ли шейп хранить под собой данные.
Если кто не знает как сделать, но знает где можно посмотреть почитать большая просьба откликнитесь.

brace

Russia
358 Posts

Posted - 01/18/2006 :  14:01:44
может есть что полезное здесь

http://msdn.microsoft.com/office/understanding/visio/



Go to Top of Page

Borg

Kazakhstan
20 Posts

Posted - 01/18/2006 :  14:26:02
Я просмотрел всю имформацию которую предлагают MS и очень сильно огорчился скудностью и разнообразием инфы касающимся Visio :(. По третьиму пункту я нашёл решение. А вот как сделать шейп что бы внутри него можно було нажимать кнопку и допустим вносишь название оно отображается внутри шейпа сверху жирным шрифтом, а коментарий ниже обыкновынным и внизу кнопку нажимая на которую выводится диалог в котором можно поменять название и коментарий(думаю диалог будет делаться средствами c#). Заранее прошу прощения если не понятно объяснил чего хочу :)
Go to Top of Page

immortal

Russia
391 Posts

Posted - 01/18/2006 :  15:33:06  Visit immortal's Homepage
Дак это можно решить другими средствами, и даже средствами шейпа, т.е. должна быть группа с несколькими элементами, у группы должны быть кустом проперти, а у элементов "текст" связь с кустом пропертями группы, запускать кустом проперти соответственно DOCMD по событию допустим двойной клик, можно конечно повесить это на код, но зачем... если уж вешать на код, то тоже в принципе можно, но только надо отслеживать события и координаты курсора со всеми вытекающими от сюда последствиями.

визио 2003 форэвер

...а вобще-то я белый и пушистый.

Edited by - immortal on 01/18/2006 15:33:42
Go to Top of Page

brace

Russia
358 Posts

Posted - 01/18/2006 :  15:33:41
допустим у тебя есть шейп = КАМАЗ вид сбоку в масштабе 1:100
на этот шейп посади два маленьких кружка Circle Shape
они будут выполнять роль кнопок
каждому шейпу визио присваивает уникальный <id>
кликом на первый круг делаешь видимым шейп с первым текстом
кликом на второй круг -- шейп со вторым текстом
шейп с текстом может быть любой формы = прямоугольник эллипс и тд.
после двойного клика на тексте его можно редактировать.



Go to Top of Page

immortal

Russia
391 Posts

Posted - 01/18/2006 :  15:35:13  Visit immortal's Homepage
quote:
после двойного клика на тексте его можно редактировать
ну это зависит от того что повешено на событие "двойной клик".

визио 2003 форэвер

...а вобще-то я белый и пушистый.
Go to Top of Page

Borg

Kazakhstan
20 Posts

Posted - 01/19/2006 :  06:50:04
Большо спасибо за ответы.
>> immortal
Что такое DOCMD?
>> Brace
Ок по нажатию будет менятся текст, но будет ли он днамически изменять размер шейпа так как я не знаю какой текст будет загружен.

А как сделать что бы показывалось не возможность соединенния между шейпами допустим квадрат можно соединить только с квадратом, а круг с кругом.
Вообще хотелось бы ( вернее необходимо :) ) сделать аналог ClassDiagram из VS 2005 и работать с ним из C#.
Go to Top of Page

immortal

Russia
391 Posts

Posted - 01/19/2006 :  08:45:22  Visit immortal's Homepage
DOCMD это команды, которые запускются из ячеек шейплиста, описание всех команд можно посмотреть тут http://www.prodigitall.narod.ru/docs/docmd.txt
в данном случае, чтобы по двойному клику выводилось окно кустом проперти необходимо написать =DOCMD(1312), в ячейку EventDblClick

quote:
но будет ли он днамически изменять размер шейпа так как я не знаю какой текст будет загружен.
возможно связать размер шейпа с блоком Text Tranform, я не знаю как добится того, чтобы был блок Text Fields, именно его я использую под текст со связью с кустом пропертях, рекомендую, если не найдёте другого, изменять например шейп Vertical outside в Dimensioning - Engineering, там есть этот блок.

quote:
А как сделать что бы показывалось не возможность соединенния между шейпами допустим квадрат можно соединить только с квадратом, а круг с кругом.
повесить макрос на событие и отслеживать к какому шейпу приконнективается, если к неправильному, тогнда делать дисконнект.

quote:
Вообще хотелось бы ( вернее необходимо :) ) сделать аналог ClassDiagram из VS 2005 и работать с ним из C#.
не знаю, не юзал, опишите подробно, может и ответ найдётся, вобще можно посмотреть http://www.prodigitall.narod.ru и http://visio.artberg.ru/faq.htm

визио 2003 форэвер

...а вобще-то я белый и пушистый.
Go to Top of Page

brace

Russia
358 Posts

Posted - 01/19/2006 :  08:56:33
quote:
по нажатию будет менятся текст, но будет ли он днамически изменять размер шейпа так как я не знаю какой текст будет загружен.

по нажатию кнопки заранее созданный шейп с текстом может показываться или исчезать = это можно сделать без программирования.
что такое VS 2005 и С# извини не знаю.
Go to Top of Page

Borg

Kazakhstan
20 Posts

Posted - 01/19/2006 :  09:12:12
>> VS 2005 - MicroSoft Visual Studio 2005, а c# - это язык програмирования из .NET, произносится - си шарп.
Я не знаю как поместить картинку на этот форум и можно ли вообще :( там пример того что должно получится. Как быть?
Go to Top of Page

Borg

Kazakhstan
20 Posts

Posted - 01/19/2006 :  09:16:33
>> Brace
К сожелению мне необходимо более динамичная конструкция которая будет автоматически менять свои размеры в зависимости от количества отображаемого текста, как в Word когда пишешь внутри прямоугольника если не помещается текст он автоматически увелчивает свой размер.
Go to Top of Page

immortal

Russia
391 Posts

Posted - 01/19/2006 :  09:32:03  Visit immortal's Homepage
quote:
К сожелению мне необходимо более динамичная конструкция которая будет автоматически менять свои размеры в зависимости от количества отображаемого текста, как в Word когда пишешь внутри прямоугольника если не помещается текст он автоматически увелчивает свой размер.
Всё описывается в шейп листе, без всякого си #,
повторюсь:
quote:
возможно связать размер шейпа с блоком Text Tranform, я не знаю как добится того, чтобы был блок Text Fields, именно его я использую под текст со связью с кустом пропертях, рекомендую, если не найдёте другого, изменять например шейп Vertical outside в Dimensioning - Engineering, там есть этот блок.


в принципе можно посмотреть как это работает в моих мастершейпах, а именно "провод" и "опора".

могу также дать исходник адд-он подпрограммы на васике, который работает с коннектион поинтсами, и отслеживает к какой фигуре приконнективается шейп, и делает необходимые действия при коннекте.

визио 2003 форэвер

...а вобще-то я белый и пушистый.
Go to Top of Page

Borg

Kazakhstan
20 Posts

Posted - 01/19/2006 :  11:37:22
Да было бы отлично:). я читал статью про то как если нажимаешь на шейп
другой то прячется то показывается, не подскажите где есть про это описание. И всё таки как вам передать картинку?
Go to Top of Page

immortal

Russia
391 Posts

Posted - 01/19/2006 :  12:10:24  Visit immortal's Homepage
шлите картинки на мыло immortal@mh.vstu.edu.ru

скрипт завтра постораюсь выложить, что касается видимости: видимость определяется в секции Геометрия шейп листа, но рекомендую использовать ссылки на ячейки пользователя для видимости, т.е. устанавливать видимость в юзер ячейках с уникальным для данного шейпа именем юзер ячейки, а далее возможно с помощью внешней программы менять значение этой ячейки, т.е. видно/невидно.
если вынести это в кустом проперти, то можно менять через кустом проперти, как сделано у меня в мастер-шейпе "опора"

визио 2003 форэвер

...а вобще-то я белый и пушистый.
Go to Top of Page

immortal

Russia
391 Posts

Posted - 01/19/2006 :  12:45:46  Visit immortal's Homepage
вот код, он правда староват, сейчас уже переработан, но для данного случая это подходит.


Public vis As Object 'определяем глобальную переменную

Sub Main()

'On Error Resume Next ' не выдавать сообщения об ошибках и выходить из программы, рекомендуется заремить на стадии отладки

If App.PrevInstance = True Then ' если подпрограмма уже запущена, то не запускается второй раз, а передаётся запущенной программе где electrics её имя
AppActivate "electrics"
End
End If

Set vis = GetObject(, "Visio.Application") 'делаем ссылку на объект визио
dim ss

ss = vis.Application.ActiveWindow.Page.Shapes.Count 'количество шейпов, если необходимо сделать цикл по всем шейпам на листе

Dim i:Dim n:Dim s:Dim bg:Dim bg1 'определение переменных, в ВБА не обязательно


Dim vsoSelection As Visio.Selection 'делаем ссылку
Set vsoSelection = vis.ActiveWindow.Selection 'на выделенный объект(ы)


For i = 1 To vsoSelection.Count 'цикл по выделенным объектам, если необходимо только один объект, тогда это убираем и везде вместо i ставим 1, макрос будет работать с объектом выделенным первым.


bg = vsoSelection.Item(i).CellsSRC(visSectionObject, visRowXForm1D, vis1DBeginX) _
.FormulaU ' считываем формулу с ячейки в шейплисте BeginX
n = InStr(1, bg, "!") 'определяем приконнектена ли к чему нибудь шейп - линия

If n = 0 Then 'если не приконнектен, тогда

vsoSelection.Item(i).Cells("User.dh1").FormulaU = 0 'записываем в юзер ячейку необходимые значения, если у нас шейп не правильный, тогда мы ничего не напортим, т.к. имя юзер ячейки уникально и характерно для данного типа шейпа

Else 'есть коннект, тогда:
bg1 = Mid(bg, 9, n - 8) ' вычисляем имя шейпа к которому приконектился наш шейп, далее можно проверить это имя на соответствие
bg1 = "ABS(" & bg1 & "Prop.h - Prop.h)"
vsoSelection.Item(i).Cells("User.dh1").FormulaU = bg1
'выше 2 строки: записываем формулу в наш шейплист со ссылкой на данные шейпа к которому приконектилось, теперь при изменении Prop.h во втором шейпе, автоматом произойдут изменения в нашем шейпе, а именно в ячейке User.dh1 (она уникальна)
End If

'ниже идёт такойже код, только теперь с ячейкой EndX, соответственно для второго конца линии
bg = vsoSelection.Item(i).CellsSRC(visSectionObject, visRowXForm1D, vis1DEndX) _
.FormulaU
n = InStr(1, bg, "!")
If n = 0 Then
vsoSelection.Item(i).Cells("User.dh2").FormulaU = 0
Else
bg1 = Mid(bg, 9, n - 8)
bg1 = "ABS(" & bg1 & "Prop.h - Prop.h)"
vsoSelection.Item(i).Cells("User.dh2").FormulaU = bg1
End If

Next i 'конец цикла

End Sub






визио 2003 форэвер

...а вобще-то я белый и пушистый.

Edited by - immortal on 01/19/2006 12:51:32
Go to Top of Page

brace

Russia
358 Posts

Posted - 01/19/2006 :  14:16:09
визио содержит несметное число шейпов
всех наверное никто и не знает.
шутники программеры подложили мне нужный шейп под нос
называется он Auto size box
найти его можно через поле поиска Search for Shapes
оно слева находится где трафареты = стенсилы.
Go to Top of Page
Previous Topic Topic Next Topic  
Next Page
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)