Impression 3D à partir de votre application3D printing from your app

API importantesImportant APIs

Découvrez comment ajouter des fonctionnalités d’impression 3D à votre application Windows universelle.Learn how to add 3D printing functionality to your Universal Windows app. Cette rubrique explique comment charger des données de géométrie 3D dans votre application et lancer la boîte de dialogue d’impression 3D après avoir vérifié que votre modèle 3D est imprimable et au format correct.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. Pour obtenir un exemple fonctionnel de ces procédures, consultez l 'exemple d’impression en 3D.For a working example of these procedures, see the 3D printing UWP sample.

Notes

Dans l’exemple de code de ce guide, le rapport d’erreurs et la gestion sont considérablement simplifiés pour des raisons de simplicité.In the sample code in this guide, error reporting and handling is greatly simplified for the sake of simplicity.

InstallationSetup

Dans votre classe d’application qui doit disposer de la fonctionnalité d’impression en 3D, ajoutez l’espace de noms Windows. Graphics. Printing3D .In your application class that is to have 3D print functionality, add the Windows.Graphics.Printing3D namespace.

using Windows.Graphics.Printing3D;

Les espaces de noms supplémentaires suivants seront utilisés dans ce guide.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;

Ensuite, donnez à votre classe des champs de membre utiles.Next, give your class helpful member fields. Déclarez un objet Print3DTask pour représenter la tâche d’impression qui doit être transmise au pilote d’impression.Declare a Print3DTask object to represent the printing task that is to be passed to the print driver. Déclarez un objet StorageFile pour stocker le fichier de données 3D d’origine qui sera chargé dans l’application.Declare a StorageFile object to hold the original 3D data file that will be loaded into the app. Déclarez un objet Printing3D3MFPackage , qui représente un modèle 3D prêt pour l’impression avec toutes les métadonnées nécessaires.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();

Créer une interface utilisateur simpleCreate a simple UI

Cet exemple présente trois contrôles utilisateur : un bouton charger qui place un fichier dans la mémoire du programme, un bouton corriger qui modifie le fichier en fonction des besoins et un bouton imprimer qui lance le travail d’impression.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. Le code suivant crée ces boutons (avec leurs gestionnaires d’événements de clic) dans le fichier XAML correspondant de la 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"/>

Ajoutez un TextBlock pour le commentaire de l’interface utilisateur.Add a TextBlock for UI feedback.

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

Obtenir les données 3DGet the 3D data

La méthode par laquelle votre application acquiert les données de géométrie 3D à imprimer varie.The method by which your app acquires 3D geometry data will vary. Votre application peut récupérer des données à partir d’une analyse 3D, télécharger des données de modèle à partir d’une ressource Web ou générer un maillage 3D par programmation en utilisant des formules mathématiques ou une entrée utilisateur.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. Par souci de simplicité, ce guide montre comment charger un fichier de données 3D (d’un type de fichier courant) dans la mémoire du programme à partir d’un stockage de fichiers.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. La bibliothèque de modèles 3D Builder fournit plusieurs modèles que vous pouvez facilement télécharger sur votre appareil.The 3D Builder model library provides a variety of models that you can easily download to your device.

Dans votre OnLoadClick méthode, utilisez la classe FileOpenPicker pour charger un fichier unique dans la mémoire de votre application.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;
    }

Utiliser 3D Builder pour une conversion au format 3D Manufacturing Format (.3mf)Use 3D Builder to convert to 3D Manufacturing Format (.3mf)

À ce stade, vous êtes en mesure de charger un fichier de données 3D dans la mémoire de votre application.At this point, you are able to load a 3D data file into your app's memory. Il existe de nombreux formats de données de géométrie 3D, mais ils ne sont pas tous adaptés à l’impression 3D.However, 3D geometry data can come in many different formats, and not all are efficient for 3D printing. Windows 10 utilise le type de fichier 3D Manufacturing Format (.3mf) pour toutes les tâches d’impression 3D.Windows 10 uses the 3D Manufacturing Format (.3mf) file type for all 3D printing tasks.

Notes

Le type de fichier. 3mf offre plus de fonctionnalités que ce qui est abordé dans ce didacticiel.The .3mf file type offers more functionality than is covered in this tutorial. Pour en savoir plus sur les 3MF et les fonctionnalités qu’elle fournit aux producteurs et aux consommateurs de produits 3D, consultez la spécification 3MF.To learn more about 3MF and the features it provides to producers and consumers of 3D products, see the 3MF Specification. Pour savoir comment utiliser ces fonctionnalités avec les API Windows 10, consultez le didacticiel générer un package 3MF .To learn how to utilize these features with Windows 10 APIs, see the Generate a 3MF package tutorial.

L’application 3D Builder peut ouvrir des fichiers des formats 3D les plus populaires et les enregistrer en tant que fichiers. 3mf.The 3D Builder app can open files of most popular 3D formats and save them as .3mf files. Dans cet exemple, où le type de fichier peut varier, une solution très simple consiste à ouvrir l’application de générateur 3D et à inviter l’utilisateur à enregistrer les données importées en tant que fichier. 3mf, puis à les recharger.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.

Notes

En plus de convertir les formats de fichier, 3D Builder offre des outils simples pour modifier vos modèles, ajouter des données de couleur et effectuer d’autres opérations spécifiques de l’impression. C’est pourquoi il est souvent recommandé de l’intégrer à une application qui prend en charge l’impression 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";
    }
}

Réparer des données de modèle pour l’impression 3DRepair model data for 3D printing

Les données de modèle 3D ne sont pas toutes imprimables, même dans le type .3mf.Not all 3D model data is printable, even in the .3mf type. Afin que l’imprimante puisse correctement déterminer les espaces à remplir et à laisser vides, le ou les modèles à imprimer doivent (chacun) constituer un ensemble unique et homogène, disposer de normales de surface orientées vers l’extérieur et d’une géométrie de collection.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. Les problèmes dans ces domaines peuvent se présenter sous différentes formes et peuvent être difficiles à repérer dans des formes complexes.Issues in these areas can arise in a variety of different forms and can be hard to spot in complex shapes. Toutefois, les solutions logicielles modernes sont souvent adaptées à la conversion d’une géométrie brute en formes 3D imprimables.However, modern software solutions are often adequate for converting raw geometry to printable 3D shapes. C’est ce qu’on appelle la réparation du modèle, qui est effectuée dans la méthode OnFixClick.This is known as repairing the model and will be done in the OnFixClick method.

Le fichier de données 3D doit être converti pour implémenter IRandomAccessStream, qui peut ensuite être utilisé pour générer un objet 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();

L’objet Printing3DModel est maintenant réparé et imprimable.The Printing3DModel object is now repaired and printable. Utilisez SaveModelToPackageAsync pour attribuer le modèle à l’objet Printing3D3MFPackage que vous avez déclaré pendant la création de la 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);

}

Exécuter la tâche d’impression : créer un gestionnaire TaskRequestedExecute printing task: create a TaskRequested handler

Par la suite, lorsque la boîte de dialogue d’impression 3D s’affiche et que l’utilisateur choisit de commencer l’impression, votre application doit transmettre les paramètres souhaités au pipeline d’impression 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. L’API d’impression 3D déclenche l’événement TaskRequested .The 3D print API will raise the TaskRequested event. Vous devez écrire une méthode pour gérer cet événement de manière appropriée.You must write a method to handle this event appropriately. Comme toujours, la méthode de gestionnaire doit être du même type que son événement : l’événement TaskRequested a un paramètre Print3DManager (une référence à son objet d’expéditeur) et un objet Print3DTaskRequestedEventArgs, qui contient la plupart des informations pertinentes.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) {

L’objectif principal de cette méthode est d’utiliser le paramètre args pour envoyer un Printing3D3MFPackage dans le pipeline.The core purpose of this method is to use the args parameter to send a Printing3D3MFPackage down the pipeline. Le type Print3DTaskRequestedEventArgs a une propriété : Request.The Print3DTaskRequestedEventArgs type has one property: Request. Elle est de type Print3DTaskRequest et représente une demande de travail d’impression.It is of the type Print3DTaskRequest and represents one print job request. Sa méthode CreateTask autorise le programme à envoyer les informations correctes pour votre travail d’impression et retourne une référence à l’objet Print3DTask qui a été envoyé vers le pipeline d’impression 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.

CreateTask a les paramètres d’entrée suivants : une chaîne pour le nom du travail d’impression, une chaîne pour l’ID de l’imprimante à utiliser, ainsi qu’un délégué 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. Le délégué est automatiquement appelé quand l’événement 3DTaskSourceRequested est déclenché (cette opération est effectuée par l’API elle-même).The delegate is automatically invoked when the 3DTaskSourceRequested event is raised (this is done by the API itself). Il est important de noter que ce délégué est appelé lorsqu’un travail d’impression est lancé et qu’il est responsable de la fourniture du package d’impression 3D approprié.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.

Print3DTaskSourceRequestedHandler prend un paramètre, un objet Print3DTaskSourceRequestedArgs qui fournit les données à envoyer.Print3DTaskSourceRequestedHandler takes one parameter, a Print3DTaskSourceRequestedArgs object which provides the data to be sent. SetSource, l’une des méthodes publiques de cette classe, accepte le package à imprimer.The one public method of this class, SetSource, accepts the package to be printed. Implémentez un délégué Print3DTaskSourceRequestedHandler comme suit.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);
};

Ensuite, appelez CreateTask, à l’aide du délégué sourceHandler que vous venez de définir.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);

L’objet Print3DTask renvoyé est attribué à la variable de classe déclarée au début.The returned Print3DTask is assigned to the class variable declared in the beginning. Vous pouvez maintenant (éventuellement) utiliser cette référence pour gérer certains événements levés par la tâche.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;

Notes

Vous devez implémenter des méthodes Task_Submitting et Task_Completed si vous voulez les inscrire à ces événements.You must implement a Task_Submitting and Task_Completed method if you wish to register them to these events.

Exécuter la tâche d’impression : ouvrir la boîte de dialogue d’impression 3DExecute printing task: open 3D print dialog

L’élément de code final nécessaire est celui qui lance la boîte de dialogue d’impression 3D.The final piece of code needed is that which launches the 3D print dialog. À l’instar d’une fenêtre de boîte de dialogue d’impression classique, la boîte de dialogue d’impression 3D fournit un certain nombre d’options d’impression de dernière minute et permet à l’utilisateur de choisir l’imprimante à utiliser (connectée par USB ou le réseau).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).

Inscrivez votre méthode MyTaskRequested à l’événement 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;

Après avoir inscrit votre gestionnaire d’événements TaskRequested, vous pouvez appeler la méthode ShowPrintUIAsync, qui fait apparaître la boîte de dialogue d’impression 3D dans la fenêtre d’application active.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();

Enfin, il est conseillé de désinscrire vos gestionnaires d’événements une fois que votre application reprend le contrôle.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;
}

Générer un package 3MFGenerate a 3MF package
Exemple d’impression 3D UWP3D printing UWP sample