1

事前にお詫び申し上げます。用語の一部が間違っている可能性があります。オブジェクト指向プログラミング初心者です。

COM API 経由で MATLAB から Siemens Solid Edge ST2 (CAD/CAM プログラム) を制御しようとしています。VB6 または VB.NET からこれを行う場合、objEdges コレクション オブジェクトを介して for each ループを実行することにより、クラス "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の「オブジェクトfor-each」に相当するMATLABがわかりません(より良い名前)。

こちらの MATLAB Central フォーラムのユーザーJulianが同じ問題を抱えているようですが、彼に対する回答はありません。これは、COM オブジェクトではなく、標準配列の for-each ループを見ているthisと同じ質問ではないことに注意してください。

人々が提供できるあらゆる助けに感謝します。

4

1 に答える 1

0

自分の質問に答えるべきではないことはわかっていますが、昨夜これをクラックして、他の人のためにここに投稿する方がよいと考えたと思います.

VB.NETの「オブジェクト内の各オブジェクト」タイプのループは、私が知る限り、コンテナオブジェクトの要素をループするための省略形、またはMicrosoftがそれを「コレクションクラス」と呼んでいます。MSDN リファレンス1、2を参照してください。(編集: 2 つ以上のハイパーリンクを投稿するのに十分なカルマがないため、3 番目の MSDN ページ (Item()メソッド用) へのリンクを投稿できません。以前にリンクされたコレクション クラス ページからアクセスできます。)

他のオブジェクトのコレクションを保持するこれらのオブジェクトには、常に属性 (MATLAB で言えば、フィールド)と、コレクション内のk番目のオブジェクトを返すCountメソッドがあります。したがって、オブジェクト Cell にはコレクション クラス Cells があり、オブジェクト Line2D にはコレクション クラス Lines2D があります。私の場合、Solid Edge COM API の 3D 曲線内では、各 Edge オブジェクトは Edges コレクション クラス (コンテナー) に収集されます。Item(k)

したがって、この省略表現がない 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

確信が持てないことの 1 つは、すべてCountの COM API が、属性とItem()メソッドを持つこの Microsoft 規則を使用しているかどうか、または名前が変更される可能性があるかどうかです。しかし、これは私の問題を解決するようです。

于 2012-04-04T16:45:53.807 に答える