Графическая схема. Управление при помощи XDTO.

16.01.17

Разработка - Работа с интерфейсом

В статье описывается методика программного управления элементами графической схемы при помощи механизма XDTO. Приложена готовая к использованию библиотека функций для создания и удаления графических объектов, а также для связи элементов схемы соединительными линиями.

Скачать файлы

Наименование Файл Версия Размер
Библиотека функций работы с графической схемой
.cf 20,87Kb
184
.cf 20,87Kb 184 Скачать

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

//infostart.ru/public/537353/

//infostart.ru/public/551576/

//infostart.ru/public/336564/

//infostart.ru/public/320691/

Как правило, в этих публикациях графическая схема  либо сохраняется в файл GRS, который может быть программно изменен, либо используется  XML-, JSON- сериализация, конвертация в платформенные структуры и массивы. К сожалению, ни в одной публикации не был упомянут самый простой и логичный (на мой взгляд) способ - использование механизма XDTO. Этот способ имеет много общего с использованием XML-сериализации, но гораздо удобнее  в изучении и реализации, а также позволяет получить более понятный код.

Описание механизма

Несколько слов о механизме XDTO. Я не буду останавливаться на теории, желающие без труда найдут соответствующие статьи (например цикл статей //infostart.ru/public/167459/), ограничусь лишь рассмотрением практических вопросов, необходимых в рамках нашей задачи. Заранее прошу прощения у гуру за некий повтор информации из документации,  цель моей публикации - изложить информацию в максимально доступной для новичков форме.

Итак, для работы нам потребуется 2 вида сущностей: ОбъектXDTO - объекты, которые будут для нас элементами графической схемы, и СписокXDTO - список объектов ОбъектXDTO. Многие объекты 1С, в том числе графическая схема, могут быть преобразованы в объекты XDTO:

ГрафСхемаXDTO=СериализаторXDTO.ЗаписатьXDTO(ГрафСхема);

Каждый объект характеризуется типом. Программист может создавать объекты XDTO произвольных типов. Тип определяется совокупностью двух строк: URIПространстваИмен и Имя типа. Например создание объекта - элемента графической схемы выглядит так:

НовОбъект=СериализаторXDTO.Фабрика.Создать(СериализаторXDTO.Фабрика.Тип("http://v8.1c.ru/8.2/data/graphscheme","GraphSchemeItem"));

Возникает вопрос: как перед созданием узнать тип нужного программисту объекта, т.е. Имя и URIПространстваИмен? Существует 2 способа: первый - создать объект вручную и посмотреть в отладчике свойства его типа:

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

... Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://v8.1c.ru/8.1/data/graphscheme}. Имя типа XDTO: FlowchartContextType. 

У объекта XDTO есть свойства, значениями которых могут выступать как простые типы, так и сложные: другие объекты или их списки.

Как видим, у объекта графической схемы есть собственные свойства, кроме того есть реквизит item - Список XDTO.  Забегая вперед, отметим, что это - список графических элементов, т.е. именно то, что нам нужно.

Большинство свойств объектов доступны для изменения.

После модификации Объект XDTO можно преобразовать обратно в объект платформы 1С:

ГрафСхема=СериализаторXDTO.ПрочитатьXDTO(ГрафСхемаXDTO);

Таким образом методика программного изменения графической схемы выглядит так: 

  • Сериализуем (т.е. преобразовываем в объект XDTO) графическую схему
  • Меняем свойства объекта XDTO, список графических элементов,
  • Десериализуем объект XDTO обратно в графическую схему.

Неоспоримым плюсом и отличием от способов, предлагаемых в других публикациях, является тот факт, что на этапе изменения схемы мы работаем с понятной объектной моделью - объектами (с доступными свойствами-реквизитами) и списками объектов.

Примеры создания элементов

Для примера попробуем добавить в графическую схему элемент "Действие":

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

	ГрафСхемаXDTO=СериализаторXDTO.ЗаписатьXDTO(ГрафСхема);
	НовОбъект=СериализаторXDTO.Фабрика.Создать(СериализаторXDTO.Фабрика.Тип("http://v8.1c.ru/8.2/data/graphscheme","GraphSchemeItem"));
	НовОбъект.itemType=5;

Реквизит itemType - один из самых важных. Он задает тип графического элемента и его внешний вид.

Список типов:

  • 0 - Декорация
  • 1 - Линия
  • 2 - Старт
  • 3 - Завершение
  • 4 - Условие
  • 5 - Действие
  • 6 - Выбор варианта
  • 7 - Разделение
  • 8 - Слияние
  • 9 - Обработка
  • 10 - Вложенный процесс 

Далее зададим имя создаваемого объекта, его идентификатор (должен быть уникальным среди элементов схемы) и номер порядка обхода.

	НовОбъект.itemCode="Действие1";
	НовОбъект.itemId=1;
	НовОбъект.itemTabOrder=1;

Следующий шаг - мы должны задать координаты прямоугольника, внутри которого будет расположен наш объект. Именно к серединам его сторон будут потом "привязываться" соединительные линии. Координаты отсчитываются от левого верхнего угла схемы.

	НовОбъект.rectLeft=100;
	НовОбъект.rectRight=200;
	НовОбъект.rectTop=100;
	НовОбъект.rectBottom=200;

Заголовок элемента - это несколько вариантов строк, для разных языков. Нам хватит одного.

	Заголовки=СериализаторXDTO.Фабрика.Создать(СериализаторXDTO.Фабрика.Тип("http://v8.1c.ru/8.1/data/core","LocalStringType"));
	ЗаголовокЭлемента=СериализаторXDTO.Фабрика.Создать(СериализаторXDTO.Фабрика.Тип("http://v8.1c.ru/8.1/data/core","LocalStringItemType"));
	ЗаголовокЭлемента.lang="#";
	ЗаголовокЭлемента.content="Действие №1";
	Заголовки.Item.Добавить(ЗаголовокЭлемента);
	НовОбъект.itemTitle=Заголовки;
	НовОбъект.currentLanguage="#";

Определим цвет элемента. В нашем случае - цвет по умолчанию, определяется типом элемента.

	НовОбъект.backColor=новый Цвет;

Следующий момент - задание типа линии границы элемента - значение реквизита border. На этом шаге спотыкается большинство разработчиков, так как в документации этот вопрос не рассмотрен, а реверс-инжиниринг дает непонятный результат. Правильно делать так:

	НовОбъект.Border=СериализаторXDTO.ЗаписатьXDTO(новый линия(ТипСоединительнойЛинии.Сплошная,1));

У нашего объекта есть свойство point - список объектов XDTO - точек вершин элемента. Для корректного отображения элемента их надо задать. Правые и нижние координаты на единицу меньше чем координаты ограничивающего прямоугольника. (Почему так? Кто знает...)

	НовОбъект.Point.Добавить(НоваяТочкаXDTO(100,100));
	НовОбъект.Point.Добавить(НоваяТочкаXDTO(200-1,100));
	НовОбъект.Point.Добавить(НоваяТочкаXDTO(200-1,200-1));
	НовОбъект.Point.Добавить(НоваяТочкаXDTO(100,200-1));
////////////////////////////////////////////////////////////


Функция НоваяТочкаXDTO(x,y)
	Точка=СериализаторXDTO.Фабрика.Создать(СериализаторXDTO.Фабрика.Тип("http://v8.1c.ru/8.2/data/graphscheme","Point"));
	Точка.x=x;
	Точка.y=y;	
	Возврат Точка;
КонецФункции

Что будет если мы зададим свой набор точек? Можно будет нарисовать многоугольник произвольной формы? Да можно, но... до первого "шевеления" элемента мышкой. При первом же удобном случае элемент примет форму, определяемую его типом, в пределах ограничивающего прямоугольника.

И, наконец, добавим наш созданный элемент в список элементов графической схемы и десериализуем ее.

	ГрафСхемаXDTO.item.Добавить(НовОбъект);
	ГрафСхема=СериализаторXDTO.ПрочитатьXDTO(ГрафСхемаXDTO);

Приведенного выше кода достаточно для отображения элемента "Действие". Но можно настроить и другие свойства: alignHor, alignVer, hyperlink, picturePlacement, pictureStyle, transparent, lineColor, textColor и др. Их назначение понятно из названий. 

Аналогичным образом создаются и другие объекты. При этом необходимо учесть несколько особенностей:

  • По умолчанию у объектов "Старт" и "Завершение" угол при вершине равен 120º
  • По умолчанию у объекта "Условие" углы правой и левой стороны равны 120º
  • Объект "Декорация" имеет реквизит shape, который отвечает за форму объекта: Блок, Документ, Эллипс и т.д.
  • У объекта "ВыборВарианта" есть реквизит transition, содержащий список вариантов.
  • Высота заголовка объекта "Действие" и высота вариантов объекта "ВыборВарианта" - величина постоянная

Создание соединительной линии несколько отличается  от создания прочих объектов:

	НовОбъект=СериализаторXDTO.Фабрика.Создать(СериализаторXDTO.Фабрика.Тип("http://v8.1c.ru/8.2/data/graphscheme","GraphSchemeItem"));
	НовОбъект.itemType=1;
	НовОбъект.itemId=2;
	НовОбъект.itemTabOrder=2;
	НовОбъект.itemCode="Линия1";
	
	Заголовки=СериализаторXDTO.Фабрика.Создать(СериализаторXDTO.Фабрика.Тип("http://v8.1c.ru/8.1/data/core","LocalStringType"));
	ЗаголовокЭлемента=СериализаторXDTO.Фабрика.Создать(СериализаторXDTO.Фабрика.Тип("http://v8.1c.ru/8.1/data/core","LocalStringItemType"));
	ЗаголовокЭлемента.lang="#";
	ЗаголовокЭлемента.content="Линия №1";
	Заголовки.Item.Добавить(ЗаголовокЭлемента);
	НовОбъект.itemTitle=Заголовки;
	НовОбъект.currentLanguage="#";
	
	НовОбъект.beginArrowStyle=СтильСтрелки.Нет;
	НовОбъект.endArrowStyle=СтильСтрелки.Заполненная;

	НовОбъект.connectFromItemId=-1;
	НовОбъект.connectToItemId=1;
	НовОбъект.portIndexFrom=0;
	НовОбъект.portIndexTo=3;
	НовОбъект.connectFromPortIndex=0;
	
	НовОбъект.backColor=новый Цвет;
	НовОбъект.decorativeLine=Ложь;
	НовОбъект.Border=СериализаторXDTO.ЗаписатьXDTO(новый линия(ТипСоединительнойЛинии.Сплошная,1));
	
	НовОбъект.Point.Добавить(НоваяТочкаXDTO(300,150));
	НовОбъект.Point.Добавить(НоваяТочкаXDTO(200,150));
	
	ГрафСхемаXDTO.item.Добавить(НовОбъект);

Здесь надо обратить внимание на следующие реквизиты: connectFromItemId, connectToItemId - идентификаторы объектов, к которым "привязаны" начало и конец линии.  portIndexFrom, portIndexTo - номера сторон, к которым присоединены линии.

Список номеров сторон:

  • 1 - середина левой стороны ограничивающего объект прямоугольника
  • 2 - середина верхней стороны 
  • 3 - середина правой стороны 
  • 4 - середина нижней стороны 
  • 6, 8, 10, ... - середина левой стороны варианта 1, 2, 3, ... для объекта ВыборВарианта
  • 7, 9, 11, ... - середина правой стороны варианта 1, 2, 3, ... для объекта ВыборВарианта

Особенности работы с линиями:

  • Если линия начинается из варианта объекта ВыборВарианта, то реквизит connectFromPortIndex равен номеру варианта.
  • Реквизит decorativeLine - флаг декоративной линии.
  • Соединительная линия, в отличие от декоративной, перестраивается при перемещении объекта, к которому присоединена. Присоединенная декоративная линия также перемещается вслед за перемещаемым объектом, но, как правило, ее форма не так сильно меняется.
  • Декоративная линия может иметь наконечники разных типов, а соединительная - только в виде заполненной стрелки.
  • Нельзя допускать наличия соседних сегментов линии, лежащих на одной прямой, иначе перемещение линии вызывает странные визуальные эффекты.

Библиотека для работы с графической схемой

Для упрощения работы с графической схемой была разработана библиотека функций, приложенная к статье.

Функции создания и удаления объектов:

// Создает XDTO объект - Действие
Функция НовыйОбъектДействие(ГрафСхемаXDTO,Имя,Заголовок=Неопределено,Лево,Верх,Ширина,Высота,Цвет=Неопределено,Линия=Неопределено)Экспорт
// Создает XDTO объект - ВыборВарианта
Функция НовыйОбъектВыборВарианта(ГрафСхемаXDTO,Имя,Заголовок=Неопределено,Лево,Верх,Ширина,Высота,Цвет=Неопределено,Линия=Неопределено)Экспорт
// Создает XDTO объект - Старт
Функция НовыйОбъектСтарт(ГрафСхемаXDTO,Имя,Заголовок=Неопределено,Лево,Верх,Ширина,Высота,Цвет=Неопределено,Линия=Неопределено)Экспорт
// Создает XDTO объект - Завершение
Функция НовыйОбъектЗавершение(ГрафСхемаXDTO,Имя,Заголовок=Неопределено,Лево,Верх,Ширина,Высота,Цвет=Неопределено,Линия=Неопределено)Экспорт
// Создает XDTO объект - Условие
Функция НовыйОбъектУсловие(ГрафСхемаXDTO,Имя,Заголовок=Неопределено,Лево,Верх,Ширина,Высота,Цвет=Неопределено,Линия=Неопределено)Экспорт
// Создает XDTO объект - Разделение
Функция НовыйОбъектРазделение(ГрафСхемаXDTO,Имя,Заголовок=Неопределено,Лево,Верх,Ширина,Высота,Цвет=Неопределено,Линия=Неопределено)Экспорт
// Создает XDTO объект - Слияние
Функция НовыйОбъектСлияние(ГрафСхемаXDTO,Имя,Заголовок=Неопределено,Лево,Верх,Ширина,Высота,Цвет=Неопределено,Линия=Неопределено)Экспорт
// Создает XDTO объект - Обработка
Функция НовыйОбъектОбработка(ГрафСхемаXDTO,Имя,Заголовок=Неопределено,Лево,Верх,Ширина,Высота,Цвет=Неопределено,Линия=Неопределено)Экспорт
// Создает XDTO объект - ВложенныйПроцесс
Функция НовыйОбъектВложенныйПроцесс(ГрафСхемаXDTO,Имя,Заголовок=Неопределено,Лево,Верх,Ширина,Высота,Цвет=Неопределено,Линия=Неопределено)Экспорт
// Создает XDTO объект - Декорация
Функция НовыйОбъектДекорация(ГрафСхемаXDTO,Имя,Заголовок=Неопределено,Фигура,Лево,Верх,Ширина,Высота,Цвет=Неопределено,Линия=Неопределено)Экспорт
// Создает XDTO объект - Декоративную линию
Функция новаяДекоративнаяЛинияСхемы(ГрафСхемаXDTO,Имя,Заголовок=Неопределено,Знач Координаты,Линия=Неопределено,СтрелкаНачала=Неопределено,СтрелкаКонца=Неопределено)Экспорт
// Удаляет объект из схемы
Процедура УдалитьОбъектСхемы(ГрафСхемаXDTO,Объект)Экспорт

Функции работы с вариантами:

// Добавляет новый вариант в объект ВыборВарианта
Процедура ДобавитьВариант(ОбъектВыборВарианта,Имя,Заголовок=Неопределено,Цвет=Неопределено)Экспорт
// Вставляет (со сдвигом) новый вариант в объект ВыборВарианта
Процедура ВставитьВариант(ГрафСхемаXDTO,ОбъектВыборВарианта,Позиция,Имя,Заголовок=Неопределено,Цвет=Неопределено)Экспорт
// Удаляет (со сдвигом) вариант из объекта ВыборВарианта
Процедура УдалитьВариант(ГрафСхемаXDTO,ОбъектВыборВарианта,Позиция)Экспорт

Функции поиска:

// Возвращает объект схемы по его имени или идентификатору
Функция НайтиОбъектСхемы(ГрафСхемаXDTO,ЗначениеПоиска)Экспорт
// Возвращает индекс объекта схемы по его имени или идентификатору
Функция НайтиИндексОбъектаСхемы(ГрафСхемаXDTO,ЗначениеПоиска)Экспорт

Функция соединения объектов:

// Соединяет два объекта соединительной линией
Функция СоединитьОбъектыЛинией(ГрафСхемаXDTO,Знач Объект1,Знач Объект2,Направление1,Направление2,НомерВарианта1=0,НомерВарианта2=0,ТипЛинии=Неопределено,СтрелкаНачала=Неопределено,СтрелкаКонца=Неопределено)Экспорт

Задача соединения объектов линией оказалась неожиданно непростой. Количество вариантов взаимного расположения объектов с учетом комбинаций соединяемых сторон довольно велико. Для сокращения количества вариантов пришлось использовать поворот объектов вокруг оси координат так, чтобы линия в первый объект входила всегда с левой стороны. Интересной выглядит следующая задача: написать алгоритм построения соединительной линии так, чтобы а) линия по возможности огибала бы другие элементы схемы и б) количество пересечений с другими линиями было бы минимально. Задача а) уже решена в платформе. Желающие могут из решения этой задачи сделать очень хорошую публикацию.

Пример использования библиотеки:

	ГрафСхемаXDTO=СериализаторXDTO.ЗаписатьXDTO(ГрафСхема);	
	
	НовОбъект=РаботаСГС.НовыйОбъектДействие(ГрафСхемаXDTO,"Действие1",,240,40,80,60,WebЦвета.БледноБирюзовый);
	ГрафСхемаXDTO.item.Добавить(НовОбъект);
	
	НовОбъект=РаботаСГС.НовыйОбъектОбработка(ГрафСхемаXDTO,"Обработка1",,140,180,80,60);
	ГрафСхемаXDTO.item.Добавить(НовОбъект);
	РаботаСГС.СоединитьОбъектыЛинией(ГрафСхемаXDTO,"Действие1","Обработка1",4,1);	
	
	НовОбъект=РаботаСГС.НовыйОбъектВыборВарианта(ГрафСхемаXDTO,"Выбор",,260,200,100,60,WebЦвета.СветлоСерый);
	РаботаСГС.ДобавитьВариант(НовОбъект,"Вариант 1","",WebЦвета.Красный);
	РаботаСГС.ДобавитьВариант(НовОбъект,"Вариант 2","",WebЦвета.Желтый);
	РаботаСГС.ДобавитьВариант(НовОбъект,"Вариант 3","",WebЦвета.Зеленый);
	ГрафСхемаXDTO.item.Добавить(НовОбъект);	
	
	РаботаСГС.СоединитьОбъектыЛинией(ГрафСхемаXDTO,"Выбор","Действие1",3,3,2,0);	
	
	ГрафСхема=СериализаторXDTO.ПрочитатьXDTO(ГрафСхемаXDTO);

Предлагаемая библиотека позволит разработчику упростить построение схем произвольных бизнес-процессов, организационных диаграмм, структур подчиненности и т.п.

В заключение хотелось бы отметить, что использование XDTO позволяет программисту получить дополнительные возможности по работе с самыми разными объектами (Дерево значений, табличный документ, и т.д.), тем самым несколько скомпенсировать отсутствие таких возможностей в объектной модели, предоставляемой платформой.

Графическая схема XDTO бизнес процессы

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61715    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54324    16    21    

42

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    16629    21    4    

35

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    10574    745    elcoan    45    

106

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

2 стартмани

10.04.2023    9491    150    acces969    31    

115

[После] Новогодние задачи 2023

Математика и алгоритмы О жизни Бесплатно (free)

Не желаете ли очередную порцию интересных задач?

03.01.2023    2330    Alxby    20    

9

Если хочется низко-низкоуровневого программирования с битами и байтами

Математика и алгоритмы Платформа 1С v8.3 Абонемент ($m)

Все знают, что подавляющее большинство современных компьютеров работает в двоичном коде, т.е. оперирует всего двумя значениями - битами - "0" и "1". Потом из них складываются байты, слова, кило-, мега- и гигабайты etc. Но что происходит внутри процессора, как именно обрабатываются двоичные числа, например выполняются арифметические операции? Об этом — в публикации. Статья, я думаю, будет особенно интересна тем читателям, у которых во время обучения не было соответствующих курсов.

1 стартмани

01.12.2022    1960    Alxby    20    

12
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. boln 1040 18.01.17 11:00 Сейчас в теме
Интересуюсь возможностями программного управления ГС. "Плюс".
2. RainyAugust22 265 20.01.17 06:25 Сейчас в теме
Не хватает стартмоней чтобы скачать и попробовать, сделайте скидку в 1 старт плз :-D
4. Alxby 1134 23.01.17 21:51 Сейчас в теме
33. DELOVOYDOM 29.01.24 03:31 Сейчас в теме
(4) Насчет произвольных фигур. Имеет смысл использовать только декорацию. Штатные фигуры слишком ограничены.
3. Evil Beaver 8100 23.01.17 10:17 Сейчас в теме
Заплюсовал! Логичное решение, а сразу в голову не придет, что есть из коробки XDTO-сериализация. Спасибо.
5. Alxby 1134 23.01.17 22:05 Сейчас в теме
(3) Да, чаще XDTO рассматривается с точки зрения обмена данными, Web-сервисов и т.п. Я сам несколько лет назад порядочно времени потратил на редактирование графической схемы через преобразование ее в строку: ЗначениеВСтрокуВнутр(ГрафСхема), пока не открыл для себя XDTO. Так что повторюсь: "...использование XDTO позволяет программисту получить дополнительные возможности по работе с самыми разными объектами ... , тем самым несколько скомпенсировать отсутствие таких возможностей в объектной модели, предоставляемой платформой". И это здОрово.
serverstar; boln; dj_serega; +3 Ответить
6. dj_serega 390 21.03.17 16:46 Сейчас в теме
Очень крутая публикация.
Как-то не получилось с прозрачным фоном декорации... А так все что хотел сделал.

Спасибо.
7. RainyAugust22 265 30.06.17 12:53 Сейчас в теме
Возможно ли доработать библиотеку чтобы стрелки выходили/входили из/в фигуры не с центра стороны, а с разных позиций стороны фигуры? (рис.) т.к стрелок много, сливаются в одну становиться нечитабельно. Возможно фигуру "выбор варианта" еще попробовать.
Прикрепленные файлы:
8. Alxby 1134 04.07.17 19:37 Сейчас в теме
К сожалению, механизм работы с графической схемой подразумевает наличие соединительных линий только между серединами сторон ограничивающего фигуру прямоугольника (не серединами сторон фигуры!). Единственный выход - самостоятельно построить декоративную, а не соединительную линию, рассчитав координаты конца линии, но в этом случае: а) в схеме не будет информации о связи линии с фигурой, б) линия не будет "тянуться" за фигурой при перемещении. В этом случае придется самостоятельно обеспечивать учет связей графических примитивов и механизм изменений. Я думаю, это выходит за рамки предлагаемой библиотеки, но буду рад, если кто-нибудь возьмется за реализацию данного функционала, мне кажется он будет востребован.
9. Kamikadze 46 24.07.17 10:07 Сейчас в теме
Крутая публикация. Попробую использовать для своих потребностей, отпишусь по результатах.
10. Абигоп-НахУрт 23.10.17 21:40 Сейчас в теме
Решение у меня есть, уже года 4-5 как тому назад, но совершенно не правильное, тогда распарсили текстовый файл в структуру. Хочу перейти на Вашу, что для этого надо?
Прикрепленные файлы:
Проблема.txt
11. Alxby 1134 24.10.17 19:49 Сейчас в теме
(10) Распарсить текстовый файл в структуру - не обязательно неправильное решение. Может быть неэффективное, это верно. Я тоже через это проходил, еще в предыдущей версии платформы. По вопросу перехода написал по почте.
12. AlexKo84 07.10.18 13:44 Сейчас в теме
Добрый день. Интересно посмотреть, но маников осталось только на совсем непредвиденные нужды. Можете поделиться?
13. Kr666 30.11.18 13:07 Сейчас в теме
14. TEST654321 10.10.19 08:19 Сейчас в теме
Великолепная статья!
Скачать пример пока нет возможности, но в тексте разжевано абсолютно все!
Реализовать получилось сразу. Жаль тут таких статей не так много ( с фрагментами кода скользких мест)
15. Alxby 1134 10.10.19 19:15 Сейчас в теме
16. KirillM1987 05.05.20 17:56 Сейчас в теме
Шикарная обработка!

С её помощью быстро своял схему маршрута согласования платежей)). Код понятный, можно объекты подкрутить под себя. Спасибо!
17. Alxby 1134 16.05.20 11:42 Сейчас в теме
18. poar 17.06.20 15:13 Сейчас в теме
Статья отличная, спасибо автору.
Повторил, все получилось.

Когда стал подходить к своей задаче столкнулся с одним моментом, который пока не смог решить.

Сделал 3 блока действия.
Два блока один под вторым, третий правее.
От первых двух линии идут к третьему.

При программной расстановке блоков линии заходят на блоки. После того как любой из блоков двину мышкой линии выстраиваются красиво. Картинки приложены.

Есть мысли как поправить?
Прикрепленные файлы:
19. Alxby 1134 19.06.20 18:22 Сейчас в теме
(18)
Пришлите пожалуйста код, который дает такой эффект, посмотрим что можно сделать
21. poar 14.07.20 16:06 Сейчас в теме
(19)
Добрый день. Решил проблему тем, что сам рассчитал промежуточные точки, а линии отвязал от конечных точек.
20. poar 14.07.20 16:04 Сейчас в теме
Добрый день. Решил проблему тем, что сам рассчитал промежуточные точки, а линии отвязал от конечных точек.
22. Nicholas 885 15.09.20 07:15 Сейчас в теме
Скажите, а цвета элементов, картинки и прочее оформление можно менять?
23. Alxby 1134 15.09.20 12:28 Сейчас в теме
(22)Да, конечно. Посмотрите, в статье упомянут этот момент.
24. Valeric650 22.07.21 15:05 Сейчас в теме
При использовании решений с других статей (тут и тут) столкнулся с проблемой, что соединительные линии не обходят элементы схемы и рисуются напрямую через другие блоки (пример см. в приложенном файле, в примере связующая линия блок 1 -> блок 3 пересекает блок 2).
А это решение способно решить данную проблему?
Прикрепленные файлы:
25. Alxby 1134 22.07.21 20:46 Сейчас в теме
(24)Вы можете создать линию, указав все точки ее узлов, обходя тем самым блоки. К сожалению, автоматическое соединение с помощью СоединитьОбъектыЛинией построит линию по кратчайшему пути. Эту проблему решить в большинстве случаев (но не всегда!) в принципе возможно, но значительно усложнится алгоритм.
26. sergeyisa 11 29.11.22 22:55 Сейчас в теме
Добрый вечер , Вам удалось решить проблему из п 10? У меня аналогичная проблема
Прикрепленные файлы:
описание проблемы.txt
27. Alxby 1134 30.11.22 11:31 Сейчас в теме
28. kabantus 23.03.23 10:15 Сейчас в теме
Существует ли способ убрать всплывающую подсказку при наведении курсора мыши на стрелку?
29. Alxby 1134 23.03.23 10:20 Сейчас в теме
(28)Сходу не скажу, надо посмотреть, возможно и нет. А почему она мешает? В сложных схемах подсказка наоборот необходима.
31. Alxby 1134 24.03.23 10:35 Сейчас в теме
(28)Посмотрел. У объекта линии есть свойство, отвечающее за подсказку - tipText. К сожалению платформа (8.3.22.1709) при отображении схемы игнорирует содержимое этого свойства. Подсказка формируется из имени линии и имен объектов, которые она соединяет. Другого варианта я пока не нашел.
30. kabantus 23.03.23 21:42 Сейчас в теме
(29) Из-за избыточности. Навожу мышь на блок действие и вижу ту же надпись только без стрелки.
32. Alxby 1134 24.03.23 10:39 Сейчас в теме
(30)Иногда это полезно. В данном примере подсказка поможет понять, откуда идет стрелка к Действие5 - из Действие2 или Действие3
Прикрепленные файлы:
Оставьте свое сообщение