/*********************************************************************************************************************** * * 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" //###################################################################################################################### static A3DStatus stTraverseCrvLine(const A3DCrvLine* pCrv, _TiXmlElement* setting) { A3DCrvLineData sData; A3D_INITIALIZE_DATA(A3DCrvLineData, sData); _TiXmlElement* crv = new _TiXmlElement("A3DCrvLineData"); traverseSource(pCrv, crv); A3DStatus iRet = A3DCrvLineGet(pCrv, &sData); if(iRet == A3D_SUCCESS) { setting->SetAttribute("m_bIs2D", (int)sData.m_bIs2D); traverseCartesianTransformationData(sData.m_sTrsf, crv); traverseParam(&sData.m_sParam, crv); A3DCrvLineGet(NULL, &sData); } else { crv->SetAttribute("error", A3DMiscGetErrorMsg(iRet)); } setting->LinkEndChild(crv); return iRet; } //###################################################################################################################### static A3DStatus stTraverseCrvCircle(const A3DCrvCircle* pCrv, _TiXmlElement* setting) { A3DCrvCircleData sData; A3D_INITIALIZE_DATA(A3DCrvCircleData, sData); _TiXmlElement* crv = new _TiXmlElement("A3DCrvCircleData"); traverseSource(pCrv, crv); A3DStatus iRet = A3DCrvCircleGet(pCrv, &sData); if(iRet == A3D_SUCCESS) { setting->SetAttribute("m_bIs2D", (int)sData.m_bIs2D); traverseCartesianTransformationData(sData.m_sTrsf, crv); traverseParam(&sData.m_sParam, crv); setDoubleAttribute(crv,"m_dRadius", sData.m_dRadius); A3DCrvCircleGet(NULL, &sData); } else { crv->SetAttribute("error", A3DMiscGetErrorMsg(iRet)); } setting->LinkEndChild(crv); return iRet; } //###################################################################################################################### static A3DStatus stTraverseCrvEllipse(const A3DCrvEllipse* pCrv, _TiXmlElement* setting) { A3DCrvEllipseData sData; A3D_INITIALIZE_DATA(A3DCrvEllipseData, sData); _TiXmlElement* crv = new _TiXmlElement("A3DCrvEllipseData"); traverseSource(pCrv, crv); A3DStatus iRet = A3DCrvEllipseGet(pCrv, &sData); if(iRet == A3D_SUCCESS) { setting->SetAttribute("m_bIs2D", (int)sData.m_bIs2D); traverseCartesianTransformationData(sData.m_sTrsf, crv); traverseParam(&sData.m_sParam, crv); setDoubleAttribute(crv,"m_dXRadius", sData.m_dXRadius); setDoubleAttribute(crv,"m_dYRadius", sData.m_dYRadius); A3DCrvEllipseGet(NULL, &sData); } else { crv->SetAttribute("error", A3DMiscGetErrorMsg(iRet)); } setting->LinkEndChild(crv); return iRet; } //###################################################################################################################### static A3DStatus stTraverseCrvParabola(const A3DCrvParabola* pCrv, _TiXmlElement* setting) { A3DCrvParabolaData sData; A3D_INITIALIZE_DATA(A3DCrvParabolaData, sData); _TiXmlElement* crv = new _TiXmlElement("A3DCrvParabolaData"); traverseSource(pCrv, crv); A3DStatus iRet = A3DCrvParabolaGet(pCrv, &sData); if(iRet == A3D_SUCCESS) { setting->SetAttribute("m_bIs2D", (int)sData.m_bIs2D); traverseCartesianTransformationData(sData.m_sTrsf, crv); traverseParam(&sData.m_sParam, crv); setDoubleAttribute(crv,"m_dFocal", sData.m_dFocal); crv->SetAttribute("m_cParamType", (int) sData.m_cParamType); A3DCrvParabolaGet(NULL, &sData); } else { crv->SetAttribute("error", A3DMiscGetErrorMsg(iRet)); } setting->LinkEndChild(crv); return iRet; } //###################################################################################################################### static A3DStatus stTraverseCrvHyperbola(const A3DCrvHyperbola* pCrv, _TiXmlElement* setting) { A3DCrvHyperbolaData sData; A3D_INITIALIZE_DATA(A3DCrvHyperbolaData, sData); _TiXmlElement* crv = new _TiXmlElement("A3DCrvHyperbolaData"); traverseSource(pCrv, crv); A3DStatus iRet = A3DCrvHyperbolaGet(pCrv, &sData); if(iRet == A3D_SUCCESS) { setting->SetAttribute("m_bIs2D", (int)sData.m_bIs2D); traverseCartesianTransformationData(sData.m_sTrsf, crv); traverseParam(&sData.m_sParam, crv); setDoubleAttribute(crv,"m_dSemiAxis", sData.m_dSemiAxis); setDoubleAttribute(crv,"m_dSemiImageAxis", sData.m_dSemiImageAxis); crv->SetAttribute("m_cParamType", (int) sData.m_cParamType); A3DCrvHyperbolaGet(NULL, &sData); } else { crv->SetAttribute("error", A3DMiscGetErrorMsg(iRet)); } setting->LinkEndChild(crv); return iRet; } //###################################################################################################################### static A3DStatus stTraverseCrvHelix(const A3DCrvHelix* pCrv, _TiXmlElement* setting) { A3DCrvHelixData sData; A3D_INITIALIZE_DATA(A3DCrvHelixData, sData); _TiXmlElement* crv = new _TiXmlElement("A3DCrvHelixData"); traverseSource(pCrv, crv); A3DStatus iRet = A3DCrvHelixGet(pCrv, &sData); if(iRet == A3D_SUCCESS) { setting->SetAttribute("m_bIs2D", (int)sData.m_bIs2D); A3DCrvHelixGet(NULL, &sData); } else { crv->SetAttribute("error", A3DMiscGetErrorMsg(iRet)); } setting->LinkEndChild(crv); return iRet; } //###################################################################################################################### static A3DStatus stTraverseCrvPolyLine(const A3DCrvPolyLine* pCrv, _TiXmlElement* setting) { A3DCrvPolyLineData sData; A3D_INITIALIZE_DATA(A3DCrvPolyLineData, sData); _TiXmlElement* crv = new _TiXmlElement("A3DCrvPolyLineData"); traverseSource(pCrv, crv); A3DStatus iRet = A3DCrvPolyLineGet(pCrv, &sData); if(iRet == A3D_SUCCESS) { setting->SetAttribute("m_bIs2D", (int)sData.m_bIs2D); traverseCartesianTransformationData(sData.m_sTrsf, crv); traverseParam(&sData.m_sParam, crv); traversePoints("m_pPts", sData.m_uiSize, sData.m_pPts, crv); A3DCrvPolyLineGet(NULL, &sData); } else { crv->SetAttribute("error", A3DMiscGetErrorMsg(iRet)); } setting->LinkEndChild(crv); return iRet; } //###################################################################################################################### static A3DStatus stTraverseCrvComposite(const A3DCrvComposite* pCrv, _TiXmlElement* setting) { A3DCrvCompositeData sData; A3D_INITIALIZE_DATA(A3DCrvCompositeData, sData); _TiXmlElement* crv = new _TiXmlElement("A3DCrvCompositeData"); traverseSource(pCrv, crv); A3DStatus iRet = A3DCrvCompositeGet(pCrv, &sData); if(iRet == A3D_SUCCESS) { setting->SetAttribute("m_bIs2D", (int)sData.m_bIs2D); traverseCartesianTransformationData(sData.m_sTrsf, crv); traverseParam(&sData.m_sParam, crv); crv->SetAttribute("m_bClosed", (int) sData.m_bClosed); traverseBools("m_pbSenses", sData.m_uiSize, sData.m_pbSenses, crv); A3DUns32 ui, uiSize = sData.m_uiSize; for(ui = 0; ui < uiSize; ++ui) traverseCurve(sData.m_ppCurves[ui], crv); A3DCrvCompositeGet(NULL, &sData); } else { crv->SetAttribute("error", A3DMiscGetErrorMsg(iRet)); } setting->LinkEndChild(crv); return iRet; } //###################################################################################################################### static A3DStatus stTraverseCrvNurbsData(const A3DCrvNurbsData& sData, _TiXmlElement* setting) { setting->SetAttribute("m_bIs2D", (int) sData.m_bIs2D); setting->SetAttribute("m_bRational", (int) sData.m_bRational); setting->SetAttribute("m_eKnotType", (int) sData.m_eKnotType); setting->SetAttribute("m_eCurveForm", (int) sData.m_eCurveForm); setting->SetAttribute("m_uiDegree", (int) sData.m_uiDegree); traverseDoubles("m_pdKnots",sData.m_uiKnotSize, sData.m_pdKnots, setting); traversePoints("m_pCtrlPts",sData.m_uiCtrlSize, sData.m_pCtrlPts, setting); if(sData.m_bRational) traverseDoubles("m_pdWeights", sData.m_uiWeightSize, sData.m_pdWeights, setting); return A3D_SUCCESS; } //###################################################################################################################### static A3DStatus stTraverseCrvNurbs(const A3DCrvNurbs* pCrv, _TiXmlElement* setting) { A3DCrvNurbsData sData; A3D_INITIALIZE_DATA(A3DCrvNurbsData, sData); _TiXmlElement* crv = new _TiXmlElement("A3DCrvNurbsData"); traverseSource(pCrv, crv); A3DStatus iRet = A3DCrvNurbsGet(pCrv, &sData); if(iRet == A3D_SUCCESS) { stTraverseCrvNurbsData(sData, crv); CHECK_RET(A3DCrvNurbsGet(NULL, &sData)); } else { crv->SetAttribute("error", A3DMiscGetErrorMsg(iRet)); } setting->LinkEndChild(crv); return iRet; } //###################################################################################################################### static A3DStatus stTraverseCrvAsNurbs(const A3DCrvBase* pCrv, _TiXmlElement* setting) { A3DCrvNurbsData sData; A3D_INITIALIZE_DATA(A3DCrvNurbsData, sData); A3DDouble dTolerance=1e-3; A3DStatus iRet = A3DCrvBaseGetAsNurbs(pCrv, dTolerance, true, &sData); if(iRet == A3D_SUCCESS) { stTraverseCrvNurbsData(sData, setting); CHECK_RET(A3DCrvNurbsGet(NULL, &sData)); } else { setting->SetAttribute("error", A3DMiscGetErrorMsg(iRet)); } return iRet; } //###################################################################################################################### A3DStatus traverseCurve(const A3DCrvBase* pCrv, _TiXmlElement* setting) { _TiXmlElement* crv = new _TiXmlElement("A3DCrvBase"); traverseSource(pCrv, crv); A3DEEntityType eType; A3DStatus iRet = A3DEntityGetType(pCrv,&eType); if(iRet == A3D_SUCCESS) { switch(eType) { case kA3DTypeCrvNurbs: iRet = stTraverseCrvNurbs(pCrv, crv); break; case kA3DTypeCrvLine: iRet = stTraverseCrvLine(pCrv, crv); break; case kA3DTypeCrvCircle: iRet = stTraverseCrvCircle(pCrv, crv); break; case kA3DTypeCrvEllipse: iRet = stTraverseCrvEllipse(pCrv, crv); break; case kA3DTypeCrvParabola: iRet = stTraverseCrvParabola(pCrv, crv); break; case kA3DTypeCrvHyperbola: iRet = stTraverseCrvHyperbola(pCrv, crv); break; case kA3DTypeCrvHelix: iRet = stTraverseCrvHelix(pCrv, crv); break; case kA3DTypeCrvPolyLine: iRet = stTraverseCrvPolyLine(pCrv, crv); break; case kA3DTypeCrvComposite: iRet = stTraverseCrvComposite(pCrv, crv); break; default: iRet = stTraverseCrvAsNurbs(pCrv, crv); break; } } if (iRet == A3D_SUCCESS) { A3DIntervalData oInterval; A3D_INITIALIZE_DATA(A3DIntervalData, oInterval); A3DCrvGetInterval(pCrv, &oInterval); setDoubleAttribute(crv, "m_dMin", oInterval.m_dMin); setDoubleAttribute(crv, "m_dMax", oInterval.m_dMax); } setting->LinkEndChild(crv); return iRet; }