Трехмерная печать из приложения универсальная платформа Windows
Узнайте, как добавить функции трехмерной печати в приложение универсальная платформа Windows (UWP).
В этом разделе рассматривается, как загрузить трехмерные геометрические данные в приложение и открыть диалоговое окно трехмерной печати после того, как вы убедитесь, что ваша трехмерная модель пригодна для печати и выполнена нужном формате. Работающий пример этих процедур см. в статье Пример трехмерной печати 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 для хранения исходного файла трехмерных данных, которые будут загружаться в приложение.
- Объявите объект Printing3D3MFPackage для представления готовой к печати трехмерной модели со всеми необходимыми метаданными.
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;
}
Использование 3D Builder для преобразования в 3D Manufacturing Format (.3mf)
Трехмерные геометрические данные могут поступать в различных форматах, и не все они эффективны для трехмерной печати. Windows использует тип файла 3D Manufacturing Format (.3mf) для всех задач трехмерной печати.
Дополнительные сведения о 3MF и поддерживаемых функциях для производителей и потребителей трехмерного продукта см. в спецификации 3MF . Сведения о том, как использовать эти функции с API-интерфейсами Windows, см. в руководстве По созданию пакета 3MF .
Примечание
Приложение 3D Builder может открывать файлы наиболее распространенных 3D-форматов и сохранять их в виде 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();
Объект Printing3DModel теперь должен быть восстановлен и напечатан. С помощью метода SaveModelToPackageAsync назначьте модель объекту Printing3D3MFPackage, объявленному при создании класса.
// save model to this class' Printing3D3MFPackage
OutputTextBlock.Text = "saving model to 3MF package";
await package.SaveModelToPackageAsync(model);
}
Выполнение задачи печати: создание обработчика TaskRequested
Позже, когда для пользователя откроется диалоговое окно трехмерной печати и пользователь решит начать печать, приложению потребуется передать нужные параметры в конвейер трехмерной печати. API трехмерной печати вызовет событие TaskRequested , которое требует соответствующей обработки.
private void MyTaskRequested(Print3DManager sender, Print3DTaskRequestedEventArgs args) {
Основное назначение этого метода — использовать параметр args для отправки пакета Printing3D3MFPackage по конвейеру. Тип Print3DTaskRequestedEventArgs имеет одно свойство: Request. Оно имеет тип Print3DTaskRequest и представляет один запрос задания печати. Его метод CreateTask позволяет приложению отправлять правильные сведения для задания печати и возвращать ссылку на объект Print3DTask , отправленный в конвейер трехмерной печати.
CreateTask имеет следующие входные параметры: string для имени задания печати, string для идентификатора используемого принтера и делегат 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
, если требуется зарегистрировать их для этих событий.
Выполнение задачи печати: открытие диалогового окна трехмерной печати
Наконец, необходимо запустить диалоговое окно трехмерной печати, которое предоставляет ряд вариантов печати.
Здесь мы регистрируем 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, который открывает диалоговое окно трехмерной печати в текущем окне приложения.
// 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-пакет
Пример трехмерной печати UWP
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по