/*********************************************************************************************************************** * * 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. * ***********************************************************************************************************************/ #include #include "PRC2XML.h" //###################################################################################################################### A3DStatus traverseAttribute(const A3DMiscAttribute* pAttribute, _TiXmlElement* setting) { A3DMiscAttributeData sData; A3D_INITIALIZE_DATA(A3DMiscAttributeData, sData); A3DStatus iRet = A3DMiscAttributeGet(pAttribute, &sData); if(iRet == A3D_SUCCESS) { _TiXmlElement* attribute = new _TiXmlElement("A3DMiscAttributeData"); attribute->SetAttribute("m_bTitleIsInt", (int) sData.m_bTitleIsInt); if(sData.m_bTitleIsInt) { A3DUns32 uiVal; memcpy(&uiVal,sData.m_pcTitle, sizeof(A3DUns32)); attribute->SetAttribute("m_pcTitle", (int)uiVal); } else { if(sData.m_pcTitle && sData.m_pcTitle[0] != '\0') attribute->SetAttribute("m_pcTitle", sData.m_pcTitle); } for(A3DUns32 ui = 0; ui < sData.m_uiSize; ++ui) { _TiXmlElement* single = new _TiXmlElement("m_asSingleAttributesData"); single->SetAttribute("m_bTitleIsInt", (int) sData.m_asSingleAttributesData[ui].m_bTitleIsInt); if(sData.m_asSingleAttributesData[ui].m_pcTitle == NULL) single->SetAttribute("m_pcTitle", "NULL"); else if(sData.m_asSingleAttributesData[ui].m_bTitleIsInt) { A3DUns32 uiVal; memcpy(&uiVal,sData.m_asSingleAttributesData[ui].m_pcTitle, sizeof(A3DUns32)); single->SetAttribute("m_pcTitle", (int)uiVal); } else { if(sData.m_asSingleAttributesData[ui].m_pcTitle && sData.m_asSingleAttributesData[ui].m_pcTitle[0] != '\0') single->SetAttribute("m_pcTitle", sData.m_asSingleAttributesData[ui].m_pcTitle); } A3DInt32 iVal; switch(sData.m_asSingleAttributesData[ui].m_eType) { case kA3DModellerAttributeTypeInt: memcpy(&iVal, sData.m_asSingleAttributesData[ui].m_pcData, sizeof(A3DInt32)); single->SetAttribute("m_eType", "kA3DModellerAttributeTypeInt"); single->SetAttribute("m_pcData", iVal); break; case kA3DModellerAttributeTypeReal: A3DDouble dVal; memcpy(&dVal, sData.m_asSingleAttributesData[ui].m_pcData, sizeof(A3DDouble)); single->SetAttribute("m_eType", "kA3DModellerAttributeTypeReal"); setDoubleAttribute(single, "m_pcData", dVal); if (sData.m_asSingleAttributesData[ui].m_usUnit!= A3D_DEFAULT_NO_UNIT) single->SetAttribute("m_usUnit", sData.m_asSingleAttributesData[ui].m_usUnit); break; case kA3DModellerAttributeTypeTime: memcpy(&iVal, sData.m_asSingleAttributesData[ui].m_pcData, sizeof(A3DInt32)); single->SetAttribute("m_eType", "kA3DModellerAttributeTypeTime"); single->SetAttribute("m_pcData", iVal); break; case kA3DModellerAttributeTypeString: single->SetAttribute("m_eType", "kA3DModellerAttributeTypeString"); if(sData.m_asSingleAttributesData[ui].m_pcData && sData.m_asSingleAttributesData[ui].m_pcData[0] != '\0') single->SetAttribute("m_pcData", sData.m_asSingleAttributesData[ui].m_pcData); break; default: break; } attribute->LinkEndChild(single); } setting->LinkEndChild(attribute); A3DMiscAttributeGet(NULL, &sData); } return A3D_SUCCESS; } //###################################################################################################################### A3DStatus traverseGraphics(const A3DGraphics* pGraphics, _TiXmlElement* setting) { A3DGraphicsData sData; A3D_INITIALIZE_DATA(A3DGraphicsData, sData); A3DStatus iRet = A3DGraphicsGet(pGraphics, &sData); if(iRet == A3D_SUCCESS) { _TiXmlElement* graphics = new _TiXmlElement("A3DGraphicsData"); if(sData.m_uiLayerIndex != A3D_DEFAULT_LAYER) graphics->SetAttribute("m_uiLayerIndex", (int) sData.m_uiLayerIndex); if(sData.m_uiStyleIndex != A3D_DEFAULT_STYLE_INDEX) graphics->SetAttribute("m_uiStyleIndex", (int) sData.m_uiStyleIndex); graphics->SetAttribute("m_usBehaviour", (int) sData.m_usBehaviour); CHECK_RET(A3DGraphicsGet(NULL, &sData)); setting->LinkEndChild(graphics); } return iRet; } //###################################################################################################################### A3DStatus traverseBase(const A3DEntity* pEntity, _TiXmlElement* setting) { A3DRootBaseData sData; A3D_INITIALIZE_DATA(A3DRootBaseData, sData); A3DStatus iRet = A3DRootBaseGet(pEntity, &sData); if(iRet == A3D_SUCCESS) { _TiXmlElement* base = new _TiXmlElement("A3DRootBaseData"); if(sData.m_pcName && sData.m_pcName[0] != '\0') base->SetAttribute("m_pcName", sData.m_pcName); base->SetAttribute("m_uiPersistentId", sData.m_uiPersistentId); base->SetAttribute("m_uiNonPersistentId", sData.m_uiNonPersistentId); if (sData.m_pcPersistentId) base->SetAttribute("m_pcPersistentId", sData.m_pcPersistentId); for(A3DUns32 ui = 0; ui < sData.m_uiSize; ++ui) traverseAttribute(sData.m_ppAttributes[ui], base); A3DBoundingBoxData sBoundingBox; A3D_INITIALIZE_DATA(A3DBoundingBoxData, sBoundingBox); iRet = A3DMiscGetBoundingBox(pEntity, &sBoundingBox); if(iRet == A3D_SUCCESS) { if((sBoundingBox.m_sMin.m_dX + sBoundingBox.m_sMin.m_dY + sBoundingBox.m_sMin.m_dZ + sBoundingBox.m_sMax.m_dX + sBoundingBox.m_sMax.m_dY + sBoundingBox.m_sMax.m_dZ) != 0.0) { char acBBox[256]; sprintf(acBBox, "Min(%f,%f,%f) Max(%f,%f,%f)", sBoundingBox.m_sMin.m_dX, sBoundingBox.m_sMin.m_dY, sBoundingBox.m_sMin.m_dZ, sBoundingBox.m_sMax.m_dX, sBoundingBox.m_sMax.m_dY, sBoundingBox.m_sMax.m_dZ); base->SetAttribute("BoundingBox", acBBox); A3DMiscGetBoundingBox(NULL, &sBoundingBox); } } setting->LinkEndChild(base); A3DRootBaseGet(NULL, &sData); } return A3D_SUCCESS; } //###################################################################################################################### A3DStatus traverseBaseWithGraphics(const A3DEntity* pEntity, _TiXmlElement* setting) { A3DRootBaseWithGraphicsData sData; A3D_INITIALIZE_DATA(A3DRootBaseWithGraphicsData, sData); A3DStatus iRet = A3DRootBaseWithGraphicsGet(pEntity, &sData); if(iRet == A3D_SUCCESS) { _TiXmlElement* basewithgraphics = new _TiXmlElement("A3DRootBaseWithGraphicsData"); traverseBase(pEntity,basewithgraphics); if(sData.m_pGraphics != NULL) traverseGraphics(sData.m_pGraphics,basewithgraphics); setting->LinkEndChild(basewithgraphics); A3DRootBaseWithGraphicsGet(NULL, &sData); } return A3D_SUCCESS; } //###################################################################################################################### A3DStatus traverseSource(const A3DEntity* pEntity, _TiXmlElement* setting) { if(A3DEntityIsBaseWithGraphicsType(pEntity)) return traverseBaseWithGraphics(pEntity, setting); else if(A3DEntityIsBaseType(pEntity)) return traverseBase(pEntity, setting); return A3D_SUCCESS; }