3D-Druck über Ihre App3D printing from your app

Wichtige APIsImportant APIs

Erfahren Sie, wie Sie Ihrer universellen Windows-App 3D-Druckfunktionen hinzufügen.Learn how to add 3D printing functionality to your Universal Windows app. In diesem Thema wird erläutert, wie Sie 3D-Geometriedaten in Ihre App laden und das 3D-Druckdialogfeld starten, nachdem Sie sichergestellt haben, dass Ihr 3D-Modell druckbar ist und das richtige Format hat.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. Ein funktionierendes Beispiel für diese Prozeduren finden Sie unter Beispiel für die 3D-Druck-UWP.For a working example of these procedures, see the 3D printing UWP sample.

Hinweis

Im Beispielcode in diesem Handbuch wird die Fehlerberichterstattung und-Behandlung aus Gründen der Einfachheit erheblich vereinfacht.In the sample code in this guide, error reporting and handling is greatly simplified for the sake of simplicity.

SetupSetup

Fügen Sie in Ihrer Anwendungsklasse, die eine 3D-Druck Funktionalität hat, den Windows. Graphics. Printing3D -Namespace hinzu.In your application class that is to have 3D print functionality, add the Windows.Graphics.Printing3D namespace.

using Windows.Graphics.Printing3D;

In diesem Handbuch werden die folgenden zusätzlichen Namespaces verwendet.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;

Legen Sie als nächstes die Klasse hilfreiche Element Felder ab.Next, give your class helpful member fields. Deklarieren Sie ein Print3DTask -Objekt, das die Druck Aufgabe darstellt, die an den Druckertreiber übermittelt werden soll.Declare a Print3DTask object to represent the printing task that is to be passed to the print driver. Deklarieren Sie ein storagefile -Objekt, um die ursprüngliche 3D-Datendatei zu speichern, die in die App geladen wird.Declare a StorageFile object to hold the original 3D data file that will be loaded into the app. Deklarieren Sie ein Printing3D3MFPackage-Objekt, das ein 3D-Modell mit allen erforderlichen Metadaten darstellt und gedruckt werden kann.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();

Erstellen einer einfachen UICreate a simple UI

Dieses Beispiel enthält drei Benutzer Steuerelemente: eine Schaltfläche "Laden", die eine Datei in den Programmspeicher bringt, eine Fix Schaltfläche, die die Datei nach Bedarf ändert, und eine Schaltfläche "Drucken", mit der der Druckauftrag initiiert wird.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. Der folgende Code erstellt diese Schaltflächen (mit Ihren on-Click-Ereignis Handlern) in der entsprechenden XAML-Datei Ihrer cs-Klasse.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"/>

Hinzufügen eines TextBlock-Elements für UI-Feedback:Add a TextBlock for UI feedback.

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

Abrufen der 3D-DatenGet the 3D data

Die Methode, mit der Ihre App 3D-Geometriedaten abruft, kann variieren.The method by which your app acquires 3D geometry data will vary. Ihre APP kann Daten aus einem 3D-Scan abrufen, Modelldaten aus einer Webressource herunterladen oder ein 3D-Mesh mithilfe mathematischer Formeln oder Benutzereingaben Programm gesteuert generieren.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. Der Einfachheit halber wird in dieser Anleitung gezeigt, wie Sie eine 3D-Datendatei (mit einem beliebigen gängigen Dateityp) aus dem Gerätespeicher in den Programmspeicher laden.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. Die Modellbibliothek für 3D Builder enthält verschiedene Modelle, die Sie leicht auf Ihr Gerät herunterladen können.The 3D Builder model library provides a variety of models that you can easily download to your device.

Verwenden Sie in OnLoadClick der-Methode die fileopenpicker -Klasse, um eine einzelne Datei in den Arbeitsspeicher Ihrer APP zu laden.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;
    }

Konvertieren in das 3D Manufacturing Format (3MF) mithilfe von 3D BuilderUse 3D Builder to convert to 3D Manufacturing Format (.3mf)

An dieser Stelle können Sie eine 3D-Datendatei in den Speicher der App laden.At this point, you are able to load a 3D data file into your app's memory. 3D-Geometriedaten können aber in den unterschiedlichsten Formaten vorliegen, und hinsichtlich des 3D-Drucks sind nicht alle effizient.However, 3D geometry data can come in many different formats, and not all are efficient for 3D printing. In Windows 10 wird der 3MF-Dateityp (3D Manufacturing Format) für alle 3D-Druckaufgaben verwendet.Windows 10 uses the 3D Manufacturing Format (.3mf) file type for all 3D printing tasks.

Hinweis

Der 3MF-Dateityp bietet mehr Funktionen als in diesem Tutorial behandelt werden.The .3mf file type offers more functionality than is covered in this tutorial. Weitere Informationen zu 3MF und den Features, die es den Herstellern und Consumern von 3D-Produkten bietet, finden Sie in der 3MF-Spezifikation.To learn more about 3MF and the features it provides to producers and consumers of 3D products, see the 3MF Specification. Informationen dazu, wie Sie diese Features mit Windows 10-APIs nutzen, finden Sie im Tutorial Generieren eines 3MF-Pakets .To learn how to utilize these features with Windows 10 APIs, see the Generate a 3MF package tutorial.

Die 3D -Generator-App kann Dateien der beliebtesten 3D-Formate öffnen und als 3MF-Dateien speichern.The 3D Builder app can open files of most popular 3D formats and save them as .3mf files. In diesem Beispiel, in dem der Dateityp variieren könnte, besteht eine sehr einfache Lösung darin, die 3D-Generator-APP zu öffnen und den Benutzer aufzufordern, die importierten Daten als 3MF-Datei zu speichern und dann neu zu laden.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.

Hinweis

Neben dem Konvertieren von Dateiformaten bietet 3D Builder einfache Tools zum Bearbeiten von Modellen, Hinzufügen von Farbdaten und Ausführen anderer druckspezifischer Vorgänge. Daher empfiehlt sich häufig die Integration in eine App, mit der 3D-Druckvorgänge ausgeführt werden sollen.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";
    }
}

Reparieren von Modelldaten für den 3D-DruckRepair model data for 3D printing

Nicht alle 3D-Modelldaten sind druckbar. Dies gilt auch für den 3MF-Typ.Not all 3D model data is printable, even in the .3mf type. Damit der Drucker richtig erkennen kann, welcher Raum zu füllen ist und welcher Raum frei gelassen werden muss, müssen die Modelle jeweils ein einzelnes nahtloses Gitter darstellen sowie nach außen weisende Oberflächennormalen und eine facettenreiche Geometrie aufweisen.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. Probleme in diesen Bereichen können in einer Vielzahl von verschiedenen Formularen auftreten und in komplexen Formen schwer zu erkennen sein.Issues in these areas can arise in a variety of different forms and can be hard to spot in complex shapes. Moderne Softwarelösungen sind jedoch oft ausreichend, um die rohgeometrie in druckbare 3D-Formen umzuwandeln.However, modern software solutions are often adequate for converting raw geometry to printable 3D shapes. Die wird als Reparatur des Modells bezeichnet und mit der OnFixClick-Methode erreicht.This is known as repairing the model and will be done in the OnFixClick method.

Die 3D-Datendatei muss konvertiert werden, um IRandomAccessStream zu implementieren, womit anschließend ein Printing3DModel-Objekt generiert werden kann.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();

Das Printing3DModel-Objekt wurde repariert und kann jetzt gedruckt werden.The Printing3DModel object is now repaired and printable. Weisen Sie das Modell mithilfe von SaveModelToPackageAsync dem Printing3D3MFPackage-Objekt zu, das Sie beim Erstellen der Klasse deklariert haben.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);

}

Ausführen des Druckvorgangs: Erstellen eines TaskRequested-HandlersExecute printing task: create a TaskRequested handler

Später, wenn das 3D-Druckdialogfeld für den Benutzer angezeigt wird und dieser einen Druckvorgang startet, muss die App die gewünschten Parameter an die 3D-Druckpipeline übergeben.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. Die 3D-Druck-API gibt das taskrequessierte -Ereignis aus.The 3D print API will raise the TaskRequested event. Sie müssen eine Methode schreiben, mit der dieses Ereignis richtig behandelt wird.You must write a method to handle this event appropriately. Die Handlermethode muss wie üblich den gleichen Typ wie das zugeordnete Ereignis aufweisen: Das TaskRequested-Ereignis verfügt über Print3DManager (Verweis auf das Absenderobjekt) und ein Print3DTaskRequestedEventArgs-Objekt als Parameter, in dem die meisten relevanten Informationen enthalten sind.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) {

Der grundlegende Zweck dieser Methode besteht darin, mit dem args-Parameter ein Printing3D3MFPackage entlang der Pipeline zu senden.The core purpose of this method is to use the args parameter to send a Printing3D3MFPackage down the pipeline. Der Print3DTaskRequestedEventArgs-Typ verfügt über eine Eigenschaft: Request.The Print3DTaskRequestedEventArgs type has one property: Request. Sie ist vom Typ Print3DTaskRequest und stellt eine Anforderung für den Druckauftrag dar.It is of the type Print3DTaskRequest and represents one print job request. Die zugehörige Methode "up- eTask " ermöglicht es dem Programm, die korrekten Informationen für den Druckauftrag zu übermitteln, und gibt einen Verweis auf das Print3DTask -Objekt zurück, das über die 3D-Druck Pipeline gesendet wurde.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.

" Kreatetask " verfügt über die folgenden Eingabeparameter: eine Zeichenfolge für den Druckauftrags Namen, eine Zeichenfolge für die ID des zu verwendenden Druckers und ein Print3DTaskSourceRequestedHandler -Delegat.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. Der Delegat wird automatisch aufgerufen, wenn das 3DTaskSourceRequested-Ereignis ausgelöst wird (dies erfolgt durch die API selbst).The delegate is automatically invoked when the 3DTaskSourceRequested event is raised (this is done by the API itself). Zu beachten ist unbedingt, dass dieser Delegat beim Initiieren eines Druckauftrags aufgerufen wird. Er ist dafür zuständig, das richtige 3D-Druckpaket bereitzustellen.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 übernimmt einen Parameter, ein Print3DTaskSourceRequestedArgs -Objekt, das die zu sendenden Daten bereitstellt.Print3DTaskSourceRequestedHandler takes one parameter, a Print3DTaskSourceRequestedArgs object which provides the data to be sent. Die öffentliche Methode dieser Klasse, SetSource, akzeptiert das zu druckende Paket.The one public method of this class, SetSource, accepts the package to be printed. Implementieren Sie einen Print3DTaskSourceRequestedHandler-Delegaten wie folgt: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);
};

Rufen Sie anschließend CreateTask mit dem neu definierten Delegaten sourceHandler auf: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);

Der zurückgegebene Print3DTask wird der Klassenvariablen zugewiesen, die zu Beginn deklariert wurde.The returned Print3DTask is assigned to the class variable declared in the beginning. Mit diesem Verweis können Sie nun (optional) bestimmte Ereignisse behandeln, die von der Aufgabe ausgelöst wurden.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;

Hinweis

Sie müssen eine Task_Submitting-Methode und eine Task_Completed-Methode implementieren, wenn Sie sie für diese Ereignisse registrieren möchten.You must implement a Task_Submitting and Task_Completed method if you wish to register them to these events.

Ausführen des Druckvorgangs: Öffnen des Dialogfelds für den 3D-DruckExecute printing task: open 3D print dialog

Schließlich wird noch der Teil des Codes benötigt, mit dem das Dialogfeld für den 3D-Druck geöffnet wird.The final piece of code needed is that which launches the 3D print dialog. Wie bei einem herkömmlichen Druck Dialogfeld bietet das Dialogfeld 3D-Drucken eine Reihe von Druckoptionen in der letzten Minute und ermöglicht dem Benutzer die Auswahl des zu verwendenden Druckers (unabhängig davon, ob er über USB oder das Netzwerk verbunden ist).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).

Registrieren Sie die MyTaskRequested-Methode mit dem TaskRequested-Ereignis.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;

Nachdem Sie den taskrequessierten Ereignishandler registriert haben, können Sie die showprintuiasync-Methode aufrufen, die das 3D-Dialogfeld "Drucken" im aktuellen Anwendungsfenster aufruft.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();

Außerdem empfiehlt es sich noch, die Registrierung der Ereignishandler aufzuheben, nachdem die Steuerung von der App fortgesetzt wurde.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;
}

Generieren eines 3MF-PaketsGenerate a 3MF package
Beispiel für 3D-Druck – UWP3D printing UWP sample