從通用 Windows 平台應用程式進行 3D 列印
了解如何將 3D 列印功能新增至通用 Windows 平台 (UWP) 應用程式。
本主題介紹如何將 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
此範例使用載入按鈕將檔案載入到程式記憶體中,使用修復按鈕對檔案進行任何所需的修改,並使用列印按鈕啟動列印作業。 以下程式碼會在 .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 類別會將單一檔案載入到應用程式記憶體中。
以下程式碼示範如何使用 OnLoadClick
方法中的 FileOpenPicker 類別,將單一檔案載入到應用程式記憶體中。
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 規範,以深入了解有關 3MF 以及 3D 產品生產者和取用者支援的功能。 若要了解如何透過 Windows API 使用這些功能,請參閱產生 3MF 套件教學課程。
注意
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 列印的模型資料
並非所有 3D 模型資料都可列印,即使是 .3mf 類型也是如此。 為了讓印表機正確判斷要填滿的空間,以及要保留空白的空間,每一個要列印的模型都必須是單一無縫網格,具有朝外的表面法線,並且具有流形幾何形狀。 這些領域的問題可能以各種不同的形式出現,並且很難在複雜的形狀中發現。 然而,現代軟體解決方案通常足以將原始幾何形狀轉換為可列印的 3D 形狀。 這稱為修復模型,並在 OnFixClick
方法中實現,如下所示。
注意
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 列印 API 將引發 TaskRequested 事件,該事件需要適當處理。
private void MyTaskRequested(Print3DManager sender, Print3DTaskRequestedEventArgs args) {
此方法的核心目的是使用 args 參數,沿著管線傳送 Printing3D3MFPackage。 Print3DTaskRequestedEventArgs 類型有一個屬性:Request。 它的類型為 Print3DTaskRequest,代表一個列印工作要求。 其方法 CreateTask 可讓應用程式提交列印工作的正確訊息,並傳回對沿 3D 列印管線傳送的 Print3DTask 物件的參考。
CreateTask 具有以下輸入參數:列印工作名稱的字串、要使用印表機的識別碼字串,以及 Print3DTaskSourceRequestedHandler 委派。 當引發 3DTaskSourceRequested 事件時,會自動呼叫委派 (這是由 API 本身完成的)。 需要注意的重要一點是,啟動列印作業時會叫用此委派,並負責提供正確的 3D 列印套件。
Print3DTaskSourceRequestedHandler 會採用一個參數,即 Print3DTaskSourceRequestedArgs 物件,其中包含要傳送的資料。 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;
注意
如果您希望將 Task_Submitting
和 Task_Completed
註冊到這些事件,則必須實作它們。
執行列印工作:開啟 3D 列印對話方塊
最後,您需要啟動提供許多列印選項的 3D 列印對話方塊。
在這裡,我們向 TaskRequested 事件註冊MyTaskRequested
方法。
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;
}