/////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2002-2025, Open Design Alliance (the "Alliance"). // All rights reserved. // // This software and its documentation and related materials are owned by // the Alliance. The software may only be incorporated into application // programs owned by members of the Alliance, subject to a signed // Membership Agreement and Supplemental Software License Agreement with the // Alliance. The structure and organization of this software are the valuable // trade secrets of the Alliance and its suppliers. The software is also // protected by copyright law and international treaty provisions. Application // programs incorporating this software must include the following statement // with their copyright notices: // // This application incorporates Open Design Alliance software pursuant to a license // agreement with Open Design Alliance. // Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance. // All rights reserved. // // By use of this software, its documentation or related materials, you // acknowledge and accept the above terms. /////////////////////////////////////////////////////////////////////////////// #include "OdaCommon.h" #include "DbAssocPersSubentId.h" #include "OdDbAssocPersSubentIdPE.h" #include "DbFiler.h" #include "RxObjectImpl.h" #include "DbEntity.h" ODRX_NO_CONS_DEFINE_MEMBERS_ALTNAME(OdDbAssocPersSubentId, OdRxObject, L"AcDbAssocPersSubentId"); ODRX_CONS_DEFINE_MEMBERS_ALTNAME(OdDbAssocSingleEdgePersSubentId, OdDbAssocPersSubentId, L"AcDbAssocSingleEdgePersSubentId", RXIMPL_CONSTR); ODRX_CONS_DEFINE_MEMBERS_ALTNAME(OdDbAssocSimplePersSubentId, OdDbAssocPersSubentId, L"AcDbAssocSimplePersSubentId", RXIMPL_CONSTR); ODRX_CONS_DEFINE_MEMBERS_ALTNAME(OdDbAssocIndexPersSubentId, OdDbAssocPersSubentId, L"AcDbAssocIndexPersSubentId", RXIMPL_CONSTR); ODRX_CONS_DEFINE_MEMBERS_ALTNAME(OdDbAssocAsmBasedEntityPersSubentId, OdDbAssocPersSubentId, L"AcDbAssocAsmBasedEntityPersSubentId", RXIMPL_CONSTR); OdResult OdDbAssocPersSubentId::getTransientSubentIds(const OdDbEntity* pEntity, OdArray& subents) const { if (!pEntity) return eNullObjectPointer; OdDbAssocPersSubentIdPEPtr pPE = pEntity->isA()->getX( OdDbAssocPersSubentIdPE::desc() ); if (!pPE.isNull()) return pPE->getTransientSubentIds(pEntity, this, subents); ODA_FAIL(); //throw OdError(eNotImplementedYet); return eNotImplementedYet; } int OdDbAssocPersSubentId::transientSubentCount(const OdDbEntity* pEntity) const { OdArray arrSubEnts; if (getTransientSubentIds(pEntity, arrSubEnts) == eOk) return arrSubEnts.size(); return 0; } OdResult OdDbAssocPersSubentId::mirror(const OdDbEntity* /*pMirroredEntity*/) { /* OdDbAssocPersSubentIdPEPtr pPE = pMirrorredEntity; if (!pPE.isNull()) return pPE->mirrorPersSubent(pMirrorredEntity, *this); */ ODA_FAIL(); //throw OdError(eNotImplementedYet); return eNotImplementedYet; } OdResult OdDbAssocPersSubentId::createObjectAndDwgInFields(OdDbDwgFiler* pFiler, OdDbAssocPersSubentIdPtr& pCreatedPersSubentId) { try { bool bClassByName = true; if (pFiler->dwgVersion() > OdDb::vAC24) { bClassByName = pFiler->rdBool(); } if (bClassByName) { pCreatedPersSubentId = ::odrxCreateObject(pFiler->rdString()); if (pCreatedPersSubentId.isNull()) { ODA_FAIL_ONCE(); // TODO return eMakeMeProxy; } } else { OdInt32 index = pFiler->rdInt32(); switch (index) { case 1: pCreatedPersSubentId = OdDbAssocSingleEdgePersSubentId::createObject(); break; case 2: pCreatedPersSubentId = OdDbAssocSimplePersSubentId::createObject(); break; case 3: pCreatedPersSubentId = OdDbAssocEdgePersSubentId::createObject(); break; case 4: pCreatedPersSubentId = OdDbAssocIndexPersSubentId::createObject(); break; case 5: pCreatedPersSubentId = OdDbAssocAsmBasedEntityPersSubentId::createObject(); break; // case 6: pCreatedPersSubentId = OdDbAssocExternalIndexPersSubentId::createObject(); break; // case 7: pCreatedPersSubentId = OdDbAssocViewRepProvisionalPersSubentId::createObject(); break; // case 8: pCreatedPersSubentId = OdDbAssocObjectAndIndexPersSubentId::createObject(); break; // case 9: pCreatedPersSubentId = OdDbAssocInventorSilhouettePersSubentId::createObject(); break; } } return pCreatedPersSubentId->dwgInFields(pFiler); } catch(OdError_DwgObjectImproperlyRead&) { return eMakeMeProxy; } } OdResult OdDbAssocPersSubentId::createObjectAndDxfInFields(OdDbDxfFiler* pFiler, OdDbAssocPersSubentIdPtr& pCreatedPersSubentId) { int nNextCode = pFiler->nextItem(); if (nNextCode != 1) return eInvalidGroupCode; OdString strClass = pFiler->rdString(); pCreatedPersSubentId = ::odrxCreateObject(strClass); if (pCreatedPersSubentId.isNull()) { ODA_FAIL_ONCE(); return eMakeMeProxy; } return pCreatedPersSubentId->dxfInFields(pFiler); } void OdDbAssocPersSubentId::dwgOutFields(OdDbDwgFiler* pFiler) const { if (pFiler->dwgVersion() > OdDb::vAC24) { pFiler->wrBool(false); pFiler->wrInt32(classCode()); } else { pFiler->wrString(isA()->name()); } } OdResult OdDbAssocPersSubentId::dwgInFields(OdDbDwgFiler* /*pFiler*/) { //in accordance with ObjectArx this function does nothing return eOk; } void OdDbAssocPersSubentId::dxfOutFields(OdDbDxfFiler* pFiler) const { pFiler->wrString(1, isA()->name()); } OdResult OdDbAssocPersSubentId::dxfInFields(OdDbDxfFiler* /*pFiler*/) { //in accordance with ObjectArx this function does nothing return eOk; } //---------------------------------------------------------------------------- OdDbAssocSingleEdgePersSubentId::OdDbAssocSingleEdgePersSubentId():OdDbAssocPersSubentId() { } //---------------------------------------------------------------------------- OdDbAssocSimplePersSubentId::OdDbAssocSimplePersSubentId() : OdDbAssocPersSubentId() { } void OdDbAssocSimplePersSubentId::init(const OdDbSubentId& subentId) { m_SubentId.setType(subentId.type()); m_SubentId.setIndex(subentId.index()); } void OdDbAssocSimplePersSubentId::dwgOutFields(OdDbDwgFiler* pFiler) const { OdDbAssocPersSubentId::dwgOutFields(pFiler); OdUInt16 ver = (pFiler->dwgVersion() > OdDb::vAC24) ? 1 : 0; pFiler->wrInt16((OdInt16) ver); pFiler->wrInt32(m_SubentId.type()); pFiler->wrInt32((OdInt32) m_SubentId.index()); // TODO warning #if 0 switch (ver) { #if 0 // OdDbSubentId must know ClassName of object for writing case 1: { pFiler->wrBool(true); pFiler->wrString(m_SubentId); } #endif default: #endif pFiler->wrBool(false); #if 0 break; } #endif } OdResult OdDbAssocSimplePersSubentId::dwgInFields(OdDbDwgFiler* pFiler) { OdDbAssocPersSubentId::dwgInFields(pFiler); OdUInt16 ver = pFiler->rdInt16(); if (ver > 1) { return eMakeMeProxy; } m_SubentId.setType((OdDb::SubentType)pFiler->rdInt32()); m_SubentId.setIndex(pFiler->rdInt32()); if (ver) // > AC24 { if (pFiler->rdBool()) { const OdString sClassName = pFiler->rdString(); } } return eOk; } void OdDbAssocSimplePersSubentId::dxfOutFields(OdDbDxfFiler* pFiler) const { OdDbAssocPersSubentId::dxfOutFields(pFiler); OdInt32 ver = pFiler->dwgVersion() > OdDb::vAC24 ? 1 : 0; pFiler->wrInt32(90, ver); pFiler->wrInt32(90, m_SubentId.type()); pFiler->wrInt32(90, (OdInt32) m_SubentId.index()); // TODO warning #if 0 switch (ver) { #if 0 // OdDbSubentId must know ClassName of object for writing case 1: { pFiler->wrBool(290, true); pFiler->wrString(1, m_SubentId); } #endif default: #endif pFiler->wrBool(290, false); #if 0 break; } #endif } OdResult OdDbAssocSimplePersSubentId::dxfInFields(OdDbDxfFiler* pFiler) { OdDbAssocPersSubentId::dxfInFields(pFiler); NEXT_CODE(90) OdUInt32 ver = pFiler->rdInt32(); if (ver > 1) { ODA_FAIL_ONCE(); return eMakeMeProxy; } NEXT_CODE(90) m_SubentId.setType((OdDb::SubentType)pFiler->rdInt32()); NEXT_CODE(90) m_SubentId.setIndex(pFiler->rdInt32()); if (ver) // AC27 { NEXT_CODE(290) if (pFiler->rdBool()) { NEXT_CODE(1) const OdString sClassName = pFiler->rdString(); } } return eOk; } void OdDbAssocSimplePersSubentId::audit(OdDbAuditInfo* /*pAuditInfo*/) { ODA_FAIL(); // audit m_SubentId } //---------------------------------------------------------------------------- OdDbAssocIndexPersSubentId::OdDbAssocIndexPersSubentId() : OdDbAssocPersSubentId() { } void OdDbAssocIndexPersSubentId::init(const OdDbSubentId& subentId) { m_SubentId.setType(subentId.type()); m_SubentId.setIndex(subentId.index()); } void OdDbAssocIndexPersSubentId::dwgOutFields(OdDbDwgFiler* pFiler) const { OdDbAssocPersSubentId::dwgOutFields(pFiler); pFiler->wrInt16(0); pFiler->wrInt32(m_SubentId.type()); pFiler->wrInt32((OdInt32) m_SubentId.index()); } OdResult OdDbAssocIndexPersSubentId::dwgInFields(OdDbDwgFiler* pFiler) { OdDbAssocPersSubentId::dwgInFields(pFiler); OdUInt16 ver = pFiler->rdInt16(); if (ver > 0) { ODA_FAIL_ONCE(); return eMakeMeProxy; } m_SubentId.setType((OdDb::SubentType)pFiler->rdInt32()); m_SubentId.setIndex(pFiler->rdInt32()); return eOk; } void OdDbAssocIndexPersSubentId::dxfOutFields(OdDbDxfFiler* pFiler) const { OdDbAssocPersSubentId::dxfOutFields(pFiler); pFiler->wrInt32(90, 0); // ver pFiler->wrInt32(90, m_SubentId.type()); pFiler->wrInt32(90, (OdInt32) m_SubentId.index()); } OdResult OdDbAssocIndexPersSubentId::dxfInFields(OdDbDxfFiler* pFiler) { OdDbAssocPersSubentId::dxfInFields(pFiler); NEXT_CODE(90) OdUInt32 ver = pFiler->rdInt32(); if (ver > 0) { ODA_FAIL_ONCE(); return eMakeMeProxy; } NEXT_CODE(90) m_SubentId.setType((OdDb::SubentType)pFiler->rdInt32()); NEXT_CODE(90) m_SubentId.setIndex(pFiler->rdInt32()); return eOk; } void OdDbAssocIndexPersSubentId::audit(OdDbAuditInfo* /*pAuditInfo*/) { ODA_FAIL(); // audit m_SubentId } OdDbAssocAsmBasedEntityPersSubentId::OdDbAssocAsmBasedEntityPersSubentId() : OdDbAssocIndexPersSubentId() { } void OdDbAssocAsmBasedEntityPersSubentId::setPersId(OdDbPersSubentId id) { m_SubentId.setIndex((OdGsMarker)id); } OdDbPersSubentId OdDbAssocAsmBasedEntityPersSubentId::persId() const { return (OdDbPersSubentId)m_SubentId.index(); } void OdDbAssocAsmBasedEntityPersSubentId::audit(OdDbAuditInfo* /*pAuditInfo*/) { ODA_FAIL(); // audit m_SubentId }