void SettingRegistry::_loadSettingValues(SettingConfig* config, rapidjson::GenericValue< rapidjson::UTF8< char > >::ConstMemberIterator& json_object_it, bool warn_duplicates, bool add_to_settings) { const rapidjson::Value& data = json_object_it->value; /// Fill the setting config object with data we have in the json file. if (data.HasMember("type") && data["type"].IsString()) { config->setType(data["type"].GetString()); } if (data.HasMember("default")) { const rapidjson::Value& dflt = data["default"]; if (dflt.IsString()) { config->setDefault(dflt.GetString()); } else if (dflt.IsTrue()) { config->setDefault("true"); } else if (dflt.IsFalse()) { config->setDefault("false"); } else if (dflt.IsNumber()) { std::ostringstream ss; ss << dflt.GetDouble(); config->setDefault(ss.str()); } // arrays are ignored because machine_extruder_trains needs to be handled separately else { logError("Unrecognized data type in JSON: %s has type %s\n", json_object_it->name.GetString(), toString(dflt.GetType()).c_str()); } } if (data.HasMember("unit") && data["unit"].IsString()) { config->setUnit(data["unit"].GetString()); } /// Register the setting in the settings map lookup. if (warn_duplicates && settingExists(config->getKey())) { cura::logError("Duplicate definition of setting: %s a.k.a. \"%s\" was already claimed by \"%s\"\n", config->getKey().c_str(), config->getLabel().c_str(), getSettingConfig(config->getKey())->getLabel().c_str()); } if (add_to_settings) { settings[config->getKey()] = config; } /// When this setting has children, add those children to this setting. if (data.HasMember("children") && data["children"].IsObject()) { const rapidjson::Value& json_object_container = data["children"]; for (rapidjson::Value::ConstMemberIterator setting_iterator = json_object_container.MemberBegin(); setting_iterator != json_object_container.MemberEnd(); ++setting_iterator) { _addSettingToContainer(config, setting_iterator, warn_duplicates, add_to_settings); } } }
void SettingRegistry::_addSettingToContainer(SettingContainer* parent, rapidjson::Value::ConstMemberIterator& json_object_it, bool warn_duplicates, bool add_to_settings) { const rapidjson::Value& data = json_object_it->value; if (data.HasMember("type") && data["type"].IsString() && (data["type"].GetString() == std::string("polygon") || data["type"].GetString() == std::string("polygons"))) { logWarning("Loading polygon setting %s not implemented...\n", json_object_it->name.GetString()); /// When this setting has children, add those children to the parent setting. if (data.HasMember("children") && data["children"].IsObject()) { const rapidjson::Value& json_object_container = data["children"]; for (rapidjson::Value::ConstMemberIterator setting_iterator = json_object_container.MemberBegin(); setting_iterator != json_object_container.MemberEnd(); ++setting_iterator) { _addSettingToContainer(parent, setting_iterator, warn_duplicates, add_to_settings); } } return; } std::string label; if (!json_object_it->value.HasMember("label") || !data["label"].IsString()) { label = "N/A"; } else { label = data["label"].GetString(); } /// Create the new setting config object. SettingConfig* config = parent->addChild(json_object_it->name.GetString(), label); _loadSettingValues(config, json_object_it, warn_duplicates, add_to_settings); }
void SettingRegistry::_addSettingToContainer(SettingContainer* parent, rapidjson::Value::ConstMemberIterator& json_object_it, bool warn_duplicates, bool add_to_settings) { const rapidjson::Value& data = json_object_it->value; if (data.HasMember("type") && data["type"].IsString() && (data["type"].GetString() == std::string("polygon") || data["type"].GetString() == std::string("polygons"))) { logWarning("Loading polygon setting %s not implemented...\n", json_object_it->name.GetString()); /// When this setting has children, add those children to the parent setting. if (data.HasMember("children") && data["children"].IsObject()) { const rapidjson::Value& json_object_container = data["children"]; for (rapidjson::Value::ConstMemberIterator setting_iterator = json_object_container.MemberBegin(); setting_iterator != json_object_container.MemberEnd(); ++setting_iterator) { _addSettingToContainer(parent, setting_iterator, warn_duplicates, add_to_settings); } } return; } std::string label; if (!json_object_it->value.HasMember("label") || !data["label"].IsString()) { label = "N/A"; } else { label = data["label"].GetString(); } /// Create the new setting config object. SettingConfig* config = parent->addChild(json_object_it->name.GetString(), label); /// Fill the setting config object with data we have in the json file. if (data.HasMember("type") && data["type"].IsString()) { config->setType(data["type"].GetString()); } if (data.HasMember("default")) { const rapidjson::Value& dflt = data["default"]; config->setDefault(toString(dflt, json_object_it->name.GetString())); } if (data.HasMember("unit") && data["unit"].IsString()) { config->setUnit(data["unit"].GetString()); } /// Register the setting in the settings map lookup. if (warn_duplicates && settingExists(config->getKey())) { cura::logError("Duplicate definition of setting: %s a.k.a. \"%s\" was already claimed by \"%s\"\n", config->getKey().c_str(), config->getLabel().c_str(), getSettingConfig(config->getKey())->getLabel().c_str()); } if (add_to_settings) { settings[config->getKey()] = config; } /// When this setting has children, add those children to this setting. if (data.HasMember("children") && data["children"].IsObject()) { const rapidjson::Value& json_object_container = data["children"]; for (rapidjson::Value::ConstMemberIterator setting_iterator = json_object_container.MemberBegin(); setting_iterator != json_object_container.MemberEnd(); ++setting_iterator) { _addSettingToContainer(parent, setting_iterator, warn_duplicates, add_to_settings); } } }
int SettingRegistry::loadJSONsettingsFromDoc(rapidjson::Document& json_document, bool warn_duplicates) { if (!json_document.IsObject()) { cura::logError("JSON file is not an object.\n"); return 3; } if (json_document.HasMember("machine_extruder_trains")) { categories.emplace_back("machine_extruder_trains", "Extruder Trains Settings Objects"); SettingContainer* category_trains = &categories.back(); const rapidjson::Value& trains = json_document["machine_extruder_trains"]; if (trains.IsArray()) { if (trains.Size() > 0 && trains[0].IsObject()) { unsigned int idx = 0; for (auto it = trains.Begin(); it != trains.End(); ++it) { SettingConfig* child = category_trains->addChild(std::to_string(idx), std::to_string(idx)); for (rapidjson::Value::ConstMemberIterator setting_iterator = it->MemberBegin(); setting_iterator != it->MemberEnd(); ++setting_iterator) { _addSettingToContainer(child, setting_iterator, warn_duplicates, false); } idx++; } } } else { logError("Error: JSON machine_extruder_trains is not an array!\n"); } } if (json_document.HasMember("machine_settings")) { categories.emplace_back("machine_settings", "Machine Settings"); SettingContainer* category_machine_settings = &categories.back(); const rapidjson::Value& json_object_container = json_document["machine_settings"]; for (rapidjson::Value::ConstMemberIterator setting_iterator = json_object_container.MemberBegin(); setting_iterator != json_object_container.MemberEnd(); ++setting_iterator) { _addSettingToContainer(category_machine_settings, setting_iterator, warn_duplicates); } } if (json_document.HasMember("categories")) { for (rapidjson::Value::ConstMemberIterator category_iterator = json_document["categories"].MemberBegin(); category_iterator != json_document["categories"].MemberEnd(); ++category_iterator) { if (!category_iterator->value.IsObject()) { continue; } if (!category_iterator->value.HasMember("label") || !category_iterator->value["label"].IsString()) { continue; } if (!category_iterator->value.HasMember("settings") || !category_iterator->value["settings"].IsObject()) { continue; } categories.emplace_back(category_iterator->name.GetString(), category_iterator->value["label"].GetString()); SettingContainer* category = &categories.back(); const rapidjson::Value& json_object_container = category_iterator->value["settings"]; for (rapidjson::Value::ConstMemberIterator setting_iterator = json_object_container.MemberBegin(); setting_iterator != json_object_container.MemberEnd(); ++setting_iterator) { _addSettingToContainer(category, setting_iterator, warn_duplicates); } } } if (false && json_document.HasMember("overrides")) { const rapidjson::Value& json_object_container = json_document["overrides"]; for (rapidjson::Value::ConstMemberIterator override_iterator = json_object_container.MemberBegin(); override_iterator != json_object_container.MemberEnd(); ++override_iterator) { SettingConfig* conf = getSettingConfig(override_iterator->name.GetString()); _addSettingToContainer(conf, override_iterator, false); } } return 0; }