Skip to content

Commit 0750088

Browse files
committedApr 18, 2023
add a special handling for output layers if input is a VPC and a
temporary output is generated. In this case we force output to be a VPC too in order to provide better UX. Later, when pdal_wrench will be able to create las/laz/copc files from VPC inputs this handling will be removed.
1 parent c6d3488 commit 0750088

File tree

6 files changed

+57
-7
lines changed

6 files changed

+57
-7
lines changed
 

‎src/analysis/processing/pdal/qgsalgorithmpdalbuildvpc.cpp

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ void QgsPdalBuildVpcAlgorithm::initAlgorithm( const QVariantMap & )
6363
addParameter( new QgsProcessingParameterBoolean( QStringLiteral( "BOUNDARY" ), QObject::tr( "Calculate boundary polygons" ), false ) );
6464
addParameter( new QgsProcessingParameterBoolean( QStringLiteral( "STATISTICS" ), QObject::tr( "Calculate statistics" ), false ) );
6565
addParameter( new QgsProcessingParameterBoolean( QStringLiteral( "OVERVIEW" ), QObject::tr( "Build overview point cloud" ), false ) );
66-
addParameter( new QgsProcessingParameterFileDestination( QStringLiteral( "OUTPUT" ), QObject::tr( "Virtual point cloud file" ), QObject::tr( "VPC files (*.vpc *.VPC)" ) ) );
66+
addParameter( new QgsProcessingParameterPointCloudDestination( QStringLiteral( "OUTPUT" ), QObject::tr( "Virtual point cloud file" ) ) );
6767
}
6868

6969
QStringList QgsPdalBuildVpcAlgorithm::createArgumentLists( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
@@ -76,14 +76,29 @@ QStringList QgsPdalBuildVpcAlgorithm::createArgumentLists( const QVariantMap &pa
7676
feedback->reportError( QObject::tr( "No layers selected" ), true );
7777
}
7878

79-
const QString outputFile = parameterAsFileOutput( parameters, QStringLiteral( "OUTPUT" ), context );
80-
setOutputValue( QStringLiteral( "OUTPUT" ), outputFile );
79+
const QString outputName = parameterAsOutputLayer( parameters, QStringLiteral( "OUTPUT" ), context );
80+
QString outputFileName( outputName );
81+
82+
QFileInfo fi( outputFileName );
83+
if ( fi.suffix() != QStringLiteral( "vpc" ) )
84+
{
85+
outputFileName = fi.path() + '/' + fi.completeBaseName() + QStringLiteral( ".vpc" );
86+
if ( context.willLoadLayerOnCompletion( outputName ) )
87+
{
88+
QMap< QString, QgsProcessingContext::LayerDetails > layersToLoad = context.layersToLoadOnCompletion();
89+
QgsProcessingContext::LayerDetails details = layersToLoad.take( outputName );
90+
layersToLoad[ outputFileName ] = details;
91+
context.setLayersToLoadOnCompletion( layersToLoad );
92+
}
93+
}
94+
95+
setOutputValue( QStringLiteral( "OUTPUT" ), outputFileName );
8196

8297
QStringList args;
8398
args.reserve( layers.count() + 5 );
8499

85100
args << QStringLiteral( "build_vpc" )
86-
<< QStringLiteral( "--output=%1" ).arg( outputFile );
101+
<< QStringLiteral( "--output=%1" ).arg( outputFileName );
87102

88103
if ( parameterAsBool( parameters, QStringLiteral( "BOUNDARY" ), context ) )
89104
{

‎src/analysis/processing/pdal/qgsalgorithmpdalclip.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ QStringList QgsPdalClipAlgorithm::createArgumentLists( const QVariantMap &parame
7979
QgsVectorFileWriter::supportedFormatExtensions()[0],
8080
feedback );
8181

82-
const QString outputFile = parameterAsOutputLayer( parameters, QStringLiteral( "OUTPUT" ), context );
82+
const QString outputName = parameterAsOutputLayer( parameters, QStringLiteral( "OUTPUT" ), context );
83+
QString outputFile = fixOutputFileName( layer->source(), outputName, context );
8384
setOutputValue( QStringLiteral( "OUTPUT" ), outputFile );
8485

8586
QStringList args = { QStringLiteral( "clip" ),

‎src/analysis/processing/pdal/qgsalgorithmpdalfilter.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ QStringList QgsPdalFilterAlgorithm::createArgumentLists( const QVariantMap &para
7373
if ( !layer )
7474
throw QgsProcessingException( invalidPointCloudError( parameters, QStringLiteral( "INPUT" ) ) );
7575

76-
const QString outputFile = parameterAsOutputLayer( parameters, QStringLiteral( "OUTPUT" ), context );
76+
const QString outputName = parameterAsOutputLayer( parameters, QStringLiteral( "OUTPUT" ), context );
77+
QString outputFile = fixOutputFileName( layer->source(), outputName, context );
7778
setOutputValue( QStringLiteral( "OUTPUT" ), outputFile );
7879

7980
QStringList args = { QStringLiteral( "translate" ),

‎src/analysis/processing/pdal/qgsalgorithmpdalthin.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ QStringList QgsPdalThinAlgorithm::createArgumentLists( const QVariantMap &parame
7474
if ( !layer )
7575
throw QgsProcessingException( invalidPointCloudError( parameters, QStringLiteral( "INPUT" ) ) );
7676

77-
const QString outputFile = parameterAsOutputLayer( parameters, QStringLiteral( "OUTPUT" ), context );
77+
const QString outputName = parameterAsOutputLayer( parameters, QStringLiteral( "OUTPUT" ), context );
78+
QString outputFile = fixOutputFileName( layer->source(), outputName, context );
7879
setOutputValue( QStringLiteral( "OUTPUT" ), outputFile );
7980

8081
int mode = parameterAsInt( parameters, QStringLiteral( "MODE" ), context );

‎src/analysis/processing/pdal/qgspdalalgorithmbase.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,27 @@ void QgsPdalAlgorithmBase::applyThreadsParameter( QStringList &arguments )
9999
}
100100
}
101101

102+
QString QgsPdalAlgorithmBase::fixOutputFileName( const QString &inputFileName, const QString &outputFileName, QgsProcessingContext &context )
103+
{
104+
bool inputIsVpc = inputFileName.endsWith( QStringLiteral( ".vpc" ), Qt::CaseInsensitive );
105+
bool isTempOutput = outputFileName.startsWith( QgsProcessingUtils::tempFolder(), Qt::CaseInsensitive );
106+
if ( inputIsVpc && isTempOutput )
107+
{
108+
QFileInfo fi( outputFileName );
109+
QString newFileName = fi.path() + '/' + fi.completeBaseName() + QStringLiteral( ".vpc" );
110+
111+
if ( context.willLoadLayerOnCompletion( outputFileName ) )
112+
{
113+
QMap< QString, QgsProcessingContext::LayerDetails > layersToLoad = context.layersToLoadOnCompletion();
114+
QgsProcessingContext::LayerDetails details = layersToLoad.take( outputFileName );
115+
layersToLoad[ newFileName ] = details;
116+
context.setLayersToLoadOnCompletion( layersToLoad );
117+
}
118+
return newFileName;
119+
}
120+
return outputFileName;
121+
}
122+
102123
QStringList QgsPdalAlgorithmBase::createArgumentLists( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
103124
{
104125
Q_UNUSED( parameters );

‎src/analysis/processing/pdal/qgspdalalgorithmbase.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,17 @@ class QgsPdalAlgorithmBase : public QgsProcessingAlgorithm
5757
*/
5858
void applyThreadsParameter( QStringList &arguments );
5959

60+
/**
61+
* "Fixes" output file name by changing suffix to .vpc if input file
62+
* is a VPC and output is a temporary output.
63+
*
64+
* This is necessary as pdal_wrench at the moment can create only VPC
65+
* output if input file is a VPC. We automatically adjust output file
66+
* extension for temporary outputs to provide better UX. For normal outputs
67+
* user will see a error if output files is not a VPC.
68+
*/
69+
QString fixOutputFileName( const QString &inputFileName, const QString &outputFileName, QgsProcessingContext &context );
70+
6071
/**
6172
* Returns path to the pdal_wrench executable binary.
6273
*/

0 commit comments

Comments
 (0)
Please sign in to comment.