/*********************************************************************************************************************** * * 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 DemoDataModel.cpp Demonstrates how to create a table in which the table data is linked to the model data. ***********************************************************************************************************************/ #define INITIALIZE_A3D_API #define HOOPS_PRODUCT_PUBLISH_ADVANCED #include #include "../common.hpp" #include "../CommonInit.h" #include #include #include #include // default sample arguments: // in visual c++: the current directory is set through properties to $OutDir, which is $(Platform)\$(Configuration) // in linux: the current directory is supposed to be the same as this cpp file #ifdef _MSC_VER # define IN_3DFILE_1 SAMPLES_DATA_DIRECTORY"\\prc\\Crank-Instructions.prc" # define IN_3DFILE_2 SAMPLES_DATA_DIRECTORY"\\prc\\pmi_Sample.prc" # define IN_3DFILE_3 SAMPLES_DATA_DIRECTORY"\\prc\\_micro engine.prc" # define PDF_TEMPLATE_1 SAMPLES_DATA_DIRECTORY"\\pdf_templates\\DemoDataModelTemplate.pdf" # define PDF_TEMPLATE_2 SAMPLES_DATA_DIRECTORY"\\pdf_templates\\DemoDataModelTemplate-Views.pdf" # define PDF_TEMPLATE_3 SAMPLES_DATA_DIRECTORY"\\pdf_templates\\DemoDataModelTemplate-BOM.pdf" # define ICONS_PATH SAMPLES_DATA_DIRECTORY"\\images\\" # define ICON_CAROUSEL_PREV SAMPLES_DATA_DIRECTORY"\\images\\carouselprevrot.bmp" # define ICON_CAROUSEL_NEXT SAMPLES_DATA_DIRECTORY"\\images\\carouselnextrot.bmp" # define POSTER_PATH SAMPLES_DATA_DIRECTORY"\\images\\pleaseactivate.bmp" # define OUT_FILE SAMPLES_PUBLISH_GALLERY_DIRECTORY"\\sample_DemoDataModel.pdf" #else # define IN_3DFILE_1 SAMPLES_DATA_DIRECTORY"/prc/Crank-Instructions.prc" # define IN_3DFILE_2 SAMPLES_DATA_DIRECTORY"/prc/pmi_Sample.prc" # define IN_3DFILE_3 SAMPLES_DATA_DIRECTORY"/prc/_micro engine.prc" # define PDF_TEMPLATE_1 SAMPLES_DATA_DIRECTORY"/pdf_templates/DemoDataModelTemplate.pdf" # define PDF_TEMPLATE_2 SAMPLES_DATA_DIRECTORY"/pdf_templates/DemoDataModelTemplate-Views.pdf" # define PDF_TEMPLATE_3 SAMPLES_DATA_DIRECTORY"/pdf_templates/DemoDataModelTemplate-BOM.pdf" # define ICONS_PATH SAMPLES_DATA_DIRECTORY"/images/" # define ICON_CAROUSEL_PREV SAMPLES_DATA_DIRECTORY"/images/carouselprevrot.bmp" # define ICON_CAROUSEL_NEXT SAMPLES_DATA_DIRECTORY"/images/carouselnextrot.bmp" # define POSTER_PATH SAMPLES_DATA_DIRECTORY"/images/pleaseactivate.bmp" # define OUT_FILE SAMPLES_PUBLISH_GALLERY_DIRECTORY"/sample_DemoDataModel.pdf" #endif const size_t MAXSZFILENAME = 4096; // rgb colors #define COL_RED 1.0, 0.0, 0.0 A3DVoid mallocAndSetString(const A3DUTF8Char* srcString, A3DUTF8Char*& destString); // tools functions A3DStatus PageGetTextField(A3DPDFPage* pPage, const std::string& sFieldId, A3DPDFTextField** ppField); A3DStatus PageGetButtonField(A3DPDFPage* pPage, const std::string& sFieldId, A3DPDFButton** ppField); A3DStatus PageGetListBoxField(A3DPDFPage* pPage, const std::string& sFieldId, A3DPDFListBox** ppField); // fill data functions sample 1 A3DStatus CreateTable_Sple1_Statics(A3DPDFDocument* pDoc, A3DPDFDataTable*& pDataTable_Statics); A3DStatus CreateTable_Sple1_3DModel_Bom(A3DPDFDocument* pDoc, A3DAsmModelFile* pModelFile, A3DRWParamsPrcWriteHelper* pPRCWriteHelper, const std::string& sPathIcons, int& iKeyNode3dUID, int& iKeyNode3dName, int& iKeyNode3dInstance, int& iKeyBomNumArt, int& iKeyBomNamePart, int& iKeyBomQty, int& iKeyBomMaterial, int& iKeyBomIcon, A3DPDFDataTable*& pDataTable3D, A3DPDFDataTable*& pDataTableBom, A3DPDFDataTable* pDataTableManufacturers); A3DStatus CreateTable_Sple1_CBFILTER(A3DPDFDocument* pDoc, A3DPDFDataTable*& pDataTable); A3DStatus CreateTable_Sple1_Manufacturers(A3DPDFDocument* pDoc, A3DPDFDataTable*& pDataTable); A3DStatus CreateRelationship_Sple1_CBFILTER_To_Bom(A3DPDFDocument* pDoc, A3DPDFDataTable* pDataTable_Source, A3DPDFDataTable* pDataTable_Target); // fill data functions sample 2 A3DStatus CreateTable_Sple2_Statics(A3DPDFDocument* pDoc, A3DPDFDataTable*& pDataTable_Statics); A3DStatus CreateTable_Sple2_ViewNames(A3DPDFDocument* pDoc, A3DPDFDataTable*& pDataTable); A3DStatus CreateTable_Sple2_3DModel(A3DPDFDocument* pDoc, A3DAsmModelFile* pModelFile, A3DRWParamsPrcWriteHelper* pPRCWriteHelper, int& iKeyNode3dUID, int& iKeyPmiName, int& iKeyPmiType, int& iKeyPmiValue, int& iKeyPmiTol, A3DPDFDataTable*& pDataTable3D, A3DPDFDataTable*& pDataTable_Pmis); //A3DStatus createTable_Sple2_3DViews(A3DPDF3DArtwork* p3DArtwork, A3DPDFDocument* pDoc, A3DPDFDataTable3DViews*& pDataTable); A3DStatus CreateTable_Sple2_3DViews_WithCarousel(A3DPDFDocument* pDoc, A3DPDF3DArtwork* p3DArtwork, A3DAsmModelFile* pModelFile, A3DPDFDataTable3DViews*& pDataTable); A3DStatus CreateRelationship_Sple2_ViewNames_To_Views(A3DPDFDocument* pDoc, A3DPDFDataTable* pDataTable_Source, A3DPDFDataTable* pDataTable_Target); A3DStatus CreateRelationship_Sple2_View_To_Pmis(A3DPDFDocument* pDoc, A3DPDFDataTable* pDataTable_Source, A3DPDFDataTable* pDataTable_Target); //A3DStatus createRelationship_Sple2_Pmis_To_3D(A3DPDFDocument* pDoc, A3DPDFDataTable* pDataTable_Source, A3DPDFDataTable* pDataTable_Target); // fill data functions sample 3 A3DStatus CreateTable_Sple3_Statics(A3DPDFDocument* pDoc, A3DPDFDataTable*& pDataTable_Statics); A3DStatus CreateTable_Sple3_3DModel_Bom(A3DPDFDocument* pDoc, A3DAsmModelFile* pModelFile, A3DRWParamsPrcWriteHelper* pPRCWriteHelper, const std::string& sPathIcons, int& iKeyNode3dUID, int& iKeyNode3dInstance, int& iKeyBomNumArt, int& iKeyBomNamePart, int& iKeyBomQty, int& iKeyBomIcon, A3DPDFDataTable*& pDataTable3D, A3DPDFDataTable*& pDataTableBom); //###################################################################################################################### // writes a text line on the page A3DStatus WriteTextString(A3DPDFDocument* pDoc, A3DPDFPage* pPage, A3DPDFEFontName eFontName, A3DInt32 iFontSize, A3DDouble dR, A3DDouble dG, A3DDouble dB, const A3DUTF8Char* pcTextString, A3DInt32 iPosX, A3DInt32 iPosY) { A3DStatus iRet = A3D_SUCCESS; A3DPDFTextData sTextData; A3D_INITIALIZE_DATA(A3DPDFTextData, sTextData); sTextData.m_eFontName = eFontName; sTextData.m_iFontSize = iFontSize; sTextData.m_sColor.m_dRed = dR; sTextData.m_sColor.m_dGreen = dG; sTextData.m_sColor.m_dBlue = dB; sTextData.m_pcTextString = const_cast(pcTextString); A3DPDFText* pText = NULL; CHECK_RET(A3DPDFTextCreate(pDoc, &sTextData, &pText)); CHECK_RET(A3DPDFPageInsertText(pPage, pText, iPosX, iPosY)); // posX, posY from the bottom left return iRet; } //###################################################################################################################### A3DStatus Create3DAnnot(A3DPDFDocument* pDoc, const A3DUTF8Char* pcFileName, A3DPDFImage* pPoster, const A3DUTF8Char* pcInjsfile, A3DPDF3DArtwork** pp3DArtwork, A3DPDF3DAnnot** pp3DAnnot, A3DRWParamsPrcWriteHelper** ppA3DRWParamsPrcWriteHelper, A3DAsmModelFile** ppModelFile) { A3DStatus iRet = A3D_SUCCESS; *pp3DAnnot = NULL; *ppModelFile = NULL; A3DPDF3DStream* pStream = NULL; char tempfilename[1024]; // Publish 6.0 - Particularity when the input 3D model is stored in a PDF file. The functions to read the 3D data from the PDF // are not the same as for other formats. if(strstr(pcFileName, ".pdf") != NULL) { A3DStream3DPDFData* pStream3DPDFData; A3DInt32 iNumStreams; iRet = A3DGet3DPDFStreams(pcFileName, &pStream3DPDFData, &iNumStreams); if(iRet!=A3D_SUCCESS || iNumStreams == 0) return A3D_ERROR; // a real use case might parse every streams in the input file. Here we just take the first one (pStream3DPDFData[0]). // even an input PRC file must be read in memory and mapped into modelfile data structures if(pStream3DPDFData[0].m_bIsPrc) { iRet = A3DAsmModelFileLoadFromPrcStream(pStream3DPDFData[0].m_acStream, pStream3DPDFData[0].m_uiStreamSize, NULL, ppModelFile); if(iRet!=A3D_SUCCESS) { A3DGet3DPDFStreams(NULL, &pStream3DPDFData, &iNumStreams); // to clean up the array of stream data return iRet; } } // a U3D stream must first be stored as a physical file ; then 2 situations occur: // 1. read and LOAD the physical file into a modelfile using the common A3DAsmModelFileLoadFromFile function, then transform the modelfile into a stream // OR // 2. read the physical file into a binary stream (not loaded into a modelfile) using A3DPDF3DStreamCreateFromFile function // In this sample we illustrate the workflow 2. else { sprintf(tempfilename, "%s.u3d", OUT_FILE); FILE * pFile=NULL; #ifdef _MSC_VER errno_t ret = fopen_s(&pFile, tempfilename , "wb"); if(ret == 0 && pFile) #else pFile = fopen(tempfilename , "wb"); if(pFile) #endif { fwrite(pStream3DPDFData[0].m_acStream, 1, pStream3DPDFData[0].m_uiStreamSize, pFile); fclose(pFile); } // physical file to stream CHECK_RET(A3DPDF3DStreamCreateFromFile(pDoc, tempfilename, false, &pStream)); // !!! the file will have to be disposed of afterwards remove(tempfilename); } A3DGet3DPDFStreams(NULL, &pStream3DPDFData, &iNumStreams); // to clean up the array of stream data } // Load the physical file in a ModelFile data structure if not already done if(pStream == NULL && *ppModelFile == NULL) { // reading the input CAD file; the file can be disposed of afterwards. A3DRWParamsLoadData sReadParam; A3D_INITIALIZE_DATA(A3DRWParamsLoadData, sReadParam); sReadParam.m_sGeneral.m_bReadSolids = true; sReadParam.m_sGeneral.m_bReadSurfaces = true; sReadParam.m_sGeneral.m_bReadWireframes = true; sReadParam.m_sGeneral.m_bReadPmis = true; sReadParam.m_sGeneral.m_bReadAttributes = true; sReadParam.m_sGeneral.m_bReadHiddenObjects = false; sReadParam.m_sGeneral.m_bReadConstructionAndReferences = false; sReadParam.m_sGeneral.m_bReadActiveFilter = true; sReadParam.m_sGeneral.m_eReadingMode2D3D = kA3DRead_3D; sReadParam.m_sGeneral.m_eReadGeomTessMode = kA3DReadGeomAndTess; sReadParam.m_sGeneral.m_eDefaultUnit = kA3DUnitUnknown; sReadParam.m_sPmi.m_bAlwaysSubstituteFont = false; sReadParam.m_sPmi.m_pcSubstitutionFont = const_cast("Myriad CAD"); sReadParam.m_sTessellation.m_eTessellationLevelOfDetail = kA3DTessLODMedium; sReadParam.m_sMultiEntries.m_bLoadDefault = true; sReadParam.m_sAssembly.m_bUseRootDirectory = true; CHECK_RET(A3DAsmModelFileLoadFromFile(pcFileName, &sReadParam, ppModelFile)); } if(*ppModelFile != NULL) { // whatever the input format, we store it as PRC in the output PDF // creating the PRC stream from the model file that is going to be inserted into the PDF file A3DRWParamsExportPrcData sParamsExportData; A3D_INITIALIZE_DATA(A3DRWParamsExportPrcData, sParamsExportData); CHECK_RET(A3DPDF3DStreamCreateFromModelFileAsPRC(pDoc, *ppModelFile, &sParamsExportData, &pStream, ppA3DRWParamsPrcWriteHelper)); } if(pStream != NULL) { // creating the 3D artwork *pp3DArtwork = NULL; A3DPDF3DArtworkData2 s3DArtworkData; A3D_INITIALIZE_DATA(A3DPDF3DArtworkData2, s3DArtworkData); s3DArtworkData.m_pStream = pStream; s3DArtworkData.m_pcJavaScriptFileName = const_cast(pcInjsfile); s3DArtworkData.m_bActivatePMICrossHighlight = true; s3DArtworkData.m_bAddPMISemanticInformation = true; s3DArtworkData.m_sDisplaySectionData.m_bAddSectionCaps = true; CHECK_RET(A3DPDF3DArtworkCreate2(pDoc, &s3DArtworkData, pp3DArtwork)); A3DPDF3DAnnotData sAnnotData; A3D_INITIALIZE_DATA(A3DPDF3DAnnotData, sAnnotData); sAnnotData.m_bOpenModelTree = false; sAnnotData.m_bShowToolbar = false; sAnnotData.m_eLighting = kA3DPDFLightCADOptimized; sAnnotData.m_eRenderingStyle = kA3DPDFRenderingSolid; sAnnotData.m_sBackgroundColor.m_dRed = 0.25; sAnnotData.m_sBackgroundColor.m_dGreen = 0.25; sAnnotData.m_sBackgroundColor.m_dBlue = 0.25; sAnnotData.m_bTransparentBackground = false; sAnnotData.m_eActivateWhen = kA3DPDFActivPageOpened; sAnnotData.m_eDesactivateWhen = kA3DPDFActivPageClosed; sAnnotData.m_iAppearanceBorderWidth = 0; sAnnotData.m_pPosterImage = pPoster; // default poster automatically generated sAnnotData.m_p3DArtwork = *pp3DArtwork; CHECK_RET(A3DPDF3DAnnotCreate(pDoc, &sAnnotData, pp3DAnnot)); } return iRet; } A3DStatus AddViewCarousel(A3DPDFDocument* pDoc, A3DPDFPage* pPage, int iLeftCarou, int iBottomCarou, int iHeigthCarousel, int iWidthCarouButtonPrevNext, int iWidthCarouButton, int iHorizMargin, std::vector& aViewCarouselButPrevNext, std::vector& aViewCarouselButtons, A3DPDF3DViewCarousel** ppViewCarousel) { A3DStatus iRet = A3D_SUCCESS; // --- buttons for carousel A3DPDFRectData sPos; A3D_INITIALIZE_DATA(A3DPDFRectData, sPos); std::string sFieldId; // buttons views all act the same and have same attributes A3DUTF8Char* ppButtonsNamesPrevNext[2]; A3DPDFButton* ppButtonsPrevNext[2]; A3DUTF8Char** ppButtonsNames = (A3DUTF8Char**) malloc(aViewCarouselButtons.size() * A3DUns32(sizeof(A3DUTF8Char*))); A3DPDFButton** ppButtonsViews = (A3DPDFButton**) malloc(aViewCarouselButtons.size() * A3DUns32(sizeof(A3DPDFButton*))); A3DPDFButtonData sButtonViewsData; A3D_INITIALIZE_DATA(A3DPDFButtonData, sButtonViewsData); //sButtonViewsData.m_eFormField = kA3DPDFVisible; sButtonViewsData.m_pcFontName = const_cast("Helv"); sButtonViewsData.m_iFontSize = 8; sButtonViewsData.m_bHasFillColor = false; sButtonViewsData.m_bHasBorder = false; sButtonViewsData.m_eThicknessBorder = kA3DPDFThin; sButtonViewsData.m_eLineStyleBorder = kA3DPDFSolid; sButtonViewsData.m_eLayoutTextIcon = kA3DPDFIconTopLabelBottom; sButtonViewsData.m_eHighlightingMode = kA3DPDFLinkHighlightOutline; for (size_t i=0 ; im_dBlue=0.9; sGraphRectData.m_pFillColor->m_dGreen=0.9; sGraphRectData.m_pFillColor->m_dRed=0.9; */ CHECK_RET(A3DPDFWidgetGetPosition(*ppViewCarousel, &sGraphRectData.m_sRectangleData)); sGraphRectData.m_sRectangleData.m_dBottom --; sGraphRectData.m_sRectangleData.m_dTop ++; A3DPDFPageDrawRectangle(pPage, &sGraphRectData); } // cleanup for (size_t i=0 ; i& aiWidthCols, // in points std::vector& aRowHeader, std::vector& aeColumnTypes, A3DPDFScrollTable** ppScrollTable) { A3DStatus iRet = A3D_SUCCESS; A3DPDFScrollTableData sScrollTableData; A3D_INITIALIZE_DATA(A3DPDFScrollTableData, sScrollTableData); sScrollTableData.m_iGridNbRows = iNbRowsInFrame; sScrollTableData.m_iGridNbCols = (int)aiWidthCols.size(); sScrollTableData.m_iGridHeightCells = iHeightRows; sScrollTableData.m_piGridWidthCells = (A3DInt32 *)malloc(sScrollTableData.m_iGridNbCols*sizeof(A3DInt32)); for (size_t ic=0; ic("Helv"); sCellFormatData.m_iFontSize = 10; sCellFormatData.m_sTextColor.m_dRed = 0.0; // black sCellFormatData.m_sTextColor.m_dGreen = 0.0; sCellFormatData.m_sTextColor.m_dBlue = 0.0; sCellFormatData.m_eTextAlignment = kA3DPDFLeft; sScrollTableData.m_pCellFormat = &sCellFormatData; /* optional to define custom row highlight color // comment these lines to get default highlight color A3DPDFRgbColorData sHighlightColorData; A3D_INITIALIZE_DATA(A3DPDFRgbColorData, sHighlightColorData); sHighlightColorData.m_dRed = 100./255.; sHighlightColorData.m_dGreen = 200./255.; sHighlightColorData.m_dBlue = 100./255.; sScrollTableData.m_pHighlightColor = &sHighlightColorData; */ CHECK_RET(A3DPDFScrollTableCreate(pDoc, &sScrollTableData, ppScrollTable)); CHECK_RET(A3DPDFPageInsertScrollTable(pPage, *ppScrollTable, iPosLeft, iPosTop-iHeightRowHeader)); // --- create header as text fields: create it after table to use the ST name created A3DUTF8Char* pcSTName = NULL; CHECK_RET(A3DPDFWidgetGetName(*ppScrollTable, &pcSTName)); A3DPDFTextFieldData sTextFieldData; A3D_INITIALIZE_DATA(A3DPDFTextFieldData, sTextFieldData); sTextFieldData.m_pcFontName = const_cast("HeBo"); sTextFieldData.m_iFontSize = 10; sTextFieldData.m_sTextColor.m_dRed = 0; // black sTextFieldData.m_sTextColor.m_dGreen = 0; sTextFieldData.m_sTextColor.m_dBlue = 0; sTextFieldData.m_eTextAlignment = kA3DPDFLeft; A3DPDFRectData sPos; A3D_INITIALIZE_DATA(A3DPDFRectData, sPos); sPos.m_iLeft = iPosLeft; // lower left x sPos.m_iBottom = iPosTop-iHeightRowHeader; // lower left y sPos.m_iRight = iPosLeft; // upper right x sPos.m_iTop = iPosTop; // upper right y for(size_t ic = 0; ic < aRowHeader.size() ; ic++) { A3DPDFTextField* pText = NULL; A3DUTF8Char tmpname[1024]; sprintf(tmpname, "%s_Header%d", pcSTName, (int)ic); sTextFieldData.m_pcName = tmpname; sTextFieldData.m_pcDefaultValue = const_cast(aRowHeader[ic].c_str()); iRet = A3DPDFTextFieldCreate(pDoc, &sTextFieldData, &pText); // coordinates are from bottom left of the page sPos.m_iLeft = sPos.m_iRight; // lower left x sPos.m_iRight = sPos.m_iLeft + aiWidthCols[ic]; // upper right x if ((A3DInt32)ic==sScrollTableData.m_iGridNbCols-1) // last column goes above the slider sPos.m_iRight += iSliderWidth; CHECK_RET(A3DPDFPageInsertTextField(pPage, pText, &sPos)); } A3DPDFWidgetGetName(nullptr, &pcSTName); // clean if (sScrollTableData.m_piGridWidthCells!=NULL) free( sScrollTableData.m_piGridWidthCells); if (sScrollTableData.m_peColumnTypes != NULL) free(sScrollTableData.m_peColumnTypes); return A3D_SUCCESS; } A3DStatus stBuildDocument(A3DPDFDocument* pDoc) { A3DStatus iRet = A3D_SUCCESS; A3DPDFPage* pPage = NULL; int indexpage = 0; std::string sSuffixFields; // populating the document metadata A3DPDFDocumentInformationData sInformationData; A3D_INITIALIZE_DATA(A3DPDFDocumentInformationData, sInformationData); sInformationData.m_pcTitle = const_cast("HOOPS Publish Functionalities"); sInformationData.m_pcCreator = const_cast("HOOPS Publish Sample Application"); sInformationData.m_pcSubject = const_cast("This sample demoes the data model functionality of HOOPS Publish"); sInformationData.m_pcAuthor = const_cast("Tech Soft 3D"); CHECK_RET(A3DPDFDocumentSetInformation(pDoc, &sInformationData)); // creating a poster image to be used as a poster for 3D. A3DPDFImage* pBlankImage = NULL; A3DPDFImageCreateFromFile(pDoc, POSTER_PATH, kA3DPDFImageFormatUnknown, &pBlankImage); // create page idx+1 from template file. we force the fields renaming to avoid duplicated names. sSuffixFields = "uuid0"; CHECK_RET(A3DPDFDocumentAppendPageFromPDFFileAndSuffixFields(pDoc, PDF_TEMPLATE_1, sSuffixFields.c_str(), &pPage)); if(pPage != NULL) { // --- create and fill Fields to map to DataModel A3DPDF3DAnnot* p3DAnnot = NULL; A3DPDF3DArtwork* p3DArtwork = NULL; A3DAsmModelFile* pModelFile = NULL; // To get unique IDs, we need a A3DRWParamsPrcWriteHelper. // A3DPDF3DStreamCreateFromModelFileAsPRC builds this object. A3DRWParamsPrcWriteHelper* pPRCWriteHelper = NULL; iRet = Create3DAnnot(pDoc, IN_3DFILE_1, pBlankImage, NULL, &p3DArtwork, &p3DAnnot, &pPRCWriteHelper, &pModelFile); if(p3DAnnot != NULL && p3DArtwork != NULL && pModelFile != NULL) { // populating the field with the 3D annotation CHECK_RET(A3DPDFPageFieldSet3DAnnot(pPage, std::string("DF_3DWindow_" + sSuffixFields).c_str(), p3DAnnot)); // get widget for list nodes A3DPDF3DNodeScene* p3DNodeScene = NULL; CHECK_RET(A3DPDF3DAnnotGet3DNodeScene( p3DAnnot, &p3DNodeScene)); // create Scroll table on the page A3DPDFScrollTable* pScrollTableBom = NULL; std::vector aiWidthCols; // in points aiWidthCols.push_back(30); aiWidthCols.push_back(170); aiWidthCols.push_back(30); aiWidthCols.push_back(60); aiWidthCols.push_back(50); std::vector aRowHeader; aRowHeader.push_back("No"); aRowHeader.push_back("NAME PART"); aRowHeader.push_back("QTY"); aRowHeader.push_back("MATERIAL"); aRowHeader.push_back("SNAPSHOT"); std::vector aeTypes; aeTypes.push_back(kA3DPDFTextContent); aeTypes.push_back(kA3DPDFTextContent); aeTypes.push_back(kA3DPDFTextContent); aeTypes.push_back(kA3DPDFTextContent); aeTypes.push_back(kA3DPDFImageContent); CHECK_RET(AddScrollTable(pDoc, pPage, 20, 632, // iPosLeft, iPosTop 15, //iSliderWidth 4, // iNbRowsInFrame 20, // iHeightRowHeader - in points 40, // iHeightRows - in points aiWidthCols, // in points aRowHeader, aeTypes, &pScrollTableBom)); // get existing widgets on template page A3DPDFTextField* pTextTitle = NULL; CHECK_RET(PageGetTextField(pPage, std::string("DF_Title_" + sSuffixFields).c_str(), &pTextTitle)); A3DPDFTextField* pTextDate = NULL; CHECK_RET(PageGetTextField(pPage, std::string("DF_Date_" + sSuffixFields).c_str(), &pTextDate)); A3DPDFTextField* pTextCreatedBy = NULL; CHECK_RET(PageGetTextField(pPage, std::string("DF_CreatedBy_" + sSuffixFields).c_str(), &pTextCreatedBy)); A3DPDFTextField* pTextInstance = NULL; CHECK_RET(PageGetTextField(pPage, std::string("DF_InstanceNode_" + sSuffixFields).c_str(), &pTextInstance)); A3DPDFTextField* pTextColNumArt = NULL; CHECK_RET(PageGetTextField(pPage, std::string("DF_Col0_" + sSuffixFields).c_str(), &pTextColNumArt)); A3DPDFTextField* pTextColNamePart = NULL; CHECK_RET(PageGetTextField(pPage, std::string("DF_Col1_" + sSuffixFields).c_str(), &pTextColNamePart)); A3DPDFListBox* pListManufacturers = NULL; CHECK_RET(PageGetListBoxField(pPage, std::string("DF_ManufacturersList_" + sSuffixFields).c_str(), &pListManufacturers)); A3DPDFTextField* pTextManufDetails = NULL; CHECK_RET(PageGetTextField(pPage, std::string("DF_ManufacturerDetails_" + sSuffixFields).c_str(), &pTextManufDetails)); A3DPDFDataFilter* pDropDownListFilter = NULL; CHECK_RET(A3DPDFPageGetDataFilterFromDropDownListField(pPage, std::string("DF_FilterList_" + sSuffixFields).c_str(), &pDropDownListFilter)); // DATAMODEL // --- creation Tables and relationships // TABLE Statics A3DPDFDataTable* pDataTable_Statics = NULL; CHECK_RET(CreateTable_Sple1_Statics(pDoc, pDataTable_Statics)); // TABLE CBFILTER A3DPDFDataTable* pDataTable_CBFILTER = NULL; CHECK_RET(CreateTable_Sple1_CBFILTER(pDoc, pDataTable_CBFILTER)); // TABLE Manufacturers A3DPDFDataTable* pDataTable_Manufacturers = NULL; CHECK_RET(CreateTable_Sple1_Manufacturers(pDoc, pDataTable_Manufacturers)); // TABLE 3D MODEL + TABLE BOM + RELATIONSHIPs A3DPDFDataTable* pDataTable_3D = NULL; A3DPDFDataTable* pDataTable_Bom = NULL; int iKeyNode3dUID, iKeyNode3dName, iKeyNode3dInstance; int iKeyBomNumArt, iKeyBomNamePart, iKeyBomQty, iKeyBomMaterial, iKeyBomIcon; CHECK_RET(CreateTable_Sple1_3DModel_Bom(pDoc, pModelFile, pPRCWriteHelper, ICONS_PATH, iKeyNode3dUID, iKeyNode3dName, iKeyNode3dInstance, iKeyBomNumArt, iKeyBomNamePart, iKeyBomQty, iKeyBomMaterial, iKeyBomIcon, pDataTable_3D, pDataTable_Bom, pDataTable_Manufacturers)); // RELATIONSHIP CBCBFILTER_To_Bom CHECK_RET(CreateRelationship_Sple1_CBFILTER_To_Bom(pDoc, pDataTable_CBFILTER, pDataTable_Bom)); // --- binding to widgets // --- Widgets binding for Table Static CHECK_RET(A3DPDFTextFieldBindToTable(pTextTitle, pDataTable_Statics, 0)); CHECK_RET(A3DPDFTextFieldBindToTable(pTextDate, pDataTable_Statics, 1)); CHECK_RET(A3DPDFTextFieldBindToTable(pTextCreatedBy, pDataTable_Statics, 2)); // --- Widgets binding for init Filter const A3DInt32 piMapColumns_CBFILTER[] = { 0 } ; const int iSzColCBFILTER = 1; CHECK_RET(A3DPDFDataFilterWidgetBindToTable(pDropDownListFilter, pDataTable_CBFILTER, iSzColCBFILTER, piMapColumns_CBFILTER, "Filter All" )); // pcValueNoFilterApplied: if defined, a first specific row is added in the widget: select this row -> unapply all filters // if pcValueNoFilterApplied is NULL: a filter is always applied (there is no 'nofilter' state ; default is row0) // --- Widgets binding for Table 3D CHECK_RET(A3DPDF3DNodeSceneBindToTable(p3DNodeScene, pDataTable_3D, iKeyNode3dUID));// A3DPDF3DNodeScene maps only 1 col : the one with uuid node names CHECK_RET(A3DPDFTextFieldBindToTable(pTextInstance, pDataTable_3D, iKeyNode3dInstance)); // --- Widgets binding for Table BOM const A3DInt32 piMapColumns_Bom[] = { iKeyBomNumArt, iKeyBomNamePart, iKeyBomQty, iKeyBomMaterial, iKeyBomIcon }; CHECK_RET(A3DPDFScrollTableBindToTable(pScrollTableBom, pDataTable_Bom, sizeof(piMapColumns_Bom)/sizeof(A3DInt32), piMapColumns_Bom )); CHECK_RET(A3DPDFTextFieldBindToTable(pTextColNumArt, pDataTable_Bom, iKeyBomNumArt)); CHECK_RET(A3DPDFTextFieldBindToTable(pTextColNamePart, pDataTable_Bom, iKeyBomNamePart)); // --- Widgets binding for Table Manufacturers CHECK_RET(A3DPDFListBoxBindToTable(pListManufacturers, pDataTable_Manufacturers, 0)); CHECK_RET(A3DPDFTextFieldBindToTable(pTextManufDetails, pDataTable_Manufacturers, 3)); // --- Define interactions between widgets // if Bom is populated coming from a selection in filter dropdown list, only resulting elements of the filter are displayed in Bom CHECK_RET(A3DPDFWidgetSetTargetBehaviour( pDropDownListFilter, pScrollTableBom, kA3DPDFDataIsolate )); // Select a BOM item -> only associated Manufacturers are displayed in Manufacturers list CHECK_RET(A3DPDFWidgetSetTargetBehaviour( pScrollTableBom, pListManufacturers, kA3DPDFDataIsolate )); // selection of a row in Bom -> 2 column values are displayed in 2 text field CHECK_RET(A3DPDFWidgetSetTargetBehaviour(pScrollTableBom, pTextColNumArt, kA3DPDFDataIsolate)); CHECK_RET(A3DPDFWidgetSetTargetBehaviour(pScrollTableBom, pTextColNamePart, kA3DPDFDataIsolate)); // selection of a row in Bom -> the associated elements of widget (=3d nodes) are highlighted CHECK_RET(A3DPDFWidgetSetTargetBehaviour( pScrollTableBom, p3DNodeScene, kA3DPDFDataHighlight )); // select a node in 3D annot -> the elements of BOM (=scroll table rows) are selected (i.e. acts as if the user clicked on the BOM row) CHECK_RET(A3DPDFWidgetSetTargetBehaviour( p3DNodeScene, pScrollTableBom, kA3DPDFDataSelect )); // TextInstance is populated coming from a selection in 3D CHECK_RET(A3DPDFWidgetSetTargetBehaviour( p3DNodeScene, pTextInstance, kA3DPDFDataIsolate )); // selection of a row in Manufacturers list box -> 1 column value is displayed in text field CHECK_RET(A3DPDFWidgetSetTargetBehaviour( pListManufacturers, pTextManufDetails, kA3DPDFDataIsolate )); // cleanup 3D modelfile CHECK_RET(A3DAsmModelFileDelete(pModelFile)); // Free the A3DRWParamsPrcWriteHelper object at the end if (pPRCWriteHelper != NULL) A3DRWParamsPrcWriteHelperFree(pPRCWriteHelper); } indexpage++; } // create page idx+1 from template file. we force the fields renaming to avoid duplicated names. sSuffixFields = "uuid1"; CHECK_RET(A3DPDFDocumentAppendPageFromPDFFileAndSuffixFields(pDoc, PDF_TEMPLATE_2, sSuffixFields.c_str(), &pPage)); if(pPage != NULL) { // --- create and fill Fields to map to DataModel A3DPDF3DAnnot* p3DAnnot = NULL; A3DPDF3DArtwork* p3DArtwork = NULL; A3DAsmModelFile* pModelFile = NULL; // To get unique IDs, we need a A3DRWParamsPrcWriteHelper. // A3DPDF3DStreamCreateFromModelFileAsPRC builds this object. A3DRWParamsPrcWriteHelper* pPRCWriteHelper = NULL; iRet = Create3DAnnot(pDoc, IN_3DFILE_2, pBlankImage, NULL, &p3DArtwork, &p3DAnnot, &pPRCWriteHelper, &pModelFile); if(p3DAnnot != NULL && p3DArtwork != NULL && pModelFile != NULL) { // populating the field with the 3D annotation CHECK_RET(A3DPDFPageFieldSet3DAnnot(pPage, std::string("DF_3DWindow_" + sSuffixFields).c_str(), p3DAnnot)); // get widget for list nodes A3DPDF3DNodeScene* p3DNodeScene = NULL; CHECK_RET(A3DPDF3DAnnotGet3DNodeScene( p3DAnnot, &p3DNodeScene)); // get widget for list views A3DPDF3DViewList* p3DViewList = NULL; CHECK_RET(A3DPDF3DAnnotGet3DViewList( p3DAnnot, &p3DViewList)); // create view carousel on the page A3DPDF3DViewCarousel* pViewCarousel = NULL; std::vector aViewCarouselButPrevNext; aViewCarouselButPrevNext.push_back(std::string("ButScrollViewsPrev_" + sSuffixFields)); aViewCarouselButPrevNext.push_back(std::string("ButScrollViewsNext_" + sSuffixFields)); std::vector aViewCarouselButtons; for (int i=0 ; i<3 ; i++) { char acButName[256]; sprintf ( acButName, "ButViewCarousel%d_", i ); aViewCarouselButtons.push_back(std::string(acButName + sSuffixFields)); } CHECK_RET(AddViewCarousel(pDoc, pPage, 30, // iLeftCarou 340, // iBottomCarou 108, // iHeigthCarousel 22, // iWidthCarouButtonPrevNext 145, // iWidthCarouButton 2, // iHorizMargin aViewCarouselButPrevNext, aViewCarouselButtons, &pViewCarousel)); // create Scroll table on the page A3DPDFScrollTable* pScrollTablePmis = NULL; std::vector aiWidthCols; // in points aiWidthCols.push_back(100); aiWidthCols.push_back(100); aiWidthCols.push_back(100); aiWidthCols.push_back(100); std::vector aRowHeader; aRowHeader.push_back("PMI Name"); aRowHeader.push_back("Type"); aRowHeader.push_back("Value"); aRowHeader.push_back("Tolerance"); std::vector aeTypes; aeTypes.push_back(kA3DPDFTextContent); aeTypes.push_back(kA3DPDFTextContent); aeTypes.push_back(kA3DPDFTextContent); aeTypes.push_back(kA3DPDFTextContent); CHECK_RET(AddScrollTable(pDoc, pPage, 20, 270, // iPosLeft, iPosTop 15, //iSliderWidth 8, // iNbRowsInFrame 20, // iHeightRowHeader - in points 20, // iHeightRows - in points aiWidthCols, // in points aRowHeader, aeTypes, &pScrollTablePmis)); // get existing widgets on template page A3DPDFListBox* pListViewNames = NULL; CHECK_RET(PageGetListBoxField(pPage, std::string("DF_Steps_" + sSuffixFields).c_str(), &pListViewNames)); A3DPDFTextField* pTextTitle = NULL; CHECK_RET(PageGetTextField(pPage, std::string("DF_Title_" + sSuffixFields).c_str(), &pTextTitle)); A3DPDFTextField* pTextDate = NULL; CHECK_RET(PageGetTextField(pPage, std::string("DF_Date_" + sSuffixFields).c_str(), &pTextDate)); A3DPDFTextField* pTextCreatedBy = NULL; CHECK_RET(PageGetTextField(pPage, std::string("DF_CreatedBy_" + sSuffixFields).c_str(), &pTextCreatedBy)); A3DPDFTextField* pTextCol0 = NULL; CHECK_RET(PageGetTextField(pPage, std::string("DF_Col0_" + sSuffixFields).c_str(), &pTextCol0)); A3DPDFTextField* pTextCol1 = NULL; CHECK_RET(PageGetTextField(pPage, std::string("DF_Col1_" + sSuffixFields).c_str(), &pTextCol1)); // DATAMODEL // --- creation Tables and relationships // TABLE Statics A3DPDFDataTable* pDataTable_Statics = NULL; CHECK_RET(CreateTable_Sple2_Statics(pDoc, pDataTable_Statics)); // TABLE ViewNames A3DPDFDataTable* pDataTable_ViewNames = NULL; CHECK_RET(CreateTable_Sple2_ViewNames(pDoc, pDataTable_ViewNames)); // TABLE 3D MODEL A3DPDFDataTable* pDataTable_3D = NULL; A3DPDFDataTable* pDataTable_Pmis = NULL; int iKeyNode3dUID, iKeyPmiName, iKeyPmiType, iKeyPmiValue, iKeyPmiTol; CHECK_RET(CreateTable_Sple2_3DModel(pDoc, pModelFile, pPRCWriteHelper, iKeyNode3dUID, iKeyPmiName, iKeyPmiType, iKeyPmiValue, iKeyPmiTol, pDataTable_3D, pDataTable_Pmis)); // TABLE 3D VIEWS A3DPDFDataTable3DViews* pDataTable_3DViews = NULL; CHECK_RET(CreateTable_Sple2_3DViews_WithCarousel(pDoc, p3DArtwork, pModelFile, pDataTable_3DViews)); // RELATIONSHIP ViewNames_To_Views CHECK_RET(CreateRelationship_Sple2_ViewNames_To_Views(pDoc, pDataTable_ViewNames, pDataTable_3DViews)); // RELATIONSHIP Views_To_Pmis CHECK_RET(CreateRelationship_Sple2_View_To_Pmis(pDoc, pDataTable_3DViews, pDataTable_Pmis)); // RELATIONSHIP Pmis_To_3D //CHECK_RET(createRelationship_Sple2_Pmis_To_3D(pDoc, pDataTable_Pmis, pDataTable_3D)); // --- binding to widgets // --- Widgets binding for Table ViewNames CHECK_RET(A3DPDFListBoxBindToTable(pListViewNames, pDataTable_ViewNames, 0)); // --- Widgets binding for Table Static CHECK_RET(A3DPDFTextFieldBindToTable(pTextTitle, pDataTable_Statics, 0)); CHECK_RET(A3DPDFTextFieldBindToTable(pTextDate, pDataTable_Statics, 1)); CHECK_RET(A3DPDFTextFieldBindToTable(pTextCreatedBy, pDataTable_Statics, 2)); // --- Widgets binding for Table 3D CHECK_RET(A3DPDF3DNodeSceneBindToTable(p3DNodeScene, pDataTable_3D, iKeyNode3dUID));// A3DPDF3DNodeScene maps only 1 col : the one with uuid node names // --- Widgets binding for Table 3D Views // UI of 3D annot list views CHECK_RET(A3DPDF3DViewListBindToTable(p3DViewList, pDataTable_3DViews)); // Carousel widget binding CHECK_RET(A3DPDF3DViewCarouselBindToTable(pViewCarousel, pDataTable_3DViews)); // widgets binding to map columns CHECK_RET(A3DPDFTextFieldBindToTable(pTextCol0, pDataTable_3DViews, 1));// col 1 is for view name CHECK_RET(A3DPDFTextFieldBindToTable(pTextCol1, pDataTable_3DViews, 4));// col 4 is first additional column // --- Widgets binding for Table PMIs const A3DInt32 piMapColumnsPmis[] = { iKeyPmiName, iKeyPmiType, iKeyPmiValue, iKeyPmiTol }; CHECK_RET(A3DPDFScrollTableBindToTable(pScrollTablePmis, pDataTable_Pmis, sizeof(piMapColumnsPmis)/sizeof(A3DInt32), piMapColumnsPmis )); // --- Define interactions between widgets // selection of a row in list ViewNames -> the associated elements of widget (=3d view) is selected CHECK_RET(A3DPDFWidgetSetTargetBehaviour(pListViewNames, p3DViewList, kA3DPDFDataSelect)); // and conversely so that we can see the item selected in the listbox if the selction is done by view list or caroussel CHECK_RET(A3DPDFWidgetSetTargetBehaviour(p3DViewList, pListViewNames, kA3DPDFDataSelect)); // selection of a row in Pmis -> the associated elements of widget (=3d nodes) are selected CHECK_RET(A3DPDFWidgetSetTargetBehaviour( pScrollTablePmis, p3DNodeScene, kA3DPDFDataSelect )); //... and conversely, select a node in 3d -> associated element in scroll table is highlighted CHECK_RET(A3DPDFWidgetSetTargetBehaviour(p3DNodeScene, pScrollTablePmis, kA3DPDFDataHighlight)); // select a view in 3D annot view list -> the elements of PMIs are filtered CHECK_RET(A3DPDFWidgetSetTargetBehaviour( p3DViewList, pScrollTablePmis, kA3DPDFDataIsolate )); // select a view in 3D annot view list -> the elements of texts for columns are filtered CHECK_RET(A3DPDFWidgetSetTargetBehaviour( p3DViewList, pTextCol0, kA3DPDFDataIsolate )); CHECK_RET(A3DPDFWidgetSetTargetBehaviour( p3DViewList, pTextCol1, kA3DPDFDataIsolate )); // select a view in 3D annot view list -> the carousel is selected CHECK_RET(A3DPDFWidgetSetTargetBehaviour( p3DViewList, pViewCarousel, kA3DPDFDataSelect )); // select a view in carousel -> the 3D annot view list is selected CHECK_RET(A3DPDFWidgetSetTargetBehaviour( pViewCarousel, p3DViewList, kA3DPDFDataSelect )); // activate a specific view when the file is opened + all actions on cascading widgets // NULL should be specified on the widget source to select a row at init time CHECK_RET(A3DPDFWidgetSetTargetBehaviour(NULL, p3DViewList, kA3DPDFDataSelect)); // This forces the selection on table at init time CHECK_RET(A3DPDFDataTableSetInitIndex(pDataTable_3DViews, 1)); // cleanup 3D modelfile CHECK_RET(A3DAsmModelFileDelete(pModelFile)); // Free the A3DRWParamsPrcWriteHelper object at the end if (pPRCWriteHelper != NULL) A3DRWParamsPrcWriteHelperFree(pPRCWriteHelper); } indexpage++; } // create page idx+1 from template file. we force the fields renaming to avoid duplicated names. sSuffixFields = "uuid2"; CHECK_RET(A3DPDFDocumentAppendPageFromPDFFileAndSuffixFields(pDoc, PDF_TEMPLATE_3, sSuffixFields.c_str(), &pPage)); if(pPage != NULL) { // --- create and fill Fields to map to DataModel A3DPDF3DAnnot* p3DAnnot = NULL; A3DPDF3DArtwork* p3DArtwork = NULL; A3DAsmModelFile* pModelFile = NULL; // To get unique IDs, we need a A3DRWParamsPrcWriteHelper. // A3DPDF3DStreamCreateFromModelFileAsPRC builds this object. A3DRWParamsPrcWriteHelper* pPRCWriteHelper = NULL; iRet = Create3DAnnot(pDoc, IN_3DFILE_3, pBlankImage, NULL, &p3DArtwork, &p3DAnnot, &pPRCWriteHelper, &pModelFile); if(p3DAnnot != NULL && p3DArtwork != NULL && pModelFile != NULL) { // populating the field with the 3D annotation CHECK_RET(A3DPDFPageFieldSet3DAnnot(pPage, std::string("DF_3DWindow_" + sSuffixFields).c_str(), p3DAnnot)); // get widget for list nodes A3DPDF3DNodeScene* p3DNodeScene = NULL; CHECK_RET(A3DPDF3DAnnotGet3DNodeScene( p3DAnnot, &p3DNodeScene)); // create Scroll table on the page A3DPDFScrollTable* pScrollTableBom = NULL; std::vector aiWidthCols; // in points aiWidthCols.push_back(130); aiWidthCols.push_back(160); aiWidthCols.push_back(30); std::vector aRowHeader; aRowHeader.push_back("No. ARTICLE"); aRowHeader.push_back("NAME PART"); aRowHeader.push_back("QTY"); std::vector aeTypes; aeTypes.push_back(kA3DPDFTextContent); aeTypes.push_back(kA3DPDFTextContent); aeTypes.push_back(kA3DPDFTextContent); CHECK_RET(AddScrollTable(pDoc, pPage, 20, 632, // iPosLeft, iPosTop 15, //iSliderWidth 4, // iNbRowsInFrame 20, // iHeightRowHeader - in points 20, // iHeightRows - in points aiWidthCols, // in points aRowHeader, aeTypes, &pScrollTableBom)); // get existing widgets on template page A3DPDFTextField* pTextTitle = NULL; CHECK_RET(PageGetTextField(pPage, std::string("DF_Title_" + sSuffixFields).c_str(), &pTextTitle)); A3DPDFTextField* pTextDate = NULL; CHECK_RET(PageGetTextField(pPage, std::string("DF_Date_" + sSuffixFields).c_str(), &pTextDate)); A3DPDFTextField* pTextCreatedBy = NULL; CHECK_RET(PageGetTextField(pPage, std::string("DF_CreatedBy_" + sSuffixFields).c_str(), &pTextCreatedBy)); A3DPDFTextField* pTextInstance = NULL; CHECK_RET(PageGetTextField(pPage, std::string("DF_InstanceNode_" + sSuffixFields).c_str(), &pTextInstance)); A3DPDFTextField* pTextCol0 = NULL; CHECK_RET(PageGetTextField(pPage, std::string("DF_Col0_" + sSuffixFields).c_str(), &pTextCol0)); A3DPDFTextField* pTextCol1 = NULL; CHECK_RET(PageGetTextField(pPage, std::string("DF_Col1_" + sSuffixFields).c_str(), &pTextCol1)); A3DPDFButton* pButIcon = NULL; CHECK_RET(PageGetButtonField(pPage, std::string("DF_Image_" + sSuffixFields).c_str(), &pButIcon)); // DATAMODEL // --- creation Tables and relationships // TABLE Statics A3DPDFDataTable* pDataTable_Statics = NULL; CHECK_RET(CreateTable_Sple3_Statics(pDoc, pDataTable_Statics)); // TABLE 3D MODEL + TABLE BOM + RELATIONSHIPs A3DPDFDataTable* pDataTable_3D = NULL; A3DPDFDataTable* pDataTable_Bom = NULL; int iKeyNode3dUID, iKeyNode3dInstance; int iKeyBomNumArt, iKeyBomNamePart, iKeyBomQty, iKeyBomIcon; CHECK_RET(CreateTable_Sple3_3DModel_Bom(pDoc, pModelFile, pPRCWriteHelper, ICONS_PATH, iKeyNode3dUID, iKeyNode3dInstance, iKeyBomNumArt, iKeyBomNamePart, iKeyBomQty, iKeyBomIcon, pDataTable_3D, pDataTable_Bom)); // --- binding to widgets // --- Widgets binding for Table Static CHECK_RET(A3DPDFTextFieldBindToTable(pTextTitle, pDataTable_Statics, 0)); CHECK_RET(A3DPDFTextFieldBindToTable(pTextDate, pDataTable_Statics, 1)); CHECK_RET(A3DPDFTextFieldBindToTable(pTextCreatedBy, pDataTable_Statics, 2)); // --- Widgets binding for Table 3D CHECK_RET(A3DPDF3DNodeSceneBindToTable(p3DNodeScene, pDataTable_3D, iKeyNode3dUID));// A3DPDF3DNodeScene maps only 1 col : the one with uuid node names CHECK_RET(A3DPDFTextFieldBindToTable(pTextInstance, pDataTable_3D, iKeyNode3dInstance)); // --- Widgets binding for Table BOM const A3DInt32 piMapColumns_Bom[] = { iKeyBomNumArt, iKeyBomNamePart, iKeyBomQty }; CHECK_RET(A3DPDFScrollTableBindToTable(pScrollTableBom, pDataTable_Bom, sizeof(piMapColumns_Bom)/sizeof(A3DInt32), piMapColumns_Bom )); CHECK_RET(A3DPDFTextFieldBindToTable(pTextCol0, pDataTable_Bom, iKeyBomNumArt)); CHECK_RET(A3DPDFTextFieldBindToTable(pTextCol1, pDataTable_Bom, iKeyBomNamePart)); const A3DInt32 piMapColumns_But[] = { iKeyBomIcon }; CHECK_RET(A3DPDFButtonBindToTable(pButIcon, pDataTable_Bom, sizeof(piMapColumns_But) / sizeof(A3DInt32), piMapColumns_But)); // --- Define interactions between widgets // selection of a row in Bom -> 2 column values are displayed in 2 text field CHECK_RET(A3DPDFWidgetSetTargetBehaviour( pScrollTableBom, pTextCol0, kA3DPDFDataIsolate )); CHECK_RET(A3DPDFWidgetSetTargetBehaviour(pScrollTableBom, pTextCol1, kA3DPDFDataIsolate)); CHECK_RET(A3DPDFWidgetSetTargetBehaviour(pScrollTableBom, pButIcon, kA3DPDFDataIsolate)); // selection of a row in Bom -> the associated elements of widget (=3d nodes) are highlighted CHECK_RET(A3DPDFWidgetSetTargetBehaviour( pScrollTableBom, p3DNodeScene, kA3DPDFDataHighlight )); // select a node in 3D annot -> the elements of BOM (=scroll table rows) are selected (i.e. acts as if the user clicked on the BOM row) CHECK_RET(A3DPDFWidgetSetTargetBehaviour( p3DNodeScene, pScrollTableBom, kA3DPDFDataSelect )); // TextInstance is populated coming from a selection in 3D CHECK_RET(A3DPDFWidgetSetTargetBehaviour( p3DNodeScene, pTextInstance, kA3DPDFDataIsolate )); // cleanup 3D modelfile CHECK_RET(A3DAsmModelFileDelete(pModelFile)); // Free the A3DRWParamsPrcWriteHelper object at the end if (pPRCWriteHelper != NULL) A3DRWParamsPrcWriteHelperFree(pPRCWriteHelper); } indexpage++; } // end document CHECK_RET(A3DPDFDocumentSaveEx(pDoc, kA3DPDFSaveFull|kA3DPDFSaveOptimized, OUT_FILE)); return iRet; } A3DStatus BuildPDFDocument() { A3DStatus iRet = A3D_SUCCESS; // creating a document A3DPDFDocument* pDoc = NULL; iRet = A3DPDFDocumentCreateEmpty(&pDoc); if(pDoc != NULL) { iRet = stBuildDocument(pDoc); if (iRet!= A3D_SUCCESS) std::cout << "Error building document ; Error number=" << iRet << std::endl; // need to always close the doc to clean data int iRetClose = A3DPDFDocumentClose(pDoc); if (iRetClose!= A3D_SUCCESS) std::cout << "Cannot close document ; Error number=" << iRetClose << std::endl; } else std::cout << "Cannot build document ; Error number=" << iRet << std::endl; return iRet; } //###################################################################################################################### // Main function #ifdef _MSC_VER int wmain(A3DInt32, A3DUniChar**) #else int main(int, A3DUTF8Char**) #endif { #ifndef _MSC_VER setenv("LC_NUMERIC", "en_US.UTF-8", 1); // Locally force locale #endif // init A3DLIB library - automatically handled init/terminate A3DSDKHOOPSPublishLoader sHoopsPublishLoader(_T(HOOPS_BINARY_DIRECTORY)); CHECK_RET(sHoopsPublishLoader.m_eSDKStatus); CHECK_RET(A3DDllSetCallbacksMemory(CheckMalloc, CheckFree)); // init HOOPS Publish related PDF library - automatically handled init/terminate // do it only only once during the life of the application CHECK_RET(sHoopsPublishLoader.InitPDFLib()); // launch PDF treatment A3DStatus iRet = BuildPDFDocument(); if (iRet != A3D_SUCCESS) return iRet; // Check memory allocations return (int)ListLeaks(); }