Re: cgColor and Widget_Draw Frame problem [message #81854 is a reply to message #81853] |
Thu, 01 November 2012 13:12   |
Helder Marchetto
Messages: 520 Registered: November 2011
|
Senior Member |
|
|
On Thursday, November 1, 2012 3:23:26 PM UTC+1, David Fanning wrote:
> Helder writes:
>
>
>
>> I've been using cgColor quite successfully for quite a while with this, but I started to get a strange problem.
>
>> If I create a draw widget with a frame then cgColor throws an error.
>
>> This is the code that generates the error:
>
>>
>
>> PRO TestcgColor
>
>> wBase = widget_base()
>
>> wDrawColor = WIDGET_DRAW(wBase, XSIZE=100, YSIZE=100, FRAME=1)
>
>> WIDGET_CONTROL, wBase, /REALIZE
>
>> print, !D.x_size, !D.y_size
>
>> print, cgcolor('white')
>
>> END
>
>>
>
>> And the error reads: "CGSNAPSHOT--> TVRD: Value of Area is out of allowed range."
>
>>
>
>> The reason is that the draw region that I generated is 100x100 pixel and the size of the window is given as 102x102 (1 pixel per side).
>
>>
>
>> Is there a way to overcome this problem?
>
>> I think one can read the frame size from (widget_info(..., /geometry)).margin and then subtract this from !D.x_size and !D.y_size (actually 2*margin) when calculating the opposite pixel in cgColor().
>
>>
>
>> Does this make any sense or am I on the false track?
>
>
>
> Sigh... If there is one thing I hate, it is widget geometry. :-(
>
>
>
> Is this some kind of LINUX you are running on? What is the
>
> result of printing !D.x_vsize, and !D.y_vsize? What version
>
> of IDL is this? All of these things are going to matter.
>
>
>
> All cgColor is trying to do is read the pixel "color" in the
>
> upper right-hand corner of the graphics window. You might think
>
> this would be a simple thing to do...
>
>
>
> Cheers,
>
>
>
> David
>
>
>
>
>
> --
>
> David Fanning, Ph.D.
>
> Fanning Software Consulting, Inc.
>
> Coyote's Guide to IDL Programming: http://www.dfanning.com/
>
> Sepore ma de ni thue. ("Perhaps thos speakest truth.")
Hi David,
the result of the
print, !D.x_size, !D.y_size
is
102 102
and
print, !Version
{ x86_64 Win32 Windows Microsoft Windows 8.2 Apr 10 2012 64 64}
After 15 min of debugging, I found out something quite strange... I monitored the values !d.x_size and !d.y_size. Some when in cgSnapshot you use wSet to select the current window. At this point the size of the window is reduced from 102 to 100 pixel... This seems to overcome the error:
PRO TestcgColor
wBase = widget_base()
wDrawColor = WIDGET_DRAW(wBase, XSIZE=100, YSIZE=100, FRAME=1)
WIDGET_CONTROL, wBase, /REALIZE
print,'Before wSet:',!d.x_size, !d.y_size
ThisWindow = !d.Window
wSet, ThisWindow
print,'After wSet:',!d.x_size, !d.y_size
print, cgcolor('white')
END
I don't understand "why" this changes. My guess is that this is a bug, but then it must be quite old...
One way to come around this problem would be to use wSet before you get the values of the size of the image and call cgSnapShot in cgColor (line 410 in my version).
I hope this helps.
Cheers,
Helder
|
|
|