/*********************************************************************************************************************** * * 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. * ***********************************************************************************************************************/ /** * Sample CreatePRCCubes * file CreateModelFile.cpp * This file is containing the data and function used to create PRC Model file. * ***********************************************************************************************************************/ #include "CreateModelFile.h" #include "CreateTessellatedCubes.h" #include "modules/CreateMarkups.h" #include "modules/CreateTextures.h" #include "modules/CreateViews.h" #include #include #include //###################################################################################################################### A3DStatus createCubeTessellation(A3DTess3D** ppTess3D, A3DUns32* puiStyleIndex) { A3DStatus iRet = A3D_SUCCESS; // create a cube tessellation A3DTess3DData sTess3DData; fillCubeTessData(sTess3DData, puiStyleIndex); CHECK_RET(A3DTess3DCreate(&sTess3DData, ppTess3D)); freeTess3DData(sTess3DData); A3DTessBaseData sTessBaseData; fillCubeTessBaseData(sTessBaseData, CUBE_WIDTH, CUBE_HEIGHT, CUBE_LENGTH); CHECK_RET(A3DTessBaseSet(*ppTess3D, &sTessBaseData)); freeTessBaseData(sTessBaseData); return iRet; } //###################################################################################################################### A3DStatus createPolyBREPModel(A3DRiPolyBrepModel** ppPolyBREP, A3DTess3D* pTess3D) { A3DStatus iRet = A3D_SUCCESS; A3DRiPolyBrepModelData sPolyBrepModelData; A3D_INITIALIZE_DATA(A3DRiPolyBrepModelData, sPolyBrepModelData); sPolyBrepModelData.m_bIsClosed = TRUE; CHECK_RET(A3DRiPolyBrepModelCreate(&sPolyBrepModelData, ppPolyBREP)); // assign the cube tessellation to the PolyBrepModel A3DRiRepresentationItemData sRiData; A3D_INITIALIZE_DATA(A3DRiRepresentationItemData, sRiData); sRiData.m_pTessBase = pTess3D; sRiData.m_pCoordinateSystem = NULL; CHECK_RET(A3DRiRepresentationItemSet(*ppPolyBREP, &sRiData)); return iRet; } A3DStatus createPart(A3DAsmPartDefinition** ppPartDef, A3DRiRepresentationItem** ppRIs, A3DUns32 uiRepItemsSize) { A3DStatus iRet = A3D_SUCCESS; A3DAsmPartDefinitionData sPartDefinitionData; A3D_INITIALIZE_DATA(A3DAsmPartDefinitionData, sPartDefinitionData); sPartDefinitionData.m_uiRepItemsSize = uiRepItemsSize; sPartDefinitionData.m_ppRepItems = ppRIs; sPartDefinitionData.m_uiAnnotationsSize = 0; CHECK_RET(A3DAsmPartDefinitionCreate(&sPartDefinitionData, ppPartDef)); return iRet; } //###################################################################################################################### // Create uiPrototypesSize prototypes of the instance PO pInstance. A3DStatus createAssemblyTree(A3DAsmProductOccurrence* pInstance, A3DUns32 uiPrototypesSize, A3DAsmProductOccurrence*** pppPrototypes) { A3DStatus iRet = A3D_SUCCESS; A3DAsmProductOccurrence** ppPrototypes = new A3DAsmProductOccurrence*[uiPrototypesSize]; *pppPrototypes = ppPrototypes; setEntityName(pInstance, "Instance"); A3DMiscAttribute* pAttribute = 0; A3DMiscAttributeData sAttributeData; A3D_INITIALIZE_DATA(A3DMiscAttributeData, sAttributeData); sAttributeData.m_pcTitle = (A3DUTF8Char *)"Instance PO, holding data."; CHECK_RET(A3DMiscAttributeCreate(&sAttributeData, &pAttribute)); addEntityAttributes(pInstance, 1, &pAttribute); A3DEntityDelete(pAttribute); // New PO with prototype A3DAsmProductOccurrenceData sPrototypePOData; A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, sPrototypePOData); sPrototypePOData.m_pPrototype = pInstance; // populating the PO Data Structure with the prototype for (A3DUns32 i = 0; i < uiPrototypesSize; ++i) { if (i > 0) { // create new location (color can also be modify) A3DMiscCartesianTransformation* newLocation = NULL; A3DMiscCartesianTransformationData newLocationData; A3D_INITIALIZE_DATA(A3DMiscCartesianTransformationData, newLocationData); newLocationData.m_sOrigin.m_dX = i * CUBE_SPACING; newLocationData.m_sOrigin.m_dY = i * CUBE_SPACING; newLocationData.m_sOrigin.m_dZ = i * CUBE_SPACING; newLocationData.m_sScale.m_dX = 1; newLocationData.m_sScale.m_dY = 1; newLocationData.m_sScale.m_dZ = 1; newLocationData.m_sXVector.m_dX = 1.0; newLocationData.m_sXVector.m_dY = 0.0; newLocationData.m_sXVector.m_dZ = 0.0; newLocationData.m_sYVector.m_dX = 0.0; newLocationData.m_sYVector.m_dY = 1.0; newLocationData.m_sYVector.m_dZ = 0.0; newLocationData.m_ucBehaviour = kA3DTransformationTranslate | kA3DTransformationRotate; A3DMiscCartesianTransformationCreate(&newLocationData, &newLocation); // populating the PO Data Structure with the location sPrototypePOData.m_pLocation = newLocation; } // create PO from PO Data structure A3DAsmProductOccurrenceCreate(&sPrototypePOData, &ppPrototypes[i]); // add Base Info to enable graphics behaviors. A3DRootBaseData sBaseData; A3D_INITIALIZE_DATA(A3DRootBaseData, sBaseData); CHECK_RET(A3DRootBaseSet(ppPrototypes[i], &sBaseData)); // sample name CHECK_RET(setEntityName(ppPrototypes[i], "Prototype")); // sample attribute A3DMiscAttribute* pProtoAttribute=nullptr; A3DMiscAttributeData sProtoAttributeData; A3D_INITIALIZE_DATA(A3DMiscAttributeData, sProtoAttributeData); sProtoAttributeData.m_pcTitle = (A3DUTF8Char *)"Prototype PO to an instance PO."; CHECK_RET(A3DMiscAttributeCreate(&sProtoAttributeData, &pProtoAttribute)); CHECK_RET(addEntityAttributes(ppPrototypes[i], 1, &pProtoAttribute)); A3DEntityDelete(pProtoAttribute); } // we set the last cube blue, redefining the texture graphics setEntityColor(ppPrototypes[uiPrototypesSize - 1], BLUE, 0.5); return iRet; } //###################################################################################################################### A3DStatus createFileMarkups(A3DMkpAnnotationItem** ppOutAnnotationsSet, A3DUns32 uiPrototypesSize, A3DAsmProductOccurrence** ppPrototypes, A3DRiPolyBrepModel* pRiPolyBrepModel) { A3DStatus iRet = A3D_SUCCESS; std::vector vpAnnotations; A3DMkpAnnotationItem* pNewAnnotation = 0; A3DAsmProductOccurrence* pCurrentPO = 0; A3DUns32 uiPOCurrentIndex = 0; // ------------------------------------------------------------------ // initialize markups position. A3DVector3dData sAnnotationLeaderPos; A3D_INITIALIZE_DATA(A3DVector3dData, sAnnotationLeaderPos); A3DVector3dData sAnnotationLeaderPosOffset; A3D_INITIALIZE_DATA(A3DVector3dData, sAnnotationLeaderPosOffset); sAnnotationLeaderPosOffset.m_dX = 0; sAnnotationLeaderPosOffset.m_dY = 0; sAnnotationLeaderPosOffset.m_dZ = CUBE_HEIGHT; A3DVector3dData sAnnotationFramePos; A3D_INITIALIZE_DATA(A3DVector3dData, sAnnotationFramePos); A3DVector3dData sAnnotationFramePosOffset; A3D_INITIALIZE_DATA(A3DVector3dData, sAnnotationFramePosOffset); sAnnotationFramePosOffset.m_dX = 1 * CUBE_WIDTH; sAnnotationFramePosOffset.m_dY = 1 * CUBE_LENGTH; sAnnotationFramePosOffset.m_dZ = 2 * CUBE_HEIGHT; // ------------------------------------------------------------------ // simple markup A3DUTF8Char *pcTextSimpleMarkup = (A3DUTF8Char *)"Simple"; pCurrentPO = ppPrototypes[uiPOCurrentIndex]; ++uiPOCurrentIndex; CHECK_RET(getPOLocationOrigin(pCurrentPO, &sAnnotationLeaderPos)); sAnnotationLeaderPos.m_dX += sAnnotationLeaderPosOffset.m_dX; sAnnotationLeaderPos.m_dY += sAnnotationLeaderPosOffset.m_dY; sAnnotationLeaderPos.m_dZ += sAnnotationLeaderPosOffset.m_dZ; CHECK_RET(getPOLocationOrigin(pCurrentPO, &sAnnotationFramePos)); sAnnotationFramePos.m_dX += sAnnotationFramePosOffset.m_dX; sAnnotationFramePos.m_dY += sAnnotationFramePosOffset.m_dY; sAnnotationFramePos.m_dZ += sAnnotationFramePosOffset.m_dZ; CHECK_RET(createMarkup(&pNewAnnotation, pcTextSimpleMarkup, 1, &pRiPolyBrepModel, &pCurrentPO, &sAnnotationFramePos, &sAnnotationLeaderPos)); vpAnnotations.push_back(pNewAnnotation); // ------------------------------------------------------------------ // Markup on a face A3DUTF8Char *pcTextOnFace = (A3DUTF8Char *)"Face"; pCurrentPO = ppPrototypes[uiPOCurrentIndex]; ++uiPOCurrentIndex; CHECK_RET(getPOLocationOrigin(pCurrentPO, &sAnnotationLeaderPos)); sAnnotationLeaderPos.m_dX += sAnnotationLeaderPosOffset.m_dX; sAnnotationLeaderPos.m_dY += sAnnotationLeaderPosOffset.m_dY; sAnnotationLeaderPos.m_dZ += sAnnotationLeaderPosOffset.m_dZ; CHECK_RET(getPOLocationOrigin(pCurrentPO, &sAnnotationFramePos)); sAnnotationFramePos.m_dX += sAnnotationFramePosOffset.m_dX; sAnnotationFramePos.m_dY += sAnnotationFramePosOffset.m_dY; sAnnotationFramePos.m_dZ += sAnnotationFramePosOffset.m_dZ; A3DUns32 uiFaceIndex = 0; CHECK_RET(createMarkupOnFace(&pNewAnnotation, pcTextOnFace, 1, &pRiPolyBrepModel, &pCurrentPO, &uiFaceIndex, &sAnnotationFramePos, &sAnnotationLeaderPos)); vpAnnotations.push_back(pNewAnnotation); // ------------------------------------------------------------------ // Markup parrallel to screen A3DUTF8Char *pcTextParallel = (A3DUTF8Char *)"Parallel"; pCurrentPO = ppPrototypes[uiPOCurrentIndex]; ++uiPOCurrentIndex; CHECK_RET(getPOLocationOrigin(pCurrentPO, &sAnnotationFramePos)); sAnnotationFramePos.m_dX += sAnnotationFramePosOffset.m_dX; sAnnotationFramePos.m_dY += sAnnotationFramePosOffset.m_dY; sAnnotationFramePos.m_dZ += sAnnotationFramePosOffset.m_dZ; CHECK_RET(createMarkupFaceToScreen(&pNewAnnotation, pcTextParallel, 1, &pRiPolyBrepModel, &pCurrentPO, &sAnnotationFramePos)); vpAnnotations.push_back(pNewAnnotation); // ------------------------------------------------------------------ // Markup non Zoomable A3DUTF8Char *pcTextZoomable = (A3DUTF8Char *)"Non zoomable"; pCurrentPO = ppPrototypes[uiPOCurrentIndex]; ++uiPOCurrentIndex; CHECK_RET(getPOLocationOrigin(pCurrentPO, &sAnnotationFramePos)); sAnnotationFramePos.m_dX += sAnnotationFramePosOffset.m_dX; sAnnotationFramePos.m_dY += sAnnotationFramePosOffset.m_dY; sAnnotationFramePos.m_dZ += sAnnotationFramePosOffset.m_dZ; CHECK_RET(createMarkupFaceToScreen(&pNewAnnotation, pcTextZoomable, 1, &pRiPolyBrepModel, &pCurrentPO, &sAnnotationFramePos, FlatToScreenNonZoomable)); vpAnnotations.push_back(pNewAnnotation); // ------------------------------------------------------------------ // Markup non Zoomable A3DUTF8Char *pcTextAttached = (A3DUTF8Char *)"OnTop"; pCurrentPO = ppPrototypes[uiPOCurrentIndex]; ++uiPOCurrentIndex; CHECK_RET(getPOLocationOrigin(pCurrentPO, &sAnnotationFramePos)); sAnnotationFramePos.m_dX += sAnnotationFramePosOffset.m_dX; sAnnotationFramePos.m_dY += sAnnotationFramePosOffset.m_dY; sAnnotationFramePos.m_dZ += sAnnotationFramePosOffset.m_dZ; CHECK_RET(createMarkupFaceToScreen(&pNewAnnotation, pcTextAttached, 1, &pRiPolyBrepModel, &pCurrentPO, &sAnnotationFramePos, FlatToScreenAlwaysOnTop)); vpAnnotations.push_back(pNewAnnotation); // ------------------------------------------------------------------ // Highlight all prototypes passed A3DUTF8Char *pcTextHighlightAll = (A3DUTF8Char *)"Highlight All"; A3DVector3dData sHighlightAllPos; A3D_INITIALIZE_DATA(A3DVector3dData, sHighlightAllPos); sHighlightAllPos.m_dX = -4 * CUBE_WIDTH; sHighlightAllPos.m_dY = -4 * CUBE_LENGTH; sHighlightAllPos.m_dZ = -4 * CUBE_HEIGHT; std::vector vpLinkedEntity; std::vector vpPOTarget; for (A3DUns32 i = 0; i < uiPrototypesSize; ++i) { vpLinkedEntity.push_back(pRiPolyBrepModel); vpPOTarget.push_back(ppPrototypes[i]); } CHECK_RET(createMarkupFaceToScreen(&pNewAnnotation, pcTextHighlightAll, uiPrototypesSize, &vpLinkedEntity[0], &vpPOTarget[0], &sHighlightAllPos)); vpAnnotations.push_back(pNewAnnotation); vpLinkedEntity.clear(); vpPOTarget.clear(); // ------------------------------------------------------------------ // Create a Markup Set and add markups in it A3DMkpAnnotationSetData sAnnotationSetData; A3D_INITIALIZE_DATA(A3DMkpAnnotationSetData, sAnnotationSetData); sAnnotationSetData.m_uiAnnotationsSize = (A3DUns32)vpAnnotations.size(); sAnnotationSetData.m_ppAnnotations = &(vpAnnotations[0]); CHECK_RET(A3DMkpAnnotationSetCreate(&sAnnotationSetData, ppOutAnnotationsSet)); vpAnnotations.clear(); return iRet; } //###################################################################################################################### A3DStatus createFileViews(A3DUns32* puiOutMkpViewSize, A3DMkpView*** pppOutMkpViews, A3DUns32 uiPrototypesSize, A3DAsmProductOccurrence** ppPrototypes, A3DUns32 uiAnnotationSize, A3DMkpAnnotationItem** ppMkpAnnotationItem, A3DRiPolyBrepModel* pRiPolyBrepModel) { A3DStatus iRet = A3D_SUCCESS; std::vector vpMkpViews; *puiOutMkpViewSize = 0; A3DVector3dData sCameraPos; A3DVector3dData sCameraLookAt; // ------------------------------------------------------------------ // "A View With A Camera" A3D_INITIALIZE_DATA(A3DVector3dData, sCameraPos); sCameraPos.m_dX = stCameraPosDefault.m_dX; sCameraPos.m_dY = stCameraPosDefault.m_dY; sCameraPos.m_dZ = stCameraPosDefault.m_dZ; A3D_INITIALIZE_DATA(A3DVector3dData, sCameraLookAt); sCameraLookAt.m_dX = stCameraLookAtDefault.m_dX; sCameraLookAt.m_dY = stCameraLookAtDefault.m_dY; sCameraLookAt.m_dZ = stCameraLookAtDefault.m_dZ; A3DMkpView* pMkpViewWithCamera = 0; A3DMkpViewData sMkpViewWithCamera; A3D_INITIALIZE_DATA(A3DMkpViewData, sMkpViewWithCamera); CHECK_RET(setViewCameraPlacement(&sMkpViewWithCamera, &sCameraPos, &sCameraLookAt, -1, -1)); CHECK_RET(createView(&pMkpViewWithCamera, &sMkpViewWithCamera, "Define New Camera")); vpMkpViews.push_back(pMkpViewWithCamera); // ------------------------------------------------------------------ // "A View That Hide Objects" A3DAsmProductOccurrence* ppPOsToHide[3]; ppPOsToHide[0] = ppPrototypes[0]; ppPOsToHide[1] = ppPrototypes[2]; ppPOsToHide[2] = ppPrototypes[4]; A3DRootBaseWithGraphicsData sRootBaseWithGraphicsHiddenData; A3D_INITIALIZE_DATA(A3DRootBaseWithGraphicsData, sRootBaseWithGraphicsHiddenData); CHECK_RET(setGraphicsHidden(&sRootBaseWithGraphicsHiddenData)); A3DMkpViewData sMkpViewHidingObjects; A3D_INITIALIZE_DATA(A3DMkpViewData, sMkpViewHidingObjects); CHECK_RET(setViewEntitiesGraphics(&sMkpViewHidingObjects, 3, ppPOsToHide, &sRootBaseWithGraphicsHiddenData)); CHECK_RET(A3DGraphicsDelete(sRootBaseWithGraphicsHiddenData.m_pGraphics)); A3DMkpView* pMkpViewHidingObjects = 0; CHECK_RET(createView(&pMkpViewHidingObjects, &sMkpViewHidingObjects, "Hide Objects")); vpMkpViews.push_back(pMkpViewHidingObjects); free(sMkpViewHidingObjects.m_ppLinkedItems); // ------------------------------------------------------------------ // "A View That Change Objects Color" A3DAsmProductOccurrence* ppPOsToChangeColor[2]; ppPOsToChangeColor[0] = ppPrototypes[1]; ppPOsToChangeColor[1] = ppPrototypes[3]; A3DRootBaseWithGraphicsData sRootBaseWithGraphicsYellowColorData; A3D_INITIALIZE_DATA(A3DRootBaseWithGraphicsData, sRootBaseWithGraphicsYellowColorData); CHECK_RET(setGraphicsColor(&sRootBaseWithGraphicsYellowColorData, YELLOW, 1.0)); A3DMkpViewData sMkpViewChangingObjectColor; A3D_INITIALIZE_DATA(A3DMkpViewData, sMkpViewChangingObjectColor); CHECK_RET(setViewEntitiesGraphics(&sMkpViewChangingObjectColor, 2, ppPOsToChangeColor, &sRootBaseWithGraphicsYellowColorData)); CHECK_RET(A3DGraphicsDelete(sRootBaseWithGraphicsYellowColorData.m_pGraphics)); A3DMkpView* pMkpViewChangingObjectColor = 0; CHECK_RET(createView(&pMkpViewChangingObjectColor, &sMkpViewChangingObjectColor, "Change Objects Color")); vpMkpViews.push_back(pMkpViewChangingObjectColor); free(sMkpViewChangingObjectColor.m_ppLinkedItems); // ------------------------------------------------------------------ // "A View That Change Face Color" A3DMiscMarkupLinkedItem* pMarkupLinkedItem = NULL; A3DUns32 faceindex[1]; faceindex[0] = 0; CHECK_RET(createMarkupLinkedItemOnTess(pRiPolyBrepModel, kA3DTypeTessFace, 1, faceindex, ppPrototypes[2], &pMarkupLinkedItem)); A3DMiscMarkupLinkedItem* ppLinkedItemsToChangeColorOnFace[1]; ppLinkedItemsToChangeColorOnFace[0] = pMarkupLinkedItem; A3DRootBaseWithGraphicsData sRootBaseWithGraphicsGreenColorData; A3D_INITIALIZE_DATA(A3DRootBaseWithGraphicsData, sRootBaseWithGraphicsGreenColorData); CHECK_RET(setGraphicsColor(&sRootBaseWithGraphicsGreenColorData, GREEN, 1.0)); CHECK_RET(A3DRootBaseWithGraphicsSet(ppLinkedItemsToChangeColorOnFace[0], &sRootBaseWithGraphicsGreenColorData)); CHECK_RET(A3DGraphicsDelete(sRootBaseWithGraphicsGreenColorData.m_pGraphics)); A3DMkpViewData sMkpViewChangingFaceColor; A3D_INITIALIZE_DATA(A3DMkpViewData, sMkpViewChangingFaceColor); CHECK_RET(addViewLinkedItem(&sMkpViewChangingFaceColor, 1, ppLinkedItemsToChangeColorOnFace)); A3DMkpView* pMkpViewChangingFaceColor = 0; CHECK_RET(createView(&pMkpViewChangingFaceColor, &sMkpViewChangingFaceColor, "Change Face Color")); vpMkpViews.push_back(pMkpViewChangingFaceColor); free(sMkpViewChangingFaceColor.m_ppLinkedItems); // ------------------------------------------------------------------ // "A View With Visible Annotation" A3DMkpAnnotationItem* ppAnnotations[2]; ppAnnotations[0] = ppMkpAnnotationItem[1]; ppAnnotations[1] = ppMkpAnnotationItem[2]; A3DMkpViewData sMkpViewWithAnnotation; A3D_INITIALIZE_DATA(A3DMkpViewData, sMkpViewWithAnnotation); CHECK_RET(setViewAnnotations(&sMkpViewWithAnnotation, 2, ppAnnotations)); A3DMkpView* pMkpViewWithAnnotation = 0; CHECK_RET(createView(&pMkpViewWithAnnotation, &sMkpViewWithAnnotation, "Visible Annotation")); vpMkpViews.push_back(pMkpViewWithAnnotation); // ------------------------------------------------------------------ // "A View With That Change Object Position" A3DMiscCartesianTransformation* ppTransformations[3]; A3DMiscCartesianTransformationData sTransformationData; A3D_INITIALIZE_DATA(A3DMiscCartesianTransformationData, sTransformationData); sTransformationData.m_sOrigin.m_dX = CUBE_SPACING + CUBE_SPACING; sTransformationData.m_sOrigin.m_dY = CUBE_SPACING; sTransformationData.m_sOrigin.m_dZ = CUBE_SPACING; sTransformationData.m_sXVector.m_dX = 1.; sTransformationData.m_sXVector.m_dY = 0.; sTransformationData.m_sXVector.m_dZ = 0.; sTransformationData.m_sYVector.m_dX = 0.; sTransformationData.m_sYVector.m_dY = 1.; sTransformationData.m_sYVector.m_dZ = 0.; sTransformationData.m_sScale.m_dX = 1.; sTransformationData.m_sScale.m_dY = 1.; sTransformationData.m_sScale.m_dZ = 1.; CHECK_RET(A3DMiscCartesianTransformationCreate(&sTransformationData, &ppTransformations[0])); CHECK_RET(A3DMiscCartesianTransformationCreate(&sTransformationData, &ppTransformations[1])); CHECK_RET(A3DMiscCartesianTransformationCreate(&sTransformationData, &ppTransformations[2])); A3DAsmProductOccurrence* ppPOsToChangePos[3]; ppPOsToChangePos[0] = ppPrototypes[0]; ppPOsToChangePos[1] = ppPrototypes[1]; ppPOsToChangePos[2] = ppPrototypes[2]; A3DMkpViewData sMkpViewChangeObjectPos; A3D_INITIALIZE_DATA(A3DMkpViewData, sMkpViewChangeObjectPos); CHECK_RET(setViewEntitiesOffsetPosition(&sMkpViewChangeObjectPos, 3, ppPOsToChangePos, ppTransformations)); A3DEntityDelete(ppTransformations[0]); A3DEntityDelete(ppTransformations[1]); A3DEntityDelete(ppTransformations[2]); A3DMkpView* pMkpViewChangeObjectPos = 0; CHECK_RET(createView(&pMkpViewChangeObjectPos, &sMkpViewChangeObjectPos, "Change Object Position")); vpMkpViews.push_back(pMkpViewChangeObjectPos); free(sMkpViewChangeObjectPos.m_ppLinkedItems); // ------------------------------------------------------------------ // "Default View with Camera and all annotations" A3D_INITIALIZE_DATA(A3DVector3dData, sCameraPos); sCameraPos.m_dX = 0; sCameraPos.m_dY = 0; sCameraPos.m_dZ = uiPrototypesSize * (CUBE_LENGTH + CUBE_SPACING); A3D_INITIALIZE_DATA(A3DVector3dData, sCameraLookAt); sCameraLookAt.m_dX = uiPrototypesSize * (CUBE_WIDTH + CUBE_SPACING) / 2.; sCameraLookAt.m_dY = uiPrototypesSize * (CUBE_HEIGHT + CUBE_SPACING) / 2.; sCameraLookAt.m_dZ = uiPrototypesSize * CUBE_LENGTH; A3DDouble dXFovy = (uiPrototypesSize +1) * (CUBE_WIDTH + CUBE_SPACING) / 2.; A3DDouble dYFovy = (uiPrototypesSize +1) * (CUBE_HEIGHT + CUBE_SPACING) / 2.; A3DMkpViewData sMkpViewDefault; A3D_INITIALIZE_DATA(A3DMkpViewData, sMkpViewDefault); CHECK_RET(setViewCameraPlacement(&sMkpViewDefault, &sCameraPos, &sCameraLookAt, dXFovy, dYFovy)); CHECK_RET(setViewAnnotations(&sMkpViewDefault, uiAnnotationSize, ppMkpAnnotationItem)); A3DMkpView* pMkpViewDefault = 0; CHECK_RET(createView(&pMkpViewDefault, &sMkpViewDefault, "Default View")); vpMkpViews.push_back(pMkpViewDefault); // ------------------------------------------------------------------ // copy view vector *puiOutMkpViewSize = (A3DUns32)vpMkpViews.size(); A3DMkpView** ppMkpViews = new A3DMkpView*[vpMkpViews.size()]; for (A3DUns32 i = 0; i < (A3DUns32)vpMkpViews.size(); ++i) { ppMkpViews[i] = vpMkpViews[i]; } *pppOutMkpViews = ppMkpViews; return iRet; } //###################################################################################################################### A3DStatus createPRCCubesFile(A3DAsmModelFile** ppModelFile, const A3DUTF8Char* pcTextureFilePath = NULL) { A3DStatus iRet = A3D_SUCCESS; // ------------------------------------------------------------------ // create Texture if needed A3DUns32 uiStyleIndex = A3D_DEFAULT_STYLE_INDEX; // will become the texture index if (pcTextureFilePath != NULL) { // the picture width and height are read from the image (for supported image types), // and since we don't know them, width and height can be 0 iRet = createTexture(pcTextureFilePath, kA3DPictureJpg, 0, 0, uiStyleIndex); // JPG //iRet = createTexture(pcTextureFilePath, kA3DPicturePng, 0, 0, uiStyleIndex); // PNG } // ------------------------------------------------------------------ // create a cube tessellation A3DTess3D* pTess3D = NULL; CHECK_RET(createCubeTessellation(&pTess3D, &uiStyleIndex)); // ------------------------------------------------------------------ // create a PolyBrepModel representation item A3DRiPolyBrepModel *pRiPolyBrepModel = NULL; CHECK_RET(createPolyBREPModel(&pRiPolyBrepModel, pTess3D)); // ------------------------------------------------------------------ // create a PartDefinition to hold the PolyBrepModel and markups A3DAsmPartDefinition *pPartDefinition = NULL; CHECK_RET(createPart(&pPartDefinition, &pRiPolyBrepModel, 1)); // ------------------------------------------------------------------ // create a ProductOccurrence to stock the Part Definition A3DAsmProductOccurrence* pPO = NULL; A3DAsmProductOccurrenceData sPOData; A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, sPOData); sPOData.m_pPart = pPartDefinition; CHECK_RET(A3DAsmProductOccurrenceCreate(&sPOData, &pPO)); // ------------------------------------------------------------------ // Create Prototypes // Create N PO using previous PO as prototype A3DUns32 uiPOSize = 6; A3DAsmProductOccurrence** ppPOs = 0; CHECK_RET(createAssemblyTree(pPO, uiPOSize, &ppPOs)); // ------------------------------------------------------------------ // create Markups A3DMkpAnnotationItem* pMkpAnnotationSet = 0; CHECK_RET(createFileMarkups(&pMkpAnnotationSet, uiPOSize, ppPOs, pRiPolyBrepModel)); // ------------------------------------------------------------------ // create Views A3DUns32 uiMkpViewsSize = 0; A3DMkpView** ppMkpViews = 0; A3DMkpAnnotationSetData sAnnotationSetData; A3D_INITIALIZE_DATA(A3DMkpAnnotationSetData, sAnnotationSetData); CHECK_RET(A3DMkpAnnotationSetGet(pMkpAnnotationSet, &sAnnotationSetData)); CHECK_RET(createFileViews(&uiMkpViewsSize, &ppMkpViews, uiPOSize, ppPOs, sAnnotationSetData.m_uiAnnotationsSize, sAnnotationSetData.m_ppAnnotations, pRiPolyBrepModel)); CHECK_RET(A3DMkpAnnotationSetGet(nullptr,&sAnnotationSetData)); // ------------------------------------------------------------------ // create the Root Product Occurrence. A3DAsmProductOccurrence* pSubAsm = NULL; A3DAsmProductOccurrenceData sSubAsmData; A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, sSubAsmData); sSubAsmData.m_uiPOccurrencesSize = uiPOSize; sSubAsmData.m_ppPOccurrences = ppPOs; if (pMkpAnnotationSet) { sSubAsmData.m_uiAnnotationsSize = 1; sSubAsmData.m_ppAnnotations = &pMkpAnnotationSet; } sSubAsmData.m_uiViewsSize = uiMkpViewsSize; sSubAsmData.m_ppViews = ppMkpViews; CHECK_RET(A3DAsmProductOccurrenceCreate(&sSubAsmData, &pSubAsm)); // delete allocated datas if (uiPOSize != 0) delete ppPOs; if (uiMkpViewsSize != 0) delete ppMkpViews; // ------------------------------------------------------------------ // Insertion of the whole product structure in the modelfile A3DAsmModelFileData sData; A3D_INITIALIZE_DATA(A3DAsmModelFileData, sData); sData.m_uiPOccurrencesSize = 1; sData.m_dUnit = 1.0; sData.m_ppPOccurrences = &pSubAsm; CHECK_RET(A3DAsmModelFileCreate(&sData, ppModelFile)); return iRet; }