Как мне пройти через каждый объект в классе (например, VB For Each X in Y) в MATLAB?

Заранее приношу свои извинения, возможно, я неправильно использовал некоторую терминологию. Я новичок в объектно-ориентированном программировании.

Я пытаюсь управлять Siemens Solid Edge ST2 (программа CAD / CAM) из MATLAB через COM API. при выполнении этого из VB6 или VB.NET довольно легко идентифицировать (скажем) все объекты класса objEdge, выполняя какие-то действия для каждого цикла через объект коллекции objEdges:

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. Я успешно загружаю COM-сервер Solid Edge с помощью h = actxserver('SolidEdge.Application'), могу делать такие вещи, как открывать документы, создавать геометрию и т. Д. Через API, но я просто не уверен, что MATLAB-эквивалент этого Visual Basic «объекта для каждого» (из-за отсутствия имя получше).

Похоже, пользователь Джулиан на форумах MATLAB Central здесь имеет ту же проблему, но у них нет ответа для него. Обратите внимание, что это не тот же вопрос, что и this, который рассматривает циклы for-each по стандартным массивам, а не COM-объектам.

Большое спасибо за любую помощь, которую могут предоставить.


person Geoff Olynyk    schedule 03.04.2012    source источник
comment
Привет, Роберт Харви (модератор), это не точная копия. Другой поток спрашивает, что происходит, когда вы изменяете структуру данных, которые вы перебираете, находясь внутри цикла. Здесь мне интересно, как вообще выполнить цикл, когда данные, которые вы пытаетесь перебрать, являются COM-объектом, собранным внутри другого COM-объекта. (т.е. каков эквивалентный синтаксис VB для каждого X в Y)   -  person Geoff Olynyk    schedule 04.04.2012


Ответы (1)


Я знаю, что не должен отвечать на свой вопрос, но, думаю, вчера вечером я взломал этот вопрос и решил, что лучше опубликовать его здесь для других.

Тип цикла VB.NET «Для каждого объекта в объекте», насколько я могу судить, является сокращением для цикла по элементам объекта-контейнера или, как его называет Microsoft, «классом коллекции». См. Ссылки MSDN 1, 2. (изменить: невозможно опубликовать ссылку на третью страницу MSDN (для метода Item()), потому что у меня недостаточно кармы для публикации более двух гиперссылок. Вы можете перейти к ней со страницы класса коллекций, на которую имеется ссылка ранее.)

Эти объекты, которые содержат коллекции других объектов, всегда имеют атрибут (на языке MATLAB, field) Count и метод Item(k), который возвращает k 'th объект в коллекции. Таким образом, объект Cell будет иметь класс коллекции Cells, объект Line2D будет иметь класс коллекции Lines2D или, в моем случае, внутри 3D кривой в Solid Edge COM API, каждый объект 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() или имена могут измениться. Но это, похоже, решает мою проблему.

person Geoff Olynyk    schedule 04.04.2012
comment
Для полноты я ссылаюсь на похожие темы на других форумах: MATLAB Central: ссылка (см. мой ответ, опубликованный 03 апреля 2012 г.) и Форумы поддержки Siemens GTAC: ссылка (требуется подтверждение покупки программного обеспечения Siemens PLM, например Solid Edge, для создания счет) - person Geoff Olynyk; 04.04.2012
comment
На самом деле вы должны отвечать на свои вопросы (если вы найдете ответ). Это официально поощряется. - person Li-aung Yip; 04.04.2012
comment
О, круто. Всегда приятно узнать, что я не нарушаю правила :) - person Geoff Olynyk; 04.04.2012