support more types surface

This commit is contained in:
ninja
2025-12-15 23:39:49 +08:00
parent 8782765fbc
commit 687f7c54da

View File

@@ -3,8 +3,8 @@
* 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
* 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.
*
***********************************************************************************************************************/
@@ -17,17 +17,17 @@
//######################################################################################################################
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);
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);
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);
if (sData.m_pdWeights)
traverseDoubles("m_pdWeights", sData.m_uiUCtrlSize * sData.m_uiVCtrlSize, sData.m_pdWeights, setting);
return A3D_SUCCESS;
}
@@ -42,14 +42,14 @@ static A3DStatus stTraverseSrfNurbs(const A3DSurfNurbs* pSrf, _TiXmlElement* set
traverseSource(pSrf, srf);
A3DStatus iRet = A3DSurfNurbsGet(pSrf, &sData);
if(iRet == A3D_SUCCESS)
if (iRet == A3D_SUCCESS)
{
stTraverseSrfNurbsData(sData, srf);
CHECK_RET(A3DSurfNurbsGet(NULL, &sData));
}
else
{
srf->SetAttribute("error", A3DMiscGetErrorMsg(iRet));
srf->SetAttribute("error", iRet);
}
setting->LinkEndChild(srf);
@@ -64,14 +64,14 @@ static A3DStatus stTraverseSrfAsNurbs(const A3DSurfBase* pSrf, _TiXmlElement* se
A3DDouble dTolerance = 1e-3;
A3DStatus iRet = A3DSurfBaseWithDomainGetAsNurbs(pSrf, nullptr, dTolerance, false, &sData);
if(iRet == A3D_SUCCESS)
if (iRet == A3D_SUCCESS)
{
stTraverseSrfNurbsData(sData, setting);
CHECK_RET(A3DSurfNurbsGet(NULL, &sData));
}
else
{
setting->SetAttribute("error", A3DMiscGetErrorMsg(iRet));
setting->SetAttribute("error", iRet);
}
return iRet;
@@ -87,7 +87,7 @@ A3DStatus traverseSrfPlane(const A3DSurfPlane* pSrf, _TiXmlElement* setting)
traverseSource(pSrf, srf);
A3DStatus iRet = A3DSurfPlaneGet(pSrf, &sData);
if(iRet == A3D_SUCCESS)
if (iRet == A3D_SUCCESS)
{
traverseCartesianTransformationData(sData.m_sTrsf, srf);
traverseUVParam(&sData.m_sParam, srf);
@@ -96,7 +96,351 @@ A3DStatus traverseSrfPlane(const A3DSurfPlane* pSrf, _TiXmlElement* setting)
}
else
{
srf->SetAttribute("error", A3DMiscGetErrorMsg(iRet));
srf->SetAttribute("error", iRet);
}
setting->LinkEndChild(srf);
return iRet;
}
//######################################################################################################################
// Cylinder
static A3DStatus stTraverseSrfCylinder(const A3DSurfCylinder* pSrf, _TiXmlElement* setting)
{
A3DSurfCylinderData sData;
A3D_INITIALIZE_DATA(A3DSurfCylinderData, sData);
_TiXmlElement* srf = new _TiXmlElement("A3DSurfCylinderData");
traverseSource(pSrf, srf);
A3DStatus iRet = A3DSurfCylinderGet(pSrf, &sData);
if (iRet == A3D_SUCCESS)
{
traverseCartesianTransformationData(sData.m_sTrsf, srf);
traverseUVParam(&sData.m_sParam, srf);
setDoubleAttribute(srf, "m_dRadius", sData.m_dRadius);
CHECK_RET(A3DSurfCylinderGet(NULL, &sData));
}
else
{
srf->SetAttribute("error", iRet);
}
setting->LinkEndChild(srf);
return iRet;
}
//######################################################################################################################
// Sphere
static A3DStatus stTraverseSrfSphere(const A3DSurfSphere* pSrf, _TiXmlElement* setting)
{
A3DSurfSphereData sData;
A3D_INITIALIZE_DATA(A3DSurfSphereData, sData);
_TiXmlElement* srf = new _TiXmlElement("A3DSurfSphereData");
traverseSource(pSrf, srf);
A3DStatus iRet = A3DSurfSphereGet(pSrf, &sData);
if (iRet == A3D_SUCCESS)
{
traverseCartesianTransformationData(sData.m_sTrsf, srf);
traverseUVParam(&sData.m_sParam, srf);
setDoubleAttribute(srf, "m_dRadius", sData.m_dRadius);
CHECK_RET(A3DSurfSphereGet(NULL, &sData));
}
else
{
srf->SetAttribute("error", iRet);
}
setting->LinkEndChild(srf);
return iRet;
}
//######################################################################################################################
// Revolution
static A3DStatus stTraverseSrfRevolution(const A3DSurfRevolution* pSrf, _TiXmlElement* setting)
{
A3DSurfRevolutionData sData;
A3D_INITIALIZE_DATA(A3DSurfRevolutionData, sData);
_TiXmlElement* srf = new _TiXmlElement("A3DSurfRevolutionData");
traverseSource(pSrf, srf);
A3DStatus iRet = A3DSurfRevolutionGet(pSrf, &sData);
if (iRet == A3D_SUCCESS)
{
traverseCartesianTransformationData(sData.m_sTrsf, srf);
traverseUVParam(&sData.m_sParam, srf);
// <20><>׼<EFBFBD><D7BC><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>
if (sData.m_pCurve)
traverseCurve(sData.m_pCurve, srf);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB7BD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
traversePoints("m_sOrigin", 1, &sData.m_sOrigin, srf);
traversePoints("m_sDirection", 1, &sData.m_sDirection, srf);
CHECK_RET(A3DSurfRevolutionGet(NULL, &sData));
}
else
{
srf->SetAttribute("error", iRet);
}
setting->LinkEndChild(srf);
return iRet;
}
//######################################################################################################################
// Cone
static A3DStatus stTraverseSrfCone(const A3DSurfCone* pSrf, _TiXmlElement* setting)
{
A3DSurfConeData sData;
A3D_INITIALIZE_DATA(A3DSurfConeData, sData);
_TiXmlElement* srf = new _TiXmlElement("A3DSurfConeData");
traverseSource(pSrf, srf);
A3DStatus iRet = A3DSurfConeGet(pSrf, &sData);
if (iRet == A3D_SUCCESS)
{
traverseCartesianTransformationData(sData.m_sTrsf, srf);
traverseUVParam(&sData.m_sParam, srf);
setDoubleAttribute(srf, "m_dRadius", sData.m_dRadius);
setDoubleAttribute(srf, "m_dSemiAngle", sData.m_dSemiAngle);
srf->SetAttribute("m_bInsideOut", (int)sData.m_bInsideOut);
CHECK_RET(A3DSurfConeGet(NULL, &sData));
}
else
{
srf->SetAttribute("error", iRet);
}
setting->LinkEndChild(srf);
return iRet;
}
//######################################################################################################################
// Cylindrical (basis surface)
static A3DStatus stTraverseSrfCylindrical(const A3DSurfCylindrical* pSrf, _TiXmlElement* setting)
{
A3DSurfCylindricalData sData;
A3D_INITIALIZE_DATA(A3DSurfCylindricalData, sData);
_TiXmlElement* srf = new _TiXmlElement("A3DSurfCylindricalData");
traverseSource(pSrf, srf);
A3DStatus iRet = A3DSurfCylindricalGet(pSrf, &sData);
if (iRet == A3D_SUCCESS)
{
traverseCartesianTransformationData(sData.m_sTrsf, srf);
traverseUVParam(&sData.m_sParam, srf);
// Basis surface
if (sData.m_pBasisSurf)
traverseSurface(sData.m_pBasisSurf, srf);
CHECK_RET(A3DSurfCylindricalGet(NULL, &sData));
}
else
{
srf->SetAttribute("error", iRet);
}
setting->LinkEndChild(srf);
return iRet;
}
//######################################################################################################################
// Offset
static A3DStatus stTraverseSrfOffset(const A3DSurfOffset* pSrf, _TiXmlElement* setting)
{
A3DSurfOffsetData sData;
A3D_INITIALIZE_DATA(A3DSurfOffsetData, sData);
_TiXmlElement* srf = new _TiXmlElement("A3DSurfOffsetData");
traverseSource(pSrf, srf);
A3DStatus iRet = A3DSurfOffsetGet(pSrf, &sData);
if (iRet == A3D_SUCCESS)
{
traverseCartesianTransformationData(sData.m_sTrsf, srf);
traverseUVParam(&sData.m_sParam, srf);
setDoubleAttribute(srf, "m_dOffset", sData.m_dOffset);
// basis surface
if (sData.m_pBasisSurf)
traverseSurface(sData.m_pBasisSurf, srf);
CHECK_RET(A3DSurfOffsetGet(NULL, &sData));
}
else
{
srf->SetAttribute("error", iRet);
}
setting->LinkEndChild(srf);
return iRet;
}
//######################################################################################################################
// Pipe
static A3DStatus stTraverseSrfPipe(const A3DSurfPipe* pSrf, _TiXmlElement* setting)
{
A3DSurfPipeData sData;
A3D_INITIALIZE_DATA(A3DSurfPipeData, sData);
_TiXmlElement* srf = new _TiXmlElement("A3DSurfPipeData");
traverseSource(pSrf, srf);
A3DStatus iRet = A3DSurfPipeGet(pSrf, &sData);
if (iRet == A3D_SUCCESS)
{
traverseCartesianTransformationData(sData.m_sTrsf, srf);
traverseUVParam(&sData.m_sParam, srf);
setDoubleAttribute(srf, "m_dRadius", sData.m_dRadius);
// spine and origine are curves
if (sData.m_pSpine)
traverseCurve(sData.m_pSpine, srf);
if (sData.m_pOrigine)
traverseCurve(sData.m_pOrigine, srf);
CHECK_RET(A3DSurfPipeGet(NULL, &sData));
}
else
{
srf->SetAttribute("error", iRet);
}
setting->LinkEndChild(srf);
return iRet;
}
//######################################################################################################################
// Ruled
static A3DStatus stTraverseSrfRuled(const A3DSurfRuled* pSrf, _TiXmlElement* setting)
{
A3DSurfRuledData sData;
A3D_INITIALIZE_DATA(A3DSurfRuledData, sData);
_TiXmlElement* srf = new _TiXmlElement("A3DSurfRuledData");
traverseSource(pSrf, srf);
A3DStatus iRet = A3DSurfRuledGet(pSrf, &sData);
if (iRet == A3D_SUCCESS)
{
traverseCartesianTransformationData(sData.m_sTrsf, srf);
traverseUVParam(&sData.m_sParam, srf);
// first and second basis curves
if (sData.m_pFirstCurve)
traverseCurve(sData.m_pFirstCurve, srf);
if (sData.m_pSecondCurve)
traverseCurve(sData.m_pSecondCurve, srf);
CHECK_RET(A3DSurfRuledGet(NULL, &sData));
}
else
{
srf->SetAttribute("error", iRet);
}
setting->LinkEndChild(srf);
return iRet;
}
//######################################################################################################################
// Extrusion
static A3DStatus stTraverseSrfExtrusion(const A3DSurfExtrusion* pSrf, _TiXmlElement* setting)
{
A3DSurfExtrusionData sData;
A3D_INITIALIZE_DATA(A3DSurfExtrusionData, sData);
_TiXmlElement* srf = new _TiXmlElement("A3DSurfExtrusionData");
traverseSource(pSrf, srf);
A3DStatus iRet = A3DSurfExtrusionGet(pSrf, &sData);
if (iRet == A3D_SUCCESS)
{
traverseCartesianTransformationData(sData.m_sTrsf, srf);
traverseUVParam(&sData.m_sParam, srf);
if (sData.m_pCurve)
traverseCurve(sData.m_pCurve, srf);
traversePoints("m_sDirection", 1, &sData.m_sDirection, srf);
CHECK_RET(A3DSurfExtrusionGet(NULL, &sData));
}
else
{
srf->SetAttribute("error", iRet);
}
setting->LinkEndChild(srf);
return iRet;
}
//######################################################################################################################
// FromCurves
static A3DStatus stTraverseSrfFromCurves(const A3DSurfFromCurves* pSrf, _TiXmlElement* setting)
{
A3DSurfFromCurvesData sData;
A3D_INITIALIZE_DATA(A3DSurfFromCurvesData, sData);
_TiXmlElement* srf = new _TiXmlElement("A3DSurfFromCurvesData");
traverseSource(pSrf, srf);
A3DStatus iRet = A3DSurfFromCurvesGet(pSrf, &sData);
if (iRet == A3D_SUCCESS)
{
traverseCartesianTransformationData(sData.m_sTrsf, srf);
traverseUVParam(&sData.m_sParam, srf);
traversePoints("m_sOrigin", 1, &sData.m_sOrigin, srf);
if (sData.m_pFirstCurve)
traverseCurve(sData.m_pFirstCurve, srf);
if (sData.m_pSecondCurve)
traverseCurve(sData.m_pSecondCurve, srf);
CHECK_RET(A3DSurfFromCurvesGet(NULL, &sData));
}
else
{
srf->SetAttribute("error", iRet);
}
setting->LinkEndChild(srf);
return iRet;
}
//######################################################################################################################
// Torus
static A3DStatus stTraverseSrfTorus(const A3DSurfTorus* pSrf, _TiXmlElement* setting)
{
A3DSurfTorusData sData;
A3D_INITIALIZE_DATA(A3DSurfTorusData, sData);
_TiXmlElement* srf = new _TiXmlElement("A3DSurfTorusData");
traverseSource(pSrf, srf);
A3DStatus iRet = A3DSurfTorusGet(pSrf, &sData);
if (iRet == A3D_SUCCESS)
{
traverseCartesianTransformationData(sData.m_sTrsf, srf);
traverseUVParam(&sData.m_sParam, srf);
setDoubleAttribute(srf, "m_dMajorRadius", sData.m_dMajorRadius);
setDoubleAttribute(srf, "m_dMinorRadius", sData.m_dMinorRadius);
CHECK_RET(A3DSurfTorusGet(NULL, &sData));
}
else
{
srf->SetAttribute("error", iRet);
}
setting->LinkEndChild(srf);
@@ -111,9 +455,9 @@ A3DStatus traverseSurface(const A3DSurfBase* pSrf, _TiXmlElement* setting)
A3DEEntityType eType;
A3DStatus iRet = A3DEntityGetType(pSrf, &eType);
if(iRet == A3D_SUCCESS)
if (iRet == A3D_SUCCESS)
{
switch(eType)
switch (eType)
{
case kA3DTypeSurfNurbs:
iRet = stTraverseSrfNurbs(pSrf, srf);
@@ -121,11 +465,60 @@ A3DStatus traverseSurface(const A3DSurfBase* pSrf, _TiXmlElement* setting)
case kA3DTypeSurfPlane:
iRet = traverseSrfPlane(pSrf, srf);
break;
case kA3DTypeSurfBlend01:
iRet = A3D_NOT_IMPLEMENTED;
break;
case kA3DTypeSurfBlend02:
iRet = A3D_NOT_IMPLEMENTED;
break;
case kA3DTypeSurfBlend03:
iRet = A3D_NOT_IMPLEMENTED;
break;
case kA3DTypeSurfCone:
iRet = stTraverseSrfCone((const A3DSurfCone*)pSrf, srf);
break;
case kA3DTypeSurfCylinder:
iRet = stTraverseSrfCylinder((const A3DSurfCylinder*)pSrf, srf);
break;
case kA3DTypeSurfCylindrical:
iRet = stTraverseSrfCylindrical((const A3DSurfCylindrical*)pSrf, srf);
break;
case kA3DTypeSurfOffset:
iRet = stTraverseSrfOffset((const A3DSurfOffset*)pSrf, srf);
break;
case kA3DTypeSurfPipe:
iRet = stTraverseSrfPipe((const A3DSurfPipe*)pSrf, srf);
break;
case kA3DTypeSurfRuled:
iRet = stTraverseSrfRuled((const A3DSurfRuled*)pSrf, srf);
break;
case kA3DTypeSurfSphere:
iRet = stTraverseSrfSphere((const A3DSurfSphere*)pSrf, srf);
break;
case kA3DTypeSurfRevolution:
iRet = stTraverseSrfRevolution((const A3DSurfRevolution*)pSrf, srf);
break;
case kA3DTypeSurfExtrusion:
iRet = stTraverseSrfExtrusion((const A3DSurfExtrusion*)pSrf, srf);
break;
case kA3DTypeSurfFromCurves:
iRet = stTraverseSrfFromCurves((const A3DSurfFromCurves*)pSrf, srf);
break;
case kA3DTypeSurfTorus:
iRet = stTraverseSrfTorus((const A3DSurfTorus*)pSrf, srf);
break;
case kA3DTypeSurfTransform:
iRet = A3D_NOT_IMPLEMENTED;
break;
case kA3DTypeSurfBlend04:
iRet = A3D_NOT_IMPLEMENTED;
break;
default:
iRet = A3D_NOT_IMPLEMENTED;
break;
}
}
else if(iRet == A3D_NOT_IMPLEMENTED)
else if (iRet == A3D_NOT_IMPLEMENTED)
iRet = stTraverseSrfAsNurbs(pSrf, srf);
A3DDomainData oDomain;