Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GNENetDiffTool.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-2023 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
18// Netdiff tool used in netedit
19/****************************************************************************/
20
22#include <netedit/GNEUndoList.h>
23#include <netedit/GNEViewNet.h>
28#include <utils/xml/XMLSubSys.h>
29
30#include "GNENetDiffTool.h"
31
32// ===========================================================================
33// member method definitions
34// ===========================================================================
35
36GNENetDiffTool::GNENetDiffTool(GNEApplicationWindow* GNEApp, const std::string& toolPath, FXMenuPane* menu) :
37 GNEPythonTool(GNEApp, toolPath, "", menu) {
38 // fill options
41}
42
43
45
46
47void
50 // obtain curren network folder
51 const auto networkPath = OptionsCont::getOptions().getString("net-file");
52 if (networkPath.empty()) {
53 myPythonToolsOptions.set("outprefix", "");
54 } else {
55 myPythonToolsOptions.set("outprefix", FileHelpers::getFilePath(networkPath) + "diff");
56 }
57}
58
59
60void
62 // first check if there is a network
63 if (myGNEApp->getViewNet()) {
64 // get selector operator modul from selector frame
66 // select elements
67 if (myPythonToolsOptions.getBool("select-modified")) {
68 selectorModul->loadFromFile(myPythonToolsOptions.getString("outprefix") + ".changed.sel.txt");
69 }
70 if (myPythonToolsOptions.getBool("select-added")) {
71 selectorModul->loadFromFile(myPythonToolsOptions.getString("outprefix") + ".created.sel.txt");
72 }
73 if (myPythonToolsOptions.getBool("select-deleted")) {
74 selectorModul->loadFromFile(myPythonToolsOptions.getString("outprefix") + ".deleted.sel.txt");
75 }
76 // load shapes
77 if (myPythonToolsOptions.getBool("load-shapes-modified")) {
78 loadShapes(myPythonToolsOptions.getString("outprefix") + ".changed.shape.xml");
79 }
80 if (myPythonToolsOptions.getBool("load-shapes-added")) {
81 loadShapes(myPythonToolsOptions.getString("outprefix") + ".created.shape.xml");
82 }
83 if (myPythonToolsOptions.getBool("load-shapes-deleted")) {
84 loadShapes(myPythonToolsOptions.getString("outprefix") + ".deleted.shape.xml");
85 }
86 }
87}
88
89
90std::string
92 // add python script
93 const char* pythonEnv = getenv("PYTHON");
94 const std::string python = (pythonEnv == nullptr) ? "python" : pythonEnv;
95 const char* sumoHomeEnv = getenv("SUMO_HOME");
96 std::string sumoHome = "";
97 if (sumoHomeEnv != nullptr && sumoHomeEnv != std::string("")) {
98 sumoHome = std::string(sumoHomeEnv);
99 // quote string to handle spaces but prevent double quotes
100 if (sumoHome.front() != '"') {
101 sumoHome = "\"" + sumoHome;
102 }
103 if (sumoHome.back() != '"') {
104 sumoHome += "\"";
105 }
106 sumoHome += "/";
107 }
108 // get command
109 std::string command = python + " " + sumoHome + myToolPath;
110 // declare arguments
111 std::string arguments;
112 // add arguments
113 arguments += (myPythonToolsOptions.getString("original-net") + " ");
114 arguments += (myPythonToolsOptions.getString("modified-net") + " ");
115 arguments += myPythonToolsOptions.getString("outprefix") + " ";
116 // check if save selection
117 if (myPythonToolsOptions.getBool("select-modified") ||
118 myPythonToolsOptions.getBool("select-added") ||
119 myPythonToolsOptions.getBool("select-deleted")) {
120 arguments += "--write-selections ";
121 }
122 // check if save shapes
123 if (myPythonToolsOptions.getBool("load-shapes-modified") ||
124 myPythonToolsOptions.getBool("load-shapes-added") ||
125 myPythonToolsOptions.getBool("load-shapes-deleted")) {
126 arguments += "--write-shapes ";
127 }
128 return command + " " + arguments;
129}
130
131
132void
134 // build custom options for netdiff
135 options.addOptionSubTopic("input");
136 options.addOptionSubTopic("output");
137 options.doRegister("original-net", new Option_Network(""));
138 options.addDescription("original-net", "input", TL("Original network"));
139
140 options.doRegister("modified-net", new Option_Network(""));
141 options.addDescription("modified-net", "input", TL("Modified network"));
142
143 options.doRegister("outprefix", new Option_FileName());
144 options.addDescription("outprefix", "output", TL("Output prefix network"));
145
146 options.addOptionSubTopic("Select");
147 options.doRegister("select-modified", new Option_Bool(false));
148 options.addDescription("select-modified", "Select", TL("Select modified elements"));
149
150 options.doRegister("select-added", new Option_Bool(false));
151 options.addDescription("select-added", "Select", TL("Select added elements"));
152
153 options.doRegister("select-deleted", new Option_Bool(false));
154 options.addDescription("select-deleted", "Select", TL("Select deleted elements"));
155
156 options.addOptionSubTopic("Load");
157 options.doRegister("load-shapes-modified", new Option_Bool(false));
158 options.addDescription("load-shapes-modified", "Load", TL("Load shapes for elements"));
159
160 options.doRegister("load-shapes-added", new Option_Bool(false));
161 options.addDescription("load-shapes-added", "Load", TL("Load shapes for added"));
162
163 options.doRegister("load-shapes-deleted", new Option_Bool(false));
164 options.addDescription("load-shapes-deleted", "Load", TL("Load shapes for deleted elements"));
165}
166
167
168void
169GNENetDiffTool::loadShapes(const std::string& file) {
170 // get undo list
171 auto undoList = myGNEApp->getUndoList();
172 // disable validation for additionals
173 XMLSubSys::setValidation("never", "auto", "auto");
174 // Create additional handler
175 GNEGeneralHandler generalHandler(myGNEApp->getViewNet()->getNet(), file, true, true);
176 // begin undoList operation
177 undoList->begin(Supermode::NETWORK, GUIIcon::SUPERMODENETWORK, TL("load shapes from '") + file + "'");
178 // Run parser
179 if (!generalHandler.parse()) {
180 // write error
181 WRITE_ERROR(TL("Loading of shape file failed: ") + file);
182 } else {
183 // write info
184 WRITE_MESSAGE(TL("Loading of shape file sucessfully: ") + file);
185 }
186 // end undoList operation
187 undoList->end();
188 // restore validation for additionals
189 XMLSubSys::setValidation("auto", "auto", "auto");
190 // update view
191 myGNEApp->getViewNet()->update();
192}
193
194/****************************************************************************/
@ NETWORK
Network mode (Edges, junctions, etc..)
@ SUPERMODENETWORK
#define WRITE_MESSAGE(msg)
Definition MsgHandler.h:272
#define WRITE_ERROR(msg)
Definition MsgHandler.h:279
#define TL(string)
Definition MsgHandler.h:287
static std::string getFilePath(const std::string &path)
Removes the file information from the given path.
The main window of Netedit.
GNEUndoList * getUndoList()
get pointer to undoList
GNEViewNet * getViewNet()
get pointer to viewNet
std::string getCommand() const
get command (python + script + arguments)
void loadShapes(const std::string &file)
load shapes
void postProcessing()
execute post processing
~GNENetDiffTool()
destructor
void setCurrentValues()
set current values (used for set values like current folder and similar)
void fillNetDiffOptions(OptionsCont &options)
fill netDiff options
GNENetDiffTool(GNEApplicationWindow *GNEApp, const std::string &toolPath, FXMenuPane *menu)
Constructor.
OptionsCont myPythonToolsOptionsOriginal
original tools options
GNEApplicationWindow * myGNEApp
pointer to GNEApplicationWindow
const std::string myToolPath
python tool path relative to SUMO_HOME
OptionsCont myPythonToolsOptions
tools options
void loadFromFile(const std::string &file) const
load from file
GNESelectorFrame::SelectionOperation * getSelectionOperationModul() const
get selection operation modul
GNENet * getNet() const
get the net object
GNEViewParent * getViewParent() const
get the net object
GNESelectorFrame * getSelectorFrame() const
get frame for select elements
bool parse()
parse
A storage for options typed value containers)
Definition OptionsCont.h:89
void addDescription(const std::string &name, const std::string &subtopic, const std::string &description)
Adds a description for an option.
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
void doRegister(const std::string &name, Option *o)
Adds an option under the given name.
bool set(const std::string &name, const std::string &value, const bool append=false)
Sets the given value for the named option.
void addOptionSubTopic(const std::string &topic)
Adds an option subtopic.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
void resetWritable()
Resets all options to be writeable.
static OptionsCont & getOptions()
Retrieves the options.
static void setValidation(const std::string &validationScheme, const std::string &netValidationScheme, const std::string &routeValidationScheme)
Enables or disables validation.
Definition XMLSubSys.cpp:66