276 lines
12 KiB
C++
276 lines
12 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.
|
|
*
|
|
***********************************************************************************************************************/
|
|
/**
|
|
* 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 <vector>
|
|
|
|
//######################################################################################################################
|
|
// 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<A3DMiscMarkupLinkedItem*> 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<A3DMiscMarkupLinkedItem*> 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<A3DMiscMarkupLinkedItem*> 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<A3DMiscMarkupLinkedItem*> 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;
|
|
}
|
|
|
|
|
|
|