Есть 2 продукта. Один пустой со следующей структурой Product1 |_____Product2 Второй содержит парт: Product11 |_____Part1
Нужно Part1 сразу вставить в Product1, а затем в Product2. Используя CATICutAndPastable в Product1 вставляется парт без проблем, а когда его затем пытаюсь вставить в Product2 вылетает Click Ok To Terminate на методе CATICutAndPastable::Paste. Если сразу вставить парт в Product2, а затем в рутовский продукт Product1, то все OK. В чем причина может быть?
Re: CATICutAndPastable
Добавлено: 28 окт 2010 12:19
booSter
Опиши плз. цепочку действий поподробнее. Возможно перед тем как второй раз "пастить" нужно что-то подкрутить дополнительно
Re: CATICutAndPastable
Добавлено: 28 окт 2010 14:45
snezhinka
Открыта катька и в ней есть пустой продукт, в котором еще один пустой продукт. Нажимаем кнопку в нашей панели, открывается наш диалог, в котором выбираем какую-то сборку и нажимаем ОК. По ОК из выбранной сборки выгребаются все инстансы партов(их нам и надо вставить в продукт, который сейчас активен в дереве). Метод выглядит так:
// 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); }
Для того, чтобы вставить в другой продукт, мы его должны активировать в дереве, а потом та же последовательность действий: нажимаем кнопку, выбираме сборку и вставляем.
спрятал код под "спойлер", чтобы не загромождать топик booSter
Re: CATICutAndPastable
Добавлено: 28 окт 2010 15:50
booSter
Попробуй CATPathElement не через конструктор набивать, а вручную: инстанцируй пустой, а потом набей используя AddChildElement. Ещё можно сервис CATIBuildPath попробовать.
И ещё проверь, кто у тебя в "таргете": "инстанс" или "референс" продукт - могут быть нюансы
Re: CATICutAndPastable
Добавлено: 28 окт 2010 16:20
snezhinka
В моем случае всегда входящий пас элемент не пустой, поэтому у меня не создается он, а берется входящий, а входящий берется отсюда CATFrmEditor::GetUIActiveObject()
Re: CATICutAndPastable
Добавлено: 19 ноя 2010 02:56
snezhinka
Причина оказалась не в Paste, а в использовании утилит от заказчика. Что-то они не хорошее творили, что потом Paste валился.
Re: CATICutAndPastable
Добавлено: 19 ноя 2010 12:03
booSter
Есть много разных способов завязать КАТИЙ-ный рантайм в "кренделёчек"...
Интересно (хотя бы намёк на идею) чем можно зомбировать CCP-механизм, чтобы он начал так забавно глючить ?
Re: CATICutAndPastable
Добавлено: 23 ноя 2010 17:44
snezhinka
Там забавно получается, утилиты выдают error, его можно получить через CATGetLastError. И вот в случае, если мы хотим сделать Paste в subProduct после Paste в рутовский продукт, то получаем Click Ok to terminate, если перед Paste вызвать CATCleanLastError, то все пройдет нормально.