/*********************************************************************************************************************** * * 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 #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; }