Skip to content

Commit

Permalink
Исправлен экспорт в Visio
Browse files Browse the repository at this point in the history
  • Loading branch information
lintest committed Dec 13, 2020
1 parent 087add9 commit 855ab7f
Show file tree
Hide file tree
Showing 2 changed files with 127 additions and 109 deletions.
234 changes: 126 additions & 108 deletions Example/Forms/Form/Ext/Form/Module.bsl
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
МакетКомпоненты = ОбработкаОбъект.ПолучитьМакет("GraphViz1C");
АдресКомпоненты = ПоместитьВоВременноеХранилище(МакетКомпоненты, УникальныйИдентификатор);
Expand All @@ -12,23 +12,23 @@

&НаКлиенте
Процедура ПриОткрытии(Отказ)

ИдентификаторКомпоненты = "_" + СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
ВыполнитьПодключениеВнешнейКомпоненты(Истина);

ДанныеГрафа = "
|digraph G {
| node [shape=box];
| Корень -> Распознать -> Выполнить;
| Корень -> Инициализация;
| Корень -> Очистить;
| Выполнить -> Получить;
| Выполнить -> Распечатать
| Инициализация -> Получить;
| Корень -> Распечатать;
| Выполнить -> Сравнить;
|}
|";
|digraph G {
| node [shape=box];
| Корень -> Распознать -> Выполнить;
| Корень -> Инициализация;
| Корень -> Очистить;
| Выполнить -> Получить;
| Выполнить -> Распечатать
| Инициализация -> Получить;
| Корень -> Распечатать;
| Выполнить -> Сравнить;
|}
|";

КонецПроцедуры

Expand Down Expand Up @@ -64,10 +64,10 @@

&НаКлиенте
Процедура СформироватьКартинку()

ОписаниеОповещения = Новый ОписаниеОповещения("ПолученаКартинка", ЭтаФорма);
ВнешняяКомпонента.НачатьВызовСформировать(ОписаниеОповещения, ДанныеГрафа, "svg");

КонецПроцедуры

&НаКлиенте
Expand All @@ -88,19 +88,19 @@
Поток = ДанныеКартинки.ОткрытьПотокДляЧтения();
ЧтениеТекста = Новый ЧтениеТекста(Поток, КодировкаТекста.UTF8);
ТекстHTML =
"<html>
|<head>
|<meta http-equiv=""X-UA-Compatible"" content=""IE=edge"">
|<style>html,body{width: 100%; height: 100%; margin:0; padding:0}</style>
|</head>
|<body onload=""var svg = document.querySelector('svg');svg.removeAttribute('width');svg.removeAttribute('height');"">
|<div align=""center"" style=""display:table; width:100%; height:100%;"">
|<div style=""display:table-cell; vertical-align:middle"">
|" + ЧтениеТекста.Прочитать() + "
|</div>
|</div>
|</body>
|</html>";
"<html>
|<head>
|<meta http-equiv=""X-UA-Compatible"" content=""IE=edge"">
|<style>html,body{width: 100%; height: 100%; margin:0; padding:0}</style>
|</head>
|<body onload=""var svg = document.querySelector('svg');svg.removeAttribute('width');svg.removeAttribute('height');"">
|<div align=""center"" style=""display:table; width:100%; height:100%;"">
|<div style=""display:table-cell; vertical-align:middle"">
|" + ЧтениеТекста.Прочитать() + "
|</div>
|</div>
|</body>
|</html>";

КонецПроцедуры

Expand All @@ -119,9 +119,9 @@

&НаКлиенте
Процедура ЭкспортVisio(Команда)

Попытка
Visio = Новый COMОбъект("Visio.Application");
Visio = Новый COMОбъект("Visio.Application");
Исключение
Сообщить("Не удалось создать объект Visio по причине: " + ОписаниеОшибки());
Возврат;
Expand All @@ -136,30 +136,76 @@
КонецПопытки;

Visio.Application.ScreenUpdating = True;
Visio.ActiveDocument.Saved = true;
Visio.ActiveDocument.Saved = True;
Visio = Неопределено;

КонецПроцедуры

&НаКлиенте
Функция СконвертироватьТочки(Текст)
Функция СконвертироватьТочки(Текст)

РазрешениеЭкрана = 96;
Координаты = СтрРазделить(Текст, " ", Ложь);
Для Номер = 0 По Координаты.Количество() - 1 Цикл
Точка = СтрРазделить(Координаты[номер], ",");
Координаты[номер] = Новый Структура("X,Y", Число(Точка[0]) / 96 + 1, - Число(Точка[1]) / 96 + 1);
Координаты[номер] = Новый Структура("X,Y"
, Число(Точка[0]) / РазрешениеЭкрана + 1
, -Число(Точка[1]) / РазрешениеЭкрана + 1
);
КонецЦикла;

Возврат Координаты;

КонецФункции

&НаКлиенте
Функция МаксимумМассива(Массив, Поле)

Количество = Массив.Количество();
Если Количество = 0 Тогда
Возврат Неопределено;
КонецЕсли;

Результат = Массив[0][Поле];
Для Номер = 1 По Количество - 1 Цикл
Значение = Массив[Номер][Поле];
Если Значение > Результат Тогда
Результат = Значение;
КонецЕсли;
КонецЦикла;

КонецФункции
Возврат Результат;

КонецФункции

&НаКлиенте
Процедура ПостроитьДиаграммуVisio(Visio, ДвоичныеДанные)
Функция МинимумМассива(Массив, Поле)

Количество = Массив.Количество();
Если Количество = 0 Тогда
Возврат Неопределено;
КонецЕсли;

Результат = Массив[0][Поле];
Для Номер = 1 По Количество - 1 Цикл
Значение = Массив[Номер][Поле];
Если Значение < Результат Тогда
Результат = Значение;
КонецЕсли;
КонецЦикла;

Возврат Результат;

КонецФункции

&НаКлиенте
Процедура ПостроитьДиаграммуVisio(Visio, ДвоичныеДанные)

VisioNewFile = Visio.Documents.Add("");
Попытка
Visio.Application.ActivePage.SetTheme(1, 1, 1, 1, 1); // тема MS Visio 2016
Попытка
Visio.Application.ActivePage.SetTheme(1, 1, 1, 1, 1); // тема MS Visio 2016
Исключение
// MS Visio 2010
// MS Visio 2010
Visio.Application.ActivePage.ThemeColors = "visThemeColorsBasic";
Visio.Application.ActivePage.ThemeEffects = "visThemeEffectsBasicShadow";
КонецПопытки;
Expand All @@ -181,67 +227,65 @@
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);

СоответствиеПространств = Новый Соответствие;
СоответствиеПространств.Вставить("svg","http://www.w3.org/2000/svg");
СоответствиеПространств.Вставить("svg", "http://www.w3.org/2000/svg");
Разыменователь = Новый РазыменовательПространствИменDOM(СоответствиеПространств);

Соответствие = Новый Соответствие;
Результат = ДокументDOM.ВычислитьВыражениеXPath("//svg:g[@class=""node""]", ДокументDOM, Разыменователь);
Результат = ДокументDOM.ВычислитьВыражениеXPath("//svg:g[@class=""node""]", ДокументDOM, Разыменователь);
Пока Истина Цикл
ТекущийУзел = Результат.ПолучитьСледующий();
Если ТекущийУзел = Неопределено Тогда Прервать КонецЕсли;
Если ТекущийУзел = Неопределено Тогда
Прервать;
КонецЕсли;
ИмяОбъекта = ПолучитьЗначение(ТекущийУзел, "title");
Представление = ПолучитьЗначение(ТекущийУзел, "text");
КоординатыСтр = ПолучитьАтрибут(ТекущийУзел, "polygon", "points");
Если Не ПустаяСтрока(КоординатыСтр) Тогда
ЦветЗаливки = ПолучитьАтрибут(ТекущийУзел, "polygon", "fill");
Координаты = СконвертироватьТочки(КоординатыСтр);
НовыйОбъект = Visio.ActiveWindow.Page.DrawRectangle(Координаты[0].X, Координаты[0].Y, Координаты[2].X, Координаты[2].Y);
НовыйОбъект = Visio.ActiveWindow.Page.DrawRectangle(
Координаты[0].X, Координаты[0].Y,
Координаты[2].X, Координаты[2].Y);
Иначе
КоординатыСтр = ПолучитьАтрибут(ТекущийУзел, "path", "d");
ЦветЗаливки = ПолучитьАтрибут(ТекущийУзел, "path", "fill");
КоординатыСтр = СтрЗаменить(КоординатыСтр, "M", ",");
КоординатыСтр = СтрЗаменить(КоординатыСтр, "C", ",");
КоординатыСтр = СтрЗаменить(КоординатыСтр, "M", " ");
КоординатыСтр = СтрЗаменить(КоординатыСтр, "C", " ");
Координаты = СконвертироватьТочки(КоординатыСтр);
X1 = Координаты[0].X;
Y1 = Координаты[0].Y;
X2 = Координаты[0].X;
Y2 = Координаты[0].Y;
Для Номер = 1 По Координаты.Количество() - 1 Цикл
X = Координаты[номер].X;
Y = Координаты[номер].Y;
X1 = ?(X < X1, X, X1);
Y1 = ?(Y < Y1, Y, Y1);
X2 = ?(X > X2, X, X2);
Y2 = ?(Y > Y2, Y, Y2);
КонецЦикла;
НовыйОбъект = Visio.ActiveWindow.Page.DrawRectangle(X1, Y1, X2, Y2);
НовыйОбъект = Visio.ActiveWindow.Page.DrawRectangle(
МинимумМассива(Координаты, "X"),
МинимумМассива(Координаты, "Y"),
МаксимумМассива(Координаты, "X"),
МаксимумМассива(Координаты, "Y"));
НовыйОбъект.Cells("Rounding").Formula = 0.1;
КонецЕсли;
НовыйОбъект.Name = ИмяОбъекта;
НовыйОбъект.Text = Представление;
Если ЦветЗаливки = "gold" Тогда
НовыйОбъект.CellsU("Fillforegnd").FormulaU = "RGB(255, 215, 0)";
ИначеЕсли ЦветЗаливки = "#a82f00" Тогда
НовыйОбъект.CellsU("Fillforegnd").FormulaU = "RGB(168, 47, 0)";
ИначеЕсли ЦветЗаливки = "white" Тогда
НовыйОбъект.CellsU("Fillforegnd").FormulaU = "RGB(255, 255, 255)";
ФормулаЦвета = "RGB(255, 215, 0)";
ИначеЕсли ЦветЗаливки = "#a82f00" Тогда
ФормулаЦвета = "RGB(168, 47, 0)";
Иначе
ФормулаЦвета = "RGB(255, 255, 255)";
КонецЕсли;
НовыйОбъект.CellsU("Fillforegnd").FormulaU = ФормулаЦвета;
Соответствие.Вставить(ИмяОбъекта, НовыйОбъект);
КонецЦикла;

Результат = ДокументDOM.ВычислитьВыражениеXPath("//svg:g[@class=""edge""]", ДокументDOM, Разыменователь);
Результат = ДокументDOM.ВычислитьВыражениеXPath("//svg:g[@class=""edge""]", ДокументDOM, Разыменователь);
Пока Истина Цикл
Директор = Ложь;
ТекущийУзел = Результат.ПолучитьСледующий();
Если ТекущийУзел = Неопределено Тогда Прервать КонецЕсли;
ИмяОбъекта = ПолучитьЗначение(ТекущийУзел, "title");
Если ТекущийУзел = Неопределено Тогда
Прервать;
КонецЕсли;
ИмяОбъекта = ПолучитьЗначение(ТекущийУзел, "title");
Представление = ПолучитьЗначение(ТекущийУзел, "text");

Если нрег(СокрЛП(Представление)) = "директор" ИЛИ Нрег(СокрЛП(Представление)) = "генеральный директор" Тогда
Директор = Истина
Если НРег(СокрЛП(Представление)) = "директор"
ИЛИ Нрег(СокрЛП(Представление)) = "генеральный директор" Тогда
Директор = Истина;
КонецЕсли;

Позиция = Найти(ИмяОбъекта, "->");
Позиция = СтрНайти(ИмяОбъекта, "->");
ЛевыйОбъект = Лев(ИмяОбъекта, Позиция - 1);
ЛевыйОбъект = СтрЗаменить(ЛевыйОбъект, ":", "");
ПравыйОбъект = Сред(ИмяОбъекта, Позиция + 2);
Expand All @@ -254,7 +298,7 @@
Коннектор.CellsU("EndX").GlueTo(ПравыйОбъект.CellsSRC(1, 1, 0));
Иначе
Коннектор.CellsU("BeginX").GlueTo(ПравыйОбъект.CellsSRC(1, 1, 0));
Коннектор.CellsU("EndX").GlueTo(ЛевыйОбъект.CellsSRC(1, 1, 0));
Коннектор.CellsU("EndX").GlueTo(ЛевыйОбъект.CellsSRC(1, 1, 0));
КонецЕсли;
Директор = Ложь;
Коннектор.CellsSRC(visSectionObject, visRowShapeLayout, visSLORouteStyle).FormulaU = "16";
Expand All @@ -272,53 +316,28 @@
&НаКлиенте
Функция ПолучитьЗначение(ТекущийУзел, ИмяУзла)

Для каждого ДочернийУзел из ТекущийУзел.ДочерниеУзлы Цикл
Для каждого ДочернийУзел Из ТекущийУзел.ДочерниеУзлы Цикл
Если ДочернийУзел.ИмяУзла = ИмяУзла Тогда
Возврат ДочернийУзел.ТекстовоеСодержимое;
КонецЕсли;
КонецЦикла;

КонецФункции
КонецФункции

&НаКлиенте
Функция ПолучитьАтрибут(ТекущийУзел, ИмяУзла, ИмяАтрибута)

Для каждого ДочернийУзел из ТекущийУзел.ДочерниеУзлы Цикл
Для каждого ДочернийУзел Из ТекущийУзел.ДочерниеУзлы Цикл
Если ДочернийУзел.ИмяУзла = ИмяУзла Тогда
Возврат ДочернийУзел.ПолучитьАтрибут(ИмяАтрибута);
КонецЕсли;
КонецЦикла;

КонецФункции

&НаКлиенте
Функция РазделитьСтроку(Стр)

МассивСтрок = Новый Массив();
Пока Истина Цикл
Поз1 = Найти(Стр, " ");
Поз2 = Найти(Стр, ",");
Если Поз1 = 0 Тогда
Поз = Поз2;
ИначеЕсли Поз2 = 0 Тогда
Поз = Поз1;
Иначе
Поз = Мин(Поз1, Поз2);
КонецЕсли;
Если Поз = 0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр, Поз-1));
Стр = СокрЛ(Сред(Стр, Поз+1));
КонецЦикла;
Возврат МассивСтрок;

КонецФункции
КонецФункции

&НаКлиенте
Процедура ДоступныеФорматы(Команда)

ФорматыAPI = Новый Массив;
ФорматыAPI.Добавить("render");
ФорматыAPI.Добавить("layout");
Expand Down Expand Up @@ -359,11 +378,11 @@
СформироватьКартинку();
КонецЕсли;

КонецПроцедуры
КонецПроцедуры

&НаКлиенте
Процедура СохранитьКак(Команда)

ОписаниеОповещения = Новый ОписаниеОповещения("ОбработкаВыбораФайла", ЭтаФорма);
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ДиалогВыбораФайла.Фильтр = "Файлы изображений (*.bmp, *.jpg, *.png)|*.bmp;*.jpg;*.png|Все файлы|*.*";
Expand All @@ -378,11 +397,11 @@
ИмяФайла = ВыбранныеФайлы[0];
Файл = Новый Файл(ИмяФайла);
ФорматЗаписи = Сред(Файл.Расширение, 2);
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработкаЗаписиФайла", ЭтаФорма, Файл.ПолноеИмя);
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработкаЗаписиФайла", ЭтаФорма, Файл.ПолноеИмя);
ВнешняяКомпонента.НачатьВызовСформировать(ОписаниеОповещения, ДанныеГрафа, ФорматЗаписи);
КонецЕсли;

КонецПроцедуры
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаЗаписиФайла(РезультатВызова, ПараметрыВызова, ДополнительныеПараметры) Экспорт
Expand All @@ -393,5 +412,4 @@
Сообщить(РезультатВызова);
КонецЕсли;

КонецПроцедуры

КонецПроцедуры
2 changes: 1 addition & 1 deletion Example/filename
Original file line number Diff line number Diff line change
@@ -1 +1 @@
GraphViz1C.epf
GraphViz1c.epf

0 comments on commit 855ab7f

Please # to comment.