Share via


Impressão 3D do aplicativo Plataforma Universal do Windows

Saiba como adicionar a funcionalidade de impressão 3D ao aplicativo Plataforma Universal do Windows (UWP).

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. Para obter um exemplo de trabalho desses procedimentos, consulte o Exemplo UWP de impressão 3D.

APIs importantes

Instalação

Adicione o namespace Windows.Graphics.Printing3D à classe de aplicativo que requer funcionalidade de impressão 3D.

using Windows.Graphics.Printing3D;

Os namespaces a seguir também serão usados neste guia.

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.

  • Declare um objeto Print3DTask para representar a tarefa de impressão a ser passada para o driver de impressão.
  • Declare um objeto StorageFile para armazenar o arquivo de dados 3D original que será carregado no aplicativo.
  • Declare um objeto Printing3D3MFPackage para representar um modelo 3D pronto para impressão com todos os metadados necessários.
private Print3DTask printTask;
private StorageFile file;
private Printing3D3MFPackage package = new Printing3D3MFPackage();

Crie uma interface do usuário simples

Este exemplo usa um botão Carregar para colocar um arquivo na memória do programa, um botão Corrigir para fazer as modificações necessárias no arquivo e um botão Imprimir para iniciar o trabalho de impressão. O código a seguir cria esses botões (com seus manipuladores de eventos ao clicar) no arquivo XAML correspondente da classe .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"/>

O exemplo também inclui um TextBlock para comentários da interface do usuário.

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

Obtenha os dados 3D

O método pelo qual seu aplicativo adquire dados de geometria 3D pode variar. 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. Aqui, mostramos como carregar um arquivo de dados 3D (de qualquer um dos vários tipos de arquivo comuns) na memória do programa do armazenamento do dispositivo. A biblioteca de modelos do 3D Builder fornece uma variedade de modelos para download.

No método , a classe FileOpenPicker carrega um único arquivo na memória do OnLoadClick aplicativo.

O código a seguir mostra como carregar um único arquivo na memória do aplicativo usando a classe FileOpenPicker no OnLoadClick método .

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)

Os dados de geometria 3D podem vir em vários formatos diferentes e nem todos são eficientes para impressão 3D. O Windows usa o tipo de arquivo 3D Manufacturing Format (.3mf) para todas as tarefas de impressão 3D.

Confira a Especificação 3MF para saber mais sobre o 3MF e os recursos com suporte para produtores e consumidores de produtos 3D. Para saber como utilizar esses recursos com APIs do Windows, confira o tutorial Gerar um pacote 3MF .

Observação

O aplicativo 3D Builder pode abrir arquivos nos formatos 3D mais populares e salvá-los como arquivos .3mf. Ele também fornece ferramentas para editar seus modelos, adicionar dados de cor e executar outras operações específicas de impressão.

Neste exemplo, em que o tipo de arquivo pode variar, você pode abrir o aplicativo 3D Builder e solicitar que o usuário salve os dados importados como um arquivo .3mf e, em seguida, recarregá-los.

    // 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 3D

Nem todos os dados de modelo 3D podem ser impressos, mesmo no tipo de .3mf. Para que a impressora determine corretamente que espaço preencher e o que deixar vazio, cada modelo a ser impresso deve ser uma única malha perfeita, ter normais de superfície voltados para fora e ter geometria múltipla. Problemas nessas áreas podem surgir de várias formas diferentes e ser difíceis de se perceber em formatos complexos. No entanto, soluções de software modernas costumam ser adequadas para converter geometria crua em formatos 3D imprimíveis. Isso é conhecido como reparar o modelo e é implementado no OnFixClick método mostrado aqui.

Observação

O arquivo de dados 3D deve ser convertido para implementar o IRandomAccessStream, que pode ser usado para gerar um objeto 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();

O objeto Printing3DModel agora deve ser reparado e imprimível. Use SaveModelToPackageAsync para atribuir o modelo para o objeto Printing3D3MFPackage que você declarou ao criar a classe.

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

Posteriormente, quando a caixa de diálogo de impressão 3D for exibida para o usuário e o usuário optar por começar a imprimir, seu aplicativo precisará passar os parâmetros desejados para o pipeline de impressão 3D. A API de impressão 3D acionará o evento TaskRequested , que requer tratamento adequado.

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. O tipo Print3DTaskRequestedEventArgs tem uma propriedade: Request. Ela é do tipo Print3DTaskRequest e representa uma solicitação de trabalho de impressão. Seu método CreateTask permite que o aplicativo envie as informações corretas para seu trabalho de impressão e retorne uma referência ao objeto Print3DTask que foi enviado pelo pipeline de impressão 3D.

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. A delegação é automaticamente invocada quando o evento 3DTaskSourceRequested é acionado (isso é feito pela API em si). 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.

Print3DTaskSourceRequestedHandler usa um parâmetro, um objeto Print3DTaskSourceRequestedArgs , que contém os dados a serem enviados. O método SetSource aceita o pacote a ser impresso. O código a seguir mostra uma implementação de delegado Print3DTaskSourceRequestedHandler (sourceHandler).

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

Em seguida, chame CreateTask, usando o delegado recém-definido.

// 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 retornado é atribuído à variável de classe declarada no início. Essa referência pode ser usada para lidar com determinados eventos gerados pela tarefa.

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

Execute a tarefa de impressão: abrir a caixa de diálogo de impressão 3D

Por fim, você precisa iniciar a caixa de diálogo de impressão 3D que fornece várias opções de impressão.

Aqui, registramos um MyTaskRequested método com o evento 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;

Depois de registrar o manipulador de eventos TaskRequested , você pode invocar o método ShowPrintUIAsync, que abre a caixa de diálogo de impressão 3D na janela do aplicativo atual.

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

Também é uma boa prática desativar o registro dos manipuladores de eventos depois que o aplicativo retomar o controle.

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

Impressão 3D com Windows 10Gerar um pacote 3MF
Exemplo UWP de impressão 3D