Трехмерная печать из приложения универсальная платформа Windows
Узнайте, как добавить 3D-функции печати в приложение универсальная платформа Windows (UWP).
В этом разделе описывается загрузка трехмерных геометрических данных в приложение и запуск 3D-диалогового окна печати после обеспечения печати трехмерной модели и правильного формата. Рабочий пример этих процедур см. в примере 3D-печати UWP.
Важные API
Настройка
Добавьте пространство имен Windows.Graphics.Printing3D в класс приложения, требующий функциональных возможностей трехмерной печати.
using Windows.Graphics.Printing3D;
В этом руководстве также будут использоваться следующие пространства имен.
using System;
using Windows.Storage;
using Windows.Storage.Pickers;
using Windows.Storage.Streams;
using Windows.System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
Затем присвойте классу полезные поля участников.
- Объявите объект Print3DTask , чтобы представить задачу печати, передаваемую драйверу печати.
- Объявите объект StorageFile для хранения исходного трехмерного файла данных, который будет загружен в приложение.
- Объявите объект Print3D3MFPackage , чтобы представить готовую к печати трехмерную модель со всеми необходимыми метаданными.
private Print3DTask printTask;
private StorageFile file;
private Printing3D3MFPackage package = new Printing3D3MFPackage();
Создание простого пользовательского интерфейса
В этом примере используется кнопка "Загрузить" для передачи файла в память программы, кнопка "Исправление", чтобы внести необходимые изменения в файл, а также кнопку "Печать" для запуска задания печати. Следующий код создает эти кнопки (с их обработчиками событий по щелчку) в соответствующем XAML-файле класса .cs.
<StackPanel Orientation="Vertical" VerticalAlignment="Center">
<Button x:Name="loadbutton" Content="Load Model from File" HorizontalAlignment="Center" Margin="5,5,5,5" VerticalAlignment="Center" Click="OnLoadClick"/>
<Button x:Name="fixbutton" Content="Fix Model" HorizontalAlignment="Center" Margin="5,5,5,5" VerticalAlignment="Center" Click="OnFixClick"/>
<Button x:Name="printbutton" Content="Print" HorizontalAlignment="center" Margin="5,5,5,5" VerticalAlignment="Center" Click="OnPrintClick"/>
Пример также включает textBlock для обратной связи пользовательского интерфейса.
<TextBlock x:Name="OutputTextBlock" TextAlignment="Center"></TextBlock>
</StackPanel>
Получение трехмерных данных
Метод, с помощью которого ваше приложение получает трехмерные данные геометрии, может отличаться. Приложение может получить данные из трехмерного сканирования, скачать данные модели из веб-ресурса или создать трехмерную сетку программным способом с помощью математических формул или пользовательских входных данных. Здесь показано, как загрузить трехмерный файл данных (любого из нескольких распространенных типов файлов) в память программы из хранилища устройств. Библиотека моделей 3D Builder предоставляет различные модели для скачивания.
В методе OnLoadClick
класс FileOpenPicker загружает один файл в память приложения.
В следующем коде показано, как загрузить один файл в память приложения с помощью класса FileOpenPicker в методеOnLoadClick
.
private async void OnLoadClick(object sender, RoutedEventArgs e) {
FileOpenPicker openPicker = new FileOpenPicker();
// allow common 3D data file types
openPicker.FileTypeFilter.Add(".3mf");
openPicker.FileTypeFilter.Add(".stl");
openPicker.FileTypeFilter.Add(".ply");
openPicker.FileTypeFilter.Add(".obj");
// pick a file and assign it to this class' 'file' member
file = await openPicker.PickSingleFileAsync();
if (file == null) {
return;
}
Использование трехмерного построителя для преобразования в трехмерный формат производства (.3mf)
Трехмерные геометрические данные могут поступать в различных форматах, и не все они эффективны для трехмерной печати. Windows использует тип файла трехмерного формата (3mf) для всех задач печати трехмерной печати.
Дополнительные сведения о 3MF и поддерживаемых функциях для производителей и потребителей трехмерного продукта см. в спецификации 3MF. Сведения об использовании этих функций с API Windows см. в руководстве по созданию пакета 3MF.
Примечание.
Приложение 3D Builder может открывать файлы самых популярных трехмерных форматов и сохранять их в виде 3mf-файлов. Он также предоставляет средства для редактирования моделей, добавления цветных данных и выполнения других операций с печатью.
В этом примере, где тип файла может отличаться, можно открыть приложение 3D Builder и предложить пользователю сохранить импортированные данные в виде 3mf-файла, а затем перезагрузить его.
// if user loaded a non-3mf file type
if (file.FileType != ".3mf") {
// elect 3D Builder as the application to launch
LauncherOptions options = new LauncherOptions();
options.TargetApplicationPackageFamilyName = "Microsoft.3DBuilder_8wekyb3d8bbwe";
// Launch the retrieved file in 3D builder
bool success = await Windows.System.Launcher.LaunchFileAsync(file, options);
// prompt the user to save as .3mf
OutputTextBlock.Text = "save " + file.Name + " as a .3mf file and reload.";
// have user choose another file (ideally the newly-saved .3mf file)
file = await openPicker.PickSingleFileAsync();
} else {
// if the file type is .3mf
// notify user that load was successful
OutputTextBlock.Text = file.Name + " loaded as file";
}
}
Восстановление данных модели для трехмерной печати
Не все трехмерные данные модели печатаются даже в типе .3mf. Чтобы принтер правильно определить, какое пространство заполняется и что оставить пустым, каждая модель должна быть одной простой сеткой, иметь внешние обычные поверхности и иметь геометрию многоточия. Проблемы в этих областях могут возникнуть в различных формах и могут быть трудно обнаружить в сложных формах. Однако современные программные решения часто достаточно для преобразования необработанной геометрии в печатные трехмерные фигуры. Это называется восстановлением модели и реализуется в методе, показанном OnFixClick
здесь.
Примечание.
Для реализации IRandomAccessStream необходимо преобразовать трехмерный файл данных, который затем можно использовать для создания объекта Printing3DModel.
private async void OnFixClick(object sender, RoutedEventArgs e) {
// read the loaded file's data as a data stream
IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.Read);
// assign a Printing3DModel to this data stream
Printing3DModel model = await package.LoadModelFromPackageAsync(fileStream);
// use Printing3DModel's repair function
OutputTextBlock.Text = "repairing model";
var data = model.RepairAsync();
Объект Print3DModel теперь должен быть исправлен и напечатан. Используйте SaveModelToPackageAsync, чтобы назначить модель объекту Printing3D3MFPackage, объявленному при создании класса.
// save model to this class' Printing3D3MFPackage
OutputTextBlock.Text = "saving model to 3MF package";
await package.SaveModelToPackageAsync(model);
}
Выполнение задачи печати: создание обработчика TaskRequested
Позже, когда 3D-диалоговое окно печати отображается пользователю, и пользователь выбирает, чтобы начать печать, приложение потребуется передать нужные параметры в конвейер трехмерной печати. API печати трехмерной печати вызовет событие TaskRequested , которое требует правильной обработки.
private void MyTaskRequested(Print3DManager sender, Print3DTaskRequestedEventArgs args) {
Основной целью этого метода является использование параметра args для отправки объекта Printing3D3MFPackage вниз конвейера. Тип Print3DTaskRequestedEventArgs имеет одно свойство: Request. Он имеет тип Print3DTaskRequest и представляет один запрос задания печати. Его метод CreateTask позволяет приложению отправлять правильные сведения для задания печати и возвращать ссылку на объект Print3DTask , который был отправлен по конвейеру трехмерной печати.
CreateTask имеет следующие входные параметры: строку для имени задания печати, строку для используемого идентификатора принтера и делегат Print3DTaskSourceRequestedHandler . Делегат вызывается автоматически при вызове события 3DTaskSourceRequested (это делается самим API). Важно отметить, что этот делегат вызывается при запуске задания печати и отвечает за предоставление правильного трехмерного пакета печати.
Print3DTaskSourceRequestedHandler принимает один параметр, объект Print3DTaskSourceRequestedArgs , содержащий отправленные данные. Метод SetSource принимает пакет для печати. В следующем коде показана реализация делегата Print3DTaskSourceRequestedHandler (sourceHandler
).
// this delegate handles the API's request for a source package
Print3DTaskSourceRequestedHandler sourceHandler = delegate (Print3DTaskSourceRequestedArgs sourceRequestedArgs) {
sourceRequestedArgs.SetSource(package);
};
Затем вызовите CreateTask, используя только что определенный делегат.
// the Print3DTaskRequest ('Request'), a member of 'args', creates a Print3DTask to be sent down the pipeline.
printTask = args.Request.CreateTask("Print Title", "Default", sourceHandler);
Возвращенная функция Print3DTask назначается переменной класса, объявленной в начале. Эту ссылку можно использовать для обработки определенных событий, создаваемых задачей.
// optional events to handle
printTask.Completed += Task_Completed;
printTask.Submitting += Task_Submitting;
Примечание.
Необходимо реализовать Task_Submitting
метод и Task_Completed
метод, если вы хотите зарегистрировать их в этих событиях.
Выполнение задачи печати: открытие 3D-диалогового окна печати
Наконец, необходимо запустить 3D-диалоговое окно печати, которое предоставляет ряд вариантов печати.
Здесь мы регистрируем MyTaskRequested
метод с помощью события TaskRequested .
private async void OnPrintClick(object sender, RoutedEventArgs e) {
// get a reference to this class' Print3DManager
Print3DManager myManager = Print3DManager.GetForCurrentView();
// register the method 'MyTaskRequested' to the Print3DManager's TaskRequested event
myManager.TaskRequested += MyTaskRequested;
После регистрации обработчика событий TaskRequested можно вызвать метод ShowPrintUIAsync, который открывает 3D-диалоговое окно печати в текущем окне приложения.
// show the 3D print dialog
OutputTextBlock.Text = "opening print dialog";
var result = await Print3DManager.ShowPrintUIAsync();
Кроме того, рекомендуется отменять регистрацию обработчиков событий после возобновления управления приложением.
// remove the print task request after dialog is shown
myManager.TaskRequested -= MyTaskRequested;
}
См. также
Трехмерная печать с помощью Windows 10Создание пакета 3MF
Пример 3D-печати UWP