Работа с таблицей в чертежах. API7. C#

Автор Kamerton, 13.05.15, 16:26:16

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Kamerton

Доброго времени суток форумчанам. Столкнулся с проблемой при получении данных из таблицы в чертеже.

Попробовал через API7:
В документации предлагается следющий подход:
У IDrawingDocument получить IViewsAndLayersManager,
    у него получить IViews,
        у него получить IView,
            у него получить ISymbols2DContainer,
                у него получить DrawingTables,
                    а у него уже получать интересующую таблицу (плохо представляю, к чему нужен был такой маразм, ну да Бог с ним).

1) Нет чёткого определения, как получать ISymbols2DContainer из IView. Да, указан "IUnknown::QueryInterface (const GUID far& iid, void** pif)", но в C# ни IUnknown, ни QueryInterface не находится... Порывшись по форому, нашёл пару упоминаний о том, что на C# это - простое привидение типов, однако меня-таки мучают смутные сомнения...
2) Если отбросить сомнения и привести IView as ISymbol2DContainer, то полученный объект IntelySence отказывается полноценно отобразить при дебаге. Складывается впечатление, что нужного результата подобным методом не получается.
3) Ну да Бог с ним. Если предположить, что полученный результат верен и IntelySence не прав (или прав, но по-своему), то на следующем шаге - DrawingTables = 0, при явном наличии таблиц. Соотвественно, получить таблицу не представляется возможным.

Дальше фантазия заканчивается...

Сталкивался кто-либо с подобными проблемами при получении таблиц через API7?
Или может кто подскажет решние?
Или другой вариант представления искоммых данных? Может это не таблица, а что-то ещё? Может какая-то ещё есть термиология в документах чертежей Компаса для строко-колонок, подобных таблицам?

Попытки обойти проблему также завели в тупик:
1) Проверил TechnicalDemands и SpecificationDescriptions - по нулям.
2) Попытался получить через API5 - также неудачно... ksGetTableItems() также возвращает 0...

Помогите, пожалуйста  :)

Sprinter500

Вот фрагмент кода в Delphi
.........
for I := 0 to pViews.Count-1 do
  begin
     pView := pViews.ViewByNumber ;
     pView.Current := true;
     pDrawingContainer := pView as iDrawingContainer;
     pSymbols2DContainer := pView as iSymbols2DContainer;
     pDrawTables:= pSymbols2DContainer.DrawingTables;
      for J := 0 to pDrawTables.Count-1 do
         begin
            pDrawTable:= pDrawTables.Item[J] as IDrawingTable;
            pTable:= pDrawTable as ITable;
            if pTable<>nil then

Ну а дальше работаешь с таблицей

Sprinter500

Код немного портится сайтом - удаляется итерация и получается курсив :)

Sprinter500

for K := 0 to pViews.Count-1 do
  begin
     pView := pViews.ViewByNumber[K];
     pView.Current := true;
     pDrawingContainer := pView as iDrawingContainer;
     pSymbols2DContainer := pView as iSymbols2DContainer;
     pDrawTables:= pSymbols2DContainer.DrawingTables;
      for J := 0 to pDrawTables.Count-1 do
         begin
            pDrawTable:= pDrawTables.Item[J] as IDrawingTable;
            pTable:= pDrawTable as ITable;
            if pTable<>nil then
+ Благодарностей: 1


Kamerton

#5
Цитата: Sprinter500 от 13.05.15, 17:41:14

     pDrawingContainer := pView as iDrawingContainer;
     pSymbols2DContainer := pView as iSymbols2DContainer;
     pDrawTables:= pSymbols2DContainer.DrawingTables;


Благодарю за код :) Объясните, пожалуйста, зачем Вы присваиваете pDrawingContainer := pView as iDrawingContainer; а потом эту переменную больше нигде не используете? Или это не просто присваивание в Delphi?

Цитата: Sabahs от 13.05.15, 17:43:14

Весь этот маразм - ООП.


Не согласен. ООП (ну, как я представляю, по крайней мере) придуман, чтобы код был более читабелен, и "человечен", что достигается (в идеале) интуитивно понятными взаимосвязями между объектами.

Как правило, данные и их отображение разделяется на разные ветки, т.к. у них разные цели. Отсюда непонятно, зачем во Views (отображения) запихивать iSymbols2DContainer (данные) (да ещё получать эти Views через какой-то Manager). Логичнее было бы (на мой субъективный взгляд, конечно же) данные вынести в отдельное базовое свойство объекта, с которым работаем (IDrawingDocument), наподобие свойств TechnicalDemands, SpecificationDescriptions и т.п. (например - "DraftObjects") и уже дальше вести новое дерево от него. Ну а всякие манагеры, кстати, типа ViewsAndLayersManagers вообще сделать приватными и пусть тихо-скрытно занимаются установкой связей между двумя (или более) деревьями свойств при выводе документа для пользователя, распределив их немногие публичные свойства/методы/события между объектами, ими управляемыми.

А вот (как пример) вызывать из класса "Человека" класс "Собаку" потому, что она его друг, - подобное и есть маразм, на мой взгляд. А то, что ООП позволяет такому маразму существовать, не значит, что оно само по себе его реализует ;)

Sprinter500

Не за что. :)  pDrawingContainer используется дальше для других целей - вытащил и лишнее не убрал :) извините.

Sprinter500

Цитата: Kamerton от 14.05.15, 11:44:22
Благодарю за код :) Объясните, пожалуйста, зачем Вы присваиваете pDrawingContainer := pView as iDrawingContainer; а потом эту переменную больше нигде не используете? Или это не просто присваивание в Delphi?

Не согласен. ООП (ну, как я представляю, по крайней мере) придуман, чтобы код был более читабелен, и "человечен", что достигается (в идеале) интуитивно понятными взаимосвязями между объектами.

Как правило, данные и их отображение разделяется на разные ветки, т.к. у них разные цели. Отсюда непонятно, зачем во Views (отображения) запихивать iSymbols2DContainer (данные) (да ещё получать эти Views через какой-то Manager). Логичнее было бы (на мой субъективный взгляд, конечно же) данные вынести в отдельное базовое свойство объекта, с которым работаем (IDrawingDocument), наподобие свойств TechnicalDemands, SpecificationDescriptions и т.п. (например - "DraftObjects") и уже дальше вести новое дерево от него. Ну а всякие манагеры, кстати, типа ViewsAndLayersManagers вообще сделать приватными и пусть тихо-скрытно занимаются установкой связей между двумя (или более) деревьями свойств при выводе документа для пользователя, распределив их немногие публичные свойства/методы/события между объектами, ими управляемыми.

А вот (как пример) вызывать из класса "Человека" класс "Собаку" потому, что она его друг, - подобное и есть маразм, на мой взгляд. А то, что ООП позволяет такому маразму существовать, не значит, что оно само по себе его реализует ;)


Думаю Вам с Вашими идеями надо в штаб программистов АСКОНа устроиться :)

Dragon3DGraff

А можно ли код что получился для доступа к таблице на C#... Ни как не могу разобраться...

plscomeback

Ребята, подскажите можно ли сделать такой же блок сопряжений как в справочнике, я имею ввиду при добавлении например болта в сборку автоматически последовательно задаются сопряжения концентричность и совпадение, как это реализовать внутри интерфейса компас ?

SergY

Добрый день.

Столкнулся с аналогичной проблемой, что изложена в этой теме. Как я понимаю решение не найдено, либо найдено но не описано.
Интересует именно рабочий вариант на С# получения интерфейса  ISymbols2DContainer
Как его получить в теории вроде ясно и примеры выше, правда на Delphi, есть. Иду той же дорогой и СДК ведёт так же, но Студия говорит "Не удалось найти тип или имя пространства имён ISymbols2DContainer"

В СДК написано:

Интерфейс IDrawingContainer - Дополнительный интерфейс вида. Данный интерфейс можно получить у вида IView по­средством вызова метода IUnknown::QueryInterface (const GUID far& IID, void** pif).

Интерфейс ISymbols2DContainer - Дополнительный интерфейс вида. Данный интерфейс можно получить у интерфейса ви­да IView посредством вызова метода IUnknown::QueryInterface (const GUID far& iid, void** pif).

То есть: метод получения и источник одинаков, НО в случае  с IDrawingContainer следующий код:

IDrawingContainer DrCont = (IDrawingContainer)View;

отлично всё работает, а в случае с ISymbols2DContainer получаем ошибку.
Может есть какая-то хитрость.

Кто этот путь прошёл на С#, подскажите пожалуйста в чём проблема ? 8-)

Попробуйте с примером SDKSamplesCSharpAutomationStep2_API7_2D поиграться.

KrissKross

Попробуйте через явное приведение типов "as"
IDrawingContainer DrCont = View as IDrawingContainer;

SergY

взял из степа:

такая-же петрушка   TO10 - это у меня IKompasDocument2D

все using - и что в степе, в моём проекте так же присутствуют.

IDrawingContainer DrCont = View as IDrawingContainer; - так тоже пробовал... результат тот же - нет результата

C IDrawingContainer - всё хорошо, а вот  ISymbols2DContainer  - ошибка

ТрындецЪ

Компас какой версии? В реестре есть раздел {F46B0086-17F2-4489-A5A7-0AA677610AFD}?

SergY

Компас 3D V9    такого раздела в реестре не нашёл

ТрындецЪ

Цитата: SergY от 06.06.18, 14:15:25
такого раздела в реестре не нашёл
IDrawingContainer соответствует {D603FEC9-75B7-4FA5-918F-47074C45B848} Этот должен быть, раз подключается.

SergY

Компьютер\HKEY_CLASSES_ROOT\Interface\{D603FEC9-75B7-4FA5-918F-47074C45B848}- такой раздел есть  (IDrawingContainer)

ТрындецЪ

Цитата: SergY от 06.06.18, 14:22:46
Компьютер\HKEY_CLASSES_ROOT\Interface\{D603FEC9-75B7-4FA5-918F-47074C45B848}- такой раздел есть  (IDrawingContainer)
Мой диагноз: в API Вашей версии КОМПАСа ещё не был реализован этот интерфейс.
Но я могу и ошибаться.
+ Благодарностей: 1