ユニバーサル Windows プラットフォーム (UWP) アプリに 3D 印刷機能を追加する方法について説明します。
このトピックでは、3D ジオメトリ データをアプリに読み込み、3D モデルが印刷可能で正しい形式であることを確認した後で 3D 印刷ダイアログを起動する方法について説明します。 これらの手順の作業例については、 3D 印刷の UWP サンプルを参照してください。
重要な API
セットアップ
Windows.Graphics.Printing3D 名前空間を、3D 印刷機能を必要とするアプリケーション クラスに追加します。
using Windows.Graphics.Printing3D;
このガイドでは、次の名前空間も使用します。
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;
次に、クラスに役立つメンバー フィールドを指定します。
- 印刷ドライバーに渡す印刷タスクを表す Print3DTask オブジェクトを宣言します。
- StorageFile オブジェクトを宣言して、アプリに読み込まれる元の 3D データ ファイルを保持します。
- Printing3D3MFPackage オブジェクトを宣言して、必要なすべてのメタデータを含む印刷対応の 3D モデルを表します。
private Print3DTask printTask;
private StorageFile file;
private Printing3D3MFPackage package = new Printing3D3MFPackage();
簡単な UI を作成する
このサンプルでは、 Load ボタンを使用してファイルをプログラム メモリに取り込み、 Fix ボタンを使用してファイルに必要な変更を加え、 Print ボタンを使用して印刷ジョブを開始します。 次のコードは、.cs クラスの対応する XAML ファイルにこれらのボタン (クリック時のイベント ハンドラーを含む) を作成します。
<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 も含まれています。
<TextBlock x:Name="OutputTextBlock" TextAlignment="Center"></TextBlock>
</StackPanel>
3D データを取得する
アプリが 3D ジオメトリ データを取得する方法はさまざまです。 アプリでは、3D スキャンからデータを取得したり、Web リソースからモデル データをダウンロードしたり、数式やユーザー入力を使用してプログラムで 3D メッシュを生成したりできます。 ここでは、3D データ ファイル (いくつかの一般的なファイルの種類のいずれか) をデバイス ストレージからプログラム メモリに読み込む方法を示します。 3D Builder モデル ライブラリには、ダウンロードできるさまざまなモデルが用意されています。
OnLoadClick
メソッドでは、FileOpenPicker クラスは 1 つのファイルをアプリ メモリに読み込みます。
次のコードは、OnLoadClick
メソッドの FileOpenPicker クラスを使用して、1 つのファイルをアプリ メモリに読み込む方法を示しています。
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 製造形式 (.3mf) に変換する
3D ジオメトリ データはさまざまな形式で提供される可能性があり、すべてが 3D 印刷に効率的なわけではありません。 Windows では、すべての 3D 印刷タスクに 3D 製造形式 (.3mf) ファイルの種類が使用されます。
3MF の詳細と、3D 製品のプロデューサーとコンシューマーに対してサポートされる機能の詳細については、 3MF 仕様 を参照してください。 Windows API でこれらの機能を利用する方法については、 Generate a 3MF パッケージ チュートリアルを参照してください。
Note
3D Builder アプリは、最も一般的な 3D 形式のファイルを開き、.3mf ファイルとして保存できます。 また、モデルの編集、カラー データの追加、その他の印刷固有の操作を実行するためのツールも提供されます。
この例では、ファイルの種類が異なる場合は、3D Builder アプリを開き、インポートしたデータを .3mf ファイルとして保存してから再読み込みするようにユーザーに求めます。
// 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 印刷のモデル データを修復する
.3mf 型であっても、すべての 3D モデル データが印刷できるわけではありません。 プリンターが埋めるスペースと空のままにするものを正しく決定するには、印刷する各モデルが単一のシームレス メッシュで、外側に面するサーフェス法線を持ち、マニホールド ジオメトリを持っている必要があります。 これらの領域の問題は、さまざまな形式で発生する可能性があり、複雑な形状では見つけにくい場合があります。 ただし、最新のソフトウェア ソリューションは、多くの場合、生のジオメトリを印刷可能な 3D 図形に変換するのに適しています。 これはモデルを 修復 と呼ばれ、次に示す OnFixClick
メソッドで実装されます。
Note
3D データ ファイルは、 IRandomAccessStream を実装するために変換する必要があります。これを使用して、 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();
Printing3DModel オブジェクトを修復して印刷可能にする必要があります。 SaveModelToPackageAsync を使用して、クラスの作成時に宣言した Printing3D3MFPackage オブジェクトにモデルを割り当てます。
// save model to this class' Printing3D3MFPackage
OutputTextBlock.Text = "saving model to 3MF package";
await package.SaveModelToPackageAsync(model);
}
印刷タスクの実行: TaskRequested ハンドラーを作成する
その後、3D 印刷ダイアログがユーザーに表示され、ユーザーが印刷を開始することを選択した場合、アプリは必要なパラメーターを 3D 印刷パイプラインに渡す必要があります。 3D print API では、適切な処理が必要な TaskRequested イベントが発生します。
private void MyTaskRequested(Print3DManager sender, Print3DTaskRequestedEventArgs args) {
このメソッドの主な目的は、 args パラメーターを使用して Printing3D3MFPackage パイプラインを送信することです。 Print3DTaskRequestedEventArgs 型には、Request の 1 つのプロパティがあります。 これは Print3DTaskRequest 型であり、1 つの印刷ジョブ要求を表します。 そのメソッド CreateTask を使用すると、アプリは印刷ジョブの正しい情報を送信し、3D 印刷パイプラインから送信された Print3DTask オブジェクトへの参照を返すことができます。
CreateTask には、印刷ジョブ名の文字列、使用するプリンターの ID の文字列、および Print3DTaskSourceRequestedHandler デリゲートという入力パラメーターがあります。 デリゲートは、 3DTaskSourceRequested イベントが発生すると自動的に呼び出されます (これは API 自体によって行われます)。 注意すべき重要な点は、このデリゲートは、印刷ジョブが開始されたときに呼び出され、適切な 3D 印刷パッケージを提供する必要があるということです。
Print3DTaskSourceRequestedHandler は、送信するデータを含む Print3DTaskSourceRequestedArgs オブジェクトという 1 つのパラメーターを受け取ります。 SetSource メソッドは、印刷するパッケージを受け入れます。 次のコードは、 Print3DTaskSourceRequestedHandler デリゲート実装 (sourceHandler
) を示しています。
// this delegate handles the API's request for a source package
Print3DTaskSourceRequestedHandler sourceHandler = delegate (Print3DTaskSourceRequestedArgs sourceRequestedArgs) {
sourceRequestedArgs.SetSource(package);
};
次に、新しく定義されたデリゲートを使用して、 CreateTask を呼び出します。
// 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 は、最初に宣言されたクラス変数に割り当てられます。 この参照は、タスクによってスローされた特定のイベントを処理するために使用できます。
// optional events to handle
printTask.Completed += Task_Completed;
printTask.Submitting += Task_Submitting;
Note
これらのイベントに登録する場合は、 Task_Submitting
メソッドと Task_Completed
メソッドを実装する必要があります。
印刷タスクの実行: 3D 印刷ダイアログを開く
最後に、多数の印刷オプションを提供する 3D 印刷ダイアログを起動する必要があります。
ここでは、 MyTaskRequested
メソッドを 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;
TaskRequested イベント ハンドラーを登録した後、メソッド ShowPrintUIAsync を呼び出すと、現在のアプリケーション ウィンドウに 3D 印刷ダイアログが表示されます。
// show the 3D print dialog
OutputTextBlock.Text = "opening print dialog";
var result = await Print3DManager.ShowPrintUIAsync();
また、アプリが制御を再開したら、イベント ハンドラーの登録を解除することをお勧めします。
// remove the print task request after dialog is shown
myManager.TaskRequested -= MyTaskRequested;
}