예제 #1
0
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);
        }
    }
}
예제 #2
0
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);
}
예제 #3
0
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);
        }
    }
}
예제 #4
0
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;
}