R/cdtExtractData_leftCmd.R

Defines functions ExtractDataPanelCmd

ExtractDataPanelCmd <- function(){
    listOpenFiles <- openFile_ttkcomboList()
    if(WindowsOS()){
        largeur0 <- 30
        largeur1 <- 34
        largeur2 <- 36
        largeur3 <- 27
        largeur4 <- 31
        largeur5 <- 12
    }else{
        largeur0 <- 30
        largeur1 <- 33
        largeur2 <- 34
        largeur3 <- 27
        largeur4 <- 31
        largeur5 <- 13
    }

    ##############

    MOIS <- format(ISOdate(2014, 1:12, 1), "%B")
    
    GeneralParameters <- list(intstep = "daily", minhour = 0, season.len = 3,
                              season.start = 1, type.extract = "point",
                              data.type = 'cdtnetcdf', cdtdataset = list(index = ""),
                              cdtnetcdf = list(dir = "", sample = "", format = "rr_mrg_%s%s%s.nc"),
                              shp.file = list(shp = "", attr = ""),
                              out.data = list(format = "cdt", sp.avrg = FALSE, outdir = ""),
                              months = list(start = 1, end = 12))

    GeneralParameters$date.range <- list(start.year = 2021, start.mon = 1,
                                         start.dek = 1, start.pen = 1, start.day = 1,
                                         start.hour = 0, start.min = 0,
                                         end.year = 2022, end.mon = 12,
                                         end.dek = 3, end.pen = 6, end.day = 31,
                                         end.hour = 23, end.min = 55)

    GeneralParameters$Geom <- list(minlon = '', maxlon = '', minlat = '', maxlat = '',
                                   padlon = 0, padlat = 0, namePoly = '', multiObj = NULL)

    .cdtData$EnvData$multiptspoly <- NULL

    ##############

    xml.dlg <- file.path(.cdtDir$dirLocal, "languages", "cdtExtractData_leftCmd.xml")
    lang.dlg <- cdtLanguageParse(xml.dlg, .cdtData$Config$lang.iso)
    .cdtData$EnvData$message <- lang.dlg[['message']]

    ##############
    .cdtData$EnvData$zoom$xx1 <- tclVar()
    .cdtData$EnvData$zoom$xx2 <- tclVar()
    .cdtData$EnvData$zoom$yy1 <- tclVar()
    .cdtData$EnvData$zoom$yy2 <- tclVar()

    .cdtData$EnvData$zoom$pressButP <- tclVar(0)
    .cdtData$EnvData$zoom$pressButM <- tclVar(0)
    .cdtData$EnvData$zoom$pressButRect <- tclVar(0)
    .cdtData$EnvData$zoom$pressButDrag <- tclVar(0)

    .cdtData$EnvData$pressGetCoords <- tclVar(0)

    ZoomXYval0 <- NULL

    ###################

    .cdtEnv$tcl$main$cmd.frame <- tkframe(.cdtEnv$tcl$main$panel.left)

    tknote.cmd <- bwNoteBook(.cdtEnv$tcl$main$cmd.frame)

    cmd.tab1 <- bwAddTab(tknote.cmd, text = lang.dlg[['tab_title']][['1']])
    cmd.tab2 <- bwAddTab(tknote.cmd, text = lang.dlg[['tab_title']][['2']])
    cmd.tab3 <- bwAddTab(tknote.cmd, text = lang.dlg[['tab_title']][['3']])

    bwRaiseTab(tknote.cmd, cmd.tab1)

    tkgrid.columnconfigure(cmd.tab1, 0, weight = 1)
    tkgrid.columnconfigure(cmd.tab2, 0, weight = 1)
    tkgrid.columnconfigure(cmd.tab3, 0, weight = 1)

    tkgrid.rowconfigure(cmd.tab1, 0, weight = 1)
    tkgrid.rowconfigure(cmd.tab2, 0, weight = 1)
    tkgrid.rowconfigure(cmd.tab3, 0, weight = 1)

    #######################################################################################################

    set.data.type.vars <- function(data.type, intstep){
        if(intstep == 'onefile'){
            txt <- lang.dlg[['label']][['3-1']]
            state <- "disabled"
            help1 <- lang.dlg[['tooltip']][['3-1']]
            help2 <- lang.dlg[['status']][['3-1']]
        }else{
            if(data.type == 'cdtnetcdf'){
                txt <- lang.dlg[['label']][['3']]
                state <- "normal"
                help1 <- lang.dlg[['tooltip']][['3']]
                help2 <- lang.dlg[['status']][['3']]
            }else{
                txt <- lang.dlg[['label']][['4']]
                state <- "disabled"
                help1 <- lang.dlg[['tooltip']][['4']]
                help2 <- lang.dlg[['status']][['4']]
            }
        }

        list(txt = txt, state = state, tooltip = help1, status = help2)
    }

    initXYval0 <- NA
    initializeButZoom <- function(){
        initXYval0 <<- trimws(c(tclvalue(.cdtData$EnvData$zoom$xx1),
                                  tclvalue(.cdtData$EnvData$zoom$xx2),
                                  tclvalue(.cdtData$EnvData$zoom$yy1),
                                  tclvalue(.cdtData$EnvData$zoom$yy2)))

        tclvalue(.cdtData$EnvData$zoom$pressButP) <- 0
        tclvalue(.cdtData$EnvData$zoom$pressButM) <- 0
        tclvalue(.cdtData$EnvData$zoom$pressButRect) <- 0
        tclvalue(.cdtData$EnvData$zoom$pressButDrag) <- 0

        tclvalue(.cdtData$EnvData$pressGetCoords) <- 0

        tkconfigure(.cdtData$EnvData$zoom$btZoomP, relief = 'raised', bg = 'lightblue', state = 'normal')
        tkconfigure(.cdtData$EnvData$zoom$btZoomM, relief = 'raised', bg = 'lightblue', state = 'normal')
        tkconfigure(.cdtData$EnvData$zoom$btZoomRect, relief = 'raised', bg = 'lightblue', state = 'normal')
        tkconfigure(.cdtData$EnvData$zoom$btPanImg, relief = 'raised', bg = 'lightblue', state = 'normal')

        tkconfigure(.cdtData$EnvData$bt.GETArea, relief = 'raised', bg = 'lightblue', state = 'normal')
        stateADD <- if(.cdtData$EnvData$type.extract %in% c('mpoint', 'mpoly')) "normal" else "disabled"
        tkconfigure(.cdtData$EnvData$bt.ADDObj, relief = 'raised', bg = 'lightblue', state = stateADD)
    }

    activateButRedraw <- function(){
        initXYval1 <- trimws(c(tclvalue(.cdtData$EnvData$zoom$xx1),
                                 tclvalue(.cdtData$EnvData$zoom$xx2),
                                 tclvalue(.cdtData$EnvData$zoom$yy1),
                                 tclvalue(.cdtData$EnvData$zoom$yy2)))
        if(!all(initXYval0 == initXYval1))
            tkconfigure(.cdtData$EnvData$zoom$btRedraw, relief = 'raised', bg = 'red')
    }

    #######################################################################################################

    #Tab1
    subfr1 <- bwTabScrollableFrame(cmd.tab1)

        ##########################################

        frameTimeS <- ttklabelframe(subfr1, text = lang.dlg[['label']][['1']], relief = 'groove')

        timeSteps <- tclVar()
        CbperiodVAL <- .cdtEnv$tcl$lang$global[['combobox']][['1']][c(1:8, 10, 11)]
        periodVAL <- c('minute', 'hourly', 'daily', 'pentad', 'dekadal', 'monthly', 'annual', 'seasonal', 'others', 'onefile')
        tclvalue(timeSteps) <- CbperiodVAL[periodVAL %in% GeneralParameters$intstep]

        retminhr <- set.hour.minute(GeneralParameters$intstep, GeneralParameters$minhour)
        minhour.tclVar <- tclVar(retminhr$val)

        cb.fperiod <- ttkcombobox(frameTimeS, values = CbperiodVAL, textvariable = timeSteps, width = largeur4)
        cb.minhour <- ttkcombobox(frameTimeS, values = retminhr$cb, textvariable = minhour.tclVar, state = retminhr$state, width = 2)

        tkgrid(cb.fperiod, row = 0, column = 0, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(cb.minhour, row = 0, column = 1, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)

        helpWidget(cb.fperiod, lang.dlg[['tooltip']][['1']], lang.dlg[['status']][['1']])

        #################

        frameSeas <- tkframe(frameTimeS)

        seas_mon <- GeneralParameters$season.start
        seas_len <- GeneralParameters$season.len
        seas_mon1 <- (seas_mon + seas_len - 1) %% 12
        seas_mon1[seas_mon1 == 0] <- 12

        seasStart.tclVar <- tclVar(MOIS[seas_mon])
        seasLen.tclVar <- tclVar(seas_len)

        #################

        tkbind(cb.fperiod, "<<ComboboxSelected>>", function(){
            intstep <- periodVAL[CbperiodVAL %in% trimws(tclvalue(timeSteps))]

            minhour <- as.numeric(trimws(tclvalue(minhour.tclVar)))
            retminhr <- set.hour.minute(intstep, minhour)
            tkconfigure(cb.minhour, values = retminhr$cb, state = retminhr$state)
            tclvalue(minhour.tclVar) <- retminhr$val

            tkdestroy(frameSeas)

            if(intstep == 'seasonal'){
                frameSeas <<- tkframe(frameTimeS)

                frSeasDef <- tkframe(frameSeas)

                txt.seasS <- tklabel(frSeasDef, text = lang.dlg[['label']][['21']], anchor = 'e', justify = 'right')
                cb.seasS <- ttkcombobox(frSeasDef, values = MOIS, textvariable = seasStart.tclVar, width = 13)
                txt.seasL <- tklabel(frSeasDef, text = lang.dlg[['label']][['22']])
                cb.seasL <- ttkcombobox(frSeasDef, values = 2:12, textvariable = seasLen.tclVar, width = 3)

                sepL.seasS <- tklabel(frSeasDef, text = '', width = 3)

                tkgrid(txt.seasS, row = 0, column = 0, sticky = 'we')
                tkgrid(cb.seasS, row = 0, column = 1, sticky = 'we')
                tkgrid(sepL.seasS, row = 0, column = 2)
                tkgrid(txt.seasL, row = 0, column = 3, sticky = 'we')
                tkgrid(cb.seasL, row = 0, column = 4, sticky = 'we')

                ######

                frSeasDisp <- tkframe(frameSeas)

                seasdef <- paste(MOIS[seas_mon], "->", MOIS[seas_mon1])
                seasDef.tclVar <- tclVar(seasdef)

                inMonthSeas <- tklabel(frSeasDisp, text = tclvalue(seasDef.tclVar), textvariable = seasDef.tclVar)

                tkgrid(inMonthSeas, row = 0, column = 0, sticky = 'we')

                ######
                tkgrid(frSeasDef)
                tkgrid(frSeasDisp)

                tkgrid(frameSeas, row = 1, column = 0, sticky = 'we', rowspan = 1, columnspan = 2, padx = 1, pady = 2, ipadx = 1, ipady = 1)

                ######

                tkbind(cb.seasS, "<<ComboboxSelected>>", function(){
                    mon <-  which(MOIS %in% trimws(tclvalue(seasStart.tclVar)))
                    len <- as.numeric(trimws(tclvalue(seasLen.tclVar)))
                    mon1 <- (mon + len - 1) %% 12
                    mon1[mon1 == 0] <- 12
                    seasdef <- paste(MOIS[mon], "->", MOIS[mon1])
                    tclvalue(seasDef.tclVar) <- seasdef
                })

                tkbind(cb.seasL, "<<ComboboxSelected>>", function(){
                    mon <-  which(MOIS %in% trimws(tclvalue(seasStart.tclVar)))
                    len <- as.numeric(trimws(tclvalue(seasLen.tclVar)))
                    mon1 <- (mon + len - 1) %% 12
                    mon1[mon1 == 0] <- 12
                    seasdef <- paste(MOIS[mon], "->", MOIS[mon1])
                    tclvalue(seasDef.tclVar) <- seasdef
                })
            }

            #####
            if(intstep %in% c('seasonal', 'annual', 'others', 'onefile')){
                tkconfigure(cb.startMonth, state = "disabled")
                tkconfigure(cb.endMonth, state = "disabled")
                stateDR <- if(intstep %in% c('others', 'onefile')) "disabled" else "normal"
                tkconfigure(bt.daterange, state = stateDR)
            }else{
                tkconfigure(cb.startMonth, state = "normal")
                tkconfigure(cb.endMonth, state = "normal")
                tkconfigure(bt.daterange, state = "normal")
            }

            #####
            data.type <- datatypeVAL[CbdatatypeVAL %in% trimws(tclvalue(DataType))]
            setDT <- set.data.type.vars(data.type, intstep)
            tclvalue(txt.INData.var) <- setDT$txt
            tkconfigure(set.infile, state = setDT$state)
            helpWidget(cb.infile, setDT$tooltip, setDT$status)

            #####
            tkdestroy(cb.infile)
            tclvalue(input.file) <- ''

            if(intstep == 'onefile'){
                tclvalue(DataType) <- CbdatatypeVAL[2]
                tkconfigure(cb.datatype, state = "disabled")
                cb.infile <<- ttkcombobox(frameInData, values = unlist(listOpenFiles), textvariable = input.file, width = largeur1)
            }else{
                tkconfigure(cb.datatype, state = "normal")
                cb.infile <<- tkentry(frameInData, textvariable = input.file, width = largeur2)
            }
            tkgrid(cb.infile, row = 2, column = 0, sticky = 'we', rowspan = 1, columnspan = 9, padx = 0, pady = 1, ipadx = 1, ipady = 1)

            #####
            if(intstep == 'onefile'){
                CbOutFileFormat <<- CbOutFileFormat1
                OutFileFormatV <<- OutFileFormatVal[-2]
                OutFileFormat <<- if(.cdtData$EnvData$type.extract %in% c("point", "mpoint")) c(CbOutFileFormat[1], '') else CbOutFileFormat
            }else{
                CbOutFileFormat <<- CbOutFileFormat2
                OutFileFormatV <<- OutFileFormatVal
                OutFileFormat <<- if(.cdtData$EnvData$type.extract %in% c("point", "mpoint")) CbOutFileFormat[1:2] else CbOutFileFormat
            }
            tkconfigure(cb.outFormat, values = OutFileFormat)
            outfrmt <- OutFileFormatV[CbOutFileFormat %in% trimws(tclvalue(out.format))]
            if(!(outfrmt %in% OutFileFormatV)) tclvalue(out.format) <- OutFileFormat[1]
        })

        #############################

        frameInData <- ttklabelframe(subfr1, text = lang.dlg[['label']][['2']], relief = 'groove')

        DataType <- tclVar()
        CbdatatypeVAL <- .cdtEnv$tcl$lang$global[['combobox']][['2']][2:3]
        datatypeVAL <- c('cdtdataset', 'cdtnetcdf')
        tclvalue(DataType) <- CbdatatypeVAL[datatypeVAL %in% GeneralParameters$data.type]

        setDT <- set.data.type.vars(GeneralParameters$data.type, GeneralParameters$intstep)
        txt.INData.var <- tclVar(setDT$txt)

        if(GeneralParameters$data.type == 'cdtnetcdf' |
           GeneralParameters$intstep == 'onefile')
        {
            dirInput <- GeneralParameters$cdtnetcdf$dir
        }else{
            dirInput <- GeneralParameters$cdtdataset$index
        }
        input.file <- tclVar(dirInput)

        txt.datatype <- tklabel(frameInData, text = lang.dlg[['label']][['5']], anchor = 'w', justify = 'left')
        cb.datatype <- ttkcombobox(frameInData, values = CbdatatypeVAL, textvariable = DataType, width = largeur0)
        txt.infile <- tklabel(frameInData, text = tclvalue(txt.INData.var), textvariable = txt.INData.var, anchor = 'w', justify = 'left')
        set.infile <- tkbutton(frameInData, text = .cdtEnv$tcl$lang$global[['button']][['5']], width = 8, state = setDT$state)
        if(GeneralParameters$intstep == 'onefile'){
           cb.infile <- ttkcombobox(frameInData, values = unlist(listOpenFiles), textvariable = input.file, width = largeur1)
        }else{
           cb.infile <- tkentry(frameInData, textvariable = input.file, width = largeur2) 
        }
        bt.infile <- tkbutton(frameInData, text = "...")

        #################

        tkgrid(txt.datatype, row = 0, column = 0, sticky = 'we', rowspan = 1, columnspan = 2, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(cb.datatype, row = 0, column = 2, sticky = 'we', rowspan = 1, columnspan = 8, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(txt.infile, row = 1, column = 0, sticky = 'we', rowspan = 1, columnspan = 8, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(set.infile, row = 1, column = 8, sticky = 'we', rowspan = 1, columnspan = 2, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(cb.infile, row = 2, column = 0, sticky = 'we', rowspan = 1, columnspan = 9, padx = 0, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(bt.infile, row = 2, column = 9, sticky = 'w', rowspan = 1, columnspan = 1, padx = 0, pady = 1, ipadx = 1, ipady = 1)

        #################

        helpWidget(cb.datatype, lang.dlg[['tooltip']][['2']], lang.dlg[['status']][['2']])
        helpWidget(cb.infile, setDT$tooltip, setDT$status)
        helpWidget(bt.infile, lang.dlg[['tooltip']][['5']], lang.dlg[['status']][['5']])

        ############
        settingINData <- NULL
        tkconfigure(set.infile, command = function(){
            intstep <- periodVAL[CbperiodVAL %in% trimws(tclvalue(timeSteps))]
            stateFormat <- if(intstep == 'others') 'disabled' else 'normal'
            GeneralParameters[['cdtnetcdf']] <<- getInfoNetCDFData(.cdtEnv$tcl$main$win,
                                                                   GeneralParameters[['cdtnetcdf']],
                                                                   trimws(tclvalue(input.file)),
                                                                   stateFormat)
            settingINData <<- 1
        })

        tkconfigure(bt.infile, command = function(){
            intstep <- periodVAL[CbperiodVAL %in% trimws(tclvalue(timeSteps))]
            data.type <- datatypeVAL[CbdatatypeVAL %in% trimws(tclvalue(DataType))]
            
            if(intstep == 'onefile'){
                tkconfigure(.cdtEnv$tcl$main$win, cursor = 'watch')
                tcl('update')
                on.exit({
                    tkconfigure(.cdtEnv$tcl$main$win, cursor = '')
                    tcl('update')
                })

                nc.opfiles <- getOpenNetcdf(.cdtEnv$tcl$main$win)
                if(!is.null(nc.opfiles)){
                    update.OpenFiles('netcdf', nc.opfiles)
                    listOpenFiles[[length(listOpenFiles) + 1]] <<- nc.opfiles[[1]]
                    tclvalue(input.file) <- nc.opfiles[[1]]
                    lapply(list(cb.shpF, cb.infile), tkconfigure, values = unlist(listOpenFiles))
                }
            }else{
                if(data.type == 'cdtnetcdf'){
                    dirnc <- tk_choose.dir(getwd(), "")
                    tclvalue(input.file) <- if(dirnc %in% c("", "NA") | is.na(dirnc)) "" else dirnc
                }else{
                    path.rds <- tclvalue(tkgetOpenFile(initialdir = getwd(), filetypes = .cdtEnv$tcl$data$filetypes6))
                    tclvalue(input.file) <- if(path.rds %in% c("", "NA") | is.na(path.rds)) "" else path.rds
                }
            }
        })

        #################

        tkbind(cb.datatype, "<<ComboboxSelected>>", function(){
            settingINData <<- NULL

            tclvalue(input.file) <- ''
            intstep <- periodVAL[CbperiodVAL %in% trimws(tclvalue(timeSteps))]
            data.type <- datatypeVAL[CbdatatypeVAL %in% trimws(tclvalue(DataType))]

            setDT <- set.data.type.vars(data.type, intstep)
            tclvalue(txt.INData.var) <- setDT$txt
            tkconfigure(set.infile, state = setDT$state)
            helpWidget(cb.infile, setDT$tooltip, setDT$status)
       })

        #############################

        frameSHP <- tkframe(subfr1, relief = 'groove', borderwidth = 2)

        shpFile <- tclVar(GeneralParameters$shp.file$shp)
        shpAttr <- tclVar(GeneralParameters$shp.file$attr)

        txt.shpF <- tklabel(frameSHP, text = lang.dlg[['label']][['9']], anchor = 'w', justify = 'left')
        cb.shpF <- ttkcombobox(frameSHP, values = unlist(listOpenFiles), textvariable = shpFile, width = largeur1)
        bt.shpF <- tkbutton(frameSHP, text = "...")
        txt.shpAttr <- tklabel(frameSHP, text = lang.dlg[['label']][['10']], anchor = 'w', justify = 'left')
        .cdtData$EnvData$cb.shpAttr <- ttkcombobox(frameSHP, values = '', textvariable = shpAttr)

        tkgrid(txt.shpF, row = 0, column = 0, sticky = 'we', rowspan = 1, columnspan = 6, padx = 1, pady = 0, ipadx = 1, ipady = 1)
        tkgrid(cb.shpF, row = 1, column = 0, sticky = 'we', rowspan = 1, columnspan = 5, padx = 0, pady = 0, ipadx = 1, ipady = 1)
        tkgrid(bt.shpF, row = 1, column = 5, sticky = 'we', rowspan = 1, columnspan = 1, padx = 0, pady = 0, ipadx = 1, ipady = 1)
        tkgrid(txt.shpAttr, row = 2, column = 0, sticky = 'we', rowspan = 1, columnspan = 6, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(.cdtData$EnvData$cb.shpAttr, row = 3, column = 0, sticky = 'we', rowspan = 1, columnspan = 5, padx = 1, pady = 1, ipadx = 1, ipady = 1)

        #################
        tkconfigure(bt.shpF, command = function(){
            shp.opfiles <- getOpenShp(.cdtEnv$tcl$main$win)
            if(!is.null(shp.opfiles)){
                update.OpenFiles('shp', shp.opfiles)
                tclvalue(shpFile) <- shp.opfiles[[1]]
                listOpenFiles[[length(listOpenFiles) + 1]] <<- shp.opfiles[[1]]

                intstep <- periodVAL[CbperiodVAL %in% trimws(tclvalue(timeSteps))]
                if(intstep == 'onefile'){
                    lapply(list(cb.shpF, cb.infile), tkconfigure, values = unlist(listOpenFiles))
                }else{
                    tkconfigure(cb.shpF, values = unlist(listOpenFiles))
                }

                shpf <- getShpOpenData(shpFile)
                dat <- sf::st_drop_geometry(shpf[[2]])
                AttrTable <- names(dat)
                tkconfigure(.cdtData$EnvData$cb.shpAttr, values = AttrTable)
                tclvalue(shpAttr) <- AttrTable[1]

                idx <- as.integer(tclvalue(tcl(.cdtData$EnvData$cb.shpAttr, 'current'))) + 1
                adminN <- as.character(dat[, idx])
                cbAttrTable <- levels(as.factor(adminN))
                tkconfigure(cb.Polygon, values = cbAttrTable)
                tclvalue(.cdtData$EnvData$namePoly) <- cbAttrTable[1]
            }
        })

        #######################
        tkbind(cb.shpF, "<<ComboboxSelected>>", function(){
            shpf <- getShpOpenData(shpFile)
            dat <- sf::st_drop_geometry(shpf[[2]])
            AttrTable <- names(dat)
            tkconfigure(.cdtData$EnvData$cb.shpAttr, values = AttrTable)
            tclvalue(shpAttr) <- AttrTable[1]

            idx <- as.integer(tclvalue(tcl(.cdtData$EnvData$cb.shpAttr, 'current'))) + 1
            adminN <- as.character(dat[, idx])
            cbAttrTable <- levels(as.factor(adminN))
            tkconfigure(cb.Polygon, values = cbAttrTable)
            tclvalue(.cdtData$EnvData$namePoly) <- cbAttrTable[1]
        })

        tkbind(.cdtData$EnvData$cb.shpAttr, "<<ComboboxSelected>>", function(){
            shpf <- getShpOpenData(shpFile)
            dat <- sf::st_drop_geometry(shpf[[2]])

            idx <- as.integer(tclvalue(tcl(.cdtData$EnvData$cb.shpAttr, 'current'))) + 1
            adminN <- as.character(dat[, idx])
            cbAttrTable <- levels(as.factor(adminN))
            tkconfigure(cb.Polygon, values = cbAttrTable)
            tclvalue(.cdtData$EnvData$namePoly) <- cbAttrTable[1]
        })

        #############################

        openAttrSHP <- ttkbutton(subfr1, text = lang.dlg[['button']][['2']])
        displayMapSHP <- ttkbutton(subfr1, text = lang.dlg[['button']][['3']])

        #################

        .cdtData$EnvData$tab$TableAttr <- NULL

        tkconfigure(openAttrSHP, command = function(){
            shpf <- getShpOpenData(shpFile)
            if(!is.null(shpf))
                .cdtData$EnvData$tab$TableAttr <- 
                    tableNotebookTab_unik(sf::st_drop_geometry(shpf[[2]]),
                                          .cdtData$EnvData$tab$TableAttr,
                                          shpf[[1]], 10)
        })

        #################

        .cdtData$EnvData$tab$MapSelect <- NULL

        tkconfigure(displayMapSHP, command = function(){
            shpofile <- getShpOpenData(shpFile)
            if(!is.null(shpofile))
            {
                shpf <- shpofile[[2]]
                .cdtData$EnvData$shpf <- shpf
                .cdtData$EnvData$ocrds <- getBoundaries(shpf)

                xybbx <- sf::st_bbox(shpf)
                lo1 <- round(xybbx$xmin, 4)
                lo2 <- round(xybbx$xmax, 4)
                la1 <- round(xybbx$ymin, 4)
                la2 <- round(xybbx$ymax, 4)
                ZoomXYval0 <<- c(lo1, lo2, la1, la2)

                tclvalue(.cdtData$EnvData$zoom$xx1) <- lo1
                tclvalue(.cdtData$EnvData$zoom$xx2) <- lo2
                tclvalue(.cdtData$EnvData$zoom$yy1) <- la1
                tclvalue(.cdtData$EnvData$zoom$yy2) <- la2

                .cdtData$EnvData$ZoomXYval <- ZoomXYval0

                imgContainer <- displayMap4Extraction(.cdtData$EnvData$tab$MapSelect)
                .cdtData$EnvData$tab$MapSelect <- imageNotebookTab_unik(imgContainer, .cdtData$EnvData$tab$MapSelect)
            }
            else Insert.Messages.Out(lang.dlg[['message']][['1']], TRUE, 'e')
        })

        #############################
        tkgrid(frameTimeS, row = 0, column = 0, columnspan = 2, sticky = 'we', pady = 1, padx = 1)
        tkgrid(frameInData, row = 1, column = 0, columnspan = 2, sticky = 'we', pady = 2, padx = 1)
        tkgrid(frameSHP, row = 2, column = 0, columnspan = 2, sticky = 'we', pady = 2, padx = 1)
        tkgrid(openAttrSHP, row = 3, column = 0, columnspan = 1, sticky = 'we', pady = 1)
        tkgrid(displayMapSHP, row = 3, column = 1, columnspan = 1, sticky = 'we', pady = 1)

    ######################################################################################################

    #Tab2
    subfr2 <- bwTabScrollableFrame(cmd.tab2)

    ##########################################

        frameZoom <- ttklabelframe(subfr2, text = lang.dlg[['label']][['11']], relief = 'groove')

        xentr1.zoom <- tkentry(frameZoom, width = 8, justify = "left", textvariable = .cdtData$EnvData$zoom$xx1)
        xentr2.zoom <- tkentry(frameZoom, width = 8, justify = "left", textvariable = .cdtData$EnvData$zoom$xx2)
        yentr1.zoom <- tkentry(frameZoom, width = 8, justify = "left", textvariable = .cdtData$EnvData$zoom$yy1)
        yentr2.zoom <- tkentry(frameZoom, width = 8, justify = "left", textvariable = .cdtData$EnvData$zoom$yy2)
        bt.centre.zoom <- tklabel(frameZoom, image = .cdtEnv$tcl$zoom$img$centre)

        .cdtData$EnvData$zoom$btZoomP <- tkbutton(frameZoom, image = .cdtEnv$tcl$zoom$img$plus, relief = 'raised', bg = 'lightblue', state = 'normal')
        .cdtData$EnvData$zoom$btZoomM <- tkbutton(frameZoom, image = .cdtEnv$tcl$zoom$img$moins, relief = 'raised', bg = 'lightblue', state = 'normal')
        .cdtData$EnvData$zoom$btZoomRect <- tkbutton(frameZoom, image = .cdtEnv$tcl$zoom$img$rect, relief = 'raised', bg = 'lightblue', state = 'normal')
        .cdtData$EnvData$zoom$btPanImg <- tkbutton(frameZoom, image = .cdtEnv$tcl$zoom$img$pan, relief = 'raised', bg = 'lightblue', state = 'normal')
        .cdtData$EnvData$zoom$btRedraw <- tkbutton(frameZoom, image = .cdtEnv$tcl$zoom$img$redraw, relief = 'raised', bg = 'lightblue')
        .cdtData$EnvData$zoom$btReset <- tkbutton(frameZoom, image = .cdtEnv$tcl$zoom$img$reset, relief = 'raised')

        #################
        tkgrid(xentr1.zoom, row = 1, column = 0, sticky = 'we', rowspan = 1, columnspan = 1)
        tkgrid(xentr2.zoom, row = 1, column = 2, sticky = 'we', rowspan = 1, columnspan = 1)
        tkgrid(yentr1.zoom, row = 2, column = 1, sticky = 'we', rowspan = 1, columnspan = 1)
        tkgrid(yentr2.zoom, row = 0, column = 1, sticky = 'we', rowspan = 1, columnspan = 1)
        tkgrid(bt.centre.zoom, row = 1, column = 1, sticky = 'nswe', rowspan = 1, columnspan = 1)

        tkgrid(.cdtData$EnvData$zoom$btReset, row = 0, column = 3, sticky = 'nswe', rowspan = 1, columnspan = 1)
        tkgrid(.cdtData$EnvData$zoom$btRedraw, row = 1, column = 3, sticky = 'nswe', rowspan = 1, columnspan = 1)
        tkgrid(.cdtData$EnvData$zoom$btPanImg, row = 2, column = 3, sticky = 'nswe', rowspan = 1, columnspan = 1)
        tkgrid(.cdtData$EnvData$zoom$btZoomP, row = 0, column = 4, sticky = 'nswe', rowspan = 1, columnspan = 1)
        tkgrid(.cdtData$EnvData$zoom$btZoomM, row = 1, column = 4, sticky = 'nswe', rowspan = 1, columnspan = 1)
        tkgrid(.cdtData$EnvData$zoom$btZoomRect, row = 2, column = 4, sticky = 'nswe', rowspan = 1, columnspan = 1)

        helpWidget(.cdtData$EnvData$zoom$btZoomP, lang.dlg[['tooltip']][['7']], lang.dlg[['status']][['7']])
        helpWidget(.cdtData$EnvData$zoom$btZoomM, lang.dlg[['tooltip']][['8']], lang.dlg[['status']][['8']])
        helpWidget(.cdtData$EnvData$zoom$btZoomRect, lang.dlg[['tooltip']][['9']], lang.dlg[['status']][['9']])
        helpWidget(.cdtData$EnvData$zoom$btPanImg, lang.dlg[['tooltip']][['10']], lang.dlg[['status']][['10']])
        helpWidget(.cdtData$EnvData$zoom$btRedraw, lang.dlg[['tooltip']][['11']], lang.dlg[['status']][['11']])
        helpWidget(.cdtData$EnvData$zoom$btReset, lang.dlg[['tooltip']][['12']], lang.dlg[['status']][['12']])

        ##########################################

        tkconfigure(.cdtData$EnvData$zoom$btRedraw, command = function(){
            .cdtData$EnvData$ZoomXYval <- as.numeric(c(tclvalue(.cdtData$EnvData$zoom$xx1),
                                                       tclvalue(.cdtData$EnvData$zoom$xx2),
                                                       tclvalue(.cdtData$EnvData$zoom$yy1),
                                                       tclvalue(.cdtData$EnvData$zoom$yy2)))

            # ZoomXYval
            tabid <- as.numeric(tclvalue(tkindex(.cdtEnv$tcl$main$tknotes, 'current'))) + 1
            if(length(.cdtData$OpenTab$Type) > 0){
                if(.cdtData$OpenTab$Type[[tabid]] == "img" & !is.null(.cdtData$EnvData$tab$MapSelect))
                {
                    if(.cdtData$OpenTab$Data[[tabid]][[1]][[1]]$ID == .cdtData$EnvData$tab$MapSelect[[2]])
                    {
                        refreshPlot(W = .cdtData$OpenTab$Data[[tabid]][[2]][[1]],
                                    img = .cdtData$OpenTab$Data[[tabid]][[2]][[2]],
                                    hscale = as.numeric(tclvalue(tkget(.cdtEnv$tcl$toolbar$spinH))),
                                    vscale = as.numeric(tclvalue(tkget(.cdtEnv$tcl$toolbar$spinV))))
                        tkconfigure(.cdtData$EnvData$zoom$btRedraw, relief = 'raised', bg = 'lightblue')
                    }
                }
            }
        })

        tkconfigure(.cdtData$EnvData$zoom$btReset, command = function(){
            .cdtData$EnvData$ZoomXYval <- ZoomXYval0
            tclvalue(.cdtData$EnvData$zoom$xx1) <- ZoomXYval0[1]
            tclvalue(.cdtData$EnvData$zoom$xx2) <- ZoomXYval0[2]
            tclvalue(.cdtData$EnvData$zoom$yy1) <- ZoomXYval0[3]
            tclvalue(.cdtData$EnvData$zoom$yy2) <- ZoomXYval0[4]

            # ZoomXYval
            tabid <- as.numeric(tclvalue(tkindex(.cdtEnv$tcl$main$tknotes, 'current'))) + 1
            if(length(.cdtData$OpenTab$Type) > 0){
                if(.cdtData$OpenTab$Type[[tabid]] == "img" & !is.null(.cdtData$EnvData$tab$MapSelect))
                {
                    if(.cdtData$OpenTab$Data[[tabid]][[1]][[1]]$ID == .cdtData$EnvData$tab$MapSelect[[2]])
                    {
                        refreshPlot(W = .cdtData$OpenTab$Data[[tabid]][[2]][[1]],
                                    img = .cdtData$OpenTab$Data[[tabid]][[2]][[2]],
                                    hscale = as.numeric(tclvalue(tkget(.cdtEnv$tcl$toolbar$spinH))),
                                    vscale = as.numeric(tclvalue(tkget(.cdtEnv$tcl$toolbar$spinV))))
                        tkconfigure(.cdtData$EnvData$zoom$btRedraw, relief = 'raised', bg = 'lightblue')
                    }
                }
            }
        })

        ##########################################

        tkbind(xentr1.zoom, "<FocusIn>", initializeButZoom)
        tkbind(xentr1.zoom, "<FocusOut>", activateButRedraw)

        tkbind(xentr2.zoom, "<FocusIn>", initializeButZoom)
        tkbind(xentr2.zoom, "<FocusOut>", activateButRedraw)

        tkbind(yentr1.zoom, "<FocusIn>", initializeButZoom)
        tkbind(yentr1.zoom, "<FocusOut>", activateButRedraw)

        tkbind(yentr2.zoom, "<FocusIn>", initializeButZoom)
        tkbind(yentr2.zoom, "<FocusOut>", activateButRedraw)

        ##########################################
        tkbind(.cdtData$EnvData$zoom$btRedraw, "<Button-1>", function(){
            tclvalue(.cdtData$EnvData$zoom$pressButP) <- 0
            tclvalue(.cdtData$EnvData$zoom$pressButM) <- 0
            tclvalue(.cdtData$EnvData$zoom$pressButRect) <- 0
            tclvalue(.cdtData$EnvData$zoom$pressButDrag) <- 0

            tclvalue(.cdtData$EnvData$pressGetCoords) <- 0

            tkconfigure(.cdtData$EnvData$zoom$btRedraw, relief = 'raised', bg = 'lightblue')
            tkconfigure(.cdtData$EnvData$zoom$btZoomP, relief = 'raised', bg = 'lightblue', state = 'normal')
            tkconfigure(.cdtData$EnvData$zoom$btZoomM, relief = 'raised', bg = 'lightblue', state = 'normal')
            tkconfigure(.cdtData$EnvData$zoom$btZoomRect, relief = 'raised', bg = 'lightblue', state = 'normal')
            tkconfigure(.cdtData$EnvData$zoom$btPanImg, relief = 'raised', bg = 'lightblue', state = 'normal')

            tkconfigure(.cdtData$EnvData$bt.GETArea, relief = 'raised', bg = 'lightblue', state = 'normal')
            stateADD <- if(.cdtData$EnvData$type.extract %in% c('mpoint', 'mpoly')) "normal" else "disabled"
            tkconfigure(.cdtData$EnvData$bt.ADDObj, relief = 'raised', bg = 'lightblue', state = stateADD)
        })

        tkbind(.cdtData$EnvData$zoom$btReset, "<Button-1>", function(){
            tclvalue(.cdtData$EnvData$zoom$pressButP) <- 0
            tclvalue(.cdtData$EnvData$zoom$pressButM) <- 0
            tclvalue(.cdtData$EnvData$zoom$pressButRect) <- 0
            tclvalue(.cdtData$EnvData$zoom$pressButDrag) <- 0

            tclvalue(.cdtData$EnvData$pressGetCoords) <- 0

            tkconfigure(.cdtData$EnvData$zoom$btRedraw, relief = 'raised', bg = 'lightblue')
            tkconfigure(.cdtData$EnvData$zoom$btZoomP, relief = 'raised', bg = 'lightblue', state = 'normal')
            tkconfigure(.cdtData$EnvData$zoom$btZoomM, relief = 'raised', bg = 'lightblue', state = 'normal')
            tkconfigure(.cdtData$EnvData$zoom$btZoomRect, relief = 'raised', bg = 'lightblue', state = 'normal')
            tkconfigure(.cdtData$EnvData$zoom$btPanImg, relief = 'raised', bg = 'lightblue', state = 'normal')

            tkconfigure(.cdtData$EnvData$bt.GETArea, relief = 'raised', bg = 'lightblue', state = 'normal')
            stateADD <- if(.cdtData$EnvData$type.extract %in% c('mpoint', 'mpoly')) "normal" else "disabled"
            tkconfigure(.cdtData$EnvData$bt.ADDObj, relief = 'raised', bg = 'lightblue', state = stateADD)
        })

        tkbind(.cdtData$EnvData$zoom$btZoomP, "<Button-1>", function(){
            tclvalue(.cdtData$EnvData$zoom$pressButP) <- 1
            tclvalue(.cdtData$EnvData$zoom$pressButM) <- 0
            tclvalue(.cdtData$EnvData$zoom$pressButRect) <- 0
            tclvalue(.cdtData$EnvData$zoom$pressButDrag) <- 0

            tclvalue(.cdtData$EnvData$pressGetCoords) <- 0

            tkconfigure(.cdtData$EnvData$zoom$btRedraw, relief = 'raised', bg = 'lightblue')
            tkconfigure(.cdtData$EnvData$zoom$btZoomP, relief = 'raised', bg = 'red', state = 'disabled')
            tkconfigure(.cdtData$EnvData$zoom$btZoomM, relief = 'raised', bg = 'lightblue', state = 'normal')
            tkconfigure(.cdtData$EnvData$zoom$btZoomRect, relief = 'raised', bg = 'lightblue', state = 'normal')
            tkconfigure(.cdtData$EnvData$zoom$btPanImg, relief = 'raised', bg = 'lightblue', state = 'normal')

            tkconfigure(.cdtData$EnvData$bt.GETArea, relief = 'raised', bg = 'lightblue', state = 'normal')
            stateADD <- if(.cdtData$EnvData$type.extract %in% c('mpoint', 'mpoly')) "normal" else "disabled"
            tkconfigure(.cdtData$EnvData$bt.ADDObj, relief = 'raised', bg = 'lightblue', state = stateADD)
        })

        tkbind(.cdtData$EnvData$zoom$btZoomM, "<Button-1>", function(){
            tclvalue(.cdtData$EnvData$zoom$pressButP) <- 0
            tclvalue(.cdtData$EnvData$zoom$pressButM) <- 1
            tclvalue(.cdtData$EnvData$zoom$pressButRect) <- 0
            tclvalue(.cdtData$EnvData$zoom$pressButDrag) <- 0

            tclvalue(.cdtData$EnvData$pressGetCoords) <- 0

            tkconfigure(.cdtData$EnvData$zoom$btRedraw, relief = 'raised', bg = 'lightblue')
            tkconfigure(.cdtData$EnvData$zoom$btZoomP, relief = 'raised', bg = 'lightblue', state = 'normal')
            tkconfigure(.cdtData$EnvData$zoom$btZoomM, relief = 'raised', bg = 'red', state = 'disabled')
            tkconfigure(.cdtData$EnvData$zoom$btZoomRect, relief = 'raised', bg = 'lightblue', state = 'normal')
            tkconfigure(.cdtData$EnvData$zoom$btPanImg, relief = 'raised', bg = 'lightblue', state = 'normal')

            tkconfigure(.cdtData$EnvData$bt.GETArea, relief = 'raised', bg = 'lightblue', state = 'normal')
            stateADD <- if(.cdtData$EnvData$type.extract %in% c('mpoint', 'mpoly')) "normal" else "disabled"
            tkconfigure(.cdtData$EnvData$bt.ADDObj, relief = 'raised', bg = 'lightblue', state = stateADD)
        })

        tkbind(.cdtData$EnvData$zoom$btZoomRect, "<Button-1>", function(){
            tclvalue(.cdtData$EnvData$zoom$pressButP) <- 0
            tclvalue(.cdtData$EnvData$zoom$pressButM) <- 0
            tclvalue(.cdtData$EnvData$zoom$pressButRect) <- 1
            tclvalue(.cdtData$EnvData$zoom$pressButDrag) <- 0

            tclvalue(.cdtData$EnvData$pressGetCoords) <- 0

            tkconfigure(.cdtData$EnvData$zoom$btRedraw, relief = 'raised', bg = 'lightblue')
            tkconfigure(.cdtData$EnvData$zoom$btZoomP, relief = 'raised', bg = 'lightblue', state = 'normal')
            tkconfigure(.cdtData$EnvData$zoom$btZoomM, relief = 'raised', bg = 'lightblue', state = 'normal')
            tkconfigure(.cdtData$EnvData$zoom$btZoomRect, relief = 'raised', bg = 'red', state = 'disabled')
            tkconfigure(.cdtData$EnvData$zoom$btPanImg, relief = 'raised', bg = 'lightblue', state = 'normal')

            tkconfigure(.cdtData$EnvData$bt.GETArea, relief = 'raised', bg = 'lightblue', state = 'normal')
            stateADD <- if(.cdtData$EnvData$type.extract %in% c('mpoint', 'mpoly')) "normal" else "disabled"
            tkconfigure(.cdtData$EnvData$bt.ADDObj, relief = 'raised', bg = 'lightblue', state = stateADD)
        })

        tkbind(.cdtData$EnvData$zoom$btPanImg, "<Button-1>", function(){
            tclvalue(.cdtData$EnvData$zoom$pressButP) <- 0
            tclvalue(.cdtData$EnvData$zoom$pressButM) <- 0
            tclvalue(.cdtData$EnvData$zoom$pressButRect) <- 0
            tclvalue(.cdtData$EnvData$zoom$pressButDrag) <- 1

            tclvalue(.cdtData$EnvData$pressGetCoords) <- 0

            tkconfigure(.cdtData$EnvData$zoom$btRedraw, relief = 'raised', bg = 'lightblue')
            tkconfigure(.cdtData$EnvData$zoom$btZoomP, relief = 'raised', bg = 'lightblue', state = 'normal')
            tkconfigure(.cdtData$EnvData$zoom$btZoomM, relief = 'raised', bg = 'lightblue', state = 'normal')
            tkconfigure(.cdtData$EnvData$zoom$btZoomRect, relief = 'raised', bg = 'lightblue', state = 'normal')
            tkconfigure(.cdtData$EnvData$zoom$btPanImg, relief = 'raised', bg = 'red', state = 'disabled')

            tkconfigure(.cdtData$EnvData$bt.GETArea, relief = 'raised', bg = 'lightblue', state = 'normal')
            stateADD <- if(.cdtData$EnvData$type.extract %in% c('mpoint', 'mpoly')) "normal" else "disabled"
            tkconfigure(.cdtData$EnvData$bt.ADDObj, relief = 'raised', bg = 'lightblue', state = stateADD)
        })

        ##########################################

        frameExtract <- ttklabelframe(subfr2, text = lang.dlg[['label']][['12']], relief = 'groove')

        .cdtData$EnvData$type.extract <- GeneralParameters$type.extract
        type.extract <- tclVar()
        typeEXTRACT <- lang.dlg[['combobox']][['1']]
        typeEXTRACTV <- c('point', 'mpoint', 'rect', 'poly', 'mpoly')
        tclvalue(type.extract) <- typeEXTRACT[typeEXTRACTV %in% GeneralParameters$type.extract]

        .cdtData$EnvData$minlonRect <- tclVar(GeneralParameters$Geom$minlon)
        .cdtData$EnvData$maxlonRect <- tclVar(GeneralParameters$Geom$maxlon)
        .cdtData$EnvData$minlatRect <- tclVar(GeneralParameters$Geom$minlat)
        .cdtData$EnvData$maxlatRect <- tclVar(GeneralParameters$Geom$maxlat)
        .cdtData$EnvData$namePoly <- tclVar(GeneralParameters$Geom$namePoly)

        padLon <- tclVar(GeneralParameters$Geom$padlon)
        padLat <- tclVar(GeneralParameters$Geom$padlat)

        pointrect <- tclVar("Point")
        minrect <- tclVar()
        maxrect <- tclVar()

        statePts <- if(GeneralParameters$type.extract %in% c('point', 'mpoint')) "normal" else "disabled"
        stateRct <- if(GeneralParameters$type.extract == 'rect') "normal" else "disabled"
        statePad <- "normal"
        statePol <- if(GeneralParameters$type.extract %in% c('poly', 'mpoly')) "normal" else "disabled"
        stateADD <- if(GeneralParameters$type.extract %in% c('mpoint', 'mpoly')) "normal" else "disabled"

        ################

        txt.Type <- tklabel(frameExtract, text = lang.dlg[['label']][['13']], anchor = 'e', justify = 'right')
        cb.TypeExtr <- ttkcombobox(frameExtract, values = typeEXTRACT, textvariable = type.extract, width = largeur3)

        txt.PointRect <- tklabel(frameExtract, text = tclvalue(pointrect), textvariable = pointrect, anchor = 'e', justify = 'right', bg = 'green')
        txt.MIN <- tklabel(frameExtract, text = tclvalue(minrect), textvariable = minrect)
        txt.MAX <- tklabel(frameExtract, text = tclvalue(maxrect), textvariable = maxrect)
        txt.PAD <- tklabel(frameExtract, text = lang.dlg[['label']][['14']])

        txt.LON <- tklabel(frameExtract, text = lang.dlg[['label']][['15']], anchor = 'e', justify = 'right')
        en.minlon <- tkentry(frameExtract, width = 7, textvariable = .cdtData$EnvData$minlonRect, justify = "left", state = statePts)
        en.maxlon <- tkentry(frameExtract, width = 7, textvariable = .cdtData$EnvData$maxlonRect, justify = "left", state = stateRct)
        txt.PlusM1 <- tklabel(frameExtract, text = '\u00B1')
        en.PadLon <- tkentry(frameExtract, width = 4, textvariable = padLon, justify = "left", state = statePad)

        txt.LAT <- tklabel(frameExtract, text = lang.dlg[['label']][['16']], anchor = 'e', justify = 'right')
        en.minlat <- tkentry(frameExtract, width = 7, textvariable = .cdtData$EnvData$minlatRect, justify = "left", state = statePts)
        en.maxlat <- tkentry(frameExtract, width = 7, textvariable = .cdtData$EnvData$maxlatRect, justify = "left", state = stateRct)
        txt.PlusM2 <- tklabel(frameExtract, text = '\u00B1')
        en.PadLat <- tkentry(frameExtract, width = 4, textvariable = padLat, justify = "left", state = statePad)

        txt.Polygon <- tklabel(frameExtract, text = lang.dlg[['label']][['17']], anchor = 'e', justify = 'right', bg = 'green')
        cb.Polygon <- ttkcombobox(frameExtract, values = '', textvariable = .cdtData$EnvData$namePoly, state = statePol, width = largeur3)

        .cdtData$EnvData$bt.ADDObj <- tkbutton(frameExtract, text = lang.dlg[['button']][['4']], relief = 'raised', bg = 'lightblue', state = stateADD)
        .cdtData$EnvData$bt.GETArea <- tkbutton(frameExtract, text = lang.dlg[['button']][['5']], relief = 'raised', bg = 'lightblue', state = 'normal')

       #############

        tkgrid(txt.Type, row = 0, column = 0, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 2, ipadx = 1, ipady = 1)
        tkgrid(cb.TypeExtr, row = 0, column = 1, sticky = 'we', rowspan = 1, columnspan = 4, padx = 1, pady = 2, ipadx = 1, ipady = 1)

        tkgrid(txt.PointRect, row = 1, column = 0, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(txt.MIN, row = 1, column = 1, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(txt.MAX, row = 1, column = 2, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(txt.PAD, row = 1, column = 4, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)

        tkgrid(txt.LON, row = 2, column = 0, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(en.minlon, row = 2, column = 1, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(en.maxlon, row = 2, column = 2, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(txt.PlusM1, row = 2, column = 3, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(en.PadLon, row = 2, column = 4, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)

        tkgrid(txt.LAT, row = 3, column = 0, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(en.minlat, row = 3, column = 1, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(en.maxlat, row = 3, column = 2, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(txt.PlusM2, row = 3, column = 3, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(en.PadLat, row = 3, column = 4, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)

        tkgrid(txt.Polygon, row = 4, column = 0, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 2, ipadx = 1, ipady = 1)
        tkgrid(cb.Polygon, row = 4, column = 1, sticky = 'we', rowspan = 1, columnspan = 4, padx = 1, pady = 2, ipadx = 1, ipady = 1)

        tkgrid(.cdtData$EnvData$bt.ADDObj, row = 5, column = 0, sticky = 'we', rowspan = 1, columnspan = 2, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(.cdtData$EnvData$bt.GETArea, row = 5, column = 2, sticky = 'we', rowspan = 1, columnspan = 3, padx = 1, pady = 1, ipadx = 1, ipady = 1)

        ################
        helpWidget(en.PadLon, lang.dlg[['tooltip']][['13']], lang.dlg[['status']][['13']])
        helpWidget(en.PadLat, lang.dlg[['tooltip']][['14']], lang.dlg[['status']][['14']])
        helpWidget(.cdtData$EnvData$bt.GETArea, lang.dlg[['tooltip']][['15']], lang.dlg[['status']][['15']])
        helpWidget(.cdtData$EnvData$bt.ADDObj, lang.dlg[['tooltip']][['16']], lang.dlg[['status']][['16']])

        ##########################################
        nbpts <- 1
        retMultiP <- NULL

        tkconfigure(.cdtData$EnvData$bt.ADDObj, command = function(){
            if(.cdtData$EnvData$dlgBoxOpen){
                if(.cdtData$EnvData$type.extract == 'mpoint')
                {
                    tkinsert(retMultiP$textObj, "end", paste(paste('Pts', nbpts, sep = ''),
                                                        tclvalue(.cdtData$EnvData$minlonRect),
                                                        tclvalue(.cdtData$EnvData$minlatRect), "\n"))
                    nbpts <<- nbpts + 1
                }
                if(.cdtData$EnvData$type.extract == 'mpoly')
                {
                    tkinsert(retMultiP$textObj, "end", paste(tclvalue(.cdtData$EnvData$namePoly), "\n"))
                }
            }
            stateADD <- if(.cdtData$EnvData$type.extract %in% c('mpoint', 'mpoly')) "normal" else "disabled"
            tkconfigure(.cdtData$EnvData$bt.ADDObj, relief = 'raised', bg = 'lightblue', state = stateADD)
        })

        #################
        tkbind(cb.Polygon, "<<ComboboxSelected>>", function(){
            .cdtData$EnvData$selectedPolygon <- NULL
            if(tclvalue(.cdtData$EnvData$namePoly) != ''){
                shpfopen <- getShpOpenData(shpFile)
                shpf <- shpfopen[[2]]
                ids <- as.numeric(tclvalue(tcl(.cdtData$EnvData$cb.shpAttr, 'current'))) + 1
                dat <- sf::st_drop_geometry(shpf)
                .cdtData$EnvData$selectedPolygon <- getBoundaries(shpf[dat[, ids] == tclvalue(.cdtData$EnvData$namePoly), ])
            }

            # selectedPolygon
            tabid <- as.numeric(tclvalue(tkindex(.cdtEnv$tcl$main$tknotes, 'current'))) + 1
            if(length(.cdtData$OpenTab$Type) > 0){
                if(.cdtData$OpenTab$Type[[tabid]] == "img" & !is.null(.cdtData$EnvData$tab$MapSelect))
                {
                    if(.cdtData$OpenTab$Data[[tabid]][[1]][[1]]$ID == .cdtData$EnvData$tab$MapSelect[[2]])
                    {
                        refreshPlot(W = .cdtData$OpenTab$Data[[tabid]][[2]][[1]],
                                    img = .cdtData$OpenTab$Data[[tabid]][[2]][[2]],
                                    hscale = as.numeric(tclvalue(tkget(.cdtEnv$tcl$toolbar$spinH))),
                                    vscale = as.numeric(tclvalue(tkget(.cdtEnv$tcl$toolbar$spinV))))
                    }
                }
            }
        })

        ##################
        tkbind(.cdtData$EnvData$bt.GETArea, "<Button-1>", function(){
            tclvalue(.cdtData$EnvData$zoom$pressButP) <- 0
            tclvalue(.cdtData$EnvData$zoom$pressButM) <- 0
            tclvalue(.cdtData$EnvData$zoom$pressButRect) <- 0
            tclvalue(.cdtData$EnvData$zoom$pressButDrag) <- 0

            tclvalue(.cdtData$EnvData$pressGetCoords) <- 1

            tkconfigure(.cdtData$EnvData$zoom$btRedraw, relief = 'raised', bg = 'lightblue')

            tkconfigure(.cdtData$EnvData$zoom$btZoomP, relief = 'raised', bg = 'lightblue', state = 'normal')
            tkconfigure(.cdtData$EnvData$zoom$btZoomM, relief = 'raised', bg = 'lightblue', state = 'normal')
            tkconfigure(.cdtData$EnvData$zoom$btZoomRect, relief = 'raised', bg = 'lightblue', state = 'normal')
            tkconfigure(.cdtData$EnvData$zoom$btPanImg, relief = 'raised', bg = 'lightblue', state = 'normal')

            tkconfigure(.cdtData$EnvData$bt.GETArea, relief = 'raised', bg = 'red', state = 'disabled')
            stateADD <- if(.cdtData$EnvData$type.extract %in% c('mpoint', 'mpoly')) "normal" else "disabled"
            tkconfigure(.cdtData$EnvData$bt.ADDObj, relief = 'raised', bg = 'lightblue', state = stateADD)
        })

        ##################

        tkbind(cb.TypeExtr, "<<ComboboxSelected>>", function(){
            .cdtData$EnvData$selectedPolygon <- NULL

            intstep <- periodVAL[CbperiodVAL %in% trimws(tclvalue(timeSteps))]
            outfrmt <- OutFileFormatV[CbOutFileFormat %in% trimws(tclvalue(out.format))]
            OutFileFormat <- CbOutFileFormat

            .cdtData$EnvData$type.extract <- typeEXTRACTV[typeEXTRACT %in% trimws(tclvalue(type.extract))]
            # outfrmt <- trimws(tclvalue(out.format))

            if(.cdtData$EnvData$type.extract == "point")
            {
                if(!is.null(retMultiP$win)) tkdestroy(retMultiP$win)

                statePts <- 'normal'
                stateRct <- 'disabled'
                statePad <- 'normal'
                statePol <- 'disabled'
                stateADD <- 'disabled'

                pointrectVal <- 'Point'
                minrectVal <- ''
                maxrectVal <- ''

                stateSpAv <- 'disabled'
                spatAverg <- '0'

                txtfileORdir <- lang.dlg[['label']][['19']]
                colfileORdir <- 'lightblue'
                isFile <- TRUE
 
                if(intstep == 'onefile'){
                    OutFileFormat <- c(OutFileFormat[1], "")
                    out.formatVAL <- OutFileFormat[1]
                }else{
                    OutFileFormat <- OutFileFormat[1:2]
                    out.formatVAL <- if(outfrmt %in% c('ncdf', 'tyxz')) OutFileFormat[1] else tclvalue(out.format)
                }
            }

            ##
            if(.cdtData$EnvData$type.extract == "rect")
            {
                if(!is.null(retMultiP$win)) tkdestroy(retMultiP$win)

                statePts <- 'normal'
                stateRct <- 'normal'
                statePad <- 'disabled'
                statePol <- 'disabled'
                stateADD <- 'disabled'

                pointrectVal <- 'Rectangle'
                minrectVal <- 'Minimum'
                maxrectVal <- 'Maximum'

                stateSpAv <- if(outfrmt == 'cpt') 'normal' else 'disabled'

                if(outfrmt %in% c('ncdf', 'tyxz')){
                    spatAverg <- "0"
                }else if(outfrmt == 'cdt'){
                    spatAverg <- "1"
                }else spatAverg <- tclvalue(spatAverage)

                if(outfrmt == 'ncdf'){
                    txtfileORdir <- lang.dlg[['label']][['20']]
                    colfileORdir <- 'lightgreen'
                    isFile <- FALSE
                }else{
                    txtfileORdir <- lang.dlg[['label']][['19']]
                    colfileORdir <- 'lightblue'
                    isFile <- TRUE
                }

                out.formatVAL <- tclvalue(out.format)
            }

            ##
            if(.cdtData$EnvData$type.extract == "poly")
            {
                if(!is.null(retMultiP$win)) tkdestroy(retMultiP$win)

                statePts <- 'disabled'
                stateRct <- 'disabled'
                statePad <- 'disabled'
                statePol <- 'normal'
                stateADD <- 'disabled'

                pointrectVal <- tclvalue(pointrect)
                minrectVal <- ''
                maxrectVal <- ''

                stateSpAv <- if(outfrmt == 'cpt') 'normal' else 'disabled'

                if(outfrmt %in% c('ncdf', 'tyxz')){
                    spatAverg <- "0"
                }else if(outfrmt == 'cdt'){
                    spatAverg <- "1"
                }else spatAverg <- tclvalue(spatAverage)

                if(outfrmt == 'ncdf'){
                    txtfileORdir <- lang.dlg[['label']][['20']]
                    colfileORdir <- 'lightgreen'
                    isFile <- FALSE
                }else{
                    txtfileORdir <- lang.dlg[['label']][['19']]
                    colfileORdir <- 'lightblue'
                    isFile <- TRUE
                }

                out.formatVAL <- tclvalue(out.format)

                if(tclvalue(.cdtData$EnvData$namePoly) != '')
                {
                    shpfopen <- getShpOpenData(shpFile)
                    shpf <- shpfopen[[2]]
                    ids <- as.integer(tclvalue(tcl(.cdtData$EnvData$cb.shpAttr, 'current'))) + 1
                    nompoly <- trimws(tclvalue(.cdtData$EnvData$namePoly))
                    dat <- sf::st_drop_geometry(shpf)
                    .cdtData$EnvData$selectedPolygon <- getBoundaries(shpf[dat[, ids] == nompoly, ])
                }
            }

            ##
            if(.cdtData$EnvData$type.extract == "mpoint")
            {
                if(!is.null(retMultiP$win)) tkdestroy(retMultiP$win)
                retMultiP <<- extractTS.previewWin(c('normal', 'disabled'),
                                                    list(.cdtData$EnvData$cb.shpAttr, shpFile),
                                                    .cdtData$EnvData$type.extract)
                statePts <- 'normal'
                stateRct <- 'disabled'
                statePad <- 'normal'
                statePol <- 'disabled'
                stateADD <- 'normal'

                pointrectVal <- 'Point'
                minrectVal <- ''
                maxrectVal <- ''

                stateSpAv <- 'disabled'
                spatAverg <- '0'

                txtfileORdir <- lang.dlg[['label']][['19']]
                colfileORdir <- 'lightblue'
                isFile <- TRUE

                if(intstep == 'onefile'){
                    OutFileFormat <- c(OutFileFormat[1], '')
                    out.formatVAL <- OutFileFormat[1]
                }else{
                    OutFileFormat <- OutFileFormat[1:2]
                    out.formatVAL <- if(outfrmt %in% c('ncdf', 'tyxz')) OutFileFormat[1] else tclvalue(out.format)
                }
            }

            ##
            if(.cdtData$EnvData$type.extract == "mpoly")
            {
                if(!is.null(retMultiP$win)) tkdestroy(retMultiP$win)
                retMultiP <<- extractTS.previewWin(c('disabled', 'normal'),
                                                    list(.cdtData$EnvData$cb.shpAttr, shpFile),
                                                    .cdtData$EnvData$type.extract)
                statePts <- 'disabled'
                stateRct <- 'disabled'
                statePad <- 'disabled'
                statePol <- 'normal'
                stateADD <- 'normal'

                pointrectVal <- tclvalue(pointrect)
                minrectVal <- ''
                maxrectVal <- ''

                #################

                stateSpAv <- 'disabled'
                spatAverg <- if(outfrmt %in% c('ncdf', 'tyxz')) "0" else "1"

                if(outfrmt %in% c('ncdf', 'tyxz')){
                    txtfileORdir <- lang.dlg[['label']][['20']]
                    colfileORdir <- 'lightgreen'
                    isFile <- FALSE
                }else{
                    txtfileORdir <- lang.dlg[['label']][['19']]
                    colfileORdir <- 'lightblue'
                    isFile <- TRUE
                }

                out.formatVAL <- tclvalue(out.format)

                #################

                if(tclvalue(.cdtData$EnvData$namePoly) != ''){
                    shpfopen <- getShpOpenData(shpFile)
                    shpf <- shpfopen[[2]]
                    ids <- as.integer(tclvalue(tcl(.cdtData$EnvData$cb.shpAttr, 'current'))) + 1
                    nompoly <- trimws(tclvalue(.cdtData$EnvData$namePoly))
                    dat <- sf::st_drop_geometry(shpf)
                    .cdtData$EnvData$selectedPolygon <- getBoundaries(shpf[dat[, ids] == nompoly, ])
                }
            }

            tkconfigure(en.minlon, state = statePts)
            tkconfigure(en.minlat, state = statePts)
            tkconfigure(en.maxlon, state = stateRct)
            tkconfigure(en.maxlat, state = stateRct)
            tkconfigure(en.PadLon, state = statePad)
            tkconfigure(en.PadLat, state = statePad)

            tkconfigure(cb.Polygon, state = statePol)
            tkconfigure(.cdtData$EnvData$bt.ADDObj, state = stateADD)

            tclvalue(pointrect) <- pointrectVal
            tclvalue(minrect) <- minrectVal
            tclvalue(maxrect) <- maxrectVal

            ##
            tkconfigure(chk.SpAvrg, state = stateSpAv)
            tclvalue(spatAverage) <- spatAverg
            tkconfigure(txt.saveData, bg = colfileORdir)
            tclvalue(fileORdir) <- txtfileORdir
            tclvalue(outputFD) <- isFile
            tkconfigure(bt.saveData, command = function() fileORdir2Save(file2save, isFile = isFile))

            tkconfigure(cb.outFormat, values = OutFileFormat)
            tclvalue(out.format) <- out.formatVAL

            ##
            tclvalue(.cdtData$EnvData$minlonRect) <- ''
            tclvalue(.cdtData$EnvData$maxlonRect) <- ''
            tclvalue(.cdtData$EnvData$minlatRect) <- ''
            tclvalue(.cdtData$EnvData$maxlatRect) <- ''
            tkconfigure(.cdtData$EnvData$bt.GETArea, relief = 'raised', bg = 'lightblue', state = 'normal')

            # selectedPolygon
            tabid <- as.numeric(tclvalue(tkindex(.cdtEnv$tcl$main$tknotes, 'current'))) + 1
            if(length(.cdtData$OpenTab$Type) > 0){
                if(.cdtData$OpenTab$Type[[tabid]] == "img" & !is.null(.cdtData$EnvData$tab$MapSelect))
                {
                    if(.cdtData$OpenTab$Data[[tabid]][[1]][[1]]$ID == .cdtData$EnvData$tab$MapSelect[[2]])
                    {
                        refreshPlot(W = .cdtData$OpenTab$Data[[tabid]][[2]][[1]],
                                    img = .cdtData$OpenTab$Data[[tabid]][[2]][[2]],
                                    hscale = as.numeric(tclvalue(tkget(.cdtEnv$tcl$toolbar$spinH))),
                                    vscale = as.numeric(tclvalue(tkget(.cdtEnv$tcl$toolbar$spinV))))
                        tkdelete(tkwinfo('children', .cdtData$OpenTab$Data[[tabid]][[1]][[2]]), 'rect')
                    }
                }
            }
        })

        #############################
        tkgrid(frameZoom, row = 0, column = 0, sticky = '')
        tkgrid(frameExtract, row = 1, column = 0, sticky = 'we', pady = 3)

    ######################################################################################################

    #Tab3
    subfr3 <- bwTabScrollableFrame(cmd.tab3)

    ##########################################

        frameDate <- tkframe(subfr3, relief = 'groove', borderwidth = 2)

        startMonth <- tclVar(MOIS[GeneralParameters$months$start])
        endMonth <- tclVar(MOIS[GeneralParameters$months$end])

        bt.daterange <- ttkbutton(frameDate, text = lang.dlg[['button']][['1']])
        txt.month <- tklabel(frameDate, text = lang.dlg[['label']][['6']], anchor = 'w', justify = 'left')
        fr.Month <- tkframe(frameDate)

        txt.startMonth <- tklabel(fr.Month, text = lang.dlg[['label']][['7']], anchor = 'e', justify = 'right')
        cb.startMonth <- ttkcombobox(fr.Month, values = MOIS, textvariable = startMonth, width = largeur5)
        txt.endMonth <- tklabel(fr.Month, text = lang.dlg[['label']][['8']])
        cb.endMonth <- ttkcombobox(fr.Month, values = MOIS, textvariable = endMonth, width = largeur5)

        tkgrid(txt.startMonth, row = 0, column = 0, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(cb.startMonth, row = 0, column = 1, sticky = 'we', rowspan = 1, columnspan = 3, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(txt.endMonth, row = 0, column = 4, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(cb.endMonth, row = 0, column = 5, sticky = 'we', rowspan = 1, columnspan = 3, padx = 1, pady = 1, ipadx = 1, ipady = 1)

        tkgrid(bt.daterange, row = 0, column = 0, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(txt.month, row = 1, column = 0, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(fr.Month, row = 2, column = 0, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)

        helpWidget(bt.daterange, lang.dlg[['tooltip']][['6']], lang.dlg[['status']][['6']])

        #################

        tkconfigure(bt.daterange, command = function(){
            intstep <- periodVAL[CbperiodVAL %in% trimws(tclvalue(timeSteps))]
            GeneralParameters[["date.range"]] <<- getInfoDateRange(.cdtEnv$tcl$main$win,
                                                                    GeneralParameters[["date.range"]],
                                                                    intstep)
        })

        #############################

        frameOutFormat <- ttklabelframe(subfr3, text = lang.dlg[['label']][['18']], relief = 'groove')

        CbOutFileFormat1 <- c('CDT Stations Data Format', 'NetCDF Files', 'Lat|Lon|Value Format')
        CbOutFileFormat2 <- c('CDT Stations Data Format', 'CPT File Format',
                              'NetCDF Files', 'Time|Lat|Lon|Value Format')
        OutFileFormatVal <- c('cdt', 'cpt', 'ncdf', 'tyxz')

        if(GeneralParameters$intstep == 'onefile'){
            CbOutFileFormat <- CbOutFileFormat1
            OutFileFormatV <- OutFileFormatVal[-2]
            OutFileFormat <- if(GeneralParameters$type.extract %in% c("point", "mpoint")) c(CbOutFileFormat[1], '') else CbOutFileFormat
        }else{
            CbOutFileFormat <- CbOutFileFormat2
            OutFileFormatV <- OutFileFormatVal
            OutFileFormat <- if(GeneralParameters$type.extract %in% c("point", "mpoint")) CbOutFileFormat[1:2] else CbOutFileFormat
        }

        out.format <- tclVar()
        tclvalue(out.format) <- CbOutFileFormat[OutFileFormatV %in% GeneralParameters$out.data$format]

        spatAverage <- tclVar(GeneralParameters$out.data$sp.avrg)
        stateSpAv <- if(GeneralParameters$out.data$format == "cpt" &
                        GeneralParameters$type.extract != "mpoly") 'normal' else 'disabled'

        #################

        cb.outFormat <- ttkcombobox(frameOutFormat, values = OutFileFormat, textvariable = out.format, width = largeur1)
        fr.SpAvrg <- tkframe(frameOutFormat)

        txt.SpAvrg <- tklabel(fr.SpAvrg, text = lang.dlg[['checkbutton']][['1']], anchor = 'e', justify = 'right')
        chk.SpAvrg <- tkcheckbutton(fr.SpAvrg, variable = spatAverage, state = stateSpAv)

        #################

        tkgrid(txt.SpAvrg, row = 0, column = 0, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 3, ipadx = 1, ipady = 1)
        tkgrid(chk.SpAvrg, row = 0, column = 1, sticky = 'w', rowspan = 1, columnspan = 1, padx = 1, pady = 3, ipadx = 1, ipady = 1)

        tkgrid(cb.outFormat, row = 0, column = 0, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(fr.SpAvrg, row = 1, column = 0, sticky = 'we', rowspan = 1, columnspan = 1, padx = 1, pady = 1, ipadx = 1, ipady = 1)

        helpWidget(cb.outFormat, lang.dlg[['tooltip']][['17']], lang.dlg[['status']][['17']])

        #################

        tkbind(cb.outFormat, "<<ComboboxSelected>>", function(){
            outfrmt <- OutFileFormatV[CbOutFileFormat %in% trimws(tclvalue(out.format))]

            if(.cdtData$EnvData$type.extract %in% c('point', 'mpoint'))
            {
                txtfileORdir <- lang.dlg[['label']][['19']]
                colfileORdir <- 'lightblue'
                isFile <- TRUE

                spatAverg <- "0"
                stateSpAv <- 'disabled'
            }else{
                if(outfrmt == 'ncdf'){
                    txtfileORdir <- lang.dlg[['label']][['20']]
                    colfileORdir <- 'lightgreen'
                    isFile <- FALSE
                }else if(outfrmt == 'tyxz' && .cdtData$EnvData$type.extract == 'mpoly'){
                    txtfileORdir <- lang.dlg[['label']][['20']]
                    colfileORdir <- 'lightgreen'
                    isFile <- FALSE
                }else{
                    txtfileORdir <- lang.dlg[['label']][['19']]
                    colfileORdir <- 'lightblue'
                    isFile <- TRUE
                }

                if(outfrmt %in% c('ncdf', 'tyxz')){
                    spatAverg <- "0"
                }else if(outfrmt == 'cdt'){
                    spatAverg <- "1"
                }else{
                    spatAverg <- if(.cdtData$EnvData$type.extract == 'mpoly') "1" else "0"
                }

                stateSpAv <- if(outfrmt == 'cpt' && .cdtData$EnvData$type.extract != 'mpoly') 'normal' else 'disabled'
            }

            tkconfigure(chk.SpAvrg, state = stateSpAv)
            tclvalue(spatAverage) <- spatAverg

            tkconfigure(txt.saveData, bg = colfileORdir)
            tclvalue(fileORdir) <- txtfileORdir
            tclvalue(outputFD) <- isFile
            tkconfigure(bt.saveData, command = function() fileORdir2Save(file2save, isFile = isFile))
        })

        #############################

        frameSave <- tkframe(subfr3, relief = 'groove', borderwidth = 2)

        if(GeneralParameters$out.data$sp.avrg)
        {
            txtfileORdir <- lang.dlg[['label']][['19']]
            colfileORdir <- 'lightblue'
            isFile <- TRUE
        }else{
            if(GeneralParameters$type.extract %in% c("rect", "poly", "mpoly"))
            {
                if(GeneralParameters$out.data$format == "ncdf" |
                  (GeneralParameters$type.extract == "mpoly" &
                   GeneralParameters$out.data$format == "tyxz"))
                {
                    txtfileORdir <- lang.dlg[['label']][['20']]
                    colfileORdir <- 'lightgreen'
                    isFile <- FALSE
                }else{
                    txtfileORdir <- lang.dlg[['label']][['19']]
                    colfileORdir <- 'lightblue'
                    isFile <- TRUE
                }
            }else{
                txtfileORdir <- lang.dlg[['label']][['19']]
                colfileORdir <- 'lightblue'
                isFile <- TRUE
            }
        }

        outputFD <- tclVar(isFile)
        fileORdir <- tclVar(txtfileORdir)
        file2save <- tclVar(GeneralParameters$out.data$outdir)

        txt.saveData <- tklabel(frameSave, text = tclvalue(fileORdir), textvariable = fileORdir, anchor = 'w', justify = 'left', bg = colfileORdir)
        en.saveData <- tkentry(frameSave, textvariable = file2save, width = largeur2)
        bt.saveData <- tkbutton(frameSave, text = "...")

        tkgrid(txt.saveData, row = 0, column = 0, sticky = 'we', rowspan = 1, columnspan = 5, padx = 1, pady = 0, ipadx = 1, ipady = 1)
        tkgrid(en.saveData, row = 1, column = 0, sticky = 'we', rowspan = 1, columnspan = 4, padx = 0, pady = 0, ipadx = 1, ipady = 1)
        tkgrid(bt.saveData, row = 1, column = 4, sticky = 'we', rowspan = 1, columnspan = 1, padx = 0, pady = 0, ipadx = 1, ipady = 1)

        helpWidget(en.saveData, lang.dlg[['tooltip']][['18']], lang.dlg[['status']][['18']])
        helpWidget(bt.saveData, lang.dlg[['tooltip']][['5']], lang.dlg[['status']][['5']])

        tkconfigure(bt.saveData, command = function() fileORdir2Save(file2save, isFile = isFile))

        #############################

        bt.Extract.Data <- ttkbutton(subfr3, text = lang.dlg[['button']][['6']])

        tkconfigure(bt.Extract.Data, command = function(){
            GeneralParameters$intstep <- periodVAL[CbperiodVAL %in% trimws(tclvalue(timeSteps))]
            GeneralParameters$minhour <- as.numeric(trimws(tclvalue(minhour.tclVar)))

            if(GeneralParameters$intstep == 'seasonal'){
                GeneralParameters$season.start <- which(MOIS %in% trimws(tclvalue(seasStart.tclVar)))
                GeneralParameters$season.len <- as.numeric(trimws(tclvalue(seasLen.tclVar)))
            }

            GeneralParameters$data.type <- datatypeVAL[CbdatatypeVAL %in% trimws(tclvalue(DataType))]

            if(GeneralParameters$data.type == 'cdtnetcdf'){
                GeneralParameters$cdtnetcdf$dir <- trimws(tclvalue(input.file))
                if(is.null(settingINData) && GeneralParameters$intstep != 'onefile'){
                    Insert.Messages.Out(lang.dlg[['message']][['5']], TRUE, "w")
                    return(NULL)
                }
            }else GeneralParameters$cdtdataset$index <- trimws(tclvalue(input.file))

            GeneralParameters$shp.file$shp <- trimws(tclvalue(shpFile))
            GeneralParameters$shp.file$attr <- trimws(tclvalue(shpAttr))

            GeneralParameters$type.extract <- typeEXTRACTV[typeEXTRACT %in% trimws(tclvalue(type.extract))]

            GeneralParameters$Geom$minlon <- as.numeric(trimws(tclvalue(.cdtData$EnvData$minlonRect)))
            GeneralParameters$Geom$maxlon <- as.numeric(trimws(tclvalue(.cdtData$EnvData$maxlonRect)))
            GeneralParameters$Geom$minlat <- as.numeric(trimws(tclvalue(.cdtData$EnvData$minlatRect)))
            GeneralParameters$Geom$maxlat <- as.numeric(trimws(tclvalue(.cdtData$EnvData$maxlatRect)))
            GeneralParameters$Geom$padlon <- as.numeric(trimws(tclvalue(padLon)))
            GeneralParameters$Geom$padlat <- as.numeric(trimws(tclvalue(padLat)))
            GeneralParameters$Geom$namePoly <- trimws(tclvalue(.cdtData$EnvData$namePoly))

            if(GeneralParameters$type.extract %in% c('mpoint', 'mpoly')){
                multiptspoly <- gsub("[\r]", "", .cdtData$EnvData$multiptspoly)
                multiptspoly <- trimws(strsplit(multiptspoly, "[\n]")[[1]])
                multiptspoly <- multiptspoly[multiptspoly != ""]

                if(GeneralParameters$type.extract == 'mpoint'){
                    multiptspoly <- t(sapply(multiptspoly, function(x) strsplit(x, " ")[[1]]))
                    multiptspoly <- data.frame(multiptspoly, stringsAsFactors = FALSE)
                    rownames(multiptspoly) <- NULL
                    names(multiptspoly) <- c('id', 'x', 'y')
                    multiptspoly$x <- as.numeric(multiptspoly$x)
                    multiptspoly$y <- as.numeric(multiptspoly$y)
                }
            
                GeneralParameters$Geom$multiObj <- multiptspoly
            }

            GeneralParameters$months$start <- which(MOIS %in% trimws(tclvalue(startMonth)))
            GeneralParameters$months$end <- which(MOIS %in% trimws(tclvalue(endMonth)))

            GeneralParameters$out.data$format <- OutFileFormatV[CbOutFileFormat %in% trimws(tclvalue(out.format))]
            if(GeneralParameters$out.data$format == '') return(NULL)

            GeneralParameters$out.data$sp.avrg <- switch(tclvalue(spatAverage), '0' = FALSE, '1' = TRUE)
            GeneralParameters$out.data$outdir <- trimws(tclvalue(file2save))
            GeneralParameters$out.data$isFile <- switch(tclvalue(outputFD), '0' = FALSE, '1' = TRUE)

            # assign('GeneralParameters', GeneralParameters, envir = .GlobalEnv)

            Insert.Messages.Out(lang.dlg[['message']][['6']], TRUE, "i")

            tkconfigure(.cdtEnv$tcl$main$win, cursor = 'watch')
            tcl('update')
            ret <- tryCatch(
                {
                    ExtractDataProcs(GeneralParameters)
                },
                warning = function(w){
                    warningFun(w)
                    return(0)
                },
                error = function(e) errorFun(e),
                finally = {
                    tkconfigure(.cdtEnv$tcl$main$win, cursor = '')
                    tcl('update')
                }
            )

            if(!is.null(ret)){
                if(ret == 0)
                    Insert.Messages.Out(lang.dlg[['message']][['7']], TRUE, "s")
                else if(ret == -1)
                    Insert.Messages.Out(lang.dlg[['message']][['9']], TRUE, "w")
                else
                    Insert.Messages.Out(lang.dlg[['message']][['8']], TRUE, "e")
            }else Insert.Messages.Out(lang.dlg[['message']][['8']], TRUE, "e")
        })

        #############################
        tkgrid(frameDate, row = 0, column = 0, sticky = '', padx = 1, pady = 1, ipadx = 1, ipady = 1)
        tkgrid(frameOutFormat, row = 1, column = 0, sticky = '', padx = 1, pady = 3, ipadx = 1, ipady = 1)
        tkgrid(frameSave, row = 2, column = 0, sticky = 'we', padx = 1, pady = 3, ipadx = 1, ipady = 1)
        tkgrid(bt.Extract.Data, row = 3, column = 0, sticky = 'we', padx = 1, pady = 3, ipadx = 1, ipady = 1)

    #######################################################################################################

    tkgrid(tknote.cmd, sticky = 'nwes')
    tkgrid.columnconfigure(tknote.cmd, 0, weight = 1)
    tkgrid.rowconfigure(tknote.cmd, 0, weight = 1)

    tcl('update')
    tkgrid(.cdtEnv$tcl$main$cmd.frame, sticky = 'nwes', pady = 1)
    tkgrid.columnconfigure(.cdtEnv$tcl$main$cmd.frame, 0, weight = 1)
    tkgrid.rowconfigure(.cdtEnv$tcl$main$cmd.frame, 0, weight = 1)

    invisible()
}
rijaf-iri/CDT documentation built on July 3, 2024, 2:54 a.m.