29QString QgsTinMeshCreationAlgorithm::group()
 const 
   31  return QObject::tr( 
"Mesh" );
 
   34QString QgsTinMeshCreationAlgorithm::groupId()
 const 
   36  return QStringLiteral( 
"mesh" );
 
   39QString QgsTinMeshCreationAlgorithm::shortDescription()
 const 
   41  return QObject::tr( 
"Creates a TIN mesh layer from vector layers." );
 
   44QString QgsTinMeshCreationAlgorithm::shortHelpString()
 const 
   46  return QObject::tr( 
"This algorithm creates a TIN mesh layer from vector layers." );
 
   49QStringList QgsTinMeshCreationAlgorithm::tags()
 const 
   51  return QObject::tr( 
"tin,mesh,vector,triangulation,irregular,network" ).split( 
',' );
 
   54QString QgsTinMeshCreationAlgorithm::name()
 const 
   56  return QStringLiteral( 
"tinmeshcreation" );
 
   59QString QgsTinMeshCreationAlgorithm::displayName()
 const 
   61  return QObject::tr( 
"TIN Mesh Creation" );
 
   66  return new QgsTinMeshCreationAlgorithm();
 
   69void QgsTinMeshCreationAlgorithm::initAlgorithm( 
const QVariantMap &configuration )
 
   71  Q_UNUSED( configuration );
 
   76  QList<QgsMeshDriverMetadata> driverList;
 
   83      const QString name = driverMeta.name();
 
   84      mDriverSuffix[name] = driverMeta.writeMeshFrameOnFileSuffix();
 
   85      mAvailableFormat.append( name );
 
   88  addParameter( 
new QgsProcessingParameterEnum( QStringLiteral( 
"MESH_FORMAT" ), QObject::tr( 
"Output format" ), mAvailableFormat, 
false, 0 ) );
 
   89  addParameter( 
new QgsProcessingParameterCrs( QStringLiteral( 
"CRS_OUTPUT" ), QObject::tr( 
"Output coordinate system" ), QVariant(), 
true ) );
 
   95  const QVariant layersVariant = parameters.value( parameterDefinition( QStringLiteral( 
"SOURCE_DATA" ) )->name() );
 
   96  if ( layersVariant.userType() != QMetaType::Type::QVariantList )
 
   99  const QVariantList layersList = layersVariant.toList();
 
  105  for ( 
const QVariant &layer : layersList )
 
  110    if ( layer.userType() != QMetaType::Type::QVariantMap )
 
  112    const QVariantMap layerMap = layer.toMap();
 
  113    const QString layerSource = layerMap.value( QStringLiteral( 
"source" ) ).toString();
 
  115    const int attributeIndex = layerMap.value( QStringLiteral( 
"attributeIndex" ) ).toInt();
 
  119    if ( !featureSource )
 
  123    const long long featureCount = featureSource->featureCount();
 
  127        mVerticesLayer.append( { featureSource->getFeatures(), transform, attributeIndex, featureCount } );
 
  130        mBreakLinesLayer.append( { featureSource->getFeatures(), transform, attributeIndex, featureCount } );
 
  137  if ( mVerticesLayer.isEmpty() && mBreakLinesLayer.isEmpty() )
 
  149  triangulation.
setCrs( destinationCrs );
 
  151  if ( !mVerticesLayer.isEmpty() && feedback )
 
  152    feedback->
setProgressText( QObject::tr( 
"Adding vertices layer(s) to the triangulation" ) );
 
  153  for ( Layer &l : mVerticesLayer )
 
  157    triangulation.
addVertices( l.fit, l.attributeIndex, l.transform, feedback, l.featureCount );
 
  160  if ( !mBreakLinesLayer.isEmpty() && feedback )
 
  161    feedback->
setProgressText( QObject::tr( 
"Adding break lines layer(s) to the triangulation" ) );
 
  162  for ( Layer &l : mBreakLinesLayer )
 
  166    triangulation.
addBreakLines( l.fit, l.attributeIndex, l.transform, feedback, l.featureCount );
 
  170    return QVariantMap();
 
  172  QString fileName = parameterAsFile( parameters, QStringLiteral( 
"OUTPUT_MESH" ), context );
 
  173  const int driverIndex = parameterAsEnum( parameters, QStringLiteral( 
"MESH_FORMAT" ), context );
 
  174  const QString driver = mAvailableFormat.at( driverIndex );
 
  176    feedback->
setProgressText( QObject::tr( 
"Creating mesh from triangulation" ) );
 
  180    return QVariantMap();
 
  188  if ( providerMetadata )
 
  189    providerMetadata->
createMeshData( mesh, fileName, driver, destinationCrs );
 
  194  if ( driver == 
"SELAFIN" )
 
  196    addZValueDataset( fileName, mesh, driver );
 
  200  ret[QStringLiteral( 
"OUTPUT_MESH" )] = fileName;
 
  205void QgsTinMeshCreationAlgorithm::addZValueDataset( 
const QString &fileName, 
const QgsMesh &mesh, 
const QString &driver )
 
  207  auto tempLayer = std::make_unique<QgsMeshLayer>( fileName, 
"temp", 
"mdal" );
 
  209  tempLayer->addDatasets( zValueDatasetGroup );
 
  210  const int datasetGroupIndex = tempLayer->datasetGroupCount() - 1;
 
  211  tempLayer->saveDataset( fileName, datasetGroupIndex, driver );
 
  214bool QgsTinMeshCreationAlgorithm::canExecute( QString *errorMessage )
 const 
  216  if ( mAvailableFormat.count() == 0 )
 
  218    *errorMessage = QObject::tr( 
"MDAL not available" );
 
ProcessingTinInputLayerType
Defines the type of input layer for a Processing TIN input.
 
@ BreakLines
Input that adds vertices and break lines.
 
@ Vertices
Input that adds only vertices.
 
Represents a coordinate reference system (CRS).
 
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
 
bool isCanceled() const
Tells whether the operation has been canceled already.
 
static QString ensureFileNameHasExtension(const QString &fileName, const QStringList &extensions)
Ensures that a fileName ends with an extension from the provided list of extensions.
 
Handles mesh creation with Delaunay constrained triangulation.
 
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.
 
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.
 
Convenience class that can be used to obtain a dataset group on vertices that represents the Z value ...
 
Abstract base class for processing algorithms.
 
Details for layers to load into projects.
 
Contains information about the context in which a processing algorithm is executed.
 
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
 
void addLayerToLoadOnCompletion(const QString &layer, const QgsProcessingContext::LayerDetails &details)
Adds a layer to load (by ID or datasource) into the canvas upon completion of the algorithm or model.
 
QgsProject * project() const
Returns the project in which the algorithm is being executed.
 
Base class for providing feedback from a processing algorithm.
 
virtual void setProgressText(const QString &text)
Sets a progress report text string.
 
A coordinate reference system parameter for processing algorithms.
 
An enum based parameter for processing algorithms, allowing for selection from predefined values.
 
A generic file based destination parameter, for specifying the destination path for a file (non-map l...
 
@ Mesh
Mesh layer type, since QGIS 3.6.
 
static QgsProcessingFeatureSource * variantToSource(const QVariant &value, QgsProcessingContext &context, const QVariant &fallbackValue=QVariant())
Converts a variant value to a new feature source.
 
QgsCoordinateReferenceSystem crs
 
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
 
QgsProviderMetadata * providerMetadata(const QString &providerKey) const
Returns metadata of the provider or nullptr if not found.
 
Mesh - vertices, edges and faces.