Share via


3D-Druck über Ihre Universelle Windows-Plattform-App

Erfahren Sie, wie Sie Ihrer Universelle Windows-Plattform-App (UWP) 3D-Druckfunktionen hinzufügen.

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. Ein funktionierendes Beispiel für diese Verfahren finden Sie im UWP-Beispiel für den 3D-Druck.

Wichtige APIs

Einrichten

Fügen Sie der Anwendungsklasse den Windows.Graphics.Printing3D-Namespace hinzu, der 3D-Druckfunktionen erfordert.

using Windows.Graphics.Printing3D;

Die folgenden Namespaces werden auch in diesem Handbuch verwendet.

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;

Als Nächstes geben Sie Ihrer Klasse hilfreiche Memberfelder.

  • Deklarieren Sie ein Print3DTask-Objekt , um die Druckaufgabe darzustellen, die an den Drucktreiber übergeben werden soll.
  • Deklarieren Sie ein StorageFile-Objekt , das die ursprüngliche 3D-Datendatei enthält, die in die App geladen wird.
  • Deklarieren Sie ein Printing3D3MFPackage-Objekt , um ein druckbereites 3D-Modell mit allen erforderlichen Metadaten darzustellen.
private Print3DTask printTask;
private StorageFile file;
private Printing3D3MFPackage package = new Printing3D3MFPackage();

Erstellen einer einfachen UI

In diesem Beispiel wird eine Schaltfläche Laden verwendet, um eine Datei in den Programmspeicher zu bringen, eine Schaltfläche Fix , um alle erforderlichen Änderungen an der Datei vorzunehmen, und eine Schaltfläche Drucken , um den Druckauftrag zu initiieren. Der folgende Code erstellt diese Schaltflächen (mit ihren On-Click-Ereignishandlern) in der entsprechenden XAML-Datei Ihrer CS-Klasse.

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

Das Beispiel enthält auch ein TextBlock für Ui-Feedback.

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

Abrufen der 3D-Daten

Die Methode, mit der Ihre App 3D-Geometriedaten abruft, kann variieren. Ihre App kann Daten aus einem 3D-Scan abrufen, Modelldaten aus einer Webressource herunterladen oder programmgesteuert mithilfe mathematischer Formeln oder Benutzereingaben ein 3D-Gitter generieren. Hier zeigen wir, wie Sie eine 3D-Datendatei (von mehreren gängigen Dateitypen) aus dem Gerätespeicher in den Programmspeicher laden. Die 3D Builder-Modellbibliothek bietet eine Vielzahl von Modellen zum Herunterladen.

In der OnLoadClick -Methode lädt die FileOpenPicker-Klasse eine einzelne Datei in den App-Arbeitsspeicher.

Der folgende Code zeigt, wie eine einzelne Datei mithilfe der FileOpenPicker-Klasse in der -Methode in den OnLoadClick App-Arbeitsspeicher geladen wird.

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 Builder

3D-Geometriedaten können in vielen verschiedenen Formaten vorliegen, und nicht alle sind für den 3D-Druck effizient. Windows verwendet den Dateityp 3D Manufacturing Format (.3mf) für alle 3D-Druckaufgaben.

Weitere Informationen zu 3MF und den unterstützten Features für Hersteller und Verbraucher von 3D-Produkten finden Sie in der 3MF-Spezifikation . Informationen zur Verwendung dieser Features mit Windows-APIs finden Sie im Tutorial Generieren eines 3MF-Pakets .

Hinweis

Die 3D Builder-App kann Dateien der gängigsten 3D-Formate öffnen und als .3mf-Dateien speichern. Es bietet auch Tools zum Bearbeiten Ihrer Modelle, hinzufügen von Farbdaten und zum Ausführen anderer druckspezifischer Vorgänge.

In diesem Beispiel, in dem der Dateityp variieren kann, können Sie die 3D Builder-App öffnen und den Benutzer auffordern, die importierten Daten als 3mf-Datei zu speichern und sie dann erneut zu laden.

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

Nicht alle 3D-Modelldaten sind druckbar. Dies gilt auch für den 3MF-Typ. Damit der Drucker richtig feststellen kann, welcher Platz gefüllt werden soll und was leer bleiben soll, muss jedes zu druckende Modell ein einzelnes nahtloses Gitter sein, über nach außen gerichtete Oberflächennormale und eine vielfältige Geometrie aufweisen. Probleme in diesen Bereichen können in verschiedenen Formen auftreten und in komplexen Formen schwer zu erkennen sein. Moderne Softwarelösungen eignen sich jedoch häufig für die Konvertierung von Rohgeometrie in druckbare 3D-Formen. Dies wird als Reparieren des Modells bezeichnet und wird in der hier gezeigten OnFixClick Methode implementiert.

Hinweis

Die 3D-Datendatei muss konvertiert werden, um IRandomAccessStream zu implementieren, womit anschließend ein Printing3DModel-Objekt generiert werden kann.

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 sollte jetzt repariert und druckbar sein. Weisen Sie das Modell mithilfe von SaveModelToPackageAsync dem Printing3D3MFPackage-Objekt zu, das Sie beim Erstellen der Klasse deklariert haben.

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

}

Ausführen des Druckvorgangs: Erstellen eines TaskRequested-Handlers

Wenn später das 3D-Druckdialogfeld für den Benutzer angezeigt wird und der Benutzer mit dem Drucken beginnt, muss Ihre App die gewünschten Parameter an die 3D-Druckpipeline übergeben. Die 3D-Druck-API löst das TaskRequested-Ereignis aus , das eine entsprechende Behandlung erfordert.

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. Der Print3DTaskRequestedEventArgs-Typ verfügt über eine Eigenschaft: Request. Sie hat den Typ Print3DTaskRequest und stellt eine Druckauftragsanforderung dar. Die CreateTask-Methode ermöglicht es der App, die richtigen Informationen für Ihren Druckauftrag zu übermitteln und einen Verweis auf das Print3DTask-Objekt zurückzugeben, das über die 3D-Druckpipeline gesendet wurde.

CreateTask verfügt über die folgenden Eingabeparameter: eine Zeichenfolge für den Namen des Druckauftrags, eine Zeichenfolge für die zu verwendende ID des Druckers und einen Print3DTaskSourceRequestedHandler-Delegat . Der Delegat wird automatisch aufgerufen, wenn das 3DTaskSourceRequested-Ereignis ausgelöst wird (dies erfolgt durch die API selbst). Zu beachten ist unbedingt, dass dieser Delegat beim Initiieren eines Druckauftrags aufgerufen wird. Er ist dafür zuständig, das richtige 3D-Druckpaket bereitzustellen.

Print3DTaskSourceRequestedHandler akzeptiert einen Parameter, ein Print3DTaskSourceRequestedArgs-Objekt , das die zu sendenden Daten enthält. Die SetSource-Methode akzeptiert das zu druckende Paket. Der folgende Code zeigt eine Print3DTaskSourceRequestedHandler-Delegatimplementierung (sourceHandler).

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

Rufen Sie als Nächstes CreateTask mit dem neu definierten Delegat auf.

// 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 am Anfang deklarierten Klassenvariablen zugewiesen. Dieser Verweis kann verwendet werden, um bestimmte Ereignisse zu behandeln, die von der Aufgabe ausgelöst werden.

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

Ausführen des Druckvorgangs: Öffnen des Dialogfelds für den 3D-Druck

Schließlich müssen Sie das Dialogfeld 3D-Druck starten, das eine Reihe von Druckoptionen bietet.

Hier registrieren wir eine MyTaskRequested Methode mit dem TaskRequested-Ereignis .

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;

Nach der Registrierung des TaskRequested-Ereignishandlers können Sie die Methode ShowPrintUIAsync aufrufen, die das Dialogfeld 3D-Druck im aktuellen Anwendungsfenster aufruft.

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

Es empfiehlt sich auch, die Registrierung Ihrer Ereignishandler zu aufheben, sobald Ihre App die Steuerung wieder aufgenommen hat.

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

3D-Druck mit Windows 10Generieren eines 3MF-Pakets
Beispiel für 3D-Druck – UWP