/*********************************************************************************************************************** * * 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 #include #include //###################################################################################################################### #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 &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 &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 &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; }