/*********************************************************************************************************************** * * 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 stTraverseSrfNurbsData(const A3DSurfNurbsData& sData, _TiXmlElement* setting) { setting->SetAttribute("m_eKnotType", (int) sData.m_eKnotType); setting->SetAttribute("m_eSurfaceForm", (int) sData.m_eSurfaceForm); setting->SetAttribute("m_uiUDegree", (int) sData.m_uiUDegree); setting->SetAttribute("m_uiVDegree", (int) sData.m_uiVDegree); traverseDoubles("m_pdUKnots", sData.m_uiUKnotSize, sData.m_pdUKnots, setting); traverseDoubles("m_pdVKnots", sData.m_uiVKnotSize, sData.m_pdVKnots, setting); traversePoints("m_pCtrlPts", sData.m_uiUCtrlSize*sData.m_uiVCtrlSize, sData.m_pCtrlPts, setting); if(sData.m_pdWeights) traverseDoubles("m_pdWeights", sData.m_uiUCtrlSize*sData.m_uiVCtrlSize, sData.m_pdWeights, setting); return A3D_SUCCESS; } //###################################################################################################################### static A3DStatus stTraverseSrfNurbs(const A3DSurfNurbs* pSrf, _TiXmlElement* setting) { A3DSurfNurbsData sData; A3D_INITIALIZE_DATA(A3DSurfNurbsData, sData); _TiXmlElement* srf = new _TiXmlElement("A3DSurfNurbsData"); traverseSource(pSrf, srf); A3DStatus iRet = A3DSurfNurbsGet(pSrf, &sData); if(iRet == A3D_SUCCESS) { stTraverseSrfNurbsData(sData, srf); CHECK_RET(A3DSurfNurbsGet(NULL, &sData)); } else { srf->SetAttribute("error", A3DMiscGetErrorMsg(iRet)); } setting->LinkEndChild(srf); return iRet; } //###################################################################################################################### static A3DStatus stTraverseSrfAsNurbs(const A3DSurfBase* pSrf, _TiXmlElement* setting) { A3DSurfNurbsData sData; A3D_INITIALIZE_DATA(A3DSurfNurbsData, sData); A3DDouble dTolerance = 1e-3; A3DStatus iRet = A3DSurfBaseWithDomainGetAsNurbs(pSrf, nullptr, dTolerance, false, &sData); if(iRet == A3D_SUCCESS) { stTraverseSrfNurbsData(sData, setting); CHECK_RET(A3DSurfNurbsGet(NULL, &sData)); } else { setting->SetAttribute("error", A3DMiscGetErrorMsg(iRet)); } return iRet; } //###################################################################################################################### A3DStatus traverseSrfPlane(const A3DSurfPlane* pSrf, _TiXmlElement* setting) { A3DSurfPlaneData sData; A3D_INITIALIZE_DATA(A3DSurfPlaneData, sData); _TiXmlElement* srf = new _TiXmlElement("A3DSurfPlaneData"); traverseSource(pSrf, srf); A3DStatus iRet = A3DSurfPlaneGet(pSrf, &sData); if(iRet == A3D_SUCCESS) { traverseCartesianTransformationData(sData.m_sTrsf, srf); traverseUVParam(&sData.m_sParam, srf); CHECK_RET(A3DSurfPlaneGet(NULL, &sData)); } else { srf->SetAttribute("error", A3DMiscGetErrorMsg(iRet)); } setting->LinkEndChild(srf); return iRet; } //###################################################################################################################### A3DStatus traverseSurface(const A3DSurfBase* pSrf, _TiXmlElement* setting) { _TiXmlElement* srf = new _TiXmlElement("A3DSurfBase"); traverseSource(pSrf, srf); A3DEEntityType eType; A3DStatus iRet = A3DEntityGetType(pSrf, &eType); if(iRet == A3D_SUCCESS) { switch(eType) { case kA3DTypeSurfNurbs: iRet = stTraverseSrfNurbs(pSrf, srf); break; case kA3DTypeSurfPlane: iRet = traverseSrfPlane(pSrf, srf); break; default: break; } } else if(iRet == A3D_NOT_IMPLEMENTED) iRet = stTraverseSrfAsNurbs(pSrf, srf); A3DDomainData oDomain; A3D_INITIALIZE_DATA(A3DDomainData, oDomain); CHECK_RET(A3DSurfGetDomain(pSrf, &oDomain)); setDoubleAttribute(srf, "m_sMin.m_dX", oDomain.m_sMin.m_dX); setDoubleAttribute(srf, "m_sMin.m_dY", oDomain.m_sMin.m_dY); setDoubleAttribute(srf, "m_sMax.m_dX", oDomain.m_sMax.m_dX); setDoubleAttribute(srf, "m_sMax.m_dY", oDomain.m_sMax.m_dY); setting->LinkEndChild(srf); return iRet; }