示例#1
0
def formBlundersBrilliancies(alm, configuracion):
    liBlunders = [SEPARADOR]

    liBlunders.append((
        FormLayout.Editbox(_("Is considered wrong move when the loss of points is greater than"), tipo=int, ancho=50),
        alm.kblunders))
    liBlunders.append(SEPARADOR)

    def fileNext(base, ext):
        return Util.fileNext(configuracion.dirPersonalTraining, base, ext)

    path_pgn = fileNext("Blunders", "pgn")

    liBlunders.append((None, _("Generate a training file with these moves")))

    config = FormLayout.Editbox(_("Tactics name"), rx="[^\\\:/|?*^%><()]*")
    liBlunders.append((config, ""))

    config = FormLayout.Fichero(_("PGN Format"), "%s (*.pgn)" % _("PGN Format"), True, anchoMinimo=280,
                                ficheroDefecto=path_pgn)
    liBlunders.append((config, ""))

    liBlunders.append((_("Also add complete game to PGN") + ":", False))

    liBlunders.append(SEPARADOR)

    eti = '"%s"' % _("Find best move")
    liBlunders.append((_X(_("Add to the training %1 with the name"), eti) + ":", ""))

    liBrilliancies = [SEPARADOR]

    liBrilliancies.append((FormLayout.Spinbox(_("Minimum depth"), 3, 30, 50), alm.dpbrilliancies))

    liBrilliancies.append((FormLayout.Spinbox(_("Minimum gain points"), 30, 30000, 50), alm.ptbrilliancies))
    liBrilliancies.append(SEPARADOR)

    path_fns = fileNext("Brilliancies", "fns")
    path_pgn = fileNext("Brilliancies", "pgn")

    liBrilliancies.append((None, _("Generate a training file with these moves")))

    config = FormLayout.Fichero(_("List of FENs"), "%s (*.fns)" % _("List of FENs"), True, anchoMinimo=280,
                                ficheroDefecto=path_fns)
    liBrilliancies.append((config, ""))

    config = FormLayout.Fichero(_("PGN Format"), "%s (*.pgn)" % _("PGN Format"), True, anchoMinimo=280,
                                ficheroDefecto=path_pgn)
    liBrilliancies.append((config, ""))

    liBrilliancies.append((_("Also add complete game to PGN"), False))

    liBrilliancies.append(SEPARADOR)

    eti = '"%s"' % _("Find best move")
    liBrilliancies.append((_X(_("Add to the training %1 with the name"), eti) + ":", ""))

    return liBlunders, liBrilliancies
    def configurar(self):
        # Datos
        li_gen = [(None, None)]

        # # Motor
        mt = self.configuration.tutor_inicial if self.engine is None else self.engine

        li_combo = [mt]
        for name, key in self.configuration.comboMotoresMultiPV10():
            li_combo.append((key, name))

        li_gen.append((_("Engine") + ":", li_combo))

        # # Segundos a pensar el tutor
        config = FormLayout.Spinbox(_("Duration of engine analysis (secs)"), 1,
                                    99, 50)
        li_gen.append((config, self.segundos))

        # Pruebas
        config = FormLayout.Spinbox(_("N. of tests"), 1, 40, 40)
        li_gen.append((config, self.pruebas))

        # Fichero
        config = FormLayout.Fichero(_("File"),
                                    "%s (*.fns);;%s PGN (*.pgn)" %
                                    (_("List of FENs"), _("File")),
                                    False,
                                    anchoMinimo=280)
        li_gen.append((config, self.fns))

        # Editamos
        resultado = FormLayout.fedit(li_gen,
                                     title=_("Configuration"),
                                     parent=self,
                                     icon=Iconos.Opciones())
        if resultado:
            accion, li_resp = resultado
            self.engine = li_resp[0]
            self.segundos = li_resp[1]
            self.pruebas = li_resp[2]
            self.fns = li_resp[3]

            param = UtilSQL.DictSQL(self.configuration.ficheroDailyTest,
                                    tabla="parametros")
            param["ENGINE"] = self.engine
            param["SEGUNDOS"] = self.segundos
            param["PRUEBAS"] = self.pruebas
            param["FNS"] = self.fns
            param.close()
示例#3
0
    def command(self):
        separador = FormLayout.separador
        li_gen = [separador]
        li_gen.append(separador)
        config = FormLayout.Fichero(_("File"),
                                    "exe" if Code.is_windows else "*", False)
        li_gen.append((config, ""))

        for num in range(1, 11):
            li_gen.append(("%s:" % (_("Argument %d") % num), ""))
        li_gen.append(separador)
        resultado = FormLayout.fedit(li_gen,
                                     title=_("Command"),
                                     parent=self,
                                     anchoMinimo=600,
                                     icon=Iconos.Terminal())
        if resultado:
            nada, resp = resultado
            command = resp[0]
            liArgs = []
            if not command or not os.path.isfile(command):
                return
            for x in range(1, len(resp)):
                arg = resp[x].strip()
                if arg:
                    liArgs.append(arg)

            um = QTUtil2.unMomento(self)
            me = Engines.Engine(path_exe=command, args=liArgs)
            li_uci = me.read_uci_options()
            um.final()
            if not li_uci:
                QTUtil2.message_bold(
                    self,
                    _X(
                        _("The file %1 does not correspond to a UCI engine type."
                          ), command))
                return None

            # Editamos
            w = WEngine(self, self.lista_motores, me)
            if w.exec_():
                self.lista_motores.append(me)
                self.grid.refresh()
                self.grid.gobottom(0)
                self.grabar()
示例#4
0
    def command(self):
        separador = FormLayout.separador
        liGen = [separador]
        liGen.append(separador)
        config = FormLayout.Fichero(_("File"), "exe", False)
        liGen.append((config, ""))

        for num in range(1, 11):
            liGen.append((_("Argument %d") % num + ":", ""))
        liGen.append(separador)
        resultado = FormLayout.fedit(liGen,
                                     title=_("Command"),
                                     parent=self,
                                     anchoMinimo=600,
                                     icon=Iconos.Terminal())
        if resultado:
            nada, resp = resultado
            command = resp[0]
            liArgs = []
            if not command or not os.path.isfile(command):
                return
            for x in range(1, len(resp)):
                arg = resp[x].strip()
                if arg:
                    liArgs.append(arg)

            um = QTUtil2.unMomento(self)
            me = MotoresExternos.MotorExterno()
            resp = me.leerUCI(command, liArgs)
            um.final()
            if not resp:
                QTUtil2.mensaje(
                    self,
                    _X(
                        _("The file %1 does not correspond to a UCI engine type."
                          ), command))
                return None

            # Editamos
            w = WMotor(self, self.listaMotores, me)
            if w.exec_():
                self.listaMotores.nuevo(me)
                self.grid.refresh()
                self.grid.gobottom(0)
                self.grabar()
示例#5
0
def opciones(parent, configuracion):
    separador = (None, None)

    # Datos generales
    liGen = [separador]

    # # Nombre del jugador
    liGen.append((_("Player's name") + ":", configuracion.jugador))

    # # Estilo
    liGen.append((_("Window style") + ":", configuracion.estilos()))

    liTraducciones = configuracion.listaTraducciones()
    trActual = configuracion.traductor if configuracion.traductor else "en"
    li = [trActual]
    for k, trad, porc, author in liTraducciones:
        rotulo = "%s" % trad
        if int(porc) < 90:
           rotulo += " (%s%%)"%porc
        li.append((k, rotulo))
    liGen.append((_("Language") + ":", li))
    liGen.append(separador)
    liGen.append((_("Check for updates at startup") + ":", configuracion.checkforupdate))

    # Engines
    liEng = [separador]
    liMedidas = [configuracion.centipawns,
                 (True, "%s = 100 %s  ->   64, 19, -19, +23, -120, +130" % (_("One pawn"), _("points"))),
                 (False, "%s = 1.00 %s ->   0.64, 0.19, -0.19, +0.23, -1.20, +1.30" % (_("One pawn"), _("points")))]
    liEng.append((_("By showing scores from the engines") + ":", liMedidas))
    liEng.append(separador)
    liEng.append((_("OS 64bits BMI2 compatible") + ":", configuracion.bmi2))
    liEng.append(separador)
    liEng.append((_("Do not work in background when possible") + ":", configuracion.notbackground))

    # Aspect
    liAsp = []

    liAsp.append((_("By default") + ":", False))
    liAsp.append(separador)

    ## font general
    liAsp.append((FormLayout.FontCombobox(_("Font")), configuracion.familia))
    liAsp.append(separador)

    ## Menus
    liAsp.append((None, _("Menus") + ":"))
    liAsp.append((FormLayout.Spinbox(_("Font size"), 5, 64, 60), configuracion.puntosMenu))
    liAsp.append((_("Bold") + ":", configuracion.boldMenu))

    ## Toolbars
    liAsp.append(separador)
    liAsp.append((None, _("Toolbars") + ":"))
    liAsp.append((FormLayout.Spinbox(_("Font size"), 5, 64, 60), configuracion.puntosTB))
    liAsp.append((_("Bold") + ":", configuracion.boldTB))
    li = (
            (_("Only display the icon"), QtCore.Qt.ToolButtonIconOnly),
            (_("Only display the text"), QtCore.Qt.ToolButtonTextOnly),
            (_("The text appears beside the icon"), QtCore.Qt.ToolButtonTextBesideIcon),
            (_("The text appears under the icon"), QtCore.Qt.ToolButtonTextUnderIcon)
    )
    config = FormLayout.Combobox(_("Icons"), li)
    liAsp.append((config, configuracion.iconsTB))

    ## PGN table
    liAsp.append(separador)
    liAsp.append((None, _("PGN table") + ":"))
    liAsp.append((FormLayout.Spinbox(_("Width"), 283, 1000, 70), configuracion.anchoPGN))
    liAsp.append((FormLayout.Spinbox(_("Height of each row"), 18, 99, 40), configuracion.altoFilaPGN))
    liAsp.append((FormLayout.Spinbox(_("Font size"), 10, 99, 40), configuracion.puntosPGN))
    liAsp.append((_("PGN always in English") + ":", configuracion.siNomPiezasEN))
    liAsp.append((_("PGN with figurines") + ":", configuracion.figurinesPGN))

    liAsp.append(separador)
    liAsp.append((FormLayout.Spinbox(_("Font size of information labels"), 8, 30, 40), configuracion.tamFontRotulos))

    # Sonidos
    liSon = [separador]
    liSon.append(separador)
    # Si a_adimos sonido tras cada jugada
    liSon.append((_("Beep after opponent's move") + ":", configuracion.siSuenaBeep))
    liSon.append(separador)
    liSon.append((None, _("Sound on in") + ":"))
    liSon.append((_("Results") + ":", configuracion.siSuenaResultados))
    liSon.append((_("Rival moves") + ":", configuracion.siSuenaJugada))
    liSon.append(separador)
    liSon.append((_("Activate sounds with our moves") + ":", configuracion.siSuenaNuestro))
    liSon.append(separador)

    # Tutor
    liTT = [separador]
    liTT.append((_("Engine") + ":", configuracion.ayudaCambioTutor()))
    liTT.append((_("Duration of tutor analysis (secs)") + ":", float(configuracion.tiempoTutor / 1000.0)))
    li = [(_("Maximum"), 0)]
    for x in (1, 3, 5, 10, 15, 20, 30, 40, 50, 75, 100, 150, 200):
        li.append((str(x), x))
    config = FormLayout.Combobox(_("Number of moves evaluated by engine(MultiPV)"), li)
    liTT.append((config, configuracion.tutorMultiPV))
    liTT.append(separador)
    liTT.append((_("Tutor enabled"), configuracion.tutorActivoPorDefecto))
    liTT.append(separador)
    liTT.append((None, _("Sensitivity")))
    liTT.append((FormLayout.Spinbox(_("Minimum difference in points"), 0, 1000, 70), configuracion.tutorDifPts))
    liTT.append((FormLayout.Spinbox(_("Minimum difference in %"), 0, 1000, 70), configuracion.tutorDifPorc))

    # Modo no competitivo
    liNC = [separador]
    liNC.append((FormLayout.Spinbox(_("Lucas-Elo"), 0, 3200, 70), configuracion.eloNC))
    liNC.append((FormLayout.Spinbox(_("Tourney-Elo"), 0, 3200, 70), configuracion.micheloNC))
    liNC.append((FormLayout.Spinbox(_("Fics-Elo"), 0, 3200, 70), configuracion.ficsNC))
    liNC.append((FormLayout.Spinbox(_("Fide-Elo"), 0, 3200, 70), configuracion.fideNC))

    # Salvado automatico
    liSA = [separador]

    config = FormLayout.Fichero(_("Autosave to a PGN file"), "pgn", True)
    liSA.append((config, configuracion.salvarFichero))
    liSA.append((_("Won games") + ":", configuracion.salvarGanados))
    liSA.append((_("Lost/Drawn games") + ":", configuracion.salvarPerdidos))
    liSA.append((_("Unfinished games") + ":", configuracion.salvarAbandonados))
    liSA.append(separador)
    liSA.append((_("Save as variant tutor's suggestion") + ":", configuracion.guardarVariantesTutor))
    liSA.append(separador)
    config = FormLayout.Fichero(_("Autosave to a CSV file moves played"), "csv", True)
    liSA.append((config, configuracion.salvarCSV))

    # Boards
    liT = [separador]

    # Mostrando el tutor
    # kTutorH, kTutorH2_1, kTutorH1_2, kTutorV
    liPosTutor = [configuracion.vistaTutor, (kTutorH, _("Horizontal")),
                  (kTutorH2_1, _("Horizontal") + " 2+1"),
                  (kTutorH1_2, _("Horizontal") + " 1+2"),
                  (kTutorV, _("Vertical"))]
    liT.append((_("Tutor boards position") + ":", liPosTutor))
    liT.append(separador)
    liT.append((_("Visual effects") + ":", configuracion.efectosVisuales))

    drap = {1: 100, 2: 150, 3: 200, 4: 250, 5: 300, 6: 350, 7: 400, 8: 450, 9: 500}
    drapV = {}
    for x in drap:
        drapV[drap[x]] = x
    liT.append((FormLayout.Dial("%s (%s=1)" % (_("Speed"), _("Default")), 1, len(drap), siporc=False),
                drapV.get(configuracion.rapidezMovPiezas, 100)))
    liT.append(separador)

    liMouseSH = [configuracion.siAtajosRaton,
                 (False, _("Type fixed: you must always indicate origin and destination")),
                 (True, _("Type predictive: program tries to guess your intention"))]
    liT.append((_("Mouse shortcuts") + ":", liMouseSH))
    liT.append((_("Show candidates") + ":", configuracion.showCandidates))
    liT.append((_("Show arrows of variants") + ":", configuracion.showVariantes))
    liT.append(separador)
    liT.append((_("Show cursor when engine is thinking") + ":", configuracion.cursorThinking))
    liT.append(separador)
    liT.append((_("Enable captured material window by default") + ":", configuracion.siActivarCapturas))
    liMat = [configuracion.tipoMaterial, ("D", _("Difference material")), ("C", _("Captured material at beginning")), ("M", _("Material advantage"))]
    liT.append((_("Show material") + ":", liMat))
    liT.append(separador)
    liT.append((_("Enable information panel by default") + ":", configuracion.siActivarInformacion))
    liT.append(separador)
    liT.append((_X(_("Enable %1"), _("DGT board")) + ":", configuracion.siDGT))
    liT.append(separador)
    # liT.append((FormLayout.Dial(_("Opacity of tool icon"), 1, 9, siporc=False), configuracion.opacityToolBoard))
    liT.append((_("Show configuration icon"), configuracion.opacityToolBoard > 6))
    liPos = [configuracion.positionToolBoard, ("B", _("Bottom")), ("T", _("Top"))]
    liT.append((_("Configuration icon position" + ":"), liPos))
    liT.append(separador)

    lista = []
    lista.append((liGen, _("General"), ""))
    lista.append((liSon, _("Sounds"), ""))
    lista.append((liTT, _("Tutor"), ""))
    lista.append((liT, _("Boards"), ""))
    lista.append((liEng, _("Engines"), ""))
    lista.append((liAsp, _("Appearance"), ""))
    lista.append((liSA, _("Autosave"), ""))
    lista.append((liNC, _("Non competitive mode"), ""))

    # Editamos
    resultado = FormLayout.fedit(lista, title=_("Configuration"), parent=parent, anchoMinimo=640, icon=Iconos.Opciones())

    if resultado:
        accion, resp = resultado

        liGen, liSon, liTT, liT, liEng, liAsp, liSA, liNC = resp

        (configuracion.jugador, configuracion.estilo, configuracion.traductor, configuracion.checkforupdate) = liGen

        porDefecto = liAsp[0]
        if porDefecto:
            liAsp = "", 11, False, 11, False,  QtCore.Qt.ToolButtonTextUnderIcon, 283, 22, 10, False, True, 10
        else:
            del liAsp[0]
        (configuracion.familia, configuracion.puntosMenu, configuracion.boldMenu,
            configuracion.puntosTB, configuracion.boldTB, configuracion.iconsTB,
            configuracion.anchoPGN, configuracion.altoFilaPGN, configuracion.puntosPGN,
            configuracion.siNomPiezasEN, configuracion.figurinesPGN,
            configuracion.tamFontRotulos) = liAsp
        if configuracion.familia == "System":
            configuracion.familia = ""

        (configuracion.siSuenaBeep, configuracion.siSuenaResultados, configuracion.siSuenaJugada, configuracion.siSuenaNuestro) = liSon

        (configuracion.tutor.clave, tiempoTutor, configuracion.tutorMultiPV,
            configuracion.tutorActivoPorDefecto, configuracion.tutorDifPts, configuracion.tutorDifPorc) = liTT
        configuracion.tiempoTutor = int(tiempoTutor * 1000)

        (configuracion.eloNC, configuracion.micheloNC, configuracion.ficsNC, configuracion.fideNC) = liNC

        (configuracion.centipawns, configuracion.bmi2, configuracion.notbackground) = liEng

        (configuracion.vistaTutor,
            configuracion.efectosVisuales, rapidezMovPiezas,
            configuracion.siAtajosRaton, configuracion.showCandidates, configuracion.showVariantes,
            configuracion.cursorThinking, configuracion.siActivarCapturas, configuracion.tipoMaterial,
            configuracion.siActivarInformacion, siDGT, toolIcon, configuracion.positionToolBoard) = liT
        configuracion.opacityToolBoard = 10 if toolIcon else 1
        configuracion.rapidezMovPiezas = drap[rapidezMovPiezas]
        if configuracion.siDGT != siDGT:
            if siDGT:
                DGT.ponON()
            configuracion.siDGT = siDGT

        (configuracion.salvarFichero, configuracion.salvarGanados, configuracion.salvarPerdidos,
            configuracion.salvarAbandonados, configuracion.guardarVariantesTutor,
            configuracion.salvarCSV) = liSA
        configuracion.salvarCSV = Util.dirRelativo(configuracion.salvarCSV)

        return True
    else:
        return False
示例#6
0
    def editar(self, una, icono):
        if una is None:
            una = {}

        # Datos basicos
        liGen = [(None, None)]
        liGen.append((FormLayout.Editbox(_("Name")), una.get("NOMBRE", "")))

        liGen.append((None, None))

        config = FormLayout.Fichero(_("Debug file"), "txt", True)
        liGen.append((config, una.get("DEBUG", "")))

        liGen.append((None, None))

        liGen.append((None, _("Serious errors, select the best move if:")))
        liGen.append((FormLayout.Editbox(_("Mate is less than or equal to"),
                                         tipo=int,
                                         ancho=50), una.get("MAXMATE", 0)))
        liGen.append((
            FormLayout.Editbox(_("The loss of points is greater than"),
                               tipo=int,
                               ancho=50),
            una.get("MINDIFPUNTOS", 0),
        ))
        liGen.append((None, None))
        liGen.append((
            FormLayout.Editbox(
                _("Max. loss of points per move by the <br> engine to reach a leveled evaluation"
                  ),
                tipo=int,
                ancho=50,
            ),
            una.get("ATERRIZAJE", 50),
        ))

        # Apertura
        liA = [(None, None)]

        config = FormLayout.Fichero(_("Polyglot book"), "bin", False)
        liA.append((config, una.get("BOOK", "")))

        # Medio juego
        liMJ = [(None, None)]

        # # Ajustar
        liMJ.append((FormLayout.Combobox(_("Strength"),
                                         self.listaAjustes(False)),
                     una.get("AJUSTAR", ADJUST_BETTER)))

        # Movimiento siguiente
        liMJ.append((None, _("In the next move")))

        trlistaSG = [
            _("To move a pawn"),
            _("Advance piece"),
            _("Make check"),
            _("Capture")
        ]
        listaSG = ["MOVERPEON", "AVANZARPIEZA", "JAQUE", "CAPTURAR"]
        for n, opcion in enumerate(listaSG):
            liMJ.append((FormLayout.Spinbox(trlistaSG[n], -2000, +2000,
                                            50), una.get(opcion, 0)))

        # Movimientos previstos
        liMJ.append((None, _("In the expected moves")))
        trlistaPR = [
            _("Keep the two bishops"),
            _("Advance"),
            _("Make check"),
            _("Capture")
        ]
        listaPR = ["2B", "AVANZAR", "JAQUE", "CAPTURAR"]
        for n, opcion in enumerate(listaPR):
            liMJ.append((FormLayout.Spinbox(trlistaPR[n], -2000, +2000,
                                            50), una.get(opcion + "PR", 0)))

        # Final
        liF = [(None, None)]

        # Ajustar
        liF.append((FormLayout.Combobox(_("Strength"),
                                        self.listaAjustes(False)),
                    una.get("AJUSTARFINAL", ADJUST_BETTER)))

        liF.append((FormLayout.Spinbox(_("Maximum pieces at this stage"), 0,
                                       32, 50), una.get("MAXPIEZASFINAL", 0)))
        liF.append((None, None))

        # Movimiento siguiente
        liF.append((None, _("In the next move")))
        for n, opcion in enumerate(listaSG):
            liF.append((FormLayout.Spinbox(trlistaSG[n], -2000, +2000,
                                           50), una.get(opcion + "F", 0)))

        # Movimientos previstos
        liF.append((None, _("In the expected moves")))
        for n, opcion in enumerate(listaPR):
            liF.append((FormLayout.Spinbox(trlistaPR[n], -2000, +2000,
                                           50), una.get(opcion + "PRF", 0)))

        while True:
            lista = []
            lista.append((liGen, _("Basic data"), ""))
            lista.append((liA, _("Opening"), ""))
            lista.append((liMJ, _("Middlegame"), ""))
            lista.append((liF, _("Endgame"), ""))
            resultado = FormLayout.fedit(lista,
                                         title=_("Personalities"),
                                         parent=self.owner,
                                         anchoMinimo=460,
                                         icon=icono)
            if resultado:
                accion, liResp = resultado
                liGenR, liAR, liMJR, liFR = liResp

                name = liGenR[0].strip()

                if not name:
                    QTUtil2.message_error(self.owner, _("Missing name"))
                    continue

                una = {}
                # Base
                una["NOMBRE"] = name
                una["DEBUG"] = liGenR[1]
                una["MAXMATE"] = liGenR[2]
                una["MINDIFPUNTOS"] = liGenR[3]
                una["ATERRIZAJE"] = liGenR[4]

                # Apertura
                una["BOOK"] = liAR[0]

                # Medio
                una["AJUSTAR"] = liMJR[0]

                for num, opcion in enumerate(listaSG):
                    una[opcion] = liMJR[num + 1]

                nSG = len(listaSG) + 1
                for num, opcion in enumerate(listaPR):
                    una[opcion + "PR"] = liMJR[num + nSG]

                # Final
                una["AJUSTARFINAL"] = liFR[0]
                una["MAXPIEZASFINAL"] = liFR[1]

                for num, opcion in enumerate(listaSG):
                    una[opcion + "F"] = liFR[num + 2]

                nSG = len(listaSG) + 2
                for num, opcion in enumerate(listaPR):
                    una[opcion + "PRF"] = liFR[num + nSG]

                return una

            return None
示例#7
0
def savePGN(owner, pgn):
    configuracion = VarGen.configuracion
    dicVariables = configuracion.leeVariables("SAVEPGN")

    liGen = [(None, None)]

    liHistorico = dicVariables.get("LIHISTORICO")

    config = FormLayout.Fichero(_("File to save"),
                                "pgn",
                                True,
                                liHistorico=liHistorico,
                                anchoMinimo=300)
    liGen.append((config, ""))

    #Codec
    liCodecs = [k for k in set(v for k, v in aliases.iteritems())]
    liCodecs.sort()
    liCodecs = [(k, k) for k in liCodecs]
    liCodecs.insert(0, (_("Same as file"), "file"))
    liCodecs.insert(0, ("%s: UTF-8" % _("By default"), "default"))
    config = FormLayout.Combobox(_("Write with the codec"), liCodecs)
    codec = dicVariables.get("CODEC", "default")
    liGen.append((config, codec))

    #Overwrite
    liGen.append((_("Overwrite"), dicVariables.get("OVERWRITE", False)))

    #Remove comments
    liGen.append((_("Remove comments and variations"),
                  dicVariables.get("REMCOMMENTSVAR", False)))

    # Editamos
    resultado = FormLayout.fedit(liGen,
                                 title=_("Save PGN"),
                                 parent=owner,
                                 icon=Iconos.PGN())
    if resultado is None:
        return

    accion, liResp = resultado
    fichero, codec, overwrite, remcommentsvar = liResp
    if not fichero:
        return
    if not liHistorico:
        liHistorico = []
    if fichero in liHistorico:
        del liHistorico[liHistorico.index(fichero)]
        chardet
    liHistorico.insert(0, fichero)

    dicVariables["LIHISTORICO"] = liHistorico[:20]
    dicVariables["CODEC"] = codec
    dicVariables["OVERWRITE"] = overwrite
    dicVariables["REMCOMMENTSVAR"] = remcommentsvar

    configuracion.escVariables("SAVEPGN", dicVariables)
    carpeta, name = os.path.split(fichero)
    if carpeta != configuracion.dirSalvados:
        configuracion.dirSalvados = carpeta
        configuracion.graba()

    if remcommentsvar:
        pgn = PGN.rawPGN(pgn)
    pgn = pgn.replace("\n", "\r\n")

    modo = "w" if overwrite else "a"
    if not overwrite:
        if not Util.existeFichero(fichero):
            modo = "w"
    if codec == "default":
        codec = "utf-8"
    elif codec == "file":
        codec = "utf-8"
        if Util.existeFichero(fichero):
            with open(fichero) as f:
                u = chardet.universaldetector.UniversalDetector()
                for n, x in enumerate(f):
                    u.feed(x)
                    if n == 1000:
                        break
                u.close()
                codec = u.result.get("encoding", "utf-8")

    try:
        f = codecs.open(fichero, modo, codec, 'ignore')
        if modo == "a":
            f.write("\r\n\r\n")
        f.write(pgn)
        f.close()
        QTUtil2.mensajeTemporal(owner, _("Saved"), 1.2)
    except:
        QTUtil.ponPortapapeles(pgn)
        QTUtil2.mensError(
            owner, "%s : %s\n\n%s" %
            (_("Unable to save"), fichero,
             _("It is saved in the clipboard to paste it wherever you want.")))