跳轉到

工作流程:幾何驗證

本工作流程說明仿真後的加工幾何驗證工具,包含碰撞檢測、幾何差異比對、缺陷掃描與離料移除。

flowchart TD
    Simulate["執行仿真"]
    Collision["碰撞檢測"]
    Diff["幾何差異比對"]
    Defect["幾何缺陷掃描"]
    FlyPiece["離料移除"]

    Simulate --> Collision
    Simulate --> Diff
    Simulate --> Defect
    Simulate --> FlyPiece

1. 碰撞檢測

碰撞檢測在仿真期間監測刀具、刀把或主軸是否與工件、夾具或工具機相撞:刀把與刀柄每一步都對毛胚檢查,刀刃對毛胚只在程式還沒給主軸轉速之前的移動上檢查,因為主軸轉動時刀刃在毛胚裡就是切削;主軸停下之後(M05 或 S0)的插料不會以碰撞回報,快移插料仍會出快移切削警告。3.2.42 之前,對工件的碰撞配對雖然會產生,卻不會被評估,所以刀把或刀柄進入毛胚時不會出任何訊息。需在執行仿真之前啟用。

腳本命令

EnableCollisionDetection = true;
EnablePauseOnCollision = false;  // 設為 true 則發生碰撞時暫停
屬性 說明
EnableCollisionDetection 啟用仿真期間的碰撞檢查
EnablePauseOnCollision 發生碰撞時暫停執行

與失敗暫停結合

EnablePauseOnFailure (API) 提供更廣泛的失敗暫停機制:

EnablePauseOnFailure = true;
EnableCollisionDetection = true;
PlayNcFile("NC/file1.nc");  // 發生碰撞即暫停

GUI 操作

於主選項面板中,仿真前啟用碰撞檢測。

Tip

碰撞檢測會增加運算負擔。探索性仿真重視速度時可停用,最終驗證時再啟用。


2. 幾何差異比對

Diff 命令將仿真後的工件形狀與目標(設計)形狀比對,找出過切與欠切區域。

腳本命令

Diff(<DetectionRadius_mm>);

偵測半徑 為目標形狀的表面延伸距離。超過此距離的偏差不予計算。值越大耗時越久。

Diff(1);  // 偵測半徑 = 1 mm

沒有東西可比對的差異比對什麼也不建立,而且會這麼說。沒有理想(目標)幾何——或目標 STL 的路徑解析不到——時,Diff 發出警告 Diff--NoIdealGeom 後返回;沒有可比對的網格幾何時,發出警告 Diff--NoMeshedGeom;工作階段裡完全沒有工件時,回報 Diff--Empty。這些情況都不會掛上覆蓋層,也不會回報 Diff--Built——這則訊息才是正面的證據,而跳過比對的執行也不再宣稱已完成比對。透過 HTTP API,同一件事以狀態的形式讀出:GET /api/Workpiece/diff-settings 回應 hasDiffOverlay——只有在一份算好的覆蓋層掛在即時的網格樹上時才為 true,它既不代表「有偏差」(零偏差的比對也會掛上覆蓋層),也不代表「有要求過比對」——以及 detectionRadius,它在覆蓋層存在之前為 null,之後則是建立該覆蓋層所用的半徑。覆蓋層會在執行期 (runtime) 重置或網格樹被換掉時消失,所以要在下一次「重置」之前讀取狀態。

比對還會回報什麼。設計的表面不封閉時——有開放邊或非流形邊,T 形接點也算開放——會發出警告 Diff--TargetNotClosed,比對照樣進行,每個格子的正負號取自模擬出的零件,而不是設計的法向繞序。沒有授權功能時發出警告 Diff--Unlicensed;比對什麼也沒掛上時發出警告 Diff--NoResult,並讓零件恢復原本的顏色。這兩種情況都不會回報 Diff--Built。完成的比對會送出一則 Diff--Stats 訊息,帶著它的計數——回報的格子、細分的格子、沒有讀值的格子、量測的線段,以及設計的三角形數。

把差異比對當成一次獨立的執行來編列預算。它的時間與記憶體會隨零件的大小、以及網格每減半一次而增加。在小零件上只要幾秒。比對是在每個表面格子自己的線段上量測,只細分設計在觸及範圍內不是單一平面的格子;在 Linux 版上把一個零件與它自己的設計 STL 以 0.25 mm 比對——只算原生的比對本身,兩組在同一台機器上——花了 1.2 秒與 559 MB,其中 459 MB 是毛胚的樹本身;到 3.2.39 為止的比對會先把整棵樹網格化到最細的一層,同一件要 13.7 秒與 859 MB。大件的情況此後還沒有重新量過:用那個舊的比對,在每邊幾百毫米、以 0.25 mm 網格化的毛胚上,1 mm 的差異比對約需 14 分鐘、約 85 GB 記憶體,而播放本身只需約 4 分鐘與 6 GB。在重新量過之前,大零件請先在較粗的重播上比對;除非確知主機有足夠的記憶體可用,否則不要在共用的服務實例上,把差異比對附加在精細的整件執行之後。

結果判讀

比對完成後,工件表面以顏色標示:

  • 綠色:在公差範圍內
  • 紅色(負向):超過門檻的過切,也就是切掉了設計要保留的料
  • 藍色(正向):超過門檻的欠切,也就是設計沒有料的地方還留著料

直接由設計本身建出的毛胚樹,在每個地方讀到的都在設計的約 1e-6 mm 以內,稜邊與角落的格子也不例外。到 3.2.39 為止,這些格子會讀成過切四分之一到三分之一個格寬,於是一個與設計相符的零件,每條銳利的稜邊上都畫著一條紅線。

色階有它自己的半徑。DiffVisualRadius_mm 是著色達到飽和時的偏差值——除非專案另有設定,否則為 0.1 mm。它是一項專案設定:由工件承載,.hincproj 把它寫成 <DiffVisualRadius_mm>,而檔案若沒寫它——或寫的是非正數或非有限值——會讀成預設值,而不是載入失敗。所以同一個工件的每一份快照都以同一把尺判讀。它與偵測半徑互相獨立:顯示半徑大於偵測半徑也會被接受,只代表色階永遠不會飽和。設定它會替已掛上的覆蓋層重新上色;它絕不會重新執行比對,而任何不是有限正數的值都會被拒絕。

DiffVisualRadius_mm = 0.05;  // 色階在 0.05 mm 飽和;隨專案存檔

透過 HTTP API,它是帶著 {"diffVisualRadius": 0.05} 的 POST /api/Workpiece/diff-settings;值不是有限正數時回應 400,沒有載入專案時回應 NotFound。在網頁介面上,它是「程式」分支的「幾何差異」節點上的「顯示半徑」。

Note

執行 Diff 後,工件表面的路徑索引會 失效。若需檢視個別步路徑,請先做完路徑檢視再呼叫 Diff。

案例:往復斜面干涉

CAM 產生的 NC 碼可能含有非經幾何比對難以察覺的細微錯誤。透過 Diff 常見發現:

議題 說明
直角壁面欠切 目標幾何有銳角時,壁面附近欠切
Z 軸下刀不一致 往復下刀區段 Z 值不一致造成過切
半徑空間不足 往復邊緣刀具未退出半徑距離造成欠切
條紋狀欠切 往復路徑間距過大造成的條紋狀欠切

Tip

沒有軟體比對的話,這些問題往往要實際加工後才能發現,對精密製造影響甚大。


3. 幾何缺陷掃描

幾何缺陷掃描有助於除錯異常的工件或刀具幾何。通常只在懷疑幾何建構有問題時使用。

ScanMeshedGeomInfDefect

ScanMeshedGeomInfDefect (API) 在網格幾何中掃描無限邊切削缺陷。掃描後缺陷區會以彩色標記呈現。

ScanMeshedGeomInfDefect();

回傳值:

  • true — 偵測到缺陷
  • false — 無缺陷
  • null — 無法執行(如工件不存在)

流程:仿真前掃描

ScanMeshedGeomInfDefect();
Pause();                    // 視覺檢視缺陷
ClearDefectDisplayee();     // 清除標記
PlayNcFile("NC/file1.nc");

ClearDefectDisplayee

ClearDefectDisplayee (API) 移除工件上的缺陷標記:

ClearDefectDisplayee();

Note

工件重新載入或網格幾何重置時,缺陷標記會自動清除。工件初始化時若偵測到建構缺陷,標記會自動顯示。


4. 離料移除

五軸切削中,可能會出現未連接的小塊殘料(「離料」)。使用 RemoveFlyPiece 清除。

腳本命令

RemoveFlyPiece();

Tip

在仿真後、幾何輸出(ExportMeshedGeomToStl)之前執行 RemoveFlyPiece,可產生乾淨的輸出。


綜合驗證腳本範例

// 啟用碰撞檢測並執行仿真
EnableCollisionDetection = true;
EnablePauseOnCollision = false;
EnablePhysics = true;
MachiningResolution_mm = 0.125;

PlayNcFile("NC/file1.nc");

// 移除離料
RemoveFlyPiece();

// 與目標幾何比對(1 mm 偵測半徑)
Diff(1);

// 掃描幾何缺陷
var hasDefects = ScanMeshedGeomInfDefect();
if (hasDefects == true)
{
    WarningMessage("Geometry defects detected");
}

// 匯出最終幾何
ExportMeshedGeomToStl("Output/final.stl");
WriteStepFiles("Output/[NcName].step.csv");

延伸閱讀