Рисуем стрелки средствами 1С .
Недавняя статья про рисование графов заставила задуматься, можно ли нарисовать орграф исключительно средствами 1С. Потом вспомнил, что уже делал нечто подобное, порылся в архивах. Оказалось, ничего сложного, просто вспомнить, как рисовать в табличном документе, добавить немножко магии геометрии Et… voilà,
Код прикладываю ниже:
рисуем стрелки
#Область Фигуры
&НаКлиенте
Функция Рисовать(ТабДок,Вид, Верх=Неопределено, Лево=Неопределено, Высота=Неопределено, Ширина=Неопределено)
НовыйРисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента[Вид]);
Если Верх <> Неопределено Тогда НовыйРисунок.Верх=Верх; КонецЕсли;
Если Лево <> Неопределено Тогда НовыйРисунок.Лево=Лево; КонецЕсли;
Если Высота <> Неопределено Тогда НовыйРисунок.Высота=Высота; КонецЕсли;
Если Ширина <> Неопределено Тогда НовыйРисунок.Ширина=Ширина; КонецЕсли;
Возврат НовыйРисунок;
КонецФункции
//ТочкаА,ТочкаБ - Структура (Верх,Лево)
&НаКлиенте
Функция ЛинияАБ(ТабДок,ТочкаА,ТочкаБ,СтильРисунка=Неопределено)
Рисунок=Рисовать(ТабДок,"Прямая",ТочкаА.Верх,ТочкаА.Лево,?(ТочкаА.Верх>ТочкаБ.Верх,(ТочкаА.Верх-ТочкаБ.Верх)*-1,ТочкаБ.Верх-ТочкаА.Верх),?(ТочкаА.Лево>ТочкаБ.Лево,(ТочкаА.Лево-ТочкаБ.Лево)*-1,ТочкаБ.Лево-ТочкаА.Лево));
УстановитьПараметрыРисунка(Рисунок,СтильРисунка);
Возврат Рисунок;
КонецФункции
&НаКлиенте
Функция СтрелкаАБ(ТабДок,ТочкаА,ТочкаБ,ШиринаСтрелки,ВысотаСтрелки,СтильРисунка=Неопределено,Диаметр=0)
ШиринаСтрелки =?(ШиринаСтрелки=0,4,ШиринаСтрелки);
ВысотаСтрелки =?(ВысотаСтрелки=0,4,ВысотаСтрелки);
ВысотаПр=МАКС(ТочкаА.Верх-ТочкаБ.Верх,ТочкаБ.Верх-ТочкаА.Верх);
ШиринаПр=МАКС(ТочкаА.Лево-ТочкаБ.Лево,ТочкаБ.Лево-ТочкаА.Лево);
Гипотенуза=Sqrt(Pow(ВысотаПр,2)+Pow(ШиринаПр,2));
Pi = 3.1415926535897932;
УголА= ?(Гипотенуза=0,0,ASin(ШиринаПр*sin(Pi/2)/Гипотенуза));
УголБ= ?(Гипотенуза=0,0,ASin(ВысотаПр*sin(Pi/2)/Гипотенуза));
ГптБ1=ВысотаСтрелки;
ГптА2=ШиринаСтрелки/2;
ВысБ1=ГптБ1*sin(УголБ)/sin(Pi/2);
ШирБ1=ГптБ1*sin(УголА)/sin(Pi/2);
ВысА2=ГптА2*sin(УголА)/sin(Pi/2);
ШирА2=ГптА2*sin(УголБ)/sin(Pi/2);
НаправлениеЛП=""; НаправлениеВН="";
Если ТочкаБ.Лево>ТочкаА.Лево Тогда
НаправлениеЛП="П";
ИначеЕсли ТочкаБ.Лево<ТочкаА.Лево Тогда
НаправлениеЛП="Л";
КонецЕсли;
Если ТочкаБ.Верх>ТочкаА.Верх Тогда
НаправлениеВН="Н";
ИначеЕсли ТочкаБ.Верх<ТочкаА.Верх Тогда
НаправлениеВН="В";
КонецЕсли;
Направление=НаправлениеЛП+НаправлениеВН;
Если Направление="П" Тогда
ТочкаБ1=Новый Структура("Верх,Лево",ТочкаБ.Верх,ТочкаБ.Лево-ВысотаСтрелки);
ТочкаА2=Новый Структура("Верх,Лево",ТочкаА.Верх-ШиринаСтрелки/2,ТочкаБ1.Лево);
ТочкаБ2=Новый Структура("Верх,Лево",ТочкаА.Верх+ШиринаСтрелки/2,ТочкаБ1.Лево);
ИначеЕсли Направление="Л" Тогда
ТочкаБ1=Новый Структура("Верх,Лево",ТочкаБ.Верх,ТочкаБ.Лево+ВысотаСтрелки);
Тело=ЛинияАБ(ТабДок,ТочкаА,ТочкаБ1);
ТочкаА2=Новый Структура("Верх,Лево",ТочкаА.Верх-ШиринаСтрелки/2,ТочкаБ1.Лево);
ТочкаБ2=Новый Структура("Верх,Лево",ТочкаА.Верх+ШиринаСтрелки/2,ТочкаБ1.Лево);
ИначеЕсли Направление="В" Тогда
ТочкаБ1=Новый Структура("Верх,Лево",ТочкаБ.Верх+ВысотаСтрелки,ТочкаБ.Лево);
ТочкаА2=Новый Структура("Верх,Лево",ТочкаБ1.Верх,ТочкаБ1.Лево-ШиринаСтрелки/2);
ТочкаБ2=Новый Структура("Верх,Лево",ТочкаБ1.Верх,ТочкаБ1.Лево+ШиринаСтрелки/2);
ИначеЕсли Направление="Н" Тогда
ТочкаБ1=Новый Структура("Верх,Лево",ТочкаБ.Верх-ВысотаСтрелки,ТочкаБ.Лево);
ТочкаА2=Новый Структура("Верх,Лево",ТочкаБ1.Верх,ТочкаБ1.Лево-ШиринаСтрелки/2);
ТочкаБ2=Новый Структура("Верх,Лево",ТочкаБ1.Верх,ТочкаБ1.Лево+ШиринаСтрелки/2);
ИначеЕсли Направление="ЛВ" Тогда
ТочкаБ1=Новый Структура("Верх,Лево",ТочкаБ.Верх+ВысБ1,ТочкаБ.Лево+ШирБ1);
ТочкаА2=Новый Структура("Верх,Лево",ТочкаБ1.Верх+ВысА2,ТочкаБ1.Лево-ШирА2);
ТочкаБ2=Новый Структура("Верх,Лево",ТочкаБ1.Верх-ВысА2,ТочкаБ1.Лево+ШирА2);
ИначеЕсли Направление="ЛН" Тогда
ТочкаБ1=Новый Структура("Верх,Лево",ТочкаБ.Верх-ВысБ1,ТочкаБ.Лево+ШирБ1);
ТочкаА2=Новый Структура("Верх,Лево",ТочкаБ1.Верх-ВысА2,ТочкаБ1.Лево-ШирА2);
ТочкаБ2=Новый Структура("Верх,Лево",ТочкаБ1.Верх+ВысА2,ТочкаБ1.Лево+ШирА2);
ИначеЕсли Направление="ПВ" Тогда
ТочкаБ1=Новый Структура("Верх,Лево",ТочкаБ.Верх+ВысБ1,ТочкаБ.Лево-ШирБ1);
ТочкаА2=Новый Структура("Верх,Лево",ТочкаБ1.Верх+ВысА2,ТочкаБ1.Лево+ШирА2);
ТочкаБ2=Новый Структура("Верх,Лево",ТочкаБ1.Верх-ВысА2,ТочкаБ1.Лево-ШирА2);
ИначеЕсли Направление="ПН" Тогда
ТочкаБ1=Новый Структура("Верх,Лево",ТочкаБ.Верх-ВысБ1,ТочкаБ.Лево-ШирБ1);
ТочкаА2=Новый Структура("Верх,Лево",ТочкаБ1.Верх-ВысА2,ТочкаБ1.Лево+ШирА2);
ТочкаБ2=Новый Структура("Верх,Лево",ТочкаБ1.Верх+ВысА2,ТочкаБ1.Лево-ШирА2);
КонецЕсли;
мСтрелка=Новый Массив;
р1=ЛинияАБ(ТабДок,ТочкаА,ТочкаБ1,СтильРисунка); мСтрелка.Добавить(р1);
р2=ЛинияАБ(ТабДок,ТочкаА2,ТочкаБ2,СтильРисунка);мСтрелка.Добавить(р2);
р3=ЛинияАБ(ТабДок,ТочкаА2,ТочкаБ,СтильРисунка); мСтрелка.Добавить(р3);
р4=ЛинияАБ(ТабДок,ТочкаБ2,ТочкаБ,СтильРисунка); мСтрелка.Добавить(р4);
Если Диаметр>0 Тогда
р5=Рисовать(ТабДок,"Эллипс", ТочкаА.Верх-Диаметр/2, ТочкаА.Лево-Диаметр/2,Диаметр,Диаметр);
мСтрелка.Добавить(р5);
КонецЕсли;
Возврат мСтрелка;
КонецФункции
// СтильРисунка- Структура
&НаКлиенте
Процедура УстановитьПараметрыРисунка(Рисунок,СтильРисунка=Неопределено)
Если ТипЗнч(СтильРисунка)= Тип("Структура") Тогда
Для Каждого ЭлС Из СтильРисунка Цикл
Попытка
Рисунок[ЭлС.Ключ]=ЭлС.Значение;
Исключение
КонецПопытки;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
Для 1С: 8.3 (8.3.11.2924).
Способ рисования стрелки плохой. В том смысле, что кроме стрелки ничего не нарисуешь. Вот если бы была функция преобразований координат, а стрелка рисовалась как набор линий в базовых координатах (словно она исходит из 0,0 и смотрит ровно вверх, например), тогда можно было бы вместо рисования стрелки что угодно отобразить в любом месте, под любым углом и масштабом.
(2)
с удовольствием посмотрю на ваш вариант
зы. я и не утверждаю что мой способ идеальный
достаточно лишь знать положение начальной точки и угол поворота относительно оси ординат
ну например ломаная линия с углом наклона +-30 относительно оси абцисс
Показать
Напомнило язык ЛОГО (он же — «черепашка»). На ЭВМ Электроника в школе «баловались».
(5)
не видел,
имо смахивает на программирование для ЧПУ (без Z и управляющих кодов)
Я тоже ЛОГО не видел. Помню только что-то бэйсик-подобное на русском языке.
А гляньте публикции Ильдаровича. Там было нечто с рисованием в таб.документе, с кривыми любого порядка.
(9) киньте ссылку если можно.
вряд ли там есть стрелки , он такими пустяками не занимается
Там не стрелки. Он графы отрисовывал.
(4)
Вот и он: