[Qgis-user] Problem using Model Inputs variable in an Select by expression in the model Designer

Nicolas Cadieux njacadieux.gitlab at gmail.com
Mon Aug 23 17:57:27 PDT 2021


Thanks Nyall,
I figured it was that because I could place the string “Length” in a column.  I thought it would work in the field calculator with something like ‘“‘ || @thelenghtstring || ‘“‘ but obviously, it does not. 
Thank ps for the precision.

Nicolas Cadieux
https://gitlab.com/njacadieux

> Le 23 août 2021 à 19:02, Nyall Dawson <nyall.dawson at gmail.com> a écrit :
> 
> On Tue, 24 Aug 2021 at 03:53, Charles Dixon-Paver <charles at kartoza.com> wrote:
>> 
>> Honestly I have no idea 😂
>> 
>> I mean, of course what is happening is QGIS is needing to identify a field from a text string, and it's even possible that with some convoluted chain of escape characters or funky regex the process could correct itself and "just work".
>> 
>> In all likelihood you could have just stumbled onto some obscure bug in the underlying processing API where the context of that field object get's dropped or orphaned when  trying to access it.
> 
> There's no bug here -- the variable value is just a pure text string,
> and the expression engine can't automatically guess that you actually
> want the value of the field with that name, and not just the name
> string itself. Hence the need for the attribute function, which allows
> you to retrieve a feature's fields via a text string containing the
> field name.
> 
> Nyall
> 
> 
>> 
>> My assumption is that using attribute() just compensates for whatever is going on under the hood by reinstantiating the context behind the field object, or at the very least provides a robust interface for referencing it ¯\_(ツ)_/¯
>> 
>> I would definitely call it a work around though
>> 
>>> On Mon, 23 Aug 2021 at 18:52, Nicolas Cadieux <njacadieux.gitlab at gmail.com> wrote:
>>> 
>>> Hi,
>>> 
>>> if(attribute(to_string( @NamelengthField )) != "LENGTH2", TRUE, FALSE )
>>> 
>>> ("LENGHT2" is an existing field and @NamelengthField was a model input string.)
>>> 
>>> This worked  for me!   If you have the time, please explain why I needed the attribute() function for this to work.  I looked in the documentation and did not find it very clear.
>>> 
>>> Thanks a million you saved my butt!
>>> 
>>> Nicolas
>>> 
>>> 
>>>> On 2021-07-20 5:53 a.m., Charles Dixon-Paver wrote:
>>> 
>>> Hi Nicholas,
>>> 
>>> I haven't had time to dig into this extensively or encountered this particular issue, but I would suggest trying to "force" the expression to retrieve the correct info regardless of context using something like this:
>>> 
>>> with_variable('Length2',  to_string(@NamelengthField) || '2', if(attribute(to_string(@NamelengthField)) != attribute(@Length2), TRUE, FALSE))
>>> 
>>> That's probably an extreme example but hopefully it illustrates my point. If you want to share a sample dataset/ model I can try to have a look at how to resolve it.
>>> 
>>> Regards
>>> 
>>> On Tue, 20 Jul 2021 at 10:46, Richard McDonnell <richard.mcdonnell at opw.ie> wrote:
>>>> 
>>>> Nicolas,
>>>> 
>>>> I have not looked at this in too much detail, but at a quick glance, could it not be the fact that you should be using the newly created fields? As in instead of @NamelengthField != @NamelengthField || '2', should it not be more like your previous example Length != Length2
>>>> 
>>>> 
>>>> 
>>>> Regards,
>>>> 
>>>> 
>>>> 
>>>> Richard
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> ——
>>>> Richard McDonnell MSc GIS, FME Certified Professional
>>>> FRM Data Management
>>>> 
>>>> ——
>>>> Oifig na nOibreacha Poiblí
>>>> Office of Public Works
>>>> 
>>>> Sráid Jonathan Swift, Baile Átha Troim, Co na Mí, C15 NX36
>>>> Jonathan Swift Street, Trim, Co Meath, C15 NX36
>>>> ——
>>>> M +353 87 688 5964 T +353 46 942 2409
>>>> https://gov.ie/opw
>>>> 
>>>> ——
>>>> To send me files larger than 30MB, please use the link below https://filetransfer.opw.ie/filedrop/richard.mcdonnell@opw.ie
>>>> 
>>>> Email Disclaimer: https://www.gov.ie/en/organisation-information/439daf-email-disclaimer/
>>>> 
>>>> From: Qgis-user <qgis-user-bounces at lists.osgeo.org> On Behalf Of Nicolas Cadieux
>>>> Sent: 20 July 2021 09:27
>>>> To: Qgis Users List <qgis-user at lists.osgeo.org>
>>>> Subject: Re: [Qgis-user] Problem using Model Inputs variable in an Select by expression in the model Designer
>>>> 
>>>> 
>>>> 
>>>> Hi,
>>>> 
>>>> Does anyone have an idea?
>>>> 
>>>> Nicolas Cadieux
>>>> 
>>>> https://gitlab.com/njacadieux
>>>> 
>>>> 
>>>> 
>>>> Le 8 juill. 2021 à 01:17, Nicolas Cadieux <njacadieux.gitlab at gmail.com> a écrit :
>>>> 
>>>> 
>>>> 
>>>> Hi,
>>>> 
>>>> I am creating a model that fixes Network files before they are used in the QGIS Network analysis (Shortest path) tools.
>>>> 
>>>> This is my work flow:
>>>> 
>>>> Create a "Length" field (value) and calculate $length in the field calculator
>>>> Split the Multipart lines into Singlepart lines
>>>> Create a "Length2" field (value) and calculate $length in the field calculator
>>>> Select by expression Length != Length2.  This basically gives me a selection of line that have been modified by the Multipart to Singlepart algorithm. (I get 8 results)
>>>> 
>>>> This works well
>>>> 
>>>> The problem is when I create and Input String to let the user create a "Length" field.  This become a variable called @NamelengthField. My work flow become:
>>>> 
>>>> User input "Length" in the Model input. (@NamelengthField)
>>>> Create a "Length" field using  @NamelengthField (as pre-calculated value) and calculate $length in the field calculator: This is OK
>>>> Split the Multipart lines into Singlepart lines: This is OK
>>>> Create a "Length2" field using  @NamelengthField ||'2'  (as pre-calculated value) and calculate $length in the field calculator: This is OK this field (Length2) is created and calculated properly.
>>>> I get stuck  when I try Select by expression using  @NamelengthField != @NamelengthField || '2' (as pre-calculated value) (I get all lines back) and the test does not work.
>>>> 
>>>> I tried stuff like
>>>> 
>>>> @NamelengthField != (@NamelengthField || '2')
>>>> 
>>>> '@NamelengthField != @NamelengthField || '2''
>>>> 
>>>> "@NamelengthField != @NamelengthField || '2'"
>>>> 
>>>> "@NamelengthField"|| !=|| "@NamelengthField || '2'"
>>>> 
>>>> Even simple @NamelengthField = 5.286365157529550 (which should extract exactly one value).
>>>> 
>>>> Any ideas?
>>>> 
>>>> Nicolas
>>>> 
>>>> QGIS 3.18.2 on Windows 10
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> --
>>>> 
>>>> Nicolas Cadieux
>>>> 
>>>> https://gitlab.com/njacadieux
>>>> 
>>>> _______________________________________________
>>>> Qgis-user mailing list
>>>> Qgis-user at lists.osgeo.org
>>>> List info: https://lists.osgeo.org/mailman/listinfo/qgis-user
>>>> Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-user
>>> 
>>> --
>>> Nicolas Cadieux
>>> https://gitlab.com/njacadieux
>> 
>> _______________________________________________
>> Qgis-user mailing list
>> Qgis-user at lists.osgeo.org
>> List info: https://lists.osgeo.org/mailman/listinfo/qgis-user
>> Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-user
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-user/attachments/20210823/02aff073/attachment.html>


More information about the Qgis-user mailing list