173 lines
6.8 KiB
C++
173 lines
6.8 KiB
C++
/***********************************************************************************************************************
|
|
*
|
|
* Copyright (c) 2010 - 2025 by Tech Soft 3D, Inc.
|
|
* The information contained herein is confidential and proprietary to Tech Soft 3D, Inc., and considered a trade secret
|
|
* as defined under civil and criminal statutes. Tech Soft 3D shall pursue its civil and criminal remedies in the event
|
|
* of unauthorized use or misappropriation of its trade secrets. Use of this information by anyone other than authorized
|
|
* employees of Tech Soft 3D, Inc. is granted only under a written non-disclosure agreement, expressly prescribing the
|
|
* scope and manner of such use.
|
|
*
|
|
***********************************************************************************************************************/
|
|
|
|
#include <A3DSDKIncludes.h>
|
|
#include "PRC2XML.h"
|
|
|
|
//######################################################################################################################
|
|
static void sttraverseConstraintType(EA3DConstraintType eType, _TiXmlElement* xml)
|
|
{
|
|
switch (eType)
|
|
{
|
|
default:
|
|
case kA3DConstraintType_None: xml->SetAttribute("m_eType", "None"); break;
|
|
case kA3DConstraintType_Set: xml->SetAttribute("m_eType", "Set"); break;
|
|
case kA3DConstraintType_Fix: xml->SetAttribute("m_eType", "Fix"); break;
|
|
case kA3DConstraintType_FixTogether: xml->SetAttribute("m_eType", "FixTogether"); break;
|
|
case kA3DConstraintType_Contact: xml->SetAttribute("m_eType", "Contact"); break;
|
|
case kA3DConstraintType_Distance: xml->SetAttribute("m_eType", "Distance"); break;
|
|
case kA3DConstraintType_Angle: xml->SetAttribute("m_eType", "Angle"); break;
|
|
case kA3DConstraintType_Perpendicular: xml->SetAttribute("m_eType", "Perpendicular"); break;
|
|
case kA3DConstraintType_Parallel: xml->SetAttribute("m_eType", "Parallel"); break;
|
|
};
|
|
}
|
|
|
|
//######################################################################################################################
|
|
static void sttraverseConstraintLinkedItemType(EA3DConstraintLinkType eLinkType, _TiXmlElement* xml)
|
|
{
|
|
switch (eLinkType)
|
|
{
|
|
default:
|
|
case kA3DConstraintLink_None: xml->SetAttribute("m_eType", "None"); break;
|
|
case kA3DConstraintLink_Axis: xml->SetAttribute("m_eType", "Axis"); break;
|
|
case kA3DConstraintLink_Center: xml->SetAttribute("m_eType", "Center"); break;
|
|
};
|
|
}
|
|
|
|
//######################################################################################################################
|
|
static void sttraverseConstraintStatus(EA3DConstraintStatus eStatus, _TiXmlElement* xml)
|
|
{
|
|
switch (eStatus)
|
|
{
|
|
case kA3DConstraintStatus_OK: xml->SetAttribute("m_eStatus", "OK"); break;
|
|
case kA3DConstraintStatus_Disabled: xml->SetAttribute("m_eStatus", "Disable"); break;
|
|
default:
|
|
case kA3DConstraintStatus_Error: xml->SetAttribute("m_eStatus", "Error"); break;
|
|
};
|
|
}
|
|
|
|
//######################################################################################################################
|
|
static A3DVoid sttraverseSetNameAttribute(const A3DEntity* entity, _TiXmlElement* xmlnode)
|
|
{
|
|
A3DRootBaseData sData;
|
|
A3D_INITIALIZE_DATA(A3DRootBaseData, sData);
|
|
if (A3DRootBaseGet(entity, &sData) == A3D_SUCCESS)
|
|
{
|
|
if (sData.m_pcName && sData.m_pcName[0] != '\0')
|
|
xmlnode->SetAttribute("Name", sData.m_pcName);
|
|
if (sData.m_uiPersistentId)
|
|
xmlnode->SetAttribute("PersistentId", sData.m_uiPersistentId);
|
|
A3DRootBaseGet(NULL, &sData);
|
|
}
|
|
}
|
|
|
|
//######################################################################################################################
|
|
static A3DVoid sttraverseMiscConstraintLinkedItem(const A3DMiscConstraintLinkedItem* pConstraintLinkedItem, _TiXmlElement* xmlfather)
|
|
{
|
|
|
|
_TiXmlElement* xml = new _TiXmlElement("A3DMiscConstraintLinkedItem");
|
|
A3DMiscConstraintLinkedItemData sData;
|
|
A3D_INITIALIZE_DATA(A3DMiscConstraintLinkedItemData, sData);
|
|
|
|
traverseSource(pConstraintLinkedItem, xml);
|
|
|
|
A3DStatus iRet = A3DMiscConstraintLinkedItemGet(pConstraintLinkedItem, &sData);
|
|
if (iRet == A3D_SUCCESS)
|
|
{
|
|
traverseEntityReference((A3DMiscEntityReference*)pConstraintLinkedItem, xml);
|
|
sttraverseConstraintLinkedItemType(sData.m_eType, xml);
|
|
if (sData.m_pTargetProductOccurrence != NULL)
|
|
setAttributePtr("m_pTargetProductOccurrence", sData.m_pTargetProductOccurrence, xml);
|
|
A3DMiscConstraintLinkedItemGet(NULL, &sData);
|
|
}
|
|
else
|
|
xml->SetAttribute("error", A3DMiscGetErrorMsg(iRet));
|
|
|
|
xmlfather->LinkEndChild(xml);
|
|
}
|
|
|
|
const char* GetContactTypeEnumString(A3DUns32 uiContactType)
|
|
{
|
|
switch (uiContactType)
|
|
{
|
|
case 0: return "UNDEFINED";
|
|
case 1: return "SURFACE";
|
|
case 2: return "ANNULAR";
|
|
case 3: return "LINE";
|
|
case 4: return "POINT";
|
|
};
|
|
return "UNDEFINED";
|
|
}
|
|
|
|
const char* GetOrientationEnumString(A3DUns32 uiOrientation)
|
|
{
|
|
switch (uiOrientation)
|
|
{
|
|
case 0: return "UNDEFINED";
|
|
case 1: return "SAME";
|
|
case 2: return "OPPOSITE";
|
|
}
|
|
return "UNDEFINED";
|
|
}
|
|
|
|
//######################################################################################################################
|
|
static void sttraverseAdditionalData(A3DGenericTypeFieldData & sFielData, _TiXmlElement* a_pElement)
|
|
{
|
|
if (!sFielData.m_pacFieldName)
|
|
a_pElement->SetAttribute("FieldName", "Missing");
|
|
else
|
|
{
|
|
switch (sFielData.m_sData.m_eType)
|
|
{
|
|
case kA3DGenericTypeUns32:
|
|
if (!strcmp(sFielData.m_pacFieldName, "ContactType"))
|
|
a_pElement->SetAttribute(sFielData.m_pacFieldName, GetContactTypeEnumString(sFielData.m_sData.m_sValue.m_uiUns32));
|
|
else if (!strcmp(sFielData.m_pacFieldName, "Orientation"))
|
|
a_pElement->SetAttribute(sFielData.m_pacFieldName, GetOrientationEnumString(sFielData.m_sData.m_sValue.m_uiUns32));
|
|
else
|
|
a_pElement->SetAttribute(sFielData.m_pacFieldName, sFielData.m_sData.m_sValue.m_uiUns32);
|
|
break;
|
|
|
|
default: a_pElement->SetAttribute(sFielData.m_pacFieldName, "NotImplementedType"); break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//######################################################################################################################
|
|
A3DStatus traverseConstraint(const A3DAsmConstraint* pAsmConstraint, _TiXmlElement* xmlfather)
|
|
{
|
|
_TiXmlElement* xml = new _TiXmlElement("A3DAsmConstraint");
|
|
sttraverseSetNameAttribute(pAsmConstraint, xml);
|
|
|
|
A3DAsmConstraintData sData;
|
|
A3D_INITIALIZE_DATA(A3DAsmConstraintData, sData);
|
|
if (A3DAsmConstraintGet(pAsmConstraint, &sData) == A3D_SUCCESS)
|
|
{
|
|
sttraverseConstraintType(sData.m_eType, xml);
|
|
sttraverseConstraintStatus(sData.m_eStatus, xml);
|
|
|
|
A3DUns32 ui;
|
|
for (ui = 0; ui < sData.m_uiAdditionalDataArraySize; ++ui)
|
|
sttraverseAdditionalData(sData.m_pAdditionalDataArray[ui], xml);
|
|
|
|
for (ui = 0; ui < sData.m_uiSubConstraintsSize; ++ui)
|
|
traverseConstraint(sData.m_ppSubConstraints[ui], xml);
|
|
|
|
for (ui = 0; ui < sData.m_uiConstrainedElementsSize; ++ui)
|
|
sttraverseMiscConstraintLinkedItem(sData.m_ppConstrainedElements[ui], xml);
|
|
|
|
A3DAsmConstraintGet(NULL, &sData);
|
|
}
|
|
xmlfather->LinkEndChild(xml);
|
|
|
|
return A3D_SUCCESS;
|
|
}
|