Files
Hoops_Exchange/exchange/exchangesource/DrawingViewer/drawing_collect.cpp
2025-12-15 23:22:33 +08:00

139 lines
4.7 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.
*
***********************************************************************************************************************/
#include <vector>
#include <iostream>
#include <A3DSDKIncludes.h>
//######################################################################################################################
#define CHECK_RET(function_call) {\
iRet = function_call; if(iRet != A3D_SUCCESS) { std::cout << "Error number=" << iRet << std::endl; return iRet; }\
}
//######################################################################################################################
static A3DStatus stCollectDrawingOnPartDefinition(A3DEntity* psEntity, std::vector<A3DDrawingModel*> &apDrawingModels)
{
// Check type of entity
A3DEEntityType eType = kA3DTypeUnknown;
A3DEntityGetType(psEntity, &eType);
if(eType != kA3DTypeAsmPartDefinition)
return A3D_INVALID_ENTITY_TYPE;
A3DStatus iRet = A3D_SUCCESS;
// Get data of A3DAsmPartDefinition
A3DAsmPartDefinition* pPartDefinition = (A3DAsmPartDefinition*) psEntity;
A3DAsmPartDefinitionData sPartData;
A3D_INITIALIZE_DATA(A3DAsmPartDefinitionData, sPartData);
CHECK_RET(A3DAsmPartDefinitionGet(pPartDefinition, &sPartData));
// Collect all DrawingModels
if(sPartData.m_uiDrawingModelsSize != 0)
{
A3DUns32 uiElem;
for(uiElem = 0; uiElem < sPartData.m_uiDrawingModelsSize; uiElem++)
{
if(sPartData.m_ppDrawingModels[uiElem] != NULL)
apDrawingModels.push_back(sPartData.m_ppDrawingModels[uiElem]);
}
}
// Free allocated data
A3DAsmPartDefinitionGet(NULL, &sPartData);
return iRet;
}
//######################################################################################################################
static A3DStatus stProductOccurrenceGetPart(A3DAsmProductOccurrenceData* psPOccData, A3DAsmPartDefinition** ppPart)
{
if(psPOccData == NULL)
return A3D_ERROR;
A3DStatus iRet = A3D_SUCCESS;
*ppPart = NULL;
if(psPOccData->m_pPart != NULL)
{
*ppPart = psPOccData->m_pPart;
return iRet;
}
A3DAsmProductOccurrence* pProductPrototype = psPOccData->m_pPrototype;
while(pProductPrototype != NULL)
{
A3DAsmProductOccurrenceData sProductPrototypeData;
A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, sProductPrototypeData);
CHECK_RET(A3DAsmProductOccurrenceGet(pProductPrototype, &sProductPrototypeData));
if(sProductPrototypeData.m_pPart != NULL)
{
CHECK_RET(A3DAsmProductOccurrenceGet(NULL, &sProductPrototypeData));
*ppPart = sProductPrototypeData.m_pPart;
return iRet;
}
else
pProductPrototype = sProductPrototypeData.m_pPrototype;
CHECK_RET(A3DAsmProductOccurrenceGet(NULL, &sProductPrototypeData));
}
return iRet;
}
//######################################################################################################################
static A3DStatus stParseProductOccurrence(A3DAsmProductOccurrence* pOccurrence,
std::vector<A3DDrawingModel*> &apDrawingModels)
{
A3DStatus iRet = A3D_SUCCESS;
A3DAsmProductOccurrenceData sData;
A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, sData);
CHECK_RET(A3DAsmProductOccurrenceGet(pOccurrence, &sData));
if(sData.m_ucBehaviour != 1)
{
A3DAsmPartDefinition* pPart = NULL;
stProductOccurrenceGetPart(&sData, &pPart);
if(pPart)
CHECK_RET(stCollectDrawingOnPartDefinition(pPart, apDrawingModels));
unsigned int uiPO;
for(uiPO = 0; uiPO < sData.m_uiPOccurrencesSize; ++uiPO)
CHECK_RET(stParseProductOccurrence(sData.m_ppPOccurrences[uiPO], apDrawingModels));
}
CHECK_RET(A3DAsmProductOccurrenceGet(NULL, &sData));
return iRet;
}
//######################################################################################################################
A3DStatus CollectDrawing(A3DAsmModelFile* pModelFile, std::vector<A3DDrawingModel*> &apDrawingModels)
{
A3DStatus iRet = A3D_SUCCESS;
A3DAsmModelFileData sData;
A3D_INITIALIZE_DATA(A3DAsmModelFileData, sData);
CHECK_RET(A3DAsmModelFileGet(pModelFile, &sData));
for(A3DUns32 ui = 0; ui < sData.m_uiPOccurrencesSize; ++ui)
{
CHECK_RET(stParseProductOccurrence(sData.m_ppPOccurrences[ui], apDrawingModels));
}
CHECK_RET(A3DAsmModelFileGet(NULL, &sData));
return iRet;
}