基本上我只用linux工作,之前在CAD/CAM方面也做过纯开源工具链的探索和尝试,但都失败了。只能继续用SolidWorks/SolidCAM,最近一个项目中越发的感觉到了这套组合的无力和烦琐。考虑到这块是我唯一一块还没有完成开源化的工具领域,还是下定决心再做一次更为彻底的尝试。如果成功那我就可以实现从机械到电子到软件三方面都达成100%使用开源工具链的成就了~
首先还是要说明下SolidWorks/SolidCAM有什么问题。SolidWorks这个东西总的来说还是蛮好的,入门简单上手方便。作为爱好者大部分设计需求也完全能满足。作为商业软件价格也还好,处于比较能负担的起的范畴。但这玩意有几个毛病让我非常的不满:
老是崩溃。大部分行业商业软件的软件质量通常都不太好,因为他们在软件方面并不专业。与开源相比,商业软件以盈利为目标,开发人员是work for pay,只能靠测试来掩盖问题,所以各种bug和崩溃是常有的事情;开源软件的驱动力是荣誉/兴趣,开发人员是work for honor/fun,通常也没有足够的测试资源,只能靠深厚的内力第一次就做到正确。所以虽然上下限波动巨大,但上限是可以很高的。一般来说相对于商业软件,我更信任开源项目的品质。就SolidWorks而言,丫的各种bug各种崩溃导致的工作丢失让我非常火大,非常影响做事的心情。
SolidWorks设计的零件,存在比较强的限制。Solidworks基本上是一个2D的世界,3D都只能从2D的模型中拉伸出来,然后在这个基础上做1-2次曲面操作赋予一定的曲面特征,来达到看起来像是具备曲面的效果。基本上Solidworks都是在立方体的框架上做微调,产生的曲面效果无法改变立方体框架的本质。这个问题在最近的一次项目中让我搞得比较的痛苦。但比这个再上一个台阶的软件就太贵了,比如CATIA,UG NX,ProE等都是几十万刀的级别,作为一个追求100%正版化的人,这些都不在考虑范围内。
Solidworks没有向后兼容性。这也是商业软件的通病,简单的说就是哪怕小版本号高了一点点,旧的版本往往也无法打开新版本设计的零件。这是商业软件常用的一种逼迫用户不断升级的套路。
大型装配卡顿、经常有冲突。装配零件规模达到百这个量级的时候,Solidworks会开始变得越来越不好用。卡顿报内存不够什么的也就算了(我的机器是64G内存,i7-10070K,RTX3090的显卡,不太可能是机器的问题)。有时候各种莫名其妙的装配冲突就很烦人。往往能折腾好久。
缺乏好的生态支持。比如Solidworks里你要画个齿轮,要么自己从折腾渐开线开始画,要么用toolbox里找已有的版本,要么用GearTrax像个外挂一样半自动生成。我觉得都十分的蠢...很难相信现在都2021年了,作为标榜“专业”的工具对很多常见生态要素的支持居然还是石器时代的样子。类似的场景还有很多,比如紧固件,比如传动设计等等。只能说Solidworks在孱弱的核心上叠了很多看似方便的功能,但又缺乏一个足够抽象足够优雅的宏观设计,所以官方提供的toolbox永远追不上你的需求。虽然我理解,商业软件一般讲究分工合作,你想要的基础库本来就是要外包给专业的公司来做的,但我相当不认可这种把份内事推出去做成一种产业的态度。
对于CAD就吐槽这么多吧,下面还要吐槽下CAM。SolidWorks后来的版本是整合了CAM的,叫Solidworks CAM。但丫整合的CAM工具太先进了,反而不适合我这种爱好者。简单的说SolidWorks CAM追求全自动化,所以你也需要一个全自动化的加工中心,以及配套的管理维护体系才能爽,否则用起来反而是各种别扭各种制肘。所以我还是用半自动化的SolidCAM,当然吐槽的也是这货:
老是崩溃。又一次证明了崩溃是商业软件的典型特征。而且SolidCAM的BUG比Solidworks更多,崩溃的更频繁。
自动化程度不够。我前面说了这是一个半自动化工具,但半自动化工具更大的意义是指流程上我要有足够方便的介入能力,不是说很多操作你就真的只能手动点选了。用SolidCAM我最烦的就是无穷无尽的选取线段轮廓。虽然它提供了一些手段来方便自动化选取线段,但大部分时间我还是觉得太tm蠢了。经常有用这玩意就是在浪费我的生命的感觉。
卡顿,慢。这往往也是软件实施水平低下的特征。很多事情明明应该是一瞬间完成的,丫总是能墨迹个半天。配上丫本来就繁琐的手动操作,用起来就非常的暴躁。
吐槽到此为止,下面谈谈我新的方案。首先是CAD方面,这方面总的来说开源实现都相当的不成熟。最成熟的是FreeCAD,但FreeCAD这玩意只能说在Part方面勉强做到了及格,但Assembly方面目前还处于不知道在干嘛的阶段。简单的说用FreeCAD,大概可以相对于Solidworks 60%的工作效率,做出一个复杂度差不多的零件。FreeCAD的上限也并没有突破Solidworks。而且这货的质量也不咋滴,也经常崩。只能说,就设计一个零件而言,FreeCAD处于勉强可用的状态。但光设计零件是不够的,还需要装配,FreeCAD的Assembly目前至少有4种完全不同的实现方案,各有各的“特色”,但唯一相同的是都不太可用...而FreeCAD已经是开源在这方面最能打的工具了。比它更能打的也不是没有,比如Blender具备极高的质量,极高的上限,但Blender并不是为CAD而生的,丫缺乏CAD里面必要的参数定义的能力。至于CAM就不提了,CAD都没搞好,CAM也没意义。这也是我之前的探索到此为止的原因。
所以这次我准备再尝试下之前看了一眼就放弃的方案:OpenSCAD。这个东西和SolidWorks/FreeCAD对比,原本是完全没有可比性的,因为丫不是一个交互式的工具,而是一种程序式的建模语言。也就是说丫的建模过程更像是编程,而不是设计,你需要用代码的形式描述你要创造的模型。它的界面,长这样...
不过真正开始搞起来,我感觉还好,甚至还挺香的。因为这货真干起来有这么几个优点:
反馈及时。这是一开始我最担心的问题。对于SolidWorks,你是所在即所得的创作。但写代码和代码产生的结果中间存在一个抽象思维的过程。我很担心在OpenSCAD里这会很不直观。但实际上OpenSCAD里代码一改预览区也会立即同步更新,并且有很多高亮手段提示你关注的那个零件。实际上效果和所见即所得区别并不大,无非是前者你用鼠标点来点去改参数,后者你在代码里面改参数而已,只是一种习惯上的变化。相对的,这种代码式的描述方法比Solidworks的这类基于按钮、窗口、参数栏等形式效率更高,也更灵活。
易于追踪。纯代码的东西有个很大的好处,那就是可以纳入一整套发展了很多年的代码管理系统进行管理。比如你一个零件需要进行一些调整,这个修改是谁、在哪里、改了多少,这些基础设施都是现成的。Solidworks里面则完全没有对应的解决方案。
易于复用。在Solidworks里零件可以有多种配置,可以定义各种参数,但从流程上来说这些都是后手。你一定是先把零件画出来,再慢慢修成想要的形状,最后再去定义关键约束,最后的最后才是给约束赋上参数名。很多情况下其实是走不到最后的,往往零件画好就结束了;而OpenSCAD里每个特征都是一个零件,通过各种组合删除来塑造你想要的最终零件,每个特征天然的要定义一堆参数,都要想好名字,毕竟是代码嘛。所以OpenSCAD可以说在流程上就强制性的让你一开始就做好了复用准备。所以OpenSCAD不仅仅复用简单,也有很多成熟的第三方库生态。像前面说的齿轮问题,在OpenSCAD里就一个use <gears.scad>然后就直接用的事情,想怎么定义就怎么定义,非常的舒爽。
绝对不存在装配冲突问题。这一点其实OpenSCAD的思路和Solidworks的Part/Assembly完全不同。Solidworks的基本思路是基于约束的,更贴近人的直观思考习惯,但带来的问题是约束很容易产生冲突,尤其是你想设计的零件还具备各种不同参数/配置的情况下。OpenSCAD则完全没有Part/Assembly的区别,不存在约束这种东西。OpenSCAD是基于参数去描述Part,通过合并/删除等加减操作,切削出你想要的形状。所以它可以用来产生Part,也可以用来Assembly。反正一切都是代码描述,它只是产生这个描述对应的形状而已。
不过OpenSCAD还是有相当多的不足和缺陷的,主要是这几方面:
慢。OpenSCAD对有很多零件的大型装配,那是相当慢的。如果说Solidworks在这种情况下是卡顿的话,OpenSCAD就是要跑几分钟才能渲染出结果(注意,只是preview)。这对于大型构造会有一定的问题,但我觉得这个问题可以通过部分渲染缓解。毕竟我们做事都是讲究分治的,大部分情况都只看局部,需要全局视角的机会并不多。
BUG。OpenSCAD总体来说可以认为没啥BUG,整个系统很稳定,从来没遇到过崩溃。但preview在某些操作组合下会产生渲染bug,只有render模式才能消除。虽然这是一个无伤大雅的小问题,但还是比较不爽的。
缺乏交互式的能力。OpenSCAD是完全无交互设计,它就是把你的代码转换成对应的结构,你可以任意放大旋转拖拉观察,但比如有时候想测量下两个面的距离就抓瞎了...其实这是一个非常典型并且也很容易实现的功能,但OpenSCAD的作者貌似就很不想做...
OpenSCAD的语言设计问题。OpenSCAD的语言设计感觉思路上还是有点保守。里面只有两个东西,module和function。module一定会代表一个实体,function一定只返回数据。所以OpenSCAD里一堆module嵌套构成一颗树,参数一定是从顶部往底部单向传输。这样的设计思路其实是很好的,是很高设计水平的体现,但就是不容易玩出花样。比如最常见的装配就是几个零件的面重合堆叠在一起,这个就只能在顶层就把零件的绝对位置算好移动过去,感觉就很蠢。零件应该具备一定的“智能性”,比如根据相邻零件来自动计算相对高度也是极好的,但这些在现有框架下基本是无法实现的。
总的来说我觉得OpenSCAD还有一些打磨的空间,我看到不少基于OpenSCAD的其他语言封装,来提供更好的可读性,更多的功能,试图解决我前面说的一些缺憾。但这样的yet another openscad CAD解决之后,下面是CAM的问题。这次我是用FreeCAD打开OpenSCAD的模型,然后用Path模块做CAM。这条路是可行的,而且有些地方还有惊喜,但目前还是问题比较多,先讲讲问题:
FreeCAD和OpenSCAD的交互问题。FreeCAD可以直接打开OpenSCAD,但不知道为啥实现却不完整,缺了projection实现。所以一旦用了这个,模型就无法正常导入。只能让OpenSCAD产生stl文件再在FreeCAD导入。然而用stl格式做中转会很坑,这个东西会丢失曲面的描述信息。比如你如果想钻孔,Path就无法识别孔这个结构了。
OpenSCAD的更新问题。分解到2个工具之后,假如CNC之后发现问题要调整模型,如果用stl中转,OpenSCAD里面的调整就无法传递到FreeCAD里面,只能在FreeCAD里重做一遍刀路。这一条就基本否决这条路了。我这次测试用的模型比较简单,每次重做可以忍,但真正的零件加工刀路是很复杂的,每次都重做那就要了命了...
FreeCAD还是容易蹦,并且Path模块也有BUG,经常要重开重做,总之目前的软件质量远没有达到可用的要求,只能说勉强能凑合用。
相对的,FreeCAD的Path模块还是给我不少惊喜的:
首先是轮廓的选择,就比SolidCAM好的多,一个面选了之后能自动把里面的镂空结构列出来让你决定要绕开还是包含,这个特征实在是太舒服了。SolidCAM里我最恨的就是手动描一遍这些镂空结构。
Path模块的功能也挺完整的,基本的face、profile、pocket、drill都有,并且参数页配置也比较详细。但产生的刀路还是有待商榷...缺省的zigzag刀路并不填满轮廓,会留下锯齿的边缘。offset刀路倒是可以用,但刀路还需要再优化一下,有些浪费时间。此外3D pocket,雕刻等等也都有支持,不过我就没实际使用确认了。Path模块的刀具编辑也做的不错,仿真也挺好的简洁高效。
当然还有很多其他CAM的选择,但大体来说我觉得FreeCAD的Path模块可能依然是目前做的最完善的开源CAM。基本上,还是能凑合的,尤其是简单的结构完全可以忍。但我后来想到其实CAM是可以在OpenSCAD里面用CAD形式实现的。理论上我完全可以把CAM的过程用代码描述出来,然后把OpenSCAD代码直接转换成Gcode,丢给CNC即可。而且产生的结果刚好也等于CAM的仿真结果。后来一搜果然也有人跟我有一样的想法,并且实施过了,看这个例子:
不过还是那个问题,OpenSCAD并不是按照这个用途设计的,这么干虽然不是不可以,但还是太憋屈了。所以综合考虑,基本上还是以OpenSCAD为主,基于它进行各种改良:
用rust重写OpenSCAD,用rust的过程宏对OpenSCAD实现语法层面的兼容。这样应该能大幅度提高性能。
重写渲染器,用WebGL渲染。重写渲染器的主要目的是提升渲染速度,另一方面也能提供交互能力。比如点个block就跳转到对应的代码区之类的。测量等功能也能顺便提供,从而彻底完善OpenSCAD这方面的不足。
对OpenSCAD语言语法进行扩展,站在高度整合CAD/CAM的角度来重新思考CAM的问题。传统的方法这2个过程是完全割裂的,CAM只能看到一个物体,丢失了这个物体里局部特征的高层信息。如果能在一个软件内进行整合,可以极大的提高CAM的自动化程度。
感觉又是一个深坑,抽一星期尝试下吧...
最后,在本文快结束的时候我又双叒叕找到一个把我以上想法实现了的例子...或者基于它摩改可能更简单一点...
主页:https://declaracad.com/