|
forums.silverfrost.com Welcome to the Silverfrost forums
|
View previous topic :: View next topic |
Author |
Message |
Kenneth_Smith
Joined: 18 May 2012 Posts: 697 Location: Hamilton, Lanarkshire, Scotland.
|
Posted: Thu Apr 08, 2021 4:18 pm Post subject: V8.71 %pl |
|
|
I would be grateful if somebody who has installed the updated version could test the following code. When I select the "half extents" button I see data points drawn in the left and right margins of the %pl region. I'm trying to decide if I've corrupted my FTN95 installation or not.
Thanks
Ken
Code: | module problem_mod
use clrwin
implicit none
integer, parameter :: dp=kind(1.d0)
integer, parameter :: npoints = 200
real(kind=dp) x(1:npoints), y(1:npoints)
contains
integer function gen_data()
integer i
do i = 1, npoints
x(i) = 2.d0*random@()-1.d0 ; y(i) = 2.d0*random@()-1.d0
end do
gen_data = 2
end function gen_data
integer function plot_data()
integer iw
iw = winio@('%2.1ob&')
call winop@('%pl[native, x_array, n_graphs=1, gridlines, link=none, symbol=6, frame, colour=blue, etched]')
iw = winio@('%pl&',1000,800,npoints,x,y)
iw = winio@('%cb&')
iw = winio@('This button sets xmin=-1, xmax=1, ymin=-1, ymax=1 &')
iw = winio@('%nl%^bt[Full extents]&', full_extents_cb)
iw = winio@('%2nlThis button sets xmin=-0.5, xmax=0.5, ymin=-0.5, ymax=0.5 &')
iw = winio@('%nlThis results in points being plotted in the left and right margins&')
iw = winio@('%nl%^bt[Half extents]&', half_extents_cb)
iw = winio@('%cb&')
iw = winio@(' ')
plot_data = 2
end function plot_data
integer function full_extents_cb()
integer i
i = CHANGE_PLOT_DBL@(0, 'x_min', 0, -1.d0 )
i = CHANGE_PLOT_DBL@(0, 'x_max', 0, 1.d0 )
i = CHANGE_PLOT_DBL@(0, 'y_min', 0, -1.d0 )
i = CHANGE_PLOT_DBL@(0, 'y_max', 0, 1.d0 )
call simpleplot_redraw@()
full_extents_cb = 2
end function full_extents_cb
integer function half_extents_cb()
integer i
i = CHANGE_PLOT_DBL@(0, 'x_min', 0, -0.5d0 ) ; print*, i
i = CHANGE_PLOT_DBL@(0, 'x_max', 0, 0.5d0 ) ; print*, i
i = CHANGE_PLOT_DBL@(0, 'y_min', 0, -0.5d0 ) ; print*, i
i = CHANGE_PLOT_DBL@(0, 'y_max', 0, 0.5d0 ) ; print*, i
call simpleplot_redraw@()
half_extents_cb = 2
end function half_extents_cb
end module problem_mod
program main
use problem_mod
implicit none
integer i
i = gen_data()
i = plot_data()
end program main |
|
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 7928 Location: Salford, UK
|
Posted: Thu Apr 08, 2021 4:46 pm Post subject: |
|
|
Ken
Is it 32 bits or 64 bits and does it make a difference? |
|
Back to top |
|
|
Kenneth_Smith
Joined: 18 May 2012 Posts: 697 Location: Hamilton, Lanarkshire, Scotland.
|
Posted: Thu Apr 08, 2021 5:08 pm Post subject: |
|
|
Paul,
It makes no difference, both 32 and 64 bit versions give the same response.
What is interesting (or perhaps I mean frustrating) is that other code using this technique continues to run as expected, but I cannot see a reason why this simple example fails.
Here is a screenshot: https://www.dropbox.com/s/ecs6wzkjb02y5su/pl_pic2.jpg?dl=0
PS Putting my installation back to a clean copy of FTN95 version 8.70 the code runs as expected. When I then install the April 6 2021 DLLs (newDLLs 77) and Clearwin+ mod files etc, the code does not run correctly. |
|
Back to top |
|
|
DanRRight
Joined: 10 Mar 2008 Posts: 2819 Location: South Pole, Antarctica
|
Posted: Fri Apr 09, 2021 1:47 am Post subject: |
|
|
Ken
Yes, "half" makes dots drawn on the border.
I installed Apr 6 update |
|
Back to top |
|
|
Kenneth_Smith
Joined: 18 May 2012 Posts: 697 Location: Hamilton, Lanarkshire, Scotland.
|
Posted: Fri Apr 09, 2021 9:16 am Post subject: |
|
|
Dan,
Thanks for confirming this issue. |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 7928 Location: Salford, UK
|
Posted: Fri Apr 09, 2021 10:38 am Post subject: |
|
|
This failure has now been fixed and I have provided a new download via the sticlky post. |
|
Back to top |
|
|
Kenneth_Smith
Joined: 18 May 2012 Posts: 697 Location: Hamilton, Lanarkshire, Scotland.
|
Posted: Fri Apr 09, 2021 1:36 pm Post subject: |
|
|
Paul,
Thanks for this. I can confirm that this works for the sample above.
Unfortunately I can still replicate the error in the more complex code I was looking at yesterday (under certain specific scenarios).
I will look again at the this code for errors. It's only 180 lines of code, but the logic is complex and I'm pushing the envelope a bit in terms of my previous %pl usage.
Ken |
|
Back to top |
|
|
Kenneth_Smith
Joined: 18 May 2012 Posts: 697 Location: Hamilton, Lanarkshire, Scotland.
|
Posted: Fri Apr 09, 2021 2:10 pm Post subject: |
|
|
Paul,
This sample demonstrates the issue. If the first adjustment is *only* to the range of x values I still see points drawn in the left and right margins.
Code: | winapp
module problem_mod
use clrwin
implicit none
integer, parameter :: dp=kind(1.d0)
integer, parameter :: npoints = 200
real(kind=dp) x(1:npoints), y(1:npoints)
contains
integer function gen_data()
integer i
do i = 1, npoints
x(i) = 2.d0*random@()-1.d0 ; y(i) = 2.d0*random@()-1.d0
end do
gen_data = 2
end function gen_data
integer function plot_data()
integer iw
iw = winio@('%2.1ob&')
call winop@('%pl[native, x_array, n_graphs=1, gridlines, link=none, symbol=6, frame, colour=blue, etched]')
iw = winio@('%pl&',1000,800,npoints,x,y)
iw = winio@('%cb&')
iw = winio@('This button sets xmin=-1, xmax=1, ymin=-1, ymax=1 &')
iw = winio@('%nl%^bt[Full extents]&', full_extents_cb)
iw = winio@('%2nlThis button sets xmin=-0.5, xmax=0.5 &')
iw = winio@('%nl%^bt[Half x extents]&', half_x_extents_cb)
iw = winio@('%2nlThis button sets ymin=-0.5, ymax=0.5 &')
iw = winio@('%nl%^bt[Half y extents]&', half_y_extents_cb)
iw = winio@('%bf%2nl After the window is initially displayed if&')
iw = winio@('%nl the first user action is to select "Half x extents"&')
iw = winio@('%nl points are displayed in the left and right margins&')
iw = winio@('%nl If "Half x extents" is selected after another button&')
iw = winio@('%nl the problem does not occur&')
iw = winio@('%cb&')
iw = winio@(' ')
plot_data = 2
end function plot_data
integer function half_x_extents_cb()
integer i
i = CHANGE_PLOT_DBL@(0, 'x_min', 0, -0.5d0 )
i = CHANGE_PLOT_DBL@(0, 'x_max', 0, 0.5d0 )
call simpleplot_redraw@()
half_x_extents_cb =1
end function half_x_extents_cb
integer function half_y_extents_cb()
integer i
i = CHANGE_PLOT_DBL@(0, 'y_min', 0, -0.5d0 )
i = CHANGE_PLOT_DBL@(0, 'y_max', 0, 0.5d0 )
call simpleplot_redraw@()
half_y_extents_cb =1
end function half_y_extents_cb
integer function full_extents_cb()
integer i
i = CHANGE_PLOT_DBL@(0, 'x_min', 0, -1.d0 )
i = CHANGE_PLOT_DBL@(0, 'x_max', 0, 1.d0 )
i = CHANGE_PLOT_DBL@(0, 'y_min', 0, -1.d0 )
i = CHANGE_PLOT_DBL@(0, 'y_max', 0, 1.d0 )
call simpleplot_redraw@()
full_extents_cb = 1
end function full_extents_cb
end module problem_mod
program main
use problem_mod
implicit none
integer i
i = gen_data()
i = plot_data()
end program main |
|
|
Back to top |
|
|
Kenneth_Smith
Joined: 18 May 2012 Posts: 697 Location: Hamilton, Lanarkshire, Scotland.
|
Posted: Fri Apr 09, 2021 11:22 pm Post subject: |
|
|
Paul,
I did a little more digging into this issue this evening. The second example I posted also fails with V8.70
The difference between the second example and earlier applications I have coded is that in the earlier codes there are always four calls to CHANGE_PLOT_DBL@ before the call to simpleplot_redraw@, i.e. I updated all four extent limits even when only two actually required to be changed. As a consequence, this issue was undetected until I deliberately started to avoid unnecessary calls to CHANGE_PLOT_DBL@ in the code I am presently working with.
Below is a slightly modified version of my second example. If you remove the two lines commented out in the function half_extents_cb, then the problem when the user first clicks on the "half_extents" button does not occur. |
|
Back to top |
|
|
Kenneth_Smith
Joined: 18 May 2012 Posts: 697 Location: Hamilton, Lanarkshire, Scotland.
|
Posted: Fri Apr 09, 2021 11:48 pm Post subject: |
|
|
Code: | winapp
module problem_mod
use clrwin
implicit none
integer, parameter :: dp=kind(1.d0)
integer, parameter :: npoints = 200
real(kind=dp) x(1:npoints), y(1:npoints)
real(kind=dp) :: x_min = -1.d0, x_max = 1.d0, y_min = -1.d0, y_max = 1.d0
contains
integer function gen_data()
integer i
do i = 1, npoints
x(i) = 2.d0*random@()-1.d0 ; y(i) = 2.d0*random@()-1.d0
end do
gen_data = 2
end function gen_data
integer function plot_data()
integer iw
iw = winio@('%2.1ob&')
call winop@('%pl[native, x_array, n_graphs=1, gridlines, link=none, symbol=6, frame, colour=blue, etched]')
iw = winio@('%pl&',1000,800,npoints,x,y)
iw = winio@('%cb&')
iw = winio@('This button sets xmin=-1, xmax=1, ymin=-1, ymax=1 &')
iw = winio@('%nl%^bt[Full extents]&', full_extents_cb)
iw = winio@('%2nlThis button sets xmin=-0.5, xmax=0.5 &')
iw = winio@('%nl%^bt[Half x extents]&', half_x_extents_cb)
iw = winio@('%2nlThis button sets ymin=-0.5, ymax=0.5 &')
iw = winio@('%nl%^bt[Half y extents]&', half_y_extents_cb)
iw = winio@('%bf%2nl After the window is initially displayed if&')
iw = winio@('%nl the first user action is to select "Half x extents"&')
iw = winio@('%nl points are displayed in the left and right margins&')
iw = winio@('%nl If "Half x extents" is selected after another button&')
iw = winio@('%nl the problem does not occur&')
iw = winio@('%cb&')
iw = winio@(' ')
plot_data = 2
end function plot_data
integer function half_x_extents_cb()
integer i
x_min = -0.5d0
x_max = 0.5d0
i = CHANGE_PLOT_DBL@(0, 'x_min', 0, x_min ) ; i = CHANGE_PLOT_DBL@(0, 'x_max', 0, x_max )
! i = CHANGE_PLOT_DBL@(0, 'y_min', 0, y_min ) !Uncomment these two lines and there is no issue
! i = CHANGE_PLOT_DBL@(0, 'y_max', 0, y_max )
call simpleplot_redraw@()
half_x_extents_cb =1
end function half_x_extents_cb
integer function half_y_extents_cb()
integer i
y_min = -0.5d0 ; y_max = 0.5d0
i = CHANGE_PLOT_DBL@(0, 'y_min', 0, y_min ) ; i = CHANGE_PLOT_DBL@(0, 'y_max', 0, y_max)
i = CHANGE_PLOT_DBL@(0, 'x_min', 0, x_min ) ; i = CHANGE_PLOT_DBL@(0, 'x_max', 0, x_max)
call simpleplot_redraw@()
half_y_extents_cb =1
end function half_y_extents_cb
integer function full_extents_cb()
integer i
x_min = -1.d0 ; x_max = 1.d0 ; y_min = -1.d0 ; y_max = 1.d0
i = CHANGE_PLOT_DBL@(0, 'x_min', 0, x_min ) ; i = CHANGE_PLOT_DBL@(0, 'x_max', 0, x_max )
i = CHANGE_PLOT_DBL@(0, 'y_min', 0, y_min ) ; i = CHANGE_PLOT_DBL@(0, 'y_max', 0, y_max )
call simpleplot_redraw@()
full_extents_cb = 1
end function full_extents_cb
end module problem_mod
program main
use problem_mod
implicit none
integer i
i = gen_data() ; i = plot_data()
end program main |
|
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 7928 Location: Salford, UK
|
Posted: Sat Apr 10, 2021 9:05 am Post subject: |
|
|
Ken
I am not sure that there is anything for me to fix here.
The ClearWin+ code does not always handle the case where the min and max values are not set initially but are then changed dynamically.
It may be possible to get ClearWin+ to handle this case but the logic does get more and more complex.
Try initialising these values to see if that works for you....
Code: | call winop_flt@('%pl[x_min]', x_min)
call winop_flt@('%pl[x_max]', x_max)
call winop_flt@('%pl[y_min]', y_min)
call winop_flt@('%pl[y_max]', y_max)
|
|
|
Back to top |
|
|
Kenneth_Smith
Joined: 18 May 2012 Posts: 697 Location: Hamilton, Lanarkshire, Scotland.
|
Posted: Sat Apr 10, 2021 12:21 pm Post subject: |
|
|
As ever, thanks Paul,
You have provided the missing link i.e. "The ClearWin+ code does not always handle the case where the min and max values are not set initially but are then changed dynamically."
What I am trying to achieve is an auxiliary Fortran module with data and routes which when used in conjunction with %pl allow the application of %pv, %hx, %hv and a zoom function without any further processing of the raw input x, y data. This has the potential to simplify the writing of future code requiring these features.
My idea was to let %pl choose the initial limits, then once the %pl region is formed as you know the %pl initial graphics width and graphics height (or can now deduce them following a resize), and have specified the margins, all the coordinate data required for a scroll or zoom operation can be deduced via calls to GET_PLOT_DATA@. This requires two callbacks to be attached to the %pl via '+'; one to process the scrollbar movements and one to annotate the plot via "PLOT_ADJUST" if required.
At the moment the have %pv and %hv working correctly, with only %hv causing a problem if it is the first action of the user is to select the x-axis scroll bar.
I think I have enough information now to complete the task, based on what you have told me and my observations. I will share the code if I am successful. |
|
Back to top |
|
|
Kenneth_Smith
Joined: 18 May 2012 Posts: 697 Location: Hamilton, Lanarkshire, Scotland.
|
Posted: Wed Apr 14, 2021 9:34 pm Post subject: |
|
|
As promised, here is an example that demonstrates the idea I was thinking about. It works as described above. Note this example requires the latest version of FTN95 V8.71.
https://www.dropbox.com/s/hk63wpmol2nt0it/scrollpluszoom.f95?dl=0
Paul,
Please take a look at Examples 2 and 3 in the code.
In Example 2 with [link=columns], when the vertical scroll bar is moved upwards, each column disappears when the data point associated with it moves beyond the current %pl y_max value.
In Example 3, with [link=bars], a horizontal scroll bar movement which causes the data point to move beyond the current %pl x limits does not cause the bar to disappear.
This difference between [link=columns] and [link=bars] seems a little odd to me. |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 7928 Location: Salford, UK
|
Posted: Thu Apr 15, 2021 2:58 pm Post subject: |
|
|
Ken
I have made a note of this. |
|
Back to top |
|
|
Kenneth_Smith
Joined: 18 May 2012 Posts: 697 Location: Hamilton, Lanarkshire, Scotland.
|
Posted: Fri Apr 16, 2021 12:48 pm Post subject: |
|
|
Paul,
Here is a much simpler code that demonstrates the difference between [link=columns] and [link=bars] when changing the %pl limits.
Code: | module demo
use clrwin
implicit none
integer, parameter :: dp = kind(1.d0), npoints=21
real(kind=dp) x(1:npoints), y(1:npoints)
real(kind=dp) :: x_min, x_max, y_min, y_max
contains
integer function gen_data()
integer i, j
j = -10
do i = 1, npoints
x(i) = j ; y(i) = j
j = j + 1
end do
gen_data = 2
end function gen_data
integer function plot3()
integer iw
y_min=-10; y_max=10; x_min=-10; x_max=10
call winop@('%pl[native,x_array,frame,gridlines, width=5,link=columns,symbol=0,colour=blue]')
iw = winio@('%pl&',800,800,npoints,x,y)
iw = winio@('%^4bt[UP]%^4bt[DOWN]&',up_cb,down_cb)
iw = winio@('%ff%cn%bt[OK]')
plot3 = 2
end function plot3
integer function plot4()
integer iw
y_min=-10; y_max=10; x_min=-10; x_max=10
call winop@('%pl[native,x_array,frame,gridlines, width=5,link=bars,symbol=0, colour=blue]')
iw = winio@('%pl&',800,800,npoints,x,y)
iw = winio@('%^5bt[Left]%^5bt[Right]&',left_cb,right_cb)
iw = winio@('%ff%cn%bt[OK]')
plot4 = 2
end function plot4
integer function up_cb()
y_min = y_min - 1.0d0 ; y_max = y_max - 1.0d0 ; call update ; up_cb = 2
end function up_cb
integer function down_cb()
y_min = y_min + 1.d0 ; y_max = y_max + 1.d0 ; call update ; down_cb = 2
end function down_cb
integer function left_cb()
x_min = x_min + 1.d0 ; x_max = x_max + 1.d0 ; call update ; left_cb = 2
end function left_cb
integer function right_cb()
x_min = x_min - 1.d0 ; x_max = x_max - 1.d0 ; call update ; right_cb = 2
end function right_cb
subroutine update
integer i
i = CHANGE_PLOT_DBL@(0, 'x_min', 0, x_min ) ; i = CHANGE_PLOT_DBL@(0, 'x_max', 0, x_max )
i = CHANGE_PLOT_DBL@(0, 'y_min', 0, y_min ) ; i = CHANGE_PLOT_DBL@(0, 'y_max', 0, y_max )
call simpleplot_redraw@()
end subroutine update
end module demo
program main
use demo
i = gen_data() ; i = plot3() ; i = plot4()
end program main |
|
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|