QGIS API Documentation 3.41.0-Master (02257426e5a)
Loading...
Searching...
No Matches
qgspointcloudlayerundocommand.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgspointcloudlayerundocommand.cpp
3 ---------------------
4 begin : January 2025
5 copyright : (C) 2025 by Stefanos Natsis
6 email : uclaros at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
19#include "qgspointcloudlayer.h"
21
22
26
29 , mNode( n )
30 , mAttribute( attribute )
31 , mNewValue( value )
32{
34 const QgsPointCloudAttributeCollection allAttributes = index.attributes();
36 req.setAttributes( allAttributes );
37 std::unique_ptr<QgsPointCloudBlock> block = index.nodeData( n, req );
38 const char *ptr = block->data();
39 block->attributes().find( attribute.name(), mAttributeOffset );
40 const int size = block->pointRecordSize();
41 for ( const int point : points )
42 {
43 const int offset = point * size + mAttributeOffset;
44 const double oldValue = attribute.convertValueToDouble( ptr + offset );
45 mPointValues[point] = oldValue;
46 }
47}
48
50{
51 undoRedoPrivate( true );
52}
53
55{
56 undoRedoPrivate( false );
57}
58
59void QgsPointCloudLayerUndoCommandChangeAttribute::undoRedoPrivate( bool isUndo )
60{
61 QgsPointCloudEditingIndex *editIndex = static_cast<QgsPointCloudEditingIndex *>( mLayer->index().get() );
62 QgsCopcPointCloudIndex *copcIndex = static_cast<QgsCopcPointCloudIndex *>( editIndex->mIndex.get() );
63
64 QByteArray chunkData;
65 if ( editIndex->mEditedNodeData.contains( mNode ) )
66 {
67 chunkData = editIndex->mEditedNodeData[mNode];
68 }
69 else
70 {
71 QPair<uint64_t, int32_t> offsetSizePair = copcIndex->mHierarchyNodePos[mNode];
72 chunkData = copcIndex->readRange( offsetSizePair.first, offsetSizePair.second );
73 }
74
75 QByteArray data;
76 if ( isUndo )
77 {
78 data = QgsPointCloudLayerEditUtils::updateChunkValues( copcIndex, chunkData, mAttribute, mNode, mPointValues );
79 }
80 else
81 {
82 data = QgsPointCloudLayerEditUtils::updateChunkValues( copcIndex, chunkData, mAttribute, mNode, mPointValues, mNewValue );
83 }
84
85 mLayer->index().updateNodeData( {{mNode, data}} );
86
88}
Collection of point cloud attributes.
Attribute for point cloud data pair of name and size in bytes.
QString name() const
Returns name of the attribute.
double convertValueToDouble(const char *ptr) const
Returns the attribute's value as a double for data pointed to by ptr.
The QgsPointCloudEditingIndex class is a QgsPointCloudIndex that is used as an editing buffer when ed...
Smart pointer for QgsAbstractPointCloudIndex.
std::unique_ptr< QgsPointCloudBlock > nodeData(const QgsPointCloudNodeId &n, const QgsPointCloudRequest &request)
Returns node data block.
bool updateNodeData(const QHash< QgsPointCloudNodeId, QByteArray > &data)
Tries to update the data for the specified nodes.
QgsAbstractPointCloudIndex * get()
Returns pointer to the implementation class.
QgsPointCloudAttributeCollection attributes() const
Returns all attributes that are stored in the file.
static QByteArray updateChunkValues(QgsCopcPointCloudIndex *copcIndex, const QByteArray &chunkData, const QgsPointCloudAttribute &attribute, const QgsPointCloudNodeId &n, const QHash< int, double > &pointValues, std::optional< double > newValue=std::nullopt)
Sets new classification value for the given points in voxel and return updated chunk data.
QgsPointCloudLayerUndoCommandChangeAttribute(QgsPointCloudLayer *layer, const QgsPointCloudNodeId &n, const QVector< int > &points, const QgsPointCloudAttribute &attribute, double value)
Constructor for QgsPointCloudLayerUndoCommandChangeAttribute.
Base class for undo/redo command for point cloud editing.
QgsPointCloudLayerUndoCommand(QgsPointCloudLayer *layer)
Ctor.
Represents a map layer supporting display of point clouds.
QgsPointCloudIndex index() const
Returns the point cloud index associated with the layer.
void chunkAttributeValuesChanged(const QgsPointCloudNodeId &n)
Emitted when a node gets some attribute values of some points changed.
Represents a indexed point cloud node's position in octree.
Point cloud data request.
void setAttributes(const QgsPointCloudAttributeCollection &attributes)
Set attributes filter in the request.