Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/tools/GNENetDiffTool.cpp
169678 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2025 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
/****************************************************************************/
14
/// @file GNENetDiffTool.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date April 2023
17
///
18
// Netdiff tool used in netedit
19
/****************************************************************************/
20
21
#include <netedit/GNEApplicationWindow.h>
22
#include <netedit/GNEUndoList.h>
23
#include <netedit/GNEViewNet.h>
24
#include <netedit/GNEViewParent.h>
25
#include <netedit/elements/GNEGeneralHandler.h>
26
#include <netedit/frames/common/GNESelectorFrame.h>
27
#include <utils/common/FileHelpers.h>
28
#include <utils/xml/XMLSubSys.h>
29
30
#include "GNENetDiffTool.h"
31
32
// ===========================================================================
33
// member method definitions
34
// ===========================================================================
35
36
GNENetDiffTool::GNENetDiffTool(GNEApplicationWindow* applicationWindow, const std::string& toolPath, FXMenuPane* menu) :
37
GNEPythonTool(applicationWindow, toolPath, "", menu) {
38
// fill options
39
fillNetDiffOptions(myPythonToolsOptions);
40
fillNetDiffOptions(myPythonToolsOptionsOriginal);
41
}
42
43
44
GNENetDiffTool::~GNENetDiffTool() {}
45
46
47
void
48
GNENetDiffTool::setCurrentValues() {
49
myPythonToolsOptions.resetWritable();
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
60
void
61
GNENetDiffTool::postProcessing() {
62
// first check if there is a network
63
if (myApplicationWindow->getViewNet()) {
64
// get selector operator modul from selector frame
65
auto selectorModul = myApplicationWindow->getViewNet()->getViewParent()->getSelectorFrame()->getSelectionOperationModul();
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.add.xml");
79
}
80
if (myPythonToolsOptions.getBool("load-shapes-added")) {
81
loadShapes(myPythonToolsOptions.getString("outprefix") + ".created.shape.add.xml");
82
}
83
if (myPythonToolsOptions.getBool("load-shapes-deleted")) {
84
loadShapes(myPythonToolsOptions.getString("outprefix") + ".deleted.shape.add.xml");
85
}
86
}
87
}
88
89
90
std::string
91
GNENetDiffTool::getCommand() const {
92
std::string arguments;
93
// add arguments
94
arguments += "\"" + myPythonToolsOptions.getString("original-net") + "\" ";
95
arguments += "\"" + myPythonToolsOptions.getString("modified-net") + "\" ";
96
arguments += "\"" + myPythonToolsOptions.getString("outprefix") + "\" ";
97
// check if save selection
98
if (myPythonToolsOptions.getBool("select-modified") ||
99
myPythonToolsOptions.getBool("select-added") ||
100
myPythonToolsOptions.getBool("select-deleted")) {
101
arguments += "--write-selections ";
102
}
103
// check if save shapes
104
if (myPythonToolsOptions.getBool("load-shapes-modified") ||
105
myPythonToolsOptions.getBool("load-shapes-added") ||
106
myPythonToolsOptions.getBool("load-shapes-deleted")) {
107
arguments += "--write-shapes ";
108
}
109
return getCommandPath() + " " + arguments;
110
}
111
112
113
void
114
GNENetDiffTool::fillNetDiffOptions(OptionsCont& options) {
115
// build custom options for netdiff
116
options.addOptionSubTopic("input");
117
options.addOptionSubTopic("output");
118
options.doRegister("original-net", new Option_Network(""));
119
options.addDescription("original-net", "input", TL("Original network"));
120
121
options.doRegister("modified-net", new Option_Network(""));
122
options.addDescription("modified-net", "input", TL("Modified network"));
123
124
options.doRegister("outprefix", new Option_FileName());
125
options.addDescription("outprefix", "output", TL("Output prefix network"));
126
127
options.addOptionSubTopic("Select");
128
options.doRegister("select-modified", new Option_Bool(false));
129
options.addDescription("select-modified", "Select", TL("Select modified elements"));
130
131
options.doRegister("select-added", new Option_Bool(false));
132
options.addDescription("select-added", "Select", TL("Select added elements"));
133
134
options.doRegister("select-deleted", new Option_Bool(false));
135
options.addDescription("select-deleted", "Select", TL("Select deleted elements"));
136
137
options.addOptionSubTopic("Load");
138
options.doRegister("load-shapes-modified", new Option_Bool(false));
139
options.addDescription("load-shapes-modified", "Load", TL("Load shapes for elements"));
140
141
options.doRegister("load-shapes-added", new Option_Bool(false));
142
options.addDescription("load-shapes-added", "Load", TL("Load shapes for added"));
143
144
options.doRegister("load-shapes-deleted", new Option_Bool(false));
145
options.addDescription("load-shapes-deleted", "Load", TL("Load shapes for deleted elements"));
146
}
147
148
149
void
150
GNENetDiffTool::loadShapes(const std::string& file) {
151
// get undo list
152
auto undoList = myApplicationWindow->getUndoList();
153
// disable validation for additionals
154
XMLSubSys::setValidation("never", "auto", "auto");
155
// Create additional handler
156
GNEGeneralHandler generalHandler(myApplicationWindow->getViewNet()->getNet(), file, myApplicationWindow->isUndoRedoAllowed());
157
// begin undoList operation
158
undoList->begin(Supermode::NETWORK, GUIIcon::SUPERMODENETWORK, TL("load shapes from '") + file + "'");
159
// Run parser
160
if (!generalHandler.parse()) {
161
// write error
162
WRITE_ERROR(TL("Loading of shape file failed: ") + file);
163
} else {
164
// write info
165
WRITE_MESSAGE(TL("Loading of shape file successfully: ") + file);
166
}
167
// end undoList operation
168
undoList->end();
169
// restore validation for additionals
170
XMLSubSys::setValidation("auto", "auto", "auto");
171
// update view
172
myApplicationWindow->getViewNet()->update();
173
}
174
175
/****************************************************************************/
176
177