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

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;
}