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

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;
}