Skip to content

Commit 82f608e

Browse files
committedSep 15, 2017
GUI for 3D point symbols
1 parent 418dc07 commit 82f608e

10 files changed

+535
-17
lines changed
 

‎src/3d/abstract3dsymbol.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ void Polygon3DSymbol::readXml( const QDomElement &elem )
4848
// ---------------
4949

5050
Point3DSymbol::Point3DSymbol()
51-
: height( 0 )
5251
{
5352
}
5453

@@ -61,10 +60,6 @@ void Point3DSymbol::writeXml( QDomElement &elem ) const
6160
{
6261
QDomDocument doc = elem.ownerDocument();
6362

64-
QDomElement elemDataProperties = doc.createElement( "data" );
65-
elemDataProperties.setAttribute( "height", height );
66-
elem.appendChild( elemDataProperties );
67-
6863
QDomElement elemMaterial = doc.createElement( "material" );
6964
material.writeXml( elemMaterial );
7065
elem.appendChild( elemMaterial );
@@ -80,9 +75,6 @@ void Point3DSymbol::writeXml( QDomElement &elem ) const
8075

8176
void Point3DSymbol::readXml( const QDomElement &elem )
8277
{
83-
QDomElement elemDataProperties = elem.firstChildElement( "data" );
84-
height = elemDataProperties.attribute( "height" ).toFloat();
85-
8678
QDomElement elemMaterial = elem.firstChildElement( "material" );
8779
material.readXml( elemMaterial );
8880

‎src/3d/abstract3dsymbol.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ class _3D_EXPORT Point3DSymbol : public Abstract3DSymbol
5454
void writeXml( QDomElement &elem ) const override;
5555
void readXml( const QDomElement &elem ) override;
5656

57-
float height;
5857
PhongMaterialSettings material; //!< Defines appearance of objects
5958
QVariantMap shapeProperties; //!< What kind of shape to use and what
6059
QMatrix4x4 transform; //!< Transform of individual instanced models

‎src/3d/pointentity.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ PointEntity::PointEntity( const Map3D &map, QgsVectorLayer *layer, const Point3D
5454
QgsPoint *pt = static_cast<QgsPoint *>( g );
5555
// TODO: use Z coordinates if the point is 3D
5656
float h = map.terrainGenerator()->heightAt( pt->x(), pt->y(), map ) * map.zExaggeration;
57-
positions.append( QVector3D( pt->x() - map.originX, h + symbol.height, -( pt->y() - map.originY ) ) );
57+
positions.append( QVector3D( pt->x() - map.originX, h, -( pt->y() - map.originY ) ) );
5858
//qDebug() << positions.last();
5959
}
6060
else

‎src/3d/testapp/main.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,13 +141,12 @@ int main( int argc, char *argv[] )
141141
pointSymbol->material.setDiffuse( QColor( 222, 184, 135 ) );
142142
pointSymbol->material.setAmbient( pointSymbol->material.diffuse().darker() );
143143
pointSymbol->material.setShininess( 0 );
144-
pointSymbol->height = 2.5;
145144
pointSymbol->shapeProperties["shape"] = "cylinder";
146145
pointSymbol->shapeProperties["radius"] = 1;
147146
pointSymbol->shapeProperties["length"] = 5;
148-
//Qt3DCore::QTransform tr;
149-
//tr.setScale3D(QVector3D(4,1,4));
150-
//pointSymbol->transform = tr.matrix();
147+
Qt3DCore::QTransform tr;
148+
tr.setTranslation( QVector3D( 0, 2.5, 0 ) );
149+
pointSymbol->transform = tr.matrix();
151150
VectorLayer3DRenderer *ptr = new VectorLayer3DRenderer( pointSymbol );
152151
ptr->setLayer( vlPoints );
153152
map.renderers << ptr;
@@ -156,9 +155,11 @@ int main( int argc, char *argv[] )
156155
pointSymbol2->material.setDiffuse( QColor( 60, 179, 113 ) );
157156
pointSymbol2->material.setAmbient( pointSymbol2->material.diffuse().darker() );
158157
pointSymbol2->material.setShininess( 0 );
159-
pointSymbol2->height = 7.5;
160158
pointSymbol2->shapeProperties["shape"] = "sphere";
161159
pointSymbol2->shapeProperties["radius"] = 3.5;
160+
Qt3DCore::QTransform tr2;
161+
tr2.setTranslation( QVector3D( 0, 7.5, 0 ) );
162+
pointSymbol2->transform = tr2.matrix();
162163
VectorLayer3DRenderer *ptr2 = new VectorLayer3DRenderer( pointSymbol2 );
163164
ptr2->setLayer( vlPoints );
164165
map.renderers << ptr2;

‎src/app/3d/qgspoint3dsymbolwidget.cpp

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
#include "qgspoint3dsymbolwidget.h"
2+
3+
#include "abstract3dsymbol.h"
4+
5+
QgsPoint3DSymbolWidget::QgsPoint3DSymbolWidget( QWidget *parent )
6+
: QWidget( parent )
7+
{
8+
setupUi( this );
9+
10+
cboShape->addItem( tr( "Sphere" ), "sphere" );
11+
cboShape->addItem( tr( "Cylinder" ), "cylinder" );
12+
cboShape->addItem( tr( "Cube" ), "cube" );
13+
cboShape->addItem( tr( "Cone" ), "cone" );
14+
cboShape->addItem( tr( "Plane" ), "plane" );
15+
cboShape->addItem( tr( "Torus" ), "torus" );
16+
17+
setSymbol( Point3DSymbol() );
18+
onShapeChanged();
19+
20+
connect( cboShape, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsPoint3DSymbolWidget::onShapeChanged );
21+
QList<QDoubleSpinBox *> spinWidgets;
22+
spinWidgets << spinRadius << spinTopRadius << spinBottomRadius << spinMinorRadius << spinSize << spinLength;
23+
spinWidgets << spinTX << spinTY << spinTZ << spinSX << spinSY << spinSZ << spinRX << spinRY << spinRZ;
24+
Q_FOREACH ( QDoubleSpinBox *spinBox, spinWidgets )
25+
connect( spinBox, static_cast<void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsPoint3DSymbolWidget::changed );
26+
connect( widgetMaterial, &QgsPhongMaterialWidget::changed, this, &QgsPoint3DSymbolWidget::changed );
27+
}
28+
29+
void QgsPoint3DSymbolWidget::setSymbol( const Point3DSymbol &symbol )
30+
{
31+
QVariantMap vm = symbol.shapeProperties;
32+
int index = cboShape->findData( vm["shape"] );
33+
cboShape->setCurrentIndex( index != -1 ? index : 1 ); // use cylinder by default if shape is not set
34+
35+
switch ( cboShape->currentIndex() )
36+
{
37+
case 0: // sphere
38+
spinRadius->setValue( vm["radius"].toDouble() );
39+
break;
40+
case 1: // cylinder
41+
spinRadius->setValue( vm["radius"].toDouble() );
42+
spinLength->setValue( vm["length"].toDouble() );
43+
break;
44+
case 2: // cube
45+
spinSize->setValue( vm["size"].toDouble() );
46+
break;
47+
case 3: // cone
48+
spinTopRadius->setValue( vm["topRadius"].toDouble() );
49+
spinBottomRadius->setValue( vm["bottomRadius"].toDouble() );
50+
spinLength->setValue( vm["length"].toDouble() );
51+
break;
52+
case 4: // plane
53+
spinSize->setValue( vm["size"].toDouble() );
54+
break;
55+
case 5: // torus
56+
spinRadius->setValue( vm["radius"].toDouble() );
57+
spinMinorRadius->setValue( vm["minorRadius"].toDouble() );
58+
break;
59+
}
60+
61+
widgetMaterial->setMaterial( symbol.material );
62+
63+
// decompose the transform matrix
64+
// assuming the last row has values [0 0 0 1]
65+
// see https://math.stackexchange.com/questions/237369/given-this-transformation-matrix-how-do-i-decompose-it-into-translation-rotati
66+
QMatrix4x4 m = symbol.transform;
67+
float *md = m.data(); // returns data in column-major order
68+
float sx = QVector3D( md[0], md[1], md[2] ).length();
69+
float sy = QVector3D( md[4], md[5], md[6] ).length();
70+
float sz = QVector3D( md[8], md[9], md[10] ).length();
71+
float rd[9] =
72+
{
73+
md[0] / sx, md[4] / sy, md[8] / sz,
74+
md[1] / sx, md[5] / sy, md[9] / sz,
75+
md[2] / sx, md[6] / sy, md[10] / sz,
76+
};
77+
QMatrix3x3 rot3x3( rd ); // takes data in row-major order
78+
QVector3D rot = QQuaternion::fromRotationMatrix( rot3x3 ).toEulerAngles();
79+
80+
spinTX->setValue( md[12] );
81+
spinTY->setValue( md[13] );
82+
spinTZ->setValue( md[14] );
83+
spinSX->setValue( sx );
84+
spinSY->setValue( sy );
85+
spinSZ->setValue( sz );
86+
spinRX->setValue( rot.x() );
87+
spinRY->setValue( rot.y() );
88+
spinRZ->setValue( rot.z() );
89+
}
90+
91+
Point3DSymbol QgsPoint3DSymbolWidget::symbol() const
92+
{
93+
QVariantMap vm;
94+
vm["shape"] = cboShape->itemData( cboShape->currentIndex() );
95+
96+
switch ( cboShape->currentIndex() )
97+
{
98+
case 0: // sphere
99+
vm["radius"] = spinRadius->value();
100+
break;
101+
case 1: // cylinder
102+
vm["radius"] = spinRadius->value();
103+
vm["length"] = spinLength->value();
104+
break;
105+
case 2: // cube
106+
vm["size"] = spinSize->value();
107+
break;
108+
case 3: // cone
109+
vm["topRadius"] = spinTopRadius->value();
110+
vm["bottomRadius"] = spinBottomRadius->value();
111+
vm["length"] = spinLength->value();
112+
break;
113+
case 4: // plane
114+
vm["size"] = spinSize->value();
115+
break;
116+
case 5: // torus
117+
vm["radius"] = spinRadius->value();
118+
vm["minorRadius"] = spinMinorRadius->value();
119+
break;
120+
}
121+
122+
QQuaternion rot( QQuaternion::fromEulerAngles( spinRX->value(), spinRY->value(), spinRZ->value() ) );
123+
QVector3D sca( spinSX->value(), spinSY->value(), spinSZ->value() );
124+
QVector3D tra( spinTX->value(), spinTY->value(), spinTZ->value() );
125+
126+
QMatrix4x4 tr;
127+
tr.translate( tra );
128+
tr.scale( sca );
129+
tr.rotate( rot );
130+
131+
Point3DSymbol sym;
132+
sym.shapeProperties = vm;
133+
sym.material = widgetMaterial->material();
134+
sym.transform = tr;
135+
return sym;
136+
}
137+
138+
void QgsPoint3DSymbolWidget::onShapeChanged()
139+
{
140+
QList<QWidget *> allWidgets;
141+
allWidgets << labelSize << spinSize
142+
<< labelRadius << spinRadius
143+
<< labelMinorRadius << spinMinorRadius
144+
<< labelTopRadius << spinTopRadius
145+
<< labelBottomRadius << spinBottomRadius
146+
<< labelLength << spinLength;
147+
148+
QList<QWidget *> activeWidgets;
149+
switch ( cboShape->currentIndex() )
150+
{
151+
case 0: // sphere
152+
activeWidgets << labelRadius << spinRadius;
153+
break;
154+
case 1: // cylinder
155+
activeWidgets << labelRadius << spinRadius << labelLength << spinLength;
156+
break;
157+
case 2: // cube
158+
activeWidgets << labelSize << spinSize;
159+
break;
160+
case 3: // cone
161+
activeWidgets << labelTopRadius << spinTopRadius << labelBottomRadius << spinBottomRadius << labelLength << spinLength;
162+
break;
163+
case 4: // plane
164+
activeWidgets << labelSize << spinSize;
165+
break;
166+
case 5: // torus
167+
activeWidgets << labelRadius << spinRadius << labelMinorRadius << spinMinorRadius;
168+
break;
169+
}
170+
171+
Q_FOREACH ( QWidget *w, allWidgets )
172+
{
173+
w->setVisible( activeWidgets.contains( w ) );
174+
}
175+
176+
emit changed();
177+
}

‎src/app/3d/qgspoint3dsymbolwidget.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#ifndef QGSPOINT3DSYMBOLWIDGET_H
2+
#define QGSPOINT3DSYMBOLWIDGET_H
3+
4+
#include <QWidget>
5+
6+
#include "ui_point3dsymbolwidget.h"
7+
8+
class Point3DSymbol;
9+
10+
//! A widget for configuration of 3D symbol for points
11+
class QgsPoint3DSymbolWidget : public QWidget, private Ui::Point3DSymbolWidget
12+
{
13+
Q_OBJECT
14+
public:
15+
explicit QgsPoint3DSymbolWidget( QWidget *parent = nullptr );
16+
17+
void setSymbol( const Point3DSymbol &symbol );
18+
Point3DSymbol symbol() const;
19+
20+
signals:
21+
void changed();
22+
23+
private slots:
24+
void onShapeChanged();
25+
};
26+
27+
#endif // QGSPOINT3DSYMBOLWIDGET_H

‎src/app/3d/qgsvectorlayer3drendererwidget.cpp

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include "abstract3dsymbol.h"
44
#include "qgsline3dsymbolwidget.h"
5+
#include "qgspoint3dsymbolwidget.h"
56
#include "qgspolygon3dsymbolwidget.h"
67
#include "vectorlayer3drenderer.h"
78

@@ -24,14 +25,17 @@ QgsVectorLayer3DRendererWidget::QgsVectorLayer3DRendererWidget( QgsVectorLayer *
2425

2526
widgetUnsupported = new QLabel( tr( "Sorry, this layer is not supported." ), this );
2627
widgetLine = new QgsLine3DSymbolWidget( this );
28+
widgetPoint = new QgsPoint3DSymbolWidget( this );
2729
widgetPolygon = new QgsPolygon3DSymbolWidget( this );
2830

2931
widgetStack->addWidget( widgetUnsupported );
3032
widgetStack->addWidget( widgetLine );
33+
widgetStack->addWidget( widgetPoint );
3134
widgetStack->addWidget( widgetPolygon );
3235

3336
connect( chkEnabled, &QCheckBox::clicked, this, &QgsVectorLayer3DRendererWidget::onEnabledClicked );
3437
connect( widgetLine, &QgsLine3DSymbolWidget::changed, this, &QgsVectorLayer3DRendererWidget::widgetChanged );
38+
connect( widgetPoint, &QgsPoint3DSymbolWidget::changed, this, &QgsVectorLayer3DRendererWidget::widgetChanged );
3539
connect( widgetPolygon, &QgsPolygon3DSymbolWidget::changed, this, &QgsVectorLayer3DRendererWidget::widgetChanged );
3640
}
3741

@@ -61,12 +65,25 @@ void QgsVectorLayer3DRendererWidget::setRenderer( const VectorLayer3DRenderer *r
6165

6266
whileBlocking( chkEnabled )->setChecked( ( bool )mRenderer );
6367
widgetLine->setEnabled( chkEnabled->isChecked() );
68+
widgetPoint->setEnabled( chkEnabled->isChecked() );
6469
widgetPolygon->setEnabled( chkEnabled->isChecked() );
6570

6671
int pageIndex;
6772
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mLayer );
6873
switch ( vlayer->geometryType() )
6974
{
75+
case QgsWkbTypes::PointGeometry:
76+
pageIndex = 2;
77+
if ( mRenderer && mRenderer->symbol() && mRenderer->symbol()->type() == "point" )
78+
{
79+
whileBlocking( widgetPoint )->setSymbol( *static_cast<const Point3DSymbol *>( mRenderer->symbol() ) );
80+
}
81+
else
82+
{
83+
whileBlocking( widgetPoint )->setSymbol( Point3DSymbol() );
84+
}
85+
break;
86+
7087
case QgsWkbTypes::LineGeometry:
7188
pageIndex = 1;
7289
if ( mRenderer && mRenderer->symbol() && mRenderer->symbol()->type() == "line" )
@@ -80,7 +97,7 @@ void QgsVectorLayer3DRendererWidget::setRenderer( const VectorLayer3DRenderer *r
8097
break;
8198

8299
case QgsWkbTypes::PolygonGeometry:
83-
pageIndex = 2;
100+
pageIndex = 3;
84101
if ( mRenderer && mRenderer->symbol() && mRenderer->symbol()->type() == "polygon" )
85102
{
86103
whileBlocking( widgetPolygon )->setSymbol( *static_cast<const Polygon3DSymbol *>( mRenderer->symbol() ) );
@@ -103,11 +120,13 @@ VectorLayer3DRenderer *QgsVectorLayer3DRendererWidget::renderer()
103120
if ( chkEnabled->isChecked() )
104121
{
105122
int pageIndex = widgetStack->currentIndex();
106-
if ( pageIndex == 1 || pageIndex == 2 )
123+
if ( pageIndex == 1 || pageIndex == 2 || pageIndex == 3 )
107124
{
108125
Abstract3DSymbol *sym;
109126
if ( pageIndex == 1 )
110127
sym = new Line3DSymbol( widgetLine->symbol() );
128+
else if ( pageIndex == 2 )
129+
sym = new Point3DSymbol( widgetPoint->symbol() );
111130
else
112131
sym = new Polygon3DSymbol( widgetPolygon->symbol() );
113132
VectorLayer3DRenderer *r = new VectorLayer3DRenderer( sym );
@@ -136,6 +155,7 @@ void QgsVectorLayer3DRendererWidget::apply()
136155
void QgsVectorLayer3DRendererWidget::onEnabledClicked()
137156
{
138157
widgetLine->setEnabled( chkEnabled->isChecked() );
158+
widgetPoint->setEnabled( chkEnabled->isChecked() );
139159
widgetPolygon->setEnabled( chkEnabled->isChecked() );
140160
emit widgetChanged();
141161
}

‎src/app/3d/qgsvectorlayer3drendererwidget.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class QLabel;
1010
class QStackedWidget;
1111

1212
class QgsLine3DSymbolWidget;
13+
class QgsPoint3DSymbolWidget;
1314
class QgsPolygon3DSymbolWidget;
1415
class QgsVectorLayer;
1516
class QgsMapCanvas;
@@ -41,6 +42,7 @@ class QgsVectorLayer3DRendererWidget : public QgsMapLayerConfigWidget
4142
QCheckBox *chkEnabled;
4243
QStackedWidget *widgetStack;
4344
QgsLine3DSymbolWidget *widgetLine;
45+
QgsPoint3DSymbolWidget *widgetPoint;
4446
QgsPolygon3DSymbolWidget *widgetPolygon;
4547
QLabel *widgetUnsupported;
4648

‎src/app/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,7 @@ IF (WITH_3D)
371371
3d/qgs3dmapcanvasdockwidget.cpp
372372
3d/qgs3dmapconfigwidget.cpp
373373
3d/qgsline3dsymbolwidget.cpp
374+
3d/qgspoint3dsymbolwidget.cpp
374375
3d/qgspolygon3dsymbolwidget.cpp
375376
3d/qgsphongmaterialwidget.cpp
376377
3d/qgsvectorlayer3drendererwidget.cpp
@@ -382,6 +383,7 @@ IF (WITH_3D)
382383
3d/qgs3dmapcanvasdockwidget.h
383384
3d/qgs3dmapconfigwidget.h
384385
3d/qgsline3dsymbolwidget.h
386+
3d/qgspoint3dsymbolwidget.h
385387
3d/qgspolygon3dsymbolwidget.h
386388
3d/qgsphongmaterialwidget.h
387389
3d/qgsvectorlayer3drendererwidget.h

‎src/ui/3d/point3dsymbolwidget.ui

Lines changed: 298 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,298 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<ui version="4.0">
3+
<class>Point3DSymbolWidget</class>
4+
<widget class="QWidget" name="Point3DSymbolWidget">
5+
<property name="geometry">
6+
<rect>
7+
<x>0</x>
8+
<y>0</y>
9+
<width>573</width>
10+
<height>942</height>
11+
</rect>
12+
</property>
13+
<property name="windowTitle">
14+
<string>Form</string>
15+
</property>
16+
<layout class="QVBoxLayout" name="verticalLayout">
17+
<item>
18+
<layout class="QFormLayout" name="formLayout">
19+
<item row="0" column="0">
20+
<widget class="QLabel" name="label">
21+
<property name="text">
22+
<string>Shape</string>
23+
</property>
24+
</widget>
25+
</item>
26+
<item row="0" column="1">
27+
<widget class="QComboBox" name="cboShape"/>
28+
</item>
29+
<item row="1" column="0">
30+
<widget class="QLabel" name="labelRadius">
31+
<property name="text">
32+
<string>Radius</string>
33+
</property>
34+
</widget>
35+
</item>
36+
<item row="1" column="1">
37+
<widget class="QDoubleSpinBox" name="spinRadius">
38+
<property name="value">
39+
<double>10.000000000000000</double>
40+
</property>
41+
</widget>
42+
</item>
43+
<item row="2" column="0">
44+
<widget class="QLabel" name="labelMinorRadius">
45+
<property name="text">
46+
<string>Minor Radius</string>
47+
</property>
48+
</widget>
49+
</item>
50+
<item row="2" column="1">
51+
<widget class="QDoubleSpinBox" name="spinMinorRadius">
52+
<property name="value">
53+
<double>5.000000000000000</double>
54+
</property>
55+
</widget>
56+
</item>
57+
<item row="3" column="0">
58+
<widget class="QLabel" name="labelTopRadius">
59+
<property name="text">
60+
<string>Top Radius</string>
61+
</property>
62+
</widget>
63+
</item>
64+
<item row="3" column="1">
65+
<widget class="QDoubleSpinBox" name="spinTopRadius"/>
66+
</item>
67+
<item row="4" column="0">
68+
<widget class="QLabel" name="labelBottomRadius">
69+
<property name="text">
70+
<string>Bottom Radius</string>
71+
</property>
72+
</widget>
73+
</item>
74+
<item row="4" column="1">
75+
<widget class="QDoubleSpinBox" name="spinBottomRadius">
76+
<property name="value">
77+
<double>10.000000000000000</double>
78+
</property>
79+
</widget>
80+
</item>
81+
<item row="5" column="0">
82+
<widget class="QLabel" name="labelSize">
83+
<property name="text">
84+
<string>Size</string>
85+
</property>
86+
</widget>
87+
</item>
88+
<item row="5" column="1">
89+
<widget class="QDoubleSpinBox" name="spinSize">
90+
<property name="value">
91+
<double>10.000000000000000</double>
92+
</property>
93+
</widget>
94+
</item>
95+
<item row="6" column="0">
96+
<widget class="QLabel" name="labelLength">
97+
<property name="text">
98+
<string>Length</string>
99+
</property>
100+
</widget>
101+
</item>
102+
<item row="6" column="1">
103+
<widget class="QDoubleSpinBox" name="spinLength">
104+
<property name="value">
105+
<double>10.000000000000000</double>
106+
</property>
107+
</widget>
108+
</item>
109+
</layout>
110+
</item>
111+
<item>
112+
<widget class="Line" name="line">
113+
<property name="orientation">
114+
<enum>Qt::Horizontal</enum>
115+
</property>
116+
</widget>
117+
</item>
118+
<item>
119+
<widget class="QgsPhongMaterialWidget" name="widgetMaterial" native="true"/>
120+
</item>
121+
<item>
122+
<widget class="Line" name="line_2">
123+
<property name="orientation">
124+
<enum>Qt::Horizontal</enum>
125+
</property>
126+
</widget>
127+
</item>
128+
<item>
129+
<layout class="QGridLayout" name="gridLayout">
130+
<item row="0" column="1">
131+
<widget class="QLabel" name="label_5">
132+
<property name="text">
133+
<string>X</string>
134+
</property>
135+
<property name="alignment">
136+
<set>Qt::AlignCenter</set>
137+
</property>
138+
</widget>
139+
</item>
140+
<item row="0" column="2">
141+
<widget class="QLabel" name="label_6">
142+
<property name="text">
143+
<string>Y</string>
144+
</property>
145+
<property name="alignment">
146+
<set>Qt::AlignCenter</set>
147+
</property>
148+
</widget>
149+
</item>
150+
<item row="0" column="3">
151+
<widget class="QLabel" name="label_7">
152+
<property name="text">
153+
<string>Z</string>
154+
</property>
155+
<property name="alignment">
156+
<set>Qt::AlignCenter</set>
157+
</property>
158+
</widget>
159+
</item>
160+
<item row="1" column="0">
161+
<widget class="QLabel" name="label_2">
162+
<property name="text">
163+
<string>Translation</string>
164+
</property>
165+
</widget>
166+
</item>
167+
<item row="1" column="1">
168+
<widget class="QDoubleSpinBox" name="spinTX">
169+
<property name="minimum">
170+
<double>-99.900000000000006</double>
171+
</property>
172+
</widget>
173+
</item>
174+
<item row="1" column="2">
175+
<widget class="QDoubleSpinBox" name="spinTY">
176+
<property name="minimum">
177+
<double>-99.900000000000006</double>
178+
</property>
179+
</widget>
180+
</item>
181+
<item row="1" column="3">
182+
<widget class="QDoubleSpinBox" name="spinTZ">
183+
<property name="minimum">
184+
<double>-99.900000000000006</double>
185+
</property>
186+
</widget>
187+
</item>
188+
<item row="2" column="0">
189+
<widget class="QLabel" name="label_3">
190+
<property name="text">
191+
<string>Scale</string>
192+
</property>
193+
</widget>
194+
</item>
195+
<item row="2" column="1">
196+
<widget class="QDoubleSpinBox" name="spinSX">
197+
<property name="value">
198+
<double>1.000000000000000</double>
199+
</property>
200+
</widget>
201+
</item>
202+
<item row="2" column="2">
203+
<widget class="QDoubleSpinBox" name="spinSY">
204+
<property name="value">
205+
<double>1.000000000000000</double>
206+
</property>
207+
</widget>
208+
</item>
209+
<item row="2" column="3">
210+
<widget class="QDoubleSpinBox" name="spinSZ">
211+
<property name="value">
212+
<double>1.000000000000000</double>
213+
</property>
214+
</widget>
215+
</item>
216+
<item row="3" column="0">
217+
<widget class="QLabel" name="label_4">
218+
<property name="text">
219+
<string>Rotation</string>
220+
</property>
221+
</widget>
222+
</item>
223+
<item row="3" column="1">
224+
<widget class="QDoubleSpinBox" name="spinRX">
225+
<property name="decimals">
226+
<number>0</number>
227+
</property>
228+
<property name="maximum">
229+
<double>360.000000000000000</double>
230+
</property>
231+
</widget>
232+
</item>
233+
<item row="3" column="2">
234+
<widget class="QDoubleSpinBox" name="spinRY">
235+
<property name="decimals">
236+
<number>0</number>
237+
</property>
238+
<property name="maximum">
239+
<double>360.000000000000000</double>
240+
</property>
241+
</widget>
242+
</item>
243+
<item row="3" column="3">
244+
<widget class="QDoubleSpinBox" name="spinRZ">
245+
<property name="decimals">
246+
<number>0</number>
247+
</property>
248+
<property name="maximum">
249+
<double>360.000000000000000</double>
250+
</property>
251+
</widget>
252+
</item>
253+
</layout>
254+
</item>
255+
<item>
256+
<spacer name="verticalSpacer">
257+
<property name="orientation">
258+
<enum>Qt::Vertical</enum>
259+
</property>
260+
<property name="sizeHint" stdset="0">
261+
<size>
262+
<width>20</width>
263+
<height>40</height>
264+
</size>
265+
</property>
266+
</spacer>
267+
</item>
268+
</layout>
269+
</widget>
270+
<customwidgets>
271+
<customwidget>
272+
<class>QgsPhongMaterialWidget</class>
273+
<extends>QWidget</extends>
274+
<header>qgsphongmaterialwidget.h</header>
275+
<container>1</container>
276+
</customwidget>
277+
</customwidgets>
278+
<tabstops>
279+
<tabstop>cboShape</tabstop>
280+
<tabstop>spinRadius</tabstop>
281+
<tabstop>spinMinorRadius</tabstop>
282+
<tabstop>spinTopRadius</tabstop>
283+
<tabstop>spinBottomRadius</tabstop>
284+
<tabstop>spinSize</tabstop>
285+
<tabstop>spinLength</tabstop>
286+
<tabstop>spinTX</tabstop>
287+
<tabstop>spinTY</tabstop>
288+
<tabstop>spinTZ</tabstop>
289+
<tabstop>spinSX</tabstop>
290+
<tabstop>spinSY</tabstop>
291+
<tabstop>spinSZ</tabstop>
292+
<tabstop>spinRX</tabstop>
293+
<tabstop>spinRY</tabstop>
294+
<tabstop>spinRZ</tabstop>
295+
</tabstops>
296+
<resources/>
297+
<connections/>
298+
</ui>

0 commit comments

Comments
 (0)
Please sign in to comment.