From 687f7c54dae2fd8e2dcce85f2eafbdc30c2f5527 Mon Sep 17 00:00:00 2001 From: ninja <914440382@qq.com> Date: Mon, 15 Dec 2025 23:39:49 +0800 Subject: [PATCH] support more types surface --- .../PRC2XML/PRC2XMLGeometrySrf.cpp | 429 +++++++++++++++++- 1 file changed, 411 insertions(+), 18 deletions(-) diff --git a/exchange/exchangesource/PRC2XML/PRC2XMLGeometrySrf.cpp b/exchange/exchangesource/PRC2XML/PRC2XMLGeometrySrf.cpp index 98871c8..7e8e706 100644 --- a/exchange/exchangesource/PRC2XML/PRC2XMLGeometrySrf.cpp +++ b/exchange/exchangesource/PRC2XML/PRC2XMLGeometrySrf.cpp @@ -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); + + // 基准曲线(若存在) + if (sData.m_pCurve) + traverseCurve(sData.m_pCurve, srf); + + // 轴心与方向作为点输出 + 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;