アプリからの 3D 印刷3D printing from your app

重要な APIImportant APIs

ユニバーサル Windows アプリに 3D 印刷機能を追加する方法について説明します。Learn how to add 3D printing functionality to your Universal Windows app. このトピックでは、アプリに 3D 形状データを読み込んだ後、その 3D モデルが印刷可能であり、正しい形式になっていることを確認してから 3D 印刷ダイアログを起動する方法について説明します。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. 以下の手順の実例については、3D 印刷の UWP サンプルをご覧ください。For a working example of these procedures, see the 3D printing UWP sample.

注意

このガイドのサンプル コードでは、簡潔にするためにエラー レポートと処理が大幅に簡略化されています。In the sample code in this guide, error reporting and handling is greatly simplified for the sake of simplicity.

セットアップSetup

3D 印刷機能を搭載するアプリケーション クラスで、Windows.Graphics.Printing3D 名前空間を追加します。In your application class that is to have 3D print functionality, add the Windows.Graphics.Printing3D namespace.

using Windows.Graphics.Printing3D;

このガイドでは、次の追加の名前空間を使います。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;

次に、有用なメンバー フィールドをクラスに追加します。Next, give your class helpful member fields. プリンター ドライバーに渡す印刷タスクを表すために、Print3DTask オブジェクトを宣言します。Declare a Print3DTask object to represent the printing task that is to be passed to the print driver. アプリに読み込まれる元の 3D データ ファイルを保持するために、StorageFile オブジェクトを宣言します。Declare a StorageFile object to hold the original 3D data file that will be loaded into the app. 必要なすべてのメタデータが含まれた、印刷準備が完了した 3D モデルを表す Printing3D3MFPackage オブジェクトを宣言します。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();

シンプルな UI の作成Create a simple UI

このサンプルでは、プログラム メモリにファイルを読み込む読み込みボタン、必要に応じてファイルを変更する修正ボタン、印刷ジョブを開始する印刷ボタンの 3 つのユーザー コントロールを使います。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. 次のコードで、これらのボタン (クリック イベント ハンドラー付き) を .cs クラスの対応する XAML ファイルに作成します。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"/>

UI フィードバック用に TextBlock を追加します。Add a TextBlock for UI feedback.

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

3D データの取得Get the 3D data

アプリでは、さまざまな方法で、3D 形状データを取得することができます。The method by which your app acquires 3D geometry data will vary. たとえば、3D スキャンからデータを取得したり、Web リソースからのモデル データをダウンロードしたり、数式やユーザー入力を使ってプログラムによって 3D メッシュを生成したりできます。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. ここでは簡単にするために、3D データ ファイル (一般的なファイルの種類のいずれか) をデバイスのストレージからプログラム メモリに読み込む方法を示します。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. 3D Builder モデル ライブラリには幅広いモデルが用意されており、デバイスに簡単にダウンロードできます。The 3D Builder model library provides a variety of models that you can easily download to your device.

OnLoadClick メソッドで、FileOpenPicker クラスを使って、1 つのファイルをアプリのメモリに読み込みます。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;
    }

3D Builder による 3D Manufacturing Format (.3mf) への変換Use 3D Builder to convert to 3D Manufacturing Format (.3mf)

これで、3D データ ファイルをアプリのメモリに読み込むことができます。At this point, you are able to load a 3D data file into your app's memory. ただし、3D 形状データには、さまざまな形式がありますが、すべてが 3D 印刷に効率的であるわけではありません。However, 3D geometry data can come in many different formats, and not all are efficient for 3D printing. Windows 10 では、すべての 3D 印刷タスクについて 3D Manufacturing Format (.3mf) というファイル形式を使います。Windows 10 uses the 3D Manufacturing Format (.3mf) file type for all 3D printing tasks.

注意

.3mf ファイル形式には、このチュートリアルで扱っている機能以外にも多くの機能が用意されています。The .3mf file type offers more functionality than is covered in this tutorial. 3MF と 3D 製品のプロデューサーおよびコンシューマー向けに用意されたその機能について詳しくは、3MF の仕様をご覧ください。To learn more about 3MF and the features it provides to producers and consumers of 3D products, see the 3MF Specification. Windows 10 API を使ってこれらの機能を利用する方法については、「3MF パッケージの生成」チュートリアルをご覧ください。To learn how to utilize these features with Windows 10 APIs, see the Generate a 3MF package tutorial.

3D Builder アプリでは、一般的なほとんどの 3D 形式のファイルを開くことができ、それらを .3mf ファイル形式で保存することができます。The 3D Builder app can open files of most popular 3D formats and save them as .3mf files. この例では、ファイルの種類が異なる場合に、簡単な解決策として、3D Builder アプリを開き、インポートしたデータを .3mf ファイルとして保存し再度読み込むようユーザーに求めます。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.

注意

3D Builder には、ファイル形式の変換以外にも、モデルを編集したり色データを追加したりといった、印刷に固有の操作を行うための簡単なツールが用意されているため、多くの場合、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";
    }
}

3D 印刷可能なモデル データへの修復Repair model data for 3D printing

.3mf 形式であっても、すべての 3D モデル データが印刷可能なわけではありません。Not all 3D model data is printable, even in the .3mf type. どこを埋めて何を空洞のままにするかをプリンターに正しく判断させるには、印刷する (各) モデルが 1 つのシームレスなメッシュであること、モデルの面の法線が外側を向いていること、またモデルがマニホールド形状であることが必要条件となります。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. これらの問題は、さまざまな形で現れることがあり、図形が複雑な場合は、見つけるのが難しいことがあります。Issues in these areas can arise in a variety of different forms and can be hard to spot in complex shapes. ただし、最新のソフトウェア ソリューションは、多くの場合、元データの形状を印刷可能な 3D 図形に変換するのに十分な機能を備えています。However, modern software solutions are often adequate for converting raw geometry to printable 3D shapes. これはモデルの修復と呼ばれ、OnFixClick メソッドで行われます。This is known as repairing the model and will be done in the OnFixClick method.

IRandomAccessStream を実装し、Printing3DModel オブジェクトを生成します。これを行うには、3D データ ファイルを変換する必要があります。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();

これで、Printing3DModel オブジェクトを印刷できる状態に修復できました。The Printing3DModel object is now repaired and printable. SaveModelToPackageAsync を使って、クラスを作成したときに宣言した Printing3D3MFPackage オブジェクトにモデルを割り当てます。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);

}

印刷タスクの実行: TaskRequested ハンドラーの作成Execute printing task: create a TaskRequested handler

3D 印刷ダイアログをユーザーに表示してユーザーが印刷を開始したときに、アプリが目的のパラメーターを 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. 3D 印刷 API によって、 TaskRequested イベントが発生します。The 3D print API will raise the TaskRequested event. このイベントを適切に処理するメソッドを記述する必要があります。You must write a method to handle this event appropriately. として常に、そのイベントと同じ型のハンドラー メソッドがあります。TaskRequestedイベント パラメーターには、 Print3DManager (その送信元オブジェクトへの参照)、 Print3DTaskRequestedEventArgs オブジェクトで、関連する情報の大部分を保持します。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) {

このメソッドの主な目的は、args パラメーターを使って、Printing3D3MFPackage をパイプラインに送信することです。The core purpose of this method is to use the args parameter to send a Printing3D3MFPackage down the pipeline. Print3DTaskRequestedEventArgs型が 1 つのプロパティ。要求します。The Print3DTaskRequestedEventArgs type has one property: Request. その型は Print3DTaskRequest で、1 つの印刷ジョブ要求を表します。It is of the type Print3DTaskRequest and represents one print job request. そのメソッドである CreateTask を使って、プログラムは印刷ジョブに関する適切な情報を送信します。このメソッドは、3D 印刷パイプラインに送信された Print3DTask オブジェクトへの参照を返します。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 には、印刷ジョブ名を表す string、使うプリンターの ID を表す string、および 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. このデリゲートは、3DTaskSourceRequested イベントが発生したときに自動的に呼び出されます (これは API によって行われます)。The delegate is automatically invoked when the 3DTaskSourceRequested event is raised (this is done by the API itself). 重要なのは、印刷ジョブが開始されたときにこのデリゲートが呼び出され、適切な 3D 印刷パッケージを提供する役割を果たすということです。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 は、送信するデータを提供する Print3DTaskSourceRequestedArgs オブジェクトという 1 つのパラメーターを取ります。Print3DTaskSourceRequestedHandler takes one parameter, a Print3DTaskSourceRequestedArgs object which provides the data to be sent. このクラスの 1 つのパブリック メソッドである SetSource が、印刷するパッケージを受け取ります。The one public method of this class, SetSource, accepts the package to be printed. 次のように、Print3DTaskSourceRequestedHandler デリゲートを実装します。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);
};

次に、新しく定義したデリゲート sourceHandler を使って、CreateTask を呼び出します。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);

返された Print3DTask が、最初に宣言したクラス変数に割り当てられます。The returned Print3DTask is assigned to the class variable declared in the beginning. これで、必要に応じてこの参照を使い、タスクによってスローされた特定のイベントを処理できるようになりました。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;

注意

これらのイベントに Task_Submitting および Task_Completed メソッドを登録するには、それらを実装する必要があります。You must implement a Task_Submitting and Task_Completed method if you wish to register them to these events.

印刷タスクの実行: 3D 印刷ダイアログを開くExecute printing task: open 3D print dialog

最後に 3D 印刷ダイアログを起動する短いコードが必要になります。The final piece of code needed is that which launches the 3D print dialog. 従来の印刷ダイアログ ウィンドウと同じように、3D 印刷ダイアログでも、最後に使った印刷オプションがいくつか表示され、ユーザーは使うプリンターを (USB かネットワーク接続かに関係なく) 選択することができます。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).

MyTaskRequested メソッドを 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;

TaskRequested イベント ハンドラーを登録したら、メソッド ShowPrintUIAsync を呼び出して、現在のアプリケーション ウィンドウに 3D 印刷ダイアログを表示することができます。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();

最後に、アプリにコントロールが戻ったら、イベント ハンドラーの登録を解除することをお勧めします。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;
}

3MF パッケージの生成Generate a 3MF package
3D 印刷 UWP サンプル3D printing UWP sample