/////////////////////////////////////////////////////////////////////////////// // 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 "IfcReferenceValidationTaskSubHealer.h" OdDAI::Logical IfcContextSubHealer::heal(OdDAI::Model* model, OdDAI::ValidationTask::InvalidValidationParamsBase* invalidParams) { if (model == nullptr || invalidParams == nullptr) return OdDAI::Logical::False; const OdDAI::SetOfOdDAIObjectId* ifcContexts = model->getEntityExtent("ifccontext"); if (ifcContexts->getMemberCount() < 1) return OdDAI::Logical::False; const OdDAI::SetOfOdDAIObjectId* allGeometricRepresentationContexts = model->getEntityExtent("ifcgeometricrepresentationcontext"); OdDAI::Logical res = OdDAI::Logical::False; for (const auto& ctxId : ifcContexts->getArray()) { OdDAI::ApplicationInstancePtr ifcContext = ctxId.openObject(); if (ifcContext) { OdDAI::SetOfOdDAIObjectId* representationContexts{}; ifcContext->getAttr("representationcontexts") >> representationContexts; if (representationContexts->getMemberCount()) { for (const auto& idReprCtx : representationContexts->getArray()) { OdDAI::ApplicationInstancePtr reprCtx = idReprCtx.openObject(); if (reprCtx->isKindOf("ifcrepresentationcontext") == false) { ifcContext->putAttr("representationcontexts", allGeometricRepresentationContexts->getArray()); // Even if no representation contexts res = OdDAI::Logical::True; break; } } } } } return res; } bool IfcContextSubHealer::isApplicable(OdDAI::Model* model, OdDAI::ValidationTask::InvalidValidationParamsBase* inInvalidParams) { if (model == nullptr || inInvalidParams == nullptr) return false; OdAnsiString schemaName = model->underlyingSchemaName(); if (schemaName.left(3).makeLower() == "ifc") { OdDAI::ValidationTask::InvalidValidationParams* invalidParams = dynamic_cast(inInvalidParams); for (const auto& it : invalidParams->invalidAttributes) { const OdDAI::Entity* entityDef = it->entityDef(); if (entityDef->name() == "ifccontext" && it->name() == "representationcontexts") { return true; } } } return false; }