Files
2025-12-15 23:22:33 +08:00

322 lines
9.6 KiB
C++

/***********************************************************************************************************************
*
* 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<A3DRiSet const *>(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;
}