/*********************************************************************************************************************** * * 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 CreateViews.cpp * This file is containing the function allowing to create views. * * The function createView contains a lot of optionnal elements that function as so: * * If pCameraPos and pCameraLookAt are defined: function stiA3DGraphSceneDisplayParametersDataAddCamera * is used to create a camera placement. * * If inGraphicsData is defined: linked item will be created in order to, at view activation, * apply the graphic behavior on the POs defined by ppLinkedPOs. * * If ppAnnotations are defined: the designated annotation will not be hidden at view activation. * * ***********************************************************************************************************************/ #include "CreateViews.h" #include //###################################################################################################################### // Camera creation static int stiA3DGraphSceneDisplayParametersDataAddCamera(A3DGraphSceneDisplayParametersData& sGraphSceneDisplayParametersData, A3DVector3dData& sCameraPos, A3DVector3dData& sCameraLookAt, A3DDouble dXFovy, A3DDouble dYFovy) { A3DGraphCameraData sData; A3DGraphCamera* pCamera = NULL; A3D_INITIALIZE_DATA(A3DGraphCameraData, sData); sData.m_bOrthographic = true; sData.m_dAspectRatio = 1; sData.m_dZNear = 0.; sData.m_dZFar = 2. * INFINITE_COORD; sData.m_dXFovy = (dXFovy == -1.) ? stCameraFovX : dXFovy; sData.m_dYFovy = (dYFovy == -1.) ? stCameraFovY : dYFovy; sData.m_sLookAt.m_dX = sCameraLookAt.m_dX; sData.m_sLookAt.m_dY = sCameraLookAt.m_dY; sData.m_sLookAt.m_dZ = sCameraLookAt.m_dZ; sData.m_sLocation.m_dX = sCameraPos.m_dX; sData.m_sLocation.m_dY = sCameraPos.m_dY; sData.m_sLocation.m_dZ = sCameraPos.m_dZ; sData.m_sUp.m_dX = 0.; sData.m_sUp.m_dY = 1.; sData.m_sUp.m_dZ = 0.; if (A3DGraphCameraCreate(&sData, &pCamera) != A3D_SUCCESS) return A3D_ERROR; sGraphSceneDisplayParametersData.m_pCamera = pCamera; return A3D_SUCCESS; } //###################################################################################################################### //###################################################################################################################### A3DStatus setViewCameraPlacement(A3DMkpViewData* pMkpViewData, A3DVector3dData* pCameraPos, A3DVector3dData* pCameraLookAt, A3DDouble dXFovy, A3DDouble dYFovy) { A3DStatus iRet = A3D_SUCCESS; if (pCameraPos && pCameraLookAt) { A3DGraphSceneDisplayParametersData sGraphSceneDisplayParametersData; A3D_INITIALIZE_DATA(A3DGraphSceneDisplayParametersData, sGraphSceneDisplayParametersData); sGraphSceneDisplayParametersData.m_uiBackgroundStyleIndex = A3D_DEFAULT_STYLE_INDEX; stiA3DGraphSceneDisplayParametersDataAddCamera(sGraphSceneDisplayParametersData, *pCameraPos, *pCameraLookAt, dXFovy, dYFovy); CHECK_RET(A3DGraphSceneDisplayParametersCreate(&sGraphSceneDisplayParametersData, &pMkpViewData->m_pSceneDisplayParameters)); } return iRet; } //###################################################################################################################### A3DStatus addViewLinkedItem(A3DMkpViewData* pMkpViewData, A3DUns32 uiLinkedItemsSize, A3DMiscMarkupLinkedItem** ppLinkedItems) { A3DStatus iRet = A3D_SUCCESS; std::vector vpMarkupLinkedItems; // copy previous linked item of view. for (A3DUns32 i = 0; i < pMkpViewData->m_uiLinkedItemsSize; ++i) { vpMarkupLinkedItems.push_back(pMkpViewData->m_ppLinkedItems); } // add the new ones for (A3DUns32 i = 0; i < uiLinkedItemsSize; ++i) { vpMarkupLinkedItems.push_back(ppLinkedItems[i]); } // replace the data pMkpViewData->m_uiLinkedItemsSize = (A3DUns32)vpMarkupLinkedItems.size(); pMkpViewData->m_ppLinkedItems = (A3DMiscMarkupLinkedItem**) malloc(pMkpViewData->m_uiLinkedItemsSize * A3DUns32(sizeof(A3DMiscMarkupLinkedItem*))); for (A3DUns32 i = 0; i < pMkpViewData->m_uiLinkedItemsSize; ++i) { pMkpViewData->m_ppLinkedItems[i] = vpMarkupLinkedItems[i]; } return iRet; } //###################################################################################################################### A3DStatus setIsDefaultView(A3DMkpViewData* pMkpViewData, A3DBool bIsDefaultView) { A3DStatus iRet = A3D_SUCCESS; pMkpViewData->m_bIsDefaultView = bIsDefaultView; return iRet; } //###################################################################################################################### A3DStatus setViewEntitiesOffsetPosition(A3DMkpViewData* pMkpViewData, A3DUns32 uiLinkedPOsSize, A3DAsmProductOccurrence** ppLinkedPOs, A3DMiscCartesianTransformation** ppOffsetTransformation) { A3DStatus iRet = A3D_SUCCESS; std::vector vpMarkupLinkedItems; // create new Linked items pointing to entity with new coordinates systems for (A3DUns32 i = 0; i < uiLinkedPOsSize; ++i) { // create a linked item pointing to the entity A3DMiscMarkupLinkedItem* pLinkedItem = 0; CHECK_RET(createMarkupLinkedItemOnProduct(ppLinkedPOs[i], NULL, &pLinkedItem)); // create the new coordinate system // add the offset to every PO current position A3DAsmProductOccurrenceData sPOData; A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, sPOData); CHECK_RET(A3DAsmProductOccurrenceGet(ppLinkedPOs[i], &sPOData)); A3DMiscCartesianTransformationData sPOTransformationData; A3D_INITIALIZE_DATA(A3DMiscCartesianTransformationData, sPOTransformationData); CHECK_RET(A3DMiscCartesianTransformationGet(sPOData.m_pLocation, &sPOTransformationData)); A3DMiscCartesianTransformation* pOffsetTransformation = 0; A3DMiscCartesianTransformationData sOffsetTransformationData; A3D_INITIALIZE_DATA(A3DMiscCartesianTransformationData, sOffsetTransformationData); CHECK_RET(A3DMiscCartesianTransformationGet(ppOffsetTransformation[i], &sOffsetTransformationData)); sOffsetTransformationData.m_sOrigin.m_dX += sPOTransformationData.m_sOrigin.m_dX; sOffsetTransformationData.m_sOrigin.m_dY += sPOTransformationData.m_sOrigin.m_dY; sOffsetTransformationData.m_sOrigin.m_dZ += sPOTransformationData.m_sOrigin.m_dZ; CHECK_RET(A3DMiscCartesianTransformationCreate(&sOffsetTransformationData, &pOffsetTransformation)); //create a CoordSystem A3DRiCoordinateSystem* pCoordinateSystem = 0; A3DRiCoordinateSystemData sCoordinateSystemData; A3D_INITIALIZE_DATA(A3DRiCoordinateSystemData, sCoordinateSystemData); sCoordinateSystemData.m_pTransformation = pOffsetTransformation; CHECK_RET(A3DRiCoordinateSystemCreate(&sCoordinateSystemData, &pCoordinateSystem)); //Create a A3DMiscEntityReference with the coordinates A3DMiscEntityReferenceData sMiscEntityRefData; A3D_INITIALIZE_DATA(A3DMiscEntityReferenceData, sMiscEntityRefData); sMiscEntityRefData.m_pEntity = ppLinkedPOs[i]; sMiscEntityRefData.m_pCoordinateSystem = pCoordinateSystem; //Attach A3DMiscEntityReference to the MkpLinkedItem previously created, pointing to entity CHECK_RET(A3DMiscEntityReferenceSet(pLinkedItem, &sMiscEntityRefData)); vpMarkupLinkedItems.push_back(pLinkedItem); } CHECK_RET(addViewLinkedItem(pMkpViewData, (A3DUns32)vpMarkupLinkedItems.size(), &vpMarkupLinkedItems[0])); return iRet; } //###################################################################################################################### A3DStatus setViewEntitiesGraphics(A3DMkpViewData* pMkpViewData, A3DUns32 uiLinkedPOsSize, A3DAsmProductOccurrence** ppLinkedPOs, A3DRootBaseWithGraphicsData* inGraphicsData) { A3DStatus iRet = A3D_SUCCESS; std::vector vpMarkupLinkedItems; // create new Linked items pointing to entity with graphics for (A3DUns32 i = 0; i < uiLinkedPOsSize; ++i) { // create a linked item pointing to the entity A3DMiscMarkupLinkedItem* pLinkedItem = 0; CHECK_RET(createMarkupLinkedItemOnProduct(ppLinkedPOs[i], NULL, &pLinkedItem)); // add the graphic to the linked item CHECK_RET(A3DRootBaseWithGraphicsSet(pLinkedItem, inGraphicsData)); vpMarkupLinkedItems.push_back(pLinkedItem); } CHECK_RET(addViewLinkedItem(pMkpViewData, (A3DUns32)vpMarkupLinkedItems.size(), &vpMarkupLinkedItems[0])); return iRet; } //###################################################################################################################### // The following function is only to be used when the annotations are owned by the same PO as the view will be. A3DStatus setViewAnnotations(A3DMkpViewData* pMkpViewData, A3DUns32 uiAnnotationsSize, A3DMkpAnnotationEntity ** ppAnnotations) { A3DStatus iRet = A3D_SUCCESS; pMkpViewData->m_uiAnnotationsSize = uiAnnotationsSize; pMkpViewData->m_ppAnnotations = ppAnnotations; return iRet; } // The following function is to be used when the annotations are owned by the PO that is a child of the PO that own the view. A3DStatus setViewAnnotations(A3DMkpViewData* pMkpViewData, A3DUns32 uiAnnotationsSize, A3DMkpAnnotationEntity ** ppAnnotations, A3DAsmProductOccurrence** ppPOOwners) { A3DStatus iRet = A3D_SUCCESS; std::vector vpMarkupLinkedItems; // create new Linked items pointing to annotation for (A3DUns32 i = 0; i < uiAnnotationsSize; ++i) { // create a linked item pointing to the annotation // note that the PO owner of the annotation should be set. A3DMiscMarkupLinkedItem* pLinkedItem = 0; CHECK_RET(createMarkupLinkedItemOnEntity(ppAnnotations[i], ppPOOwners[i], &pLinkedItem)); vpMarkupLinkedItems.push_back(pLinkedItem); } CHECK_RET(addViewLinkedItem(pMkpViewData, (A3DUns32)vpMarkupLinkedItems.size(), &vpMarkupLinkedItems[0])); return iRet; } //###################################################################################################################### A3DStatus createView(A3DMkpView** ppOutMkupView, A3DMkpViewData* pMkpViewData, const A3DUTF8Char* inName) { A3DStatus iRet = A3D_SUCCESS; CHECK_RET(A3DMkpViewCreate(pMkpViewData, ppOutMkupView)); setEntityName(*ppOutMkupView, inName); return iRet; }