359 lines
11 KiB
C++
359 lines
11 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 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;
|
|
}
|