после FrmActivate некорректно работает selection.search

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

после FrmActivate некорректно работает selection.search

Сообщение Artem » 20 апр 2012 13:46

Хочу активировать главную сборку - Собсно код
Код: Выделить всё
AppActivate "CATIA V5"
SendKeys "c:" & "FrmActivate" & Chr(13), True
DoEvents
Dim productDocument1 As ProductDocument
Set productDocument1 = CATIA.ActiveDocument

Dim selection1 As Selection
Set selection1 = productDocument1.Selection
selection1.Clear
On Error Resume Next
selection1.Search "(CATPipSearch.PltShpPhysical),all"
Err.Clear
selection1.Search "(CATPipSearch.PltShpPhysical.Name='Additional'),all"

Сборка активируется и проходит первый selection, а на втором
errr.JPG
errr.JPG (9.64 КБ) Просмотров: 20451
Собсно если ручками вызвать c:FrmActivate тоже самое начинается - если не вызывать строчки проходят спокойно(т.е. синтаксис search корректен в обоих случаях)
В общем -селекшн воообще не любит вызов команд из строки -проверил на с:Activate - при вызове startcommand никаких вопросов...но стоит один раз вызвать c:Activate - появились те же самые проблемы!...к сожалению startcommand + FrmActivate проходит без ошибки, но отрабатывает некорректно :-(
http://www-01.ibm.com/support/docview.w ... wg1HD59319 -видимо из-за 16 версии все беды...(написано что в 18 пофиксили...)
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: после FrmActivate некорректно работает selection.search

Сообщение Wireless_Fidelity » 20 апр 2012 15:58

Здравствуйте.

Попробуйте искать не через CATPipSearch, а через 'Piping Design', если, конечно, это возможно в R16. Ну а так придётся ждать перехода на R18.

Кстати говоря, FrmActivate это недокументированная команда, поэтому "она использоваться не должна" (с) Дасо. Так что лучше с ней поосторожнее ;) Если что, активировать продукт/парт можно другими способами.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: после FrmActivate некорректно работает selection.search

Сообщение Artem » 20 апр 2012 16:05

Если что, активировать продукт/парт можно другими способами.
Каак? Как заставить "ПОСИНЕТЬ"(кажется current если по литературному) а не только "ЗАОРАНЖЕВЕТЬ"(active офиц. языком - тоже не уверен) верхнюю сборку?? Команда приведена для примера -на примитивном поиске продукта по имени, сыпется с этой же ошибкой -так не пойдет...
Последний раз редактировалось Artem 20 апр 2012 16:19, всего редактировалось 3 раз(а).
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: после FrmActivate некорректно работает selection.search

Сообщение Artem » 20 апр 2012 16:07

Код: Выделить всё
productDocument1.Selection.Clear
productDocument1.Selection.Add productDocument1.Product
productDocument1.Activate
CATIA.StartCommand "FrmActivate"
If CATIA.GetWorkbenchId = "Assembly" Then CATIA.StartWorkbench ("CATPipConfiguration") Else CATIA.StartWorkbench ("Assembly")'Чтоб не было окошка за новую сборку
CATIA.StartCommand "FrmActivate"
If CATIA.GetWorkbenchId = "Assembly" Then CATIA.StartWorkbench ("CATPipConfiguration") Else CATIA.StartWorkbench ("Assembly")
If CATIA.GetWorkbenchId = "CATPipConfiguration" Then CATIA.StartWorkbench ("Assembly")

- вот это более менее решило проблему - что бы ни было активным до, после этого - активная/текущая верхняя сборка. Если у вас другой вариант было бы очень интересно его узнать...
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: после FrmActivate некорректно работает selection.search

Сообщение Wireless_Fidelity » 20 апр 2012 16:42

Я писал об этом на COE (читайте вторую страницу темы): http://www.coe.org/p/fo/st/topic=113&post=33424#p33424

Вкратце, активировать "дочерние" продукты можно переключением workbench'ей, как Вы и написали, а для корневого продукта надо использовать WinAPI, посылая ему WM_COMMAND.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: после FrmActivate некорректно работает selection.search

Сообщение Artem » 20 апр 2012 16:52

Спасибо, но сое сейчас требует регистрацию, вот это тоже самое? - http://www.coe.org/p/fo/et/thread=12279... Корневой -самый верхний? В принципе переключение воркбенчей и для него сработало ,но не простое - вместе с StartCommand "FrmActivate" только...Вы работали с GetMenu? У меня GetMenuString везде нулевую длину выдал - где то я напортачил?
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: после FrmActivate некорректно работает selection.search

Сообщение Wireless_Fidelity » 20 апр 2012 17:47

Да, оно.
GetMenuString с катей не работает, нужно по порядковому номеру, который тоже не вполне ожидаемый :)
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: после FrmActivate некорректно работает selection.search

Сообщение file » 02 авг 2012 23:39

У меня, кстати, тоже GetMenuString везде нулевую длину выдает...
file
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 02 янв 2011 22:44

Re: после FrmActivate некорректно работает selection.search

Сообщение file » 04 авг 2012 12:58

Код: Выделить всё
If CATIA.GetWorkbenchId = "Assembly" Then
    CATIA.StartWorkbench ("CATPipConfiguration")
Else
    CATIA.StartWorkbench ("Assembly")
'Чтоб не было окошка за новую сборку


К сожалению в лицензию не входит Piping Design... Поиски иных модулей с поддержкой CATProduct и эффектом Piping Design не увенчались успехом... Есть ли альтернативы Piping Design для решения?
file
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 02 янв 2011 22:44

Re: после FrmActivate некорректно работает selection.search

Сообщение Wireless_Fidelity » 04 авг 2012 13:57

FTA?
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: после FrmActivate некорректно работает selection.search

Сообщение file » 04 авг 2012 14:03

FTA тоже пробовал. Пробовал: AssemblyDesign, ProductFTA, PipingDesign, StructureDesign, KnowledgeAdvisor, ProductStructure, WeldDesign.
И через API не могу найти Edit - Object - Edit...
file
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 02 янв 2011 22:44

Re: после FrmActivate некорректно работает selection.search

Сообщение Wireless_Fidelity » 04 авг 2012 14:07

Api - GetMenu и SendMessage для WM_COMMAND.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: после FrmActivate некорректно работает selection.search

Сообщение file » 04 авг 2012 14:10

Код: Выделить всё
Process[] processes = Process.GetProcessesByName("CNEXT");
if (processes.Length != 1)
    return;
IntPtr h = processes[0].MainWindowHandle;
IntPtr hMainMenu = GetMenu(h);
int cMainMenu = GetMenuItemCount(hMainMenu);

IntPtr hEdit = GetSubMenu(hMainMenu, 3);
int cEdit = GetMenuItemCount(hEdit);
IntPtr hEditObject = GetSubMenu(hEdit, cEdit - 1);
IntPtr hEditObjectEdit = GetSubMenu(hEditObject, 0);
SendMessage(h, WM_COMMAND, hEditObjectEdit, (IntPtr)0);


hEditObject и hEditObjectEdit - получаются = 0... я не могу определить порядковый номер нужных меню...
file
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 02 янв 2011 22:44

Активация компонента сборки с перемещением "синего курсора"

Сообщение file » 05 авг 2012 13:18

Кажется, я нашел решение.
Активация компонента сборки с перемещением "синего курсора" (Blue Button cursor, UI Active Object).
Реализация: C#, WinAPI.
Код: Выделить всё
public static void ActivateByBlueCursor(
    ref INFITF.AnyObject pObjectToActivate,
    ref INFITF.Document pDocumentProductOwner,
    out string pMessage)
{
    pMessage = "";
    if (pObjectToActivate == null || pDocumentProductOwner == null)
    {
        pMessage = "One of arguments is null";
        return;
    }

    // Ru: Ищем процесс CATIA V5 (WinAPI)
    // En: Define CATIA V5 process by its name CNEXT (WinAPI)
    Process[] processes = Process.GetProcessesByName("CNEXT");
    if (processes.Length != 1)
    {
        pMessage = "CNEXT not found";
        return;
    }

    // Ru: Определяем указатель на главное окно CATIA V5 (WinAPI)
    // En: Define main window handle for CATIA V5 process (WinAPI)
    IntPtr hMainWindow = processes[0].MainWindowHandle;

    // Ru: Снимаем возможное выделение объектов в документе
    // En: Remove possible selection in document
    pDocumentProductOwner.Selection.Clear();
   
    // Ru: Накладываем выделение только на компонент,
    //     предполагаемый к активации синим курсором
    // En: Select needed object to activate with
    //     'Blue Button' cursor
    pDocumentProductOwner.Selection.Add(pObjectToActivate);

    // Ru: ВНИМАНИЕ! Пауза.
    //     Без паузы есть вероятность невозможности определения
    //     меню 'Edit -> [Name] object'
    // En: ATTENTION! Pause.
    //     If no pause there is probability of wrong defining
    //     for menu 'Edit -> [Name] object'
    System.Threading.Thread.Sleep(300);

    // Ru: Определяем указатель на главное меню CATIA V5 (WinAPI)
    // En: Define main menu handle for CATIA V5 (WinAPI)
    IntPtr hMainMenu = GetMenu(hMainWindow);

    // Ru: 4 - индекс подменю 'Edit' в основном меню (WinAPI)
    // En: 4 - index of submenu 'Edit' in main menu (WinAPI)
    IntPtr hEdit = GetSubMenu(hMainMenu, 4);

    // Ru: 26 - индекс подменю '[Name] object' в 'Edit' (WinAPI)
    // En: 26 - index of submenu '[Name] object' in 'Edit' (WinAPI)
    //     'Edit -> [Name] object'
    //     It's strange, but it works stable only with const
    const int ci = 26;
    IntPtr hEditObject = GetSubMenu(hEdit, ci);

    // Ru: В случае неверного определения 'Edit -> [Name] object'
    // En: In a case of wrong defining for menu 'Edit -> [Name] object'
    if (hEditObject == (IntPtr)0)
    {
        pMessage = "'Edit -> [Name] object' menu not found";
        return;
    }

    // Ru: 0 - индекс меню 'Edit' в '[Name] object'
    //     Получаем указатель на элемент меню из подменю (WinAPI)
    // En: 0 - index of menu 'Edit' in submenu '[Name] object'
    //     Define menu 'Edit' handle (WinAPI)
    //     'Edit -> [Name] object -> Edit'
    int hEditObjectEdit = GetMenuItemID(hEditObject, 0);
    try
    {
        // Ru: Отправляем сообщение на выполнение команды меню (WinAPI)
        // En: Send message WM_COMMAND for execute command (WinAPI)
        //     'Edit -> [Name] object -> Edit'
        SendMessage(hMainWindow, WM_COMMAND, (IntPtr)hEditObjectEdit, (IntPtr)0);
        INFITF.Application appl = pDocumentProductOwner.Application;
        pMessage = "OK";
    }
    catch(Exception ex)
    {
        pMessage = ex.Message;
        return;
    }
}

Необходимые сигнатуры WinAPI для C#
Код: Выделить всё
[DllImport("user32.dll")]
static extern IntPtr GetMenu(IntPtr hWnd);

[DllImport("user32.dll")]
private static extern IntPtr GetSubMenu(IntPtr hMenu, int nPos);

[DllImport("user32.dll")]
static extern int GetMenuItemID(IntPtr hMenu, int nPos);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

internal const UInt32 WM_COMMAND = 0x0111;
Последний раз редактировалось file 05 авг 2012 13:28, всего редактировалось 1 раз.
file
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 02 янв 2011 22:44

Re: после FrmActivate некорректно работает selection.search

Сообщение Wireless_Fidelity » 05 авг 2012 13:25

Последовательность такая:
1.GetMenu для окна
2. Два GetSubMenu для подменю Edit и Object
3. Получение id для команды Edit object через GetMenuItemId
4. Отсылка WM_COMMAND окну с использованием id.

Есть тонкости.
Номер меню не слвпадает с порядковым номером на экране. Если окно документа развернуто (maximized), то в главном меню появляется еще один пункт с иконкой CATIA. Он как бы добавляет несколько виртуальных меню. Поэтому следует делать соответствующую проверку и считать меню не сначала, а с конца.
Кроме того, нужно реализовать грамотную задержку между выбором объекта и доступом к команде Edit-Object-Edit, т.к. последняя появляется в меню не сразу.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: после FrmActivate некорректно работает selection.search

Сообщение file » 05 авг 2012 13:29

Да, про паузу я сообразил :) Жесткая задача... Хм, действительно, меню 'Edit' находится по другому индексу основного меню в случае если окно сборки не развернуто максимально относительно окна приложения...
file
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 02 янв 2011 22:44

Re: после FrmActivate некорректно работает selection.search

Сообщение file » 07 авг 2012 16:54

В продолжении темы еще вопрос.
А как узнать какой объект активирован синим курсором Blue Button (UI Active object)?
file
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 02 янв 2011 22:44

Re: после FrmActivate некорректно работает selection.search

Сообщение Wireless_Fidelity » 07 авг 2012 19:19

А вот это задача на сообразительность :)
Там же на COE товарищ из Греции предложил решение с Search'ем.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: после FrmActivate некорректно работает selection.search

Сообщение file » 07 авг 2012 19:27

чет с доступом к COE какие-то непонятности... (
file
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 02 янв 2011 22:44

Re: после FrmActivate некорректно работает selection.search

Сообщение Wireless_Fidelity » 07 авг 2012 23:01

Попробуйте задавать разные области поиска (scope) и посмотрите, что вылезает первым результатом.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: после FrmActivate некорректно работает selection.search

Сообщение Artem » 27 авг 2014 15:54

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

Re: после FrmActivate некорректно работает selection.search

Сообщение Wireless_Fidelity » 01 сен 2014 18:01

Там мрак какой-то, даже через MENUITEMINFO не работает. Вызывал из внешнего. NET, выделяя память.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11


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

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

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

cron