gifts2017

1C.Net:Предприятие + DirectX = 3D-графика на формах 1С:Предприятие

Опубликовал Сергей Карташев (Elisy) в раздел Программирование - Работа с интерфейсом

Представленный пример для 1С:Предприятие 8.1 посвящен трехмерной графике. Информации по использованию 3d в 1С Интернет не предоставляет. Пример будет полезен 1С-разработчикам, программирующим для души. Так как пока сложно представить бухгалтеров, как в игре, гуляющих внутри 1С по виртуальным 3д-складам, листающих виртуальные 3д-журналы документов. Хотя почему бы и нет. Кто знает, что нас ждет через несколько лет и как изменятся знакомые нам программы.

Представленный пример для 1С:Предприятие 8.1 посвящен трехмерной графике. Информации по использованию 3d в 1С Интернет не предоставляет. Пример будет полезен 1С-разработчикам, программирующим для души. Так как пока сложно представить бухгалтеров, как в игре, гуляющих внутри 1С по виртуальным 3д-складам, листающих виртуальные 3д-журналы документов. Хотя почему бы и нет. Кто знает, что нас ждет через несколько лет и как изменятся знакомые нам программы.

Сразу нужно отметить, что информации по 3D-программированию на .Net Framework на русском языке также практически нет. На английском языке достойных статей единицы и за основу примера взята статья «Windows Presentation Foundation (WPF) 3D Tutorial». Статья объемная и перевод ее на русский может занять много времени, поэтому здесь перевод не представлен. У кого проблемы с английским, предлагаю воспользоваться хорошим сервисом Google Translate для перевода.

Как WPF использует DirectX

Применение в приложениях .Net-технологии для работы с богатой графикой WPF (Windows Presentation Foundation) уже подразумевает использование DirectX. Ниже представлена схема ключевых компонентов WPF, где показано, что на нижнем уровне расположена технология DirectX.

Архитектура WPF. Место в ней DirectX.

WPF (Windows Presentation Foundation) в своей работе использует DIrectX. Для этих целей служит MILCORE (Media Integration Layer Core) – неуправляемый компонент, который обрабатывает 2d, 3d, анимацию, обращаясь к DirectX. Скорость работы – достоинства DirectX – это главная причина, по которой milcore оформлен как неуправляемый компонент. Milcore – это интерфейс между DirectX и CLR (Common Language Runtime). Сборка PresentationCore не содержит элементов управления, но содержит базовые типы для определения UI-элементов. PresentationFramework содержит определения элементов управления WPF и реализацию связанной функциональности.

Как DirectX использовать в 1С:Предприятие

Когда речь в 1С заходит о .Net framework, на выручку приходит компонент Elisy .Net Bridge. Компонент достаточно описан в Интернете, для него написаны десятки примеров. В данном случае за основу будет взят пример, показывающий, как вставлять WPF-контрол на форму 1С. Больше информации на этот счет можно найти в статье «1C.Net:Предприятие – использование богатых графических возможностей .Net framework». Суть проблемы вставки WPF-контрола сводится к использованию вспомогательного ActiveX-компонента Elisy.HwndHost, в котором необходимо реализовать обработчик события Created.

Интерфейс в WPF описывается языком XAML. Файл описания прикреплен к внешней обработке в виде макета Xaml. В файле описания ключевым объектом является класс Viewport3D с именем mainViewport. В нем определены камера (PerspectiveCamera) и освещение (DirectionalLight). Свойства камеры настраиваются через интерфейс пользователя и хранятся в реквизитах внешней обработки.

Впечатление от примера

Работа с 3d-графикой в любой среде, будь то С++, С# или 1С – дело не из простых. Но сама возможность использования трехмерной графики в 1С:Предприятие, о которой раньше можно было только мечтать, ставит 1С наравне с другими популярными системами.

Результат примера - 3d-поверхность

Чтобы разрабатывать с успехом 3d-приложения, нужно вспомнить курс старших классов школы и понимать векторы, точки в трехмерном пространстве, нормали к поверхностям.

Результат примера - куб

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

Весь пример изобилует обращением к пространству имен System.Windows.Media.Media3D, информацию о котором можно найти на MSDN даже на русском языке.

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

Выводы

Тема трехмерной графики в 1С достаточно новая, В связи с этим в сети Интернет нельзя найти примеров подобного подключения. Получается, что приведенный здесь пример является пионером в 3d-графике. К достоинствам можно отнести полную интеграцию с 1С, где прорисовка ведется в форме с другими родными элементами управления 1С.

Хотя практическую ценность технологии применительно к 1С придумать сложно. Фантазия подсказывает только виртуальный 3д-склад или планограмму марчендайзеров. Тем не менее, методика позволяет программировать на 1С для души. Ведь многие молодые разработчики мечтают в будущем создавать игры, а технология позволит им попрактиковаться на знакомой 1С-системе прямо сейчас.

Ссылки по теме

Оригинальный пример на C#: «Windows Presentation Foundation (WPF) 3D Tutorial»

System.Windows.Media.Media3D - пространство имен

1C.Net:Предприятие – использование богатых графических возможностей .Net Framework

3D in XAML (на английском языке)

// //

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

Наименование Файл Версия Размер
Генератор 3d-графики для 1C 8.2 и .Net Bridge 4 16
.epf 27,85Kb
10.11.14
16
.epf 27,85Kb Скачать
Генератор 3d-графики для 1C 8.1 214
.epf 28,31Kb
10.11.14
214
.epf 28,31Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. A.Y 24.06.10 09:03
А моделирование окон?
К примеру производство окон.
Там надо вбить параметры, рассчитать материалы и вывести макет будущего окна на экран.
Сюда же можно это прикрутить?
2. Сергей Карташев (Elisy) 24.06.10 09:23
(1) Если разобраться в принципах 3д-моделирования, то можно. Проблема в том, что это целая наука, требующая время на освоение. Многие моменты требуют знаний в высшей математике.
Применительно к окнам ребята из АТехголоджи подготовили целый проект на .Net и "глубоко" внедрили его в 1С. Вот ссылка на Инфостарт: 1C.Net:Предприятие – пример коммерческого успеха .Net-решений в России
3. viollan (viollan) 24.06.10 18:01
(1) Можно и моделирование окон сюда прикрутить. Только удобнее написать на C# отдельную сборку и подключить используя Elisy подключить.
4. o.nikolaev.infostart (o.nikolaev) 04.07.10 03:44
Общее замечание - это не первый в интернете пример работы 1С с 3d :) В свое время еще Гений 1С (который сотик за секс толкал :D ) публиковал пример работы с VRML в 7.7. Причем там строилась структура склада.
(2) АТехнолоджи рулит. Особенно WinDraw. То что они встроили в 1С-ину - довольно сильно урезанная версия их флагманского продукта.
5. Сергей Карташев (Elisy) 05.07.10 08:14
(4) Что-то ссылок при написании статьи не смог найти на 3д-графику в 1С :) Если есть ссылки на статьи таких работ, давайте. Я обязательно напишу в статье. А то информации совсем мало.
Вы тогда скажите еще - чего в 1С сделать никак не удалось до сих пор. :) Может мне удастся примеры сделать. Анимация на формах была?
6. me Halyna (mehalyna) 24.10.11 20:38
Хорошая идея! Действительно можна визуализировать работу на складах. Огромная просьба, дайте ссылки на статьи по работе с 3d-графикой в 1С! Заранее благодарен!
7. Сергей Карташев (Elisy) 25.10.11 09:32
(6) К сожалению вышла только одна статья о 3д в 1С. Оригинальная статья, которая опубликована на Инфостарт, находится здесь:
http://www.richmedia.us/post/2010/06/23/1c-directx-wpf.aspx
8. Дмитрий Сосенков (oiter) 29.11.11 10:23
Спасибо за пример. Были мысли реализовать один проект с использованием 3D. У нас в компании такое реализовано через DLL библиотеку, написанную на Delphi + OpenGL. Эта библиотека генерировала отдельное окно, которое или пряталось за окно 1С, или, если делали поверх окон, закрывала 1С собой, пока не закроешь. Короче есть минусы в работе. Библиотека прикручена к 1С и позволяет наглядно увидеть расположение на карте списанные в производство оборудование.
Теперь вот пытаюсь заменить данную DLL на нечто, указанное в примере.
9. Сергей Карташев (Elisy) 30.11.11 15:45
(8) Самое обидное, что использование 3д требует специальных знаний. И чтобы профессионально работать с трехмерной графикой, нужно этому посвятить всю жизнь.
Есть идея еще таким же образом использовать игровую XNA-платформу. Вроде, она тоже дружит с .Net framework и подключается аналогично.
10. Ivan Segeda (john-nnov) 01.11.12 23:47
Ни кто эту тему больше не развивал?
11. Сергей Карташев (Elisy) 02.11.12 09:15
(10) john-nnov,
Ни кто эту тему больше не развивал?

Вы имеете ввиду 3d или вообще визуальные компоненты .Net (wpf/winforms)?
12. Ivan Segeda (john-nnov) 02.11.12 11:10
13. Сергей Карташев (Elisy) 02.11.12 12:39
(12) john-nnov,
Визуальные компоненты .Net в 1С 8 хорошо себя проявили при планировании в "оконных" компаниях

14. me Halyna (mehalyna) 19.04.13 12:48
Да... Идея хорошая. Это бы еще и реализовать. Спасибо за подборку информации и полезные ссылки!
15. Павел С (pavel_pss) 18.06.13 10:21
16. Павел С (pavel_pss) 18.06.13 12:30
Было бы еще не плохо если бы ты выложил dll или ссылку где можно скачать.
17. Сергей Карташев (Elisy) 18.06.13 13:29
(16) pavel_pss,
Было бы еще не плохо если бы ты выложил dll или ссылку где можно скачать.

http://infostart.ru/public/20035/

Последние версии здесь:
http://www.1csoftware.com/forums/viewtopic.php?f=9&t=13&start=10
доступны для скачивания после регистрации
18. Алина Иванова (alina0587) 09.11.14 18:06
Уважаемый Elisy!
Меня очень заинтересовала Ваша разработка по 3D-графике в 1С.
Разрешите задать Вам вопрос.
Как мне нарисовать линию в трехмерном пространстве, используя Ваши компоненты? (Я знаю набор координат x,y,z).

Заранее спасибо за ответ!
19. Сергей Карташев (Elisy) 10.11.14 08:15
(18) alina0587,
Добрый день, Алина
Код для вывода 3д-линии с координатами 0, 0, 0 - 5, 0, 0 будет следующий:
	normal0Wire = net.New("_3DTools.ScreenSpaceLines3D");
	normal0Wire.Thickness = 1;
	normal0Wire.Color = net.GetStatic("System.Windows.Media.Colors", "Blue");
	
	point0 = net.New("System.Windows.Media.Media3D.Point3D", 0, 0, 0);
	normal0Wire.Points.Add(point0);
	point1 = net.New("System.Windows.Media.Media3D.Point3D", 5, 0, 0);
	normal0Wire.Points.Add(point1);
	
	_mainViewport.Children.Add(normal0Wire);
...Показать Скрыть


Обновил в статье обработку для 8.2 и .Net Bridge 4
20. Midasu Milfords (Midasu) 06.02.15 09:23
В номенклатуру грузить модели товара!