3D view now shows lights and added double spinbox

This commit is contained in:
2023-02-22 01:25:32 +01:00
parent a0b77ead41
commit 58c65c73f2
9 changed files with 113 additions and 526 deletions

View File

@ -39,8 +39,6 @@ qt_add_qml_module(appscheincommander
icons/nebelmaschine.png icons/nebelmaschine.png
icons/rgbstrahler.png icons/rgbstrahler.png
ui-icons/MaterialIcons-Regular.ttf ui-icons/MaterialIcons-Regular.ttf
models/cube.obj
textures/cubetexture.png
QML_FILES QML_FILES
main.qml main.qml
HomePage.qml HomePage.qml
@ -63,6 +61,7 @@ qt_add_qml_module(appscheincommander
AnimatedInputPanel.qml AnimatedInputPanel.qml
AnimatedStackView.qml AnimatedStackView.qml
Devices3dView.qml Devices3dView.qml
DoubleSpinBox.qml
) )
add_definitions(-DCMAKE_PROJECT_VERSION=${CMAKE_PROJECT_VERSION}) add_definitions(-DCMAKE_PROJECT_VERSION=${CMAKE_PROJECT_VERSION})

View File

@ -3,63 +3,13 @@ import QtDataVisualization
import QtQuick.Controls import QtQuick.Controls
Item { Item {
property int selectedAxisLabel: -1 property int selectedAxisLabel: -1
property real dragSpeedModifier: 100.0 property real dragSpeedModifier: 25.0
property int currentMouseX: -1 property int currentMouseX: -1
property int currentMouseY: -1 property int currentMouseY: -1
property int previousMouseX: -1 property int previousMouseX: -1
property int previousMouseY: -1 property int previousMouseY: -1
property alias model: itemModelScatterDataProxy.itemModel
ListModel {
id: graphModel
ListElement{ xPos: 0.0; yPos: 0.0; zPos: 0.0; rotation: "@0,0,0,0" }
ListElement{ xPos: 1.0; yPos: 1.0; zPos: 1.0; rotation: "@45,1,1,1" }
}
Timer {
id: dataTimer
interval: 1
running: true
repeat: true
property bool isIncreasing: true
property real rotationAngle: 0
function generateQuaternion() {
return "@" + Math.random() * 360 + "," + Math.random() + ","
+ Math.random() + "," + Math.random()
}
function appendRow() {
graphModel.append({"xPos": Math.random(),
"yPos": Math.random(),
"zPos": Math.random(),
"rotation": generateQuaternion()
});
}
//! [10]
onTriggered: {
rotationAngle = rotationAngle + 1
qtCube.setRotationAxisAndAngle(Qt.vector3d(1,0,1), rotationAngle)
//! [10]
scatterSeries.setMeshAxisAndAngle(Qt.vector3d(1,1,1), rotationAngle)
if (isIncreasing) {
for (var i = 0; i < 10; i++)
appendRow()
if (graphModel.count > 2002) {
scatterGraph.theme = isabelleTheme
isIncreasing = false
}
} else {
graphModel.remove(2, 10);
if (graphModel.count == 2) {
scatterGraph.theme = dynamicColorTheme
isIncreasing = true
}
}
}
}
ThemeColor { ThemeColor {
id: dynamicColor id: dynamicColor
@ -108,6 +58,12 @@ Item {
scene.activeCamera.yRotation: 45.0 scene.activeCamera.yRotation: 45.0
scene.activeCamera.xRotation: 45.0 scene.activeCamera.xRotation: 45.0
scene.activeCamera.zoomLevel: 75.0 scene.activeCamera.zoomLevel: 75.0
axisX.min: -10
axisX.max: 10
axisY.min: -10
axisY.max: 10
axisZ.min: -10
axisZ.max: 10
Scatter3DSeries { Scatter3DSeries {
id: scatterSeries id: scatterSeries
@ -115,25 +71,13 @@ Item {
mesh: Abstract3DSeries.MeshCube mesh: Abstract3DSeries.MeshCube
ItemModelScatterDataProxy { ItemModelScatterDataProxy {
itemModel: graphModel id: itemModelScatterDataProxy
xPosRole: "xPos" xPosRole: "positionX"
yPosRole: "yPos" yPosRole: "positionY"
zPosRole: "zPos" zPosRole: "positionZ"
rotationRole: "rotation" //rotationRole: "rotation"
} }
} }
//! [9]
customItemList: [
Custom3DItem {
id: qtCube
meshFile: ":/scheincommander/models/cube.obj"
textureFile: ":/scheincommander/textures/cubetexture.png"
position: Qt.vector3d(0.65,0.35,0.65)
scaling: Qt.vector3d(0.3,0.3,0.3)
}
]
//! [9]
//! [5]
onSelectedElementChanged: { onSelectedElementChanged: {
if (selectedElement >= AbstractGraph3D.ElementAxisXLabel if (selectedElement >= AbstractGraph3D.ElementAxisXLabel
&& selectedElement <= AbstractGraph3D.ElementAxisZLabel) && selectedElement <= AbstractGraph3D.ElementAxisZLabel)
@ -141,36 +85,27 @@ Item {
else else
selectedAxisLabel = -1 selectedAxisLabel = -1
} }
//! [5]
} }
//! [1]
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
acceptedButtons: Qt.LeftButton acceptedButtons: Qt.LeftButton
//! [1]
//! [3]
onPositionChanged: (mouse)=> { onPositionChanged: (mouse)=> {
currentMouseX = mouse.x; currentMouseX = mouse.x;
currentMouseY = mouse.y; currentMouseY = mouse.y;
//! [3]
//! [6]
if (pressed && selectedAxisLabel != -1) if (pressed && selectedAxisLabel != -1)
dragAxis(); dragAxis();
//! [6]
//! [4]
previousMouseX = currentMouseX; previousMouseX = currentMouseX;
previousMouseY = currentMouseY; previousMouseY = currentMouseY;
} }
//! [4]
//! [2]
onPressed: (mouse)=> { onPressed: (mouse)=> {
scatterGraph.scene.selectionQueryPosition = Qt.point(mouse.x, mouse.y); scatterGraph.scene.selectionQueryPosition = Qt.point(mouse.x, mouse.y);
} }
//! [2]
onReleased: { onReleased: {
// We need to clear mouse positions and selected axis, because touch devices cannot // We need to clear mouse positions and selected axis, because touch devices cannot
@ -184,7 +119,6 @@ Item {
} }
} }
//! [7]
function dragAxis() { function dragAxis() {
// Do nothing if previous mouse position is uninitialized // Do nothing if previous mouse position is uninitialized
if (previousMouseX === -1) if (previousMouseX === -1)
@ -235,11 +169,10 @@ Item {
break break
} }
} }
//! [7]
Button { Button {
id: rangeToggle id: rangeToggle
width: parent.width / 3 // We're adding 3 buttons and want to divide them equally width: parent.width / 2 // We're adding 3 buttons and want to divide them equally
text: "Use Preset Range" text: "Use Preset Range"
anchors.left: parent.left anchors.left: parent.left
property bool autoRange: true property bool autoRange: true
@ -265,10 +198,9 @@ Item {
} }
} }
//! [8]
Button { Button {
id: orthoToggle id: orthoToggle
width: parent.width / 3 width: parent.width / 2
text: "Display Orthographic" text: "Display Orthographic"
anchors.left: rangeToggle.right anchors.left: rangeToggle.right
onClicked: { onClicked: {
@ -283,13 +215,4 @@ Item {
} }
} }
} }
//! [8]
Button {
id: exitButton
width: parent.width / 3
text: "Quit"
anchors.left: orthoToggle.right
onClicked: Qt.quit();
}
} }

View File

@ -119,6 +119,8 @@ ColumnLayout {
Devices3dView { Devices3dView {
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true
model: model
} }
} }
} }

39
DoubleSpinBox.qml Normal file
View File

@ -0,0 +1,39 @@
import QtQuick
import QtQuick.Controls
SpinBox {
id: spinbox
property int decimals: 2
property real factor: 100
property real realFrom: from / factor
property real realTo: to / factor
property real realValue: value / factor
from: realFrom * factor
to: realTo * factor
value: realValue * factor
stepSize: factor
signal realValueModified
onValueModified: {
realValue = Qt.binding(function(){ return value / factor; });
realValueModified();
}
validator: DoubleValidator {
bottom: Math.min(spinbox.from, spinbox.to)
top: Math.max(spinbox.from, spinbox.to)
}
textFromValue: function(value, locale) {
return Number(value / 100).toLocaleString(locale, 'f', spinbox.decimals)
}
valueFromText: function(text, locale) {
return Number.fromLocaleString(locale, text) * 100
}
}

View File

@ -7,15 +7,15 @@ GridLayout {
property vector3d value property vector3d value
onValueChanged: { onValueChanged: {
xBox.value = value.x xBox.realValue = value.x
yBox.value = value.y yBox.realValue = value.y
zBox.value = value.z zBox.realValue = value.z
} }
signal valueModified signal valueModified
function updateValue() { function updateValue() {
const newValue = Qt.vector3d(xBox.value, yBox.value, zBox.value); const newValue = Qt.vector3d(xBox.realValue, yBox.realValue, zBox.realValue);
console.log(newValue); console.log(newValue);
if (newValue === value) if (newValue === value)
return; return;
@ -27,26 +27,38 @@ GridLayout {
text: qsTr('x:') text: qsTr('x:')
} }
SpinBox { DoubleSpinBox {
id: xBox id: xBox
onValueModified: updateValue() editable: true
realFrom: -1000
realTo: 1000
//stepSize: 0.01
onRealValueModified: updateValue()
} }
Label { Label {
text: qsTr('y:') text: qsTr('y:')
} }
SpinBox { DoubleSpinBox {
id: yBox id: yBox
onValueModified: updateValue() editable: true
realFrom: -1000
realTo: 1000
//stepSize: 0.01
onRealValueModified: updateValue()
} }
Label { Label {
text: qsTr('z:') text: qsTr('z:')
} }
SpinBox { DoubleSpinBox {
id: zBox id: zBox
onValueModified: updateValue() editable: true
realFrom: -1000
realTo: 1000
//stepSize: 0.01
onRealValueModified: updateValue()
} }
} }

View File

@ -11,7 +11,10 @@ enum {
IdRole = Qt::UserRole, IdRole = Qt::UserRole,
DeviceTypeIdRole, DeviceTypeIdRole,
AddressRole, AddressRole,
PositionRole PositionRole,
PositionXRole,
PositionYRole,
PositionZRole
}; };
void DevicesModel::setController(DmxController *controller) void DevicesModel::setController(DmxController *controller)
@ -111,6 +114,9 @@ QVariant DevicesModel::data(const QModelIndex &index, int role) const
case DeviceTypeIdRole: return device.deviceTypeId; case DeviceTypeIdRole: return device.deviceTypeId;
case AddressRole: return device.address; case AddressRole: return device.address;
case PositionRole: return device.position; case PositionRole: return device.position;
case PositionXRole: return device.position.x();
case PositionYRole: return device.position.y();
case PositionZRole: return device.position.z();
} }
return {}; return {};
@ -149,7 +155,10 @@ QMap<int, QVariant> DevicesModel::itemData(const QModelIndex &index) const
{ IdRole, device.id }, { IdRole, device.id },
{ DeviceTypeIdRole, device.deviceTypeId }, { DeviceTypeIdRole, device.deviceTypeId },
{ AddressRole, device.address }, { AddressRole, device.address },
{ PositionRole, device.position } { PositionRole, device.position },
{ PositionXRole, device.position.x() },
{ PositionYRole, device.position.y() },
{ PositionZRole, device.position.z() }
}; };
} }
@ -160,7 +169,10 @@ QHash<int, QByteArray> DevicesModel::roleNames() const
{ IdRole, "id" }, { IdRole, "id" },
{ DeviceTypeIdRole, "deviceTypeId" }, { DeviceTypeIdRole, "deviceTypeId" },
{ AddressRole, "address" }, { AddressRole, "address" },
{ PositionRole, "position" } { PositionRole, "position" },
{ PositionXRole, "positionX" },
{ PositionYRole, "positionY" },
{ PositionZRole, "positionZ" }
}; };
} }
@ -273,7 +285,7 @@ bool DevicesModel::setData(const QModelIndex &index, const QVariant &value, int
QMutexLocker locker{&m_controller->mutex()}; QMutexLocker locker{&m_controller->mutex()};
device.position = value.value<QVector3D>(); device.position = value.value<QVector3D>();
} }
emit dataChanged(index, index, { PositionRole }); emit dataChanged(index, index, { PositionRole, PositionXRole, PositionYRole, PositionZRole });
disconnect(m_controller, &DmxController::devicePositionChanged, disconnect(m_controller, &DmxController::devicePositionChanged,
this, &DevicesModel::otherDevicePositionChanged); this, &DevicesModel::otherDevicePositionChanged);
@ -458,7 +470,7 @@ void DevicesModel::otherDevicePositionChanged(int row, const QVector3D &position
} }
const auto index = this->index(row); const auto index = this->index(row);
emit dataChanged(index, index, { PositionRole }); emit dataChanged(index, index, { PositionRole, PositionXRole, PositionYRole, PositionZRole });
} }
namespace { namespace {

View File

@ -9,6 +9,18 @@
#include "projectloader.h" #include "projectloader.h"
void doFun(auto &y)
{
return;
double i{-10};
for (auto &x : y.devices)
{
x.position.setX(i);
x.position.setZ(std::sin(i / 2.) * 10.);
i += 20./double(y.devices.size());
}
}
DmxController::DmxController(ScheinCommanderSettings &settings, QObject *parent) : DmxController::DmxController(ScheinCommanderSettings &settings, QObject *parent) :
QObject{parent}, QObject{parent},
m_settings{settings}, m_settings{settings},
@ -168,6 +180,7 @@ DmxController::DmxController(ScheinCommanderSettings &settings, QObject *parent)
} }
} }
{ {
doFun(m_lightProject);
} }
bool DmxController::start() bool DmxController::start()
@ -243,6 +256,8 @@ bool DmxController::loadProject(const QString &name)
return false; return false;
} }
doFun(m_lightProject);
return true; return true;
} }

View File

@ -1,415 +0,0 @@
# Blender v2.66 (sub 0) OBJ File: 'beveled_cube.blend'
# www.blender.org
v -1.000000 -0.878027 0.878027
v -0.978771 -0.929277 0.878027
v -0.950975 -0.932562 0.932562
v -0.978771 -0.878027 0.929277
v -0.932562 -0.950975 0.932562
v -0.929277 -0.978771 0.878027
v -0.878027 -1.000000 0.878027
v -0.878027 -0.978771 0.929277
v -0.932562 -0.932562 0.950975
v -0.878027 -0.929277 0.978771
v -0.878027 -0.878027 1.000000
v -0.929277 -0.878027 0.978771
v -1.000000 -0.878027 -0.878027
v -0.978771 -0.878027 -0.929277
v -0.950975 -0.932562 -0.932562
v -0.978771 -0.929277 -0.878027
v -0.932562 -0.932562 -0.950975
v -0.929277 -0.878027 -0.978771
v -0.878027 -0.878027 -1.000000
v -0.878027 -0.929277 -0.978771
v -0.932562 -0.950975 -0.932562
v -0.878027 -0.978771 -0.929277
v -0.878027 -1.000000 -0.878027
v -0.929277 -0.978771 -0.878027
v 0.878027 -0.878027 -1.000000
v 0.929277 -0.878027 -0.978771
v 0.932562 -0.932562 -0.950975
v 0.878027 -0.929277 -0.978771
v 0.950975 -0.932562 -0.932562
v 0.978771 -0.878027 -0.929277
v 1.000000 -0.878027 -0.878027
v 0.978771 -0.929277 -0.878027
v 0.932562 -0.950975 -0.932562
v 0.929277 -0.978771 -0.878027
v 0.878027 -1.000000 -0.878027
v 0.878027 -0.978771 -0.929277
v 1.000000 -0.878027 0.878027
v 0.978771 -0.878027 0.929277
v 0.950975 -0.932562 0.932562
v 0.978771 -0.929277 0.878027
v 0.932562 -0.932562 0.950975
v 0.929277 -0.878027 0.978771
v 0.878027 -0.878027 1.000000
v 0.878027 -0.929277 0.978771
v 0.932562 -0.950975 0.932562
v 0.878027 -0.978771 0.929277
v 0.878027 -1.000000 0.878027
v 0.929277 -0.978771 0.878027
v -0.878027 0.878027 1.000000
v -0.878027 0.929277 0.978771
v -0.932562 0.932562 0.950975
v -0.929277 0.878027 0.978771
v -0.932562 0.950975 0.932562
v -0.878027 0.978771 0.929277
v -0.878027 1.000000 0.878027
v -0.929277 0.978771 0.878027
v -0.950975 0.932562 0.932562
v -0.978771 0.929277 0.878027
v -1.000000 0.878027 0.878027
v -0.978771 0.878027 0.929277
v -1.000000 0.878027 -0.878027
v -0.978771 0.929277 -0.878027
v -0.950975 0.932562 -0.932562
v -0.978771 0.878027 -0.929277
v -0.932562 0.950975 -0.932562
v -0.929277 0.978771 -0.878027
v -0.878027 1.000000 -0.878027
v -0.878027 0.978771 -0.929277
v -0.932562 0.932562 -0.950975
v -0.878027 0.929277 -0.978771
v -0.878027 0.878027 -1.000000
v -0.929277 0.878027 -0.978771
v 0.878027 0.878027 -1.000000
v 0.878027 0.929277 -0.978771
v 0.932562 0.932562 -0.950975
v 0.929277 0.878027 -0.978771
v 0.932562 0.950975 -0.932562
v 0.878027 0.978771 -0.929277
v 0.878027 1.000000 -0.878027
v 0.929277 0.978771 -0.878027
v 0.950975 0.932562 -0.932562
v 0.978771 0.929277 -0.878027
v 1.000000 0.878027 -0.878027
v 0.978771 0.878027 -0.929277
v 1.000000 0.878027 0.878027
v 0.978771 0.929277 0.878027
v 0.950975 0.932562 0.932562
v 0.978771 0.878027 0.929277
v 0.932562 0.950975 0.932562
v 0.929277 0.978771 0.878027
v 0.878027 1.000000 0.878027
v 0.878027 0.978771 0.929277
v 0.932562 0.932562 0.950975
v 0.878027 0.929277 0.978771
v 0.878027 0.878027 1.000000
v 0.929277 0.878027 0.978771
vt 0.024513 0.966281
vt 0.033719 0.975487
vt 0.033719 0.966281
vt 0.964639 0.060986
vt 0.964639 0.939014
vt 0.989386 0.939014
vt 0.939014 0.964639
vt 0.060986 0.964639
vt 0.939014 0.989386
vt 0.060986 0.060986
vt 0.060986 0.939014
vt 0.939014 0.939014
vt 0.035361 0.060986
vt 0.035361 0.939014
vt 0.010614 0.060986
vt 0.010614 0.939014
vt 0.989386 0.060986
vt 0.939014 0.035361
vt 0.060986 0.035361
vt 0.060986 0.010614
vt 0.060986 0.989386
vt 0.939014 0.060986
vt 0.966281 0.975487
vt 0.966281 0.966281
vt 0.975487 0.966281
vt 0.975487 0.033719
vt 0.966281 0.033719
vt 0.966281 0.024513
vt 0.033719 0.024513
vt 0.033719 0.033719
vt 0.024513 0.033719
vt 0.939014 0.010614
vn -0.713187 -0.495651 -0.495651
vn -0.495651 -0.495651 -0.713187
vn -0.495651 -0.713187 -0.495651
vn 0.539384 -0.823450 0.175909
vn 0.539384 -0.823450 -0.175909
vn 0.823450 -0.539384 -0.175909
vn -0.713187 0.495651 -0.495651
vn -0.495651 0.713187 -0.495651
vn -0.495651 0.495651 -0.713187
vn 0.175909 -0.823450 -0.539384
vn -0.185644 -0.825892 -0.532365
vn 0.175909 -0.539384 -0.823450
vn -0.193426 -0.961852 0.193426
vn -0.193426 -0.961852 -0.193426
vn 0.187689 -0.964110 -0.187689
vn -0.532365 -0.185644 0.825892
vn -0.532365 0.185644 0.825892
vn -0.825892 -0.185644 0.532365
vn -0.532365 0.185644 -0.825892
vn -0.532365 -0.185644 -0.825892
vn -0.825892 0.185644 -0.532365
vn 0.823450 0.175909 -0.539384
vn 0.823450 -0.175909 -0.539384
vn 0.539384 -0.175909 -0.823450
vn 0.539384 0.175909 0.823450
vn 0.539384 -0.175909 0.823450
vn 0.823450 -0.175909 0.539384
vn 0.175909 0.823450 0.539384
vn -0.185644 0.825892 0.532365
vn -0.185644 0.532365 0.825892
vn -0.185644 0.825892 -0.532365
vn 0.175909 0.823450 -0.539384
vn -0.185644 0.532365 -0.825892
vn 0.539384 0.823450 -0.175909
vn 0.539384 0.823450 0.175909
vn 0.823450 0.539384 0.175909
vn 0.187689 0.964110 0.187689
vn 0.187689 0.964110 -0.187689
vn -0.193426 0.961852 -0.193426
vn -0.193426 0.193426 -0.961852
vn 0.187689 0.187689 -0.964110
vn -0.193426 -0.193426 -0.961852
vn -0.961852 0.193426 0.193426
vn -0.961852 0.193426 -0.193426
vn -0.961852 -0.193426 0.193426
vn -0.532365 -0.825892 -0.185644
vn -0.532365 -0.825892 0.185644
vn -0.825892 -0.532365 -0.185644
vn 0.498856 0.498856 -0.708701
vn 0.498856 0.708701 -0.498856
vn 0.708701 0.498856 -0.498856
vn 0.964110 0.187689 -0.187689
vn 0.964110 0.187689 0.187689
vn 0.964110 -0.187689 0.187689
vn 0.498856 -0.498856 -0.708701
vn 0.708701 -0.498856 -0.498856
vn 0.498856 -0.708701 -0.498856
vn 0.708701 0.498856 0.498856
vn 0.498856 0.708701 0.498856
vn 0.498856 0.498856 0.708701
vn -0.495651 0.495651 0.713187
vn -0.495651 0.713187 0.495651
vn -0.713187 0.495651 0.495651
vn 0.708701 -0.498856 0.498856
vn 0.498856 -0.498856 0.708701
vn 0.498856 -0.708701 0.498856
vn -0.532365 0.825892 0.185644
vn -0.532365 0.825892 -0.185644
vn -0.825892 0.532365 0.185644
vn 0.187689 0.187689 0.964110
vn -0.193426 0.193426 0.961852
vn -0.193426 -0.193426 0.961852
vn -0.185644 -0.825892 0.532365
vn 0.175909 -0.823450 0.539384
vn 0.175909 -0.539384 0.823450
vn -0.825892 -0.532365 0.185644
vn -0.713187 -0.495651 0.495651
vn -0.495651 -0.713187 0.495651
vn -0.495651 -0.495651 0.713187
vn -0.185644 -0.532365 0.825892
vn -0.961852 -0.193426 -0.193426
vn -0.825892 -0.185644 -0.532365
vn 0.187689 -0.187689 -0.964110
vn 0.823450 -0.539384 0.175909
vn -0.193426 0.961852 0.193426
vn -0.825892 0.532365 -0.185644
vn 0.175909 0.539384 -0.823450
vn 0.539384 0.175909 -0.823450
vn 0.823450 0.539384 -0.175909
vn 0.823450 0.175909 0.539384
vn 0.175909 0.539384 0.823450
vn -0.185644 -0.532365 -0.825892
vn -0.825892 0.185644 0.532365
vn 0.964110 -0.187689 -0.187689
vn 0.187689 -0.187689 0.964110
vn 0.187689 -0.964110 0.187689
s 1
f 15/1/1 17/2/2 21/3/3
f 48/4/4 34/5/5 32/6/6
f 63/1/7 65/3/8 69/2/9
f 36/7/10 22/8/11 28/9/12
f 7/10/13 23/11/14 35/12/15
f 12/13/16 52/14/17 4/15/18
f 72/14/19 18/13/20 64/16/21
f 84/6/22 30/17/23 26/4/24
f 96/5/25 42/4/26 38/17/27
f 92/18/28 54/19/29 50/20/30
f 68/8/31 78/7/32 70/21/33
f 80/5/34 90/4/35 86/17/36
f 91/22/37 79/12/38 67/11/39
f 71/11/40 73/12/41 19/10/42
f 59/11/43 61/12/44 1/10/45
f 24/14/46 6/13/47 16/16/48
f 75/23/49 77/24/50 81/25/51
f 83/12/52 85/11/53 37/10/54
f 27/23/55 29/25/56 33/24/57
f 87/26/58 89/27/59 93/28/60
f 51/29/61 53/30/62 57/31/63
f 39/26/64 41/28/65 45/27/66
f 56/13/67 66/14/68 58/15/69
f 95/12/70 49/11/71 11/10/72
f 8/19/73 46/18/74 44/32/75
f 1/10/45 2/19/76 3/30/77
f 5/30/78 6/13/47 7/10/13
f 9/30/79 10/19/80 11/10/72
f 13/22/81 14/4/82 15/27/1
f 17/30/2 18/13/20 19/10/42
f 21/3/3 22/8/11 23/11/14
f 25/22/83 26/4/24 28/18/12
f 29/27/56 30/4/23 32/18/6
f 33/24/57 34/5/5 36/7/10
f 37/10/54 38/13/27 40/19/84
f 41/27/65 42/4/26 44/18/75
f 45/27/66 46/18/74 48/4/4
f 49/11/71 50/8/30 51/3/61
f 53/30/62 54/19/29 55/10/85
f 57/3/63 58/8/69 59/11/43
f 61/12/44 62/7/86 63/24/7
f 65/3/8 66/14/68 67/11/39
f 69/3/9 70/8/33 71/11/40
f 73/12/41 74/7/87 76/5/88
f 77/24/50 78/7/32 80/5/34
f 81/24/51 82/7/89 84/5/22
f 85/11/53 86/8/36 88/14/90
f 89/27/59 90/4/35 92/18/28
f 93/24/60 94/7/91 96/5/25
f 2/15/76 6/13/47 3/31/77
f 8/19/73 10/20/80 5/30/78
f 12/13/16 4/15/18 9/30/79
f 14/15/82 18/13/20 15/31/1
f 20/21/92 22/8/11 17/2/2
f 24/14/46 16/16/48 21/3/3
f 26/4/24 30/17/23 29/26/56
f 32/6/6 34/5/5 33/24/57
f 36/7/10 28/9/12 27/23/55
f 38/17/27 42/4/26 41/27/65
f 44/32/75 46/18/74 45/27/66
f 48/4/4 40/17/84 39/26/64
f 50/20/30 54/19/29 51/29/61
f 56/13/67 58/15/69 53/30/62
f 60/16/93 52/14/17 57/1/63
f 62/16/86 66/14/68 63/1/7
f 68/8/31 70/21/33 65/3/8
f 72/14/19 64/16/21 69/3/9
f 74/9/87 78/7/32 77/24/50
f 80/5/34 82/6/89 81/25/51
f 84/6/22 76/5/88 75/24/49
f 86/17/36 90/4/35 89/27/59
f 92/18/28 94/32/91 93/28/60
f 96/5/25 88/6/90 87/25/58
f 55/10/85 67/11/39 56/13/67
f 61/12/44 59/11/43 62/7/86
f 71/11/40 19/10/42 72/14/19
f 13/22/81 61/12/44 14/4/82
f 23/11/14 7/10/13 24/14/46
f 1/10/45 13/22/81 2/19/76
f 11/10/72 49/11/71 12/13/16
f 59/11/43 1/10/45 60/14/93
f 67/11/39 79/12/38 68/8/31
f 73/12/41 71/11/40 74/7/87
f 83/12/52 31/22/94 30/4/23
f 25/22/83 73/12/41 76/5/88
f 35/12/15 23/11/14 36/7/10
f 19/10/42 25/22/83 20/19/92
f 79/12/38 91/22/37 90/4/35
f 85/11/53 83/12/52 82/7/89
f 95/12/70 43/22/95 42/4/26
f 37/10/54 85/11/53 88/14/90
f 47/22/96 35/12/15 34/5/5
f 31/22/94 37/10/54 40/19/84
f 91/22/37 55/10/85 54/19/29
f 49/11/71 95/12/70 94/7/91
f 7/10/13 47/22/96 46/18/74
f 43/22/95 11/10/72 10/19/80
f 3/31/77 5/30/78 9/29/79
f 40/17/84 48/4/4 32/6/6
f 22/8/11 20/21/92 28/9/12
f 47/22/96 7/10/13 35/12/15
f 52/14/17 60/16/93 4/15/18
f 18/13/20 14/15/82 64/16/21
f 76/5/88 84/6/22 26/4/24
f 88/6/90 96/5/25 38/17/27
f 94/32/91 92/18/28 50/20/30
f 78/7/32 74/9/87 70/21/33
f 82/6/89 80/5/34 86/17/36
f 55/10/85 91/22/37 67/11/39
f 73/12/41 25/22/83 19/10/42
f 61/12/44 13/22/81 1/10/45
f 6/13/47 2/15/76 16/16/48
f 31/22/94 83/12/52 37/10/54
f 66/14/68 62/16/86 58/15/69
f 43/22/95 95/12/70 11/10/72
f 10/20/80 8/19/73 44/32/75
f 4/13/18 1/10/45 3/30/77
f 8/19/73 5/30/78 7/10/13
f 12/13/16 9/30/79 11/10/72
f 16/18/48 13/22/81 15/27/1
f 20/19/92 17/30/2 19/10/42
f 24/14/46 21/3/3 23/11/14
f 26/4/24 27/27/55 28/18/12
f 30/4/23 31/22/94 32/18/6
f 34/5/5 35/12/15 36/7/10
f 38/13/27 39/30/64 40/19/84
f 42/4/26 43/22/95 44/18/75
f 46/18/74 47/22/96 48/4/4
f 52/14/17 49/11/71 51/3/61
f 56/13/67 53/30/62 55/10/85
f 60/14/93 57/3/63 59/11/43
f 64/5/21 61/12/44 63/24/7
f 68/8/31 65/3/8 67/11/39
f 72/14/19 69/3/9 71/11/40
f 74/7/87 75/24/49 76/5/88
f 78/7/32 79/12/38 80/5/34
f 82/7/89 83/12/52 84/5/22
f 86/8/36 87/3/58 88/14/90
f 90/4/35 91/22/37 92/18/28
f 94/7/91 95/12/70 96/5/25
f 6/13/47 5/30/78 3/31/77
f 10/20/80 9/29/79 5/30/78
f 4/15/18 3/31/77 9/30/79
f 18/13/20 17/30/2 15/31/1
f 22/8/11 21/3/3 17/2/2
f 16/16/48 15/1/1 21/3/3
f 27/27/55 26/4/24 29/26/56
f 29/25/56 32/6/6 33/24/57
f 33/24/57 36/7/10 27/23/55
f 39/26/64 38/17/27 41/27/65
f 41/28/65 44/32/75 45/27/66
f 45/27/66 48/4/4 39/26/64
f 54/19/29 53/30/62 51/29/61
f 58/15/69 57/31/63 53/30/62
f 52/14/17 51/3/61 57/1/63
f 66/14/68 65/3/8 63/1/7
f 70/21/33 69/2/9 65/3/8
f 64/16/21 63/1/7 69/3/9
f 75/23/49 74/9/87 77/24/50
f 77/24/50 80/5/34 81/25/51
f 81/25/51 84/6/22 75/24/49
f 87/26/58 86/17/36 89/27/59
f 89/27/59 92/18/28 93/28/60
f 93/24/60 96/5/25 87/25/58
f 67/11/39 66/14/68 56/13/67
f 59/11/43 58/8/69 62/7/86
f 19/10/42 18/13/20 72/14/19
f 61/12/44 64/5/21 14/4/82
f 7/10/13 6/13/47 24/14/46
f 13/22/81 16/18/48 2/19/76
f 49/11/71 52/14/17 12/13/16
f 1/10/45 4/13/18 60/14/93
f 79/12/38 78/7/32 68/8/31
f 71/11/40 70/8/33 74/7/87
f 84/5/22 83/12/52 30/4/23
f 26/4/24 25/22/83 76/5/88
f 23/11/14 22/8/11 36/7/10
f 25/22/83 28/18/12 20/19/92
f 80/5/34 79/12/38 90/4/35
f 86/8/36 85/11/53 82/7/89
f 96/5/25 95/12/70 42/4/26
f 38/13/27 37/10/54 88/14/90
f 48/4/4 47/22/96 34/5/5
f 32/18/6 31/22/94 40/19/84
f 92/18/28 91/22/37 54/19/29
f 50/8/30 49/11/71 94/7/91
f 8/19/73 7/10/13 46/18/74
f 44/18/75 43/22/95 10/19/80

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB