Files
Hoops_Exchange/exchange/exchangesource/PRC2XML/PRC2XMLGeometrySrf.cpp
2025-12-15 23:22:33 +08:00

143 lines
4.7 KiB
C++

/***********************************************************************************************************************
*
* 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 <A3DSDKIncludes.h>
#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;
}