/** * Load the object variant data from the given file. * * @param typeConfig * TypeConfig instance * @param filename * Name of the file containing the object variant data * @return * True on success, else false */ bool ObjectVariantDataFile::Load(const TypeConfig& typeConfig, const std::string& filename) { FileScanner scanner; data.clear(); isLoaded=false; this->filename=filename; try { scanner.Open(filename, FileScanner::Sequential,true); uint32_t dataCount; scanner.Read(dataCount); data.resize(dataCount); for (size_t i=0; i<dataCount; i++) { data[i].Read(typeConfig, scanner); } scanner.Close(); isLoaded=true; } catch (IOException& e) { log.Error() << e.GetDescription(); scanner.CloseFailsafe(); return false; } return true; }
bool Database::Open(const std::string& path) { assert(!path.empty()); this->path=path; typeConfig=std::make_shared<TypeConfig>(); if (!typeConfig->LoadFromDataFile(path)) { log.Error() << "Cannot load 'types.dat'!"; return false; } FileScanner scanner; try { scanner.Open(AppendFileToDir(path,"bounding.dat"), FileScanner::Normal, false); scanner.ReadBox(boundingBox); log.Debug() << "BoundingBox: " << boundingBox.GetDisplayText(); scanner.Close(); } catch (IOException& e) { log.Error() << e.GetDescription(); scanner.CloseFailsafe(); return false; } isOpen=true; return true; }
bool MergeAreasGenerator::Import(const TypeConfigRef& typeConfig, const ImportParameter& parameter, Progress& progress) { TypeInfoSet mergeTypes; FileScanner scanner; FileWriter writer; uint32_t areasWritten=0; for (const auto& type : typeConfig->GetTypes()) { if (type->CanBeArea() && type->GetMergeAreas()) { mergeTypes.Set(type); } } std::unordered_set<Id> nodeUseMap; try { scanner.Open(AppendFileToDir(parameter.GetDestinationDirectory(), MergeAreaDataGenerator::AREAS_TMP), FileScanner::Sequential, parameter.GetRawWayDataMemoryMaped()); if (!ScanAreaNodeIds(progress, *typeConfig, scanner, mergeTypes, nodeUseMap)) { return false; } uint32_t nodeCount=nodeUseMap.size(); progress.Info("Found "+NumberToString(nodeCount)+" nodes as possible connection points for areas"); /* ------ */ writer.Open(AppendFileToDir(parameter.GetDestinationDirectory(), AREAS2_TMP)); writer.Write(areasWritten); while (true) { TypeInfoSet loadedTypes; std::vector<AreaMergeData> mergeJob(typeConfig->GetTypeCount()); // // Load type data // progress.SetAction("Collecting area data by type"); if (!GetAreas(parameter, progress, *typeConfig, mergeTypes, loadedTypes, nodeUseMap, scanner, writer, mergeJob, areasWritten)) { return false; } // Merge progress.SetAction("Merging areas"); for (const auto& type : loadedTypes) { if (!mergeJob[type->GetIndex()].areas.empty()) { progress.Info("Merging areas of type "+type->GetName()); MergeAreas(progress, nodeUseMap, mergeJob[type->GetIndex()]); progress.Info("Reduced areas of '"+type->GetName()+"' from "+NumberToString(mergeJob[type->GetIndex()].areaCount)+" to "+NumberToString(mergeJob[type->GetIndex()].areaCount-mergeJob[type->GetIndex()].mergedAway.size())); mergeJob[type->GetIndex()].areas.clear(); } } // Store back merge result if (!loadedTypes.Empty()) { if (!WriteMergeResult(progress, *typeConfig, scanner, writer, loadedTypes, mergeJob, areasWritten)) { return false; } mergeTypes.Remove(loadedTypes); } if (mergeTypes.Empty()) { break; } } scanner.Close(); writer.GotoBegin(); writer.Write(areasWritten); writer.Close(); } catch (IOException& e) { progress.Error(e.GetDescription()); scanner.CloseFailsafe(); writer.CloseFailsafe(); return false; } return true; }