專案 (Projects)¶
一個專案,就是一場仿真所依據的全部:工具機、主軸能力、環境與冷卻液條件、夾具、工件、刀具庫、控制器,以及任務所播放的 NC 程式。它是一個專案檔連同該檔案所在的資料夾,而選單列上的「檔案」下拉選單就是建立、開啟、儲存與關閉專案的地方。各個設備畫面與任務畫面都是對著當時開著的那個專案在編輯,所以換一個專案,會一次觸及它們全部。
位置¶
「檔案」下拉選單在選單列的左側,排在「偏好設定」與「說明」之前。它的第一列是一個唯讀欄位,放著開啟中專案的路徑——可以選取,所以能複製——在有專案開啟之前則顯示尚未載入專案。這個路徑是相對於服務啟動時所依據的管理者目錄來寫的,而不是寫成它在運行服務那台機器上的位置。
那一列是路徑唯一固定停留的地方;其他各處都是暫時的——不是某件事進行中畫出的一行字,就是某件事已經發生過的紀錄。專案動作進行中時,頁尾的背景作業區會把動作與路徑一起列出,寫成正在載入專案:…,其他項目各有對應的寫法。回報動作完成的快顯通知 (toast) 以該路徑作為它的副標 (caption),而那一行會在快顯通知消失後留在頁尾的「最近訊息」清單裡。服務持有的是一個開啟中的專案,而不是每個瀏覽器各一個,所以連到它的每一個瀏覽器都在處理同一個專案。
各項目的作用¶
| 項目 | 作用 |
|---|---|
| 新增 | 在選定的路徑建立一個專案並開啟它;該路徑若已有檔案則拒絕 |
| 載入 | 開啟既有的專案檔 |
| 重新載入 | 從專案自己的路徑重新讀取開啟中的專案,捨棄所有未儲存的內容 |
| 儲存 | 把開啟中的專案寫回它自己的路徑 |
| 另存新檔 | 把它寫到選定的路徑,該路徑隨即成為開啟中的專案 |
| 關閉專案 | 關閉它,讓應用程式處於沒有專案的狀態 |
「重新載入」、「儲存」、「另存新檔」與「關閉專案」在有專案開啟之前都是反灰的。「新增」與「載入」隨時都能選。
需要路徑的三個項目——「新增」、「載入」與「另存新檔」——會把共用的檔案瀏覽器當作選取器開啟,篩選為 HiNC 專案 (*.hincproj)。它從不提供 Resource 根目錄:Admin 根目錄一定在,旁邊的 Project 根目錄則只在有專案開著時才出現。它開在 Admin 根目錄——有開啟中的專案時,就停在該專案所在的資料夾。儲存時會強制加上副檔名,所以鍵入時沒帶副檔名的名稱,一樣會得到它。
專案究竟是什麼¶
專案檔是一份由參照組成的 XML 文件。只對這一個專案有意義的值直接寫在裡面;而那些會被共用、體積大或需要獨立編輯的部分——機構鏈、主軸能力、工件與刀具材料、切削參數、網格幾何——則以參照的形式指向放在它旁邊的檔案,每一個都以相對於專案檔所在資料夾的路徑命名。用文字編輯器打開專案檔,看到的是這些參照,而不是它們所指向的內容。
幾何檔或隨附檔案缺了都不擋載入,只有專案檔本身讀不到才擋(重要)
原始幾何或隨附檔案指向空無一物,都不會擋住專案開啟。「載入」與「重新載入」讀得到的就讀、讀不到的就回報,動作仍然回報成功。STL 缺少的原始幾何會以沒有幾何的樣子開起來。以參照指名的隨附檔案——機構鏈、主軸能力、某個材料、某組切削參數——不在專案檔所說的位置,或讀不到時,那個部分會保持空白:不會有預設值被放進它的位置,參照會留在專案裡,所以儲存時會原封不動地寫回去,而把檔案放回原處再選「重新載入」就能還原。需要這個缺少部分的東西,會在程式播放時被略過,並附上一則寫出檔名的訊息。專案檔本身是例外:讀不到的專案檔——被鎖住、格式錯誤,或在「重新載入」讀它時已經不見——會讓動作失敗,之後沒有任何專案開著。「載入」與「重新載入」會在讀檔之前先釋放開啟中的專案,所以兩個專案的網格絕不會同時佔在記憶體裡;把檔案放回去再載入一次,就是復原的方法。原始幾何所指名的網格幾何 .wct 檔更安靜:載入既不開啟它、也不提起它,關於它的第一句話,是網格幾何第一次被需要時才發出的一則警告。當載入帶著缺口成功了,那則訊息是唯一說出實情的東西,而且它不是保存在執行的訊息所保存的地方:見專案載入引發的訊息。
因此,說專案是一個資料夾,至少和說它是一個檔案一樣貼切。把專案複製到另一台機器、把它封存起來,或交給別人,都意味著要帶走整個資料夾。
下圖是示範專案自己的資料夾,位於 /util/file-explorer/Project。檔案總管的根目錄選擇器在頁面名稱旁邊,設為 Project——只在有專案開著時才存在、並解析為存放開啟中專案檔那個資料夾的根目錄——路徑框則讀作 .,即根目錄本身。最上面是三個資料夾 MachineTool、NC 與 Output,底下是五個檔案:切削參數與工件材料、138.1 KB 的專案檔本身、主軸能力,以及一個刀具材料。右側窗格是檔案總管的文字編輯器,正等著有檔案交給它。

Warning
另存到一個新資料夾,可能產生一個連一支自己的程式都找不到的專案。「另存新檔」會把專案檔所參照的隨附檔案——機構鏈、主軸能力、各個材料、切削參數,以及設備與工件所指名的 STL 網格——寫進新資料夾,放在相同的相對位置。有兩樣東西只以路徑的形式跟過去、背後什麼都沒有:網格幾何 .wct 檔,它根本從來不會被寫出;還有專案開啟時就已經缺少的 STL,它會被刻意保持缺少的狀態,而不是換成一個空檔案。任務所播放的 NC 程式同樣不會被寫出:專案把每一個都記成路徑,而儲存這一側沒有任何東西會複製檔案。也沒有任何東西會改寫那些路徑,所以存下來的專案仍然要求 NC/…,如今是在新資料夾底下,而沒有任何東西把它放到那裡。程式得用手動的方式帶過去,或者把「另存新檔」對準一個已經放著它們的資料夾。
執行把輸出寫進去的那個資料夾也是以同樣方式命名的,但它不是同一類的相依項:沒有任何東西必須先把它放到那裡,因為各個寫入者會在開啟中專案原本讀自的那個資料夾底下,按需建立它。「另存新檔」不會搬動它——執行仍然寫在專案原本所在的那個資料夾旁,直到那個專案在新路徑被開啟為止。
專案變更對視窗其餘部分的影響¶
決定是否重建的是路徑有沒有改變,而不是選了哪個項目。「新增」、挑了另一個專案的「載入」、「關閉專案」,以及另存到與目前開啟位置不同之處的「另存新檔」,全都會改變路徑,而每一個都會丟掉瀏覽器已經建好的每一個畫面,對著之後的專案(不論它是什麼)重建——正是這一點,讓任何畫面都不會顯示出某個已不再開啟的專案的值。「重新載入」也一律重建,因為它就是為了重讀同一個路徑而設的項目。挑到的正是目前已開啟專案的「載入」則什麼都不重建:檔案在服務上再讀一次,但各畫面保留原本顯示的內容。應用程式視窗從框架這一側陳述同一條規則,並說明重建會讓一個帶著未儲存狀態的畫面付出什麼代價。
一項變更能傳到發出它的瀏覽器之外多遠,每個項目並不相同。會改變服務所持有開啟專案的那三個項目,會向連到它的每一個瀏覽器宣告,所以全部都會跟著走。「重新載入」重讀的是同一個路徑:提出要求的那個瀏覽器會重建,而第二個瀏覽器——它的路徑沒有變——則繼續顯示原本的內容。
「另存新檔」則完全不宣告。服務移到新路徑上,而只有執行「另存新檔」的那個瀏覽器會得到通知——在它自己那次請求的回覆裡。其他每一個瀏覽器的「檔案」下拉選單仍繼續顯示舊路徑,儘管底下的服務已在使用新的那個——所以從它們任何一個發出的「儲存」,寫的都是新路徑。過期的那一列會在服務下次向該瀏覽器回報狀態時自行更正:瀏覽器頁面重新整理一次、該瀏覽器的狀態連線斷掉又接回來、另一次專案變更,或是從任一瀏覽器啟動、暫停、完成或重設一次執行。
「新增」、「載入」、「重新載入」、「儲存」、「另存新檔」與「關閉專案」一次只進行一個。第一個還在執行時再要求第二個,會被拒絕而不是排隊,而拒絕是以一則警告送達,寫著另一項專案操作正在進行中,請稍後再試。「關閉專案」和其他五個一樣會佔住這一輪:「載入」還在讀取時要求「關閉」會被拒絕,「關閉」還在拆除專案時要求「載入」也一樣。
丟失工作成果¶
沒有任何東西在追蹤開啟中的專案是否有未儲存的變更。選單列或路徑列上沒有任何記號表示專案已被編輯,「重新載入」與「關閉專案」前面沒有任何提示,而關閉或重新整理瀏覽器分頁,更是完全沒有任何東西擋著。「重新載入」與「關閉專案」都會把服務持有而尚未寫出的內容丟棄,無聲而且立即;事前先「儲存」是唯一能留住它的辦法。
「另存新檔」同樣什麼都不問。它的對話框開在開啟中專案自己的資料夾、已經填好開啟中專案自己的檔名,而沒有任何東西檢查所選路徑是否已有檔案:確認就會覆寫那裡原有的任何東西。因此,照著預先填好的名稱直接確認,會覆寫目前開啟的專案——這無害,因為那正是「儲存」做的事——但同樣的一次確認若落在另一個資料夾裡,就會同樣無聲地覆寫另一個專案。「新增」是唯一會拒絕的項目:它不會在已有檔案的位置建立專案,並把這件事當作錯誤回報,其訊息可能帶出完整的位置。
建立之前¶
在專案能被建立之前要向機台擁有者蒐集的資料,自成一份清單:專案資料盤點清單。各個部分之後組合起來的順序,則見專案建構。