Condividi tramite


Stampa 3D dall'app piattaforma UWP (Universal Windows Platform)

Informazioni su come aggiungere funzionalità di stampa 3D all'app UWP (Universal Windows Platform).

Questo argomento illustra come caricare dati geometrici 3D nell'app e avviare la finestra di dialogo di stampa 3D dopo aver verificato che il modello 3D sia stampabile e nel formato corretto. Per un esempio funzionante di queste procedure, si veda l'esempio UWP di stampa 3D.

API importanti

Attrezzaggio

Aggiungere lo spazio dei nomi Windows.Graphics.Printing3D alla classe dell'applicazione che richiede la funzionalità di stampa 3D.

using Windows.Graphics.Printing3D;

In questa guida verranno usati anche gli spazi dei nomi seguenti.

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;

Dopodiché, fornire alla classe campi membri utili.

  • Dichiarare un oggetto Print3DTask per rappresentare l'attività di stampa da passare al driver di stampa.
  • Dichiarare un oggetto StorageFile per contenere il file di dati 3D originale che verrà caricato nell'app.
  • Dichiarare un oggetto Printing3D3MFPackage per rappresentare un modello 3D pronto per la stampa con tutti i metadati necessari.
private Print3DTask printTask;
private StorageFile file;
private Printing3D3MFPackage package = new Printing3D3MFPackage();

Creare un'interfaccia utente semplice

Questo esempio usa un pulsante Carica per inserire un file nella memoria del programma, un pulsante Correggi per apportare le modifiche necessarie al file e un pulsante Stampa per avviare il processo di stampa. Il codice seguente crea questi pulsanti (con i relativi gestori eventi su clic) nel file XAML corrispondente della classe .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"/>

L'esempio include anche un controllo TextBlock per il feedback dell'interfaccia utente.

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

Ottenere i dati in 3D:

Il metodo con cui l'app acquisisce dati di geometria 3D può variare. L'app può recuperare dati da un'analisi 3D, scaricare i dati del modello da una risorsa Web o generare una mesh 3D a livello di codice usando formule matematiche o input utente. Qui viene illustrato come caricare un file di dati 3D (di uno dei diversi tipi di file comuni) nella memoria di programma dall'archiviazione del dispositivo. La Raccolta di modelli generatore 3D offre un'ampia gamma di modelli da scaricare.

Nel metodo OnLoadClick, la classe FileOpenPicker carica un singolo file nella memoria dell'app.

Il codice seguente illustra come caricare un singolo file nella memoria dell'app usando la classe FileOpenPicker nel metodo OnLoadClick.

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;
    }

Usare il generatore 3D per eseguire la conversione in formato di produzione 3D (.3mf)

I dati di geometria 3D possono essere disponibili in molti formati diversi ma non tutti sono efficienti per la stampa 3D. Windows usa il tipo di file 3D Manufacturing Format (3mf) per tutte le attività di stampa 3D.

Vedere la specifica 3MF per altre informazioni su 3MF e sulle funzionalità supportate per produttori e consumer di prodotti 3D. Per informazioni su come usare queste funzionalità con le API di Windows, vedere il tutorial Generazione di un pacchetto 3MF .

Nota

L'app Generatore 3D può aprire i file dei formati 3D più diffusi e salvarli come file 3mf. Fornisce anche strumenti per modificare i modelli, aggiungere dati a colori ed eseguire altre operazioni specifiche per la stampa.

In questo esempio, in cui il tipo di file può variare, è possibile aprire l'app Generatore 3D e chiedere all'utente di salvare i dati importati come file con estensione 3mf e quindi ricaricarlo.

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

Ripristinare i dati del modello per la stampa 3D

Non tutti i dati del modello 3D sono stampabili, anche nel tipo 3mf. Affinché la stampante determini correttamente quale spazio riempire e cosa lasciare vuoto, ogni modello da stampare deve essere una singola mesh senza interruzioni, avere delle normali alla superficie verso l'esterno e disporre di una geometria manifold. I problemi in queste aree possono verificarsi in una varietà di forme diverse e possono essere difficili da individuare in forme complesse. Tuttavia, le moderne soluzioni software sono spesso adeguate per convertire la geometria non elaborata in forme 3D stampabili. Questa operazione è nota come riparazione del modello e viene implementata nel OnFixClick metodo illustrato di seguito.

Nota

Il file di dati 3D deve essere convertito per implementare IRandomAccessStream, che può quindi essere usato per generare un oggetto 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();

L'oggetto Printing3DModel dovrebbe ora essere riparato e stampabile. Utilizzare SaveModelToPackageAsync per assegnare il modello all'oggetto Printing3D3MFPackage dichiarato durante la creazione della classe.

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

}

Eseguire l'attività di stampa: creare un gestore TaskRequested

Successivamente, quando viene visualizzata la finestra di dialogo di stampa 3D all'utente e l'utente sceglie di iniziare la stampa, l'app dovrà passare i parametri desiderati alla pipeline di stampa 3D. L'API di stampa 3D genererà l'evento TaskRequested , che richiede la gestione appropriata.

private void MyTaskRequested(Print3DManager sender, Print3DTaskRequestedEventArgs args) {

Lo scopo principale di questo metodo consiste nell'usare il parametro args per inviare un Printing3D3MFPackage nella pipeline. Il tipo Print3DTaskRequestedEventArgs possiede una proprietà: Richiesta. È di tipo Print3DTaskRequest e rappresenta una richiesta di processo stampa. Il metodo CreateTask consente all'app di inviare le informazioni corrette per il processo di stampa e restituire un riferimento all'oggetto Print3DTask inviato alla pipeline di stampa 3D.

CreateTask include i seguenti parametri di input: una stringa per il nome del processo stampa, una stringa per l'ID della stampante da usare e un delegato Print3DTaskSourceRequestedHandler. Il delegato viene richiamato automaticamente quando viene generato l'evento 3DTaskSourceRequested (questa operazione viene eseguita dall'API stessa). L'aspetto importante da notare è che questo delegato viene richiamato quando si avvia un processo di stampa ed è responsabile della fornitura del pacchetto di stampa 3D corretto.

Print3DTaskSourceRequestedHandler accetta un parametro, un oggetto Print3DTaskSourceRequestedArgs che contiene i dati da inviare. Il metodo SetSource accetta la stampa del pacchetto. Il codice seguente mostra un'implementazione del delegato Print3DTaskSourceRequestedHandler (sourceHandler).

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

Richiamare dunque CreateTask usando il delegato appena definito.

// the Print3DTaskRequest ('Request'), a member of 'args', creates a Print3DTask to be sent down the pipeline.
printTask = args.Request.CreateTask("Print Title", "Default", sourceHandler);

Print3DTask restituito viene assegnato alla variabile di classe dichiarata all'inizio. Questo riferimento può essere usato per gestire determinati eventi generati dall'attività.

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

Nota

Se si desidera registrarli in questi eventi, è necessario implementare un metodo Task_Submitting e Task_Completed.

Eseguire l'attività di stampa: aprire la finestra di dialogo stampa 3D

Infine, è necessario avviare la finestra di dialogo stampa 3D che fornisce una serie di opzioni di stampa.

In questo caso si registra un MyTaskRequested metodo con l'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;

Dopo aver registrato il gestore eventi TaskRequested , è possibile richiamare il metodo ShowPrintUIAsync, che visualizza la finestra di dialogo di stampa 3D nella finestra dell'applicazione corrente.

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

È anche consigliabile annullare la registrazione dei gestori eventi dopo che l'app riprende il controllo.

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

Stampa 3D con Windows 10Genera un pacchetto 3MF
Esempio UWP di stampa 3D