ユニバーサル Windows プラットフォーム アプリからの 3D 印刷
ユニバーサル 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;
}