FreeCAD正确建模思路,减少报错

Nội dung video gốcMở rộng video
  • 无论你是FreeCAD的初学者还是资深用户,我们的关注点往往是让模型看起来正确。
  • 本节课将深入探讨基于历史的参数化CAD是如何工作的、模型为何会出错、以及如何设计出稳定可靠的FreeCAD模型。
  • 如果你喜欢这个频道并且想支持我的工作,我开设了一个Patreon页面,你可以选择单纯支持或选择一个特定等级。
  • 所有基于历史参数化的CAT系统都遵循以下工作原理。
  • 修改早期特征所带来的影响。

无论你是FreeCAD的初学者还是资深用户,我们的关注点往往是让模型看起来正确。然而,真正的挑战不在于创建模型本身,而在于创建一个能够经受住修改的模型。本节课将深入探讨基于历史的参数化CAD是如何工作的,模型为何会出错,以及如何设计出稳定可靠的FreeCAD模型,使其能够在演进过程中不散架。

如果你喜欢这个频道并且想支持我的工作,我开设了一个Patreon页面,你可以选择单纯支持或是选择一个特定等级,其中包含视频的抢先观看权、可下载的PDF书面教程以及一些额外的奖励内容。如果你觉得这听起来不错,我已在屏幕上留下链接,也在这些视频的描述中附上了。

所有基于历史参数化的CAT系统都遵循以下工作原理:

  • 每个特征都使用前一个特征的结果。
  • 每个特征都定义了下游的拓扑结构。
  • 更改会向下游传播,而不会影响上游。

早期的特征被视为最稳定的,随着特征链不断增长,发生以下情况的可能性即更改上游的某个特征会导致模型在下游更远处出现错误。许多参数化CAD系统都会警告用户不要引用下游或后期生成的几何体,这并非FreeCAD独有的问题。你在SolidWorks、Cryo以及Fusion360中也会找到相同的建议。

在本节课中,我们将通过探索不同的建模方法,来学习模型的稳定性,以及如何减轻修改早期特征所带来的影响。我们还将了解当修改导致问题时如何修复你的模型

为了理解其中的原理,我们就得探究一下拓扑命名这个领域。让我们来看下面这个简单的模型。在这个模型中,选择的构造方法涉及直接将特征附着到模型的面上。看看当我们删除另一个特征时会发生什么。

这里有一个凸台、第二个图台以及一个凹槽。现在我不想要这个特征了,就是这个图台。注意,当我点击这个图台对应的实体被选中时,如果我按键盘上的删除键,它会警告我们存在依赖关系,我先点否。

如果我们查看这个凹槽内部,里面有草图002,但这个凹槽和这个六边形图台特征看起来毫无关联。乍一看反之较,如果我们删除这个图台六边形,然后点击删除,并对所有警告都选是,然后让凹槽可见,草图留了下来,我们可以移除它,但凹槽依然存在。那么问题在哪呢?

所有草图都会显示它附着于哪个几何体。在这个例子中,附着于哪个面,以及附着方法。这个凹槽仍然保持着附着模式,但它的附着支持那个面已被删除,这正是对象依赖关系警告我们的原因。

如果我们查看草图的位置属性,这里的位置坐标值是有具体数值的,草图现在依赖于这个绝对位置值,而之前它取的是附着值。当草图被附着时,位置属性也会同步更新。如果设置了附着偏移量,位置属性也会自动调整。

为什么删除一个六边形图台会影响一个甚至不是基于它创建的凹槽呢? 同样的情况会发生在任何基于历史的参数化CAD系统中,要理解原因,我们需要走一遍这个模型的构建过程。

我们首先创建了一个基础特征,它来自一个草图附着基准平面,然后在此之上添加了一个凸台。这是我们在实体内部特征数中的第一个特征。我们有一个特征数,如果我们忽略下游的特征,只关注这一特征,那么此时模型只有一个状态。

如果我们把鼠标悬停在上方的面上,然后看向左下方可以看到我们预选的是凸台面6。在1.及更高版本中,我们也能看到这个通过长按左键点击会出现选择说明。我们看到对象凸台活面及凸台面6。下一阶段我们选择了顶面并以其为基础创建了下一个特征。

现在如果我展示这个草图,我们可以看到上面有一个六边形。如果我们查看这个草图,它的附着之称就是秃苔面6,也就是这个。当我们对草图执行操作时会创建一个秃苔。

现在如果我们再看同一个面,这里这个看向左下方我们会发现变化。我们看到同一个面现在是秃苔01的面5,而不是凸台面6了。这个特征不仅仅是六边形的凸台部分,它是整个体积。它基本上就像一个放置上去的几何蒙皮位于顶部,该操作会创建一个新特征,这个特征就是轮廓的形状,但会包裹整个模型。

我们在这个凹槽上也看到了这一点。如果我们查看起草图,它位于侧面,这个草图附着在图台01的一个面上,这由操作创建的位于它之前的上游特征,凹槽pocket特征就这样创建好了。

最后一步操作,如果我们点击这个凹槽特征,注意整个凹槽部分都被高亮显示了。所以严格来说,这高亮显示的并不是这个特征本身,高亮的是整个凹槽。当我们将鼠标悬停在这个面上时可以更清楚的看到这一点,我们看到这个面的名称,看左下角显示为pocket凹槽所生成的面。

最后一个特征被称为提示或末端这一点我们可以看出,因为创建这个特征的操作带有一个白色的箭头,而其他所有特征都显示为灰色。这些灰色特征代表了模型在历史中的某个瞬间,展示了模型在对应操作之前的状态。

一旦你将模型理解为一连串完整的历史状态,而不是一个持续演变的单一实体,这种特征数的行为就开始变得合理。你也不会再觉得是FreeCAD本身有问题,事实上,它的行为方式完全符合一个基于历史的KAT系统应有的表现。

特征是按照顺序创建的,每个特征都依赖于前一个特征,对早期特征进行更改或重新排序可能会破坏后续的特征。对上游的特征或尺寸进行更改,下游的特征就会相应更新。

那么,在这个场景中,我们该如何移除这个Hexagon特定特征呢?同时,避免引发警告或错误,有一种在这种情况下不常被提及的技巧,因为它在FreeCAD中相对较新,但其他CAD软件包中早已在使用,那就是抑制, suppression,抑制基本上相当于一个非删除开关,作用于模型历史中的一个特征。当一个特征被抑制时,它就不再执行其原有的操作,相反它只是简单的传递上一个特征的计算结果。

该特征仍会保留在特征数中,但对最终的模型已不产生任何影响。在某些情况下,抑制一个特征可以作为删除该特征的替代方案,或者作为一种规划删除的方式以便更可控地进行。

那么,关于我们的模型,我们来看一下Hazard枪步键,它是由这个草图创建的。这个草图附着在上一个特征上,即Pad拉伸面的面6。而这个Pocket凹槽特征,是附着在Pad下划线01的面上。如果我右键点击Pad下划线01,并选择抑制。

如果我们查看Pocket特征的草图,它仍然显示附着于Pad下划线01的面3。但是我们发现需要重新计算特征数,点击刷新,然后观察它的附着支持面,现在它变成了面2,但仍然显示为Pad下划线01。它附着于Pad下划线01,但Pad下划线01已被抑制。

所以在这种情况下,处于相同三维空间位置的面会被传递下去。如果我们查看前一个Pad特征并显示它,然后将鼠标悬停在这个面上,看左下角的信息,它同样是面2。所以这是同一个面作为了附着支持面。对于Pad下划线01,它标注为附着于面2,但实际上占用的是前一个Pad特征的面2。

如果我们现在看这个Pocket特征,它已经被成功应用了,只需隐藏草图,而我们抑制了Pad下划线001。有一个很好的思维模型要记住,早期特征应该定义功能性的决策及设计意图,后期特征则起装饰作用。

例如,像圆角和金板这类修饰性特征应该尽可能的放在特征树的下游。换句话说,越靠近末尾越好。它们会改变拓扑,并且被设计师修改的风险很高,这会增加下游所有特征的拓扑命名问题风险。

如果某个特征定义了零件的形状逻辑,它就应该尽早出现并保持稳定。设计意图包含功能性要求、尺寸精度、对称性、接口以及间隙。上游是指模型术中较早的部分,比如基础草图、主要拉伸特征、布局草图以及主控尺寸。下游则是较晚生成的特征,例如孔、凹槽、圆角、倒角、阵列以及修饰特征。

其中一些特征和术语你可能还没接触到,但以后都会慢慢了解。早期特征通常被视为更稳定,因为依赖他们的后续操作较少,所以他们的重新生成也更具可预测性。

不过我们在此必须小心不要一概而论,一个早期特征也可能是一个接口,比如用于与另一零件装配的一组孔。这绝非稳定特征,但它体现了设计意图。我们真正应该关注的是避免将特征附着在那些不稳定的脆弱特征上。

一个脆弱特征,例如某个阵列的最后一个面,其阵列实力数量可能发生变化,从而导致你的模型出错。与其直接抑制这个特征,不如我们来修复这个问题,让我们取消对01处的抑制,然后刷新,拉伸特征就恢复了。现在我来选中Pad0,按下键盘上的Delete键,然后选择是,我不需要那个六边形了,可以删掉它。

我们需要集中处理这个凹槽以及它内部的草图。它的附着关系丢失了,映射模式显示为平面,这表明它之前是附着于那个拉伸特征上的,现在显示出这个凹槽的草图也就是我们需要修复的那个。编辑这个草图并查看它的附着支持,正如之前操作显示的,它曾附着于那个拉伸特征,所以我们可以选择它的某个面,通过查看左下方的信息来确认。

可以看到我们现在选中的是Pad的底面Face2。找到附件支持属性,点击它,使用末尾的按钮链接窗口会弹出,现在我们可以为面指定附着位置。我们看到Pad2的面已被选中,当我们点击确定时,Pad2的面就有了附着支持,草图显示需要重新计算,我们只需刷新一下,现在凹槽就已正确附着,然后我们可以隐藏这个草图。

另一种方法是重新映射草图,而不是使用附件支持属性,我们使用映射模式。我们先删除这个图台,回到凹槽特征,选中起草图。如果我将鼠标悬停在这个面上,目前显示的仍是凹槽,我们需要显示即将附着的那个凸台特征所在的面。现在找到映射模式,选中它,并使用末尾的按钮。附件面板会显示出来,参考像这里提示请选择,如果没有,我们就直接点击它。

我们看到了我们的草图,然后我们选择面,现在附着平面及Pad2的面,点击确定,我们刷新,然后显示最后的操作结果,现在我们就可以去掉头部扫描的草图了。草图现在已正确映射到正确的面上,并使用了正确的映射模式。

特征链工作流是一种建模方法,其中每个新特征都构建在前一个特征的结果之上。一个典型的特征链可能是这样的,在这个工作流中每个草图都附着在紧邻的前一个特征所创建的面上,这就形成了一条清晰的线性依赖链,其中每一步都直接基于上一步构建。

乍一看,这种方法常受到批评,因为它严重依赖于由操作生成的面,而这种面可能很不稳定、复杂或频繁变更的模型。然而,这忽略了一个重要因素,那就是设计意图。如果你的建模目标是一个简单或自包含的特征,那么直接附加到后续特征上可能是可行的,甚至是更好的工作流程。

这类零件通常是按顺序设计的,每一个特征的存在都依赖于前一个特征。在这种情境下,将草图直接附着到生成面上恰恰反映了零件实际的设计方式。试图将更复杂的工作流程强加给每一个模型可能会增加不必要的工作,并使其过于复杂。

尤其是当我们意识到自己建造的不是F1引擎钢体,而是一个墙壁制架时。关键要点在于设计意图至关重要。当意图不明确时,特征链是脆弱的,特别是当附着于脆弱的特征上,或者预计会有较大设计变更时。但当设计意图简单、局部且线性时,直接附着到后续特征就完全合理,并且通常是更高效的工作流程。

如果你需要引用几何图形,那么将你的特征附着到模型树中尽可能早的特征上可能更有益。这样做可以降低其脆弱性,并有助于防止后续特征在模型演化时被破坏。我们最终会创建出多个特征链,它们都源自同一个初始特征,从而带来更好的稳定性。

这里必须注意不要让这个初始特征负担过重,在这个例子中,我们有一个带脚链盒子的初步模型尚未进行挖空处理。在左侧,你可以看到我们有一个线性阵列,这是一个不稳定的特征。假设我想放置一个草图在这个面上,选中这个面后在草图中绘制,然后创建比如说一个圆形,我希望这个圆形以此面的中心为中心,因此我们使用外部几何投影工具

比方说与其投影那两点,我们投影这两条边线,这些边线是不稳定的,因为它们受线性阵列的影响。如果只是两个点,那就没问题,我们右键取消这个工具,然后投影这两个点以及这个圆的圆心,并应用对称约束,现在我们完成草图,然后直接在此基础上做一个拉伸。

让我们回到那个草图,看看当我们开始修改一些尺寸时会发生什么。注意被投影进来的边线是紫色的,并且它们是构造线,所以是虚线,这是构造几何的表示方式。

回到模型,这里看看最初创建箱体的那个拉伸特征,它内部包含了一个草图;我们先把线性阵列显示出来,针对我们的草图看一下约束条件。我可以在这里修改约束,从而改变箱体的宽度,比如改成25,然后点击确认,我们看到一切正常,圆也保持在中间位置。

那么,如果我修改线性阵列呢? 目前阵列的实例数量是5个,我们把它改成4个,然后点击确认,这样实例就少了一个。你会注意到被投影的边线颜色从紫色变成了橙色,这说明它失效了。我们回到最初那个拉伸的草图,查看约束,把约束值改为25,然后点击确认,外部几何已经发生了变化,但它并没有与图形的其余部分保持联动,修改线性阵列破坏了几何引用关系。

那么我们该如何避免这种情况呢?我们先把当前视图关掉,接下来我将删除这个秃苔和草图。这一次我不再将新草图依附在这个面上,而是在特征树中向上寻找,定位到一个稳定的特征,也就是最初的图台上,选择它的一个面,然后在这个面上创建草图。

我们会引入两个点和之前一样,然后像之前一样引入线,添加圆,然后选取两个角落的点和圆心为它们添加对称约束,然后点击关闭。这样我们的线性阵列或当前的活动特征并没有被依附,我们可以基于这个草图创建一个图台。

现在当我修改线性阵列时,这个图台不会受到影响。我们可以看到回到草图这里,您会发现它所依附的参照操作已经显示出来了。如果我去修改生成那个凸台的原始草图,也就是改变这个矩形尺寸的那个草图,一切正常。然后我去修改线性阵列,我们不看到它,因为我们需要先显示线性阵列,一切运行正常,因为这个依附参照不是基于线性阵列,而是基于凸台本身。

另一种改进这种链式参照的方法是优先使用草图几何,例如草图中的线和点,而不是依附于已生成实体的面或边。草图几何是稳定且可预测的,这使其成为下游特征更可靠的参照基础。

采用这个方法,我们仍然可以在线性阵列上添加草图,但不在参照阵列生成的边,而是返回到一个更早的特征,显示它的草图。隐藏线性阵列,然后从那个草图中引入几何参照。现在因为它是居中的,我们可以使用它的中心线。不过如果我们创建一些构造几何体将其附着到中心点,然后引用外部几何,确保我们使用的是构造几何体。

如果我们的拉伸突抬草图的附着位置发生变化,那么我们的草图也会随之移动。我们仍需要在这里添加一个尺寸标注,我们返回并关闭草图,我们的原位于中心,即便草图的位置发生了移动。如果我们更改线性阵列,比如说将数量改为三个,草图依然保持稳定,因为它引用的是稳定的拉伸突台草图,而非阵列特征所生成的那些不稳定的边。

接下来的方法侧重于在更稳固的基础上构建模型,从一个稳定的参照开始,并逐步引入主草图以捕捉核心几何形状和设计意图。我们将学习诸如引用原点、主草图工作流、使用草图几何约束的技巧以及使用表达式基准集和电子表格等方法提升模型稳定性。

一种方法就是审慎的选择草图和特征所附着的对象,选择稳定的早期参照有助于减少下游问题。将草图和数据对象附着到实体的原点、平面和轴线上,这些参照是永久性的,其标识永远不会改变。

当需要进行定位时,请使用附件偏移优先采用此方法,而非直接将其附着到上一个特征的面上。当我们在零件设计工作台中创建一个实体时,原点就被置于其中。当我们创建新草图时,原点会显示出来,我们便可以附着到这些平面上,因此我们最初的附着定位总是稳定的。

之后我们执行一个清理草图的操作,我们只需要做一个简单的拉伸。那么如果我们接下来要使用特征链,我们就直接将下一个草图附着到面上,直接引用原点平面。我们要确保没有选中任何对象,这样当添加新草图时,它就会被放置在一个坐标平面上。比方说,我想在这个面上放置一个特征,但我打算使用原点平面。

选择YZ平面,问题在于草图位于YZ平面上,而不是位于我们想要的面上,所以我们需要添加一个偏移。如果我们查看这个草图,我们就可以打开附着偏移设置,调整其位置,移动草图使其位于该面上。对于这个例子,偏移量设为38毫米,这样我就可以参照原点来绘制草图而不去引用任何边线。

通过使用外部几何功能,这个工作流程可能相当耗时,但它能创建一个更稳定的工作流。我们可以引用草图的坐标原点,也可以引用其坐标轴,完成草图绘制后,我们参照原点和基准平面绘制就可以关闭草图了,然后执行我们的操作。

我们还必须注意所执行的操作类型,例如“直到面”这类操作意味着我们在引用由特征生成的几何。我们必须确保所使用的操作是兼容的。如你所见,这是一个更长的工作流程,但它能创建出更稳定的模型。这很可能是因为我们没有引用任何面。如果我们更改尺寸,由于草图是依据稳定的基准定位的,最后它们就会悬浮在三维空间中。

再例如,如果这个凹槽是一个固定尺寸,向内进行凹槽切割时我们就必须考虑到凸台的尺寸并将其应用到附着设置上,这时表达室就能派上用场了。

一个常见且有效的规避参考关系引发问题的方法是使用一个或多个主草图,这些是在模型创建早期绘制的简单草图,它们定义了零件的核心几何形状和关键尺寸,在整体轮廓之内。主体轮廓决定了位置和关键间距,主草图应当被放置为零件体中的第一个特征,甚至放在零件体之外以获得最大的灵活性。

它应刻意保持极简,仅包含描述设计意图所必须的几何元素。约束条件应被清晰命名,以方便引用。后续的草图和特征都引用这个主草图,要么通过外部几何引用,要么通过绑定器,而不是去引用由实体生成的面和边。这种方法之所以有效,是因为主草图是在任何实体几何存在之前创建的,并且通常附着于一个稳定的参考记。

由于这些参考系永不改变,主草图便能始终保持有效,即使模型被大幅度修改。下游特征也会继承这种稳定性。当尺寸或布局需要更改时,更新可以在整个模型中清晰地传递,而不会破坏面或边的参考关系。在实践中,这能将依赖关系从脆弱的拓扑结构上转移开,并重新建立在可预测的内部几何上。

简而言之,主草图充当了设计的单一事实来源。对于设计而言,只要它能保持稳定,模型的其他部分就可以围绕它进行演化,从而大幅减少失败的发生。这使其成为最可靠的方法之一来避免拓扑命名问题。

至于子形状绑定器,我们需要小心,它们在引用稳定的几何体时效果最好,例如实体外部的主草图,或来自引用草图。要从面、边或顶点创建绑定器,或针对通过、阵列等特征生成的实体,也可能继承同样的脆弱性,正是这种脆弱性导致了拓扑命名问题。

请记住,如果原草图的几何图形被删除,或经过大量编辑,绑定器也同样可能会失效。如果使用草图,最好绑定整个草图,而不是仅一条边或一个面,因为更改也会传递到形状绑定器。

同样,为了获得最佳效果,只绑定那些您知道在整个建模过程中都会保持稳定的几何元素,与其将数字直接编码到草图中,通常更有帮助的做法是使用表达室、电子表格或变量级来驱动尺寸。这种方法减少了特征之间的直接依赖,使模型更加灵活,更易于修改。

如果关键尺寸发生变化,更新将自动传播,而不会破坏下游特征。如果我们回想一下创建实体的时候,以及在基准平面上创建草图,我们来创建一个简单的矩形,并在这里设置一些参数,然后我们拿这个草图进行拉伸。

我们保留10毫米的高度,我们将草图映射到实体表面。随着拉伸高度增加,草图也会随之移动,但如果我们直接将草图放置在基准平面上,比如这个例子中的XY平面,那么我们就需要偏移草图,因为它直接位于那个平面上。这可以通过附件偏移来实现,使其与拉伸特征具有相同的高度,但如果我们将这个凸台的长度增加,比如12毫米,那么任何应用在该草图上的操作现在都会位于实体内部,这样就省去了我们返回草图并手动修改附着偏移量的麻烦。

我们可以利用表达式将这个偏移量与图台的长度关联起来。如果我点击这个数值字段,会出现表达式图标,我们可以点击表达式,然后输入图台的ID,在这个例子里,它就是pad。如您所见,这是它的标签,所以如果我们重命名这个图台,比如用名字Chevrons,我们选中这个图台,然后它有长度属性,点击确定。现在我们就已经将草图的Z向位置,也就是沿着其法线方向的位置通过表达式与图台的长度关联起来了。

如果我现在修改图台,将长度改回时,草图也会随之移动。我们也可以从数据源来驱动它,例如电子表格或变量级,使用工具栏上的图标添加一个变量级。这是一个名值对,我可以给它一个名称,比如pad下划线height,我可以定义它所属的分组,这个分组会在属性面板中显示,我暂时就把它留在基础组里,类型可以设置为长度属性并设定它的值,我们先随便给一个值,比如5,然后添加,点击关闭。

前我们还可以添加其他参数,现在我们可以在左侧看到变量级,其中包含了pad下划线height。现在如果我点击我们的toTie查看其长度属性,我们可以在末尾使用表达式,将其值设为VarsatPad下划线Height,然后点击确定,这样,凸台的长度就由变量级驱动了,草图的附着位置也随之自动更新,其位置与拉伸长度关联。

正如你在这里看到的,对变量级进行的任何修改都会更新这个拉伸体,从而更新草图的附着位置。为了更清晰的演示,我也要把这个参数加入到变量集中。在变量集中,如果我们没有看到参数列表,我们就先删除这个点再重新添加它,然后我们选择拉伸高度,点击确定,在右侧已经可以看到它更新了,但现在我们是通过变量集来控制这些参数,我们把它改成12,按回车,这样一来,我们的模型参数化程度就高多了,灵活得多。

FreeCAD 1.0及更高版本显著改善了对拓扑命名问题的处理,通过更好的启发式算法和更少的静默失败。但我们仍需要注意特征的附着对象。刚才讲的这些技巧能确保你的零件保持灵活可靠且易于维护,尤其是在设计日益复杂时。

但永远要记住设计意图。我们或许可以花一辈子时间去创建一个完美健壮的简单壁挂支架模型。如果你喜欢本期内容并想支持本频道,可以通过KO5网址ko5.com/麦林或者通过PayPal网址paypal.com/PayPal,V/斜杠DarrenBiston。我也运营着一个Patreon页面,你可以在那里获得早期观看和额外内容,地址是Patreon.com/斜杠MangoJellySolutions。

所有链接都可以在频道首页的关于页面,或这些视频的描述中找到。感谢所有到目前为止支持过我的朋友,这确实能帮助我维持频道的运营,从而制作更多内容并扩展这个频道。感谢你们的点赞、评论以及订阅这些视频,我们下期视频再见。