codice:void CSketchupReader::SceneNodeReset(CNodeImporter* pNode, ISkpEntityProvider* pEntityProvider, bool bInit) { vector<ISkpEntityProvider*>* pProvChild = new vector<ISkpEntityProvider*>(); if(bInit){ HRESULT hr = m_doc->QueryInterface(&pEntityProvider); long nElem = 0; CComPtr<ISkpComponentInstances> pInstances = NULL; pEntityProvider->get_ComponentInstances(&pInstances); pInstances->get_Count(&nElem); for(int i = 0; i < nElem; i++){ CComPtr<ISkpComponentInstance> pInstance = NULL; hr = pInstances->get_Item(i, &pInstance.p); CComPtr<ISkpComponentDefinition> pDef; pInstance->get_ComponentDefinition(&pDef); ISkpEntityProvider * pProvider = NULL; pDef->QueryInterface(__uuidof(ISkpEntityProvider), (void**) &pProvider); CNodeImporter* pNodeChild = GetChildNodeImporter(pEntityProvider,i); pProvChild->push_back(pEntityProvider); } } if(!bInit){ pProvChild = GetChildNodes(pEntityProvider); } for ( int i = 0; i < pProvChild->size(); i++) { pEntityProvider = (*pProvChild)[i]; if(GetChildNodes(pEntityProvider)->empty()){ CNodeImporter* pNodeChild = GetChildNodeImporter(pEntityProvider,i); pNode->Insert(pNodeChild); } else{ CNodeImporter* pNodeChild = GetChildNodeImporter((*pProvChild)[i],i); pNode->Insert(pNodeChild); pNode = pNodeChild; SceneNodeReset(pNode, (*pProvChild)[i], false); // ----->>>problema } } }
questa è la funzione incriminata.
il problema è col parametro pNode che deve sempre essere il padre del nodo che andro' ad aggiungere , in modo da formare un albero uguale a quello delle istanze.
ho il seguente semplice albero:
->nodo1 ->nodo2
->nodo3
all'inizio è corretto , entro in questa funzione:
perchè ho un nodo con figli ,codice:else{ CNodeImporter* pNodeChild = GetChildNodeImporter((*pProvChild)[i],i); pNode->Insert(pNodeChild); pNode = pNodeChild; SceneNodeReset(pNode, (*pProvChild)[i], false); // ----->>>problema }
poi passa qui erchè nodo2 non ha figli :
e aggiunge correttamente a nodo1 nodo2 , poi pero' sbaglio , perchè in questa chiamata a funzione:codice:if(GetChildNodes(pEntityProvider)->empty()){ CNodeImporter* pNodeChild = GetChildNodeImporter(pEntityProvider,i); pNode->Insert(pNodeChild); }
solo che dovrei aggiungerlo alla root node3 mentre va a finire che lo aggiungo a node1.codice:SceneNodeReset(pNode, (*pProvChild)[i], false); |->pnode era pnode1 e ritorna pnode1
ho provato e riprovato una soluzione ma non ci salto fuori.
ciao.

Rispondi quotando