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

Wichtige APIs

Setup

Fügen Sie den Windows.Graphics.Printing3D-Namespace zu Ihrer Anwendungsklasse hinzu, für die 3D-Druckfunktionen erforderlich sind.

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;

Geben Sie als Nächstes den Klassen hilfreiche Memberfelder.

  • Deklarieren Sie ein Print3DTask -Objekt, um die Druckaufgabe darzustellen, die an den Drucktreiber übergeben werden soll.
  • Deklarieren Sie ein StorageFile-Objekt , um die ursprüngliche 3D-Datendatei zu speichern, die in die App geladen wird.
  • Deklarieren Sie ein Printing3D3MFPackage -Objekt, um ein druckfähiges 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 Klickereignishandlern) 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 einen 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 erfahren Sie, 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, die Sie herunterladen können.

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

Der folgende Code zeigt, wie eine einzelne Datei mithilfe der FileOpenPicker-Klasse in der Methode in den OnLoadClick App-Speicher 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;
    }

Verwenden des 3D-Generators zum Konvertieren in das 3D Manufacturing Format (3mf)

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 Produzenten und Verbraucher von 3D-Produkten finden Sie in der 3MF-Spezifikation . Informationen zur Verwendung dieser Features mit Windows-APIs finden Sie im Lernprogramm zum Generieren eines 3MF-Pakets .

Hinweis

Die 3D Builder-App kann Dateien der beliebtesten 3D-Formate öffnen und als 3MF-Dateien speichern. Außerdem werden Tools zum Bearbeiten Ihrer Modelle, zum Hinzufügen von Farbdaten und zum Ausführen anderer druckspezifischer Vorgänge bereitgestellt.

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 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, auch im 3MF-Typ. Damit der Drucker richtig bestimmen kann, welcher Platz gefüllt werden soll und was leer bleiben soll, muss jedes zu druckde Modell ein einzelnes nahtloses Gitter sein, über nach außen gerichtete Oberflächennormalen und über eine vielfältige Geometrie verfügen. Probleme in diesen Bereichen können in einer Vielzahl unterschiedlicher 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-Shapes. Dies wird als Reparatur des Modells bezeichnet und in der OnFixClick hier gezeigten Methode implementiert.

Hinweis

Die 3D-Datendatei muss konvertiert werden, um IRandomAccessStream zu implementieren, der dann zum Generieren eines Printing3DModel-Objekts verwendet 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. Verwenden Sie SaveModelToPackageAsync, um das Modell dem Printing3D3MFPackage-Objekt zuzuweisen, 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 einer Druckaufgabe: Erstellen eines TaskRequested-Handlers

Wenn das 3D-Druckdialogfeld dem 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 die entsprechende Behandlung erfordert.

private void MyTaskRequested(Print3DManager sender, Print3DTaskRequestedEventArgs args) {

Der Kernzweck dieser Methode ist die Verwendung des Args-Parameters , um eine Printing3D3MFPackage an die Pipeline zu senden. Der Print3DTaskRequestedEventArgs-Typ hat eine Eigenschaft: Anforderung. Es ist vom Typ Print3DTaskRequest und stellt eine Druckauftragsanforderung dar. Mit der Methode CreateTask kann die App die richtigen Informationen für Ihren Druckauftrag übermitteln und einen Verweis auf das Print3DTask-Objekt zurückgeben, das an 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-Delegaten . Der Delegat wird automatisch aufgerufen, wenn das 3DTaskSourceRequested-Ereignis ausgelöst wird (dies geschieht durch die API selbst). Wichtig ist zu beachten, dass diese Stellvertretung aufgerufen wird, wenn ein Druckauftrag initiiert wird und für die Bereitstellung des richtigen 3D-Druckpakets verantwortlich ist.

Print3DTaskSourceRequestedHandler akzeptiert einen Parameter, ein Print3DTaskSourceRequestedArgs-Objekt , das die zu sendenden Daten enthält. Die SetSource-Methode akzeptiert das zu druckde 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 der neu definierten Stellvertretung 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 klassenvariablen zugewiesen, die am Anfang deklariert ist. 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 und Task_Completed eine Task_Submitting Methode implementieren, wenn Sie sie für diese Ereignisse registrieren möchten.

Ausführen einer Druckaufgabe: Öffnen des Dialogfelds "3D-Druck"

Schließlich müssen Sie das 3D-Druckdialogfeld starten, das eine Reihe von Druckoptionen bereitstellt.

Hier registrieren wir eine MyTaskRequested Methode beim 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 3D-Druckdialogfeld im aktuellen Anwendungsfenster anzeigt.

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

Außerdem empfiehlt es sich, die Registrierung Der Ereignishandler zu deaktivieren, sobald die App die Steuerung fortsetzt.

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

3D-Druck mit Windows 10Generieren eines 3MF-Pakets
3D-Druck-UWP-Beispiel