143 lines
4.7 KiB
C++
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;
|
|
}
|