前置条件
- macOS Sequoia (15.2)
- MacBook Pro 2023-Apple M2 Pro (4能效核、8性能核、32GB内存、2TB磁盘)
- OpenSCAD 2024.12.13 (或更高版本)
- FreeCAD 1.0.0 (或更高版本)
- KiCad 8.0.8 (或更高版本)
由于 KiCad 缺少国产零件的封装,所以部分封装库我们需要自己创建。
创建中周封装库
以 ZX920 为例:
1. 打开封装编辑器:
2. 新建封装,如下图:
3. 下一步选择工程级封装库,并且命名为 ZX920 ,如下图:
4. 下一步确认封装库存储位置,如下图:
5. 右击刚刚创建的 ZX920 封装库,在弹出的菜单中选择 “新建封装”,如下图:
6. 封装类型选择 “通孔”,如下图:
7. ZX920 的尺寸与 TTF-2-1 的外观尺寸相同,如下图:
8. 添加焊盘,添加方式如下图:
最终的焊盘如下图:
选中需要编辑的焊盘,双击或者按下键盘上的字符 “E”,可以打开焊盘属性窗口,在“通用”一栏输入焊盘相应的信息。
根据焊盘编号,各个焊盘参数如下图:
焊盘编号 1 参数,如下图:
焊盘编号 2 参数,如下图:
焊盘编号 3 参数,如下图:
焊盘编号 4 参数,如下图:
焊盘编号 6 参数,如下图:
焊盘编号 5 参数,如下图:
焊盘编号 7 参数,如下图:
创建中周3D装库
使用 OpenSCAD 2024.12.13 创建 3D 封装,如下图:
完整的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 |
// 中频变压器(中周)的 3D 模型 // 物体渲染精细度,如果设备性能好,就加大这个数字,设备性能不好就降低这个数字 // 数字越高,渲染细节越清晰,速度越慢 // $fn = 100; // 圆角矩形模块代码 module roundedcube(xx, yy, height, radius) { // 垂直方向的弧度是水平弧度的 1/2 v_radius = radius / 2; h_radius = radius; difference() { cube([xx, yy, height]); // 垂直侧边 difference() { translate([-.5, -.5, -.2]) cube([v_radius + .5, v_radius + .5, height + .5]); translate([v_radius, v_radius, height / 2]) cylinder(height, v_radius, v_radius, true); } translate([xx, 0, 0]) rotate(90) difference() { translate([-.5, -.5, -.2]) cube([v_radius + .5, v_radius + .5, height + .5]); translate([v_radius, v_radius, height / 2]) cylinder(height, v_radius, v_radius, true); } translate([xx, yy, 0]) rotate(180) difference() { translate([-.5, -.5, -.2]) cube([v_radius + .5, v_radius + .5, height + .5]); translate([v_radius, v_radius, height / 2]) cylinder(height, v_radius, v_radius, true); } translate([0, yy, 0]) rotate(270) difference() { translate([-.5, -.5, -.2]) cube([v_radius + .5, v_radius + .5, height + .5]); translate([v_radius, v_radius, height / 2]) cylinder(height, v_radius, v_radius, true); } // 上部横边 translate([0, yy, height]) rotate([0, 90, 0]) rotate(270) difference() { translate([-.5, -.5, -.2]) cube([h_radius + .5, h_radius + .5, xx + .5]); translate([h_radius, h_radius, xx / 2]) cylinder(xx, h_radius, h_radius, true); } translate([0, 0, height]) rotate([0, 90, 90]) rotate(270) difference() { translate([-.5, -.5, -.2]) cube([h_radius + .5, h_radius + .5, yy + .5]); translate([h_radius, h_radius, yy / 2]) cylinder(yy, h_radius, h_radius, true); } translate([0, 0, height]) rotate([90, 0, 90]) rotate(270) difference() { translate([-.5, -.5, -.2]) cube([h_radius + .5, h_radius + .5, xx + .5]); translate([h_radius, h_radius, xx / 2]) cylinder(xx, h_radius, h_radius, true); } translate([xx, 0, height]) rotate([0, 90, 90]) difference() { translate([-.5, -.5, -.2]) cube([h_radius + .5, h_radius + .5, yy + .5]); translate([h_radius, h_radius, yy / 2]) cylinder(yy, h_radius, h_radius, true); } } } // 外壳长度(毫米) shell_length = 10.5; // 外壳宽度(毫米) shell_width = 10.5; // 外壳高度(毫米) shell_height = 13.5; // 圆角半径(毫米) shell_radius = 0.8; // 外壳厚度(毫米) shell_thickness = 0.4; // 调整孔洞半径(毫米) hole_radius = 4.1; // 调整孔洞深度(毫米) hole_height = 2; // 底部中周专用电容凹槽长度(毫米) trans_cap_length = 8; // 底部中周专用电容凹槽半径(毫米) trans_cap_radius = 1.5; // 底部塑料凹陷(毫米) bottom_padding = 0.4; // 侧边雌帽卡位长度(毫米) side_width = 3; // 侧边雌帽卡位高度(毫米) side_height = 2; // 内部磁体外壳颜色 inner_color = "#404040"; difference() { union () { // 立方体 移动到原点 // 白烟色外壳 color("WhiteSmoke") translate([ - shell_length / 2, - shell_width / 2, 0.01]) roundedcube(shell_length, shell_width, shell_height, shell_radius); inner_length = shell_length - shell_thickness * 2; inner_width = shell_width - shell_thickness * 2; // 内部磁体模块 color(inner_color) translate([ - inner_length / 2, - inner_width / 2, 0]) cube([inner_length, inner_width, shell_height - shell_thickness * 2]); } // 中间的调整孔 color("WhiteSmoke") translate([0, 0, shell_height - hole_height]) cylinder(h = hole_height + 0.5, r = hole_radius, center = false); // 底部塑料凹陷 inner_cube_length = shell_length - shell_thickness * 2 - bottom_padding; inner_cube_width = shell_width - shell_thickness * 2 - bottom_padding; translate([ - inner_cube_length / 2, - inner_cube_width / 2, 0]) color(inner_color) cube([inner_cube_length, inner_cube_width, bottom_padding]); // 底部中周专用电容凹槽 rotate([0, 90, 0]) color(inner_color) cylinder(h = trans_cap_length, r = trans_cap_radius, center = true); // 侧边雌帽卡位凹陷 color("WhiteSmoke") translate([- shell_width / 2 + shell_thickness / 2, - side_width / 2, shell_height - side_width - side_height]) rotate([0, 0, 90]) cube([side_width, 0.3, side_height]); color("WhiteSmoke") translate([ shell_width / 2 + shell_thickness / 2, - side_width / 2, shell_height - side_width - side_height]) rotate([0, 0, 90]) cube([side_width, 0.3, side_height]); } // 外壳文字(毫米) shell_font_size = 1; // 外壳文字偏移(毫米) shell_font_off = 6; // 外壳文字字体(加粗) shell_font = "Times New Roman:style=Bold"; shell_font_text = "ZX"; shell_font_text1 = "920"; color("black") translate([0, shell_height / 2 - shell_font_size - 0.99, shell_font_off]) rotate([90, 0, 0]) mirror([1,0,0]) linear_extrude(1, center = true, convexity = 3) { text(shell_font_text, size = shell_font_size, font = shell_font, halign = "center", valign = "center"); }; color("black") translate([0, shell_height / 2 - shell_font_size - 0.99, shell_font_off - shell_font_size * 2]) rotate([90, 0, 0]) mirror([1,0,0]) linear_extrude(1, center = true, convexity = 3) { text(shell_font_text1, size = shell_font_size, font = shell_font, halign = "center", valign = "center"); }; // 一字螺丝深度(毫米) screw_deep = 1.5; // 一字螺丝宽度(毫米) screw_width = 0.8; // 一字螺丝长度(毫米) screw_length = shell_length - shell_thickness * 2; // 一字螺丝半径(毫米) screw_radius = 4; // 中间的调整一字螺丝 color("Red") difference() { // 中间的螺丝表面颜色 translate([0, 0, shell_height - hole_height + 0.1]) cylinder(1, 1, screw_radius, false); // 中间的一字调整螺丝 translate([- hole_radius, - screw_width / 2, shell_height - hole_height]) cube([screw_length, screw_width, screw_deep], false); } // 底部外壳固定脚宽度(毫米) foot_width = 1.6; // 底部外壳固定脚高度(毫米) foot_height = 3; color("WhiteSmoke") translate([shell_width / 2 - shell_thickness, - foot_width / 2, - foot_height + bottom_padding]) cube([shell_thickness, foot_width, foot_height], false); // 固定外壳的底部圆角 color("WhiteSmoke") translate([shell_width / 2 - shell_thickness / 2, 0, - foot_height + bottom_padding]) rotate([0, 90, 0]) cylinder(shell_thickness, foot_width / 2, foot_width / 2, true); color("WhiteSmoke") translate([- shell_width / 2, - foot_width / 2, - foot_height + bottom_padding]) cube([shell_thickness, foot_width, foot_height], false); // 固定外壳的底部圆角 color("WhiteSmoke") translate([- shell_width / 2 + shell_thickness / 2, 0, - foot_height + bottom_padding]) rotate([0, 90, 0]) cylinder(shell_thickness, foot_width / 2, foot_width / 2, true); // 底部引脚高度(毫米) pin_height = 3.5; // 直径公差主要是直径除以2后会出现一个误差,需要一个补偿(毫米) pin_tol = 0.15; // 底部引脚半径(毫米)直径 0.7(毫米) pin_radius = 0.35; // 距离中心阵脚的距离(毫米) center_pin_margin = 3.5; // 引脚距离边缘距离(毫米) pin_side_margin = 1.4; // 黄铜色 有字面 color("#B5A642") translate([- pin_radius / 2 + pin_tol, shell_width / 2 - pin_radius - pin_side_margin, - pin_height + bottom_padding]) cylinder(pin_height, pin_radius, pin_radius, false); color("#B5A642") translate([- pin_radius / 2 + center_pin_margin + pin_tol, shell_width / 2 - pin_radius - pin_side_margin, - pin_height + bottom_padding]) cylinder(pin_height, pin_radius, pin_radius, false); color("#B5A642") translate([- pin_radius / 2 - center_pin_margin + pin_tol, shell_width / 2 - pin_radius - pin_side_margin, - pin_height + bottom_padding]) cylinder(pin_height, pin_radius, pin_radius, false); // 无字面 color("#B5A642") translate([- pin_radius / 2 + center_pin_margin + pin_tol, - shell_width / 2 + pin_radius + pin_side_margin, - pin_height + bottom_padding]) cylinder(pin_height, pin_radius, pin_radius, false); color("#B5A642") translate([- pin_radius / 2 - center_pin_margin + pin_tol, - shell_width / 2 + pin_radius + pin_side_margin, - pin_height + bottom_padding]) cylinder(pin_height, pin_radius, pin_radius, false); |
由于当前的 OpenSCAD 版本不支持直接导出 KiCad 需要的 SolidWorks 文件格式(.step/.stp),我们需要借助 FreeCAD 实现这个功能。
导出中周3D封装库
1. 打开 FreeCAD 的 "首选项",如下图:
2. 在 "工作台" 中找到 "OpenSCAD",如下图:
勾选之后,会自动查找已经安装的 "OpenSCAD" 路径,完成配置。如果提示配置失败,需要在最下面的 "OpenSCAD" 下手工配置路径。
3. 确保 "面板" 中可以显示 "结构树浏览器"(Tree View),后续我们需要在 "结构树浏览器" (Tree View)中进行后续操作。如下图:
4. 点击打开文件,打开我们的 "OpenSCAD" 项目文件。如下图:
项目正确打开后的样式,如下图:
5. 在项目 "结构树浏览器" 中选择按住 Shift 按键,选择全部的子项,如下图:
6. 在项目 "文件" 菜单中选择 "导出",如下图:
7. 在项目 "导出文件" 中选择 "STEP with colors(*.step *.stp)",如下图:
点击 "Save" 后下一步选择,务必一定要勾选 "导出不可见对象",否则导出的模型会由于缺少中心坐标,导致模型在线路板上的坐标定位错误,如下图:
注意: 如果在不关闭当前 FreeCAD 项目的情况下,直接打开刚刚导出的 STEP 文件可能会出现如下图的模型布局错误:
原因是导入的模型中的零件编号可能与现在零件的编号冲突,导致程序可能会找两个编号相同但是布局不同的零件进行渲染,造成渲染异常。
解决方法就是关闭 FreeCAD ,然后再打开 STEP 文件即可。
另外需要注意,如果在 FreeCAD 发生渲染错误的情况下,不关闭刚刚的 FreeCAD 然后使用 KiCad 加载同一个 STEP 文件,也可能会出现相同的渲染错误。原因是两者使用了同一个后台渲染进程,发生了干扰导致的。解决方法是不要让 FreeCAD 与 KiCad 同时运行即可。
如果 Windows 系统下导入文件的时候出现如下报错:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
21:39:14 opening C:\Users\ADMINI~1\AppData\Local\Temp\fc-13612-555366-000002.dxf... 21:39:14 There has been an error: 21:39:14 First section is not HEADER 21:39:14 pyException: Traceback (most recent call last): File "<string>", line 2, in <module> File "C:\Program Files\FreeCAD 1.0\bin\Lib\site-packages\freecad\module_io.py", line 16, in OpenInsertObject getattr(importerModule, importMethod)(objectPath, *importArgs, **importKwargs) File "C:\Program Files\FreeCAD 1.0\Mod\OpenSCAD\importCSG.py", line 120, in open processcsg(tmpfile) File "C:\Program Files\FreeCAD 1.0\Mod\OpenSCAD\importCSG.py", line 178, in processcsg result = parser.parse(f.read()) ^^^^^^^^^^^^^^^^^^^^^^ File "C:\Program Files\FreeCAD 1.0\bin\Lib\site-packages\ply\yacc.py", line 333, in parse return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Program Files\FreeCAD 1.0\bin\Lib\site-packages\ply\yacc.py", line 1120, in parseopt_notrack p.callable(pslice) File "C:\Program Files\FreeCAD 1.0\Mod\OpenSCAD\importCSG.py", line 1313, in p_text_action p[0] = [processTextCmd(t)] ^^^^^^^^^^^^^^^^^ File "C:\Program Files\FreeCAD 1.0\Mod\OpenSCAD\importCSG.py", line 954, in processTextCmd face = importDXFface(tmpfilename,None,None) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Program Files\FreeCAD 1.0\Mod\OpenSCAD\OpenSCAD2Dgeom.py", line 486, in importDXFface layers = importDXF.processdxf(doc,filename,False,False) or importDXF.layers ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Program Files\FreeCAD 1.0\Mod\Draft\importDXF.py", line 2227, in processdxf drawing = dxfReader.readDXF(filename) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\AppData\Roaming\FreeCAD\Macro\dxfReader.py", line 403, in readDXF (infile, drawing) = sm.run((infile, None)) ^^^^^^^^^^^^^^^^^ <class 'TypeError'>: cannot unpack non-iterable bool object |
一般是由于安装的是 OpenSCAD 2021.01 版本导致的,要求安装的版本必须是 OpenSCAD 2024.12.13 以上的版本才可以。
如果是 ubuntu 24.04 系统,通过 snap 安装的 FreeCAD 1.0.0 ,则打开文件的时候,可能出现如下报错:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
22:17:57 It looks like you may be using a Snap version of OpenSCAD. If OpenSCAD execution fails to load the temporary file, use FreeCAD's OpenSCAD Workbench Preferences to change the transfer mechanism. 22:18:11 "Empty widget item in QHBoxLayout 'horizontalLayout_21'." 22:18:29 WARNING: Token 'DOT' defined, but not used 22:18:29 WARNING: Token 'WORD' defined, but not used 22:18:29 WARNING: There are 2 unused tokens 22:18:29 obj [<Part::PartFeature>] has no Name & Shape 22:18:29 obj [<Part::PartFeature>] has no Name & Shape 22:18:29 textmsg : text ( text="ZX", size = 1, spacing = "1", font = "Times New Roman:style=Bold", direction = "ltr", language = "en", script = "Latn", halign = "center", valign = "center", $fn = 0, $fa = 12, $fs = 2); 22:18:29 Geometries in cache: 1 Geometry cache size in bytes: 880 CGAL Polyhedrons in cache: 0 CGAL cache size in bytes: 0 Total rendering time: 0:00:00.008 Top level object is a 2D object: Contours: 2 22:18:29 "Empty widget item in QHBoxLayout 'horizontalLayout_21'." 22:18:32 opening /tmp/fc-09662-790942-000002.dxf... 22:18:32 There has been an error: 22:18:32 First section is not HEADER 22:18:32 pyException: Traceback (most recent call last): File "<string>", line 2, in <module> File "/snap/freecad/1202/usr/local/lib/python3.10/dist-packages/freecad/module_io.py", line 16, in OpenInsertObject getattr(importerModule, importMethod)(objectPath, *importArgs, **importKwargs) File "/snap/freecad/1202/usr/Mod/OpenSCAD/importCSG.py", line 120, in open processcsg(tmpfile) File "/snap/freecad/1202/usr/Mod/OpenSCAD/importCSG.py", line 178, in processcsg result = parser.parse(f.read()) File "/snap/freecad/1202/usr/lib/python3/dist-packages/ply/yacc.py", line 333, in parse return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) File "/snap/freecad/1202/usr/lib/python3/dist-packages/ply/yacc.py", line 1120, in parseopt_notrack p.callable(pslice) File "/snap/freecad/1202/usr/Mod/OpenSCAD/importCSG.py", line 1313, in p_text_action p[0] = [processTextCmd(t)] File "/snap/freecad/1202/usr/Mod/OpenSCAD/importCSG.py", line 954, in processTextCmd face = importDXFface(tmpfilename,None,None) File "/snap/freecad/1202/usr/Mod/OpenSCAD/OpenSCAD2Dgeom.py", line 486, in importDXFface layers = importDXF.processdxf(doc,filename,False,False) or importDXF.layers File "/snap/freecad/1202/usr/Mod/Draft/importDXF.py", line 2227, in processdxf drawing = dxfReader.readDXF(filename) File "/home/xxxx/snap/freecad/common/dxfReader.py", line 403, in readDXF (infile, drawing) = sm.run((infile, None)) <class 'TypeError'>: cannot unpack non-iterable bool object |
这个报错的原因是 snap 安装的应用由于沙箱的原因,导致共享文件存在问题。除了不使用 snap 安装应用,改为全部从官网下载 AppImage 格式的应用之外,暂时没有好的解决方法。
在使用 NopSCADlib 绘制自定义电阻的时候:
1 2 3 4 |
// 直插电阻 include <NopSCADlib/lib.scad> ax_res(res1_2, 20000, 1, inch(0.2)); |
可能会发生如下报错:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
23:07:20 opening /var/folders/z8/_cvsdvbd4x51vm4szw5xkw0w0000gn/T/fc-33837-764042-000048.dxf... 23:07:20 drawing 1 polylines... 23:07:20 skipping texts... 23:07:20 skipping dimensions... 23:07:20 skipping points... 23:07:20 skipping leaders... 23:07:20 skipping hatches... 23:07:20 skipping *blocks... 23:07:20 done processing 23:07:20 successfully imported /var/folders/z8/_cvsdvbd4x51vm4szw5xkw0w0000gn/T/fc-33837-764042-000048.dxf 23:07:20 <Exception> makeOffset2D: offset result has no wires. 23:07:20 Offset2D001: makeOffset2D: offset result has no wires. 23:07:20 <Exception> makeOffset2D: offset result has no wires. 23:07:20 Recompute failed : Offset2D001 23:07:20 pyException: Traceback (most recent call last): File "<string>", line 2, in <module> File "/Applications/FreeCAD.app/Contents/Resources/lib/python3.11/site-packages/freecad/module_io.py", line 16, in OpenInsertObject getattr(importerModule, importMethod)(objectPath, *importArgs, **importKwargs) File "/Applications/FreeCAD.app/Contents/Resources/Mod/OpenSCAD/importCSG.py", line 120, in open processcsg(tmpfile) File "/Applications/FreeCAD.app/Contents/Resources/Mod/OpenSCAD/importCSG.py", line 178, in processcsg result = parser.parse(f.read()) ^^^^^^^^^^^^^^^^^^^^^^ File "/Applications/FreeCAD.app/Contents/Resources/lib/python3.11/site-packages/ply/yacc.py", line 333, in parse return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Applications/FreeCAD.app/Contents/Resources/lib/python3.11/site-packages/ply/yacc.py", line 1120, in parseopt_notrack p.callable(pslice) File "/Applications/FreeCAD.app/Contents/Resources/Mod/OpenSCAD/importCSG.py", line 457, in p_offset_action if subobj.Shape.Volume == 0 : ^^^^^^^^^^^^^^^^^^^ <class 'RuntimeError'>: shape is invalid |
如下图:
这个问题的原因是因为 FreeCAD 对于 OpenSCAD 的 offset 命令支持上存在问题导致的。
目前尝试的比较好的解决方法如下:
- 通过 OpenSCAD 导出 OFF 格式的 3D 模型(目的是保留颜色信息);
- 通过 MeshLab 转换成 OBJ 格式的 3D 模型,同样是为了保留颜色信息;
- 通过 Wings 3D 转换 OBJ 格式的 3D 模型为 WRL 格式;
- 使用 KiCAD 加载 WRL 格式的模型。
关于此问题的完整分析过程,参考 解决OpenSCAD导出的WRL格式文件不正确的问题
配置中周3D封装库
关联我们刚刚导出的 3D封装,如下图:
在属性页面配置 3D封装,如下图:
创建中周符号(原理图)
1. 打开符号编辑器:
2. 新建符号库,如下图:
3. 下一步选择工程级封装库,并且命名为 ZX920 ,如下图:
4. 新建符号,如下图:
5. 从搜索自带的 “TRANSF4” 符号,然后鼠标全选后,右击后选择 “复制”,如下图:
6. 移除刚刚的过滤条件,双击左侧的 ZX920, 返回到我们刚刚创建的符号,然后鼠标右键 “粘贴”,如下图:
7. 简单调整后的效果,如下图:
8. 最终效果,如下图:
其他中周
参考链接
- Xicon 42IF101-RC
- Kicad-V7.0制作封装库(手动)
- Tutorial: 3D KiCAD Parts using OpenSCAD and Wings3D
- STEP与WRL 3D模型的区别
- OpenSCAD to 3D STEP and WRL tutorial
- Export VRML models for KiCad #1304
- Import OpenSCAD code
- 在KiCad里创建和调用模块的3D模型
- 共享TTF-1、-2 系列中周PCB封装库 顺路求TTF-3 中周尺寸
- Unable to open OpenSCAD files
- [Tip] Converting OpenSCAD files easily to STEP with FreeCAD
- [Problem] Fail to add a simple openscad cube with flatpak version #9423
- [Bug] [OpenSCAD] Launch of OpenSCAD broken in FreeCAD Linux ecosystem (AppImage, Snap, flatpak) #8239
- Difference applies color of removed object to interface #501