35#include "moc_qgsmeshtriangulation.cpp"
37using namespace Qt::StringLiterals;
42 mTriangulation = std::make_unique<QgsDualEdgeTriangulation>();
66 addVerticesFromFeature( feat, valueAttribute, transform, feedback );
94 addVerticesFromFeature( feat, valueAttribute, transform, feedback );
98 addBreakLinesFromFeature( feat, valueAttribute, transform, feedback );
110 return mTriangulation->addPoint( vertex );
115 return mTriangulation->triangulationToMesh( feedback );
130 catch ( QgsCsException &cse )
140 if ( valueAttribute >= 0 )
141 value = feature.
attribute( valueAttribute ).toDouble();
147 if ( valueAttribute < 0 )
148 mTriangulation->addPoint( *vit );
159 double valueOnVertex = 0;
160 if ( valueAttribute >= 0 )
161 valueOnVertex = feature.
attribute( valueAttribute ).toDouble();
164 std::vector<const QgsCurve *> curves;
165 QgsGeometry geom = feature.
geometry();
170 catch ( QgsCsException &cse )
179 std::vector<const QgsCurvePolygon *> polygons;
193 for (
const QgsCurvePolygon *polygon : polygons )
200 if ( polygon->exteriorRing() )
201 curves.emplace_back( polygon->exteriorRing() );
203 for (
int i = 0; i < polygon->numInteriorRings(); ++i )
207 curves.emplace_back( polygon->interiorRing( i ) );
229 for (
const QgsCurve *curve : curves )
238 curve->points( linePoints );
239 bool hasZ = curve->is3D();
240 if ( valueAttribute >= 0 )
241 for (
int i = 0; i < linePoints.count(); ++i )
246 linePoints[i].setZ( valueOnVertex );
249 const QgsPoint &point = linePoints.at( i );
250 linePoints[i] = QgsPoint( point.
x(), point.
y(), valueOnVertex );
261 mDataset = std::make_unique<QgsMeshZValueDataset>( mesh );
271 if ( datasetIndex != 0 )
274 return mDataset->metadata();
284 return mDataset.get();
291 return QDomElement();
299 if ( vertex.z() < mZMinimum )
300 mZMinimum = vertex.z();
301 if ( vertex.z() > mZMaximum )
302 mZMaximum = vertex.z();
308 if ( valueIndex < 0 || valueIndex >= mMesh.vertexCount() )
318 QVector<double> zValues( count );
319 for (
int i = valueIndex; i < valueIndex + count; ++i )
320 zValues[i - valueIndex] = mMesh.vertex( i ).z();
327 Q_UNUSED( faceIndex );
336 return ( faceIndex > 0 && faceIndex < mMesh.faceCount() );
346 return mMesh.vertexCount();
353 return QObject::tr(
"Delaunay triangulation" );
359 QList<int> vertexIndextoTriangulate;
361 QList<int> removedVerticesFromTriangulation;
366 vertexIndextoTriangulate.append( vertexIndex );
368 removedVerticesFromTriangulation.append( vertexIndex );
371 bool triangulationReady =
false;
373 QgsTopologicalMesh::TopologicalFaces topologicFaces;
375 while ( !triangulationReady )
377 QgsMeshTriangulation triangulation;
379 QVector<int> triangulationVertexToMeshVertex( vertexIndextoTriangulate.count() );
382 for (
int i = 0; i < vertexIndextoTriangulate.count(); ++i )
384 triangulationVertexToMeshVertex[i] = vertexIndextoTriangulate.at( i );
385 triangulation.
addVertex( destinationMesh->
vertices.at( vertexIndextoTriangulate.at( i ) ) );
391 QVector<QgsMeshFace> rawDestinationFaces = resultingTriangulation.
faces;
393 for (
QgsMeshFace &destinationFace : rawDestinationFaces )
395 for (
int &vertexIndex : destinationFace )
396 vertexIndex = triangulationVertexToMeshVertex[vertexIndex];
400 QVector<QgsMeshFace> destinationFaces;
401 for (
const QgsMeshFace &face : rawDestinationFaces )
404 destinationFaces.append( face );
407 bool facesReady =
false;
408 QgsMeshEditingError previousError;
409 while ( !facesReady && !giveUp )
411 QgsMeshEditingError error;
414 if ( error == QgsMeshEditingError() )
421 triangulationReady =
true;
437 removedVerticesFromTriangulation.append( error.
elementIndex );
438 vertexIndextoTriangulate.removeOne( error.
elementIndex );
449 if ( !removedVerticesFromTriangulation.isEmpty() )
450 mMessage = QObject::tr(
"%n vertices have not been included in the triangulation",
nullptr, removedVerticesFromTriangulation.count() );
454 if ( triangulationReady && !giveUp )
457 return QgsTopologicalMesh::Changes();
@ TooManyVerticesInFace
A face has more vertices than the maximum number supported per face.
@ InvalidFace
An error occurs due to an invalid face (for example, vertex indexes are unordered).
@ UniqueSharedVertex
A least two faces share only one vertices.
@ ManifoldFace
ManifoldFace.
@ InvalidVertex
An error occurs due to an invalid vertex (for example, vertex index is out of range the available ver...
@ FlatFace
A flat face is present.
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
@ Forward
Forward transform (from source to destination).
Represents a coordinate reference system (CRS).
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Q_INVOKABLE QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
bool isCanceled() const
Tells whether the operation has been canceled already.
void setProgress(double progress)
Sets the current progress for the feedback object.
int numGeometries() const
Returns the number of geometries within the collection.
const QgsAbstractGeometry * geometryN(int n) const
Returns a const reference to a geometry from within the collection.
A geometry is the spatial representation of a feature.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
bool isMultipart() const
Returns true if WKB of the geometry is of WKBMulti* type.
QgsAbstractGeometry::vertex_iterator vertices_begin() const
Returns STL-style iterator pointing to the first vertex of the geometry.
Qgis::WkbType wkbType() const
Returns type of the geometry as a WKB type (point / linestring / polygon etc.).
QgsAbstractGeometry::vertex_iterator vertices_end() const
Returns STL-style iterator pointing to the imaginary vertex after the last vertex of the geometry.
QList< int > mInputVertices
A block of integers/doubles from a mesh dataset.
@ ScalarDouble
Scalar double values.
@ ActiveFlagInteger
Integer boolean flag whether face is active.
void setValues(const QVector< double > &vals)
Sets values.
void setValid(bool valid)
Sets block validity.
QgsMeshDatasetGroup()=default
void calculateStatistic() const
Calculates the statistics (minimum and maximum).
Represents a single mesh dataset value.
Abstract class that represents a mesh dataset.
QgsMeshEditingDelaunayTriangulation()
QString text() const override
Returns a short text string describing what this advanced edit does. Default implementation return a ...
Qgis::MeshEditingErrorType errorType
Handles edit operations on a mesh layer.
bool isFaceGeometricallyCompatible(const QgsMeshFace &face) const
Returns true if the face does not intersect or contains any other elements (faces or vertices) The to...
bool isVertexOnBoundary(int vertexIndex) const
Returns whether the vertex with index vertexIndex is on a boundary.
bool isVertexFree(int vertexIndex) const
Returns whether the vertex with index vertexIndex is a free vertex.
QgsTopologicalMesh & topologicalMesh()
Returns a reference to the topological mesh.
bool addBreakLines(QgsFeatureIterator &lineFeatureIterator, int valueAttribute, const QgsCoordinateTransform &transformContext, QgsFeedback *feedback=nullptr, long featureCount=1)
Adds break lines from a vector layer, return true if successful.
~QgsMeshTriangulation() override
int addVertex(const QgsPoint &vertex)
Adds a new vertex in the triangulation and returns the index of the new vertex.
void setCrs(const QgsCoordinateReferenceSystem &crs)
Sets the coordinate reference system used for the triangulation.
bool addVertices(QgsFeatureIterator &vertexFeatureIterator, int valueAttribute, const QgsCoordinateTransform &transform, QgsFeedback *feedback=nullptr, long featureCount=1)
Adds vertices to the triangulation from a feature iterator, return true if successful.
QgsMesh triangulatedMesh(QgsFeedback *feedback=nullptr) const
Returns the triangulated mesh.
int datasetCount() const override
Returns the count of datasets in the group.
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const override
Write dataset group information in a DOM element.
void initialize() override
Initialize the dataset group.
QgsMeshDataset * dataset(int index) const override
Returns the dataset with index.
QgsMeshDatasetMetadata datasetMetadata(int datasetIndex) const override
Returns the metadata of the dataset with index datasetIndex.
QgsMeshZValueDatasetGroup(const QString &datasetGroupName, const QgsMesh &mesh)
Constructor.
QgsMeshDataBlock areFacesActive(int faceIndex, int count) const override
Returns whether faces are active.
QgsMeshDatasetMetadata metadata() const override
Returns the metadata of the dataset.
QgsMeshZValueDataset(const QgsMesh &mesh)
Constructor with the mesh.
bool isActive(int faceIndex) const override
Returns whether the face is active.
int valuesCount() const override
Returns the values count.
QgsMeshDatasetValue datasetValue(int valueIndex) const override
Returns the value with index valueIndex.
QgsMeshDataBlock datasetValues(bool isScalar, int valueIndex, int count) const override
Returns count values from valueIndex.
Point geometry type, with support for z-dimension and m-values.
A container for the context for various read/write operations on objects.
Contains topological differences between two states of a topological mesh, only accessible from the Q...
QgsMeshEditingError checkConsistency() const
Checks the consistency of the topological mesh and return false if there is a consistency issue.
QgsMeshEditingError facesCanBeAdded(const TopologicalFaces &topologicalFaces) const
Returns whether the faces can be added to the mesh.
Changes addFaces(const TopologicalFaces &topologicFaces)
Adds faces topologicFaces to the topologic mesh.
QgsMesh * mesh() const
Returns a pointer to the wrapped mesh.
static TopologicalFaces createNewTopologicalFaces(const QVector< QgsMeshFace > &faces, bool uniqueSharedVertexAllowed, QgsMeshEditingError &error)
Creates new topological faces that are not yet included in the mesh.
static Qgis::GeometryType geometryType(Qgis::WkbType type)
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
T qgsgeometry_cast(QgsAbstractGeometry *geom)
QVector< QgsPoint > QgsPointSequence
#define QgsDebugMsgLevel(str, level)
QVector< int > QgsMeshFace
List of vertex indexes.
QgsPoint QgsMeshVertex
xyz coords of vertex
Mesh - vertices, edges and faces.
QVector< QgsMeshVertex > vertices
QVector< QgsMeshFace > faces