X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flsystemparameters.cpp;h=1571bc6a46ee48f068f20abec81c608901355d60;hb=a4205fb0191cc9a6a9090e0f6276248724e4f940;hp=bdd16eb000e3d619781860d5fc1fdc1b62c4e295;hpb=526db67540bf69a4c09ed0d0f4d62bad0a37ee70;p=lsystem3d.git diff --git a/src/lsystemparameters.cpp b/src/lsystemparameters.cpp index bdd16eb..1571bc6 100644 --- a/src/lsystemparameters.cpp +++ b/src/lsystemparameters.cpp @@ -1,6 +1,6 @@ // Copyright (C) 2006 Erik Dahlberg // -// This file is part of LSystem3d. +// This file is part of LSystem3D. // // LSystem3D is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -19,10 +19,14 @@ +#include + #include #include #include "lsystemparameters.h" +#include "rule.h" +#include "ruleset.h" using namespace std; @@ -55,6 +59,8 @@ void LSystemParameters::load(LindenmayerSystem *lsystem, string path) { if (lsystem) { + lsystem->clear(); + try { // load @@ -62,14 +68,21 @@ void LSystemParameters::load(LindenmayerSystem *lsystem, string path) // axiom findChild("axiom"); - lsystem->setAxiom(getString()); + Rule axiom("axiom", getString(), 1.0); + lsystem->setAxiom(axiom); // rules if (findChild("rule")) { do { - lsystem->setRule(getAttribute("name"), getString()); + // construct the rule + string name = getAttribute("name"); + string content = getString(); + double probability = strtod(getAttribute("probability").c_str(), NULL); + Rule completeRule(name, content, probability); + + lsystem->setRule(completeRule); } while (findNextChild()); } @@ -77,9 +90,18 @@ void LSystemParameters::load(LindenmayerSystem *lsystem, string path) findChild("angle"); lsystem->setAngle(getNumber()); - // iterations - findChild("iterations"); - lsystem->setNumIterations((int)getNumber()); + // depth + findChild("depth"); + lsystem->setDepth((int)getNumber()); + + // initial segment diameter + findChild("diameter"); + lsystem->setDiameter(getNumber()); + + // segment diameter factor + double diameterFactor = strtod(getAttribute("factor").c_str(), NULL); + lsystem->setDiameterFactor(diameterFactor); + } catch (xmlpp::exception e) { @@ -101,32 +123,45 @@ void LSystemParameters::load(LindenmayerSystem *lsystem, string path) */ void LSystemParameters::save(LindenmayerSystem *lsystem, string path) { - if (lsystem && !lsystem->getAxiom().empty() && !lsystem->getRules().empty()) + if (lsystem && + lsystem->getAxiom().getProbability() != 0.0 && + !lsystem->getRules().getRules().empty()) { // new document with root node createDocumentWithRoot("lsystem"); // axiom addChildToRoot("axiom"); - addString(lsystem->getAxiom()); + addString(lsystem->getAxiom().getContent()); // rules - map rules = lsystem->getRules(); - map::iterator currentRule; - for (currentRule = rules.begin(); currentRule != rules.end(); currentRule++) + rulemap rules = lsystem->getRules().getRules(); + for (rulemap::iterator it = rules.begin(); it != rules.end(); ++it) { addChildToRoot("rule"); - addString(currentRule->second); - addAttribute("name", currentRule->first); + addString(it->second.getContent()); + + addAttribute("name", it->second.getName()); + + string probabilityString = doubleToString(it->second.getProbability()); + addAttribute("probability", probabilityString); } // angle addChildToRoot("angle"); addNumber(lsystem->getAngle()); - // iterations - addChildToRoot("iterations"); - addNumber(lsystem->getNumIterations()); + // depth + addChildToRoot("depth"); + addNumber(lsystem->getDepth()); + + // initial segment diameter + addChildToRoot("diameter"); + addNumber(lsystem->getDiameter()); + + // segment diameter factor + string diameterFactor = doubleToString(lsystem->getDiameterFactor()); + addAttribute("factor", diameterFactor); // save saveToDisk(path);