Поделиться через


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