Форум пользователей Visio

Форум по вопросам применения и программирования в Visio
Текущее время: 28 мар 2024, 21:06

Часовой пояс: UTC + 3 часа [ Летнее время ]


Правила форума


При размещении файлов предпочтительным является формат vsd (а не vsdx/vsdm)
Размещая ваши вложения на форуме не используйте имена файлов содержащих кириллицу, в противном случае файл будет иметь имя .<расширение файла> !

Для форматирования ваших сообщений используйте BBCodes, описание используемых на форуме BBCodes.



Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Работа с Visio в C#
СообщениеДобавлено: 26 фев 2016, 21:47 
Не в сети

Зарегистрирован: 26 фев 2016, 21:38
Сообщений: 7
Использую Visio c: 2016
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Доброго времени суток! Передо мною стала непреодолимая задача по использованию Visio в C#. Являюсь новичком в самом C#, поэтому даже три дня и три ночи не помогли мне сдвинуться с мертвой точки :cry: . Выручайте, братцы!
У меня есть оконное приложение WindowsForms, в котором я открываю текстовый файл, где указаны города, с дорогами между ними (тут всё просто и понятно). Проблема в следующем. На основе файла нужно построить граф при помощи Visio. Также впервые в жизни столкнулся с этим графическим редактором. Прочитав множество различных статей на подобие этой https://msdn.microsoft.com/ru-ru/library/cc160740.aspx, в голове осталась полная каша, не понятно даже, с чего стоит начинать подобную работу :wall:


Последний раз редактировалось Zensheaver 26 фев 2016, 22:21, всего редактировалось 1 раз.

Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Работа с Visio в C#
СообщениеДобавлено: 26 фев 2016, 23:04 
Не в сети
Content manager
Content manager
Аватара пользователя

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 5043
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Интеграция системных интеграторов
Должность: Дизайнер по оформлению документации
Уровнь квалификации: Форматирование документов MS Word
Zensheaver писал(а):
Являюсь новичком в самом C#
у нас немного знатоков шарпа.
Zensheaver писал(а):
впервые в жизни столкнулся с этим графическим редактором
объектная модель данного редактора
Surrogate в сообщении #8155 писал(а):
Объектная модель MS Visio ( ↓ картинка кликабельна)
Содержимое спрятано под спойлер ↓
Спойлер:
Zensheaver писал(а):
На основе файла нужно построить граф при помощи Visio
если есть понимание, каким должен быть алгоритм. кинь картинку попытаюсь помочь, правда в вба. с теорией графов я тоже не знаком Изображение

_________________
База знаний ShapeSheet
Мой Youtube-канал @surrogate-tm
Мои трафареты


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Работа с Visio в C#
СообщениеДобавлено: 27 фев 2016, 00:38 
Не в сети

Зарегистрирован: 26 фев 2016, 21:38
Сообщений: 7
Использую Visio c: 2016
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
В том то и дело, что я не могу даже продумать алгоритм, не зная возможности Visio в C#. Но с этим, я думаю, справлюсь, если узнаю, как нарисовать хотя бы простое логическое дерево, как открыть "холст", на котором будет изображение — как попросту добраться до графических опций Visio через C#.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Работа с Visio в C#
СообщениеДобавлено: 27 фев 2016, 01:11 
Не в сети
Content manager
Content manager
Аватара пользователя

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 5043
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Интеграция системных интеграторов
Должность: Дизайнер по оформлению документации
Уровнь квалификации: Форматирование документов MS Word
Zensheaver писал(а):
не зная возможности Visio в C#
думаю, что практически все что можно сделать ручками в визио, можно сделать программно в шарпе
для меня и логическое дерево - "китайская грамота", но подозреваю что это обсуждение близко по смыслу
По-моему единственная ожидаемая трудность - подобрать алгоритм авторазмещения. То есть вычислить, в какую точку ставить очередной шейп, чтобы схема получилась красивой, без большого количества пустот и наползания шейпов друг на друга.

_________________
База знаний ShapeSheet
Мой Youtube-канал @surrogate-tm
Мои трафареты


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Работа с Visio в C#
СообщениеДобавлено: 27 фев 2016, 02:41 
Не в сети
Ветеран
Аватара пользователя

Зарегистрирован: 28 апр 2013, 14:03
Сообщений: 963
Откуда: Вена, Австрия
Использую Visio c: 1998
Очков репутации: 100614

Добавить очки репутацииУменьшить очки репутации
Задача называется "визуализация графа" (алгоритм размещения фигур)
Visio такое не умеет.

_________________
Полезные инструменты для создания диаграмм Visio:
https://unmanagedvisio.com/


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Работа с Visio в C#
СообщениеДобавлено: 27 фев 2016, 08:40 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 2253
Очков репутации: 100626

Добавить очки репутацииУменьшить очки репутации
Ну, немножко-то умеет...
Вот, например, как он переразмещает граф штатными средствами.
Одна картинка получена своим примитивным алгоритмом. Просто чтобы хоть как-то прорисовать граф.
Другая - результат выполнения ActivePage.Layout.
По-моему вполне прилично переделывает.
Это при вот таких параметрах:
Код:
    ActivePage.PageSheet.CellsSRC(visSectionObject, visRowPageLayout, visPLOPlaceStyle).FormulaForceU = "23"
    ActivePage.PageSheet.CellsSRC(visSectionObject, visRowPageLayout, visPLORouteStyle).FormulaForceU = "16"
    ActivePage.PageSheet.CellsSRC(visSectionObject, visRowPageLayout, visPLOLineRouteExt).FormulaForceU = "2"


Вложения:
Комментарий к файлу: результат Layout
g2.png
g2.png [ 24.68 Кб | Просмотров: 2770 ]
Комментарий к файлу: исходное изображение
g1.png
g1.png [ 25.59 Кб | Просмотров: 2802 ]
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Работа с Visio в C#
СообщениеДобавлено: 27 фев 2016, 09:02 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 2253
Очков репутации: 100626

Добавить очки репутацииУменьшить очки репутации
При этом узлы размещались просто "в шеренгу по 4" (первичный алгоритм).
(Перечень узлов в коллекции Col1.
Код:
    j = 1
    For i = 1 To Col1.Count
        Set mas = doc.Masters("nod")
        Set shp = page.Drop(mas, j, ((i - 1) Mod 4) + 1)
        Col3.Add shp
        shp.Text = Col1(i)
        shp.Cells("Prop.v").Formula = """"""
        If i Mod 4 = 0 Then j = j + 2
    Next

И соединялись по коллекции связей Col2
Код:
    For i = 1 To Col2.Count
        Set mas = doc.Masters(LinkType)
        Set shp = page.Drop(mas, 1, 1)
        pos1 = 0
        pos2 = 0
        For j = 1 To Col1.Count
            If Col1(j) = Col2(i).Node1 Then pos1 = j
            If Col1(j) = Col2(i).Node2 Then pos2 = j
        Next
        shp.CellsU("BeginX").GlueTo Col3(pos1).Cells("PinX")
        shp.CellsU("EndX").GlueTo Col3(pos2).Cells("PinX")
        If StrComp(LinkType, "conD") = 0 Then
            shp.Cells("Prop.C").Formula = Chr(34) & Col2(i).Weight & Chr(34)
        Else
            shp.Text = Col2(i).Weight
        End If
    Next


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Работа с Visio в C#
СообщениеДобавлено: 27 фев 2016, 09:11 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 2253
Очков репутации: 100626

Добавить очки репутацииУменьшить очки репутации
Перекодировать это с VBA на C# довольно легко...
Но, как мне кажется, новичку не следует начинать с C#. Знакомиться с объектной моделью Visio лучше на VBA. Больше примеров, гораздо удобнее отладка, есть возможность записи макросов.
Так что я посоветовал бы сначала решить задачу на VBA, потом перекодировать.
Ну, это если задача состоит в том, чтобы научиться или показать, что умеешь писать программы.
А если нужно просто нарисовать граф по имеющимся данным, можно попытаться применить вот это дополнение
http://visio-all.blogspot.ru/2014/11/gr ... visio.html
Там есть режим импорта данных из Excel.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Работа с Visio в C#
СообщениеДобавлено: 28 фев 2016, 00:02 
Не в сети

Зарегистрирован: 26 фев 2016, 21:38
Сообщений: 7
Использую Visio c: 2016
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
В первую очередь задача поставлена как практика на C#, поэтому тут я ограничен. Да и VBA я увидел впервые в жизни. За 5 месяцев изучения наук программирования, успел ознакомиться только с основами C#.
Можете, пожалуйста, показать весь код, попробую найти людей, которые помогут перекодировать на C#.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Работа с Visio в C#
СообщениеДобавлено: 28 фев 2016, 00:58 
Не в сети
Ветеран
Аватара пользователя

Зарегистрирован: 28 апр 2013, 14:03
Сообщений: 963
Откуда: Вена, Австрия
Использую Visio c: 1998
Очков репутации: 100614

Добавить очки репутацииУменьшить очки репутации
IMHO, озвученная задача не подходит для практики по программированию. к C# или VBA она в общем имеет отдаленное отношение, это скорее чисто математическая задача. Но вообще в природе для ее решения есть ряд (нетривиальных) библиотек, типа MSAGL например. Я бы посоветовал для освоения C# поискать что попроще (потренироваться на кошках)

С другой стороны, может у тебя что и получится - тогда при встрече с меня пиво :)

_________________
Полезные инструменты для создания диаграмм Visio:
https://unmanagedvisio.com/


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Работа с Visio в C#
СообщениеДобавлено: 28 фев 2016, 02:04 
Не в сети
Content manager
Content manager
Аватара пользователя

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 5043
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Интеграция системных интеграторов
Должность: Дизайнер по оформлению документации
Уровнь квалификации: Форматирование документов MS Word
Оффтоп:
nbelyh писал(а):
тогда при встрече с меня пиво :)
будет тебе пиво, ты только скажи когда будешь в МСК! Изображение

_________________
База знаний ShapeSheet
Мой Youtube-канал @surrogate-tm
Мои трафареты


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Работа с Visio в C#
СообщениеДобавлено: 01 май 2016, 16:49 
Не в сети

Зарегистрирован: 26 фев 2016, 21:38
Сообщений: 7
Использую Visio c: 2016
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Tumanov писал(а):
При этом узлы размещались просто "в шеренгу по 4" (первичный алгоритм).
(Перечень узлов в коллекции Col1.
Код:
    j = 1
    For i = 1 To Col1.Count
        Set mas = doc.Masters("nod")
        Set shp = page.Drop(mas, j, ((i - 1) Mod 4) + 1)
        Col3.Add shp
        shp.Text = Col1(i)
        shp.Cells("Prop.v").Formula = """"""
        If i Mod 4 = 0 Then j = j + 2
    Next

И соединялись по коллекции связей Col2
Код:
    For i = 1 To Col2.Count
        Set mas = doc.Masters(LinkType)
        Set shp = page.Drop(mas, 1, 1)
        pos1 = 0
        pos2 = 0
        For j = 1 To Col1.Count
            If Col1(j) = Col2(i).Node1 Then pos1 = j
            If Col1(j) = Col2(i).Node2 Then pos2 = j
        Next
        shp.CellsU("BeginX").GlueTo Col3(pos1).Cells("PinX")
        shp.CellsU("EndX").GlueTo Col3(pos2).Cells("PinX")
        If StrComp(LinkType, "conD") = 0 Then
            shp.Cells("Prop.C").Formula = Chr(34) & Col2(i).Weight & Chr(34)
        Else
            shp.Text = Col2(i).Weight
        End If
    Next

К кому можно обратиться с перекодировкой на C#?

Не совсем понятно, зачем нужна Col3, и что делаем в этих строчках:
Код:
Set mas = doc.Masters("nod")

Код:
shp.Cells("Prop.v").Formula = """"""

Код:
Set mas = doc.Masters(LinkType)

Код:
If Col1(j) = Col2(i).Node1 Then pos1 = j

Код:
If StrComp(LinkType, "conD") = 0 Then
            shp.Cells("Prop.C").Formula = Chr(34) & Col2(i).Weight & Chr(34)


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Работа с Visio в C#
СообщениеДобавлено: 01 май 2016, 18:19 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 2253
Очков репутации: 100626

Добавить очки репутацииУменьшить очки репутации
Ну, это же просто фрагменты, вырванные из программы. Их нужно использовать не буквально, а по принципу "как-то так".
Col3 - коллекция шейпов. В одном месте шейпы создаются, в другом соединяются. Коллекция помогает сохранить их в порядке появления (чтобы потом легче искать было).
Set mas = doc.Masters("nod") - выбирается мастер-шейп с именем "nod" из Document stencil.
shp.Cells("Prop.v").Formula = """""" - не существенно (было нужно в прикладной задаче). Очищается Custom properties.
Set mas = doc.Masters(LinkType) - выбирается нужный мастер-шейп коннектор (ьам их было несколько разных).
If Col1(j) = Col2(i).Node1 Then pos1 = j - в коллекции связей есть имена узлов. В этом цикле для одной связи просматривается колелкция имен шейпов и выбираются индексы двух связываемых шейпов. Потом эти индексы используются в GlueTo.
If StrComp(LinkType, "conD") = 0 Then
shp.Cells("Prop.C").Formula = Chr(34) & Col2(i).Weight & Chr(34) - Если для связи использован коннектор "conD", то в его Custom Properties заносится вес связи.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Работа с Visio в C#
СообщениеДобавлено: 02 май 2016, 20:26 
Не в сети

Зарегистрирован: 26 фев 2016, 21:38
Сообщений: 7
Использую Visio c: 2016
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Tumanov, большое спасибо! Всё получилось, за исключением автоматического расширения рабочей страницы при выходе фигур за её границу, т.е. добавление листа А4 с той стороны, где вылазит какая-нибудь фигурка. Вот тут, например, их нужно добавить по бокам:

Изображение

В параметрах страницы, во вкладке "Размер страницы" указан параметр "Автоматическое расширение страницы при необходимости", однако это происходит, только когда задействована большая часть страницы. Получается, мне нужно вручную проверять, что и где вылезает. Как быть?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Работа с Visio в C#
СообщениеДобавлено: 02 май 2016, 21:33 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 2253
Очков репутации: 100626

Добавить очки репутацииУменьшить очки репутации
Можно просто установить размер по содержимому.
Код:
Application.ActivePage.ResizeToFitContents


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Работа с Visio в C#
СообщениеДобавлено: 02 май 2016, 21:37 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 2253
Очков репутации: 100626

Добавить очки репутацииУменьшить очки репутации
Или посмотреть BoundingBox и решать далее в зависимости от его размеров. Примерно так:
Код:
    Dim x0 As Double, y0 As Double, x1 As Double, y1 As Double
    ActivePage.BoundingBox 1, x0, y0, x1, y1    'Get shapes area
    If ((x1 - x0) > 8.5 Or (y1 - y0) > 11) Then
        ActivePage.ResizeToFitContents
    Else
        ActivePage.PageSheet.Cells("PageWidth") = 8.5
        ActivePage.PageSheet.Cells("PageHeight") = 11
        ActivePage.CenterDrawing
    End If

(Это я опять фрагменты выдираю...)


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Работа с Visio в C#
СообщениеДобавлено: 16 май 2016, 10:27 
Не в сети

Зарегистрирован: 26 фев 2016, 21:38
Сообщений: 7
Использую Visio c: 2016
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Не подскажите, как можно добавлять обычный текст на страницу по известным координатам, причем по центральным координатам текстового поля? Нашёл только такое, но неужели нет ничего проще?

Код:
Sub InsertText()
Dim vsoShape1 As Visio.Shape
Dim vsoCharacters2 As Visio.Characters
   
    Set vsoShape1 = Application.ActiveWindow.Page.DrawRectangle(0#, 11.181102, 8.267717, 11.653543)
    vsoShape1.TextStyle = "Normal"
    vsoShape1.LineStyle = "Text Only"
    vsoShape1.FillStyle = "Text Only"
   
    Set vsoCharacters2 = vsoShape1.Characters
    vsoCharacters2.Text = "ТекстТекстТекст"
   
End Sub


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Работа с Visio в C#
СообщениеДобавлено: 16 май 2016, 11:59 
Не в сети
Content manager
Content manager
Аватара пользователя

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 5043
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Интеграция системных интеграторов
Должность: Дизайнер по оформлению документации
Уровнь квалификации: Форматирование документов MS Word
Zensheaver
ага ! макрорекордер рулит :)
только в приведенном тобой коде не точно по заданию сделано.
Zensheaver писал(а):
причем по центральным координатам текстового поля
Код:
Sub p9013()
Dim sh As Shape
Dim px As Single, py As Single ' координаты середины текста в мм
Const W = 100 ' ширина текста 100мм
Const H = 10 ' высота текста 10мм
px = 150 ' координата x
py = 250 ' координата y
Set sh = Application.ActiveWindow.Page.DrawRectangle((px - W / 2) / 25.4, (py - H / 2) / 25.4, (px + W / 2) / 25.4, (py + H / 2) / 25.4)
sh.TextStyle = "Normal"
sh.LineStyle = "Text Only"
sh.FillStyle = "Text Only"
sh.Text = "trash"
End Sub
в моем коде тоже есть костыль, я заложил фиксированную высоту/ширину текста
Zensheaver писал(а):
но неужели нет ничего проще?
а что тут сложного ?

_________________
База знаний ShapeSheet
Мой Youtube-канал @surrogate-tm
Мои трафареты


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Работа с Visio в C#
СообщениеДобавлено: 16 май 2016, 19:58 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 2253
Очков репутации: 100626

Добавить очки репутацииУменьшить очки репутации
Если пользоваться не DrawRectangle, а Drop текстового мастер-шейпа с заранее установленными стилями, то три строчки можно выкинуть.
А если еще и габариты постоянные, то еще пара строк выбрасывается. (Это для примера от Surrogate).
И текст можно посылать прямо в Shape.Text, без Characters. (Как у Surrogate).


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Работа с Visio в C#
СообщениеДобавлено: 17 май 2016, 19:16 
Не в сети

Зарегистрирован: 26 фев 2016, 21:38
Сообщений: 7
Использую Visio c: 2016
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Как можно получить ссылку на скопированную и вставленную на другую страницу фигуру?
К примеру, вот обычный метод-копипаст, где нужно изменить ссылку shp на ссылку вставленной фигуры:
Код:
private static void copyAndPasteShape(ref Visio.Shape shp, Visio.Page pastePage)
   {
          shp.Copy();
          pastePage.Paste();

    }


Последний раз редактировалось Zensheaver 19 май 2016, 11:34, всего редактировалось 6 раз(а).

Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Вы можете создать форум бесплатно PHPBB3 на Getbb.Ru, Также возможно сделать готовый форум PHPBB2 на Mybb2.ru
Русская поддержка phpBB