/*********************************************************************************************************************** * * Copyright (c) 2010 - 2025 by Tech Soft 3D, Inc. * The information contained herein is confidential and proprietary to Tech Soft 3D, Inc., and considered a trade secret * as defined under civil and criminal statutes. Tech Soft 3D shall pursue its civil and criminal remedies in the event * of unauthorized use or misappropriation of its trade secrets. Use of this information by anyone other than authorized * employees of Tech Soft 3D, Inc. is granted only under a written non-disclosure agreement, expressly prescribing the * scope and manner of such use. * ***********************************************************************************************************************/ /** \file TreeConnector.cpp This file contains fuctionalities to traverse a Prc Model Tree ***********************************************************************************************************************/ #include "TreeTraverse.h" #include "VisitorContainer.h" /************************************************************************************ Traverse Model File *************************************************************************************/ // Traverse all the model tree A3DStatus A3DModelFileConnector::Traverse(A3DVisitorContainer* psVisitor, bool bVisitPrototype) { unsigned int uI; psVisitor->visitEnter(*this); for (uI = 0; uI < m_sModelFileData.m_uiPOccurrencesSize; uI++) { psVisitor->SetCurrentPoFather(NULL); A3DProductOccurrenceConnector sTreeConnector(m_sModelFileData.m_ppPOccurrences[uI]); if (sTreeConnector.TraversePO(psVisitor, bVisitPrototype) != A3D_SUCCESS) return A3D_ERROR; } psVisitor->visitLeave(*this); return A3D_SUCCESS; } // Traversing the assembly Structure A3DStatus A3DProductOccurrenceConnector::TraversePO(A3DVisitorContainer* psVisitor, bool bVisitPrototype) { A3DStatus iRet = A3D_SUCCESS; CHECK_RET(psVisitor->visitEnter(*this)); if (m_sProductOccurrenceData.m_pPrototype != nullptr || m_sProductOccurrenceData.m_pExternalData != nullptr) { A3DAsmProductOccurrence* pPo = m_sProductOccurrenceData.m_pPrototype ? m_sProductOccurrenceData.m_pPrototype : m_sProductOccurrenceData.m_pExternalData; A3DProductOccurrenceConnector oPoConnector(pPo); oPoConnector.TraversePO(psVisitor, bVisitPrototype); } else { for (A3DUns32 i = 0; i < m_sProductOccurrenceData.m_uiPOccurrencesSize; i++) { A3DAsmProductOccurrence* pPo = m_sProductOccurrenceData.m_ppPOccurrences[i]; A3DProductOccurrenceConnector oPoConnector(pPo); oPoConnector.TraversePO(psVisitor, bVisitPrototype); } for (A3DUns32 i = 0; i < m_sProductOccurrenceData.m_uiFeatureBasedEntitiesSize; i++) { A3DFRMTreeConnector sConnector(m_sProductOccurrenceData.m_ppFeatureBasedEntities[i]); sConnector.TraverseFeatureTree(psVisitor); } } CHECK_RET(psVisitor->visitLeave(*this)); return A3D_SUCCESS; } A3DStatus A3DRiConnector::TraverseRi(A3DVisitorContainer* psVisitor) { A3DStatus iRet = A3D_SUCCESS; psVisitor->visitEnter(*this); const A3DEntity* pRi = GetA3DEntity(); A3DEEntityType eType = kA3DTypeUnknown; CALL_A3D_FCTION(A3DEntityGetType,(pRi,&eType)); if (iRet == A3D_SUCCESS) { switch (eType) { case kA3DTypeRiBrepModel: { A3DRiBrepModelConnector sConnector((A3DRiBrepModel*)pRi); CHECK_RET(sConnector.TraverseRiBrepModel(psVisitor)); break; } case kA3DTypeRiSet: { A3DRiSetConnector sConnector(static_cast(pRi)); CHECK_RET(sConnector.TraverseRiSet(psVisitor)); break; } case kA3DTypeRiCurve: { A3DRiCurveConnector sConnector((A3DRiCurve*)pRi); CHECK_RET(sConnector.TraverseRiCurve(psVisitor)); break; } case kA3DTypeRiPointSet: case kA3DTypeRiDirection: case kA3DTypeRiCoordinateSystem: case kA3DTypeRiPlane: break; case kA3DTypeRiPolyBrepModel: { A3DPolyRiBrepModelConnector sConnector((A3DRiPolyBrepModel*)pRi); CHECK_RET(sConnector.TraverseRiPolyBrepModel(psVisitor)); break; } case kA3DTypeRiPolyWire: { A3DRiPolyWireConnector sConnector((A3DRiPolyWire*)pRi); CHECK_RET(sConnector.TraverseRiPolyWire(psVisitor)); break; } default: iRet = A3D_NOT_IMPLEMENTED; break; } } psVisitor->visitLeave(*this); return A3D_SUCCESS; } // RiBrepModel A3DStatus A3DRiBrepModelConnector::TraverseRiBrepModel(A3DVisitorContainer* psVisitor) const { A3DStatus iRet = A3D_SUCCESS; CHECK_RET(psVisitor->visitEnter(*this)); //Traverse Mesh #ifdef CONNECT_MESH A3DRiRepresentationItemData sRidata; A3D_INITIALIZE_DATA(A3DRiRepresentationItemData, sRidata); CHECK_RET_CALL_A3D_FCTION(A3DRiRepresentationItemGet,(this->GetA3DEntity(), &sRidata)); A3DTessDataConnector sTessConnector((A3DTess3D*)sRidata.m_pTessBase); CHECK_RET(sTessConnector.Traverse(psVisitor)); CHECK_RET_CALL_A3D_FCTION(A3DRiRepresentationItemGet,(NULL, &sRidata)); #endif //Traverse Brep Data #ifdef CONNECT_BREP A3DBrepDataConnector sTopoConnector(m_sRiBrepModelData.m_pBrepData); CHECK_RET(sTopoConnector.Traverse(psVisitor)); #endif CHECK_RET(psVisitor->visitLeave(*this)); return iRet; } // RiSet A3DStatus A3DRiSetConnector::TraverseRiSet(A3DVisitorContainer* psVisitor) { A3DStatus iRet = A3D_SUCCESS; CHECK_RET(psVisitor->visitEnter(*this)); unsigned uI; for (uI = 0; uI < m_sRiSetData.m_uiRepItemsSize; uI++) { A3DRiConnector sRiConnector(m_sRiSetData.m_ppRepItems[uI]); sRiConnector.TraverseRi(psVisitor); } CHECK_RET(psVisitor->visitLeave(*this)); return iRet; } // RiPolyBrepModel A3DStatus A3DPolyRiBrepModelConnector::TraverseRiPolyBrepModel(A3DVisitorContainer* psVisitor) const { A3DStatus iRet = A3D_SUCCESS; CHECK_RET(psVisitor->visitEnter(*this)); /* A3DRiRepresentationItemData sRiData; A3D_INITIALIZE_DATA(A3DRiRepresentationItemData, sRiData); CHECK_RET_CALL_A3D_FCTION(A3DRiRepresentationItemGet,(this->GetA3DEntity(), &sRiData)); A3DTessDataConnector sTessConnector((A3DTess3D*)sRiData.m_pTessBase); CHECK_RET(sTessConnector.Traverse(psVisitor)); CHECK_RET_CALL_A3D_FCTION(A3DRiRepresentationItemGet,(NULL, &sRiData)); */ CHECK_RET(psVisitor->visitLeave(*this)); return iRet; } /////////////////////////////////////////////////////////////////////////////////////// // RiCurve /////////////////////////////////////////////////////////////////////////////////////// A3DStatus A3DRiCurveConnector::TraverseRiCurve(A3DVisitorContainer* psVisitor) { A3DStatus iRet = A3D_SUCCESS; CHECK_RET(psVisitor->visitEnter(*this)); #ifdef CONNECT_MESH A3DRiRepresentationItemData sRidata; A3D_INITIALIZE_DATA(A3DRiRepresentationItemData, sRidata); CHECK_RET(A3DRiRepresentationItemGet(this->GetA3DEntity(), &sRidata)); A3DWireTessDataConnector sWireTessConnector((A3DTess3DWire*)sRidata.m_pTessBase); CHECK_RET(sWireTessConnector.Traverse(psVisitor)); CHECK_RET(A3DRiRepresentationItemGet(NULL, &sRidata)); #endif CHECK_RET(psVisitor->visitLeave(*this)); return iRet; } /////////////////////////////////////////////////////////////////////////////////////// // RiPolyWire /////////////////////////////////////////////////////////////////////////////////////// A3DStatus A3DRiPolyWireConnector::TraverseRiPolyWire(A3DVisitorContainer* psVisitor) { A3DStatus iRet = A3D_SUCCESS; CHECK_RET(psVisitor->visitEnter(*this)); #ifdef CONNECT_MESH A3DRiRepresentationItemData sRidata; A3D_INITIALIZE_DATA(A3DRiRepresentationItemData, sRidata); CHECK_RET(A3DRiRepresentationItemGet(this->GetA3DEntity(), &sRidata)); A3DWireTessDataConnector sWireTessConnector((A3DTess3DWire*)sRidata.m_pTessBase); CHECK_RET(sWireTessConnector.Traverse(psVisitor)); CHECK_RET(A3DRiRepresentationItemGet(NULL, &sRidata)); #endif CHECK_RET(psVisitor->visitLeave(*this)); return iRet; } // A3DFRMParameter A3DStatus A3DFRMFeatureConnector::TraverseFeature(A3DVisitorContainer* psVisitor) const { A3DStatus iRet = A3D_SUCCESS; CHECK_RET(psVisitor->visitEnter(*this)); unsigned uI; for (uI = 0; uI < m_sData.m_uiConnectionSize; uI++) { A3DFRMLinkedItemConnector sFeatureLinkedItemConnector(m_sData.m_ppConnections[uI]); sFeatureLinkedItemConnector.TraverseConnection(psVisitor); } for (uI = 0; uI < m_sData.m_uiParametersSize; uI++) { A3DFRMParameterConnector sParameterConnector(m_sData.m_ppParameters[uI]); sParameterConnector.TraverseParameter(psVisitor); } CHECK_RET(psVisitor->visitLeave(*this)); return iRet; } // A3DFRMParameter A3DStatus A3DFRMLinkedItemConnector::TraverseConnection(A3DVisitorContainer* psVisitor) const { A3DStatus iRet = A3D_SUCCESS; CHECK_RET(psVisitor->visitEnter(*this)); CHECK_RET(psVisitor->visitLeave(*this)); return iRet; } // A3DFRMParameter A3DStatus A3DFRMParameterConnector::TraverseParameter(A3DVisitorContainer* psVisitor) const { A3DStatus iRet = A3D_SUCCESS; CHECK_RET(psVisitor->visitEnter(*this)); unsigned uI; for (uI = 0; uI < m_sData.m_uiFeatureSize; uI++) { A3DFRMFeatureConnector sFeatureConnector(m_sData.m_ppFeatures[uI]); sFeatureConnector.TraverseFeature(psVisitor); } CHECK_RET(psVisitor->visitLeave(*this)); return iRet; } // FeatureTree A3DStatus A3DFRMTreeConnector::TraverseFeatureTree(A3DVisitorContainer* psVisitor) const { A3DStatus iRet = A3D_SUCCESS; CHECK_RET(psVisitor->visitEnter(*this)); unsigned uI; for (uI = 0; uI < m_sTreeData.m_uiIntermediateGeometriesSize; uI++) { A3DRiConnector sRiConnector(m_sTreeData.m_ppIntermediateGeometries[uI]); sRiConnector.TraverseRi(psVisitor); } for (uI = 0; uI < m_sTreeData.m_uiParametersSize; uI++) { A3DFRMParameterConnector sParameterConnector(m_sTreeData.m_ppsParameters[uI]); sParameterConnector.TraverseParameter(psVisitor); } CHECK_RET(psVisitor->visitLeave(*this)); return iRet; }