CATICutAndPastable

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

CATICutAndPastable

Сообщение snezhinka » 27 окт 2010 18:52

Есть 2 продукта. Один пустой со следующей структурой
Product1
|_____Product2

Второй содержит парт:
Product11
|_____Part1


Нужно Part1 сразу вставить в Product1, а затем в Product2. Используя CATICutAndPastable в Product1 вставляется парт без проблем, а когда его затем пытаюсь вставить в Product2 вылетает Click Ok To Terminate на методе CATICutAndPastable::Paste.
Если сразу вставить парт в Product2, а затем в рутовский продукт Product1, то все OK. В чем причина может быть?
Аватара пользователя
snezhinka
Новичок
Новичок
 
Сообщения: 22
Зарегистрирован: 20 май 2008 11:10
Откуда: Минск

Re: CATICutAndPastable

Сообщение booSter » 28 окт 2010 12:19

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

Re: CATICutAndPastable

Сообщение snezhinka » 28 окт 2010 14:45

Открыта катька и в ней есть пустой продукт, в котором еще один пустой продукт. Нажимаем кнопку в нашей панели, открывается наш диалог, в котором выбираем какую-то сборку и нажимаем ОК. По ОК из выбранной сборки выгребаются все инстансы партов(их нам и надо вставить в продукт, который сейчас активен в дереве). Метод выглядит так:
Spoiler :
Код: Выделить всё
HRESULT CopyPasteInstances
(
 CATDocument* ipSourceDoc,  //отсюда мы копируем
 CATDocument* iopTargetDoc, //сюда вставляем
 const CATListValCATBaseUnknown_var& ilspInstancesToCopy,
 CATListValCATBaseUnknown_var& olspPastedInstances,
 CATPathElement * ipTargetPath
 )
{

    HRESULT hr = CATReturnSuccess;
    do
    {
        // get source product container
        CATICutAndPastable_var spSourceCCP = NULL_var;
        CATInit_var spSourceInit = ipSourceDoc;
        if (!!spSourceInit)
        {
            CATBaseUnknown* pSourceContainer = spSourceInit->GetRootContainer("CATIContainer");
            if (NULL != pSourceContainer)
            {
                spSourceCCP = pSourceContainer;
                pSourceContainer->Release();
                pSourceContainer = NULL;
            }
        }

        // get target root product and product container
        CATICutAndPastable_var spTargetCCP = NULL_var;
        CATInit_var spTargetInit = iopTargetDoc;
        if (!!spTargetInit)
        {
            CATBaseUnknown* pTargetContainer = spTargetInit->GetRootContainer("CATIContainer");
            if (NULL != pTargetContainer)
            {
                spTargetCCP = pTargetContainer;
                pTargetContainer->Release();
                pTargetContainer = NULL;
            }
        }       

        CATIProduct_var spTargetRootProduct = GetRootProduct(iopTargetDoc); 

        //get copy format
        CATUnicodeString usFormat = "CATProdCont";
        const CATFormat *pFormat = ::SpecBindNativeFormat(usFormat);
     
        CATListValCATBaseUnknown_var lspBUknNewListToCopy;

        // Prepare objects to copy
        int nRes = spSourceCCP->BoundaryExtract(lspBUknNewListToCopy, &ilspInstancesToCopy, pFormat);
        if (nRes == 0)
        {
             break;
        }

        // Copy objects to the clipboard container       
        CATBaseUnknown_var spClipboardCont = spSourceCCP->Extract(lspBUknNewListToCopy, pFormat);
        if (!spClipboardCont)
        {
            break;
        }
        CATICutAndPastable_var spCCPOnExtractedList = spClipboardCont;
        if (!spCCPOnExtractedList)
        {
             break;
        }

        // Extract the objects from the clipboard container.  Note that the second argument
        // must be NULL in order to extract all of the objects from the clipboard.
        CATListValCATBaseUnknown_var lspBUknExtractedListToCopy;
        nRes = spCCPOnExtractedList->BoundaryExtract(lspBUknExtractedListToCopy, NULL, pFormat);
        if (nRes == 0)
        {
            break;
        }

        // Paste the objects extracted from the clipboard container to the target container
        CATLISTV(CATBaseUnknown_var) listTargets;
        if(!ipTargetPath)
        {
            CATPathElement * pPathTarget = new CATPathElement(spTargetRootProduct);
            if (NULL == pPathTarget)
            {
                // Internal error. Failed to build CATPathElement on target product.
                break;
            }
            listTargets.Append(pPathTarget);
            pPathTarget->Release();
            pPathTarget = NULL;
        }
        else
        {
            listTargets.Append(ipTargetPath);
        }

        olspPastedInstances = spTargetCCP->Paste(lspBUknExtractedListToCopy, &listTargets, pFormat);
        if (olspPastedInstances.Size() == 0)
        {
            break;
        }     
    }
    while(0);
    return hr;
}

Для того, чтобы вставить в другой продукт, мы его должны активировать в дереве, а потом та же последовательность действий: нажимаем кнопку, выбираме сборку и вставляем.


спрятал код под "спойлер", чтобы не загромождать топик
booSter
Аватара пользователя
snezhinka
Новичок
Новичок
 
Сообщения: 22
Зарегистрирован: 20 май 2008 11:10
Откуда: Минск

Re: CATICutAndPastable

Сообщение booSter » 28 окт 2010 15:50

Попробуй CATPathElement не через конструктор набивать, а вручную: инстанцируй пустой, а потом набей используя AddChildElement. Ещё можно сервис CATIBuildPath попробовать.

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

Re: CATICutAndPastable

Сообщение snezhinka » 28 окт 2010 16:20

В моем случае всегда входящий пас элемент не пустой, поэтому у меня не создается он, а берется входящий, а входящий берется отсюда CATFrmEditor::GetUIActiveObject()
Аватара пользователя
snezhinka
Новичок
Новичок
 
Сообщения: 22
Зарегистрирован: 20 май 2008 11:10
Откуда: Минск

Re: CATICutAndPastable

Сообщение snezhinka » 19 ноя 2010 02:56

Причина оказалась не в Paste, а в использовании утилит от заказчика. Что-то они не хорошее творили, что потом Paste валился.
Аватара пользователя
snezhinka
Новичок
Новичок
 
Сообщения: 22
Зарегистрирован: 20 май 2008 11:10
Откуда: Минск

Re: CATICutAndPastable

Сообщение booSter » 19 ноя 2010 12:03

Есть много разных способов завязать КАТИЙ-ный рантайм в "кренделёчек"... :)

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

Re: CATICutAndPastable

Сообщение snezhinka » 23 ноя 2010 17:44

Там забавно получается, утилиты выдают error, его можно получить через CATGetLastError. И вот в случае, если мы хотим сделать Paste в subProduct после Paste в рутовский продукт, то получаем Click Ok to terminate, если перед Paste вызвать CATCleanLastError, то все пройдет нормально.
Аватара пользователя
snezhinka
Новичок
Новичок
 
Сообщения: 22
Зарегистрирован: 20 май 2008 11:10
Откуда: Минск


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

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

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