跳轉到內容

OpenSCAD 使用者手冊/常見問題解答

來自華夏公益教科書

OpenSCAD 如何發音?

[編輯 | 編輯原始碼]

預期發音為:Open - ESS - CAD

OpenSCAD 中 S 的含義是什麼?

[編輯 | 編輯原始碼]

S 代表Solid,如 實體建模.

在 VM 或遠端桌面(Windows RDP 或 Linux XfreeRDP 等)中使用 Windows 的 OpenSCAD

[編輯 | 編輯原始碼]

您的 VM 或會話可能不支援 OpenSCAD 預覽所需的 OpenCSG/OpenGL 版本。

這可以透過使用 MSYS2 包中的 Mesa 驅動程式進行軟體渲染來解決。

下載倉庫(下面 URL 中的“檔案:”連結),選擇適合您的 Windows 安裝的 64 位或 32 位版本。

64bit - mingw64 Repo at https://packages.msys2.org/package/mingw-w64-x86_64-mesa?repo=mingw64
32bit - mingw32 Repo at https://packages.msys2.org/package/mingw-w64-i686-mesa?repo=mingw32

該檔案是一個 ...pkg.tar.xz 壓縮檔案,Windows 不支援該格式。使用 7-zip 或 WinRAR 解壓縮檔案內容。

解壓縮檔案 mingw[64 或 32]\bin\opengl32.dll(對於 64 位版本,檔案仍然命名為 opengl32.dll)。

將 opengl32.dll 複製到 OpenSCAD 安裝目錄(即包含 openscad.exe 檔案的目錄,通常是 c:\program files [對於 64 位] 或 c:\program files(x86) [對於 32 位] 的子目錄)。

重新啟動 OpenSCAD,預覽應該正常工作。

預覽似乎根本不起作用

[編輯 | 編輯原始碼]
強制使用 Goldfeather

某些系統,特別是 Windows 上的英特爾 GPU,往往具有舊的或損壞的 OpenGL 驅動程式。這在使用差值或交集運算子時會影響預覽渲染。

以下方法通常可以改善這種情況:編輯->首選項->高階->強制使用 Goldfeather(參見截圖)。

預覽中那些奇怪的閃爍偽像是什麼?

[編輯 | 編輯原始碼]
OpenSCAD 顯示問題,存在重合面

這通常是由對共享一個或多個面的物件進行差值引起的,例如:

cube_size = 20;
difference() {
  cube(cube_size, center = true);
  cylinder(r = 10, h = cube_size, center = true);
}

在某些情況下,最終渲染效果很好,但具有重合結果面的設計應被視為具有未定義行為的設計,因為無法保證適當的渲染結果。問題的根本原因不是 bug,而是無法嚴格比較浮點數的內在屬性,這些浮點數可能已經過三角運算(如旋轉)從而導致無法以任何方式精確表示的無理數。因此,您可能會遇到幾乎重合的表面,其中一部分表面在內部,一部分表面在外部,或者存在零體積區域,從而導致渲染錯誤,即輸出不是流形。在像這個例子這樣簡單的測試中,渲染通常會很好,給這種方法帶來錯誤的信心,但是如果這兩個部件都受到相同的旋轉,它可能會以一種略微依賴於程式執行平臺的方式失敗。這通常會導致渲染時出現警告,並且最終輸出中會刪除渲染的部件。

解決方法是始終為要移除的表面提供明確的重疊,例如透過新增一個稱為 epsilon 的小值。

cube_size = 20;
difference() {
  cube(cube_size, center = true);
  cylinder(r = 10, h = cube_size+0.01, center = true);
}

請注意,聯合也會出現類似問題,其中要合併的重合面也必須給出 epsilon 值才能保證它們始終在內部。

還有一種只在預覽中出現的閃爍結果,它也可能發生在即使在最終結果中也不應該可見的面,例如,因為它們是用於透過 difference() 操作進行移除的負面。第二種情況是對完全正確移除的面(或負面)的影響,這是用於繪製預覽的庫的偽像,不會影響渲染。如果需要乾淨的預覽結果(例如用於影像輸出),可以透過相同的方式使用 epsilon 值對其進行調整。有關其他詳細資訊,請參見 此討論

另請參見:w:Z 衝突

為什麼模型的某些部分(例如孔)渲染不正確?

[編輯 | 編輯原始碼]
OpenSCAD 顯示問題,凸性設定過低

當使用 linear_extrude() 等功能或匯入物件時,可能會發生這種情況。物件的凸性是未知的。對於更復雜的物件,可以使用 convexity 引數來指定值。請注意,較高的值會導致預覽速度變慢。

difference() {
    linear_extrude(height = 15 /* , convexity = 2 */) {
        difference() {
            square([50, 50]);
            translate([10, 10]) circle(5);
        }
    }
    translate([25, 25]) cube([5, 5, 40], center = true);
}

使用者手冊(第 拉伸所有拉伸模式的引數 節)描述瞭如何計算應該賦予凸性引數的數字。

另一個解決方法可能是使用 render() 強制生成網格,即使是在預覽模式下。

參見: w:凸性_(數學)

為什麼差集 (或交集) 有時在預覽中不起作用?

[編輯 | 編輯原始碼]
球體減去立方體,相機位於不可見立方體之外。
相同的模型,視角略微旋轉,使相機位於不可見立方體內部。
difference() {
    sphere(10);
    cube(100);
}

在透視模式下,預覽器不會處理相機位於不可見物體內部的差集或交集。這在使用大型物體切除模型的很大一部分時最為常見。

解決方法

  • 將相機保持在不可見物體之外。
  • 將不可見物體的大小保持適中,以便更容易將相機保持在它們之外。
  • render() 包裹在差集或交集中。
  • 使用正交模式。


為什麼我的模型使用 F5 顯示,但使用 F6 不顯示?

[編輯 | 編輯原始碼]
具有翻轉面的 OpenSCAD 多面體

這可能是由 多面體 的翻轉面造成的。

這可以在 “Thrown Together” 顯示模式下視覺化。有關詳細資訊,請參閱 無序面

points = [[5,5,0],[5,-5,0],[-5,-5,0],[-5,5,0],[0,0,3]];
faces = [[0,1,4],[1,2,4],[2,3,4],[3,4,0],[1,0,3],[2,1,3]];
polyhedron(points, faces);

如果模型匯入外部 STL 檔案,請參閱 匯入相關問題。令人困惑的是,錯誤只在涉及多個物體時才會出現,即在你新增另一個專案之前它 “起作用”。

為什麼預覽速度如此之慢?

[編輯 | 編輯原始碼]

http://forum.openscad.org/Why-is-for-so-slow-tp11511p11531.html

這很難解釋,但本質上,將交集(或差集)作為差集中的負物體是昂貴的。預覽渲染演算法允許只有基本物體作為負物體,而其他所有物體都必須解包。

例如(使用 A+B = union() / A-B = difference() / A*B = intersection()

A - B*C - D*E

變為:A-B-D + A-B-E + A-C-D + A-C-E

.. 並且如果 A 更復雜

A+B - C*D - E*F

變為:A-C-E + A-C-F + A-D-E + A-D-F + B-C-E + B-C-F + B-D-E + B-D-F

必須渲染所有組合,這可能需要一些時間,尤其是在舊的 GPU 上,以及在低端英特爾 GPU 上。

為什麼我匯入的 STL 檔案使用 F5 顯示,但使用 F6 不顯示?

[編輯 | 編輯原始碼]

這主要是由不良的 STL 檔案引起的,最好的方法是在 Blender、MeshLab 或 NetFabb 等工具中驗證 STL 檔案並修復問題。本質上,模型需要是流形才能在 OpenSCAD 中進行處理。

模型仍然出現在預覽模式中的原因是,還沒有進行真正的幾何計算。預覽只是從 STL 中繪製三角形。

有一個會導致問題的特定問題,稱為 “零面”(意味著 STL 包含面積為零的三角形,因為所有 3 個點都在一條線上),OpenSCAD 目前對它的處理不好。

使用 MeshLab

MeshLab 具有一個過濾器,可以透過翻轉多邊形的邊來刪除零面

過濾器 -> 清理和修復 -> 透過邊翻轉刪除 T 頂點.

將比率設定為高值(例如 1000000),否則模型可能會變形。

使用 Blender

Blender 有一個 3D 列印工具箱外掛(需要在使用者設定中啟用),可以顯示 STL 檔案中的問題。請參閱 http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/Modeling/PrintToolbox

使用 NetFabb/微軟雲服務

微軟 3D 模型修復服務可以幫助修復 STL 檔案。在釋出檔案之前,請確保閱讀服務條款。請參閱 https://modelrepair.azurewebsites.net/

我在匯入 DXF 檔案時收到 “不支援的 DXF 實體” 警告。這是什麼意思?

[編輯 | 編輯原始碼]

DXF 匯入有時會產生警告資訊,例如 Unsupported DXF Entity 'SPLINE' (1c1) in "file.dxf"。這意味著 DXF 檔案正在使用 OpenSCAD 匯入器無法處理的功能。匯入器只是忽略這些未知實體,這會導致模型不完整。

使用 Inkscape 時,生成不包含不支援實體的 DXF 檔案的最簡單方法是使用以下方法將所有貝塞爾曲線轉換為短線段

擴充套件 -> 修改路徑 -> 平滑貝塞爾曲線

對話方塊中給出的值決定線段的長度。較低的值會產生更平滑的結果,但也產生更多的線段。作為匯出檔案格式,使用 “臺式切割繪圖儀 (AutoCAD DXF R14)”。

更詳細的教程可在 http://repraprip.blogspot.de/2011/05/inkscape-to-openscad-dxf-tutorial.html 找到

如何從一個指令碼匯出多個部件?

[編輯 | 編輯原始碼]

答案基於 github 相關問題中的評論 https://github.com/openscad/openscad/pull/1534#issuecomment-227024209

有一種方法可以生成一堆幾何基元並將它們作為 STL 檔案從單個指令碼匯出,而無需註釋/取消註釋程式碼。

變數 PARTNO 指示在當前執行中匯出哪個部件。如果 PARTNO 為 ‘undef’,則不會匯出任何內容。

使用 PARTNO=0 匯出的影像
 PARTNO = undef; // default part number
 
 module tree() {
   color("green") cylinder(r1 = 12, r2 = 1, h = 30);
   // ...
 }
 
 module trunk() {
   color("brown") cylinder(r = 3, h = 10);
   // ...
 }
 
 module base() {
   color("white") translate([-10, -10, 0]) cube([20, 20, 5]);
   // ...
 }
 
 if (PARTNO == 1) tree();
 if (PARTNO == 2) trunk();
 if (PARTNO == 3) base();
 
 // optionally use 0 for whole object
 if (PARTNO == 0) {
   base();
   translate([0, 0, 5]) trunk();
   translate([0, 0, 15]) tree();
 }

在互動式工作時,可以在檔案頂部的 PARTNO 變數中設定要從 GUI 中顯示/匯出的部件的編號。

可以透過在 MacOS 或 Linux 上編寫 shell 指令碼,或在 Windows 上編寫批處理檔案,來自動執行匯出所有部件的過程。shell 指令碼看起來像這樣

 # export parts as STL
 openscad -DPARTNO=1 -o tree.stl model.scad
 openscad -DPARTNO=2 -o trunk.stl model.scad
 openscad -DPARTNO=3 -o base.stl model.scad
 
 # export image of all the parts combined
 openscad -DPARTNO=0 -o model.png model.scad

從命令列執行此指令碼一次,會將所有部件匯出到單獨的檔案中。

如何匯出比當前視窗解析度更高的螢幕截圖

[編輯 | 編輯原始碼]

現在,無法從 GUI 中進行操作,因為影像被限制在實際顯示上下文中。使用 檔案->匯出->匯出為影像 選單始終以視口解析度匯出。

但是,可以使用 --imgsize 引數透過命令列生成更高解析度的影像。這使用單獨的繪圖上下文(大小受記憶體和圖形驅動程式限制)來生成影像。例如,在 Linux 上,英特爾 UHD Graphics 620 (Kabylake GT2) 的 Mesa 驅動程式似乎在影像解析度約為 16000×16000 時達到最大值。

 $ openscad --imgsize 16000,16000 -o CSG.png CSG.scad
 ECHO: version = [2019, 1, 0]
 Compiling design (CSG Products normalization)...
 Normalized CSG tree has 6 elements
 $ file CSG.png 
 CSG.png: PNG image data, 16000 x 16000, 8-bit/color RGB, non-interlaced

為什麼我在編寫 a = a + 1 時出現錯誤?

[編輯 | 編輯原始碼]

http://forum.openscad.org/A-A-1-tp11385p11411.html

首先,當我們開始更好地利用這些機會時,問題 **為什麼** 我們有這些“限制”變得更加清晰。

  • 我們需要一個“reduce”函式來幫助根據輸入列表收集資訊。遞迴很好,但人們往往難以理解它,我們可以提供一些幫助。
  • 我們應該禁止任何重新賦值的嘗試,以便更清楚地瞭解發生了什麼。我們部分允許它的唯一真正原因是為了允許命令列變數覆蓋。

幫助思考

  • 想象 OpenCAD 中的每個表示式都是並行執行的。任何現有表示式的依賴性必須透過層次結構分組來明確表示。這應該消除為收集資訊而進行迭代的想法。
  • 就函式而言:想象一個函式表示式是你在電子表格單元格中鍵入的內容。並非完全可對映,但這可能有助於框架它。
  • 電子表格類比也適用於迭代。電子表格中的單元格無法自行遞增;嘗試這樣做會導致電子表格中出現迴圈引用錯誤。

現在,我們可以新增各種糖來幫助人們應用他們現有的程式設計問題解決技能。問題更多的是它是否真的對我們有幫助,以及誰將帶頭設計這種語言擴充套件,因為我們目前對開發團隊沒有真正認同這些想法。

如果你將 OpenSCAD 語言視為類似於 HTML,但用於 3D 建模,那麼你仍然需要各種程式用這種語言生成程式碼(類似於現有的 HTML 生成器)。存在許多工具可以幫助從現有程式語言(python、ruby、C++、haskell、clojure 等)生成 OpenSCAD 程式碼,並且也有一些工具提供了用於類似目的的 Javascript 介面(OpenJSCAD、CoffeeSCAD)。在我們有充分的理由在 OpenSCAD 本身中這樣做,並且有一個很好的語言支援候選者之前,最好將這些事情分開。

另請參閱以下內容以獲取幫助:列表推導技巧與竅門遞迴函式

使用者介面

[編輯 | 編輯原始碼]

OpenSCAD 未遵循我的 GTK 桌面主題

[編輯 | 編輯原始碼]

您可能需要在基於 Debian 的系統上安裝包“qt5-style-plugins”,在基於 Fedora 的系統上安裝包“qt5-qtstyleplugins”,然後在呼叫 openscad 時設定環境變數 QT_QPA_PLATFORMTHEME=gtk2 openscad

要使設定永久生效,請將 export QT_QPA_PLATFORMTHEME=gtk2 新增到您的使用者的 ~/.profile

OpenSCAD GUI 在 Gnome 上的 4K / HIDPI 顯示器上未縮放

[編輯 | 編輯原始碼]

OpenSCAD 使用的 GUI 框架 Qt 似乎需要額外的提示才能在 Gnome/X11 上的 4K / HIDPI 顯示器上自動正確縮放(例如,在 Ubuntu 22.10 上報告,其中分數縮放設定為 125%)。

  • openscad.desktop/usr/share/applications/ 複製到 ~/.local/share/applications
  • Exec=openscad 更改為 Exec=env QT_AUTO_SCREEN_SCALE_FACTOR=1 openscad

我在 Ubuntu 中執行 OpenSCAD 時沒有選單欄,如何找回它?

[編輯 | 編輯原始碼]

這似乎是由 Ubuntu 干預 Qt 將選單欄移動到其他地方(例如,螢幕頂部)導致的。

這個問題也會影響其他應用程式,請參閱 https://bugs.launchpad.net/ubuntu/+source/appmenu-qt5/+bug/1307619

有兩件事可能有所幫助

  • QT_QPA_PLATFORMTHEME 環境變數設定為一個空字串(預設值為“appmenu-qt5”),或者簡單地使用 QT_QPA_PLATFORMTHEME= openscad 執行 OpenSCAD
  • 刪除 appmenu-qt5 包以全域性停用所有應用程式的選單欄更改

為什麼錯誤行號不正確?

[編輯 | 編輯原始碼]

這是當前解析器中的一個限制/錯誤,它基本上將 include<> 視為內容的複製和貼上。在某些情況下,可以透過將 include<> 語句放在檔案末尾來解決此問題。

在依賴庫時,建議使用 use<>,它沒有此問題,還會自動禁止該檔案中的任何頂級幾何圖形(可能是該庫的演示)。

我不喜歡這個編輯器,我可以使用我最喜歡的編輯器嗎?

[編輯 | 編輯原始碼]

是的,OpenSCAD 支援一種特殊模式,如果檔案在外部修改,它將重新載入這些檔案。要啟用此模式,請選中“設計”->“自動重新載入和預覽”選項,然後只需關閉編輯器視窗(或使用“檢視”->“隱藏編輯器”)。

另請參閱使用者手冊中的部分:使用外部編輯器與 OpenSCAD

例如,以下指令碼將 vim 作為編輯器執行,並將 OpenSCAD 作為模型檢視器角色執行。

它支援 3 種模式

  • 不帶引數執行,它將開啟一個臨時檔案以進行快速測試,該檔案會被刪除。
  • 使用不存在的檔名稱執行,它將使用預設許可證頭啟動該檔案。
  • 使用現有檔案的名稱執行,它只會開啟它。
#!/bin/bash
  
FILE="$1"
AUTHOR="Your Name Here"
YEAR="$(date "+%Y")"
LICENSE="// Created in $YEAR by $AUTHOR.\n// This work is released with CC0 into the public domain.\n// https://creativecommons.org/publicdomain/zero/1.0/"

# increase stack size to allow deeper recursion
ulimit -s 65536

if [ "$FILE" == "" ]
then
  TEMPF=`mktemp --suffix=.scad`
  openscad "$TEMPF" >/dev/null 2>/dev/null &
  vim "$TEMPF"
  rm -f "$TEMPF"
  exit
fi

if [ ! -e "$FILE" ]
then
  echo -e "$LICENSE" >> "$FILE"
fi

openscad "$FILE" >/dev/null 2>/dev/null &
vim "$FILE"

錯誤/問題

[編輯 | 編輯原始碼]

為什麼我收到“沒有要渲染的頂級幾何圖形”?

[編輯 | 編輯原始碼]

這可能有多種原因,一些常見的原因包括

缺少/註釋掉的模組呼叫
module model() {
  cube(20);
}
%model();

使用 % 修飾符不僅會使部件透明,還會導致部件在最終渲染中被排除!

差集/交集與錯誤的平移物件

解決此類問題的最簡單方法是使用 # 修飾符突出顯示物件,看看物件是否放置在它們應該在的位置。

匯入損壞的 STL 檔案

請參閱 為什麼我的匯入的 STL 檔案在 F5 中顯示,但在 F6 中不顯示?

OpenSCAD 崩潰/被殺死了,我未儲存的更改丟失了嗎?

[編輯 | 編輯原始碼]

在開始預覽或渲染過程之前,OpenSCAD 編輯器會寫入一個備份檔案,以防存在未儲存的更改。

此檔案儲存在使用者的文件資料夾中的單獨目錄中(例如,在 Linux 上,通常是 $HOME/.local/share/OpenSCAD/backups)。可以在 幫助->庫資訊 對話方塊中檢視實際路徑,該路徑列為“備份路徑”。

OpenSCAD 在 Windows 上單擊“新建”或載入檔案時崩潰

[編輯 | 編輯原始碼]

OpenSCAD 在一些安裝了英特爾顯示卡驅動程式的機器上崩潰,有關更多詳細資訊,請參閱 https://github.com/openscad/openscad/issues/2442

OpenSCAD 在 Windows 上無法執行,並引用 EVR.dll、MF.dll 或 MFPlat.dll

[編輯 | 編輯原始碼]

這是 Windows N(歐洲)和 KN(韓國)版本特有的問題,由於 2004 年歐洲委員會針對反競爭行為的裁決,這些版本刪除了 Windows Media Framework。

OpenSCAD 從 2019.05 版本開始依賴一些功能,因此在這些系統上無法執行。

可以透過安裝 Microsoft 在 KB3145500 中提供的列表中的正確“適用於 N 版本的媒體功能包”來新增缺少的 Windows Media Framework。對於 Windows 10 N 版本,有一個專門的下載頁面,包含 Windows 版本選擇器:https://www.microsoft.com/en-us/software-download/mediafeaturepack

從 Windows 10 1909 開始,您無法直接從 Microsoft 網站下載媒體功能 - 您必須使用 Windows 設定 > 應用 > 應用和功能 > 可選功能 > 新增功能並在可用的可選功能列表中找到媒體功能包。之後重啟,它應該可以工作。

報告錯誤,請求功能

[編輯 | 編輯原始碼]

如何報告錯誤?

[編輯 | 編輯原始碼]

OpenSCAD 中的錯誤最好在 github 的問題跟蹤系統中報告,地址為 https://github.com/openscad/openscad/issues。如果您不確定是否是錯誤,在 郵件列表/論壇 上詢問可以幫助澄清問題。

如果您發現該錯誤已在以前報告過,請嘗試在現有問題中搜索。如果您發現類似的問題或不確定,請建立新的問題,但要提及可能相關的現有問題。

錯誤報告應儘可能多地提供資訊以幫助重現錯誤,包括但不限於

  • OpenSCAD 版本
  • 作業系統名稱和版本
  • 產生問題的場景描述
  • 在圖形問題的情況下,OpenGL 驅動程式資訊
  • 如果可能,一個精簡的指令碼來重現問題

大多數技術版本資訊可以在選單 “幫助 -> 庫資訊” 中找到,或者透過命令列 openscad --info 獲取。

如何請求新功能?

[編輯 | 編輯原始碼]

新的功能或對現有功能的更改/擴充套件可以在 github 的問題跟蹤系統中請求,地址為 https://github.com/openscad/openscad/issues

請努力盡可能詳細地解釋新功能/更改。包括一些關於您為什麼認為此功能對您和其他使用者有用的背景資訊,這將非常有幫助,並增加其被實現的可能性。

[編輯 | 編輯原始碼]

Windows 版本目前由 OpenSCAD 團隊維護,因此請使用 github 問題跟蹤器 報告錯誤。

Mac OS X 版本目前由 OpenSCAD 團隊維護,因此請使用 github 問題跟蹤器 報告錯誤。

包含在/由各種 Linux 發行版分發的 OpenSCAD 版本通常由與發行版合作的人員/團隊維護。

可以在各自的錯誤跟蹤系統中報告特定錯誤,例如:

託管在 openSUSE 構建服務 上的 每日構建 由 OpenSCAD 團隊維護,因此請使用 github 問題跟蹤器 報告這些軟體包的問題。

華夏公益教科書