Compartir a través de


Impresión 3D desde la aplicación de Plataforma universal de Windows

Aprende a agregar funcionalidad de impresión 3D a tu aplicación de Plataforma universal de Windows (UWP).

En este tema se explica cómo cargar datos de geometría 3D en la aplicación e iniciar el cuadro de diálogo de impresión 3D después de asegurarse de que el modelo 3D se puede imprimir y en el formato correcto. Para obtener un ejemplo de trabajo de estos procedimientos, consulta el ejemplo de UWP de impresión 3D.

API importantes

Configurar

Agregue el espacio de nombres Windows.Graphics.Printing3D a la clase de aplicación que requiere la funcionalidad de impresión 3D.

using Windows.Graphics.Printing3D;

En esta guía también se usarán los siguientes espacios de nombres.

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;

A continuación, asigne a la clase campos miembros útiles.

  • Declare un objeto Print3DTask para representar la tarea de impresión que se va a pasar al controlador de impresión.
  • Declare un objeto StorageFile para contener el archivo de datos 3D original que se cargará en la aplicación.
  • Declare un objeto Printing3D3MFPackage para representar un modelo 3D listo para impresión con todos los metadatos necesarios.
private Print3DTask printTask;
private StorageFile file;
private Printing3D3MFPackage package = new Printing3D3MFPackage();

Crear una interfaz de usuario sencilla

En este ejemplo se usa un botón Cargar para traer un archivo a la memoria del programa, un botón Corregir para realizar las modificaciones necesarias en el archivo y un botón Imprimir para iniciar el trabajo de impresión. El código siguiente crea estos botones (con sus controladores de eventos en clic) en el archivo XAML correspondiente de la clase .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"/>

El ejemplo también incluye un TextBlock para los comentarios de la interfaz de usuario.

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

Obtención de los datos 3D

El método por el que la aplicación adquiere datos de geometría 3D puede variar. La aplicación puede recuperar datos de un examen 3D, descargar datos del modelo de un recurso web o generar una malla 3D mediante programación mediante fórmulas matemáticas o entradas de usuario. Aquí se muestra cómo cargar un archivo de datos 3D (de cualquiera de varios tipos de archivos comunes) en la memoria del programa desde el almacenamiento del dispositivo. La biblioteca de modelos 3D Builder proporciona una variedad de modelos para descargar.

En el OnLoadClick método , la clase FileOpenPicker carga un único archivo en la memoria de la aplicación.

En el código siguiente se muestra cómo cargar un único archivo en la memoria de la aplicación mediante la clase FileOpenPicker en el 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 3D Builder para convertir al formato de fabricación 3D (.3mf)

Los datos de geometría 3D pueden tener muchos formatos diferentes y no todos son eficaces para la impresión 3D. Windows usa el tipo de archivo 3D Manufacturing Format (.3mf) para todas las tareas de impresión 3D.

Consulte la especificación 3MF para obtener más información sobre 3MF y las características admitidas para productores y consumidores de productos 3D. Para obtener información sobre cómo usar estas características con las API de Windows, consulte el tutorial Generación de un paquete 3MF.

Nota:

La aplicación 3D Builder puede abrir archivos de formatos 3D más populares y guardarlos como archivos .3mf. También proporciona herramientas para editar los modelos, agregar datos de color y realizar otras operaciones específicas de impresión.

En este ejemplo, donde el tipo de archivo podría variar, podría abrir la aplicación 3D Builder y pedir al usuario que guarde los datos importados como un archivo .3mf y, a continuación, volver a cargarlos.

    // 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 datos del modelo para la impresión en 3D

No todos los datos del modelo 3D se pueden imprimir, incluso en el tipo .3mf. Para que la impresora determine correctamente qué espacio se va a rellenar y qué dejar vacío, cada modelo que se va a imprimir debe ser una sola malla sin conexión, tener normales de superficie exterior y tener geometría múltiple. Los problemas de estas áreas pueden surgir en una variedad de formas diferentes y pueden ser difíciles de detectar en formas complejas. Sin embargo, las soluciones de software modernas suelen ser adecuadas para convertir la geometría sin procesar en formas 3D imprimibles. Esto se conoce como reparación del modelo y se implementa en el OnFixClick método que se muestra aquí.

Nota:

El archivo de datos 3D debe convertirse para implementar IRandomAccessStream, que luego se puede usar para generar un 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();

El objeto Printing3DModel ahora debe repararse e imprimirse. Use SaveModelToPackageAsync para asignar el modelo al objeto Printing3D3MFPackage que declaró al crear la clase.

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

}

Ejecutar tarea de impresión: crear un controlador TaskRequested

Más adelante, cuando se muestre el cuadro de diálogo de impresión 3D al usuario y el usuario decida empezar a imprimir, la aplicación tendrá que pasar los parámetros deseados a la canalización de impresión 3D. La API de impresión 3D generará el evento TaskRequested , que requiere el control adecuado.

private void MyTaskRequested(Print3DManager sender, Print3DTaskRequestedEventArgs args) {

El propósito principal de este método es usar el parámetro args para enviar un Printing3D3MFPackage a la canalización. El tipo Print3DTaskRequestedEventArgs tiene una propiedad: Request. Es del tipo Print3DTaskRequest y representa una solicitud de trabajo de impresión. Su método CreateTask permite a la aplicación enviar la información correcta para el trabajo de impresión y devolver una referencia al objeto Print3DTask que se envió a la canalización de impresión 3D.

CreateTask tiene los siguientes parámetros de entrada: una cadena para el nombre del trabajo de impresión, una cadena para el identificador de la impresora que se va a usar y un delegado Print3DTaskSourceRequestedHandler . El delegado se invoca automáticamente cuando se genera el evento 3DTaskSourceRequested (esto lo hace la propia API). Lo importante que hay que tener en cuenta es que este delegado se invoca cuando se inicia un trabajo de impresión y es responsable de proporcionar el paquete de impresión 3D adecuado.

Print3DTaskSourceRequestedHandler toma un parámetro, un objeto Print3DTaskSourceRequestedArgs , que contiene los datos que se van a enviar. El método SetSource acepta el paquete que se va a imprimir. El código siguiente muestra una implementación de delegado Print3DTaskSourceRequestedHandler (sourceHandler).

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

A continuación, llame a CreateTask mediante el delegado recién 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);

El print3DTask devuelto se asigna a la variable de clase declarada al principio. Esta referencia se puede usar para controlar determinados eventos producidos por la tarea.

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

Nota:

Debe implementar un Task_Submitting método y Task_Completed si desea registrarlos en estos eventos.

Ejecutar tarea de impresión: cuadro de diálogo de impresión 3D abierto

Por último, debe iniciar el cuadro de diálogo de impresión 3D que proporciona una serie de opciones de impresión.

Aquí, registramos un MyTaskRequested método con el 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;

Después de registrar el controlador de eventos TaskRequested , puede invocar el método ShowPrintUIAsync, que abre el cuadro de diálogo de impresión 3D en la ventana de la aplicación actual.

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

También es recomendable anular el registro de los controladores de eventos una vez que la aplicación reanuda el control.

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

Impresión 3D con Windows 10Generar un paquete 3MF
Ejemplo de UWP de impresión 3D