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

Программирование - Работа с интерфейсом

рисование нужные вещи табличный документ

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

46

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

Наименование Файл Версия Размер
Рисуем стрелки в табличном документе:
.epf 8,24Kb
01.06.18
7
.epf 8,24Kb 7 Скачать

См. также

Комментарии
Избранное Подписка Сортировка: Древо
2. WalterMort 279 02.06.18 14:04 Сейчас в теме
Способ рисования стрелки плохой. В том смысле, что кроме стрелки ничего не нарисуешь. Вот если бы была функция преобразований координат, а стрелка рисовалась как набор линий в базовых координатах (словно она исходит из 0,0 и смотрит ровно вверх, например), тогда можно было бы вместо рисования стрелки что угодно отобразить в любом месте, под любым углом и масштабом.
4wheel; Азверин; +2 Ответить
4. pm74 127 02.06.18 22:02 Сейчас в теме
(2)
Способ рисования стрелки плохой.

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

достаточно лишь знать положение начальной точки и угол поворота относительно оси ординат
ну например ломаная линия с углом наклона +-30 относительно оси абцисс
&НаКлиенте
Процедура ЛоманаяЛиния(Команда)
	Амплитуда= 30;
	ТочкаА = Новый Структура("Верх,Лево",30,30);
	Размер = 10;
	Для ё = 1 по 10 Цикл 
		Знак = ?(ё%2=0,-1,1);
		Угол = 90+Знак*Амплитуда;
		Гипотенуза(Размер,Угол,ТочкаА);
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура Гипотенуза(Знач Размер,Знач УголГрад,ТочкаА)
	Pi = 3.1415926535897932;
	УлолРад = УголГрад*Pi/180;
	Л=ТочкаА.Лево+sin(УлолРад)*Размер;
	В=ТочкаА.Верх-cos(УлолРад)*Размер;
	ТочкаБ =Новый Структура("Верх,Лево",В,Л);
	ЛинияАБ(ТабДок,ТочкаА,ТочкаБ);
	ТочкаА = ТочкаБ;
КонецПроцедуры
Показать
Прикрепленные файлы:
12. WalterMort 279 24.07.18 15:29 Сейчас в теме
(4)
с удовольствием посмотрю на ваш вариант


Вот и он:

https://infostart.ru/public/872775/
5. &rew 7 04.06.18 06:58 Сейчас в теме
Напомнило язык ЛОГО (он же - "черепашка"). На ЭВМ Электроника в школе "баловались".
SlavaKron; romanco; Sla; +3 Ответить
6. pm74 127 04.06.18 07:39 Сейчас в теме
(5)
черепашка
не видел,
имо смахивает на программирование для ЧПУ (без Z и управляющих кодов)
7. Поручик 4153 04.06.18 08:08 Сейчас в теме
Я тоже ЛОГО не видел. Помню только что-то бэйсик-подобное на русском языке.
9. Yashazz 2295 19.07.18 20:27 Сейчас в теме
А гляньте публикции Ильдаровича. Там было нечто с рисованием в таб.документе, с кривыми любого порядка.
10. pm74 127 19.07.18 20:36 Сейчас в теме
(9) киньте ссылку если можно.
вряд ли там есть стрелки , он такими пустяками не занимается
11. Yashazz 2295 19.07.18 22:03 Сейчас в теме
Там не стрелки. Он графы отрисовывал.
Оставьте свое сообщение