Files
2025-12-15 22:10:55 +08:00

285 lines
11 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.
*
***********************************************************************************************************************/
/**
* Sample CreatePRCCubes
* file CreatePRCCubes.cpp
* This file is containing the main trunc of the CreatePRCCubes sample.
*
* The purpose of this sample is to propose an embryo set of functionality allowing the creation of various PRC entities.
* It proposes and tackles different modules such as:
* - creation of markups: see CreateMarkups.cpp
* - creation of views: see CreateViews.cpp
* - creation of textures: see CreateTextures.cpp
* - creation of colors: see CreateGraphics.cpp
* - creation of links between entities: see CreateLinkedItem.cpp
*
* Inside this files is created either a PRC or a PDF file with a defined structures,
* a certain number of markups and a certain number of views.
*
* The function createAssemblyTree, createFileMarkups, createFileViews
* can be modified to create your own PRC or PDF file:
* modifying the structure can be done in createAssemblyTree.
* modifying the views can be done in createFileViews.
* modifying the markups can be done in createFileMarkups.
*
* It should be the reference sample for PRC entity creation but is also a great tool to understand how the PRC tree is working.
*
***********************************************************************************************************************/
#define INITIALIZE_A3D_API
#define HOOPS_PRODUCT_PUBLISH_STANDARD
#include "CreatePRCCubesDef.h"
#include "../CommonInit.h"
#include "CreateModelFile.h"
#include <vector>
//######################################################################################################################
/*
void debugCheckRet()
{
printf("debug");
}
#define CHECK_RET(function_call) {\
iRet = function_call; if(iRet != A3D_SUCCESS) { debugCheckRet(); std::cout << "Error number=" << iRet << std::endl; return iRet; }\
}
*/
// 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 TEXTURE_FILE SAMPLES_DATA_DIRECTORY"\\images\\Logo.jpg"
# define OUT_FILE SAMPLES_PUBLISH_GALLERY_DIRECTORY"\\sample_CreatePRCCubes.pdf"
#else
# define TEXTURE_FILE SAMPLES_DATA_DIRECTORY"/images/Logo.jpg"
# define OUT_FILE SAMPLES_PUBLISH_GALLERY_DIRECTORY"/sample_CreatePRCCubes.pdf"
#endif
//######################################################################################################################
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;
}
A3DStatus BuildPDFDocument()
{
A3DStatus iRet = A3D_SUCCESS;
// create empty document
A3DPDFDocument* pDoc = NULL;
CHECK_RET(A3DPDFDocumentCreateEmpty(&pDoc));
if(pDoc != NULL)
{
// creating a document page from scratch
A3DPDFPageData2 sPageData;
A3D_INITIALIZE_DATA(A3DPDFPageData2, sPageData);
sPageData.m_ePageOrientation = kA3DPDFPageLandscape;
sPageData.m_ePageSize = kA3DPDFPageLetter; // standard letter format: 612 x 792
const int iPageWidth = 792, iPageHeight = 612;
A3DPDFPage* pPage = NULL;
CHECK_RET(A3DPDFDocumentAppendNewPage2(pDoc, &sPageData, &pPage));
if (pPage != NULL)
{
// creating the model file
A3DAsmModelFile* pModelFile = NULL;
iRet = createPRCCubesFile(&pModelFile, TEXTURE_FILE);
std::vector<std::string> asViewNamesList;
std::vector<std::string> asViewLabelsList;
asViewNamesList.push_back("Default View");
asViewLabelsList.push_back("Default View");
asViewNamesList.push_back("Define New Camera");
asViewLabelsList.push_back("Define New Camera");
asViewNamesList.push_back("Hide Objects");
asViewLabelsList.push_back("Hide Objects");
asViewNamesList.push_back("Change Objects Color");
asViewLabelsList.push_back("Change Objects Color");
asViewNamesList.push_back("Change Face Color");
asViewLabelsList.push_back("Change Face Color");
asViewNamesList.push_back("Visible Annotation");
asViewLabelsList.push_back("Visible Annotation");
asViewNamesList.push_back("Change Object Position");
asViewLabelsList.push_back("Change Object Position");
if(pModelFile)
{
/*
// sample code to save the PRC File
A3DRWParamsExportPrcData sParamsExportData;
A3D_INITIALIZE_DATA(A3DRWParamsExportPrcData, sParamsExportData);
sParamsExportData.m_bCompressBrep = true;
sParamsExportData.m_bCompressTessellation = true;
sParamsExportData.m_eCompressBrepType = kA3DCompressionMedium;
CHECK_RET(A3DAsmModelFileExportToPrcFile(pModelFile, &sParamsExportData, pcPRCFileName, NULL);
CHECK_RET(A3DPDF3DStreamCreateFromFile(pDoc, "c:\\temp\\myprc.prc", true, &pStream));
*/
// creating the PRC stream from the model file that is going to be inserted into the PDF file
A3DPDF3DStream* pStream;
A3DRWParamsExportPrcData sParamsExportData;
A3D_INITIALIZE_DATA(A3DRWParamsExportPrcData, sParamsExportData);
sParamsExportData.m_bCompressTessellation = false;
CHECK_RET(A3DPDF3DStreamCreateFromModelFileAsPRC(pDoc, pModelFile, &sParamsExportData, &pStream, NULL));
// creating the 3D artwork
A3DPDF3DArtwork* p3DArtwork;
A3DPDF3DArtworkData2 s3DArtworkData;
A3D_INITIALIZE_DATA(A3DPDF3DArtworkData2, s3DArtworkData);
s3DArtworkData.m_pStream = pStream;
s3DArtworkData.m_bActivatePMICrossHighlight = true;
s3DArtworkData.m_bAddPMISemanticInformation = true;
s3DArtworkData.m_bAddAdditionalGeometry = true;
s3DArtworkData.m_sDisplaySectionData.m_bAddSectionCaps = true;
s3DArtworkData.m_bKeepNativeDefaultView = true; // this enables to respect the default view defined in PRC
CHECK_RET(A3DPDF3DArtworkCreate2(pDoc, &s3DArtworkData, &p3DArtwork));
A3DPDF3DAnnotData sAnnotData;
A3D_INITIALIZE_DATA(A3DPDF3DAnnotData, sAnnotData);
sAnnotData.m_bOpenModelTree = false;
sAnnotData.m_bShowToolbar = false;
sAnnotData.m_eLighting = kA3DPDFLightWhite;
sAnnotData.m_eRenderingStyle = kA3DPDFRenderingSolid;
sAnnotData.m_sBackgroundColor.m_dRed = 0.75;
sAnnotData.m_sBackgroundColor.m_dGreen = 0.75;
sAnnotData.m_sBackgroundColor.m_dBlue = 0.75;
sAnnotData.m_bTransparentBackground = false;
sAnnotData.m_eActivateWhen = kA3DPDFActivPageOpened;
sAnnotData.m_eDesactivateWhen = kA3DPDFActivPageClosed;
sAnnotData.m_iAppearanceBorderWidth = 0;
sAnnotData.m_pPosterImage = NULL; // default poster automatically generated
sAnnotData.m_p3DArtwork = p3DArtwork;
A3DPDF3DAnnot* p3DAnnot = NULL;
CHECK_RET(A3DPDF3DAnnotCreate(pDoc, &sAnnotData, &p3DAnnot));
if(p3DAnnot != NULL)
{
// position the 3D annotation in the page
A3DPDFRectData sPos;
A3D_INITIALIZE_DATA(A3DPDFRectData, sPos);
const A3DInt32 iHeigthButView = 15;
// coordinates are from bottom left of the page
sPos.m_iLeft = 100; // lower left x
sPos.m_iBottom = 0; // lower left y
sPos.m_iRight = iPageWidth; // upper right x
sPos.m_iTop = iPageHeight; // upper right y
CHECK_RET(A3DPDFPageInsert3DAnnot(pPage, p3DAnnot, &sPos));
A3DPDFButton** ppButtonsViews = (A3DPDFButton**)malloc(asViewNamesList.size() * A3DUns32(sizeof(A3DPDFButton*)));
for (size_t i = 0; i < asViewNamesList.size(); i++)
{
// buttons scrolls both act the same and have same attributes
A3DPDFButtonData sButtonViewsData;
A3D_INITIALIZE_DATA(A3DPDFButtonData, sButtonViewsData);
sButtonViewsData.m_bHasFillColor = false;
sButtonViewsData.m_bHasBorder = false;
sButtonViewsData.m_eThicknessBorder = kA3DPDFThin;
sButtonViewsData.m_eLineStyleBorder = kA3DPDFSolid;
sButtonViewsData.m_eLayoutTextIcon = kA3DPDFLabelOnly;
sButtonViewsData.m_eHighlightingMode = kA3DPDFLinkHighlightOutline;
mallocAndSetString( (A3DUTF8Char*)asViewNamesList[i].c_str(), sButtonViewsData.m_pcName);
mallocAndSetString( (A3DUTF8Char*)asViewLabelsList[i].c_str(), sButtonViewsData.m_pcLabel);
mallocAndSetString((A3DUTF8Char*)asViewNamesList[i].c_str(), sButtonViewsData.m_pcTooltip);
CHECK_RET(A3DPDFButtonCreate(pDoc, &sButtonViewsData, &ppButtonsViews[i]));
sPos.m_iLeft = 0; // lower left x
sPos.m_iRight = sPos.m_iLeft + 100; // upper right x
sPos.m_iTop = iPageHeight - (A3DInt32)i*iHeigthButView; // upper right y
sPos.m_iBottom = sPos.m_iTop - iHeigthButView; // lower left y
CHECK_RET(A3DPDFPageInsertButton(pPage, ppButtonsViews[i], &sPos));
// set actions on buttons
// this is common to all SetView actions
A3DPDFAction* pAction = NULL;
A3DPDFActionSetViewData sActionData;
A3D_INITIALIZE_DATA(A3DPDFActionSetViewData, sActionData);
sActionData.m_p3DAnnot = p3DAnnot;
sActionData.m_bAnimate = false;
//sActionData.m_iViewIndex = (A3DUns32)i;
sActionData.m_pcViewName = sButtonViewsData.m_pcName;
CHECK_RET(A3DPDFActionSetViewCreate(&sActionData, &pAction));
CHECK_RET(A3DPDFButtonAddAction(ppButtonsViews[i], pAction));
free(sButtonViewsData.m_pcName);
free(sButtonViewsData.m_pcLabel);
free(sButtonViewsData.m_pcTooltip);
}
free(ppButtonsViews);
}
// cleaning up -- WARNING: DO NOT CALL THIS BEFORE A3DPDF3DArtworkCreate!
CHECK_RET(A3DAsmModelFileDelete(pModelFile));
// saving the document
CHECK_RET(A3DPDFDocumentSaveEx(pDoc, kA3DPDFSaveFull|kA3DPDFSaveOptimized, OUT_FILE));
CHECK_RET(A3DPDFDocumentClose(pDoc));
}
}
}
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();
}