如何在MATLAB中循环遍历类中的每个对象(如VB中的每个X的VB)?

时间:2012-04-03 19:49:21

标签: matlab com interop foreach com-interop

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

我正在尝试通过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做同样的事情。我使用h = actxserver('SolidEdge.Application')成功加载Solid Edge COM服务器,可以通过API执行打开文档,创建几何等等,但我只是不确定MATLAB等效于此Visual Basic“对象for-each” (因为没有更好的名字)。

看起来MATLAB Central论坛here上的用户 Julian 有同样的问题,但他们没有答案。请注意,这与不是this相同的问题,它正在查看标准数组上的每个循环,而不是COM对象。

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

1 个答案:

答案 0 :(得分:0)

我知道我不应该回答我自己的问题,但我想我昨晚破解了这个问题,并认为最好将其发布给其他人。

据我所知,VB.NET“对象中的每个对象”类型的循环是循环容器对象元素的简写,或者微软称之为“集合类”。请参阅MSDN参考12。 (修改:无法张贴链接第三MSDN页面(Item()方法),因为我没有足够的因缘后两个以上的链接可以从得到它之前链接的集合类页面。)

这些包含其他对象集合的对象始终具有一个属性(在MATLAB中,一个字段Count,以及一个方法Item(k),它返回集合中的 k '对象。因此,每个边缘对象被收集在边缘集合类(容器)目标小区将具有集合类细胞,对象的Line2D将具有集合类Lines2D,或在我的情况下,Solid Edge的COM API在3D曲线内。

因此,要在MATLAB中复制没有此简写的行为,您只需直接使用Count字段和Item()方法。 (下面的示例代码在2D草图(Profile)对象IncludeEdge()上使用方法objProfile将3D曲线的每个部分(Edge)投影到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是否使用了具有Count属性和Item()方法的Microsoft约定,或者名称是否可能会改变。但这似乎解决了我的问题。