Программное создание графических схем (v.2): API для ГрафическойСхемы
Пример динамического создания графических схем, добавления элементов любых видов. Любые схемы без бизнес-процессов. Программная работа со схемой.
Отличие от существующей статьи в том, что здесь используется объектная модель.
Исправил и упростил некоторые моменты - результат соответствует схеме, созданной руками.
Добавил возможность рисования произвольных форм для существующих фигур.
Отличие от существующей статьи в том, что здесь используется объектная модель.
Исправил и упростил некоторые моменты - результат соответствует схеме, созданной руками.
Добавил возможность рисования произвольных форм для существующих фигур.
Комментарии
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
Понял, что можно рисовать любые фигуры. Накидал примеров в статью. :)
Конечно, если пользователь будет двигать края фигуры, токарета превратится опять в тыкву наша замечательная фигурка станет тем, чем является по сути.
С типовыми фигурами ничего не произойдет.
А вот и домашнее задание.
Кто нарисует машинку? (добавить кусок кода в процедуру РасставитьТочкиФигуры() с новым Модификатором)
Конечно, если пользователь будет двигать края фигуры, то
С типовыми фигурами ничего не произойдет.
А вот и домашнее задание.
Кто нарисует машинку? (добавить кусок кода в процедуру РасставитьТочкиФигуры() с новым Модификатором)
(5) здрасссьте. Я вроде об этом писал, что можно любые фигурки рисовать. Удобнее всего - из фигуры "Условие", она как шестиугольник наиболее гибкая.
В целом - была у меня мысль с json поработать, но в 1С это штука новая, а всё новое в платформе первые года 3 косячит и лучше не связываться) Хотя json лаконичнее, конечно.
В целом - была у меня мысль с json поработать, но в 1С это штука новая, а всё новое в платформе первые года 3 косячит и лучше не связываться) Хотя json лаконичнее, конечно.
(7) Yashazz, приветствую.
В принципе не имеет значения, "сколько"-угольник изначальная фигура, т.к. точек для нее можно добавить очень много (много больше шести).
Про JSON... тут я показал, как оно внутри строится... Но чтобы привести к стандартной 1С-овской модели работы с объектами, конечно, нужно всю эту штуку еще раз упаковать.
Сделать Структуру с переводом реквизитов на русский язык, аккуратно разложить по смысловым объектам, возможно, запихнуть это в обработку, чтобы в одном месте лежало. Вот пока руки никак не дойдут, но надеюсь представить...
ИМХО, должно быть что-то вроде: "СоздатьОбъект() - схема", "ДобавитьЭлемент(Тип)", "Вывести()", "СоединитьЭлементы()",... плюс нетривиальная штука - рисовать соединения, чтобы они сразу штатно отображались (штатно, это так, как если мы покажем как есть, сдвинем элемент туда-сюда руками, линия перерисуется, обходя другие объекты).
Совершенству нет предела...
В принципе не имеет значения, "сколько"-угольник изначальная фигура, т.к. точек для нее можно добавить очень много (много больше шести).
Про JSON... тут я показал, как оно внутри строится... Но чтобы привести к стандартной 1С-овской модели работы с объектами, конечно, нужно всю эту штуку еще раз упаковать.
Сделать Структуру с переводом реквизитов на русский язык, аккуратно разложить по смысловым объектам, возможно, запихнуть это в обработку, чтобы в одном месте лежало. Вот пока руки никак не дойдут, но надеюсь представить...
ИМХО, должно быть что-то вроде: "СоздатьОбъект() - схема", "ДобавитьЭлемент(Тип)", "Вывести()", "СоединитьЭлементы()",... плюс нетривиальная штука - рисовать соединения, чтобы они сразу штатно отображались (штатно, это так, как если мы покажем как есть, сдвинем элемент туда-сюда руками, линия перерисуется, обходя другие объекты).
Совершенству нет предела...
(10) Добрый день.
Увидел ошибку в выводе Декораций (действительно, не было ни одного примера, поэтому не заметил закравшуюся ошибку).
Код для вывода (у меня весь код в модуле/обработке "ГрафическиеСхемы", поэтому с ним привожу):
Увидел ошибку в выводе Декораций (действительно, не было ни одного примера, поэтому не заметил закравшуюся ошибку).
Код для вывода (у меня весь код в модуле/обработке "ГрафическиеСхемы", поэтому с ним привожу):
Декорация = ГрафическиеСхемы.ПолучитьСтруктуруТипа(0);
ГрафическиеСхемы.ДобавитьЭлемент(Схема,Декорация,10,10);
(11) А в чем заключалась ошибка? Можете прислать исправленный код?
Просто вставка данного кода приводит к тому, что при формировании схемы стала возникать ошибка при вызове метода контекста (ПрочитатьJSON):
СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON,Тип("ГрафическаяСхема")); // Вот он результат!
по причине:
Ошибка при вызове метода объекта модели XDTO.
Неверный параметр.
Просто вставка данного кода приводит к тому, что при формировании схемы стала возникать ошибка при вызове метода контекста (ПрочитатьJSON):
СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON,Тип("ГрафическаяСхема")); // Вот он результат!
по причине:
Ошибка при вызове метода объекта модели XDTO.
Неверный параметр.
(12) В этом и была ошибка...
Код в статье уже обновленный.
Исправил следующее:
поменял на
Т.е. у Декорации нет свойства Point.
Код в статье уже обновленный.
Исправил следующее:
Если itemType = 0 ИЛИ itemType = 5 ИЛИ itemType = 9 ИЛИ itemType = 10 Тогда // Декорация/Действие/Обработка/ВложенныйПроцесс: Прямоугольник
поменял на
Если itemType = 5 ИЛИ itemType = 9 ИЛИ itemType = 10 Тогда // Действие/Обработка/ВложенныйПроцесс: Прямоугольник
Т.е. у Декорации нет свойства Point.
К сожалению, не взлетело. Падает в ошибку при попытке прочитать json сериализатором.
В этой строке:
См. вложение.
Попробовал убрать добавление всех элементов, оставил только инициализацию
Пробовал на релизе 8.3.14 в режиме совместимости 8.3.12
Есть идеи почему?
UPD:
Сериализовал пустую схему и сравнил с той что получается в инициализации.
После этого взлетело. Видимо, порядок важен. Учитывая, что статья достаточно старая видимо что то поменяли.
См. различия на картинке
В этой строке:
зн = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON,Тип("ГрафическаяСхема")); // Вот он результат!
См. вложение.
Попробовал убрать добавление всех элементов, оставил только инициализацию
{
"#value": {
"backColor": {
"#value": "{http://v8.1c.ru/8.1/data/ui/style }FieldBackColor",
"#type": "jv8ui:Color"
},
"enableGrid": true,
"drawGridMode": "Lines",
"gridVerticalStep": 20,
"gridHorizontalStep": 20,
"bpUUID": "00000000-0000-0000-0000-000000000000",
"useOutput": "Auto",
"printPropItem": [
{
"key": 6,
"val": 10
},
{
"key": 7,
"val": 10
},
{
"key": 8,
"val": 10
},
{
"key": 9,
"val": 10
},
{
"key": 13,
"val": 0
},
{
"key": 16,
"val": 0
}
]
}
}
ПоказатьПробовал на релизе 8.3.14 в режиме совместимости 8.3.12
UPD:
Сериализовал пустую схему и сравнил с той что получается в инициализации.
После этого взлетело. Видимо, порядок важен. Учитывая, что статья достаточно старая видимо что то поменяли.
См. различия на картинке
Прикрепленные файлы:
(16)
В общем взлетело только после того, как ещё поменял дополнительно порядок элементов value & in procedure
Исходному автору и автору адаптации на json респект и уважуха. Всем добра!
В общем взлетело только после того, как ещё поменял дополнительно порядок элементов value & in procedure
Функция ПолучитьСтруктуруТипа(ТипЭлементаГрафическойСхемы,itemCode=Неопределено) Экспорт
МассивТиповЭлементовГрафическойСхемы = Новый Массив;
МассивТиповЭлементовГрафическойСхемы.Добавить("Декорация"); //0 "Декорация"
МассивТиповЭлементовГрафическойСхемы.Добавить("ДекоративнаяЛиния"); //1 "ДекоративнаяЛиния"
МассивТиповЭлементовГрафическойСхемы.Добавить("Старт"); //2 "Старт"
МассивТиповЭлементовГрафическойСхемы.Добавить("Завершение"); //3 "Завершение"
МассивТиповЭлементовГрафическойСхемы.Добавить("Условие"); //4 "Условие"
МассивТиповЭлементовГрафическойСхемы.Добавить("Действие"); //5 "Действие"
МассивТиповЭлементовГрафическойСхемы.Добавить("ВыборВарианта"); //6 "ВыборВарианта"
МассивТиповЭлементовГрафическойСхемы.Добавить("Разделение"); //7 "Разделение"
МассивТиповЭлементовГрафическойСхемы.Добавить("Слияние"); //8 "Слияние"
МассивТиповЭлементовГрафическойСхемы.Добавить("Обработка"); //9 "Обработка"
МассивТиповЭлементовГрафическойСхемы.Добавить("ВложенныйПроцесс"); //10 "ВложенныйПроцесс"
Если itemCode = Неопределено Тогда
itemCode = МассивТиповЭлементовГрафическойСхемы[ТипЭлементаГрафическойСхемы];
КонецЕсли;
Ответ = Новый Структура;
Ответ.Вставить("itemType", ТипЭлементаГрафическойСхемы);
Ответ.Вставить("itemCode", itemCode); // Должно быть задано при добавлении, д.б. уникально
Ответ.Вставить("itemId", Неопределено); // Вычислить при добавлении
Ответ.Вставить("itemTabOrder", Неопределено); // Вычислить при добавлении
Ответ.Вставить("zOrder", Неопределено); // Вычислить при добавлении
Ответ.Вставить("lineColor", Новый Соответствие);
Ответ.lineColor.Вставить("#value", "{http://v8.1c.ru/8.1/data/ui/style }BorderColor");
Ответ.lineColor.Вставить("#type", "jv8ui:Color");
Ответ.Вставить("alignHor", "Center");
Ответ.Вставить("alignVer", "Center");
Ответ.Вставить("backColor", Новый Соответствие);
Ответ.backColor.Вставить("#value", "auto");
Ответ.backColor.Вставить("#type", "jv8ui:Color");
Ответ.Вставить("currentLanguage", "#");
Ответ.Вставить("picturePlacement", "Left");
Ответ.Вставить("textColor", Новый Соответствие);
Ответ.textColor.Вставить("#value", "{http://v8.1c.ru/8.1/data/ui/style }FormTextColor");
Ответ.textColor.Вставить("#type", "jv8ui:Color");
Ответ.Вставить("textFont", Новый Структура("kind","AutoFont"));
Ответ.Вставить("tipText", Новый Соответствие);
Ответ.Вставить("transparent", Ложь);
Ответ.Вставить("hyperlink", Ложь);
Ответ.Вставить("itemTitle", Новый Массив);
Ответ.Вставить("groupNum", 0);
Если ТипЭлементаГрафическойСхемы <> 0 Тогда
Ответ.Вставить("border", Новый Структура("width,gap,style",Новый Соответствие,Ложь,Новый Соответствие));
Ответ.border.width.Вставить("#value", 1);
Ответ.border.width.Вставить("#type", "jxs:decimal");
Ответ.border.style.Вставить("#value", "Solid");
Ответ.border.style.Вставить("#type", "jsch:ConnectorLineType");
Ответ.Вставить("point", Новый Массив);
КонецЕсли;
Если ТипЭлементаГрафическойСхемы <> 1 Тогда
Ответ.Вставить("rectBottom", 40);
Ответ.Вставить("rectLeft", 60);
Ответ.Вставить("rectRight", 80);
Ответ.Вставить("rectTop", 20);
Ответ.Вставить("picture", Новый Соответствие);
Ответ.Вставить("pictureStyle", 4);
КонецЕсли;
Если ТипЭлементаГрафическойСхемы >= 2 Тогда
Ответ.Вставить("pointUUID", Строка(Новый УникальныйИдентификатор));
Ответ.Вставить("passageState", 0);
Ответ.Вставить("tableCode", 0);
КонецЕсли;
Если ТипЭлементаГрафическойСхемы = 0 Тогда
Ответ.Вставить("angle", Новый Соответствие);
Ответ.angle.Вставить("#value", 0);
Ответ.angle.Вставить("#type", "jxs:decimal");
Ответ.Вставить("flipMode", 0);
Ответ.Вставить("shape", "Block");
КонецЕсли;
Если ТипЭлементаГрафическойСхемы = 1 Тогда
Ответ.Вставить("beginArrowStyle", "None");
Ответ.Вставить("connectFromItemId", -1); // Если decorativeLine = Истина, то можно и из ниоткуда
Ответ.Вставить("connectFromPortIndex", 0);
Ответ.Вставить("connectToItemId", -1);
Ответ.Вставить("decorativeLine", Истина); // Если Ложь, то будет неубираемая "пристегнутая" линия к объекту
Ответ.Вставить("endArrowStyle", "Filled");
Ответ.Вставить("portIndexFrom", 4);
Ответ.Вставить("portIndexTo", 0);
Ответ.Вставить("textPos", "FirstSegment");
КонецЕсли;
Если ТипЭлементаГрафическойСхемы = 4 Тогда
Ответ.Вставить("falsePortIndex", 1);
Ответ.Вставить("truePortIndex", 3);
КонецЕсли;
Если ТипЭлементаГрафическойСхемы = 5 ИЛИ ТипЭлементаГрафическойСхемы = 10 Тогда
Ответ.Вставить("taskDescription", itemCode); // Должно быть задано при добавлении; возможно = itemCode
КонецЕсли;
Если ТипЭлементаГрафическойСхемы = 5 Тогда
Ответ.Вставить("addrZoneDivideYPos", 16);
Ответ.Вставить("groupAddressing", Ложь);
Ответ.Вставить("isAddrZoneDivideValid", Истина);
Ответ.Вставить("explanation", "");
КонецЕсли;
Если ТипЭлементаГрафическойСхемы = 6 Тогда
Ответ.Вставить("transition", Новый Массив);
КонецЕсли;
Если ТипЭлементаГрафическойСхемы = 10 Тогда
Ответ.Вставить("subprocessUUID", "00000000-0000-0000-0000-000000000000");
КонецЕсли;
Возврат Ответ;
КонецФункции
ПоказатьИсходному автору и автору адаптации на json респект и уважуха. Всем добра!
Прикрепленные файлы:
(16)
Указанная проблема очень похожа на проблему кроссплатформенности в платформе 8.3.14.1993... Изначально пробовал под Linux… Под Winodws получил ту же ошибку.
После того как все последовательности упаковал в условия
Надо будет под другими версиями платформами потестить.
Указанная проблема очень похожа на проблему кроссплатформенности в платформе 8.3.14.1993... Изначально пробовал под Linux… Под Winodws получил ту же ошибку.
После того как все последовательности упаковал в условия
СИ = Новый СистемнаяИнформация();
Если СИ.ТипПлатформы = ТипПлатформы.Linux_x86 ИЛИ
СИ.ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда
Ответ.lineColor.Вставить("#value", "{http://v8.1c.ru/8.1/data/ui/style }BorderColor");
Ответ.lineColor.Вставить("#type", "jv8ui:Color");
Иначе
Ответ.lineColor.Вставить("#type", "jv8ui:Color");
Ответ.lineColor.Вставить("#value", "{http://v8.1c.ru/8.1/data/ui/style }BorderColor");
КонецЕсли;
ПоказатьНадо будет под другими версиями платформами потестить.