Рисуем стрелки в табличном документе



Рисуем стрелки средствами 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).

9 Comments

  1. WalterMort

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

    Reply
  2. pm74

    (2)

    Способ рисования стрелки плохой.

    с удовольствием посмотрю на ваш вариант

    зы. я и не утверждаю что мой способ идеальный

    Вот если бы была функция преобразований координат

    достаточно лишь знать положение начальной точки и угол поворота относительно оси ординат

    ну например ломаная линия с углом наклона +-30 относительно оси абцисс

    &НаКлиенте
    Процедура ЛоманаяЛиния(Команда)
    Амплитуда= 30;
    ТочкаА = Новый Структура(«Верх,Лево»,30,30);
    Размер = 10;
    Для ё = 1 по 10 Цикл
    Знак = ?(ё%2=0,-1,1);
    Угол = 90+Знак*Амплитуда;
    Гипотенуза(Размер,Угол,ТочкаА);
    КонецЦикла;
    КонецПроцедуры
    
    &НаКлиенте
    Процедура Гипотенуза(Знач Размер,Знач УголГрад,ТочкаА)
    Pi = 3.1415926535897932;
    УлолРад = УголГрад*Pi/180;
    Л=ТочкаА.Лево+sin(УлолРад)*Размер;
    В=ТочкаА.Верх-cos(УлолРад)*Размер;
    ТочкаБ =Новый Структура(«Верх,Лево»,В,Л);
    ЛинияАБ(ТабДок,ТочкаА,ТочкаБ);
    ТочкаА = ТочкаБ;
    КонецПроцедуры
    

    Показать

    Reply
  3. &rew

    Напомнило язык ЛОГО (он же — «черепашка»). На ЭВМ Электроника в школе «баловались».

    Reply
  4. pm74

    (5)

    черепашка

    не видел,

    имо смахивает на программирование для ЧПУ (без Z и управляющих кодов)

    Reply
  5. Поручик

    Я тоже ЛОГО не видел. Помню только что-то бэйсик-подобное на русском языке.

    Reply
  6. Yashazz

    А гляньте публикции Ильдаровича. Там было нечто с рисованием в таб.документе, с кривыми любого порядка.

    Reply
  7. pm74

    (9) киньте ссылку если можно.

    вряд ли там есть стрелки , он такими пустяками не занимается

    Reply
  8. Yashazz

    Там не стрелки. Он графы отрисовывал.

    Reply
  9. WalterMort

    (4)

    с удовольствием посмотрю на ваш вариант

    Вот и он:

    https://infostart.ru/public/872775/

    Reply

Leave a Comment

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