Files
Hoops_Exchange/publish/publishsource/DemoLayers/DemoLayersDataModel.cpp
2025-12-15 22:10:55 +08:00

525 lines
21 KiB
C++

/***********************************************************************************************************************
*
* 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.
*
***********************************************************************************************************************/
/**
\file DemoLayers.cpp
Sample DemoLayers / Data model definition
***********************************************************************************************************************/
// Do not define INITIALIZE_A3D_API here. It should be only included once in a project.
#define HOOPS_PRODUCT_PUBLISH_ADVANCED
#include <A3DSDKIncludes.h>
#include "../common.hpp"
#include <cstdlib>
#include <sstream>
#include <ostream>
#include <iostream>
#include <vector>
#include <map>
//######################################################################################################################
A3DVoid mallocAndSetString(const A3DUTF8Char* srcString, A3DUTF8Char*& destString)
{
// we return empty strings rather than NULL because some strings usages crash with NULL values
// (for example std::string xx = NULL crashes !)
unsigned int uiSize = (unsigned int)(srcString ? strlen(srcString) : 0);
destString = (A3DUTF8Char*)malloc((uiSize + 1) * sizeof(A3DUTF8Char));
if (uiSize > 0)
{
strcpy(destString, srcString);
}
destString[uiSize] = 0;
}
//######################################################################################################################
// cleaning functions
void stFreeTable(A3DPDFDataTableData &sTableData)
{
for (A3DUns32 ir = 0; ir < sTableData.m_iNbRows ; ir++)
{
for(A3DUns32 ic = 0; ic < sTableData.m_iNbCols ; ic++)
free(sTableData.m_ppcTexts[ir*sTableData.m_iNbCols+ic]);
}
free(sTableData.m_ppcTexts);
}
void stFreeTable3DViews(A3DPDFTable3DViewsData &sTable3DViewsData)
{
if (sTable3DViewsData.m_piViewIndexes)
free(sTable3DViewsData.m_piViewIndexes);
if (sTable3DViewsData.m_ppcViewLabels)
{
for(A3DUns32 ic = 0; ic < sTable3DViewsData.m_iNbViews ; ic++)
if (sTable3DViewsData.m_ppcViewLabels[ic])
free(sTable3DViewsData.m_ppcViewLabels[ic]);
free(sTable3DViewsData.m_ppcViewLabels);
}
if (sTable3DViewsData.m_ppImages)
free(sTable3DViewsData.m_ppImages);
if (sTable3DViewsData.m_pDataTableData)
{
for (A3DUns32 ir = 0; ir < sTable3DViewsData.m_pDataTableData->m_iNbRows ; ir++)
{
for(A3DUns32 ic = 0; ic < sTable3DViewsData.m_pDataTableData->m_iNbCols ; ic++)
free(sTable3DViewsData.m_pDataTableData->m_ppcTexts[ir*sTable3DViewsData.m_pDataTableData->m_iNbCols+ic]);
}
}
}
void stFreeRelationship(A3DPDFDataRelationshipData &sRelationshipData)
{
free(sRelationshipData.m_pMapIndexes);
}
//######################################################################################################################
A3DStatus stCreateTable(A3DPDFDocument* pDoc, const std::vector<std::vector<std::string> > &aRows, A3DPDFDataTable*& pDataTable)
{
A3DStatus iRet = A3D_SUCCESS;
A3DUns32 iNbRows = (A3DUns32)aRows.size();
A3DUns32 iNbCols = (A3DUns32)aRows[0].size();
A3DPDFDataTableData sTableData;
A3D_INITIALIZE_DATA(A3DPDFDataTableData, sTableData);
sTableData.m_iNbRows = iNbRows;
sTableData.m_iNbCols = iNbCols;
sTableData.m_ppcTexts = (A3DUTF8Char**)malloc(iNbRows * iNbCols * A3DUns32(sizeof(A3DUTF8Char*)));
for (A3DUns32 ir = 0; ir < iNbRows; ir++)
{
for (A3DUns32 ic = 0; ic < iNbCols; ic++)
mallocAndSetString(
aRows[ir][ic].c_str(), // src
sTableData.m_ppcTexts[ir*iNbCols + ic]); // dest
}
CHECK_RET(A3DPDFDataTableCreate(pDoc, &sTableData, &pDataTable));
stFreeTable(sTableData);
return iRet;
}
A3DStatus stCreateRelationship(A3DPDFDocument* pDoc, std::vector< std::pair <size_t, size_t> > &aMapIndexes,
A3DPDFDataTable* pDataTableSource, A3DPDFDataTable* pDataTableTarget)
{
A3DStatus iRet = A3D_SUCCESS;
A3DUns32 iNbRows = (A3DUns32)aMapIndexes.size();
A3DPDFDataRelationshipData sRelationshipData;
A3D_INITIALIZE_DATA(A3DPDFDataRelationshipData, sRelationshipData);
sRelationshipData.m_iSizeMap = iNbRows;
sRelationshipData.m_pDataTableSource = pDataTableSource;
sRelationshipData.m_pDataTableTarget = pDataTableTarget;
sRelationshipData.m_pMapIndexes = (A3DPDFMapIndexData *)malloc(iNbRows * sizeof(A3DPDFMapIndexData));
memset(sRelationshipData.m_pMapIndexes, 0, iNbRows * sizeof(A3DPDFMapIndexData));
for (A3DUns32 ir = 0; ir < iNbRows; ir++)
{
sRelationshipData.m_pMapIndexes[ir].m_aiIndexes[0] = (A3DInt32)(aMapIndexes[ir].first);
sRelationshipData.m_pMapIndexes[ir].m_aiIndexes[1] = (A3DInt32)(aMapIndexes[ir].second);
}
CHECK_RET(A3DPDFDataRelationshipCreate(pDoc, &sRelationshipData));
stFreeRelationship(sRelationshipData);
return iRet;
}
A3DStatus CreateTable_3DViews_Simple(A3DPDFDocument* pDoc, A3DPDF3DArtwork* p3DArtwork, A3DAsmModelFile* pModelFile,
A3DPDFDataTable3DViews*& pDataTable)
{
A3DStatus iRet = A3D_SUCCESS;
A3DUns32 uiNbViews = 0;
A3DPDFView** ppViews = NULL;
pDataTable = NULL;
// first get views from the 3D model: do we really need a carousel
iRet = A3DPDF3DArtworkGetViews(p3DArtwork, &uiNbViews, &ppViews);
// the last view is the automatic view, automatically created by HOOPS Publish to be the default view.
// we consider in this sample that this view is not in the CAD tool, so we don't want it in the carousel
if(uiNbViews > 0)
uiNbViews--;
// if no views after that, no use to write a carousel !
if (uiNbViews == 0)
return A3D_ERROR;
// HARD CODED : just keep the 2 last ones
uiNbViews = 2;
int iFirstView=2;
A3DInt32 *piViewIndexes = (A3DInt32 *)malloc(uiNbViews*sizeof(A3DInt32));
A3DUTF8Char* *ppcViewLabels = (A3DUTF8Char* *)malloc(uiNbViews*sizeof(A3DUTF8Char*));
A3DPDFImage* *ppImages = (A3DPDFImage* *)malloc(uiNbViews*sizeof(A3DPDFImage*));
for (unsigned int ir = iFirstView; ir < iFirstView+uiNbViews; ir++)
{
piViewIndexes[ir-iFirstView] = ir;// index in list view, ordered as in A3DPDF3DArtworkGetViews
//optional: labels for carousel buttons. if null, view name are used.
ppcViewLabels[ir-iFirstView] = NULL;
ppImages[ir-iFirstView] = NULL; // icon for view. if kA3DPDFTableFor3DViewsComputePosters, the image is automatically generated if needed for carousel.
}
A3DPDFTable3DViewsData sTable3DViewsData;
A3D_INITIALIZE_DATA(A3DPDFTable3DViewsData, sTable3DViewsData);
sTable3DViewsData.m_iNbViews = uiNbViews;
sTable3DViewsData.m_piViewIndexes = piViewIndexes;
sTable3DViewsData.m_ppcViewLabels = ppcViewLabels;
sTable3DViewsData.m_ppImages = ppImages; // not useful if kA3DPDFTableFor3DViewsComputePosters is specified
CHECK_RET(A3DPDFDataTable3DViewsCreate(pDoc, p3DArtwork,pModelFile,
kA3DPDFTableFor3DViewsCustom , // kA3DPDFTableFor3DViewsComputePosters to automatically compute posters for all views specified
&sTable3DViewsData,
&pDataTable));
// clean
stFreeTable3DViews(sTable3DViewsData);
iRet = A3DPDF3DArtworkGetViews(NULL, NULL, &ppViews);
return iRet;
}
A3DStatus CreateTable_ViewNames(A3DPDFDocument* pDoc, A3DPDFDataTable*& pDataTable)
{
// structure for Tables definitions
std::vector<std::vector<std::string> > aRows;
std::vector<std::string> aOneRow;
aRows.clear();
aOneRow.clear();
aOneRow.push_back("Face View");
aRows.push_back(aOneRow);
aOneRow.clear();
aOneRow.push_back("Bracket View");
aRows.push_back(aOneRow);
return stCreateTable(pDoc, aRows, pDataTable);
}
A3DStatus CreateRelationship_ViewNames_To_Views(A3DPDFDocument* pDoc,
A3DPDFDataTable* pDataTable_Source, A3DPDFDataTable* pDataTable_Target)
{
// structure for Relationships definitions
std::vector< std::pair <size_t,size_t> > aMapIndexes;
aMapIndexes.push_back( std::make_pair (0, 0) );
aMapIndexes.push_back( std::make_pair (1, 1) );
return stCreateRelationship(pDoc, aMapIndexes, pDataTable_Source, pDataTable_Target);
}
//int stAddPmiItem(std::vector<std::vector<std::string> > &aTablePmiRows, const std::string& sItem)
int stPushItemsAndRship_3d_PmiNotes(
std::vector<std::vector<std::string> > &aTable3DRows, const A3DPDFNodeData* const nodeInfos, int& iKeyNode3dUID,
std::vector<std::vector<std::string> > &aTablePmiRows, const std::string& sItem,
std::vector< std::pair <size_t,size_t> > &aMapIndexes_3dToPmiNotes,
std::vector< std::pair <size_t,size_t> > &aMapIndexes_PmiNotesTo3d)
{
std::vector<std::string> aOneRow3d;
aOneRow3d.push_back(nodeInfos->m_pcNodeUid); iKeyNode3dUID = (int)aOneRow3d.size()-1;
aOneRow3d.push_back(nodeInfos->m_pcName);
aTable3DRows.push_back(aOneRow3d);
std::vector<std::string> aOneRowPmi;
aOneRowPmi.push_back(sItem);
aTablePmiRows.push_back(aOneRowPmi);
// create relationship between 3d node and pminotes entry
size_t idxinpminotes = aTablePmiRows.size()-1;
size_t idxin3dnodes = aTable3DRows.size()-1;
aMapIndexes_3dToPmiNotes.push_back( std::make_pair (idxin3dnodes, idxinpminotes) );
aMapIndexes_PmiNotesTo3d.push_back( std::make_pair (idxinpminotes, idxin3dnodes) );
return 0;
}
int stPushItemsAndRship_PmiDetails(
std::vector<std::vector<std::string> > &aTablePmiRows,
std::vector<std::vector<std::string> > &aTablePMIDetailsRows, const std::string& sItem,
std::vector< std::pair <size_t,size_t> > &aMapIndexes_PmiNotesToPmiDetails)
{
std::vector<std::string> aOneRowPmiDetail;
aOneRowPmiDetail.clear();
aOneRowPmiDetail.push_back(sItem);
//...
aTablePMIDetailsRows.push_back(aOneRowPmiDetail);
aMapIndexes_PmiNotesToPmiDetails.push_back( std::make_pair (aTablePmiRows.size()-1, aTablePMIDetailsRows.size()-1) );
return 0;
}
A3DStatus CreateTable_3DModel(A3DPDFDocument* pDoc,
A3DAsmModelFile* pModelFile, A3DRWParamsPrcWriteHelper* pA3DRWParamsPrcWriteHelper,
int& iKeyNode3dUID,
A3DPDFDataTable*& pDataTable3D, A3DPDFDataTable*& pDataTable_PmiNotes,
A3DPDFDataTable*& pDataTable_PMIDetailsSlot, A3DPDFDataTable*& pDataTable_PMIDetailsHole, A3DPDFDataTable*& pDataTable_PMIDetailsFlat
)
{
A3DStatus iRet = A3D_SUCCESS;
// structure for Tables definitions
std::vector<std::vector<std::string> > aTable3DRows;
std::vector<std::vector<std::string> > aTablePmiRows;
std::vector<std::vector<std::string> > aTablePMIDetailsSlotRows;
std::vector<std::vector<std::string> > aTablePMIDetailsHoleRows;
std::vector<std::vector<std::string> > aTablePMIDetailsFlatRows;
// structure for Relationships definitions
std::vector< std::pair <size_t,size_t> > aMapIndexes_3dToPmiNotes;
std::vector< std::pair <size_t,size_t> > aMapIndexes_PmiNotesTo3d;
std::vector< std::pair <size_t,size_t> > aMapIndexes_PmiNotesToPmiDetailsSlot;
std::vector< std::pair <size_t,size_t> > aMapIndexes_PmiNotesToPmiDetailsHole;
std::vector< std::pair <size_t,size_t> > aMapIndexes_PmiNotesToPmiDetailsFlat;
// parse the 3D PDF nodes
A3DPDFModelFileNodesData* pModelFileNodesInfo = NULL;
CHECK_RET(A3DPDFGetModelFileNodes(pModelFile, pA3DRWParamsPrcWriteHelper, &pModelFileNodesInfo));
for (int inodein3d = 0; inodein3d < pModelFileNodesInfo->m_iNbNodes; inodein3d++)
{
A3DPDFNodeData* nodeInfos = pModelFileNodesInfo->m_ppNodes[inodein3d];
// we write 3D table only for PMI nodes that we wxant to highlight
if (nodeInfos->m_eNodeType==kA3DPDFNodePMI)
{
if (strcmp(nodeInfos->m_pcName, "Text.1")==0)
{
stPushItemsAndRship_3d_PmiNotes(aTable3DRows, nodeInfos, iKeyNode3dUID,
aTablePmiRows, "Slot 2",
aMapIndexes_3dToPmiNotes, aMapIndexes_PmiNotesTo3d);
stPushItemsAndRship_PmiDetails(aTablePmiRows,
aTablePMIDetailsSlotRows, "0.05197", // + add other rows or columns if needed
aMapIndexes_PmiNotesToPmiDetailsSlot);
}
else if (strcmp(nodeInfos->m_pcName, "Text.2")==0)
{
stPushItemsAndRship_3d_PmiNotes(aTable3DRows, nodeInfos, iKeyNode3dUID,
aTablePmiRows, "Hole 1",
aMapIndexes_3dToPmiNotes, aMapIndexes_PmiNotesTo3d);
stPushItemsAndRship_PmiDetails(aTablePmiRows,
aTablePMIDetailsHoleRows, "0.10845", // + add other rows or columns if needed
aMapIndexes_PmiNotesToPmiDetailsHole);
}
else if (strcmp(nodeInfos->m_pcName, "Text.3")==0)
{
stPushItemsAndRship_3d_PmiNotes(aTable3DRows, nodeInfos, iKeyNode3dUID,
aTablePmiRows, "Hole 2",
aMapIndexes_3dToPmiNotes, aMapIndexes_PmiNotesTo3d);
stPushItemsAndRship_PmiDetails(aTablePmiRows,
aTablePMIDetailsHoleRows, "0.00894", // + add other rows or columns if needed
aMapIndexes_PmiNotesToPmiDetailsHole);
}
else if (strcmp(nodeInfos->m_pcName, "Text.4")==0)
{
stPushItemsAndRship_3d_PmiNotes(aTable3DRows, nodeInfos, iKeyNode3dUID,
aTablePmiRows, "Hole 3",
aMapIndexes_3dToPmiNotes, aMapIndexes_PmiNotesTo3d);
stPushItemsAndRship_PmiDetails(aTablePmiRows,
aTablePMIDetailsHoleRows, "0.11540", // + add other rows or columns if needed
aMapIndexes_PmiNotesToPmiDetailsHole);
}
else if (strcmp(nodeInfos->m_pcName, "Text.5")==0)
{
stPushItemsAndRship_3d_PmiNotes(aTable3DRows, nodeInfos, iKeyNode3dUID,
aTablePmiRows, "Hole 4",
aMapIndexes_3dToPmiNotes, aMapIndexes_PmiNotesTo3d);
stPushItemsAndRship_PmiDetails(aTablePmiRows,
aTablePMIDetailsHoleRows, "0.20458", // + add other rows or columns if needed
aMapIndexes_PmiNotesToPmiDetailsHole);
}
else if (strcmp(nodeInfos->m_pcName, "Text.6")==0)
{
stPushItemsAndRship_3d_PmiNotes(aTable3DRows, nodeInfos, iKeyNode3dUID,
aTablePmiRows, "Slot 1",
aMapIndexes_3dToPmiNotes, aMapIndexes_PmiNotesTo3d);
stPushItemsAndRship_PmiDetails(aTablePmiRows,
aTablePMIDetailsSlotRows, "0.00951", // + add other rows or columns if needed
aMapIndexes_PmiNotesToPmiDetailsSlot);
}
else if (strcmp(nodeInfos->m_pcName, "Text.7")==0)
{
stPushItemsAndRship_3d_PmiNotes(aTable3DRows, nodeInfos, iKeyNode3dUID,
aTablePmiRows, "Hole 5",
aMapIndexes_3dToPmiNotes, aMapIndexes_PmiNotesTo3d);
stPushItemsAndRship_PmiDetails(aTablePmiRows,
aTablePMIDetailsHoleRows, "0.20481", // + add other rows or columns if needed
aMapIndexes_PmiNotesToPmiDetailsHole);
}
else if (strcmp(nodeInfos->m_pcName, "Text.8")==0)
{
stPushItemsAndRship_3d_PmiNotes(aTable3DRows, nodeInfos, iKeyNode3dUID,
aTablePmiRows, "Hole 6",
aMapIndexes_3dToPmiNotes, aMapIndexes_PmiNotesTo3d);
stPushItemsAndRship_PmiDetails(aTablePmiRows,
aTablePMIDetailsHoleRows, "0.20841", // + add other rows or columns if needed
aMapIndexes_PmiNotesToPmiDetailsHole);
}
else if (strcmp(nodeInfos->m_pcName, "Text.9")==0)
{
stPushItemsAndRship_3d_PmiNotes(aTable3DRows, nodeInfos, iKeyNode3dUID,
aTablePmiRows, "Hole 7",
aMapIndexes_3dToPmiNotes, aMapIndexes_PmiNotesTo3d);
stPushItemsAndRship_PmiDetails(aTablePmiRows,
aTablePMIDetailsHoleRows, "0.30450", // + add other rows or columns if needed
aMapIndexes_PmiNotesToPmiDetailsHole);
}
else if (strcmp(nodeInfos->m_pcName, "Text.10")==0)
{
stPushItemsAndRship_3d_PmiNotes(aTable3DRows, nodeInfos, iKeyNode3dUID,
aTablePmiRows, "Hole 8",
aMapIndexes_3dToPmiNotes, aMapIndexes_PmiNotesTo3d);
stPushItemsAndRship_PmiDetails(aTablePmiRows,
aTablePMIDetailsHoleRows, "0.00815", // + add other rows or columns if needed
aMapIndexes_PmiNotesToPmiDetailsHole);
}
else if (strcmp(nodeInfos->m_pcName, "Text.11")==0)
{
stPushItemsAndRship_3d_PmiNotes(aTable3DRows, nodeInfos, iKeyNode3dUID,
aTablePmiRows, "Hole 9",
aMapIndexes_3dToPmiNotes, aMapIndexes_PmiNotesTo3d);
stPushItemsAndRship_PmiDetails(aTablePmiRows,
aTablePMIDetailsHoleRows, "0.120540", // + add other rows or columns if needed
aMapIndexes_PmiNotesToPmiDetailsHole);
}
else if (strcmp(nodeInfos->m_pcName, "Text.12")==0)
{
stPushItemsAndRship_3d_PmiNotes(aTable3DRows, nodeInfos, iKeyNode3dUID,
aTablePmiRows, "Hole 10",
aMapIndexes_3dToPmiNotes, aMapIndexes_PmiNotesTo3d);
stPushItemsAndRship_PmiDetails(aTablePmiRows,
aTablePMIDetailsHoleRows, "0.0651", // + add other rows or columns if needed
aMapIndexes_PmiNotesToPmiDetailsHole);
}
else if (strcmp(nodeInfos->m_pcName, "Text.13")==0)
{
stPushItemsAndRship_3d_PmiNotes(aTable3DRows, nodeInfos, iKeyNode3dUID,
aTablePmiRows, "Hole 11",
aMapIndexes_3dToPmiNotes, aMapIndexes_PmiNotesTo3d);
stPushItemsAndRship_PmiDetails(aTablePmiRows,
aTablePMIDetailsHoleRows, "0.0842", // + add other rows or columns if needed
aMapIndexes_PmiNotesToPmiDetailsHole);
}
else if (strcmp(nodeInfos->m_pcName, "Text.14")==0)
{
stPushItemsAndRship_3d_PmiNotes(aTable3DRows, nodeInfos, iKeyNode3dUID,
aTablePmiRows, "Hole 12",
aMapIndexes_3dToPmiNotes, aMapIndexes_PmiNotesTo3d);
stPushItemsAndRship_PmiDetails(aTablePmiRows,
aTablePMIDetailsHoleRows, "0.20674", // + add other rows or columns if needed
aMapIndexes_PmiNotesToPmiDetailsHole);
}
else if (strcmp(nodeInfos->m_pcName, "Text.15")==0)
{
stPushItemsAndRship_3d_PmiNotes(aTable3DRows, nodeInfos, iKeyNode3dUID,
aTablePmiRows, "Hole 13",
aMapIndexes_3dToPmiNotes, aMapIndexes_PmiNotesTo3d);
stPushItemsAndRship_PmiDetails(aTablePmiRows,
aTablePMIDetailsHoleRows, "0.30541", // + add other rows or columns if needed
aMapIndexes_PmiNotesToPmiDetailsHole);
}
else if (strcmp(nodeInfos->m_pcName, "Text.16")==0)
{
stPushItemsAndRship_3d_PmiNotes(aTable3DRows, nodeInfos, iKeyNode3dUID,
aTablePmiRows, "Hole 15",
aMapIndexes_3dToPmiNotes, aMapIndexes_PmiNotesTo3d);
stPushItemsAndRship_PmiDetails(aTablePmiRows,
aTablePMIDetailsHoleRows, "0.00410", // + add other rows or columns if needed
aMapIndexes_PmiNotesToPmiDetailsHole);
}
else if (strcmp(nodeInfos->m_pcName, "Text.17")==0)
{
stPushItemsAndRship_3d_PmiNotes(aTable3DRows, nodeInfos, iKeyNode3dUID,
aTablePmiRows, "Hole 14",
aMapIndexes_3dToPmiNotes, aMapIndexes_PmiNotesTo3d);
stPushItemsAndRship_PmiDetails(aTablePmiRows,
aTablePMIDetailsHoleRows, "0.8405", // + add other rows or columns if needed
aMapIndexes_PmiNotesToPmiDetailsHole);
}
else if (strcmp(nodeInfos->m_pcName, "Text.18")==0)
{
stPushItemsAndRship_3d_PmiNotes(aTable3DRows, nodeInfos, iKeyNode3dUID,
aTablePmiRows, "Flatness",
aMapIndexes_3dToPmiNotes, aMapIndexes_PmiNotesTo3d);
stPushItemsAndRship_PmiDetails(aTablePmiRows,
aTablePMIDetailsFlatRows, "0.9040", // + add other rows or columns if needed
aMapIndexes_PmiNotesToPmiDetailsFlat);
}
}
}
iRet = stCreateTable(pDoc, aTable3DRows, pDataTable3D);
iRet = stCreateTable(pDoc, aTablePmiRows, pDataTable_PmiNotes);
iRet = stCreateTable(pDoc, aTablePMIDetailsSlotRows, pDataTable_PMIDetailsSlot);
iRet = stCreateTable(pDoc, aTablePMIDetailsHoleRows, pDataTable_PMIDetailsHole);
iRet = stCreateTable(pDoc, aTablePMIDetailsFlatRows, pDataTable_PMIDetailsFlat);
iRet = stCreateRelationship(pDoc, aMapIndexes_PmiNotesToPmiDetailsSlot, pDataTable_PmiNotes, pDataTable_PMIDetailsSlot);
iRet = stCreateRelationship(pDoc, aMapIndexes_PmiNotesToPmiDetailsHole, pDataTable_PmiNotes, pDataTable_PMIDetailsHole);
iRet = stCreateRelationship(pDoc, aMapIndexes_PmiNotesToPmiDetailsFlat, pDataTable_PmiNotes, pDataTable_PMIDetailsFlat);
iRet = stCreateRelationship(pDoc, aMapIndexes_PmiNotesTo3d, pDataTable_PmiNotes, pDataTable3D);
iRet = stCreateRelationship(pDoc, aMapIndexes_3dToPmiNotes, pDataTable3D, pDataTable_PmiNotes);
A3DPDFGetModelFileNodes(nullptr, nullptr, &pModelFileNodesInfo);
return iRet;
}
A3DStatus CreateRelationship_ViewNames_To_Pmis(A3DPDFDocument* pDoc,
A3DPDFDataTable* pDataTable_Source, A3DPDFDataTable* pDataTable_Target)
{
// structure for Relationships definitions
std::vector< std::pair <size_t,size_t> > aMapIndexes;
aMapIndexes.push_back( std::make_pair (0, 0) );
aMapIndexes.push_back( std::make_pair (0, 1) );
aMapIndexes.push_back( std::make_pair (0, 2) );
aMapIndexes.push_back( std::make_pair (0, 3) );
aMapIndexes.push_back( std::make_pair (0, 4) );
aMapIndexes.push_back( std::make_pair (0, 5) );
aMapIndexes.push_back( std::make_pair (0, 6) );
aMapIndexes.push_back( std::make_pair (0, 7) );
aMapIndexes.push_back( std::make_pair (0, 8) );
aMapIndexes.push_back( std::make_pair (0, 9) );
aMapIndexes.push_back( std::make_pair (0, 10) );
aMapIndexes.push_back( std::make_pair (0, 11) );
aMapIndexes.push_back( std::make_pair (1, 12) );
aMapIndexes.push_back( std::make_pair (1, 13) );
aMapIndexes.push_back( std::make_pair (1, 14) );
aMapIndexes.push_back( std::make_pair (1, 15) );
aMapIndexes.push_back( std::make_pair (1, 16) );
aMapIndexes.push_back( std::make_pair (1, 17) );
return stCreateRelationship(pDoc, aMapIndexes, pDataTable_Source, pDataTable_Target);
}