YOUR ACCOUNT

Login or Register to post new topics or replies
xirja
Idididoll Forcabbage

Posts: 1698
Filters: 8
As already mentioned here, the order of controls gets reset to the default order every time there is an unlinking of the result:

GMM says:

Quote
"This is by design: unlinking the component subtree from Result will reset the order to the default state.

Restoring via Ctrl+Z will be supported in a future update.

This has been fixed and will be available in the next update 4.010."



So now we can use Undo/Ctl+Z to get the order back with the same Result connection, but...


If I have a custom ordered "Simple filter" and want to make a "Surface" version, I have to manually re-order the controls again?! smile:evil:
_____________________________________________________

http://web.archive.org/web/2021062908...rjadesign/
_____________________________________________________
  Details E-Mail
GMM
Moderator
Filter Forge, Inc
Posts: 3491
Quote
have to manually re-order the controls again?!


Yes you have. Any changes in the target component's set of inputs will reset all incoming connections. You can observe the same behavior with Bomber (check-uncheck HDR) or Smudge (check-uncheck Orthogonal).
  Details E-Mail
xirja
Idididoll Forcabbage

Posts: 1698
Filters: 8
So, the feature request:

An option to preserve the custom order of controls when changing the filter from "Simple filter" to "Surface" and vice versa.

smile:bunny:
_____________________________________________________

http://web.archive.org/web/2021062908...rjadesign/
_____________________________________________________
  Details E-Mail
Rachel Duim
So Called Tortured Artist

Posts: 2498
Filters: 188
Feature request: My 2 cents, a "lock" to keep the custom order of controls so that when you edit anything in FF they don't move around. If you add controls if it's locked, that control is added to the bottom of the list of controls.
Rickster the Forgster
Math meets art meets psychedelia.
  Details E-Mail
xirja
Idididoll Forcabbage

Posts: 1698
Filters: 8
Quote
a "lock" to keep the custom order of controls


At the very least, yes! By default they should be locked in custom mode, as the automatic mode allows for the fallback to the default state. smile:cry:

Quote
You can observe the same behavior with Bomber (check-uncheck HDR) or Smudge (check-uncheck Orthogonal)


Yes, but why is this anything but a mistake?
_____________________________________________________

http://web.archive.org/web/2021062908...rjadesign/
_____________________________________________________
  Details E-Mail
Ramlyn
Ramlyn

Posts: 2930
Filters: 691
I guess that the point is : FF is set to detect only controls that are connected ( directly or not ) to the Result.
That's why, if we build a branch of components but we don't connect it with the Result, no controls of that branch will appear.
This also means that, every time that we detach something ( a single control or more ), the program deletes it from the list and "forgets" it. When we connect it again, the program probably detects it as a new control and adds it at the end of the list.

The alternative would be to set the program to detect all controls that we add, no matter if they are connected to the Result or not.
This would create errors in some old filters.
Some filters have controls that are not connected to the Result.
The reasons are three :
- The maker of the filter forgot to delete them.
- The maker of the filter, knowing that they wouldn't appear, simply let them there as a chance to change the filter.
- They aren't used as controls, but only as information about a particular area of the filter ( the name of the control is probably something like "Area for circular shape", "Branch to add color", etc. )
Making all controls appearing in the list would bring up these controls too, that can't be used to control the filter.

So...
I guess it would be necessary to have two ways for FF to handle the controls.
"By connection to the Result" as basic ( this way the old filters wouldn't be messed up ) and "not by connection" as alternative.
It may be nice.
But I'm not a programmer. I have no idea how complex and costly it can be.
  Details E-Mail
GMM
Moderator
Filter Forge, Inc
Posts: 3491
Quote
This also means that, every time that we detach something ( a single control or more ), the program deletes it from the list


The key point is "detach". Try re-routing the connection instead of detaching the component completely: if you can manage to keep an active connection while setting up the component tree, the filter controls will not be reset.

Finally, when Order of controls was introduced it was meant as a finishing touch to the filter rather than a starting point smile:-) Put it off until the filter is ready, and you won't need to re-arrange controls.
  Details E-Mail
adz
Posts: 4
This will fix the order alphabetical ... its a vbs script for windows. Its ugly but it works


'
Call RunFunctions

Sub RunFunctions

Dim va_array2()

if 1=1 then
vs_file = "C:\Users\Adam Law\AppData\Roaming\Filter Forge 3\My Filters\AJLDilateColourToAlpha.ffxml"
vs_filetext = ReadTextFile(vs_file)
'WScript.Echo("File: " & vs_1)
else
vs_file = Wscript.Arguments(0)
vs_filetext = ReadTextFile(vs_file)
'WScript.Echo("File: " & vs_1)
end If

va_array1 =GFMatchArray(vs_filetext, "<[^<]*<[^<]*value\-en[^>]*>", true ,true ,true)
ReDim va_array2(2, UBound(va_array1))

For count=1 To ubound (va_array1)
va_array2(0,count)=count
vs_1="id\='[^']*'"
vs_1=Replace(vs_1,"'", Chr(34))
va_array2(1,count)= GFMatch(va_array1(count), vs_1, true, true, true)
va_array2(2,count)= GFMatch(va_array1(count), "value\-en[^>]*", true, true, true)
Next

vs_1 = GFMatch(vs_filetext, "<ControlsOrder>[\S\s]*<\/ControlsOrder>", true, true, true)

va_array3 = TransposeDim(va_array2)
Call sortarray(va_array3, 2)
va_array3 = TransposeDim(va_array3)

vs_replace= "<ControlsOrder>"+ vbnewline
vs_replace= vs_replace+ "<Automatic value='false'/>" + vbnewline
vs_replace = Replace(vs_replace,"'", Chr(34))
vs_replace= vs_replace+ ""+ vbnewline
For count=1 To ubound (va_array1)
vs_replace= vs_replace+ "<Item " + va_array3(1,count) + " order=" + Chr(34) +CStr(count)+Chr(34) +"/>" + vbnewline
Next
vs_replace= vs_replace+ "
" + vbNewLine
vs_replace= vs_replace+ "</ControlsOrder>"

vs_filetext = Replace(vs_filetext, vs_1, vs_replace)
Call WriteTextFile(vs_file +"",vs_filetext)

If 1=0 Then
I also have XSLT Code ... but you need Altova Community Edition
Set objAltovaXML = CreateObject("AltovaXML.Application")
Set AltovaXMLXSLT2 = objAltovaXML.XSLT2

AltovaXMLXSLT2.InputXMLFileName=vs_1
AltovaXMLXSLT2.XSLFileName ="C:\Data_Server\Onehub\AAA_Data_OneHub\SV2\Data_VDrive\Data_QDrive\Febooti\FilterForge.xsl"
output = AltovaXMLXSLT2.Execute(outputfile) 'outputfile irrelevant

Set AltovaXMLXSLT2 =Nothing
Set objAltovaXML = Nothing
End if

End Sub




Function ReadTextFile(vs_1)
'Make sure that Febooti does not save unicode which is default

if 1=0 then
set adb = CreateObject("ADODB.Stream")
adb.Open
'.Type = adTypeBinary
adb.LoadFromFile vs_1
adb.Type = 2 'adTypeText
adb.Charset = "ascii" '"utf-8"
strText = adb.ReadText(-1) '
adb.Close
adb.Close
end if

Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
'WScript.Echo( vs_1 & len(vs_1))
Set objFile = objFSO.OpenTextFile(vs_1, ForReading)
'WScript.Echo( "End")
ReadTextFile = objFile.ReadAll()
'ReadTextFile = objFile.ReadLine
objFile.Close
set objFSO =Nothing

End Function


Sub WriteTextFile(vs_1,vs_2)
Set fso = CreateObject("Scripting.FileSystemObject")
'OpenTextFile Parameters:3.'-Filename4.'-The 2 is for writing... 1 is reading and 8 is appending5.'-The "True" is to create if not already there
Set fl = fso.OpenTextFile(vs_1, 2, True)
fl.Write(vs_2)
fl.Close
Set fl = Nothing
Set fso = Nothing
End SUb

Sub SDeleteFile(vs_2)
'Turn off error handling
On Error Resume Next
'file might not exist
'Create an instance of the FileSystemObject
Dim objFSO
Set objFSO = CreateObject("Scripting.FileSystemObject")

if objfso.fileexists(vs_2) then objFSO.DeleteFile(vs_2)
set objFSO = Nothing
End Sub


Function GFMatch(strString, strPattern, wglobal, wignorecase, wmultiline)

Dim RegEx, arrMatches
Dim colmatches
Dim wmatch
Dim Count


Set RegEx = New RegExp

RegEx.IgnoreCase = wignorecase

RegEx.MultiLine = wmultiline

RegEx.Global = wglobal

RegEx.Pattern = strPattern

Set colmatches = RegEx.Execute(strString)

Count = 0
For Each wmatch In colmatches
Count = Count + 1
If Count = 1 Then GFMatch = wmatch
Next

End Function



Function GFMatchArray(strString, strPattern, wglobal ,wignorecase ,wmultiline)


Dim RegEx, arrMatches
Dim tmatcharray()


Set RegEx = New RegExp

RegEx.IgnoreCase = wignorecase

RegEx.Global = wglobal

RegEx.MultiLine = wmultiline

RegEx.Pattern = strPattern

Set colmatches = RegEx.Execute(strString)

xdim = colmatches.Count
ReDim Preserve tmatcharray(xdim)

Count = 0
For Each wmatch In colmatches
Count = Count + 1
tmatcharray(Count) = wmatch.Value
Next

GFMatchArray = tmatcharray

End Function


Sub sortarray(arrayname, sortcolumn1)

' sortcolumn1 = 0
'Optional wnumeric As String = "numericstrings"

For i = LBound(arrayname, 1) To UBound(arrayname, 1) - 1
For j = LBound(arrayname, 1) To UBound(arrayname, 1) - 1
If wnumeric = "numericstrings" Then
Condition1 = CDbl(arrayname(j, sortcolumn1)) > CDbl(arrayname(j + 1, sortcolumn1))
Else
Condition1 = (arrayname(j, sortcolumn1)) > (arrayname(j + 1, sortcolumn1))
End If
If Condition1 Then
For Y = LBound(arrayname, 2) To UBound(arrayname, 2)
t = arrayname(j, Y)
arrayname(j, Y) = arrayname(j + 1, Y)
arrayname(j + 1, Y) = t
Next
End If
Next
Next

End Sub


Function TransposeDim(v)
' Custom Function to Transpose a 0-based array (v)

Xupper = UBound(v, 2)
Yupper = UBound(v, 1)

ReDim tempArray(Xupper, Yupper)
For X = 0 To Xupper
For Y = 0 To Yupper
tempArray(X, Y) = v(Y, X)
Next
Next

TransposeDim = tempArray

End Function
  Details E-Mail
adz
Posts: 4
Or you can use this xslt transform

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>

<!--Identity Transform.-->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>

<xsl:template match="ControlsOrder/Items">

<xsl:for-each select="//Name/@value-en">
<xsl:sort select="." order="ascending"/>
<Item>
<xsl:attribute name="id">
<xsl:value-of select="../. ./@id"/>
</xsl:attribute>
<xsl:attribute name="order">
<xsl:value-of select="position()"/>
</xsl:attribute>

</xsl:for-each>
</Items>
</xsl:template>

</xsl:stylesheet>
  Details E-Mail
adz
Posts: 4
Or you can use this
Code

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output indent="yes"/>
   <xsl:strip-space elements="*"/>

   <!--Identity Transform.-->
   <xsl:template match="node()|@*">
      <xsl:copy>
         <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="ControlsOrder/Items">
      <Items>
         <xsl:for-each select="//Name/@value-en">
            <xsl:sort select="." order="ascending"/>
            <Item>
               <xsl:attribute name="id">
                  <xsl:value-of select="../. ./@id"/>
               </xsl:attribute>
               <xsl:attribute name="order">
                  <xsl:value-of select="position()"/>
               </xsl:attribute>
            </Item>
         </xsl:for-each>         
      </Items>
   </xsl:template>
</xsl:stylesheet>


(nb there is no space between the ". ." above. The post is mangling it
  Details E-Mail
SpaceRay
SpaceRay

Posts: 12302
Filters: 35
Quote
GMM wrote

"This is by design: unlinking the component subtree from Result will reset the order to the default state.

Restoring via Ctrl+Z will be supported in a future upd ate.

This has been fixed and will be available in the next update 4.010."


I have seen that now is available FF 4.011, and from the answer above is not clear if it is already available or not.

Please, is this already working and included in 4.011 or it is going to be included in another future update?

I think this is would be very useful and helpful to have

Quote
xirja wrote:

If I have a custom ordered "Simple filter" and want to make a "Surface" version, I have to manually re-order the controls again?


YES!! This is one of the main reasons why this would be really helpful as because changing the simple to surface will rese t ALL the controls and it is really a pain and very time consuming to re-order again if you have many controls
  Details E-Mail
Ramlyn
Ramlyn

Posts: 2930
Filters: 691
We started the war of Controls. Ha! Ha!

Let's say the point.
We have two different lines among filters creators :

- Somebody believes in "click and go" filters.

Filters with no more than 10 controls, generally simple and fast.

They clearly have no interest about the Controls order trouble, because their filters probably don't even need the "Custom" option.

- Other filter makers prefer to have more Controls in their filters.
This doesn't necessarily make the filter slow or huge.
It simply gives in the hands of the user a filter with a wide range of interactions and customization.

It is clear that the makers of this kind of filters are interested that the order of controls is not messed up every time that they pass from Simple Filter to Surface.
It takes a lot of time to reorder 50-60 controls ( and the Automatic way is completely useless with many controls. It doesn't even put them in alphabetical order. ), and it is not something that we can avoid to do.

There is more.
It would be very useful if there was a bit more space for the Controls name.
In my case I have filters using the same Component several times. Because it is the same component, also the Controls will have the same functions, but in completely different areas of the filter. Sometimes I'm obliged to write cryptic names like "Rotation P1" or "Mode S4", because there is no enough space for writing a more explicative name.

Doing this doesn't mean to "forget the aim of FF", like it was said in other topics.
Nobody wants to change Filter Forge to a new Photoshop.
We only want to do good filters. Filters that may be good for who simply wants to finish all with one click, but also for who needs to customize and adapt the result to different kinds of pictures, effects, textures.
  Details E-Mail
Skybase
2D/3D Generalist

Posts: 4025
Filters: 76
A bit more naming space would actually be a nice addition. smile;) Or maybe tool tips to help people out?
Oh filterforge... drowning in suggestions smile;)

Adz, nice work!

---My views below here---

I think there are only a handful of people making epic filters with 50+ controls anyway. A good 95% or so of the filters that get uploaded typically have <20 controls. But yeah, having some ability to preserve it is nice. So I'll wait for the update.

In the workflow of things, I typically don't bother organizing a filter until the very very end before the submission, so it never bothered me as much.

Also, just a side note since the thread's got the topic rolling, if you look at other 3rd-party filters for Photoshop, they typically don't have tons of controls. While a lot of it is compensated through a GUI, the point here is that in terms of usability, my bet is that users typically don't even go tweaking more than 15 controls per interface. I think FilterForge users are more interested in results than control.

Personally, I don't think its a bad idea having some filters with a ton of controls, it's just that I just wish people would take more time rigging it properly so it works under any circumstance, and also consider their users if it's intended to be public. I'm fairly certain doing that makes a good filter even if it does exceed certain bounds.

Back on topic, so yes! Please do give this a fix!
  Details E-Mail

Join Our Community!

Filter Forge has a thriving, vibrant, knowledgeable user community. Feel free to join us and have fun!

33,712 Registered Users
+18 new in 30 days!

153,537 Posts
+6 new in 7 days!

15,348 Topics
+72 new in year!

Create an Account

Online Users Last minute:

27 unregistered users.