#include <netedit/GNEApplicationWindow.h>
#include <netedit/GNEUndoList.h>
#include <netedit/GNEViewNet.h>
#include <netedit/GNEViewParent.h>
#include <netedit/elements/GNEGeneralHandler.h>
#include <netedit/frames/common/GNESelectorFrame.h>
#include <utils/common/FileHelpers.h>
#include <utils/xml/XMLSubSys.h>
#include "GNENetDiffTool.h"
GNENetDiffTool::GNENetDiffTool(GNEApplicationWindow* applicationWindow, const std::string& toolPath, FXMenuPane* menu) :
GNEPythonTool(applicationWindow, toolPath, "", menu) {
fillNetDiffOptions(myPythonToolsOptions);
fillNetDiffOptions(myPythonToolsOptionsOriginal);
}
GNENetDiffTool::~GNENetDiffTool() {}
void
GNENetDiffTool::setCurrentValues() {
myPythonToolsOptions.resetWritable();
const auto networkPath = OptionsCont::getOptions().getString("net-file");
if (networkPath.empty()) {
myPythonToolsOptions.set("outprefix", "");
} else {
myPythonToolsOptions.set("outprefix", FileHelpers::getFilePath(networkPath) + "diff");
}
}
void
GNENetDiffTool::postProcessing() {
if (myApplicationWindow->getViewNet()) {
auto selectorModul = myApplicationWindow->getViewNet()->getViewParent()->getSelectorFrame()->getSelectionOperationModul();
if (myPythonToolsOptions.getBool("select-modified")) {
selectorModul->loadFromFile(myPythonToolsOptions.getString("outprefix") + ".changed.sel.txt");
}
if (myPythonToolsOptions.getBool("select-added")) {
selectorModul->loadFromFile(myPythonToolsOptions.getString("outprefix") + ".created.sel.txt");
}
if (myPythonToolsOptions.getBool("select-deleted")) {
selectorModul->loadFromFile(myPythonToolsOptions.getString("outprefix") + ".deleted.sel.txt");
}
if (myPythonToolsOptions.getBool("load-shapes-modified")) {
loadShapes(myPythonToolsOptions.getString("outprefix") + ".changed.shape.add.xml");
}
if (myPythonToolsOptions.getBool("load-shapes-added")) {
loadShapes(myPythonToolsOptions.getString("outprefix") + ".created.shape.add.xml");
}
if (myPythonToolsOptions.getBool("load-shapes-deleted")) {
loadShapes(myPythonToolsOptions.getString("outprefix") + ".deleted.shape.add.xml");
}
}
}
std::string
GNENetDiffTool::getCommand() const {
std::string arguments;
arguments += "\"" + myPythonToolsOptions.getString("original-net") + "\" ";
arguments += "\"" + myPythonToolsOptions.getString("modified-net") + "\" ";
arguments += "\"" + myPythonToolsOptions.getString("outprefix") + "\" ";
if (myPythonToolsOptions.getBool("select-modified") ||
myPythonToolsOptions.getBool("select-added") ||
myPythonToolsOptions.getBool("select-deleted")) {
arguments += "--write-selections ";
}
if (myPythonToolsOptions.getBool("load-shapes-modified") ||
myPythonToolsOptions.getBool("load-shapes-added") ||
myPythonToolsOptions.getBool("load-shapes-deleted")) {
arguments += "--write-shapes ";
}
return getCommandPath() + " " + arguments;
}
void
GNENetDiffTool::fillNetDiffOptions(OptionsCont& options) {
options.addOptionSubTopic("input");
options.addOptionSubTopic("output");
options.doRegister("original-net", new Option_Network(""));
options.addDescription("original-net", "input", TL("Original network"));
options.doRegister("modified-net", new Option_Network(""));
options.addDescription("modified-net", "input", TL("Modified network"));
options.doRegister("outprefix", new Option_FileName());
options.addDescription("outprefix", "output", TL("Output prefix network"));
options.addOptionSubTopic("Select");
options.doRegister("select-modified", new Option_Bool(false));
options.addDescription("select-modified", "Select", TL("Select modified elements"));
options.doRegister("select-added", new Option_Bool(false));
options.addDescription("select-added", "Select", TL("Select added elements"));
options.doRegister("select-deleted", new Option_Bool(false));
options.addDescription("select-deleted", "Select", TL("Select deleted elements"));
options.addOptionSubTopic("Load");
options.doRegister("load-shapes-modified", new Option_Bool(false));
options.addDescription("load-shapes-modified", "Load", TL("Load shapes for elements"));
options.doRegister("load-shapes-added", new Option_Bool(false));
options.addDescription("load-shapes-added", "Load", TL("Load shapes for added"));
options.doRegister("load-shapes-deleted", new Option_Bool(false));
options.addDescription("load-shapes-deleted", "Load", TL("Load shapes for deleted elements"));
}
void
GNENetDiffTool::loadShapes(const std::string& file) {
auto undoList = myApplicationWindow->getUndoList();
XMLSubSys::setValidation("never", "auto", "auto");
GNEGeneralHandler generalHandler(myApplicationWindow->getViewNet()->getNet(), file, myApplicationWindow->isUndoRedoAllowed());
undoList->begin(Supermode::NETWORK, GUIIcon::SUPERMODENETWORK, TL("load shapes from '") + file + "'");
if (!generalHandler.parse()) {
WRITE_ERROR(TL("Loading of shape file failed: ") + file);
} else {
WRITE_MESSAGE(TL("Loading of shape file successfully: ") + file);
}
undoList->end();
XMLSubSys::setValidation("auto", "auto", "auto");
myApplicationWindow->getViewNet()->update();
}