Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Q
qgroundcontrol
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Valentin Platzgummer
qgroundcontrol
Commits
4e847909
Commit
4e847909
authored
Feb 22, 2012
by
hengli
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added parameter dialog to modify terrain offset parameters.
parent
cd49ed03
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
241 additions
and
6 deletions
+241
-6
qgroundcontrol.pro
qgroundcontrol.pro
+4
-2
GlobalViewParams.cc
src/ui/map3D/GlobalViewParams.cc
+12
-0
GlobalViewParams.h
src/ui/map3D/GlobalViewParams.h
+5
-1
Pixhawk3DWidget.cc
src/ui/map3D/Pixhawk3DWidget.cc
+82
-3
Pixhawk3DWidget.h
src/ui/map3D/Pixhawk3DWidget.h
+4
-0
TerrainParamDialog.cc
src/ui/map3D/TerrainParamDialog.cc
+102
-0
TerrainParamDialog.h
src/ui/map3D/TerrainParamDialog.h
+32
-0
No files found.
qgroundcontrol.pro
View file @
4e847909
...
@@ -358,7 +358,8 @@ HEADERS += src/MG.h \
...
@@ -358,7 +358,8 @@ HEADERS += src/MG.h \
src
/
ui
/
mavlink
/
QGCMAVLinkMessageSender
.
h
\
src
/
ui
/
mavlink
/
QGCMAVLinkMessageSender
.
h
\
src
/
ui
/
firmwareupdate
/
QGCFirmwareUpdateWidget
.
h
\
src
/
ui
/
firmwareupdate
/
QGCFirmwareUpdateWidget
.
h
\
src
/
ui
/
QGCPluginHost
.
h
\
src
/
ui
/
QGCPluginHost
.
h
\
src
/
ui
/
firmwareupdate
/
QGCPX4FirmwareUpdate
.
h
src
/
ui
/
firmwareupdate
/
QGCPX4FirmwareUpdate
.
h
\
src
/
ui
/
map3D
/
TerrainParamDialog
.
h
#
Google
Earth
is
only
supported
on
Mac
OS
and
Windows
with
Visual
Studio
Compiler
#
Google
Earth
is
only
supported
on
Mac
OS
and
Windows
with
Visual
Studio
Compiler
macx
|
macx
-
g
++
|
macx
-
g
++
42
|
win32
-
msvc2008
|
win32
-
msvc2010
::
HEADERS
+=
src
/
ui
/
map3D
/
QGCGoogleEarthView
.
h
macx
|
macx
-
g
++
|
macx
-
g
++
42
|
win32
-
msvc2008
|
win32
-
msvc2010
::
HEADERS
+=
src
/
ui
/
map3D
/
QGCGoogleEarthView
.
h
...
@@ -498,7 +499,8 @@ SOURCES += src/main.cc \
...
@@ -498,7 +499,8 @@ SOURCES += src/main.cc \
src
/
ui
/
mavlink
/
QGCMAVLinkMessageSender
.
cc
\
src
/
ui
/
mavlink
/
QGCMAVLinkMessageSender
.
cc
\
src
/
ui
/
firmwareupdate
/
QGCFirmwareUpdateWidget
.
cc
\
src
/
ui
/
firmwareupdate
/
QGCFirmwareUpdateWidget
.
cc
\
src
/
ui
/
QGCPluginHost
.
cc
\
src
/
ui
/
QGCPluginHost
.
cc
\
src
/
ui
/
firmwareupdate
/
QGCPX4FirmwareUpdate
.
cc
src
/
ui
/
firmwareupdate
/
QGCPX4FirmwareUpdate
.
cc
\
src
/
ui
/
map3D
/
TerrainParamDialog
.
cc
#
Enable
Google
Earth
only
on
Mac
OS
and
Windows
with
Visual
Studio
compiler
#
Enable
Google
Earth
only
on
Mac
OS
and
Windows
with
Visual
Studio
compiler
macx
|
macx
-
g
++
|
macx
-
g
++
42
|
win32
-
msvc2008
|
win32
-
msvc2010
::
SOURCES
+=
src
/
ui
/
map3D
/
QGCGoogleEarthView
.
cc
macx
|
macx
-
g
++
|
macx
-
g
++
42
|
win32
-
msvc2008
|
win32
-
msvc2010
::
SOURCES
+=
src
/
ui
/
map3D
/
QGCGoogleEarthView
.
cc
...
...
src/ui/map3D/GlobalViewParams.cc
View file @
4e847909
...
@@ -72,6 +72,18 @@ GlobalViewParams::frame(void) const
...
@@ -72,6 +72,18 @@ GlobalViewParams::frame(void) const
return
mFrame
;
return
mFrame
;
}
}
QVector4D
&
GlobalViewParams
::
terrainOffset
(
void
)
{
return
mTerrainOffset
;
}
QVector4D
GlobalViewParams
::
terrainOffset
(
void
)
const
{
return
mTerrainOffset
;
}
void
void
GlobalViewParams
::
followCameraChanged
(
const
QString
&
text
)
GlobalViewParams
::
followCameraChanged
(
const
QString
&
text
)
{
{
...
...
src/ui/map3D/GlobalViewParams.h
View file @
4e847909
...
@@ -3,7 +3,7 @@
...
@@ -3,7 +3,7 @@
#include <QObject>
#include <QObject>
#include <QString>
#include <QString>
#include <QVector>
#include <QVector
4D
>
#include "QGCMAVLink.h"
#include "QGCMAVLink.h"
#include "Imagery.h"
#include "Imagery.h"
...
@@ -30,6 +30,9 @@ public:
...
@@ -30,6 +30,9 @@ public:
MAV_FRAME
&
frame
(
void
);
MAV_FRAME
&
frame
(
void
);
MAV_FRAME
frame
(
void
)
const
;
MAV_FRAME
frame
(
void
)
const
;
QVector4D
&
terrainOffset
(
void
);
QVector4D
terrainOffset
(
void
)
const
;
public
slots
:
public
slots
:
void
followCameraChanged
(
const
QString
&
text
);
void
followCameraChanged
(
const
QString
&
text
);
void
frameChanged
(
const
QString
&
text
);
void
frameChanged
(
const
QString
&
text
);
...
@@ -46,6 +49,7 @@ private:
...
@@ -46,6 +49,7 @@ private:
Imagery
::
Type
mImageryType
;
Imagery
::
Type
mImageryType
;
int
mFollowCameraId
;
int
mFollowCameraId
;
MAV_FRAME
mFrame
;
MAV_FRAME
mFrame
;
QVector4D
mTerrainOffset
;
};
};
typedef
QSharedPointer
<
GlobalViewParams
>
GlobalViewParamsPtr
;
typedef
QSharedPointer
<
GlobalViewParams
>
GlobalViewParamsPtr
;
...
...
src/ui/map3D/Pixhawk3DWidget.cc
View file @
4e847909
...
@@ -41,6 +41,7 @@
...
@@ -41,6 +41,7 @@
#include "../MainWindow.h"
#include "../MainWindow.h"
#include "PixhawkCheetahGeode.h"
#include "PixhawkCheetahGeode.h"
#include "TerrainParamDialog.h"
#include "UASManager.h"
#include "UASManager.h"
#include "QGC.h"
#include "QGC.h"
...
@@ -73,6 +74,9 @@ Pixhawk3DWidget::Pixhawk3DWidget(QWidget* parent)
...
@@ -73,6 +74,9 @@ Pixhawk3DWidget::Pixhawk3DWidget(QWidget* parent)
mWorldGridNode
=
createWorldGrid
();
mWorldGridNode
=
createWorldGrid
();
m3DWidget
->
worldMap
()
->
addChild
(
mWorldGridNode
,
false
);
m3DWidget
->
worldMap
()
->
addChild
(
mWorldGridNode
,
false
);
mTerrainPAT
=
new
osg
::
PositionAttitudeTransform
;
m3DWidget
->
worldMap
()
->
addChild
(
mTerrainPAT
);
// generate map model
// generate map model
mImageryNode
=
createImagery
();
mImageryNode
=
createImagery
();
m3DWidget
->
worldMap
()
->
addChild
(
mImageryNode
,
false
);
m3DWidget
->
worldMap
()
->
addChild
(
mImageryNode
,
false
);
...
@@ -403,6 +407,19 @@ Pixhawk3DWidget::clearData(void)
...
@@ -403,6 +407,19 @@ Pixhawk3DWidget::clearData(void)
}
}
}
}
void
Pixhawk3DWidget
::
showTerrainParamWindow
(
void
)
{
TerrainParamDialog
::
getTerrainParams
(
mGlobalViewParams
);
const
QVector4D
&
terrainOffset
=
mGlobalViewParams
->
terrainOffset
();
mTerrainPAT
->
setPosition
(
osg
::
Vec3d
(
terrainOffset
.
y
(),
terrainOffset
.
x
(),
-
terrainOffset
.
z
()));
mTerrainPAT
->
setAttitude
(
osg
::
Quat
(
M_PI_2
-
terrainOffset
.
w
(),
osg
::
Vec3d
(
0.0
f
,
0.0
f
,
1.0
f
),
0.0
,
osg
::
Vec3d
(
1.0
f
,
0.0
f
,
0.0
f
),
0.0
,
osg
::
Vec3d
(
0.0
f
,
1.0
f
,
0.0
f
)));
}
void
void
Pixhawk3DWidget
::
showViewParamWindow
(
void
)
Pixhawk3DWidget
::
showViewParamWindow
(
void
)
{
{
...
@@ -507,10 +524,18 @@ Pixhawk3DWidget::loadTerrainModel(void)
...
@@ -507,10 +524,18 @@ Pixhawk3DWidget::loadTerrainModel(void)
{
{
if
(
mTerrainNode
.
get
())
if
(
mTerrainNode
.
get
())
{
{
m
3DWidget
->
worldMap
()
->
removeChild
(
mTerrainNode
);
m
TerrainPAT
->
removeChild
(
mTerrainNode
);
}
}
mTerrainNode
=
node
;
mTerrainNode
=
node
;
m3DWidget
->
worldMap
()
->
addChild
(
mTerrainNode
);
mTerrainNode
->
setName
(
"terrain"
);
mTerrainPAT
->
addChild
(
mTerrainNode
);
mGlobalViewParams
->
terrainOffset
()
=
QVector4D
();
mTerrainPAT
->
setPosition
(
osg
::
Vec3d
(
0.0
,
0.0
,
0.0
));
mTerrainPAT
->
setAttitude
(
osg
::
Quat
(
M_PI_2
,
osg
::
Vec3d
(
0.0
f
,
0.0
f
,
1.0
f
),
0.0
,
osg
::
Vec3d
(
1.0
f
,
0.0
f
,
0.0
f
),
0.0
,
osg
::
Vec3d
(
0.0
f
,
1.0
f
,
0.0
f
)));
}
}
else
else
{
{
...
@@ -835,7 +860,7 @@ Pixhawk3DWidget::update(void)
...
@@ -835,7 +860,7 @@ Pixhawk3DWidget::update(void)
MAV_FRAME
frame
=
mGlobalViewParams
->
frame
();
MAV_FRAME
frame
=
mGlobalViewParams
->
frame
();
// set node visibility
// set node visibility
m3DWidget
->
worldMap
()
->
setChildValue
(
mTerrain
Node
,
m3DWidget
->
worldMap
()
->
setChildValue
(
mTerrain
PAT
,
mGlobalViewParams
->
displayTerrain
());
mGlobalViewParams
->
displayTerrain
());
m3DWidget
->
worldMap
()
->
setChildValue
(
mWorldGridNode
,
m3DWidget
->
worldMap
()
->
setChildValue
(
mWorldGridNode
,
mGlobalViewParams
->
displayWorldGrid
());
mGlobalViewParams
->
displayWorldGrid
());
...
@@ -1169,6 +1194,16 @@ Pixhawk3DWidget::mousePressEvent(QMouseEvent* event)
...
@@ -1169,6 +1194,16 @@ Pixhawk3DWidget::mousePressEvent(QMouseEvent* event)
return
;
return
;
}
}
}
}
else
if
(
event
->
button
()
==
Qt
::
RightButton
)
{
if
(
findTerrain
(
event
->
pos
()))
{
showTerrainMenu
(
event
->
globalPos
());
event
->
accept
();
}
}
m3DWidget
->
handleMousePressEvent
(
event
);
m3DWidget
->
handleMousePressEvent
(
event
);
}
}
...
@@ -2261,6 +2296,7 @@ Pixhawk3DWidget::findWaypoint(const QPoint& mousePos)
...
@@ -2261,6 +2296,7 @@ Pixhawk3DWidget::findWaypoint(const QPoint& mousePos)
return
-
1
;
return
-
1
;
}
}
bool
bool
Pixhawk3DWidget
::
findTarget
(
int
mouseX
,
int
mouseY
)
Pixhawk3DWidget
::
findTarget
(
int
mouseX
,
int
mouseY
)
{
{
...
@@ -2288,6 +2324,41 @@ Pixhawk3DWidget::findTarget(int mouseX, int mouseY)
...
@@ -2288,6 +2324,41 @@ Pixhawk3DWidget::findTarget(int mouseX, int mouseY)
return
false
;
return
false
;
}
}
bool
Pixhawk3DWidget
::
findTerrain
(
const
QPoint
&
mousePos
)
{
if
(
!
m3DWidget
->
getSceneData
()
||
!
mActiveUAS
)
{
return
-
1
;
}
osgUtil
::
LineSegmentIntersector
::
Intersections
intersections
;
QPoint
widgetMousePos
=
m3DWidget
->
mapFromParent
(
mousePos
);
if
(
m3DWidget
->
computeIntersections
(
widgetMousePos
.
x
(),
m3DWidget
->
height
()
-
widgetMousePos
.
y
(),
intersections
))
{
for
(
osgUtil
::
LineSegmentIntersector
::
Intersections
::
iterator
it
=
intersections
.
begin
();
it
!=
intersections
.
end
();
it
++
)
{
for
(
uint
i
=
0
;
i
<
it
->
nodePath
.
size
();
++
i
)
{
osg
::
Node
*
node
=
it
->
nodePath
[
i
];
std
::
string
nodeName
=
node
->
getName
();
if
(
nodeName
.
compare
(
"terrain"
)
==
0
)
{
return
true
;
}
}
}
}
return
false
;
}
void
void
Pixhawk3DWidget
::
showInsertWaypointMenu
(
const
QPoint
&
cursorPos
)
Pixhawk3DWidget
::
showInsertWaypointMenu
(
const
QPoint
&
cursorPos
)
{
{
...
@@ -2319,3 +2390,11 @@ Pixhawk3DWidget::showEditWaypointMenu(const QPoint &cursorPos)
...
@@ -2319,3 +2390,11 @@ Pixhawk3DWidget::showEditWaypointMenu(const QPoint &cursorPos)
menu
.
addAction
(
"Clear all waypoints"
,
this
,
SLOT
(
clearAllWaypoints
()));
menu
.
addAction
(
"Clear all waypoints"
,
this
,
SLOT
(
clearAllWaypoints
()));
menu
.
exec
(
cursorPos
);
menu
.
exec
(
cursorPos
);
}
}
void
Pixhawk3DWidget
::
showTerrainMenu
(
const
QPoint
&
cursorPos
)
{
QMenu
menu
;
menu
.
addAction
(
"Edit terrain parameters"
,
this
,
SLOT
(
showTerrainParamWindow
()));
menu
.
exec
(
cursorPos
);
}
src/ui/map3D/Pixhawk3DWidget.h
View file @
4e847909
...
@@ -67,6 +67,7 @@ signals:
...
@@ -67,6 +67,7 @@ signals:
private
slots
:
private
slots
:
void
clearData
(
void
);
void
clearData
(
void
);
void
showTerrainParamWindow
(
void
);
void
showViewParamWindow
(
void
);
void
showViewParamWindow
(
void
);
void
followCameraChanged
(
int
systemId
);
void
followCameraChanged
(
int
systemId
);
void
recenterActiveCamera
(
void
);
void
recenterActiveCamera
(
void
);
...
@@ -168,8 +169,10 @@ private:
...
@@ -168,8 +169,10 @@ private:
int
findWaypoint
(
const
QPoint
&
mousePos
);
int
findWaypoint
(
const
QPoint
&
mousePos
);
bool
findTarget
(
int
mouseX
,
int
mouseY
);
bool
findTarget
(
int
mouseX
,
int
mouseY
);
bool
findTerrain
(
const
QPoint
&
mousePos
);
void
showInsertWaypointMenu
(
const
QPoint
&
cursorPos
);
void
showInsertWaypointMenu
(
const
QPoint
&
cursorPos
);
void
showEditWaypointMenu
(
const
QPoint
&
cursorPos
);
void
showEditWaypointMenu
(
const
QPoint
&
cursorPos
);
void
showTerrainMenu
(
const
QPoint
&
cursorPos
);
const
qreal
kMessageTimeout
;
// message timeout in seconds
const
qreal
kMessageTimeout
;
// message timeout in seconds
...
@@ -198,6 +201,7 @@ private:
...
@@ -198,6 +201,7 @@ private:
osg
::
ref_ptr
<
HUDScaleGeode
>
mScaleGeode
;
osg
::
ref_ptr
<
HUDScaleGeode
>
mScaleGeode
;
osg
::
ref_ptr
<
osgText
::
Text
>
mStatusText
;
osg
::
ref_ptr
<
osgText
::
Text
>
mStatusText
;
osg
::
ref_ptr
<
osg
::
Node
>
mTerrainNode
;
osg
::
ref_ptr
<
osg
::
Node
>
mTerrainNode
;
osg
::
ref_ptr
<
osg
::
PositionAttitudeTransform
>
mTerrainPAT
;
osg
::
ref_ptr
<
osg
::
Geode
>
mWorldGridNode
;
osg
::
ref_ptr
<
osg
::
Geode
>
mWorldGridNode
;
QPoint
mCachedMousePos
;
QPoint
mCachedMousePos
;
...
...
src/ui/map3D/TerrainParamDialog.cc
0 → 100644
View file @
4e847909
#include "TerrainParamDialog.h"
#include <QFormLayout>
#include <QGroupBox>
#include <QPushButton>
TerrainParamDialog
::
TerrainParamDialog
(
QWidget
*
parent
)
:
QDialog
(
parent
)
{
QVBoxLayout
*
layout
=
new
QVBoxLayout
;
setLayout
(
layout
);
setWindowTitle
(
tr
(
"Terrain Parameters"
));
setModal
(
true
);
buildLayout
(
layout
);
}
void
TerrainParamDialog
::
getTerrainParams
(
GlobalViewParamsPtr
&
globalViewParams
)
{
QVector4D
&
terrainOffset
=
globalViewParams
->
terrainOffset
();
TerrainParamDialog
dialog
;
dialog
.
mXOffsetSpinBox
->
setValue
(
terrainOffset
.
x
());
dialog
.
mYOffsetSpinBox
->
setValue
(
terrainOffset
.
y
());
dialog
.
mZOffsetSpinBox
->
setValue
(
terrainOffset
.
z
());
dialog
.
mYawOffsetSpinBox
->
setValue
(
osg
::
RadiansToDegrees
(
terrainOffset
.
w
()));
if
(
dialog
.
exec
()
==
QDialog
::
Accepted
)
{
terrainOffset
.
setX
(
dialog
.
mXOffsetSpinBox
->
value
());
terrainOffset
.
setY
(
dialog
.
mYOffsetSpinBox
->
value
());
terrainOffset
.
setZ
(
dialog
.
mZOffsetSpinBox
->
value
());
terrainOffset
.
setW
(
osg
::
DegreesToRadians
(
dialog
.
mYawOffsetSpinBox
->
value
()));
}
}
void
TerrainParamDialog
::
closeWithSaving
(
void
)
{
done
(
QDialog
::
Accepted
);
}
void
TerrainParamDialog
::
closeWithoutSaving
(
void
)
{
done
(
QDialog
::
Rejected
);
}
void
TerrainParamDialog
::
buildLayout
(
QVBoxLayout
*
layout
)
{
QGroupBox
*
offsetGroupBox
=
new
QGroupBox
(
tr
(
"Offset"
),
this
);
mXOffsetSpinBox
=
new
QDoubleSpinBox
(
this
);
mXOffsetSpinBox
->
setDecimals
(
1
);
mXOffsetSpinBox
->
setRange
(
-
100.0
,
100.0
);
mXOffsetSpinBox
->
setValue
(
0.0
);
mYOffsetSpinBox
=
new
QDoubleSpinBox
(
this
);
mYOffsetSpinBox
->
setDecimals
(
1
);
mYOffsetSpinBox
->
setRange
(
-
100.0
,
100.0
);
mYOffsetSpinBox
->
setValue
(
0.0
);
mZOffsetSpinBox
=
new
QDoubleSpinBox
(
this
);
mZOffsetSpinBox
->
setDecimals
(
1
);
mZOffsetSpinBox
->
setRange
(
-
100.0
,
100.0
);
mZOffsetSpinBox
->
setValue
(
0.0
);
mYawOffsetSpinBox
=
new
QDoubleSpinBox
(
this
);
mYawOffsetSpinBox
->
setDecimals
(
0
);
mYawOffsetSpinBox
->
setRange
(
-
180.0
,
180.0
);
mYawOffsetSpinBox
->
setValue
(
0.0
);
QFormLayout
*
formLayout
=
new
QFormLayout
;
formLayout
->
addRow
(
tr
(
"x (m)"
),
mXOffsetSpinBox
);
formLayout
->
addRow
(
tr
(
"y (m)"
),
mYOffsetSpinBox
);
formLayout
->
addRow
(
tr
(
"z (m)"
),
mZOffsetSpinBox
);
formLayout
->
addRow
(
tr
(
"Yaw (deg)"
),
mYawOffsetSpinBox
);
offsetGroupBox
->
setLayout
(
formLayout
);
layout
->
addWidget
(
offsetGroupBox
);
layout
->
addItem
(
new
QSpacerItem
(
10
,
0
,
QSizePolicy
::
Expanding
,
QSizePolicy
::
Expanding
));
QPushButton
*
cancelButton
=
new
QPushButton
(
this
);
cancelButton
->
setText
(
"Cancel"
);
QPushButton
*
saveButton
=
new
QPushButton
(
this
);
saveButton
->
setText
(
"Save"
);
QHBoxLayout
*
buttonLayout
=
new
QHBoxLayout
;
buttonLayout
->
addWidget
(
cancelButton
);
buttonLayout
->
addItem
(
new
QSpacerItem
(
10
,
0
,
QSizePolicy
::
Expanding
,
QSizePolicy
::
Expanding
));
buttonLayout
->
addWidget
(
saveButton
);
layout
->
addLayout
(
buttonLayout
);
connect
(
cancelButton
,
SIGNAL
(
clicked
()),
this
,
SLOT
(
closeWithoutSaving
()));
connect
(
saveButton
,
SIGNAL
(
clicked
()),
this
,
SLOT
(
closeWithSaving
()));
}
src/ui/map3D/TerrainParamDialog.h
0 → 100644
View file @
4e847909
#ifndef TERRAINPARAMDIALOG_H
#define TERRAINPARAMDIALOG_H
#include <QDoubleSpinBox>
#include <QDialog>
#include <QVBoxLayout>
#include "GlobalViewParams.h"
class
TerrainParamDialog
:
public
QDialog
{
Q_OBJECT
public:
TerrainParamDialog
(
QWidget
*
parent
=
0
);
static
void
getTerrainParams
(
GlobalViewParamsPtr
&
globalViewParams
);
private
slots
:
void
closeWithSaving
(
void
);
void
closeWithoutSaving
(
void
);
private:
void
buildLayout
(
QVBoxLayout
*
layout
);
QDoubleSpinBox
*
mXOffsetSpinBox
;
QDoubleSpinBox
*
mYOffsetSpinBox
;
QDoubleSpinBox
*
mZOffsetSpinBox
;
QDoubleSpinBox
*
mYawOffsetSpinBox
;
};
#endif // TERRAINPARAMDIALOG_H
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment