This commit is contained in:
ninja
2025-12-15 22:06:49 +08:00
commit 2b56cf87a8
225 changed files with 63711 additions and 0 deletions

View File

@@ -0,0 +1,37 @@
/***********************************************************************************************************************
*
* Copyright (c) 2010 - 2022 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.
*
***********************************************************************************************************************/
#ifndef A3D_CONNECTOR
#define A3D_CONNECTOR
#include <stdlib.h>
#ifdef TF_A3DLIBS
# define A3DAPI_INTERNAL
#else
#include <A3DSDKIncludes.h>
#endif
class A3DConnector
{
protected:
const A3DEntity* m_pEntity;
A3DConnector(const A3DEntity* pEntity) : m_pEntity(pEntity) {}
A3DConnector() : m_pEntity(NULL) {};
public:
const A3DEntity* GetA3DEntity() const { return m_pEntity; }
virtual A3DEEntityType GetType() const { return kA3DTypeUnknown; }
};
#endif

View File

@@ -0,0 +1,576 @@
/***********************************************************************************************************************
*
* Copyright (c) 2010 - 2022 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(m_sModelFileData.m_ppPOccurrences[uI], psVisitor, bVisitPrototype) != A3D_SUCCESS)
return A3D_ERROR;
}
psVisitor->visitLeave(*this);
return A3D_SUCCESS;
}
// Traversing the assembly Structure
A3DStatus A3DProductOccurrenceConnector::TraversePO(const A3DAsmProductOccurrence* pOccurrence,
A3DVisitorContainer* psVisitor,
bool bVisitPrototype)
{
A3DStatus iRet = A3D_SUCCESS;
CHECK_RET(psVisitor->visitEnter(*this));
//Traverse AnnotationEntity
A3DUns32 uI;
#ifdef CONNECT_PMI
A3DUns32 uNbAnnotationEntity = m_sProductOccurrenceData.m_uiAnnotationsSize;
for (uI = 0; uI < uNbAnnotationEntity; uI++)
{
A3DMkpAnnotationEntityConnector sAnnotationEntityConnector(m_sProductOccurrenceData.m_ppAnnotations[uI]);
sAnnotationEntityConnector.TraverseAnnotationEntity(psVisitor);
}
if (!uNbAnnotationEntity && m_sProductOccurrenceData.m_pPrototype != NULL)
{
A3DAsmProductOccurrence* pProductPrototype = m_sProductOccurrenceData.m_pPrototype;
while (pProductPrototype)
{
A3DAsmProductOccurrenceData sProductPrototypeData;
A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, sProductPrototypeData);
CHECK_RET_CALL_A3D_FCTION(A3DAsmProductOccurrenceGet,(pProductPrototype, &sProductPrototypeData));
uNbAnnotationEntity = sProductPrototypeData.m_uiAnnotationsSize;
for (uI = 0; uI < uNbAnnotationEntity; uI++)
{
A3DMkpAnnotationEntityConnector sAnnotationEntityConnector(sProductPrototypeData.m_ppAnnotations[uI]);
sAnnotationEntityConnector.TraverseAnnotationEntity(psVisitor);
}
pProductPrototype = sProductPrototypeData.m_pPrototype;
CHECK_RET_CALL_A3D_FCTION(A3DAsmProductOccurrenceGet,(NULL, &sProductPrototypeData));
}
}
#endif
#ifdef CONNECT_VIEWS
A3DUns32 uNbView = m_sProductOccurrenceData.m_uiViewsSize;
if (!uNbView && m_sProductOccurrenceData.m_pPrototype != NULL)
{
A3DAsmProductOccurrence* pProductPrototype = m_sProductOccurrenceData.m_pPrototype;
while (pProductPrototype)
{
A3DAsmProductOccurrenceData sProductPrototypeData;
A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, sProductPrototypeData);
CHECK_RET_CALL_A3D_FCTION(A3DAsmProductOccurrenceGet,(pProductPrototype, &sProductPrototypeData));
uNbView = sProductPrototypeData.m_uiViewsSize;
for (uI = 0; uI < uNbView; uI++)
{
A3DMkpViewConnector sMkpViewConnector(sProductPrototypeData.m_ppViews[uI]);
sMkpViewConnector.TraverseView(psVisitor);
}
pProductPrototype = sProductPrototypeData.m_pPrototype;
CHECK_RET_CALL_A3D_FCTION(A3DAsmProductOccurrenceGet,(NULL, &sProductPrototypeData));
}
}
else if (uNbView)
{
for (uI = 0; uI < uNbView; uI++)
{
A3DMkpViewConnector sMkpViewConnector(m_sProductOccurrenceData.m_ppViews[uI]);
sMkpViewConnector.TraverseView(psVisitor);
}
}
#endif
#ifdef CONNECT_FEATURE
A3DUns32 uNbFeatureBasedEntity = m_sProductOccurrenceData.m_uiFeatureBasedEntitiesSize;
if (!uNbFeatureBasedEntity && m_sProductOccurrenceData.m_pPrototype != NULL)
{
A3DAsmProductOccurrence* pProductPrototype = m_sProductOccurrenceData.m_pPrototype;
while (pProductPrototype)
{
A3DAsmProductOccurrenceData sProductPrototypeData;
A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, sProductPrototypeData);
CHECK_RET(A3DAsmProductOccurrenceGet(pProductPrototype, &sProductPrototypeData));
uNbFeatureBasedEntity = sProductPrototypeData.m_uiFeatureBasedEntitiesSize;
for (uI = 0; uI < uNbFeatureBasedEntity; uI++)
{
A3DFRMTreeConnector sConnector(sProductPrototypeData.m_ppFeatureBasedEntities[uI]);
sConnector.TraverseFeatureTree(psVisitor);
}
pProductPrototype = sProductPrototypeData.m_pPrototype;
CHECK_RET(A3DAsmProductOccurrenceGet(NULL, &sProductPrototypeData));
}
}
else if (uNbFeatureBasedEntity)
{
for (uI = 0; uI < uNbFeatureBasedEntity; uI++)
{
A3DFRMTreeConnector sConnector(m_sProductOccurrenceData.m_ppFeatureBasedEntities[uI]);
sConnector.TraverseFeatureTree(psVisitor);
}
}
#endif
A3DAsmPartDefinition* pPart = NULL;
if (!bVisitPrototype)
{
CHECK_RET(GetPart(pPart));
}
else
{
pPart = m_sProductOccurrenceData.m_pPart;
}
if (pPart)
{
void * pEntityInMap = psVisitor->FindInMap(pPart);
psVisitor->SetInMap(pPart, pPart);
A3DPartConnector sPartConnector(pPart);
psVisitor->SetCurrentPoFather(pOccurrence);
sPartConnector.SetProductOccurenceFather(pOccurrence);
// if we haven't found the part in the map or if we traverse the instance
if (pEntityInMap == NULL || psVisitor->TraverseInstances())
{
CHECK_RET(sPartConnector.TraversePart(psVisitor));
}
psVisitor->SetCurrentPoFather(NULL);
}
std::vector<A3DAsmProductOccurrence*> apSons;
if (!bVisitPrototype)
{
CollectSons(apSons);
}
else
{
if (m_sProductOccurrenceData.m_pPrototype)
{
if (psVisitor->FindInMap(m_sProductOccurrenceData.m_pPrototype) == NULL)
{
psVisitor->SetInMap(m_sProductOccurrenceData.m_pPrototype, m_sProductOccurrenceData.m_pPrototype);
A3DProductOccurrenceConnector sPrototypeConnector(m_sProductOccurrenceData.m_pPrototype);
sPrototypeConnector.SetPrototypeType(true);
sPrototypeConnector.TraversePO(m_sProductOccurrenceData.m_pPrototype, psVisitor, bVisitPrototype);
}
}
if (m_sProductOccurrenceData.m_pExternalData)
{
if (psVisitor->FindInMap(m_sProductOccurrenceData.m_pExternalData) == NULL)
{
psVisitor->SetInMap(m_sProductOccurrenceData.m_pExternalData, m_sProductOccurrenceData.m_pExternalData);
A3DProductOccurrenceConnector sExternalConnector(m_sProductOccurrenceData.m_pExternalData);
sExternalConnector.SetExternalType(true);
sExternalConnector.TraversePO(m_sProductOccurrenceData.m_pExternalData, psVisitor, bVisitPrototype);
}
}
unsigned int uSize = m_sProductOccurrenceData.m_uiPOccurrencesSize;
for (uI = 0; uI < uSize; uI++)
{
apSons.push_back(m_sProductOccurrenceData.m_ppPOccurrences[uI]);
}
}
for (uI = 0; uI < apSons.size(); uI++)
{
A3DProductOccurrenceConnector sPoConnector(apSons[uI]);
sPoConnector.SetProductOccurrenceFather(this->GetA3DEntity());
psVisitor->SetCurrentPoFather(pOccurrence);
CHECK_RET(sPoConnector.TraversePO(apSons[uI], psVisitor, bVisitPrototype));
psVisitor->SetCurrentPoFather(NULL);
}
CHECK_RET(psVisitor->visitLeave(*this));
return A3D_SUCCESS;
}
A3DStatus A3DProductOccurrenceConnector::CollectSons(
std::vector<A3DAsmProductOccurrence*>& apSons) const
{
//Get Children or children on Prototype's ....Prototype's
A3DAsmProductOccurrence* pPrototype = m_sProductOccurrenceData.m_pPrototype;
A3DAsmProductOccurrence** ppPo = m_sProductOccurrenceData.m_ppPOccurrences;
unsigned int uSize = m_sProductOccurrenceData.m_uiPOccurrencesSize;
A3DStatus iRet = A3D_SUCCESS;
while (uSize == 0 && pPrototype)
{
A3DAsmProductOccurrenceData sPrototypeData;
A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, sPrototypeData);
CHECK_RET_CALL_A3D_FCTION(A3DAsmProductOccurrenceGet,(pPrototype, &sPrototypeData));
pPrototype = sPrototypeData.m_pPrototype;
uSize = sPrototypeData.m_uiPOccurrencesSize;
ppPo = sPrototypeData.m_ppPOccurrences;
CHECK_RET_CALL_A3D_FCTION(A3DAsmProductOccurrenceGet,(NULL, &sPrototypeData));
}
unsigned uI;
for (uI = 0; uI < uSize; uI++)
apSons.push_back(ppPo[uI]);
//Get Children on Externals
if (m_sProductOccurrenceData.m_pExternalData)
{
if (apSons.size() == 0)
{
A3DProductOccurrenceConnector sExternalConnector(m_sProductOccurrenceData.m_pExternalData);
CHECK_RET(sExternalConnector.CollectSons(apSons));
}
else
apSons.push_back(m_sProductOccurrenceData.m_pExternalData);
}
return A3D_SUCCESS;
}
A3DStatus A3DProductOccurrenceConnector::GetPart(
A3DAsmPartDefinition*& pPart) const
{
pPart = NULL;
A3DStatus iRet = A3D_SUCCESS;;
if (m_sProductOccurrenceData.m_pPart)
{
pPart = m_sProductOccurrenceData.m_pPart;
return A3D_SUCCESS;
}
A3DAsmProductOccurrence* pProductPrototype = m_sProductOccurrenceData.m_pPrototype;
while (pProductPrototype)
{
A3DAsmProductOccurrenceData sProductPrototypeData;
A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, sProductPrototypeData);
CHECK_RET_CALL_A3D_FCTION(A3DAsmProductOccurrenceGet,(pProductPrototype, &sProductPrototypeData));
if (sProductPrototypeData.m_pPart)
{
pPart = sProductPrototypeData.m_pPart;
CHECK_RET_CALL_A3D_FCTION(A3DAsmProductOccurrenceGet,(NULL, &sProductPrototypeData));
return A3D_SUCCESS;
}
else
pProductPrototype = sProductPrototypeData.m_pPrototype;
CHECK_RET_CALL_A3D_FCTION(A3DAsmProductOccurrenceGet,(NULL, &sProductPrototypeData));
}
if (m_sProductOccurrenceData.m_uiPOccurrencesSize == 0)
{
if (m_sProductOccurrenceData.m_pExternalData)
{
A3DProductOccurrenceConnector sExternalconnector(m_sProductOccurrenceData.m_pExternalData);
CHECK_RET(sExternalconnector.GetPart(pPart));
}
}
return A3D_SUCCESS;
}
A3DStatus A3DPartConnector::TraversePart(A3DVisitorContainer* psVisitor) const
{
A3DStatus iRet = A3D_SUCCESS;
CHECK_RET(psVisitor->visitEnter(*this));
//Traverse AnnotationEntity
A3DUns32 uI;
#ifdef CONNECT_PMI
A3DUns32 uNbAnnotationEntity = m_sPartData.m_uiAnnotationsSize;
for (uI = 0; uI < uNbAnnotationEntity; uI++)
{
A3DMkpAnnotationEntityConnector sAnnotationEntityConnector(m_sPartData.m_ppAnnotations[uI]);
sAnnotationEntityConnector.TraverseAnnotationEntity(psVisitor);
}
#endif
#ifdef CONNECT_VIEWS
A3DUns32 uNbView = m_sPartData.m_uiViewsSize;
for (uI = 0; uI < uNbView; uI++)
{
A3DMkpViewConnector sMkpViewConnector(m_sPartData.m_ppViews[uI]);
sMkpViewConnector.TraverseView(psVisitor);
}
#endif
//Traverse RI
for (uI = 0; uI < m_sPartData.m_uiRepItemsSize; uI++)
{
A3DRiConnector sRiConnector(m_sPartData.m_ppRepItems[uI]);
sRiConnector.TraverseRi(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;
}

View File

@@ -0,0 +1,364 @@
/***********************************************************************************************************************
*
* Copyright (c) 2010 - 2022 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.
*
***********************************************************************************************************************/
#ifndef A3D_TREE_CONNECTOR
#define A3D_TREE_CONNECTOR
#include <vector>
#include "Connector.h"
//######################################################################################################################
class A3DVisitorContainer;
class A3DModelFileConnector : public A3DConnector
{
public:
A3DModelFileConnector(const A3DAsmModelFile* pModelFile) : A3DConnector(pModelFile)
{
A3D_INITIALIZE_DATA(A3DAsmModelFileData, m_sModelFileData);
A3DAsmModelFileGet(pModelFile, &m_sModelFileData);
}
~A3DModelFileConnector() { A3DAsmModelFileGet(NULL, &m_sModelFileData); }
A3DStatus Traverse(A3DVisitorContainer* psVisitor, bool bVisitPrototype = false);
public:
A3DAsmModelFileData m_sModelFileData;
};
//######################################################################################################################
class A3DProductOccurrenceConnector : public A3DConnector
{
friend class A3DModelFileConnector;
const A3DAsmProductOccurrence* m_pFather;
bool m_bIsInstanciated;
bool m_bIsPrototype;
bool m_bIsExternal;
private:
A3DProductOccurrenceConnector(const A3DAsmProductOccurrence* pProductOccurrence)
: A3DConnector(pProductOccurrence)
{
m_pFather = NULL;
m_bIsInstanciated = false;
A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, m_sProductOccurrenceData);
A3DAsmProductOccurrenceGet(pProductOccurrence, &m_sProductOccurrenceData);
m_bIsPrototype = false;
m_bIsExternal = false;
}
~A3DProductOccurrenceConnector() { A3DAsmProductOccurrenceGet(NULL, &m_sProductOccurrenceData); }
A3DStatus TraversePO(const A3DAsmProductOccurrence* pOccurrence, A3DVisitorContainer* psVisitor, bool bVisitPrototype = false);
void SetProductOccurrenceFather(const A3DAsmProductOccurrence* pFather) { m_pFather = pFather; }
public:
A3DStatus GetPart(A3DAsmPartDefinition*& pPart) const;
A3DStatus CollectSons(std::vector<A3DAsmProductOccurrence*>& apSons) const;
A3DAsmProductOccurrenceData m_sProductOccurrenceData;
const A3DAsmProductOccurrence* GetProductOccurrenceFather() { return m_pFather; }
void SetIsInstanciated(bool bIsInstanciated) { m_bIsInstanciated = bIsInstanciated; }
bool IsInstanciated() { return m_bIsInstanciated; }
void SetPrototypeType(bool bIsPrototype) { m_bIsPrototype = bIsPrototype; }
bool IsProtoType() const { return m_bIsPrototype; }
void SetExternalType(bool bIsExternal) { m_bIsExternal = bIsExternal; }
bool IsExternal() const { return m_bIsExternal; }
};
//######################################################################################################################
class A3DPartConnector : public A3DConnector
{
friend class A3DProductOccurrenceConnector;
const A3DAsmProductOccurrence* m_pFather;
bool m_bIsInstanciated;
private:
A3DPartConnector(const A3DAsmPartDefinition *pPart) : A3DConnector(pPart)
{
m_pFather = NULL;
m_bIsInstanciated = false;
A3D_INITIALIZE_DATA(A3DAsmPartDefinitionData, m_sPartData);
A3DAsmPartDefinitionGet(pPart, &m_sPartData);
}
~A3DPartConnector()
{
A3DAsmPartDefinitionGet(NULL, &m_sPartData);
}
void SetProductOccurenceFather(const A3DAsmProductOccurrence* pFather) { m_pFather = pFather; }
public:
A3DStatus TraversePart(A3DVisitorContainer* psVisitor) const;
A3DAsmPartDefinitionData m_sPartData;
const A3DAsmProductOccurrence* GetProductOccurenceFather() { return m_pFather; }
void SetIsInstanciated(bool bIsInstanciated) { m_bIsInstanciated = bIsInstanciated; }
bool IsInstanciated() { return m_bIsInstanciated; }
};
//######################################################################################################################
class A3DRiConnector : public A3DConnector
{
friend class A3DPartConnector;
friend class A3DRiSetConnector;
bool m_bIsInstanciated;
public:
A3DRiConnector(const A3DRiRepresentationItem *pRi) : A3DConnector(pRi)
{
m_bIsInstanciated = false;
A3D_INITIALIZE_DATA(A3DRiRepresentationItemData, m_sRiData);
A3DRiRepresentationItemGet(pRi, &m_sRiData);
}
~A3DRiConnector()
{
A3DRiRepresentationItemGet(NULL, &m_sRiData);
}
A3DStatus TraverseRi(A3DVisitorContainer* psVisitor);
public:
A3DRiRepresentationItemData m_sRiData;
void SetIsInstanciated(bool bIsInstanciated) { m_bIsInstanciated = bIsInstanciated; }
bool IsInstanciated() { return m_bIsInstanciated; }
};
//######################################################################################################################
class A3DRiBrepModelConnector : public A3DConnector
{
friend class A3DRiConnector;
public:
A3DRiBrepModelConnector(const A3DRiBrepModel *pRi) : m_pRiBrepModel(pRi), A3DConnector(pRi)
{
A3D_INITIALIZE_DATA(A3DRiBrepModelData, m_sRiBrepModelData);
A3DRiBrepModelGet(m_pRiBrepModel, &m_sRiBrepModelData);
}
~A3DRiBrepModelConnector()
{
A3DRiBrepModelGet(NULL, &m_sRiBrepModelData);
}
A3DStatus TraverseRiBrepModel(A3DVisitorContainer* psVisitor) const;
public:
A3DRiBrepModel const* m_pRiBrepModel;
A3DRiBrepModelData m_sRiBrepModelData;
};
//######################################################################################################################
class A3DRiSetConnector : public A3DConnector
{
friend class A3DRiConnector;
private:
A3DRiSetConnector(const A3DRiSet *pRi) : A3DConnector(pRi)
{
A3D_INITIALIZE_DATA(A3DRiSetData, m_sRiSetData);
A3DRiSetGet(pRi, &m_sRiSetData);
}
~A3DRiSetConnector()
{
A3DRiSetGet(NULL, &m_sRiSetData);
}
A3DStatus TraverseRiSet(A3DVisitorContainer* psVisitor);
public:
A3DRiSetData m_sRiSetData;
};
//######################################################################################################################
class A3DPolyRiBrepModelConnector : public A3DConnector
{
friend class A3DRiConnector;
private:
A3DPolyRiBrepModelConnector(const A3DRiPolyBrepModel* pRi) : A3DConnector(pRi)
{
A3D_INITIALIZE_DATA(A3DRiPolyBrepModelData, m_sRiPolyBrepModelData);
A3DRiPolyBrepModelGet(pRi, &m_sRiPolyBrepModelData);
}
~A3DPolyRiBrepModelConnector()
{
A3DRiPolyBrepModelGet(NULL, &m_sRiPolyBrepModelData);
}
public:
A3DStatus TraverseRiPolyBrepModel(A3DVisitorContainer* psVisitor) const;
A3DRiPolyBrepModelData m_sRiPolyBrepModelData;
};
//######################################################################################################################
class A3DRiCurveConnector : public A3DConnector
{
friend class A3DRiConnector;
private:
A3DRiCurveConnector(const A3DRiCurve* pRi) : A3DConnector(pRi)
{
A3D_INITIALIZE_DATA(A3DRiCurveData, m_sRiCurveData);
A3DRiCurveGet(pRi, &m_sRiCurveData);
}
~A3DRiCurveConnector()
{
A3DRiCurveGet(NULL, &m_sRiCurveData);
}
A3DStatus TraverseRiCurve(A3DVisitorContainer* psVisitor);
public:
A3DRiCurveData m_sRiCurveData;
};
//######################################################################################################################
class A3DRiPolyWireConnector : public A3DConnector
{
friend class A3DRiConnector;
private:
A3DRiPolyWireConnector(const A3DRiPolyWire* pRi) : A3DConnector(pRi)
{
A3D_INITIALIZE_DATA(A3DRiPolyWireData, m_sRiPolyWireData);
A3DRiPolyWireGet(pRi, &m_sRiPolyWireData);
}
~A3DRiPolyWireConnector()
{
A3DRiPolyWireGet(NULL, &m_sRiPolyWireData);
}
A3DStatus TraverseRiPolyWire(A3DVisitorContainer* psVisitor);
public:
A3DRiPolyWireData m_sRiPolyWireData;
};
//######################################################################################################################
class A3DFRMParameterConnector : public A3DConnector
{
friend class A3DFRMTreeConnector;
friend class A3DFRMFeatureConnector;
private:
A3DFRMParameterConnector(const A3DFRMParameter *pParameter) : A3DConnector(pParameter)
{
A3D_INITIALIZE_DATA(A3DFRMParameterData, m_sData);
A3DFRMParameterGet(pParameter, &m_sData);
}
~A3DFRMParameterConnector()
{
A3DFRMParameterGet(NULL, &m_sData);
}
public:
A3DFRMParameterData m_sData;
A3DStatus TraverseParameter(A3DVisitorContainer* psVisitor) const;
};
//######################################################################################################################
class A3DFRMLinkedItemConnector : public A3DConnector
{
friend class A3DFRMFeatureConnector;
private:
A3DFRMLinkedItemConnector(const A3DFRMLinkedItem *pLinkedItem) : A3DConnector(pLinkedItem)
{
A3D_INITIALIZE_DATA(A3DFRMLinkedItemData, m_sData);
A3DFRMLinkedItemGet(pLinkedItem, &m_sData);
}
~A3DFRMLinkedItemConnector()
{
A3DFRMLinkedItemGet(NULL, &m_sData);
}
public:
A3DFRMLinkedItemData m_sData;
A3DStatus TraverseConnection(A3DVisitorContainer* psVisitor) const;
};
//######################################################################################################################
class A3DFRMFeatureConnector : public A3DConnector
{
friend class A3DFRMParameterConnector;
private:
A3DFRMFeatureConnector(const A3DFRMFeature *pFeature) : A3DConnector(pFeature)
{
A3D_INITIALIZE_DATA(A3DFRMFeatureData, m_sData);
A3DFRMFeatureGet(pFeature, &m_sData);
}
~A3DFRMFeatureConnector()
{
A3DFRMFeatureGet(NULL, &m_sData);
}
public:
A3DFRMFeatureData m_sData;
A3DStatus TraverseFeature(A3DVisitorContainer* psVisitor) const;
};
//######################################################################################################################
class A3DFRMTreeConnector : public A3DConnector
{
friend class A3DProductOccurrenceConnector;
protected:
A3DFRMTreeConnector(const A3DFRMTree *pTree) : A3DConnector(pTree)
{
A3D_INITIALIZE_DATA(A3DFRMTreeData, m_sTreeData);
A3DFRMTreeGet(pTree, &m_sTreeData);
}
~A3DFRMTreeConnector()
{
A3DFRMTreeGet(NULL, &m_sTreeData);
}
A3DStatus TraverseFeatureTree(A3DVisitorContainer* psVisitor) const;
public:
A3DFRMTreeData m_sTreeData;
};
#endif

View File

@@ -0,0 +1,586 @@
/***********************************************************************************************************************
*
* Copyright (c) 2010 - 2022 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.
*
***********************************************************************************************************************/
#include "VisitorContainer.h"
#include "Visitors.h"
#ifdef CONNECT_ASSEMBLY_TREE
#include "VisitorTree.h"
#endif
#include <map>
#include <algorithm>
using namespace std;
#define VISITENTER \
{\
ActivateEntityReference(sConnector.GetA3DEntity()); \
for(unsigned uI = 0; uI < m_apVisitor.size(); uI++)\
m_apVisitor[uI]->visitEnter(sConnector);\
return A3D_SUCCESS;\
}
#define VISITLEAVE \
{\
DeactivateEntityReference(sConnector.GetA3DEntity()); \
for(unsigned uI = 0; uI < m_apVisitor.size(); uI++)\
m_apVisitor[uI]->visitLeave(sConnector);\
return A3D_SUCCESS;\
}
//Tree
#ifdef CONNECT_ASSEMBLY_TREE
//
// static A3DStatus stCreateAndPushCascadedAttributes( const A3DRootBaseWithGraphics* pBase,
// const A3DMiscCascadedAttributes* pFatherAttr,
// A3DMiscCascadedAttributes** ppAttr,
// A3DMiscCascadedAttributesData* psAttrData)
// {
// A3DStatus iRet = A3D_SUCCESS;
//
// CHECK_RET(A3DMiscCascadedAttributesCreate(ppAttr));
// CHECK_RET(A3DMiscCascadedAttributesPush(*ppAttr, pBase, pFatherAttr));
//
// A3D_INITIALIZE_DATA(A3DMiscCascadedAttributesData, (*psAttrData));
// CHECK_RET(A3DMiscCascadedAttributesGet(*ppAttr, psAttrData));
//
// return iRet;
// }
A3DStatus A3DVisitorContainer::visitEnter(const A3DModelFileConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitEnter(const A3DProductOccurrenceConnector& sConnector)
{
m_uiCurrentLevel++;
// Entity Reference
unsigned int uI, uNbRefEntity = sConnector.m_sProductOccurrenceData.m_uiEntityReferenceSize;
for(uI = 0; uI < uNbRefEntity; uI++)
{
A3DMiscEntityReferenceData sMiscRefData;
A3D_INITIALIZE_DATA(A3DMiscEntityReferenceData, sMiscRefData);
A3DMiscEntityReference* pEntityRef = sConnector.m_sProductOccurrenceData.m_ppEntityReferences[uI];
A3DMiscEntityReferenceGet(pEntityRef, &sMiscRefData);
A3DStepEntityRefManager sEntityManager;
sEntityManager.m_pStepEntityRef = pEntityRef;
sEntityManager.m_uiPOLevel = m_uiCurrentLevel;
A3DEEntityType sType;
A3DEntityGetType(sMiscRefData.m_pEntity, &sType);
if(sType == kA3DTypeMiscReferenceOnTopology)
{
A3DMiscReferenceOnTopologyData sTopoRefData;
A3D_INITIALIZE_DATA(A3DMiscReferenceOnTopologyData,sTopoRefData);
A3DMiscReferenceOnTopologyGet(pEntityRef, &sTopoRefData);
sEntityManager.m_pA3DEntityRef = sTopoRefData.m_pBrepData;
sEntityManager.m_bRefOnTopoItem = true;
A3DMiscReferenceOnTopologyGet(NULL, &sTopoRefData);
}
else if(sType == kA3DTypeMiscReferenceOnCsysItem)
{
A3DMiscReferenceOnCsysItemData sA3DMiscReferenceOnCSYSITemData;
A3D_INITIALIZE_DATA(A3DMiscReferenceOnCsysItemData, sA3DMiscReferenceOnCSYSITemData);
A3DMiscReferenceOnCsysItemGet(pEntityRef, &sA3DMiscReferenceOnCSYSITemData);
sEntityManager.m_pA3DEntityRef = sA3DMiscReferenceOnCSYSITemData.m_pCoordinateSystem;
A3DMiscReferenceOnCsysItemGet(NULL, &sA3DMiscReferenceOnCSYSITemData);
}
else
sEntityManager.m_pA3DEntityRef = sMiscRefData.m_pEntity;
A3DMiscEntityReferenceGet(NULL, &sMiscRefData);
m_asStepEntityRefManager.push_back(sEntityManager);
}
A3DStatus iRet = A3D_SUCCESS;
ActivateEntityReference(sConnector.GetA3DEntity());
for(uI = 0; uI < m_apVisitor.size(); uI++)
{
m_apVisitor[uI]->visitEnter(sConnector);
}
return iRet;
}
A3DStatus A3DVisitorContainer::visitEnter(const A3DPartConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitEnter(const A3DRiConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitEnter(const A3DRiBrepModelConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitEnter(const A3DRiSetConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitEnter(const A3DPolyRiBrepModelConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitLeave(const A3DModelFileConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitLeave(const A3DProductOccurrenceConnector& sConnector)
{
for(unsigned uI = 0; uI < m_apVisitor.size(); uI++)
{
m_apVisitor[uI]->visitLeave(sConnector);
}
unsigned int uI, uNbRefEntity = sConnector.m_sProductOccurrenceData.m_uiEntityReferenceSize;
for (uI = 0; uI < uNbRefEntity; uI++)
{
m_asStepEntityRefManager.pop_back();
}
DeactivateEntityReference(sConnector.GetA3DEntity());
m_uiCurrentLevel--;
return A3D_SUCCESS;
}
A3DStatus A3DVisitorContainer::visitLeave(const A3DPartConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitLeave(const A3DRiConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitLeave(const A3DRiBrepModelConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitLeave(const A3DRiSetConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitLeave(const A3DPolyRiBrepModelConnector& sConnector)
VISITLEAVE
#endif
//Markup
#ifdef CONNECT_PMI
A3DStatus A3DVisitorContainer::visitEnter(const A3DMkpAnnotationEntityConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitEnter(const A3DMkpAnnotationSetConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitEnter(const A3DMkpAnnotationItemConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitEnter(const A3DMarkupConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitEnter(const A3DMarkupDimensionConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitEnter(const A3DMarkupGDTConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitEnter(const A3DMarkupDatumConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitEnter(const A3DMarkupTessConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitLeave(const A3DMkpAnnotationEntityConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitLeave(const A3DMkpAnnotationSetConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitLeave(const A3DMkpAnnotationItemConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitLeave(const A3DMarkupDimensionConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitLeave(const A3DMarkupConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitLeave(const A3DMarkupGDTConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitLeave(const A3DMarkupDatumConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitLeave(const A3DMarkupTessConnector& sConnector)
VISITLEAVE
#endif
//Brep
#ifdef CONNECT_BREP
A3DStatus A3DVisitorContainer::visitEnter(const A3DBrepDataConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitEnter(const A3DConnexConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitEnter(const A3DShellConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitEnter(const A3DFaceConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitEnter(const A3DLoopConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitEnter(const A3DCoEdgeConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitEnter(const A3DEdgeConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitEnter(const A3DUniqueVertexConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitEnter(const A3DMultipleVertexConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitLeave(const A3DBrepDataConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitLeave(const A3DConnexConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitLeave(const A3DShellConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitLeave(const A3DFaceConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitLeave(const A3DLoopConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitLeave(const A3DCoEdgeConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitLeave(const A3DEdgeConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitLeave(const A3DUniqueVertexConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitLeave(const A3DMultipleVertexConnector& sConnector)
VISITLEAVE
#endif
//Mesh
#ifdef CONNECT_MESH
A3DStatus A3DVisitorContainer::visitEnter(const A3DTessDataConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitLeave(const A3DTessDataConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitEnter(const A3DFaceTessDataConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitLeave(const A3DFaceTessDataConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitEnter(const A3DWireTessDataConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitLeave(const A3DWireTessDataConnector& sConnector)
VISITLEAVE
//VISIT(const A3DTessDataConnector&)
#endif
A3DVisitorContainer::A3DVisitorContainer(unsigned int uFlagElementToconnect)
: A3DVisitor("Container"),
m_pTreeVisitor(NULL),
m_pCurrentPOFather(NULL),
m_psActivatedView(NULL),
m_bTraverseActivatedViewOnly(true),
m_uiCurrentLevel(0)
{
#ifdef CONNECT_TRANSFO
if(uFlagElementToconnect&CONNECT_TRANSFO)
{
A3DVisitorTransfo* psVisistorTransfo = new A3DVisitorTransfo(this);
this->push( psVisistorTransfo);
}
#endif
#ifdef CONNECT_COLORS
if(uFlagElementToconnect&CONNECT_COLORS)
{
A3DVisitorColorMaterials* psVisitorcascadedAttribute = new A3DVisitorColorMaterials(this);
this->push( psVisitorcascadedAttribute);
}
#endif
#ifdef CONNECT_MESH
if(uFlagElementToconnect&CONNECT_MESH)
{
A3DVisitorTessellation* psVisitorTessellation = new A3DVisitorTessellation(this);
this->push( psVisitorTessellation);
}
#endif
#ifdef CONNECT_BREP
if(uFlagElementToconnect&CONNECT_BREP)
{
A3DVisitorBrep* psVisitorBrep = new A3DVisitorBrep(this);
this->push( psVisitorBrep);
}
#endif
#ifdef CONNECT_ASSEMBLY_TREE
if(uFlagElementToconnect&CONNECT_ASSEMBLY_TREE)
{
A3DTreeVisitor* psVisitorTree= new A3DTreeVisitor(this);
this->push( psVisitorTree);
}
#endif
#ifdef CONNECT_PMI
if(uFlagElementToconnect&CONNECT_PMI)
{
//A3DVisitorPMI* psVisitorPMI = new A3DVisitorPMI(this);
//this->push( psVisitorPMI );
}
#endif
#ifdef CONNECT_VIEWS
if(uFlagElementToconnect&CONNECT_VIEWS)
{
// Not yet Implemented
// A3DVisitorview* psVisitorViews = new A3DVisitorview(this);
// this->push( psVisitorViews);
}
m_bTraverseInstance = true;
#endif
}
#ifdef CONNECT_VIEWS
A3DStatus A3DVisitorContainer::visitEnter(const A3DMkpViewConnector& sConnector)
{
if ((m_psActivatedView == NULL) || (m_psActivatedView != sConnector.GetA3DEntity()))
{
if (!m_bTraverseActivatedViewOnly)
{
VISITENTER;
}
return A3D_SUCCESS;
}
// VISITENTER
ActivateEntityReference(sConnector.GetA3DEntity());
for (unsigned uI = 0; uI < m_apVisitor.size(); uI++)
{
m_apVisitor[uI]->visitEnter(sConnector);
}
unsigned int uI, uNbRefEntity = sConnector.GetViewData().m_uiLinkedItemsSize;
for (uI = 0; uI < uNbRefEntity; uI++)
{
A3DMiscMarkupLinkedItemData sMkpLinkedItemData;
A3D_INITIALIZE_DATA(A3DMiscMarkupLinkedItemData, sMkpLinkedItemData);
A3DMiscMarkupLinkedItem* pMkpLinkedItemEntityRef = sConnector.GetViewData().m_ppLinkedItems[uI];
A3DMiscMarkupLinkedItemGet(pMkpLinkedItemEntityRef, &sMkpLinkedItemData);
A3DViewLinkedItemManager sViewLinkedItemManager;
A3DMiscEntityReferenceData sMiscRefData;
A3D_INITIALIZE_DATA(A3DMiscEntityReferenceData, sMiscRefData);
A3DMiscEntityReferenceGet(pMkpLinkedItemEntityRef, &sMiscRefData);
sViewLinkedItemManager.m_pA3DEntityRef = sMiscRefData.m_pEntity;
sViewLinkedItemManager.m_POOwner = sMkpLinkedItemData.m_pTargetProductOccurrence;
sViewLinkedItemManager.m_pMarkupLinkedItem = pMkpLinkedItemEntityRef;
sViewLinkedItemManager.m_uiPOLevel = m_uiCurrentLevel;
A3DEEntityType sType;
A3DEntityGetType(sMiscRefData.m_pEntity, &sType);
if (sType == kA3DTypeMiscReferenceOnTopology)
{
A3DMiscReferenceOnTopologyData sTopoRefData;
A3D_INITIALIZE_DATA(A3DMiscReferenceOnTopologyData, sTopoRefData);
A3DMiscReferenceOnTopologyGet(sMiscRefData.m_pEntity, &sTopoRefData);
sViewLinkedItemManager.m_pA3DEntityRef = sTopoRefData.m_pBrepData;
sViewLinkedItemManager.m_bRefOnTopoItem = true;
A3DMiscReferenceOnTopologyGet(NULL, &sTopoRefData);
}
else if (sType == kA3DTypeMiscReferenceOnCsysItem)
{
A3DMiscReferenceOnCsysItemData sA3DMiscReferenceOnCSYSITemData;
A3D_INITIALIZE_DATA(A3DMiscReferenceOnCsysItemData, sA3DMiscReferenceOnCSYSITemData);
A3DMiscReferenceOnCsysItemGet(sMiscRefData.m_pEntity, &sA3DMiscReferenceOnCSYSITemData);
sViewLinkedItemManager.m_pA3DEntityRef = sA3DMiscReferenceOnCSYSITemData.m_pCoordinateSystem;
A3DMiscReferenceOnCsysItemGet(NULL, &sA3DMiscReferenceOnCSYSITemData);
}
else
sViewLinkedItemManager.m_pA3DEntityRef = sMiscRefData.m_pEntity;
A3DMiscEntityReferenceGet(NULL, &sMiscRefData);
m_asViewLinkedItemManager.push_back(sViewLinkedItemManager);
}
return A3D_SUCCESS;
}
A3DStatus A3DVisitorContainer::visitLeave(const A3DMkpViewConnector& sConnector)
{
if ((m_psActivatedView == NULL) || (m_psActivatedView != sConnector.GetA3DEntity()))
{
if (!m_bTraverseActivatedViewOnly)
VISITLEAVE;
return A3D_SUCCESS;
}
VISITLEAVE;
}
#endif
void A3DVisitorContainer::push( A3DVisitor* psVisitor )
{
// vector<A3DVisitor*>::iterator iter =
// search(m_apVisitor.begin(), m_apVisitor.end(), &psVisitor, &psVisitor+1);
// if(iter == m_apVisitor.end())
// {
// m_apVisitorExcludedForDelete.push_back(psVisitor);
// }
m_apVisitor.push_back(psVisitor);
if(!m_pTreeVisitor)
m_pTreeVisitor = (A3DVisitor*)dynamic_cast<A3DTreeVisitor*>(psVisitor);//dynamic_cast return null if failed.
}
A3DVisitorContainer::~A3DVisitorContainer()
{
size_t uI, uNbVisitor = m_apVisitor.size();
// vector<A3DVisitor*>::iterator iter;
for(uI = 0; uI < uNbVisitor; uI++)
// {
// iter = search( m_apVisitorExcludedForDelete.begin(),
// m_apVisitorExcludedForDelete.end(),
// &m_apVisitor[uI],
// &m_apVisitor[uI]+1);
// if(iter == m_apVisitorExcludedForDelete.end())
delete m_apVisitor[uI];
// }
}
void* A3DVisitorContainer::FindInMap(const A3DEntity* pA3DEntity)
{
map<const A3DEntity*, void*>::iterator my_mapIter;
my_mapIter = m_apA3DEntityYourEntityMap.find(pA3DEntity);
if(my_mapIter == m_apA3DEntityYourEntityMap.end())
return NULL;
return my_mapIter->second;
}
void A3DVisitorContainer::SetInMap(const A3DEntity* pA3DEntity, void* pYourEntity)
{
m_apA3DEntityYourEntityMap.insert(std::pair<const A3DEntity*, void*>(pA3DEntity, pYourEntity));
}
A3DVisitor* A3DVisitorContainer::GetVisitorByName( std::string strName )
{
vector<A3DVisitor*>::iterator iter = m_apVisitor.begin();
for( ; iter != m_apVisitor.end(); ++iter)
if(strName.compare((*iter)->GetName()) == 0)
return *iter;
return NULL;
}
A3DVisitor* A3DVisitorContainer::GetTreeVisitor() const
{
return m_pTreeVisitor;
}
void A3DVisitorContainer::ActivateEntityReference( A3DEntity const* pEntity )
{
// StepEntityReference
size_t uI, uNbPushStepEntityRef = m_asStepEntityRefManager.size();
for(uI = 0; uI < uNbPushStepEntityRef; uI++)
{
if(m_asStepEntityRefManager[uI].m_pA3DEntityRef == pEntity)
{
m_asStepEntityRefManager[uI].m_uiPushLevel = m_uiCurrentLevel;
}
}
// ViewLinkedItem
size_t uNbPushViewLMkpLinkedItem = m_asViewLinkedItemManager.size();
for (uI = 0; uI < uNbPushViewLMkpLinkedItem; uI++)
{
A3DViewLinkedItemManager *pCurManager = &m_asViewLinkedItemManager[uI];
if (pCurManager->m_pA3DEntityRef == pEntity &&
( pCurManager->m_POOwner == NULL ||
pCurManager->m_POOwner == pEntity ||
pCurManager->m_POOwner == m_pCurrentPOFather
)
)
{
pCurManager->m_uiPushLevel = m_uiCurrentLevel;
}
}
}
void A3DVisitorContainer::DeactivateEntityReference( A3DEntity const* pEntity )
{
// StepEntityReference
size_t uI, uNbPushStepEntityRef = m_asStepEntityRefManager.size();
for(uI = 0; uI < uNbPushStepEntityRef; uI++)
{
if(m_asStepEntityRefManager[uI].m_pA3DEntityRef == pEntity)
{
m_asStepEntityRefManager[uI].m_uiPushLevel = ~0U;
}
}
// ViewLinkedItem
size_t uNbPushViewLMkpLinkedItem = m_asViewLinkedItemManager.size();
for (uI = 0; uI < uNbPushViewLMkpLinkedItem; uI++)
{
A3DViewLinkedItemManager *pCurManager = &m_asViewLinkedItemManager[uI];
if (pCurManager->m_pA3DEntityRef == pEntity &&
( pCurManager->m_POOwner == NULL ||
pCurManager->m_POOwner == pEntity ||
pCurManager->m_POOwner == m_pCurrentPOFather
)
)
{
pCurManager->m_uiPushLevel = ~0U;
}
}
}
A3DStepEntityRefManager const* A3DVisitorContainer::GetActiveStepEntityRefManager(A3DEntity const * pEntity) const
{
A3DStepEntityRefManager const * psActivated = NULL;
size_t uI, uNbPushStepEntityRef = m_asStepEntityRefManager.size();
for(uI = 0; uI < uNbPushStepEntityRef; uI++)
{
A3DStepEntityRefManager const * psCurManager = &m_asStepEntityRefManager[uI];
if (psCurManager->m_uiPushLevel!=~0U && (pEntity==NULL || psCurManager->m_pA3DEntityRef==pEntity))
{
if (!psActivated)
psActivated = psCurManager;
else if (psCurManager->IsFirst(*psActivated))
psActivated = psCurManager;
}
}
return psActivated;
}
A3DViewLinkedItemManager const* A3DVisitorContainer::GetActiveViewLinkedItemManager(A3DEntity const * pEntity) const
{
A3DViewLinkedItemManager const * psActivated = NULL;
size_t uI, uNbPushViewMarkupLinkedItem = m_asViewLinkedItemManager.size();
for (uI = 0; uI < uNbPushViewMarkupLinkedItem; uI++)
{
A3DViewLinkedItemManager const * psCurManager = &m_asViewLinkedItemManager[uI];
if (psCurManager->m_uiPushLevel!=~0U && (pEntity==NULL || psCurManager->m_pA3DEntityRef==pEntity))
{
if (!psActivated)
psActivated = psCurManager;
else if (psCurManager->IsFirst(*psActivated))
psActivated = psCurManager;
}
}
return psActivated;
}
#ifdef CONNECT_FEATURE
A3DStatus A3DVisitorContainer::visitEnter(const A3DFRMFeatureConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitLeave(const A3DFRMFeatureConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitEnter(const A3DFRMParameterConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitLeave(const A3DFRMParameterConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitEnter(const A3DFRMTreeConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitLeave(const A3DFRMTreeConnector& sConnector)
VISITLEAVE
A3DStatus A3DVisitorContainer::visitEnter(const A3DFRMLinkedItemConnector& sConnector)
VISITENTER
A3DStatus A3DVisitorContainer::visitLeave(const A3DFRMLinkedItemConnector& sConnector)
VISITLEAVE
#endif

View File

@@ -0,0 +1,239 @@
/***********************************************************************************************************************
*
* Copyright (c) 2010 - 2022 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.
*
***********************************************************************************************************************/
#ifndef A3DVISITOR_CONTAINER
#define A3DVISITOR_CONTAINER
#include <map>
#include "Visitors.h"
//This class allow to use several vistor when traversing 3DX Tree.
//It allow also to exchange parameters between visitors
#define NODE_INSTANCES 0x0001
class A3DStepEntityRefManager
{
public:
unsigned int m_uiPOLevel; // Level of creation
unsigned int m_uiPushLevel; // if not ~0U , then is activated
bool m_bRefOnTopoItem;;
A3DMiscEntityReference* m_pStepEntityRef;
A3DEntity* m_pA3DEntityRef;
A3DStepEntityRefManager() : m_uiPOLevel(~0U), m_uiPushLevel(~0U), m_pStepEntityRef(NULL), m_bRefOnTopoItem(false),
m_pA3DEntityRef(NULL){}
void GetMatrix();
bool IsFirst( A3DStepEntityRefManager const & sOther) const { return (m_uiPOLevel<sOther.m_uiPOLevel) || (m_uiPOLevel==sOther.m_uiPOLevel && m_uiPushLevel>sOther.m_uiPushLevel);}
};
class A3DViewLinkedItemManager
{
public:
unsigned int m_uiPOLevel;
unsigned int m_uiPushLevel; // if not ~0U , then is activated
bool m_bRefOnTopoItem;
A3DMiscMarkupLinkedItem * m_pMarkupLinkedItem;
A3DAsmProductOccurrence * m_POOwner;
A3DEntity * m_pA3DEntityRef;
A3DViewLinkedItemManager() : m_uiPOLevel(~0U), m_uiPushLevel(~0U), m_pMarkupLinkedItem(NULL),m_bRefOnTopoItem(false),
m_POOwner(NULL), m_pA3DEntityRef(NULL){}
void GetMatrix();
bool IsFirst( A3DViewLinkedItemManager const & sOther) const { return (m_uiPOLevel<sOther.m_uiPOLevel) || (m_uiPOLevel==sOther.m_uiPOLevel && m_uiPushLevel>sOther.m_uiPushLevel);}
};
class A3DVisitorContainer : public A3DVisitor
{
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable:4251) // Suppress the warning C4251 because it leads to have that kind of warning : "warning
// C4251: 'A3DVisitorColorMaterials::m_apsCascadedAttribute' : class 'std::vector<_Ty>' needs to have dll-interface to
// be used by clients of class 'A3DVisitorColorMaterials"
// This is because of the "dllexport" on the visitor classes, as they use stl members and it seems that stl causes
// warning with dllexport with microsoft compiler
#endif // _MSC_VER
std::map<const A3DEntity*, void*> m_apA3DEntityYourEntityMap;
std::vector<A3DVisitor*> m_apVisitor;
bool m_bTraverseInstance;
A3DVisitor* m_pTreeVisitor;
A3DAsmProductOccurrence const * m_pCurrentPOFather;
A3DMkpView const * m_psActivatedView;
bool m_bTraverseActivatedViewOnly;
std::vector<A3DStepEntityRefManager> m_asStepEntityRefManager;
std::vector<A3DViewLinkedItemManager> m_asViewLinkedItemManager;
unsigned int m_uiCurrentLevel;
#ifdef _MSC_VER
#pragma warning(pop)
#endif // _MSC_VER
public:
A3DVisitorContainer(unsigned int uFlagElementToconnect = 0);
virtual ~A3DVisitorContainer();
void push( A3DVisitor* psVisitor);
//A3DConnector
virtual A3DStatus visitEnter(const A3DConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DConnector& /*sConnector*/) { return A3D_SUCCESS; }
//Assmebly Tree
#ifdef CONNECT_ASSEMBLY_TREE
virtual A3DStatus visitEnter(const A3DModelFileConnector& sConnector);
virtual A3DStatus visitLeave(const A3DModelFileConnector& sConnector);
virtual A3DStatus visitEnter(const A3DProductOccurrenceConnector& sConnector);
virtual A3DStatus visitLeave(const A3DProductOccurrenceConnector& sConnector);
virtual A3DStatus visitEnter(const A3DPartConnector& sConnector);
virtual A3DStatus visitLeave(const A3DPartConnector& sConnector);
virtual A3DStatus visitEnter(const A3DRiConnector& sConnector);
virtual A3DStatus visitLeave(const A3DRiConnector& sConnector);
virtual A3DStatus visitEnter(const A3DRiBrepModelConnector& sConnector);
virtual A3DStatus visitLeave(const A3DRiBrepModelConnector& sConnector);
virtual A3DStatus visitEnter(const A3DRiSetConnector& sConnector);
virtual A3DStatus visitLeave(const A3DRiSetConnector& sConnector);
virtual A3DStatus visitEnter(const A3DPolyRiBrepModelConnector& sConnector);
virtual A3DStatus visitLeave(const A3DPolyRiBrepModelConnector& sConnector);
#endif
#ifdef CONNECT_PMI
//Markup Tree
virtual A3DStatus visitEnter(const A3DMkpAnnotationEntityConnector& sConnector);
virtual A3DStatus visitLeave(const A3DMkpAnnotationEntityConnector& sConnector);
virtual A3DStatus visitEnter(const A3DMkpAnnotationSetConnector& sConnector);
virtual A3DStatus visitLeave(const A3DMkpAnnotationSetConnector& sConnector);
virtual A3DStatus visitEnter(const A3DMkpAnnotationItemConnector& sConnector);
virtual A3DStatus visitLeave(const A3DMkpAnnotationItemConnector& sConnector);
virtual A3DStatus visitEnter(const A3DMarkupConnector& sConnector);
virtual A3DStatus visitLeave(const A3DMarkupConnector& sConnector);
virtual A3DStatus visitEnter(const A3DMarkupDimensionConnector& sConnector);
virtual A3DStatus visitLeave(const A3DMarkupDimensionConnector& sConnector);
virtual A3DStatus visitEnter(const A3DMarkupGDTConnector& sConnector);
virtual A3DStatus visitLeave(const A3DMarkupGDTConnector& sConnector);
virtual A3DStatus visitEnter(const A3DMarkupTessConnector& sConnector);
virtual A3DStatus visitLeave(const A3DMarkupTessConnector& sConnector);
#endif
#ifdef CONNECT_BREP
//Brep
virtual A3DStatus visitEnter(const A3DBrepDataConnector& sConnector);
virtual A3DStatus visitLeave(const A3DBrepDataConnector& sConnector);
virtual A3DStatus visitEnter(const A3DConnexConnector& sConnector);
virtual A3DStatus visitLeave(const A3DConnexConnector& sConnector);
virtual A3DStatus visitEnter(const A3DShellConnector& sConnector);
virtual A3DStatus visitLeave(const A3DShellConnector& sConnector);
virtual A3DStatus visitEnter(const A3DFaceConnector& sConnector);
virtual A3DStatus visitLeave(const A3DFaceConnector& sConnector);
virtual A3DStatus visitEnter(const A3DLoopConnector& sConnector);
virtual A3DStatus visitLeave(const A3DLoopConnector& sConnector);
virtual A3DStatus visitEnter(const A3DCoEdgeConnector& sConnector);
virtual A3DStatus visitLeave(const A3DCoEdgeConnector& sConnector);
virtual A3DStatus visitEnter(const A3DEdgeConnector& sConnector);
virtual A3DStatus visitLeave(const A3DEdgeConnector& sConnector);
virtual A3DStatus visitEnter(const A3DUniqueVertexConnector& sConnector);
virtual A3DStatus visitLeave(const A3DUniqueVertexConnector& sConnector);
virtual A3DStatus visitEnter(const A3DMultipleVertexConnector& sConnector);
virtual A3DStatus visitLeave(const A3DMultipleVertexConnector& sConnector);
#endif
#ifdef CONNECT_MESH
//Mesh
virtual A3DStatus visitEnter(const A3DTessDataConnector& sConnector);
virtual A3DStatus visitLeave(const A3DTessDataConnector& sConnector);
virtual A3DStatus visitEnter(const A3DFaceTessDataConnector& sConnector);
virtual A3DStatus visitLeave(const A3DFaceTessDataConnector& sConnector);
virtual A3DStatus visitEnter(const A3DMarkupDatumConnector& sConnector);
virtual A3DStatus visitLeave(const A3DMarkupDatumConnector& sConnector);
virtual A3DStatus visitEnter(const A3DWireTessDataConnector& sConnector);
virtual A3DStatus visitLeave(const A3DWireTessDataConnector& sConnector);
#endif
//Views
#ifdef CONNECT_VIEWS
virtual A3DStatus visitEnter(const A3DMkpViewConnector& sConnector);
virtual A3DStatus visitLeave(const A3DMkpViewConnector& sConnector);
#endif
#ifdef CONNECT_FEATURE
virtual A3DStatus visitEnter(const A3DFRMFeatureConnector& sConnector);
virtual A3DStatus visitLeave(const A3DFRMFeatureConnector& sConnector);
virtual A3DStatus visitEnter(const A3DFRMParameterConnector& sConnector);
virtual A3DStatus visitLeave(const A3DFRMParameterConnector& sConnector);
virtual A3DStatus visitEnter(const A3DFRMTreeConnector& sConnector);
virtual A3DStatus visitLeave(const A3DFRMTreeConnector& sConnector);
virtual A3DStatus visitEnter(const A3DFRMLinkedItemConnector& sConnector);
virtual A3DStatus visitLeave(const A3DFRMLinkedItemConnector& sConnector);
#endif
void* FindInMap(const A3DEntity* pA3DEntity);
void SetInMap(const A3DEntity* pA3DEntity, void* pYourEntity);
std::vector<A3DVisitor*>& GetVisitor() { return m_apVisitor; }
bool TraverseInstances() { return m_bTraverseInstance; }
void SetTraverseInstance(bool bTraverseInstance) { m_bTraverseInstance = bTraverseInstance; }
A3DVisitor* GetVisitorByName(std::string strName);
A3DVisitor* GetTreeVisitor() const;
void SetCurrentPoFather(A3DAsmProductOccurrence const * pCurrentPOFather) { m_pCurrentPOFather = pCurrentPOFather; }
A3DAsmProductOccurrence const * GetCurrentPoFather() { return m_pCurrentPOFather; }
void SetActivateView(A3DMkpView const * psActivatedView) { m_psActivatedView = psActivatedView; }
A3DMkpView const * GetActivatedView() { return m_psActivatedView; }
void SetTraverseActivatedViewOnly(bool bTraverseActivatedViewOnly) { m_bTraverseActivatedViewOnly = bTraverseActivatedViewOnly; }
// StepEntityReference and ViewLinkedItem treatment
A3DStepEntityRefManager const* GetActiveStepEntityRefManager(A3DEntity const * pEntity) const;
A3DViewLinkedItemManager const* GetActiveViewLinkedItemManager(A3DEntity const * pEntity) const;
void ActivateEntityReference( A3DEntity const* pEntity );
void DeactivateEntityReference(A3DEntity const* pEntity);
};
#endif

View File

@@ -0,0 +1,87 @@
/***********************************************************************************************************************
*
* Copyright (c) 2010 - 2022 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.
*
***********************************************************************************************************************/
#include "VisitorTree.h"
A3DStatus A3DTreeVisitor::visitEnter(const A3DRiBrepModelConnector& /*sConnector*/)
{
return A3D_SUCCESS;
}
A3DStatus A3DTreeVisitor::visitLeave(const A3DRiBrepModelConnector& /*sConnector*/)
{
return A3D_SUCCESS;
}
A3DStatus A3DTreeVisitor::visitEnter(const A3DRiSetConnector& /*sConnector*/)
{
return A3D_SUCCESS;
}
A3DStatus A3DTreeVisitor::visitLeave(const A3DRiSetConnector& /*sConnector*/)
{
return A3D_SUCCESS;
}
A3DStatus A3DTreeVisitor::visitEnter(const A3DRiConnector& /*sConnector*/)
{
return A3D_SUCCESS;
}
A3DStatus A3DTreeVisitor::visitLeave(const A3DRiConnector& /*sConnector*/)
{
return A3D_SUCCESS;
}
A3DStatus A3DTreeVisitor::visitEnter(const A3DPartConnector& /*sConnector*/)
{
return A3D_SUCCESS;
}
A3DStatus A3DTreeVisitor::visitLeave(const A3DPartConnector& /*sConnector*/)
{
return A3D_SUCCESS;
}
A3DStatus A3DTreeVisitor::visitEnter(const A3DProductOccurrenceConnector& sConnector)
{
if(m_uOption&NODE_INSTANCES)
{
m_pYourEntity = m_psContainer->FindInMap(sConnector.GetA3DEntity());
if(m_pYourEntity)
{
((A3DProductOccurrenceConnector*) &sConnector)->SetIsInstanciated(true);
}
}
m_psContainer->SetInMap(sConnector.GetA3DEntity(),(void*) sConnector.GetA3DEntity() );
return A3D_SUCCESS;
}
A3DStatus A3DTreeVisitor::visitLeave(const A3DProductOccurrenceConnector& /*sConnector*/)
{
return A3D_SUCCESS;
}
void A3DTreeVisitor::SetYourEntity(void* /*pYourEnity*/)
{
//std::vector<A3DStepEntityRefManager>::iterator sIter;
//for(sIter = m_asStepEntityRefManager.begin(); sIter != m_asStepEntityRefManager.end(); ++sIter)
//{
// if(sIter->m_bPushChildren == true)
// sIter->m_apYourEntity.push_back(pYourEnity);
//}
//
//return;
}

View File

@@ -0,0 +1,57 @@
/***********************************************************************************************************************
*
* Copyright (c) 2010 - 2022 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.
*
***********************************************************************************************************************/
#ifndef VISIT_TREE
#define VISIT_TREE
#include "Visitors.h"
#include "VisitorContainer.h"
class A3DConnector;
class A3DVisitorContainer;
class A3DTreeVisitor : public A3DVisitor
{
friend class A3DVisitorContainer;
protected:
unsigned m_uOption;
void* m_pYourEntity;
public:
A3DTreeVisitor(A3DVisitorContainer* psContainer = NULL) : A3DVisitor("Tree", psContainer)
{
m_uOption = 0;
m_pYourEntity = NULL;
}
virtual ~A3DTreeVisitor() {};
virtual A3DStatus visitEnter(const A3DRiBrepModelConnector& sConnector);
virtual A3DStatus visitLeave(const A3DRiBrepModelConnector& sConnector);
virtual A3DStatus visitEnter(const A3DRiSetConnector& sConnector);
virtual A3DStatus visitLeave(const A3DRiSetConnector& sConnector);
virtual A3DStatus visitEnter(const A3DRiConnector& sConnector);
virtual A3DStatus visitLeave(const A3DRiConnector& sConnector);
virtual A3DStatus visitEnter(const A3DPartConnector& sConnector );
virtual A3DStatus visitLeave(const A3DPartConnector& sConnector);
virtual A3DStatus visitEnter(const A3DProductOccurrenceConnector& sConnector);
virtual A3DStatus visitLeave(const A3DProductOccurrenceConnector& sConnector);
void SetYourEntity(void* pYourEnity);
};
#endif

View File

@@ -0,0 +1,206 @@
/***********************************************************************************************************************
*
* Copyright (c) 2010 - 2022 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.
*
***********************************************************************************************************************/
#ifndef A3D_VISITOR
#define A3D_VISITOR
//#define CONNECT_TRANSFO 0x0001
//#define CONNECT_COLORS 0x0002
//#define CONNECT_MESH 0x0004
#define CONNECT_ASSEMBLY_TREE 0x008
//#define CONNECT_BREP 0x0010
//#define CONNECT_PMI 0x00020
//#define CONNECT_VIEWS 0x00040
#define CONNECT_FEATURE 0x00080
#include "TreeTraverse.h"
#ifdef CONNECT_PMI
#include "MarkupTraverse.h"
#endif
#ifdef CONNECT_BREP
#include "BrepTraverse.h"
#endif
#ifdef CONNECT_PMI
#include "MarkupTraverse.h"
#endif
#ifdef CONNECT_MESH
#include "TessConnector.h"
#endif
#ifdef CONNECT_VIEWS
#include "ViewTraverse.h"
#endif
#include <string>
#ifndef CALL_A3D_FCTION
#define CALL_A3D_FCTION(fctname, params) \
fctname params
#endif
#ifndef CHECK_RET_CALL_A3D_FCTION
#define CHECK_RET_CALL_A3D_FCTION(fctname, params) \
{ \
if ((iRet = fctname params)!=A3D_SUCCESS) \
{ /*__debugbreak();*/ return iRet; } \
}
#endif
#ifndef CHECK_RET
#define CHECK_RET(function_call) \
{\
if ((iRet = function_call)!=A3D_SUCCESS) \
return iRet; \
}
#endif
class A3DConnector;
class A3DVisitorContainer;
class A3DVisitor
{
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable:4251) // Suppress the warning C4251 because it leads to have that kind of warning : "warning
// C4251: 'A3DVisitorColorMaterials::m_apsCascadedAttribute' : class 'std::vector<_Ty>' needs to have dll-interface to
// be used by clients of class 'A3DVisitorColorMaterials"
// This is because of the "dllexport" on the visitor classes, as they use stl members and it seems that stl causes
// warning with dllexport with microsoft compiler
#endif // _MSC_VER
protected:
A3DVisitorContainer* m_psContainer;
std::string m_strName;
#ifdef _MSC_VER
#pragma warning(pop)
#endif // _MSC_VER
public :
A3DVisitor(std::string strName, A3DVisitorContainer* psContainer = NULL)
: m_strName(strName), m_psContainer(psContainer){}
virtual ~A3DVisitor() {}
virtual std::string GetName() const { return m_strName; }
//Assembly
#ifdef CONNECT_ASSEMBLY_TREE
virtual A3DStatus visitEnter(const A3DModelFileConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DModelFileConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DProductOccurrenceConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DProductOccurrenceConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DPartConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DPartConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DRiConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DRiConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DRiBrepModelConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DRiBrepModelConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DRiSetConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DRiSetConnector& /*sConnector*/) { return A3D_SUCCESS;}
virtual A3DStatus visitEnter(const A3DPolyRiBrepModelConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DPolyRiBrepModelConnector& /*sConnector*/) { return A3D_SUCCESS; }
#endif
//Markup
#ifdef CONNECT_PMI
virtual A3DStatus visitEnter(const A3DMkpAnnotationEntityConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DMkpAnnotationEntityConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DMkpAnnotationSetConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DMkpAnnotationSetConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DMkpAnnotationItemConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DMkpAnnotationItemConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DMarkupConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DMarkupConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DMarkupDimensionConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DMarkupDimensionConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DMarkupGDTConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DMarkupGDTConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DMarkupDatumConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DMarkupDatumConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DMarkupTessConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DMarkupTessConnector& /*sConnector*/) { return A3D_SUCCESS; }
#endif
//Brep
#ifdef CONNECT_BREP
virtual A3DStatus visitEnter(const A3DBrepDataConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DBrepDataConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DConnexConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DConnexConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DShellConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DShellConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DFaceConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DFaceConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DLoopConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DLoopConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DCoEdgeConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DCoEdgeConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DEdgeConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DEdgeConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DUniqueVertexConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DUniqueVertexConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DMultipleVertexConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DMultipleVertexConnector&) { return A3D_SUCCESS; }
#endif
//Mesh
#ifdef CONNECT_MESH
virtual A3DStatus visitEnter(const A3DTessDataConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DTessDataConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DFaceTessDataConnector&) {return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DFaceTessDataConnector&) {return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DWireTessDataConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DWireTessDataConnector&) { return A3D_SUCCESS; }
#endif
//Views
#ifdef CONNECT_VIEWS
virtual A3DStatus visitEnter(const A3DMkpViewConnector&) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DMkpViewConnector&) { return A3D_SUCCESS; }
#endif
#ifdef CONNECT_FEATURE
virtual A3DStatus visitEnter(const A3DFRMFeatureConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DFRMFeatureConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DFRMParameterConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DFRMParameterConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DFRMTreeConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DFRMTreeConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitEnter(const A3DFRMLinkedItemConnector& /*sConnector*/) { return A3D_SUCCESS; }
virtual A3DStatus visitLeave(const A3DFRMLinkedItemConnector& /*sConnector*/) { return A3D_SUCCESS; }
#endif
};
#endif