Sample code:
in this code _pRootDoc points to xxx.CATProduct
_pActiveDoc points to yyy.CATProduct and_spInstProd is the CATIProduct_var for the instance Child product.1
_UtilityRtns.GetRootProduct uses the normal method to get the root product.
_UtilityRtns.UpdateProduct creates a CATCreate notification for the products father.
_UtilityRtns.SendModifyNotice creates a CATModify notification.
_UtilityRtns.RedrawSpecTree performs the Redraw using CATIRedrawEvent.

// open the CATPart or CATProduct to be imported
CATDocument *pPartDoc = NULL;
rc = CATDocumentServices::Open(LPath,pPartDoc);
if (SUCCEEDED(rc) && pPartDoc != NULL)
{
// get the root product of the main document
CATIProduct *pRootProduct = _UtilityRtns.GetRootProduct(_pRootDoc);

// get the root product of the active document
CATIProduct *pActiveProduct = _UtilityRtns.GetRootProduct(_pActiveDoc);

// get the root product of the new instance
CATIProduct *pExtProduct = _UtilityRtns.GetRootProduct(pPartDoc);

This code may also do too many operations but it works and it doesn’t process every child under the root product.
I hope that this helps
Bob
Original message :
I solved the problem, calling the CATIProduct::GetAllChildren() from the root product, and applying the CATIRedrawEvent::Redraw() to all the elements of the result, so that it executes a CATIRedrawEvent::Redraw() for each product of the tree. It works, but i perform this operation several times, and it is unefficient. I could also change slightly the program so that i call that operation only when needed, maybe only on that part of the tree that is changed, but i would like to avoid it. I didn’t really understand your solution. Do you have a piece of code to show me? Thanks a lot dario