CATSafeArrayVariant

Программирование для CATIA.

CATSafeArrayVariant

Сообщение Artem » 12 фев 2009 08:26

Товаарищи и господа хорошие - как из этой структуры на рейде получить три дабловые координаты???? (Как же все просто на VB...а тут пипецц)
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: CATSafeArrayVariant

Сообщение booSter » 12 фев 2009 11:32

В фрэймворке System есть такая глобальная функция:

Код: Выделить всё
long ConvertSafeArrayVariant
    (
        const CATSafeArrayVariant*    iSafeArray,
        double*    ioDoubleArray,
        long    iSize   = 0
    )


объявленная в хидере CATAutoConversions.h, а в хидере CATSafeArray.h имеется глобальная (недокументированная) функция

Код: Выделить всё
long GetVariantArraySize(CATSafeArrayVariant * iArray)


я думаю, что этого достаточно, чтобы "вывернуть" ;) CATSafeArrayVariant

З.Ы.: массив даблов требуемой длинны на момент вызова ConvertSafeArrayVariant должен быть создан

Удачи
Сделаешь доброе дело за деньги - скажут спасибо,
Сделаешь бесплатно - сядут на шею...
©пёрто
Аватара пользователя
booSter
Moderator
 
Сообщения: 227
Images: 15
Зарегистрирован: 09 фев 2008 16:48
Откуда: Minsk

Re: CATSafeArrayVariant

Сообщение Artem » 12 фев 2009 17:02

Оно конечно огромадное спасибо но пишет error C2064: term does not evaluate to a function :dash1: Может чего в имейкфайле прописать? Или там лист вместо массива?.....
И еще вопрос Можно ли получить обьект от которого был получен обьект в другом парте(в екстернал референсах)?...или наоборот.....Смотрел ListPointingObjects / ListComponents /InverseAttrLink (CATISpecObject)- ничего не находится - шерстить весь обьект по ключам и листам ?
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: CATSafeArrayVariant

Сообщение booSter » 12 фев 2009 17:48

А так ?

Код: Выделить всё
...
#include "CATSafeArray.h"
#include "CATAutoConversions.h"
...
CATSafeArrayVariant * pArrVar = ...
long nArrVarLen = ::ConvertSafeArrayVariant ( pArrVar, (double*) NULL, 0 );
double * padArr = new double[ nArrVarLen ];
long nItemsConvert = ::ConvertSafeArrayVariant ( pArrVar, padArr , nArrVarLen  );
...
delete[] padArr, padArr = NULL;
...
Сделаешь доброе дело за деньги - скажут спасибо,
Сделаешь бесплатно - сядут на шею...
©пёрто
Аватара пользователя
booSter
Moderator
 
Сообщения: 227
Images: 15
Зарегистрирован: 09 фев 2008 16:48
Откуда: Minsk

Re: CATSafeArrayVariant

Сообщение booSter » 12 фев 2009 18:09

Artem писал(а):И еще вопрос Можно ли получить обьект от которого был получен обьект в другом парте(в екстернал референсах)?...или наоборот.....Смотрел ListPointingObjects / ListComponents /InverseAttrLink (CATISpecObject)- ничего не находится - шерстить весь обьект по ключам и листам ?


А как оный объект (из дроугого парта) виден в интерактиве?
Обычно это что-то типа "Result with link"... и в каждом конкретном случае свой подход.

Вероятность же найти "общее решение" проблеммы отлична от нуля, но по всей видимости не велика...
Сделаешь доброе дело за деньги - скажут спасибо,
Сделаешь бесплатно - сядут на шею...
©пёрто
Аватара пользователя
booSter
Moderator
 
Сообщения: 227
Images: 15
Зарегистрирован: 09 фев 2008 16:48
Откуда: Minsk

Re: CATSafeArrayVariant

Сообщение Artem » 13 фев 2009 09:02

:Низкий поклон: Аагромадное спасибо...ага as result with link......Это обыкновенная точка(CATIAHybridShapePoint) Решение я таки нашел-Деактивируем главную точку/обновляем все парты где предположительно, находятся зависимые точки (кстати если обновить саму зависимую точку(чтоб проверить результат обновления идет оно или нет) или главную сборку то катя вылетает)/шерстим по external reference этих партов в поисках необновленных точек ( в список их)/активируем главную точку/обновляем теперь уже главную сборку(ну или те же парты)/исключаем из списка те точки которые все еще необновленные. Мне не нравится это решение да и с изолированными главными точками (CATIAHybridShapePointExplicit) он не работает (главные точки не деактивируются).......Там че какой нибудь резидентный обьект сидит с маппингом и следит за этим делом?(Через ключи у точек не достучаться?)
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: CATSafeArrayVariant

Сообщение booSter » 13 фев 2009 12:20

Artem писал(а):... обновляем все парты где предположительно, находятся зависимые точки ...


Зачем же все? Можно только нужный:

Функция CATISpecAttrAccess.GetExternalObject отдаёт символическую ссылку (некое подобие Reference в VB) как CATILinkableObject, а с помощью CATILinkableObject.GetDocument можно выйти на "документ-виновник". Да и сам CATILinkableObject тот ещё "кролик" для опытов... можно (например) попытаться подостовать из него разные интерфейсы. CATISpecObject он конечно вряд-ли отдаст, но поэксперементировать стоит ;) возможно это BRep или ещё что нибудь...

Удачи
Сделаешь доброе дело за деньги - скажут спасибо,
Сделаешь бесплатно - сядут на шею...
©пёрто
Аватара пользователя
booSter
Moderator
 
Сообщения: 227
Images: 15
Зарегистрирован: 09 фев 2008 16:48
Откуда: Minsk

Re: CATSafeArrayVariant

Сообщение Artem » 13 фев 2009 13:50

Варианты функции требуют ключ со ссылкой/имя ключа...Опять же придется пробегать по ключам обьекта и отсеивать все tk_external....Функции для получения листа всех екстерналов нету? По поводу партов ...ну так ведь зависимых точек может быть полно и в разных партах причем неизвестных мне..
virtual CATLISTV(CATBaseUnknown_var) ExternalBindPointedObjects( const CATIdent interfaceId ,CATIBindParameters* params) = 0;
что за params не знаете? или это не то?
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: CATSafeArrayVariant

Сообщение booSter » 13 фев 2009 14:34

Если задача (или часть её) состоит в том, чтобы найти объекты от которых зависит (с точки зрения Build/Update) данный объект или объекты зависимые от данного - то бегать по атрибутам/компонентам не надо. Есть "специально обученный" интерфейс CATIStructureAnalyse и функция AnalyseParents для первого случая и остальные для второго
Сделаешь доброе дело за деньги - скажут спасибо,
Сделаешь бесплатно - сядут на шею...
©пёрто
Аватара пользователя
booSter
Moderator
 
Сообщения: 227
Images: 15
Зарегистрирован: 09 фев 2008 16:48
Откуда: Minsk

Re: CATSafeArrayVariant

Сообщение Artem » 13 фев 2009 15:01

Посмотрю. :cry: Шееф..по поводу первого вопроса - выдает error C2665: 'ConvertSafeArrayVariant' : none of the 8 overloads can convert parameter 1 from type 'struct tagSAFEARRAY'.....
Код: Выделить всё
CATIAHybridShapePointOnCurve  *piFalsePoint = ...............
piFalsePoint->GetCoordinates(ArrVar);

CATSafeArrayVariant* pArrVar=&ArrVar;

long nArrVarLen = ::ConvertSafeArrayVariant ( *pArrVar, (double*) NULL, 0 );
double * padArr = new double[ nArrVarLen ];
long nItemsConvert = ::ConvertSafeArrayVariant ( *pArrVar, padArr , nArrVarLen  );
MessageBox (0,d2str(padArr[0]),L"vvv",1);
delete[] padArr, padArr = NULL;
Разобрался-
long nArrVarLen = ::ConvertSafeArrayVariant ( pArrVar, (double*) NULL, 0 );
long nItemsConvert = ::ConvertSafeArrayVariant ( pArrVar, padArr , nArrVarLen  );
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: CATSafeArrayVariant

Сообщение booSter » 13 фев 2009 15:30

Код: Выделить всё
...
CATIAHybridShapePointOnCurve *piFalsePoint = ...
...
double adCoord[3] = { 0. };
CATSafeArrayVariant * pvaCoord = ::BuildSafeArrayVariant ( adCoord, 3 );
if ( NULL == pvaCoord )
    ...
HRESULT hr = piFalsePoint->GetCoordinates ( *pvaCoord );
if ( FAILED( hr ) )
    ...
long nItemsConvert = ::ConvertSafeArrayVariant ( pvaCoord, adCoord, 3 );
...
hr =  ::FreeVariantSafeArray ( pvaCoord );
pvaCoord = NULL;
...


Как-то так...
Сделаешь доброе дело за деньги - скажут спасибо,
Сделаешь бесплатно - сядут на шею...
©пёрто
Аватара пользователя
booSter
Moderator
 
Сообщения: 227
Images: 15
Зарегистрирован: 09 фев 2008 16:48
Откуда: Minsk

Re: CATSafeArrayVariant

Сообщение booSter » 13 фев 2009 15:43

А лучше как-нибудь так...

Код: Выделить всё
...
CATIMeasurablePoint_var spMeasPt = piFalsePoint;
if ( ! spMeasPt )
    ...
CATMathPoint mpFalsePoint;
HRESULT hr = spMeasPt->GetPoint( mpFalsePoint );
if ( FAILED( hr ) )
    ...
double dX = mpFalsePoint.GetX();
double dY = mpFalsePoint.GetY();
double dZ = mpFalsePoint.GetZ();
...


... и ну его в баню этот сэйф-эррэй :fool:
Сделаешь доброе дело за деньги - скажут спасибо,
Сделаешь бесплатно - сядут на шею...
©пёрто
Аватара пользователя
booSter
Moderator
 
Сообщения: 227
Images: 15
Зарегистрирован: 09 фев 2008 16:48
Откуда: Minsk

Re: CATSafeArrayVariant

Сообщение Artem » 13 фев 2009 16:02

Агромное спасибо первый вариант на ура :Yahoo!: :beer: .....Ща посмотрю ....CATIStructureAnalyse
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: CATSafeArrayVariant

Сообщение Artem » 26 фев 2009 10:32

Нет шеф.... К неудачам с ListPointingObjects / ListComponents /InverseAttrLink (интерфейс CATISpecObject как у родительской так и дочерней точки в разных документах) добавились CATIStructureAnalyse (две функции с получением чилдрена пробовал на родителе и две с получением предка на дочерней)-выдается нулевой список предков (ну кроме находящихся в том же парте), (отсеивал CATISpecObject ,CATILincableObject, CATBaseUknown). Вызов правильный - обычных детей (как и предков) находящихся в том же парте выдает на ура.....Ну еще на всякий случай CATINavigateObject посмотрел ...туда же его - к бесполезным.......Что еще..
1)проход по Ключам дочерней точки (ключам обьектов входящих в точку и т.д. вниз по рекурсии) показал отсутствие tk_external (Это про то CATILinkableObject) и какое либо прямое упоминание про папашку.......
2)Отец порядочный "поросенок" - детей своих не признает (меню parents/children нулевое), хотя ребенок помнит и про документ и про папку своего...(опять я про стандартное меню Parents/Children)
PS. Еще раз спасибо за сейфейр - в баню его никак нельзя ибо кроме координат другие обьекты (в смысле не точки) возвращают еще кучу всего в этом формате
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: CATSafeArrayVariant

Сообщение booSter » 26 фев 2009 11:37

... так, говорите, не проканал номер с CATIStructureAnalyse+CATILinkableObkect с объектами ссылающимися на сущности из других документов - жаль... ладно, подумаю про альтернативы на досуге...
Сделаешь доброе дело за деньги - скажут спасибо,
Сделаешь бесплатно - сядут на шею...
©пёрто
Аватара пользователя
booSter
Moderator
 
Сообщения: 227
Images: 15
Зарегистрирован: 09 фев 2008 16:48
Откуда: Minsk

Re: CATSafeArrayVariant

Сообщение Artem » 26 фев 2009 11:55

Хмм..при проходе натолкнулся на ключ с ...Pt....(точно название не скажу). GetName() у возвращенного спекобджекта дал connector.+цифра (опять точно не скажу - давно это было)...Вооот....
Ps. Кстати решил проблему с невозможностью деактивации изолированной точки - У CATIGSMPoint.h -
1)снятие координат
2)установка 1 типа точки (обычная точка с координатами) с помощью SetPointType с теми же координатами. Правда немного смутило:
* ============================================================================
* == DO NOT USE IN THIS VERSION ==
* ============================================================================
Но немного посмущавщись все таки заюзал......
3)Апдейт всей сборки (ну чтоб дети "схватились")
4)Деактивация
5)Делаю что мне надо
6)Активация
7)Назад 30й тип точки........
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: CATSafeArrayVariant

Сообщение Artem » 02 мар 2009 11:15

Шееф...короче вроде бы сами буржуи пользуются InteractiveInterfaces.dll - CATIParentChildren:FillParentsList (виртуальная).....Проблемы:
1)Где мне найти реализацию виртуальных FillParentsList/FillChildrenList? Извините если вопрос идиотский, но что - виртуальные функции реализуются компилятором не как все остальные функции? Это я к тому что декомпилятор нашел в CATInteractiveInterfaces и конструктор и деструктор CATIParentChildren.....а виртуальные FillParentsList и FillChildrenList нет. Это же не интерфейс и функции не чисто виртуальные...Или просто в другой длл? А смысл им(дассо) так делать?
2)Опять блин ProtectedInterfaces.....
Дёргать функции нужного интерфейса не на прямую, а через указатель на (виртуальную) функцию-член (горячё любимый C++ и г-н Б.Страуструп такую возможность дают )
......Шееф разжуй уж дураку а ну или ссылками может какими поделитесь, а? Мне что шерсить всю таблицу виртуальных функций до тех пор пока какая нибудь не вернет предположительно лист импортируемых обьектов? Или есть более легкий путь?
3)Чисто сишный вопрос причем больше теоретический.....Я вот например знаю адрес функции принадлежащий классу в длл(но не в данном случае - адрес как и длл с FillParentsList как раз неизвестен) вызываю ее без проблем(адрес длл + смещение на калькуляторе посчитал).....Но каким образом ей "обьяснить" что работу ей производить именно с этим экземпляром класса, а не со 2м 3м и т.д.? Туда указатель на this передать как входой параметр? Да и вообще это не "тупиковый" вариант?
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: CATSafeArrayVariant

Сообщение booSter » 02 мар 2009 12:24

  1. Artem писал(а):Где мне найти реализацию виртуальных FillParentsList/FillChildrenList?

    Последний релиз где не-PublicInterfaces присутствовали в виде хидеров (CAT*.h) был R14. Если найдёшь CAA от R14, то с большой вероятностью и хидер интерфейса CATIParentChildren вместе с ним...
    По поводу конструкторов\деструкторов (и прочего "мусора"). Если в объявлении класса не присутствует __declspec(novtable) и явным образом не присутствуют конструктор \ конструктор копирования \ оператор присвоения (как оно, собственно, и есть в CAA), то компилятор M$VS вставит оные сам с реализацией по умолчанию, и поскольку класс экспортируемый (ExportedByXxxYyyZzz => __declspec(dllexport)), то весь этот мусор и торчит в таблице экспорта.
  2. Artem писал(а):Опять блин ProtectedInterfaces...

    Предположим, есть не-PublicInterfaces CAA-интерфейс CATIXxxYyyZzz объявленный как:
    Код: Выделить всё
    class ExportedByXxxYyyZzz CATIXxxYyyZzz : public CATBaseUnknown
    {
        CATDeclareInterface;
        public:
            virtual HRESULT MyFoo(const CATUnicodeString & iusStrParam) = 0;
    };

    Использовать напрямую нельзя, RADE ругается...
    Но это можно вылечить так:
    Код: Выделить всё
    ...
    #include "CATIXxxYyyZzz.h"
    ...
    typedef HRESULT ( CATBaseUnknown::* my_foo_t ) ( const CATUnicodeString & );
    ...
    CATBaseUnknown * piUnknown = ...
    ...
    CATBaseUnknown * piUnkOnXxxYyyZzz = piUnknown->QueryInterface ( "CATIXxxYyyZzz" ); // see CATBaseUnknown.h
    if ( NULL != piUnkOnXxxYyyZzz  )
    {
        my_foo_t pmfMyFoo = (my_foo_t) &CATIXxxYyyZzz::MyFoo;
        CATUnicodeString usMyFooParam = "This is a test";
        HRESULT hr = (piUnkOnXxxYyyZzz->*pmfMyFoo) ( usMyFooParam );
        ...
    }
    ...

    При таком раскладе RADE-проверяльщик "не видит" попытку вызова CATIXxxYyyZzz.MyFoo ;)

  3. *this передается 1-ым
Сделаешь доброе дело за деньги - скажут спасибо,
Сделаешь бесплатно - сядут на шею...
©пёрто
Аватара пользователя
booSter
Moderator
 
Сообщения: 227
Images: 15
Зарегистрирован: 09 фев 2008 16:48
Откуда: Minsk

Re: CATSafeArrayVariant

Сообщение Artem » 02 мар 2009 13:03

Спасибо буду пробовать!...Собстно на 14 и сижу.....Список экспорта вообще не смотрел (ибо сразу подозревал что никто "защищаемые" функции туда ставить не собирается...хотя может и ошибаюсь) а сразу дллку в айде открыл...(так что вопрос пока остается). Хмммм...а в более поздних версиях действовать по пункту №3 (Ну а чего айда есть,14 есть-(ну чтоб знать где примерно искать)-имеется или нет функция в экспорте - плевать, посчитал смещение и прям по адресу вызывать)?
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: CATSafeArrayVariant

Сообщение booSter » 02 мар 2009 13:34

IDA-Pro - вещь полезная, но для данного конкретного случая вполне достаточно утилитки depends из комплекта M$VS.
Самая последняя версия dependsтута...
Сделаешь доброе дело за деньги - скажут спасибо,
Сделаешь бесплатно - сядут на шею...
©пёрто
Аватара пользователя
booSter
Moderator
 
Сообщения: 227
Images: 15
Зарегистрирован: 09 фев 2008 16:48
Откуда: Minsk

Re: CATSafeArrayVariant

Сообщение Artem » 02 мар 2009 14:22

Ну что IDA что depends - все равно не находят они ничего (кроме опять таки констуктора/деструктора...)..Правильно было бы cnext запустить в ollydbg и вся подноготная бы вышла наружу.....Но опыта работы с этим направлением почти нет...Так что просто посмотрю по адресу принадлежат или нет эти функции данной длл и где они собст-но в ней находятся...
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14


Вернуться в CAA-RADE

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7