在上次的文章里,我介绍了如何直接调用Inventor命令
http://blog.youkuaiyun.com/autodeskinventorapi/article/details/17138055
这在某些情况下能减少点代码,交由Inventor本身的功能完成。对于个别情形没有相关API的功能,这种方法也不失为一种解决方案。但是,这不是万能的,当执行某个命令后,控制权就交由Inventor,基本上是等待用户交互,输入参数,弹出对话框等。某些需求,这样的过程也足够了,例如,以下代码选择了一个拉伸特征,执行弹出【特征编辑】对话框的功能。
Sub editExtrudeF()
Dim oPartDoc As PartDocument
Set oPartDoc = ThisApplication.ActiveDocument
Dim oDef As PartComponentDefinition
Set oDef = oPartDoc.ComponentDefinition
Dim oEF As ExtrudeFeature
Set oEF = oDef.Features.ExtrudeFeatures(1)
Dim oSel As SelectSet
Set oSel = oPartDoc.SelectSet
oSel.Clear
oSel.Select oEF
ThisApplication.CommandManager.ControlDefinitions("EditExtrudeCtxCmd").Execute
End Sub
可某些需求,例如草图里的 裁剪,延伸,打断等操作,即便代码选择好了草图实体,执行对应的命令,Inventor仍旧需要用户选择实体。例如以下代码选择好一个草图直线,然后执行【延伸】命令,Inventor并没有直接出延伸结果,而是让用户选择需要延伸哪个实体。
Sub ExtendSketchEnt()
Dim oPartDoc As PartDocument
Set oPartDoc = ThisApplication.ActiveDocument
Dim oDef As PartComponentDefinition
Set oDef = oPartDoc.ComponentDefinition
Dim oSketch As Sketch
Set oSketch = oDef.Sketches(1)
Dim oSketchEnt As SketchEntity
Set oSketchEnt = oSketch.SketchLines(1)
Dim oSel As SelectSet
Set oSel = oPartDoc.SelectSet
oSel.Clear
oSel.Select oSketchEnt
ThisApplication.CommandManager.ControlDefinitions("SketchExtendCmd").Execute
End Sub
这是为什么呢?
其实,如果直接在用户界面手动操作:先选择好一个草图线,接着点击【延伸】,你会发现,选择好的草图线不再是选中状态,Inventor也会让用户选择延伸哪个草图实体。因此,其实刚才代码的行为和用户手动操作的行为时一致的。
这背后与该命令的机制有关系。大家知道,当你做延伸时,例如一条最普通的直线,如果在选择这条直线,拾取点靠近起点,则Inventor将以起点作为延伸对象,同样,若靠近终点,则以终点作为延伸对象。这样才能有唯一的结果。而预先选择实体,用户可能是框选,多选,Inventor无法得知到底哪个对象是来延伸。反过来再看代码,难道你没发现代码也是无法去指定是靠近起点拾取还是终点拾取么?
总之,对于这样的情形,执行命令就无能为力了。
这时,通常我们需要去看API有无具体化的功能。例如,对于编辑拉伸特征,弹出对话框后仍旧要用户输入编辑。假设你想用代码都做完,可以是自行获取ExtrudeDefinition ,对其中的参数进行修改,例如修改拉伸距离用ExtrudeDefinition.SetDistanceExtent 。
而对于【延伸】草图实体,很遗憾,目前API没有具体化的功能。你能做的可以是研究Inventor如何延伸,自行设计出算法。 例如:
http://blog.youkuaiyun.com/autodeskinventorapi/article/details/17680531