941 lines
39 KiB
C++
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;
|
|
} |