Impressão 3D a partir de seu aplicativo3D printing from your app

APIs importantesImportant APIs

Saiba como adicionar a funcionalidade de impressão 3D ao seu aplicativo Universal do Windows.Learn how to add 3D printing functionality to your Universal Windows app. Este tópico aborda como carregar dados de geometria 3D em seu aplicativo e iniciar a caixa de diálogo de impressão 3D após assegurar que seu modelo 3D é imprimível e está no formato correto.This topic covers how to load 3D geometry data into your app and launch the 3D print dialog after ensuring your 3D model is printable and in the correct format. Para obter um exemplo de trabalho desses procedimentos, consulte o Exemplo UWP de impressão 3D.For a working example of these procedures, see the 3D printing UWP sample.

Observação

No código de exemplo deste guia, os relatórios e o tratamento de erros estão bastante simplificados por questões de simplicidade.In the sample code in this guide, error reporting and handling is greatly simplified for the sake of simplicity.

InstalaçãoSetup

Na classe de aplicativo que terá a funcionalidade de impressão 3D, insira o namespace Windows.Graphics.Printing3D.In your application class that is to have 3D print functionality, add the Windows.Graphics.Printing3D namespace.

using Windows.Graphics.Printing3D;

Os seguintes namespaces adicionais serão usados nesta guia:The following additional namespaces will be used in this guide.

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;

Em seguida, dê à sua classe campos de membro úteis.Next, give your class helpful member fields. Declare um objeto Print3DTask para representar a tarefa de impressão que deve ser passada para o driver de impressão.Declare a Print3DTask object to represent the printing task that is to be passed to the print driver. Declare um objeto StorageFile para armazenar o arquivo de dados 3D original que será carregado no aplicativo.Declare a StorageFile object to hold the original 3D data file that will be loaded into the app. Declare um objeto Printing3D3MFPackage que representa um modelo 3D pronto para imprimir com todos os metadados necessários.Declare a Printing3D3MFPackage object, which represents a print-ready 3D model with all necessary metadata.

private Print3DTask printTask;
private StorageFile file;
private Printing3D3MFPackage package = new Printing3D3MFPackage();

Crie uma interface do usuário simplesCreate a simple UI

Este exemplo apresenta três controles de usuário: um botão de carregamento, que levará um arquivo para a memória de programa, um botão de correção, que modificará o arquivo conforme necessário e um botão de impressão, que iniciará o trabalho de impressão.This sample features three user controls: a Load button which will bring a file into program memory, a Fix button which will modify the file as necessary, and a Print button which will initiate the print job. O código a seguir cria esses botões (com seus manipuladores de eventos ao clicar) no arquivo XAML correspondente da sua classe .cs:The following code creates these buttons (with their on-click event handlers) in your .cs class' corresponding XAML file.

<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"/>

Insira um TextBlock para feedback de interface do usuário.Add a TextBlock for UI feedback.

    <TextBlock x:Name="OutputTextBlock" TextAlignment="Center"></TextBlock>
</StackPanel>

Obtenha os dados 3DGet the 3D data

O método pelo qual o seu aplicativo obtém dados de geometria 3D varia.The method by which your app acquires 3D geometry data will vary. Seu aplicativo pode recuperar dados de uma varredura 3D, baixar dados de modelo de um recurso da web ou gerar uma malha 3D de forma programática usando fórmulas matemáticas ou entrada do usuário.Your app may retrieve data from a 3D scan, download model data from a web resource, or generate a 3D mesh programmatically using mathematical formulas or user input. Por questões de simplicidade, este guia mostrará como carregar um arquivo de dados 3D (de qualquer um dos vários tipos de arquivo comuns) em memória de programa do armazenamento do dispositivo.For the sake of simplicity, this guide will show how to load a 3D data file (of any of several common file types) into program memory from device storage. A biblioteca de modelos 3D Builder fornece uma variedade de modelos que você pode baixar facilmente em seu dispositivo.The 3D Builder model library provides a variety of models that you can easily download to your device.

Em seu método OnLoadClick, use a classe FileOpenPicker para carregar um único arquivo na memória do seu aplicativo.In your OnLoadClick method, use the FileOpenPicker class to load a single file into your app's memory.

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;
    }

Use o 3D Builder para converter em Formato de manufatura 3D (.3mf)Use 3D Builder to convert to 3D Manufacturing Format (.3mf)

Neste momento, você pode carregar um arquivo de dados 3D na memória do seu aplicativo.At this point, you are able to load a 3D data file into your app's memory. Entretanto, dados de geometria 3D pode vir em muitos formatos diferentes, e nem todos são eficientes para impressão 3D.However, 3D geometry data can come in many different formats, and not all are efficient for 3D printing. O Windows 10 usa o tipo de arquivo no Formato de manufatura 3D (.3mf) para todas as tarefas de impressão 3D.Windows 10 uses the 3D Manufacturing Format (.3mf) file type for all 3D printing tasks.

Observação

O tipo de arquivo .3mf oferece mais funcionalidades que são abordadas neste tutorial.The .3mf file type offers more functionality than is covered in this tutorial. Para saber mais sobre 3MF e os recursos que ele fornece produtores e consumidores de produtos 3D, consulte o 3MF especificação.To learn more about 3MF and the features it provides to producers and consumers of 3D products, see the 3MF Specification. Para saber como utilizar esses recursos com as APIs do Windows 10, consulte o tutorial Gerar um pacote 3MF.To learn how to utilize these features with Windows 10 APIs, see the Generate a 3MF package tutorial.

O aplicativo 3D Builder pode abrir arquivos nos formatos 3D mais populares e salvá-los como arquivos .3mf.The 3D Builder app can open files of most popular 3D formats and save them as .3mf files. Neste exemplo, onde o tipo de arquivo pode variar, uma solução muito simples é abrir o aplicativo 3D Builder e solicitar que o usuário salve os dados importados como um arquivo .3mf e recarregue-o.In this example, where the file type could vary, a very simple solution is to open the 3D Builder app and prompt the user to save the imported data as a .3mf file and then reload it.

Observação

Além de converter formatos de arquivo, o 3D Builder oferece ferramentas simples para editar seus modelos, adicionar dados de cor e realizar outras operações específicas de impressão; portanto, costuma valer a pena integrá-lo a um aplicativo que lida com impressão 3D.In addition to converting file formats, 3D Builder provides simple tools to edit your models, add color data, and perform other print-specific operations, so it is often worth integrating into an app that deals with 3D printing.

    // 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";
    }
}

Repare os dados do modelo de impressão 3DRepair model data for 3D printing

Nem todos os dados de modelo 3D podem ser impressos, mesmo no tipo de .3mf.Not all 3D model data is printable, even in the .3mf type. Para a impressora determinar corretamente o espaço de preenchimento e o que deixar em branco, o modelo a ser impresso deve ser uma única malha consistente, ter normais de superfície voltados para o exterior e ter uma geometria variada.In order for the printer to correctly determine what space to fill and what to leave empty, the model(s) to be printed must (each) be a single seamless mesh, have outward-facing surface normals, and have manifold geometry. Problemas nessas áreas podem surgir de várias formas diferentes e ser difíceis de se perceber em formatos complexos.Issues in these areas can arise in a variety of different forms and can be hard to spot in complex shapes. No entanto, soluções de software modernas costumam ser adequadas para converter geometria crua em formatos 3D imprimíveis.However, modern software solutions are often adequate for converting raw geometry to printable 3D shapes. Isso é conhecido como reparar o modelo e será feito no método OnFixClick.This is known as repairing the model and will be done in the OnFixClick method.

O arquivo de dados 3D deve ser convertido para implementar o IRandomAccessStream, que pode ser usado para gerar um objeto Printing3DModel.The 3D data file must be converted to implement IRandomAccessStream, which can then be used to generate a Printing3DModel object.

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();

O objeto Printing3DModel agora está reparado e imprimível.The Printing3DModel object is now repaired and printable. Use SaveModelToPackageAsync para atribuir o modelo para o objeto Printing3D3MFPackage que você declarou ao criar a classe.Use SaveModelToPackageAsync to assign the model to the Printing3D3MFPackage object that you declared when creating the class.

    // save model to this class' Printing3D3MFPackage
    OutputTextBlock.Text = "saving model to 3MF package";
    await package.SaveModelToPackageAsync(model);

}

Executar a tarefa de impressão: crie um manipulador de TaskRequestedExecute printing task: create a TaskRequested handler

Depois, quando a caixa de diálogo de impressão 3D for exibida para o usuário e o usuário optar por iniciar a impressão, o seu aplicativo precisará passar os parâmetros desejados para o pipeline de impressão 3D.Later on, when the 3D print dialog is displayed to the user and the user elects to begin printing, your app will need to pass in the desired parameters to the 3D print pipeline. A API de impressão 3D irá gerar o evento TaskRequested .The 3D print API will raise the TaskRequested event. Você deve escrever um método para manipular esse evento adequadamente.You must write a method to handle this event appropriately. Como sempre, o método de manipulador deve ser do mesmo tipo do evento: o evento TaskRequested tem parâmetros Print3DManager (uma referência ao seu objeto remetente) e um objeto Print3DTaskRequestedEventArgs, que contém a maior parte das informações relevantes.As always, the handler method must be of the same type as its event: The TaskRequested event has parameters Print3DManager (a reference to its sender object) and a Print3DTaskRequestedEventArgs object, which holds most of the relevant information.

private void MyTaskRequested(Print3DManager sender, Print3DTaskRequestedEventArgs args) {

O objetivo principal desse método é usar o parâmetro args para enviar um Printing3D3MFPackage para o pipeline.The core purpose of this method is to use the args parameter to send a Printing3D3MFPackage down the pipeline. O tipo Print3DTaskRequestedEventArgs tem uma propriedade: Request.The Print3DTaskRequestedEventArgs type has one property: Request. Ela é do tipo Print3DTaskRequest e representa uma solicitação de trabalho de impressão.It is of the type Print3DTaskRequest and represents one print job request. Seu método CreateTask permite que o programa envie as informações corretas para o trabalho de impressão, e retorna uma referência para o objeto Print3DTask que foi enviado para o pipeline de impressão 3D.Its method CreateTask allows the program to submit the correct information for your print job, and it returns a reference to the Print3DTask object which was sent down the 3D print pipeline.

O CreateTask tem os seguintes parâmetros de entrada: uma cadeia de caracteres para o nome do trabalho de impressão, uma cadeia de caracteres para a ID da impressora usar e uma delegação Print3DTaskSourceRequestedHandler.CreateTask has the following input parameters: a string for the print job name, a string for the ID of the printer to use, and a Print3DTaskSourceRequestedHandler delegate. A delegação é automaticamente invocada quando o evento 3DTaskSourceRequested é acionado (isso é feito pela API em si).The delegate is automatically invoked when the 3DTaskSourceRequested event is raised (this is done by the API itself). O importante a observar é que tal delegação é invocada quando um trabalho de impressão é iniciado, e é responsável por fornecer o pacote de impressão 3D certo.The important thing to note is that this delegate is invoked when a print job is initiated, and it is responsible for providing the right 3D print package.

O Print3DTaskSourceRequestedHandler usa um parâmetro, um objeto Print3DTaskSourceRequestedArgs que fornece os dados a serem enviados.Print3DTaskSourceRequestedHandler takes one parameter, a Print3DTaskSourceRequestedArgs object which provides the data to be sent. O único método público dessa classe, SetSource, aceita o pacote a ser impresso.The one public method of this class, SetSource, accepts the package to be printed. Implemente uma delegação Print3DTaskSourceRequestedHandler da seguinte maneira.Implement a Print3DTaskSourceRequestedHandler delegate as follows.

// this delegate handles the API's request for a source package
Print3DTaskSourceRequestedHandler sourceHandler = delegate (Print3DTaskSourceRequestedArgs sourceRequestedArgs) {
    sourceRequestedArgs.SetSource(package);
};

Em seguida, chame o CreateTask, usando a delegação definida recentemente, sourceHandler:Next, call CreateTask, using the newly-defined delegate, sourceHandler.

// the Print3DTaskRequest ('Request'), a member of 'args', creates a Print3DTask to be sent down the pipeline.
printTask = args.Request.CreateTask("Print Title", "Default", sourceHandler);

O Print3DTask devolvido é atribuído à variável de classe declarada no início.The returned Print3DTask is assigned to the class variable declared in the beginning. Agora você pode usar (opcionalmente) essa referência para lidar com determinados eventos lançados pela tarefa.You can now (optionally) use this reference to handle certain events thrown by the task.

// optional events to handle
printTask.Completed += Task_Completed; 
printTask.Submitting += Task_Submitting;

Observação

Você deve implementar um método Task_Submitting e Task_Completed se quiser registrá-los nesses eventos.You must implement a Task_Submitting and Task_Completed method if you wish to register them to these events.

Execute a tarefa de impressão: abrir a caixa de diálogo de impressão 3DExecute printing task: open 3D print dialog

A parte final do código necessário é a que faz com que a caixa de diálogo de impressão 3D seja exibida.The final piece of code needed is that which launches the 3D print dialog. Como uma janela de caixa de diálogo de impressão convencional, a caixa de diálogo de impressão 3D fornece uma série de opções de impressão de última hora e permite que o usuário escolha qual impressora usar (se conectado por USB ou rede).Like a conventional printing dialog window, the 3D print dialog provides a number of last-minute printing options and allows the user to choose which printer to use (whether connected by USB or the network).

Registre seu método MyTaskRequested com o evento TaskRequested.Register your MyTaskRequested method with the TaskRequested event.

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;

Depois de registrar seu manipulador de eventos TaskRequested, você pode chamar o método ShowPrintUIAsync, que abre a caixa de diálogo de impressão 3D na janela do aplicativo atual.After registering your TaskRequested event handler, you can invoke the method ShowPrintUIAsync, which brings up the 3D print dialog in the current application window.

// show the 3D print dialog
OutputTextBlock.Text = "opening print dialog";
var result = await Print3DManager.ShowPrintUIAsync();

Por fim, é uma boa prática registrar os manipuladores de eventos quando seu aplicativo retoma o controle.Finally, it is a good practice to de-register your event handlers once your app resumes control.

    // remove the print task request after dialog is shown            
    myManager.TaskRequested -= MyTaskRequested;
}

Gerar um pacote 3MFGenerate a 3MF package
Exemplo UWP de impressão 3D3D printing UWP sample