Есть 2 продукта. Один пустой со следующей структурой Product1 |_____Product2 Второй содержит парт: Product11 |_____Part1
Нужно Part1 сразу вставить в Product1, а затем в Product2. Используя CATICutAndPastable в Product1 вставляется парт без проблем, а когда его затем пытаюсь вставить в Product2 вылетает Click Ok To Terminate на методе CATICutAndPastable::Paste. Если сразу вставить парт в Product2, а затем в рутовский продукт Product1, то все OK. В чем причина может быть?
Открыта катька и в ней есть пустой продукт, в котором еще один пустой продукт. Нажимаем кнопку в нашей панели, открывается наш диалог, в котором выбираем какую-то сборку и нажимаем ОК. По ОК из выбранной сборки выгребаются все инстансы партов(их нам и надо вставить в продукт, который сейчас активен в дереве). Метод выглядит так:
// 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
Попробуй CATPathElement не через конструктор набивать, а вручную: инстанцируй пустой, а потом набей используя AddChildElement. Ещё можно сервис CATIBuildPath попробовать.
И ещё проверь, кто у тебя в "таргете": "инстанс" или "референс" продукт - могут быть нюансы
В моем случае всегда входящий пас элемент не пустой, поэтому у меня не создается он, а берется входящий, а входящий берется отсюда CATFrmEditor::GetUIActiveObject()
Там забавно получается, утилиты выдают error, его можно получить через CATGetLastError. И вот в случае, если мы хотим сделать Paste в subProduct после Paste в рутовский продукт, то получаем Click Ok to terminate, если перед Paste вызвать CATCleanLastError, то все пройдет нормально.