Трехмерная печать из приложения универсальная платформа 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