1

提前道歉,我在这里可能有一些术语错误。我是面向对象编程的新手。

我正在尝试通过 COM API 从 MATLAB 控制 Siemens Solid Edge ST2(一个 CAD/CAM 程序)。从 VB6 或 VB.NET 执行此操作时,通过 objEdges 集合对象对每个循环执行某种操作,很容易识别(比如说)类“objEdge”的所有对象:

Dim objEdges As SolidEdgeGeometry.Edges
objEdges = objCurve3D.GetType().InvokeMember("Edges", _
  Reflection.BindingFlags.GetProperty, Nothing, objCurve3D, args)

For Each objEdge In objEdges
  objProf.IncludeEdge(objEdge)
Next

我正在尝试从 MATLAB 做同样的事情。我使用 成功加载了 Solid Edge COM 服务器h = actxserver('SolidEdge.Application'),可以通过 API 执行打开文档、创建几何图形等操作,但我只是不确定这个 Visual Basic“object for-each”的 MATLAB 等价物(因为缺少更好的名字)。

看起来MATLAB Central 论坛上的用户Julian也有同样的问题,但他们没有给他答案。请注意,这与 this不是一个问题,后者正在查看标准数组上的 for-each 循环,而不是 COM 对象。

非常感谢人们可以提供的任何帮助。

4

1 回答 1

0

我知道我不应该回答我自己的问题,但我想我昨晚破解了这个问题,并认为最好把它贴在这里供其他人使用。

据我所知,VB.NET“对象中的每个对象”类型的循环是循环遍历容器对象的元素的简写,或者正如 Microsoft 所说的,“集合类”。请参阅 MSDN参考资料1、2。(编辑:无法发布到第三个 MSDN 页面(用于方法)的链接,因为我没有足够的业力来发布两个以上的超链接。您可以从前面链接的集合类页面中获取它。)Item()

这些对象包含其他对象的集合,始终具有一个属性(在 MATLAB 中是一个字段Count和一个方法Item(k),该方法返回集合中的第k个对象。因此,对象 Cell 将具有集合类 Cells,对象 Line2D 将具有集合类 Lines2D,或者在我的情况下,在 Solid Edge COM API 的 3D 曲线内,每个 Edge 对象都收集在 Edges 集合类(容器)中。

因此,要在没有此速记的 MATLAB 中复制该行为,您只需直接使用该Count字段和Item()方法即可。(下面的示例代码使用IncludeEdge()2D 草图(轮廓)对象上的方法objProfile将 3D 曲线的每个部分(边)投影到 2D 草图。)

objEdges = objCurve.Edges(1) ; % get handle for Edges container class
numEdges = objEdges.Count ; % number of edges in curve

for k = 1:NumEdges, ; % loop through each Edge object in the curve
  objProfile.IncludeEdge(objEdges.Item(k)); % project current edge to sketch
end

我不确定的一件事是,是否每个COM API 都使用 Microsoft 的具有Count属性和Item()方法的约定,或者名称是否可能更改。但这似乎解决了我的问题。

于 2012-04-04T16:45:53.807 回答