
;+ ***********************************************************************
; NAME:
;	OPTIC_CIRC
;
; PURPOSE:
;	Cette procedure visualise une image et demande de definir le cercle
; optique en cliquant 3 points (CIR_3PNT)
;	Ou bien demande d'entrer les cooordonnees du centre et la valeur du
; rayon solaire
;
; CATEGORY:
;	Visualisation
;
; CALLING SEQUENCE:
;	OPTIC_CIRC,Image,Xcen, Ycen, Ray

;
; INPUTS:
;	Image	Image a visualiser (2 ou 3 dimensions)
;

; OUTPUTS:
;	Xcen	coordonnee X du centre du soleil optique
;	Ycen	coordonnee Y du centre du soleil optique
;	Ray	rayon du soleil optique
;
; KEYWORDS:
;	DIM	Dimension de l'image affichee, 400 par defaut
;	GROUP	Identification du widget appelant
;
; PROCEDURE;
;	Cette procedure demande la confirmation de la determination du 
;	soleil optique. Efface la fenetre et recommence l'affichage si 
;	on le demande. Sinon elle efface la fenetre et retourne
;
; EXAMPLE:
;
; MODIFICATION HISTORY:
;	Ecrit par: J Bonmartin le 25/11/97
;	Le 10/05/99	Widget pour la saisie des coordonnees du centre et
;		la valeur du rayon (JB)
;       Le 6 nov 2008   Gestion des images 2D et 3D (true color) (AB)
;-*******************************************************************


PRO OPTIC_CIRC_EVENT, Event

COMMON OPTIC_CIRC, Im, X,Y,R, Wdim, Id_text

WIDGET_CONTROL, Event.Id, GET_UVALUE= ev
CASE EV OF
	'Xp':	X= Event.value
	'Yp':	Y= Event.value
	'Ry':	R= Event.value
	'3p': BEGIN

WIN = 400
IF KEYWORD_SET(DIM) THEN Win = Dim

	SZI=size(im)
        sz = intarr(3)
        if SZI(0) eq 2 then begin
             sz(1) = szi(1) & sz(2) = szi(2) 
        end else begin
             sz(1) = szi(2) & sz(2) = szi(3) 
        endelse
	NPT = sz(1)>sz(2)
	Reduc = Npt / Win
	IF Reduc EQ 0 THEN Reduc = 1
	NPX = sz(1) / reduc
	NPY = sz(2) / reduc

RETOUR:	WINDOW,/Free, Xsize= Npx, Ysize = Npy
        if size(im,/n_dim) eq 2 then im_cgrd = congrid(im,npx,npy)
        if size(im,/n_dim) eq 3 then im_cgrd = congrid(im,3,npx,npy)

	if size(im,/n_dim) eq 2 then TVSCL,im_cgrd 
        if size(im,/n_dim) eq 3 then TVSCL,im_cgrd, true=1
       x= intarr(3)
       y= intarr(3)
       WIDGET_CONTROL, Id_text,SET_VALUE='DEFINE solar circle by 3 POINTS'
       For i=0, 2 DO BEGIN
              cursor,p1,p2,/device,/UP
              x(i) = p1
              y(i) = p2
       end
 
       CIR_3PNT, x, y, RAY, XCEN, YCEN
       TVCIRCLE,Ray,Xcen,Ycen

	RET=DIALOG_MESSAGE('Optic Circle OK',/Question)
	Wdelete
	IF Ret EQ 'No' THEN GOTO, Retour

	R= Ray *reduc
	X = XCEN *reduc
	Y = Ycen *reduc
		WIDGET_CONTROL, Event.Top,/DESTROY
	END

	'Exit': WIDGET_CONTROL, Event.Top,/DESTROY

ENDCASE
END

PRO OPTIC_CIRC,Image,Xcen, Ycen, Ray, DIM = dim, GROUP=Group

COMMON OPTIC_CIRC, Im, X,Y,R, Wdim, Id_text

IM = IMAGE
IF NOT KEYWORD_SET(GROUP) THEN Group=0
Base = WIDGET_BASE( GROUP_LEADER=Group, /COLUMN, TITLE ='Optical circle')

	ID = CW_FIELD(Base, VALUE=0, UVALUE= 'Xp', $
		TITLE='COORD X center(pixels)',/ALL_EVENTS,/INTEGER)
	ID = CW_FIELD(Base, VALUE=0, UVALUE= 'Yp', $
		TITLE='COORD Y center(pixels)',/ALL_EVENTS,/INTEGER)
	ID = CW_FIELD(Base, VALUE=0, UVALUE= 'Ry', $
		TITLE='Circle RADIUS (pixels)',/ALL_EVENTS,/INTEGER)
	ID = WIDGET_BUTTON(Base, VALUE='Circle / 3 points', UVALUE='3p')
	ID = WIDGET_BUTTON(Base, VALUE='Exit', UVALUE='Exit')
	ID_Text = WIDGET_TEXT(Base, VALUE='')

WIDGET_CONTROL, Base, /REALIZE
XMANAGER, 'OPTIC_CIRC', Base
	Xcen = X & Ycen = Y & Ray = R
END 
