Index: src/widgets/3dview/SceneEntity.qml =================================================================== --- src/widgets/3dview/SceneEntity.qml +++ src/widgets/3dview/SceneEntity.qml @@ -34,9 +34,9 @@ Camera { id: camera fieldOfView: 45 - position: Qt.vector3d( 10.0, -10.0, 35.0 ) - upVector: Qt.vector3d( 0.0, 0.85, 0.75 ) - viewCenter: Qt.vector3d( 10.0, 10.0, 0.0 ) + position: lineMesh.center.plus(Qt.vector3d(0.0, -20.0, 20.0)) + upVector: Qt.vector3d(0.0, 1.0, 0.0) + viewCenter: lineMesh.center } FirstPersonCameraController { camera: camera } @@ -63,6 +63,7 @@ components: [ PhongMaterial { ambient: "darkGreen" }, LineMesh { + id: lineMesh readonly property string currentFile: sceneRoot.currentFile onCurrentFileChanged: readAndRun(currentFile) } Index: src/widgets/3dview/linemesh.h =================================================================== --- src/widgets/3dview/linemesh.h +++ src/widgets/3dview/linemesh.h @@ -26,25 +26,30 @@ #include #include #include +#include #include "gcodeto4d.h" class LineMeshGeometry; class QString; class LineMesh : public Qt3DRender::QGeometryRenderer { Q_OBJECT + Q_PROPERTY(QVector3D center READ center NOTIFY centerChanged) public: explicit LineMesh(Qt3DCore::QNode *parent = Q_NULLPTR); ~LineMesh(); void read(const QString &path); Q_INVOKABLE void readAndRun(const QString &path); void posUpdate(const QVector &pos); + QVector3D center(); + signals: void finished(); void run(const QString &path); + void centerChanged(const QVector3D ¢er); private: GcodeTo4D _gcode; Index: src/widgets/3dview/linemesh.cpp =================================================================== --- src/widgets/3dview/linemesh.cpp +++ src/widgets/3dview/linemesh.cpp @@ -21,7 +21,6 @@ */ #include -#include #include #include "gcodeto4d.h" #include "linemesh.h" @@ -68,4 +67,10 @@ setVertexCount(_lineMeshGeo->vertexCount()); setGeometry(_lineMeshGeo); emit finished(); + emit centerChanged(center()); +} + +QVector3D LineMesh::center() +{ + return _lineMeshGeo ? _lineMeshGeo->center() : QVector3D(); } Index: src/widgets/3dview/linemeshgeometry.h =================================================================== --- src/widgets/3dview/linemeshgeometry.h +++ src/widgets/3dview/linemeshgeometry.h @@ -25,17 +25,21 @@ #include #include #include +#include class LineMeshGeometry : public Qt3DRender::QGeometry { Q_OBJECT - + Q_PROPERTY(QVector3D center READ center CONSTANT) public: LineMeshGeometry(const QVector &vertices, Qt3DCore::QNode *parent = Q_NULLPTR); ~LineMeshGeometry(); int vertexCount(); + QVector3D center(); + private: Qt3DRender::QAttribute *_positionAttribute; Qt3DRender::QBuffer *_vertexBuffer; + QVector3D _center; }; Index: src/widgets/3dview/linemeshgeometry.cpp =================================================================== --- src/widgets/3dview/linemeshgeometry.cpp +++ src/widgets/3dview/linemeshgeometry.cpp @@ -21,7 +21,6 @@ */ #include -#include #include "linemeshgeometry.h" LineMeshGeometry::LineMeshGeometry(const QVector &vertices, Qt3DCore::QNode *parent) : @@ -41,6 +40,40 @@ _positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); addAttribute(_positionAttribute); + + if (vertices.isEmpty()) { + return; + } + + float minX = vertices.first().x(); + float maxX = vertices.first().x(); + float minY = vertices.first().y(); + float maxY = vertices.first().y(); + float minZ = vertices.first().z(); + float maxZ = vertices.first().z(); + for (const auto &position : vertices) { + if (position.x() < minX) { + minX = position.x(); + } + if (position.x() > maxX) { + maxX = position.x(); + } + if (position.y() < minY) { + minY = position.y(); + } + if (position.y() > maxY) { + maxY = position.y(); + } + if (position.z() < minZ) { + minZ = position.z(); + } + if (position.z() > maxZ) { + maxZ = position.z(); + } + } + _center = QVector3D((minX + maxX) / 2.0f, + (minY + maxY) / 2.0f, + (minZ + maxZ) / 2.0f); } LineMeshGeometry::~LineMeshGeometry() @@ -51,3 +84,8 @@ { return _vertexBuffer->data().size() / static_cast(sizeof(QVector3D)); } + +QVector3D LineMeshGeometry::center() +{ + return _center; +}