Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2003-2024 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 GUIInstantInductLoop.cpp
15 : /// @author Daniel Krajzewicz
16 : /// @author Jakob Erdmann
17 : /// @author Michael Behrisch
18 : /// @date Aug 2003
19 : ///
20 : // The gui-version of the MSInstantInductLoop
21 : /****************************************************************************/
22 : #include <config.h>
23 :
24 : #include <utils/common/MsgHandler.h>
25 : #include <utils/gui/globjects/GUIGlObject.h>
26 : #include <utils/geom/PositionVector.h>
27 : #include "GUIInstantInductLoop.h"
28 : #include <utils/gui/div/GLHelper.h>
29 : #include <utils/gui/div/GUIParameterTableWindow.h>
30 : #include <microsim/logging/FunctionBinding.h>
31 : #include <microsim/output/MSInstantInductLoop.h>
32 : #include <microsim/MSLane.h>
33 : #include "GUIEdge.h"
34 : #include <utils/gui/globjects/GLIncludes.h>
35 :
36 :
37 : // ===========================================================================
38 : // method definitions
39 : // ===========================================================================
40 : /* -------------------------------------------------------------------------
41 : * GUIInstantInductLoop-methods
42 : * ----------------------------------------------------------------------- */
43 121 : GUIInstantInductLoop::GUIInstantInductLoop(const std::string& id, OutputDevice& od,
44 : MSLane* const lane, double positionInMeters,
45 : const std::string name, const std::string& vTypes,
46 121 : const std::string& nextEdges) :
47 242 : MSInstantInductLoop(id, od, lane, positionInMeters, name, vTypes, nextEdges) {}
48 :
49 :
50 242 : GUIInstantInductLoop::~GUIInstantInductLoop() {}
51 :
52 :
53 : GUIDetectorWrapper*
54 109 : GUIInstantInductLoop::buildDetectorGUIRepresentation() {
55 109 : return new MyWrapper(*this, myPosition);
56 : }
57 :
58 : // -------------------------------------------------------------------------
59 : // GUIInstantInductLoop::MyWrapper-methods
60 : // -------------------------------------------------------------------------
61 :
62 109 : GUIInstantInductLoop::MyWrapper::MyWrapper(GUIInstantInductLoop& detector, double pos) :
63 : GUIDetectorWrapper(GLO_E1DETECTOR_INSTANT, detector.getID(), GUIIconSubSys::getIcon(GUIIcon::E1INSTANT)),
64 109 : myDetector(detector), myPosition(pos) {
65 109 : myFGPosition = detector.getLane()->geometryPositionAtOffset(pos);
66 109 : myBoundary.add(myFGPosition.x() + (double) 5.5, myFGPosition.y() + (double) 5.5);
67 109 : myBoundary.add(myFGPosition.x() - (double) 5.5, myFGPosition.y() - (double) 5.5);
68 109 : myFGRotation = -detector.getLane()->getShape().rotationDegreeAtOffset(pos);
69 109 : }
70 :
71 :
72 218 : GUIInstantInductLoop::MyWrapper::~MyWrapper() {}
73 :
74 :
75 : double
76 2588 : GUIInstantInductLoop::MyWrapper::getExaggeration(const GUIVisualizationSettings& s) const {
77 2588 : return s.addSize.getExaggeration(s, this);
78 : }
79 :
80 :
81 : Boundary
82 2697 : GUIInstantInductLoop::MyWrapper::getCenteringBoundary() const {
83 : Boundary b(myBoundary);
84 2697 : b.grow(20);
85 2697 : return b;
86 0 : }
87 :
88 :
89 :
90 : GUIParameterTableWindow*
91 0 : GUIInstantInductLoop::MyWrapper::getParameterWindow(GUIMainWindow& app,
92 : GUISUMOAbstractView& /*parent !!! recheck this - never needed?*/) {
93 0 : GUIParameterTableWindow* ret = new GUIParameterTableWindow(app, *this);
94 : // add items
95 : // parameter
96 0 : ret->mkItem(TL("name"), false, myDetector.myName);
97 0 : ret->mkItem(TL("position [m]"), false, myPosition);
98 0 : ret->mkItem(TL("lane"), false, myDetector.getLane()->getID());
99 0 : if (myDetector.isTyped()) {
100 0 : ret->mkItem(TL("vTypes"), false, toString(myDetector.getVehicleTypes()));
101 : }
102 : // values
103 : // close building
104 0 : ret->closeBuilding(&myDetector);
105 0 : return ret;
106 : }
107 :
108 :
109 : void
110 2588 : GUIInstantInductLoop::MyWrapper::drawGL(const GUIVisualizationSettings& s) const {
111 2588 : GLHelper::pushName(getGlID());
112 2588 : double width = (double) 2.0 * s.scale;
113 2588 : glLineWidth(1.0);
114 2588 : const double exaggeration = getExaggeration(s);
115 : // shape
116 2588 : glColor3d(1, 0, 1);
117 2588 : GLHelper::pushMatrix();
118 2588 : glTranslated(0, 0, GLO_JUNCTION + 0.4); // do not draw on top of linkRules
119 2588 : glTranslated(myFGPosition.x(), myFGPosition.y(), 0);
120 2588 : glRotated(myFGRotation, 0, 0, 1);
121 2588 : glScaled(exaggeration, exaggeration, 1);
122 2588 : glBegin(GL_QUADS);
123 2588 : glVertex2d(0 - 1.0, 2);
124 2588 : glVertex2d(-1.0, -2);
125 2588 : glVertex2d(1.0, -2);
126 2588 : glVertex2d(1.0, 2);
127 2588 : glEnd();
128 2588 : glTranslated(0, 0, .01);
129 2588 : glBegin(GL_LINES);
130 2588 : glVertex2d(0, 2 - .1);
131 2588 : glVertex2d(0, -2 + .1);
132 2588 : glEnd();
133 :
134 : // outline
135 2588 : if (width * exaggeration > 1) {
136 2580 : glColor3d(1, 1, 1);
137 2580 : glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
138 2580 : glBegin(GL_QUADS);
139 2580 : glVertex2d(0 - 1.0, 2);
140 2580 : glVertex2d(-1.0, -2);
141 2580 : glVertex2d(1.0, -2);
142 2580 : glVertex2d(1.0, 2);
143 2580 : glEnd();
144 2580 : glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
145 : }
146 :
147 : // position indicator
148 2588 : if (width * exaggeration > 1) {
149 2580 : glRotated(90, 0, 0, -1);
150 2580 : glColor3d(1, 1, 1);
151 2580 : glBegin(GL_LINES);
152 2580 : glVertex2d(0, 1.7);
153 2580 : glVertex2d(0, -1.7);
154 2580 : glEnd();
155 : }
156 2588 : GLHelper::popMatrix();
157 2588 : drawName(getCenteringBoundary().getCenter(), s.scale, s.addName);
158 2588 : GLHelper::popName();
159 2588 : }
160 :
161 :
162 : GUIInstantInductLoop&
163 0 : GUIInstantInductLoop::MyWrapper::getLoop() {
164 0 : return myDetector;
165 : }
166 :
167 :
168 : /****************************************************************************/
|