| 983 | } |
| 984 | |
| 985 | void ModelMerger::mergeModels(Model& currentModel, const Model& newModel, const std::map<UUID, UUID>& handleMapping) { |
| 986 | m_logSink.setThreadId(std::this_thread::get_id()); |
| 987 | m_logSink.resetStringStream(); |
| 988 | |
| 989 | m_currentModel = currentModel; |
| 990 | m_newModel = newModel; |
| 991 | |
| 992 | m_newMergedHandles.clear(); |
| 993 | m_currentToNewHandleMapping = handleMapping; |
| 994 | m_newToCurrentHandleMapping.clear(); |
| 995 | for (const auto& it : handleMapping) { |
| 996 | if (m_newToCurrentHandleMapping.find(it.second) != m_newToCurrentHandleMapping.end()) { |
| 997 | LOG(Error, "Multiple entries in current model refer to handle '" << toString(it.second) << "' in new model"); |
| 998 | } |
| 999 | m_newToCurrentHandleMapping[it.second] = it.first; |
| 1000 | } |
| 1001 | |
| 1002 | //** Remove objects from current model that are not in new model **// |
| 1003 | for (const auto& iddObjectType : iddObjectTypesToMerge()) { |
| 1004 | for (auto& currenObject : currentModel.getObjectsByType(iddObjectType)) { |
| 1005 | if (m_currentToNewHandleMapping.find(currenObject.handle()) == m_currentToNewHandleMapping.end()) { |
| 1006 | if ((iddObjectType == IddObjectType::OS_Site) || (iddObjectType == IddObjectType::OS_Facility) |
| 1007 | || (iddObjectType == IddObjectType::OS_Building)) { |
| 1008 | // These are unique objects, so no need to delete them |
| 1009 | continue; |
| 1010 | } else { |
| 1011 | currenObject.remove(); |
| 1012 | } |
| 1013 | } |
| 1014 | } |
| 1015 | } |
| 1016 | |
| 1017 | //** Merge objects from new model into current model **// |
| 1018 | for (const auto& iddObjectType : iddObjectTypesToMerge()) { |
| 1019 | for (auto& newObject : newModel.getObjectsByType(iddObjectType)) { |
| 1020 | getCurrentModelObject(newObject); |
| 1021 | } |
| 1022 | } |
| 1023 | } |
| 1024 | |
| 1025 | std::vector<IddObjectType> ModelMerger::iddObjectTypesToMerge() const { |
| 1026 | return m_iddObjectTypesToMerge; |