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

941 lines
39 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 <sstream>
#include "PRC2XML.h"
//######################################################################################################################
static A3DStatus stTraverseAnnotationSet(const A3DMkpAnnotationSet* pAnnot, _TiXmlElement* setting)
{
A3DMkpAnnotationSetData sData;
A3D_INITIALIZE_DATA(A3DMkpAnnotationSetData, sData);
_TiXmlElement* annotset = new _TiXmlElement("A3DMkpAnnotationSetData");
setAttributePRC2XMLID(pAnnot, annotset);
traverseSource(pAnnot, annotset);
A3DStatus iRet = A3DMkpAnnotationSetGet(pAnnot, &sData);
if(iRet == A3D_SUCCESS)
{
for(A3DUns32 ui = 0; ui < sData.m_uiAnnotationsSize; ++ui)
traverseAnnotation(sData.m_ppAnnotations[ui], annotset);
A3DMkpAnnotationSetGet(NULL, &sData);
}
else
{
annotset->SetAttribute("error", A3DMiscGetErrorMsg(iRet));
}
setting->LinkEndChild(annotset);
return iRet;
}
//######################################################################################################################
static A3DStatus stTraverseAnnotationReference(const A3DMkpAnnotationReference* pAnnot, _TiXmlElement* setting)
{
A3DMkpAnnotationReferenceData sData;
A3D_INITIALIZE_DATA(A3DMkpAnnotationReferenceData, sData);
_TiXmlElement* ref = new _TiXmlElement("A3DMkpAnnotationReferenceData");
traverseSource(pAnnot, ref);
A3DStatus iRet = A3DMkpAnnotationReferenceGet(pAnnot, &sData);
if(iRet == A3D_SUCCESS)
{
for(A3DUns32 ui = 0; ui < sData.m_uiLinkedItemsSize; ++ui)
traverseLinkedItem(sData.m_ppLinkedItems[ui], ref); // => very very useful
A3DMkpAnnotationReferenceGet(NULL, &sData);
}
else
{
ref->SetAttribute("error", A3DMiscGetErrorMsg(iRet));
}
setting->LinkEndChild(ref);
return iRet;
}
//######################################################################################################################
static A3DStatus stTraverseAnnotationItem(const A3DMkpAnnotationItem* pAnnot, _TiXmlElement* setting)
{
A3DMkpAnnotationItemData sData;
A3D_INITIALIZE_DATA(A3DMkpAnnotationItemData, sData);
_TiXmlElement* annotitem = new _TiXmlElement("A3DMkpAnnotationItemData");
setAttributePRC2XMLID(pAnnot, annotitem);
traverseSource(pAnnot, annotitem);
A3DStatus iRet = A3DMkpAnnotationItemGet(pAnnot, &sData);
if(iRet == A3D_SUCCESS)
{
traverseMarkup(sData.m_pMarkup, annotitem);
A3DMkpAnnotationItemGet(NULL, &sData);
}
else
{
annotitem->SetAttribute("error", A3DMiscGetErrorMsg(iRet));
}
setting->LinkEndChild(annotitem);
return iRet;
}
//######################################################################################################################
A3DStatus traverseAnnotation(const A3DMkpAnnotationEntity* pAnnot, _TiXmlElement* setting)
{
A3DEEntityType eType;
A3DStatus iRet = A3DEntityGetType(pAnnot, &eType);
if(iRet == A3D_SUCCESS)
{
switch(eType)
{
case kA3DTypeMkpAnnotationSet:
return stTraverseAnnotationSet(pAnnot,setting);
case kA3DTypeMkpAnnotationReference:
return stTraverseAnnotationReference(pAnnot,setting);
case kA3DTypeMkpAnnotationItem:
return stTraverseAnnotationItem(pAnnot,setting);
default:
break;
}
}
return A3D_NOT_IMPLEMENTED;
}
//######################################################################################################################
A3DStatus traverseAmbientLight(const A3DGraphAmbientLight *pLight, _TiXmlElement* setting)
{
if (!pLight)
{
setting->SetAttribute("Light", "Bad cast");
return A3D_ERROR;
}
_TiXmlElement* light = new _TiXmlElement("A3DGraphAmbientLightData");
A3DStatus iRet;
A3DGraphAmbientLightData oLight;
A3D_INITIALIZE_DATA(A3DGraphAmbientLightData, oLight);
if ((iRet = A3DGraphAmbientLightGet(pLight, &oLight)) == A3D_SUCCESS)
{
light->SetAttribute("m_uiAmbientColorIndex", oLight.m_uiAmbientColorIndex); /*!< Ambient color index. */
light->SetAttribute("m_uiDiffuseColorIndex", oLight.m_uiDiffuseColorIndex); /*!< Diffuse color index. */
light->SetAttribute("m_uiSpecularColorIndex", oLight.m_uiSpecularColorIndex); /*!< Specular color index. */
A3DGraphAmbientLightGet(NULL, &oLight);
}
else
{
light->SetAttribute("error", A3DMiscGetErrorMsg(iRet));
}
setting->LinkEndChild(light);
return A3D_SUCCESS;
}
//######################################################################################################################
A3DStatus traversePointLight(const A3DGraphPointLight* pLight, _TiXmlElement* setting)
{
if (!pLight)
{
setting->SetAttribute("Light", "Bad cast");
return A3D_ERROR;
}
_TiXmlElement* light = new _TiXmlElement("A3DGraphPointLightData");
A3DStatus iRet;
A3DGraphPointLightData oLight;
A3D_INITIALIZE_DATA(A3DGraphPointLightData, oLight);
if ((iRet = A3DGraphPointLightGet(pLight, &oLight)) == A3D_SUCCESS)
{
light->SetAttribute("m_uiAmbientColorIndex", oLight.m_uiAmbientColorIndex); /*!< Ambient color index. */
light->SetAttribute("m_uiDiffuseColorIndex", oLight.m_uiDiffuseColorIndex); /*!< Diffuse color index. */
light->SetAttribute("m_uiSpecularColorIndex", oLight.m_uiSpecularColorIndex); /*!< Specular color index. */
traversePoint("m_sLocation", oLight.m_sLocation, light); /*!< Location. \version 2.1 */
light->SetDoubleAttribute("m_dConstantAttenuation", oLight.m_dConstantAttenuation); /*!< Constant attenuation. \version 2.1 */
light->SetDoubleAttribute("m_dLinearAttenuation", oLight.m_dLinearAttenuation); /*!< Linear attenuation. \version 2.1 */
light->SetDoubleAttribute("m_dQuadraticAttenuation", oLight.m_dQuadraticAttenuation); /*!< Quadratic attenuation. \version 2.1 */
A3DGraphPointLightGet(NULL, &oLight);
}
else
{
light->SetAttribute("error", A3DMiscGetErrorMsg(iRet));
}
setting->LinkEndChild(light);
return A3D_SUCCESS;
}
//######################################################################################################################
A3DStatus traverseSpotLight(const A3DGraphSpotLight* pLight, _TiXmlElement* setting)
{
if (!pLight)
{
setting->SetAttribute("Light", "Bad cast");
return A3D_ERROR;
}
_TiXmlElement* light = new _TiXmlElement("A3DGraphSpotLightData");
A3DStatus iRet;
A3DGraphSpotLightData oLight;
A3D_INITIALIZE_DATA(A3DGraphSpotLightData, oLight);
if ((iRet = A3DGraphSpotLightGet(pLight, &oLight)) == A3D_SUCCESS)
{
light->SetAttribute("m_uiAmbientColorIndex", oLight.m_uiAmbientColorIndex); /*!< Ambient color index. */
light->SetAttribute("m_uiDiffuseColorIndex", oLight.m_uiDiffuseColorIndex); /*!< Diffuse color index. */
light->SetAttribute("m_uiSpecularColorIndex", oLight.m_uiSpecularColorIndex); /*!< Specular color index. */
traversePoint("m_sDirection", oLight.m_sDirection, light); /*!< Direction. */
light->SetDoubleAttribute("m_dFallOffAngle", oLight.m_dFallOffAngle); /*!< Fall-off angle.*/
light->SetDoubleAttribute("m_dFallOffExponent", oLight.m_dFallOffExponent); /*!< Fall-off exponent. */
traversePoint("m_sLocation", oLight.m_sLocation, light); /*!< Location. \version 2.1 */
light->SetDoubleAttribute("m_dConstantAttenuation", oLight.m_dConstantAttenuation); /*!< Constant attenuation. \version 2.1 */
light->SetDoubleAttribute("m_dLinearAttenuation", oLight.m_dLinearAttenuation); /*!< Linear attenuation. \version 2.1 */
light->SetDoubleAttribute("m_dQuadraticAttenuation", oLight.m_dQuadraticAttenuation); /*!< Quadratic attenuation. \version 2.1 */
A3DGraphSpotLightGet(NULL, &oLight);
}
else
{
light->SetAttribute("error", A3DMiscGetErrorMsg(iRet));
}
setting->LinkEndChild(light);
return A3D_SUCCESS;
}
//######################################################################################################################
A3DStatus traverseDirectionalLight(const A3DGraphDirectionalLight* pLight, _TiXmlElement* setting)
{
if (!pLight)
{
setting->SetAttribute("Light", "Bad cast");
return A3D_ERROR;
}
_TiXmlElement* light = new _TiXmlElement("A3DGraphDirectionalLightData");
A3DStatus iRet;
A3DGraphDirectionalLightData oLight;
A3D_INITIALIZE_DATA(A3DGraphDirectionalLightData, oLight);
if ((iRet = A3DGraphDirectionalLightGet(pLight, &oLight)) == A3D_SUCCESS)
{
light->SetAttribute("m_uiAmbientColorIndex", oLight.m_uiAmbientColorIndex); /*!< Ambient color index. */
light->SetAttribute("m_uiDiffuseColorIndex", oLight.m_uiDiffuseColorIndex); /*!< Diffuse color index. */
light->SetAttribute("m_uiSpecularColorIndex", oLight.m_uiSpecularColorIndex); /*!< Specular color index. */
light->SetDoubleAttribute("m_dIntensity", oLight.m_dIntensity); /*!< Density. */
traversePoint("m_sDirection", oLight.m_sDirection, light); /*!< Direction. */
A3DGraphDirectionalLightGet(NULL, &oLight);
}
else
{
light->SetAttribute("error", A3DMiscGetErrorMsg(iRet));
}
setting->LinkEndChild(light);
return A3D_SUCCESS;
}
//######################################################################################################################
A3DStatus traverseLight(const A3DGraphLight* pLight, _TiXmlElement* setting)
{
if (!pLight)
{
setting->SetAttribute("Light", "empty");
return A3D_ERROR;
}
A3DEEntityType eType = kA3DTypeUnknown;
A3DEntityGetType(pLight, &eType);
switch (eType)
{
case kA3DTypeGraphAmbientLight:
traverseAmbientLight(pLight, setting);
break;
case kA3DTypeGraphPointLight:
traversePointLight(pLight, setting);
break;
case kA3DTypeGraphSpotLight:
traverseSpotLight(pLight, setting);
break;
case kA3DTypeGraphDirectionalLight:
traverseDirectionalLight(pLight, setting);
break;
default:
setting->SetAttribute("Light", "Unknown Type");
break;
}
return A3D_SUCCESS;
}
//######################################################################################################################
A3DStatus traverseCamera(const A3DGraphCamera* pCamera, _TiXmlElement* setting)
{
_TiXmlElement* camera = new _TiXmlElement("A3DGraphCameraData");
if (pCamera)
{
traverseSource(pCamera, camera);
A3DGraphCameraData oData;
A3D_INITIALIZE_DATA(A3DGraphCameraData, oData);
A3DStatus iRet = A3DGraphCameraGet(pCamera, &oData);
if (iRet == A3D_SUCCESS)
{
camera->SetAttribute("m_bOrthographic", oData.m_bOrthographic ? "true" : "false");
traversePoint("m_sLocation", oData.m_sLocation, camera);
traversePoint("m_sLookAt", oData.m_sLookAt, camera);
traversePoint("m_sUp", oData.m_sUp, camera);
camera->SetDoubleAttribute("m_dXFovy", oData.m_dXFovy);
camera->SetDoubleAttribute("m_dYFovy", oData.m_dYFovy);
camera->SetDoubleAttribute("m_dAspectRatio", oData.m_dAspectRatio);
camera->SetDoubleAttribute("m_dZNear", oData.m_dZNear);
camera->SetDoubleAttribute("m_dZFar", oData.m_dZFar);
camera->SetDoubleAttribute("m_dZoomFactor", oData.m_dZoomFactor);
}
else
{
camera->SetAttribute("error", A3DMiscGetErrorMsg(iRet));
}
A3DGraphCameraGet(NULL, &oData);
}
setting->LinkEndChild(camera);
return A3D_SUCCESS;
}
//######################################################################################################################
A3DStatus traverseGraphScene(const A3DGraphSceneDisplayParametersData& sData, _TiXmlElement* setting)
{
A3DStatus iRet = A3D_SUCCESS;
_TiXmlElement* graphscene = new _TiXmlElement("A3DGraphSceneDisplayParametersData");
graphscene->SetAttribute("NumberOfPlanes", sData.m_uiPlaneSize);
for (A3DUns32 ui = 0; ui < sData.m_uiPlaneSize; ui++)
traverseSrfPlane(sData.m_ppClippingPlanes[ui], graphscene);
graphscene->SetAttribute("m_bActive", sData.m_bIsActive);
traverseCamera(sData.m_pCamera, graphscene);
graphscene->SetAttribute("NumberOfLights", sData.m_uiLightSize);
for (A3DUns32 ui = 0; ui < sData.m_uiLightSize; ui++)
traverseLight(sData.m_ppLights[ui], graphscene);
graphscene->SetAttribute("m_bHasRotationCenter", sData.m_bHasRotationCenter ? "true" : "false");
if (sData.m_bHasRotationCenter)
traversePoint("m_sRotationCenter", sData.m_sRotationCenter, graphscene);
graphscene->SetAttribute("m_uiBackgroundStyleIndex", sData.m_uiBackgroundStyleIndex);
graphscene->SetAttribute("m_uiDefaultStyleIndex", sData.m_uiDefaultStyleIndex);
A3DUns32 i, iMax = sData.m_uiDefaultPerTypeIndexSize;
graphscene->SetAttribute("NumberOfDefaultStyleIndexesPerType", iMax);
for (i = 0; i < iMax; i++)
{
graphscene->SetAttribute("TypesOfDefaultStyleIndexes", sData.m_puiTypesOfDefaultStyleIndexes[i]);
graphscene->SetAttribute("DefaultStyleIndexesPerType", sData.m_puiDefaultStyleIndexesPerType[i]);
}
setting->LinkEndChild(graphscene);
return iRet;
}
//######################################################################################################################
A3DStatus traverseGraphScene(const A3DGraphSceneDisplayParameters * pGraphSceneParam, _TiXmlElement* setting)
{
A3DGraphSceneDisplayParametersData sData;
A3D_INITIALIZE_DATA(A3DGraphSceneDisplayParametersData, sData);
A3DStatus iRet = A3DGraphSceneDisplayParametersGet(pGraphSceneParam, &sData);
traverseGraphScene(sData, setting);
A3DGraphSceneDisplayParametersGet(NULL, &sData);
return iRet;
}
//######################################################################################################################
A3DStatus traverseDisplayFilter(A3DAsmFilter* pFilter, _TiXmlElement* setting)
{
A3DStatus iRet = A3D_SUCCESS;
_TiXmlElement* filter = new _TiXmlElement("A3DAsmFilterData");
traverseSource(pFilter, filter);
setting->LinkEndChild(filter);
if (!pFilter)
{
filter->SetAttribute("Filter", "empty");
return A3D_ERROR;
}
A3DAsmFilterData oData;
A3D_INITIALIZE_DATA(A3DAsmFilterData, oData);
CHECK_RET(A3DAsmFilterGet(pFilter, &oData));
filter->SetAttribute("m_bIsActive", oData.m_bIsActive);
A3DUns32 i, iMax = oData.m_sLayerFilterItem.m_uiSize;
if (iMax > 0)
{
_TiXmlElement* layerFilter = new _TiXmlElement("LayerFilters");
layerFilter->SetAttribute("m_sLayerFilterItem.m_bIsInclusive", oData.m_sLayerFilterItem.m_bIsInclusive);
std::ostringstream indexes;
indexes << '[' << oData.m_sLayerFilterItem.m_puiLayerIndexes[0];
A3DUns32 first = oData.m_sLayerFilterItem.m_puiLayerIndexes[0];
A3DUns32 last = oData.m_sLayerFilterItem.m_puiLayerIndexes[0];
for (i = 1; i < iMax; i++)
{
if (oData.m_sLayerFilterItem.m_puiLayerIndexes[i] == last + 1)
{
last ++;
continue;
}
if (first != last)
{
indexes << " - "<< last;
}
indexes << ", " << oData.m_sLayerFilterItem.m_puiLayerIndexes[i];
first = oData.m_sLayerFilterItem.m_puiLayerIndexes[i];
last = oData.m_sLayerFilterItem.m_puiLayerIndexes[i];
}
if (first != last)
{
indexes << " - " << last;
}
indexes << ']';
layerFilter->SetAttribute("m_sLayerFilterItem.m_puiLayerIndexes", indexes.str().c_str());
filter->LinkEndChild(layerFilter);
}
iMax = oData.m_sEntityFilterItem.m_uiSize;
if (iMax > 0)
{
_TiXmlElement* entityFilter = new _TiXmlElement("EntityFilters");
entityFilter->SetAttribute("m_sEntityFilterItem.m_bIsInclusive", oData.m_sEntityFilterItem.m_bIsInclusive);
for (i = 0; i < iMax; i++)
{
std::ostringstream title; title << "sEntityFilterItem" << "_" << i;
_TiXmlElement* entityFilterItem = new _TiXmlElement(title.str().c_str());
traverseEntityReference(oData.m_sEntityFilterItem.m_ppEntities[i], entityFilterItem);
entityFilter->LinkEndChild(entityFilterItem);
}
filter->LinkEndChild(entityFilter);
}
A3DAsmFilterGet(NULL, &oData);
return iRet;
}
//######################################################################################################################
A3DStatus traverseDisplayFilters(A3DUns32 uiSize,A3DAsmFilter** ppFilters , _TiXmlElement* setting)
{
for (A3DUns32 uk = 0; uk < uiSize; ++uk)
traverseDisplayFilter(ppFilters[uk], setting);
return A3D_SUCCESS;
}
//######################################################################################################################
A3DStatus traverseView(const A3DMkpView* pView, _TiXmlElement* setting)
{
A3DMkpViewData sData;
A3D_INITIALIZE_DATA(A3DMkpViewData, sData);
_TiXmlElement* view = new _TiXmlElement("A3DMkpViewData");
setAttributePRC2XMLID(pView, view);
traverseSource(pView, view);
A3DStatus iRet = A3DMkpViewGet(pView, &sData);
if(iRet == A3D_SUCCESS)
{
view->SetAttribute("m_bIsAnnotationView", sData.m_bIsAnnotationView);
view->SetAttribute("m_bIsDefaultView", sData.m_bIsDefaultView);
traversePRC2XMLIDs("m_ppAnnotations", sData.m_uiAnnotationsSize, (const A3DVoid**)sData.m_ppAnnotations, view);
traverseSrfPlane(sData.m_pPlane, view);
traverseGraphScene(sData.m_pSceneDisplayParameters, view);
_TiXmlElement* displayfilters = new _TiXmlElement("DisplayFilters");
traverseDisplayFilters(sData.m_uiDisplayFilterSize, sData.m_ppDisplayFilters, displayfilters);
view->LinkEndChild(displayfilters);
_TiXmlElement* markupref = new _TiXmlElement("LinkedItems");
for (A3DUns32 uk = 0; uk < sData.m_uiLinkedItemsSize; ++uk)
traverseLinkedItem(sData.m_ppLinkedItems[uk], markupref);
view->LinkEndChild(markupref);
A3DMkpViewGet(NULL, &sData);
}
setting->LinkEndChild(view);
return A3D_SUCCESS;
}
//######################################################################################################################
#define EnumValueToXmlAttribute(ENUM_VAL, ATT_TYPE, ATT_VALUE) \
case ENUM_VAL: \
setting->SetAttribute(ATT_TYPE, ATT_VALUE); \
break;
//######################################################################################################################
static void stTraverseMarkupTypeAndSubType(const A3DEMarkupType& eType, const A3DEMarkupSubType& eSubType, _TiXmlElement* setting)
{
switch(eType)
{
EnumValueToXmlAttribute(kA3DMarkupTypeUnknown, "m_eType", "Unknown");
EnumValueToXmlAttribute(kA3DMarkupTypeText, "m_eType", "Plain text");
EnumValueToXmlAttribute(kA3DMarkupTypeDimension, "m_eType", "Dimension");
EnumValueToXmlAttribute(kA3DMarkupTypeArrow, "m_eType", "Arrow");
EnumValueToXmlAttribute(kA3DMarkupTypeBalloon, "m_eType", "Balloon");
EnumValueToXmlAttribute(kA3DMarkupTypeCircleCenter, "m_eType", "Center of circle");
EnumValueToXmlAttribute(kA3DMarkupTypeCoordinate, "m_eType", "Coordinate");
EnumValueToXmlAttribute(kA3DMarkupTypeDatum, "m_eType", "Datum");
EnumValueToXmlAttribute(kA3DMarkupTypeFastener, "m_eType", "Fastener");
EnumValueToXmlAttribute(kA3DMarkupTypeGdt, "m_eType", "GDT");
EnumValueToXmlAttribute(kA3DMarkupTypeLocator, "m_eType", "Locator");
EnumValueToXmlAttribute(kA3DMarkupTypeMeasurementPoint, "m_eType", "Point");
EnumValueToXmlAttribute(kA3DMarkupTypeRoughness, "m_eType", "Roughness");
EnumValueToXmlAttribute(kA3DMarkupTypeWelding, "m_eType", "Welding");
EnumValueToXmlAttribute(kA3DMarkupTypeTable, "m_eType", "Table");
EnumValueToXmlAttribute(kA3DMarkupTypeOther, "m_eType", "Other");
default:
setting->SetAttribute("m_eType", "Unexpected");
break;
}
if(eType == kA3DMarkupTypeDatum)
{
switch(eSubType)
{
EnumValueToXmlAttribute(kA3DMarkupSubTypeDatumIdent, "m_eSubType", "Datum ident");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDatumTarget, "m_eSubType", "Datum target");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDatumEnumMax, "m_eSubType", "Datum max value. \version 2.2");
default:
setting->SetAttribute("Datum_m_eSubType", "Unexpected");
break;
}
}
else if(eType == kA3DMarkupTypeDimension)
{
switch(eSubType)
{
EnumValueToXmlAttribute(kA3DMarkupSubTypeDimensionDistance, "m_eSubType", "Dimension distance");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDimensionDistanceOffset, "m_eSubType", "Dimension distance offset");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDimensionDistanceCumulate, "m_eSubType", "Dimension distance cumulate");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDimensionChamfer, "m_eSubType", "Dimension chamfer");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDimensionSlope, "m_eSubType", "Dimension slope");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDimensionOrdinate, "m_eSubType", "Dimension ordinate");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDimensionRadius, "m_eSubType", "Dimension radius");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDimensionRadiusTangent, "m_eSubType", "Dimension radius tangent");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDimensionRadiusCylinder, "m_eSubType", "Dimension radius cylinder");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDimensionRadiusEdge, "m_eSubType", "Dimension radius edge");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDimensionDiameter, "m_eSubType", "Dimension diameter");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDimensionDiameterTangent, "m_eSubType", "Dimension diameter tangent");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDimensionDiameterCylinder, "m_eSubType", "Dimension diameter cylinder");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDimensionDiameterEdge, "m_eSubType", "Dimension diameter edge");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDimensionDiameterCone, "m_eSubType", "Dimension diameter cone");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDimensionLength, "m_eSubType", "Dimension length");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDimensionLengthCurvilinear, "m_eSubType", "Dimension length curvilinear");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDimensionLengthCircular, "m_eSubType", "Dimension length circular");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDimensionAngle, "m_eSubType", "Dimension angle");
EnumValueToXmlAttribute(kA3DMarkupSubTypeDimensionEnumMax, "m_eSubType", "Dimension max value. \version 2.2");
default:
setting->SetAttribute("Dimension_m_eSubType", "Unexpected");
break;
}
}
else if(eType == kA3DMarkupTypeGdt)
{
switch(eSubType)
{
EnumValueToXmlAttribute(kA3DMarkupSubTypeGdtFcf, "m_eSubType", "GDT feature control frame subtype");
EnumValueToXmlAttribute(kA3DMarkupSubTypeGdtEnumMax, "m_eSubType", "GDT max value. \version 2.2");
default:
setting->SetAttribute("Gdt_m_eSubType", "Unexpected");
break;
}
}
else if(eType == kA3DMarkupTypeWelding)
{
switch(eSubType)
{
EnumValueToXmlAttribute(kA3DMarkupSubTypeWeldingLine, "m_eSubType", "Line welding subtype");
EnumValueToXmlAttribute(kA3DMarkupSubTypeWeldingSpot, "m_eSubType", "Spot welding subtype");
EnumValueToXmlAttribute(kA3DMarkupSubTypeWeldingEnumMax, "m_eSubType", "welding max value. \version 2.2");
default:
setting->SetAttribute("welding_m_eSubType", "Unexpected");
break;
}
}
else if(eType == kA3DMarkupTypeOther)
{
switch(eSubType)
{
EnumValueToXmlAttribute(kA3DMarkupSubTypeOtherSymbolUser, "m_eSubType", "SymbolUser other subtype");
EnumValueToXmlAttribute(kA3DMarkupSubTypeOtherSymbolUtility, "m_eSubType", "SymbolUtility other subtype");
EnumValueToXmlAttribute(kA3DMarkupSubTypeOtherSymbolCustom, "m_eSubType", "SymbolCustom other subtype");
EnumValueToXmlAttribute(kA3DMarkupSubTypeOtherGeometricReference, "m_eSubType", "GeometricReference other subtype");
EnumValueToXmlAttribute(kA3DMarkupSubTypeOtherRegion, "m_eSubType", "Region");
default:
setting->SetAttribute("other_symbol_m_eSubType", "Unexpected");
break;
}
}
}
//######################################################################################################################
A3DStatus traverseMarkup(const A3DMkpMarkup* pMarkup, _TiXmlElement* setting)
{
A3DMkpMarkupData sData;
A3D_INITIALIZE_DATA(A3DMkpMarkupData, sData);
_TiXmlElement* markup = new _TiXmlElement("A3DMkpMarkupData");
setAttributePRC2XMLID(pMarkup, markup);
traverseSource(pMarkup, markup);
A3DStatus iRet = A3DMkpMarkupGet(pMarkup, &sData);
A3DRootBaseData sBaseData;
A3D_INITIALIZE_DATA(A3DRootBaseData, sBaseData);
iRet = A3DRootBaseGet(pMarkup, &sBaseData);
iRet = A3DRootBaseGet(NULL, &sBaseData);
if(iRet == A3D_SUCCESS)
{
stTraverseMarkupTypeAndSubType(sData.m_eType, sData.m_eSubType, markup);
traverseMarkupDefinition(pMarkup, markup);
_TiXmlElement* leaders = new _TiXmlElement("Leaders");
leaders->SetAttribute("size", (int)sData.m_uiLeadersSize);
for(A3DUns32 ui = 0; ui < sData.m_uiLeadersSize; ++ui)
traverseLeader(sData.m_ppLeaders[ui], leaders);
markup->LinkEndChild(leaders);
_TiXmlElement* linkedItems = new _TiXmlElement("LinkedItems");
linkedItems->SetAttribute("size", (int)sData.m_uiLinkedItemsSize);
for(A3DUns32 uj = 0; uj < sData.m_uiLinkedItemsSize; ++uj)
traverseLinkedItem(sData.m_ppLinkedItems[uj], linkedItems);
markup->LinkEndChild(linkedItems);
// parse the references
A3DUns32 uiLinkedItemsSize = 0;
A3DMiscMarkupLinkedItem** ppLinkedItems = NULL;
iRet = A3DMkpLinkForMarkupReferenceGet(pMarkup, &uiLinkedItemsSize, &ppLinkedItems);
if (iRet == A3D_SUCCESS && ppLinkedItems)
{
_TiXmlElement* markupref = new _TiXmlElement("LinksForMarkupReference");
markupref->SetAttribute("size", (int) uiLinkedItemsSize);
for (A3DUns32 uk = 0; uk < uiLinkedItemsSize; ++uk)
traverseLinkedItem(ppLinkedItems[uk], markupref);
markup->LinkEndChild(markupref);
A3DMkpLinkForMarkupReferenceGet(NULL, &uiLinkedItemsSize, &ppLinkedItems);
}
// parse the additional references
A3DUns32 uiAdditionalLinkedItemsSize = 0;
A3DMiscMarkupLinkedItem** ppAdditionnalLinkedItems = NULL;
iRet = A3DMkpLinkForAdditionalMarkupReferenceGet(pMarkup, &uiAdditionalLinkedItemsSize, &ppAdditionnalLinkedItems);
if (iRet == A3D_SUCCESS)
{
if (ppAdditionnalLinkedItems)
{
_TiXmlElement* additionalMarkupref = new _TiXmlElement("LinksForAdditionalMarkupReference");
linkedItems->SetAttribute("size", (int)uiAdditionalLinkedItemsSize);
for (A3DUns32 uk = 0; uk < uiAdditionalLinkedItemsSize; ++uk)
traverseLinkedItem(ppAdditionnalLinkedItems[uk], additionalMarkupref);
markup->LinkEndChild(additionalMarkupref);
}
A3DMkpLinkForAdditionalMarkupReferenceGet(NULL, &uiAdditionalLinkedItemsSize, &ppAdditionnalLinkedItems);
}
traverseTessBase(sData.m_pTessellation, markup);
A3DMkpMarkupGet(NULL, &sData);
}
else
markup->SetAttribute("error", A3DMiscGetErrorMsg(iRet));
setting->LinkEndChild(markup);
return iRet;
}
//######################################################################################################################
void setLeaderSymbolType(_TiXmlElement* setting, const char* name, const A3DMDLeaderSymbolType value)
{
switch(value)
{
EnumValueToXmlAttribute(KA3DMDLeaderSymbolNotUsed, name, "Not used");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolCross, name, "Cross");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolPlus, name, "Plus");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolConcentric, name, "Concentric");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolCoincident, name, "Coincident");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolFullCircle, name, "FullCircle");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolFullSquare, name, "FullSquare");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolStar, name, "Star");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolDot, name, "Dot");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolSmallDot, name, "SmallDot");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolMisc1, name, "Misc1");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolMisc2, name, "Misc2");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolFullCircle2, name, "FullCircle2");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolFullSquare2, name, "FullSquare2");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolOpenArrow, name, "OpenArrow");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolUnfilledArrow, name, "UnfilledArrow");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolBlankedArrow, name, "BlankedArrow");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolFilledArrow, name, "FilledArrow");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolUnfilledCircle, name, "UnfilledCircle");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolBlankedCircle, name, "BlankedCircle");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolFilledCircle, name, "FilledCircle");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolCrossedCircle, name, "CrossedCircle");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolBlankedSquare, name, "BlankedSquare");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolFilledSquare, name, "FilledSquare");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolBlankedTriangle, name, "BlankedTriangle");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolFilledTriangle, name, "FilledTriangle");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolManipulatorSquare, name, "ManipulatorSquare");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolMamipulatorDiamond, name, "MamipulatorDiamond");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolManipulatorCircle, name, "ManipulatorCircle");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolManipulatorTriangle, name, "ManipulatorTriangle");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolDoubleOpenArrow, name, "DoubleOpenArrow");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolWave, name, "Wave");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolSegment, name, "Segment");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolDoubleFilledArrow, name, "DoubleFilledArrow");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolDoubleClosedArrow, name, "DoubleClosedArrow");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolHalfOpenArrowUp, name, "HalfOpenArrowUp");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolHalfOpenArrowDown, name, "HalfOpenArrowDown");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolHalfFilledArrowUp, name, "HalfFilledArrowUp");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolHalfFilledArrowDown, name, "HalfFilledArrowDown");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolSlash, name, "Slash");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolDoubleBlankedArrow, name, "DoubleBlankedArrow");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolIntegral, name, "Integral");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolZoneGlobalAllAround, name, "ZoneGlobalAllAround");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolZonePartialAllAround, name, "ZonePartialAllAround");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolZoneGlobalAllAboutWithHorizontalAxisIndicator, name, "ZoneGlobalAllAboutWithHorizontalAxisIndicator");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolZoneGlobalAllAboutWithVerticalAxisIndicator, name, "ZoneGlobalAllAboutWithVerticalAxisIndicator");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolZonePartialAllAboutWithHorizontalAxisIndicator, name, "ZonePartialAllAboutWithHorizontalAxisIndicator");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolZonePartialAllAboutWithVerticalAxisIndicator, name, "ZonePartialAllAboutWithVerticalAxisIndicator");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolZoneGlobalAllOver, name, "ZoneGlobalAllOver");
EnumValueToXmlAttribute(KA3DMDLeaderSymbolZonePartialAllOver, name, "ZonePartialAllOver");
default:
setting->SetAttribute(name, "Unexpected");
break;
}
}
//######################################################################################################################
A3DStatus stTraverseLeaderSymbol(const A3DMDLeaderSymbol* pSymbol, _TiXmlElement* setting)
{
A3DMDLeaderSymbolData sData;
A3D_INITIALIZE_DATA(A3DMDLeaderSymbolData, sData);
_TiXmlElement* symbol = new _TiXmlElement("A3DMDLeaderSymbolData");
A3DStatus iRet = A3DMDLeaderSymbolGet(pSymbol, &sData);
if(iRet == A3D_SUCCESS)
{
symbol->SetDoubleAttribute("m_dAdditionalParameter", sData.m_dAdditionalParameter);
symbol->SetDoubleAttribute("m_dLength" , sData.m_dLength);
setLeaderSymbolType(symbol, "m_eHeadSymbol", sData.m_eHeadSymbol);
A3DMDLeaderSymbolGet(NULL, &sData);
}
setting->LinkEndChild(symbol);
return iRet;
}
//######################################################################################################################
A3DStatus stTraverseLeaderStub(const A3DMDMarkupLeaderStub* pStub, _TiXmlElement* setting)
{
A3DMDMarkupLeaderStubData sData;
A3D_INITIALIZE_DATA(A3DMDMarkupLeaderStubData, sData);
_TiXmlElement* stub = new _TiXmlElement("A3DMDMarkupLeaderStubData");
A3DStatus iRet = A3DMDMarkupLeaderStubGet(pStub, &sData);
if(iRet == A3D_SUCCESS)
{
traverseDoubles("m_pdValues" , sData.m_uiValuesAndAnchorTypesSize, sData.m_pdValues , stub);
traverseUInts ("m_piAnchorTypes", sData.m_uiValuesAndAnchorTypesSize, sData.m_piAnchorTypes, stub);
A3DMDMarkupLeaderStubGet(NULL, &sData);
}
setting->LinkEndChild(stub);
return iRet;
}
//######################################################################################################################
A3DStatus stTraverseMDPosition2D(const A3DMDPosition2D* pPos, _TiXmlElement* setting)
{
A3DMDPosition2DData sData;
A3D_INITIALIZE_DATA(A3DMDPosition2DData, sData);
_TiXmlElement* pos = new _TiXmlElement("A3DMDPosition2DData");
A3DStatus iRet = A3DMDPosition2DGet(pPos, &sData);
if(iRet == A3D_SUCCESS)
{
pos->SetDoubleAttribute("m_dOffset", sData.m_dOffset);
traverseSrfPlane(sData.m_pPlane, pos);
traversePoint2d("m_sPosition", sData.m_sPosition, pos);
A3DMDPosition2DGet(NULL, &sData);
}
setting->LinkEndChild(pos);
return iRet;
}
//######################################################################################################################
A3DStatus stTraverseMDPosition3D(const A3DMDPosition3D* pPos, _TiXmlElement* setting)
{
A3DMDPosition3DData sData;
A3D_INITIALIZE_DATA(A3DMDPosition3DData, sData);
_TiXmlElement* pos = new _TiXmlElement("A3DMDPosition3DData");
A3DStatus iRet = A3DMDPosition3DGet(pPos, &sData);
if(iRet == A3D_SUCCESS)
{
traversePoint("m_sPosition", sData.m_sPosition, pos);
A3DMDPosition3DGet(NULL, &sData);
}
setting->LinkEndChild(pos);
return iRet;
}
//######################################################################################################################
A3DStatus stTraverseMDPositionReference(const A3DMDPositionReference* pPos, _TiXmlElement* setting)
{
A3DMDPositionReferenceData sData;
A3D_INITIALIZE_DATA(A3DMDPositionReferenceData, sData);
_TiXmlElement* pos = new _TiXmlElement("A3DMDPositionReferenceData");
A3DStatus iRet = A3DMDPositionReferenceGet(pPos, &sData);
if(iRet == A3D_SUCCESS)
{
// traverseLinkedItem(sData.m_psLinkedItem, pos); // avoid recursive visitation...
pos->SetAttribute("m_eAttachType", sData.m_eAttachType);
traversePoint2d("m_sOffsetToReference", sData.m_sOffsetToReference, pos);
A3DMDPositionReferenceGet(NULL, &sData);
}
setting->LinkEndChild(pos);
return iRet;
}
//######################################################################################################################
A3DStatus stTraverseMDPosition(const A3DMDPosition* pPos, _TiXmlElement* setting)
{
A3DEEntityType eType = kA3DTypeUnknown;
A3DStatus iRet = A3DEntityGetType(pPos, &eType);
if(iRet == A3D_SUCCESS)
{
switch(eType)
{
case kA3DTypeMDPosition2D:
iRet = stTraverseMDPosition2D(pPos, setting);
break;
case kA3DTypeMDPosition3D:
iRet = stTraverseMDPosition3D(pPos, setting);
break;
case kA3DTypeMDPositionReference:
iRet = stTraverseMDPositionReference(pPos, setting);
break;
default:
iRet = A3D_INVALID_ENTITY_TYPE;
break;
}
}
return iRet;
}
//######################################################################################################################
A3DStatus stTraverseLeaderDefinition(const A3DMDLeaderDefinition* pLeaderDef, _TiXmlElement* setting)
{
A3DMDLeaderDefinitionData sData;
A3D_INITIALIZE_DATA(A3DMDLeaderDefinitionData, sData);
_TiXmlElement* definition = new _TiXmlElement("A3DMDLeaderDefinitionData");
A3DStatus iRet = A3DMDLeaderDefinitionGet(pLeaderDef, &sData);
if(iRet == A3D_SUCCESS)
{
setLeaderSymbolType(definition, "m_eTailSymbol", sData.m_eTailSymbol);
traverseDoubles("m_pdGapList", sData.m_uiNbGapsElements, sData.m_pdGapList, definition);
if(sData.m_pHeadSymbol != NULL)
stTraverseLeaderSymbol(sData.m_pHeadSymbol, definition);
_TiXmlElement* positions = new _TiXmlElement("PathLeaderPositions");
positions->SetAttribute("size", (int)sData.m_uiNumberOfPathLeaderPositions);
for(A3DUns32 ui = 0; ui < sData.m_uiNumberOfPathLeaderPositions; ++ui)
stTraverseMDPosition(sData.m_ppsPathLeaderPositions[ui], positions);
definition->LinkEndChild(positions);
if(sData.m_pStub != NULL)
stTraverseLeaderStub(sData.m_pStub, definition);
definition->SetAttribute("m_uAnchorFrame", sData.m_uAnchorFrame);
definition->SetAttribute("m_uAnchorPoint", sData.m_uAnchorPoint);
if(sData.m_pNextLeader != NULL)
stTraverseLeaderDefinition(sData.m_pNextLeader, definition);
A3DMDLeaderDefinitionGet(NULL, &sData);
}
setting->LinkEndChild(definition);
return iRet;
}
//######################################################################################################################
A3DStatus traverseLeader(const A3DMkpLeader* pLeader, _TiXmlElement* setting)
{
A3DMkpLeaderData sData;
A3D_INITIALIZE_DATA(A3DMkpLeaderData, sData);
_TiXmlElement* leader = new _TiXmlElement("A3DMkpLeaderData");
traverseSource(pLeader, leader);
A3DStatus iRet = A3DMkpLeaderGet(pLeader, &sData);
if(iRet == A3D_SUCCESS)
{
if(sData.m_pLinkedItem)
{
traverseLinkedItem(sData.m_pLinkedItem, leader);
}
if (sData.m_pTessellation)
{
traverseTessBase(sData.m_pTessellation, leader);
}
stTraverseLeaderDefinition(pLeader, leader);
A3DMkpLeaderGet(NULL, &sData);
}
else
leader->SetAttribute("error", A3DMiscGetErrorMsg(iRet));
setting->LinkEndChild(leader);
return iRet;
}
//######################################################################################################################
A3DStatus traverseLinkedItem(const A3DMiscMarkupLinkedItem* pMkpLinkedItem, _TiXmlElement* setting)
{
A3DMiscMarkupLinkedItemData sData;
A3D_INITIALIZE_DATA(A3DMiscMarkupLinkedItemData, sData);
_TiXmlElement* mkplinkeditem = new _TiXmlElement("A3DMiscMarkupLinkedItemData");
traverseSource(pMkpLinkedItem, mkplinkeditem);
A3DStatus iRet = A3DMiscMarkupLinkedItemGet(pMkpLinkedItem, &sData);
if(iRet == A3D_SUCCESS && pMkpLinkedItem)
{
traverseEntityReference((A3DMiscEntityReference*)pMkpLinkedItem, mkplinkeditem);
mkplinkeditem->SetAttribute("m_bMarkupShowControl", sData.m_bMarkupShowControl);
mkplinkeditem->SetAttribute("m_bMarkupDeleteControl", sData.m_bMarkupDeleteControl);
mkplinkeditem->SetAttribute("m_bLeaderShowControl", sData.m_bLeaderShowControl);
mkplinkeditem->SetAttribute("m_bLeaderDeleteControl", sData.m_bLeaderDeleteControl);
if(sData.m_pTargetProductOccurrence != NULL)
setAttributePtr("m_pTargetProductOccurrence", sData.m_pTargetProductOccurrence, mkplinkeditem);
A3DMiscMarkupLinkedItemGet(NULL, &sData);
}
else
mkplinkeditem->SetAttribute("error", pMkpLinkedItem ? A3DMiscGetErrorMsg(iRet) : A3DMiscGetErrorMsg(A3D_INVALID_ENTITY_NULL));
setting->LinkEndChild(mkplinkeditem);
return iRet;
}