Impressão 3D do seu aplicativo Plataforma Universal do Windows

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

Este tópico aborda como carregar dados de geometria 3D em seu aplicativo e iniciar a caixa de diálogo de impressão 3D depois de garantir que seu modelo 3D possa ser impresso e esteja no formato correto. Para obter um exemplo funcional 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 a 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 úteis para membros.

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

Criar uma interface do usuário simples

Este exemplo usa um botão Carregar para trazer um arquivo para a 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 verificação 3D, baixar dados de modelo de um recurso da Web ou gerar uma malha 3D programaticamente 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 arquivos comuns) na memória do programa a partir do armazenamento do dispositivo. A biblioteca de modelos do 3D Builder fornece uma variedade de modelos para download.

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

O código a seguir mostra como carregar um único arquivo na memória do aplicativo usando a OnLoadClick classe FileOpenPicker no 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 para o formato de fabricação 3D (.3mf)

Os dados de geometria 3D podem vir em muitos 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.

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

Observação

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

Neste exemplo, onde 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 recarregue-o.

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

Reparar dados do modelo para impressão 3D

Nem todos os dados do modelo 3D podem ser impressos, mesmo no tipo .3mf. Para que a impressora determine corretamente qual espaço preencher e o que deixar vazio, cada modelo a ser impresso deve ser uma única malha sem costura, ter normais de superfície voltadas para fora e ter geometria múltipla. Problemas nessas áreas podem surgir de várias formas diferentes e podem ser difíceis de detectar em formas complexas. No entanto, as soluções de software modernas geralmente são adequadas para converter geometria bruta em formas 3D imprimíveis. Isso é conhecido como reparo do modelo e é implementado no OnFixClick método mostrado aqui.

Observação

O arquivo de dados 3D deve ser convertido para implementar 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 ao 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 tarefa de impressão: crie um manipulador 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 gerará o evento TaskRequested , que requer tratamento adequado.

private void MyTaskRequested(Print3DManager sender, Print3DTaskRequestedEventArgs args) {

A finalidade principal desse método é usar o parâmetro args para enviar um Printing3D3MFPackage pelo pipeline. O tipo Print3DTaskRequestedEventArgs tem uma propriedade: Request. É 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 o trabalho de impressão e retorne uma referência ao objeto Print3DTask que foi enviado pelo pipeline de impressão 3D.

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 a ser usada e um delegado Print3DTaskSourceRequestedHandler . O delegado é invocado automaticamente quando o evento 3DTaskSourceRequested é gerado (isso é feito pela própria API). O importante a observar é que esse delegado é invocado quando um trabalho de impressão é iniciado e é responsável por fornecer o pacote de impressão 3D correto.

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 delegada 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 Task_Submitting método and Task_Completed se quiser registrá-los nesses eventos.

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

Finalmente, 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 cancelar o registro de seus manipuladores de eventos depois que seu 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