Ejemplo n.º 1
0
def gabarit():

    print("Génération du gabarit ...", end=' ')
    import draw_cairo_prj
    imagesurface = cairo.ImageSurface(
        cairo.FORMAT_ARGB32, 2100,
        2970)  #cairo.FORMAT_ARGB32,cairo.FORMAT_RGB24
    ctx = cairo.Context(imagesurface)

    e = 29
    ctx.scale(e, e)

    #     print dir(draw_cairo_prj)
    pos = {}
    taille = {}
    for attr in dir(draw_cairo_prj):
        if attr[:3] == 'pos':
            pos[attr[3:]] = attr
        if attr[:6] == 'taille':
            taille[attr[6:]] = attr

    print(pos, taille)

    ctx.set_line_width(5.0 / e)

    for k, p in list(pos.items()):
        if k in list(taille.keys()):
            x, y = getattr(draw_cairo_prj, p)
            w, h = getattr(draw_cairo_prj, taille[k])

            try:
                ctx.rectangle(x, y, w, h)
                ctx.stroke()
                show_text_rect(ctx,
                               k, (x, y, w, h),
                               fontsizeMinMax=(-1, 30.0 / e),
                               wrap=False,
                               couper=False)
            except:
                print("   ", k, " : ", x, y, w, h)

    imagesurface.write_to_png('gabarit_prj.png')
Ejemplo n.º 2
0
def DrawTacheRacine(ctx, tache, y):
    global yTaches

    h = calcH_tache(tache)

    #
    # Flèche verticale indiquant la durée de la tâche
    #
    if not tache.phase in ["R1", "R2", "R3", "S", "Rev"]:
        #        fleche_verticale(ctx, posZTaches[0] - wDuree/2 - ecartX/4, y,
        #                         h, wDuree, (0.9,0.8,0.8,0.5))

        ctx.set_source_rgba(0.9, 0.8, 0.8, 0.5)
        x = posZTaches[0] - wDuree - ecartX / 4
        ctx.rectangle(x, y, wDuree, h)
        ctx.fill_preserve()
        ctx.set_source_rgba(0.4, 0.4, 0.4, 1)
        ctx.set_line_width(0.0006 * COEF)
        ctx.stroke()

        ctx.set_source_rgb(0.5, 0.8, 0.8)
        ctx.select_font_face(font_family, cairo.FONT_SLANT_NORMAL,
                             cairo.FONT_WEIGHT_BOLD)

        if h > wDuree:
            show_text_rect(ctx,
                           getHoraireTxt(tache.GetDuree()), (x, y, wDuree, h),
                           orient='v',
                           b=0.1)
        else:
            show_text_rect(ctx,
                           getHoraireTxt(tache.GetDuree()), (x, y, wDuree, h),
                           orient='h',
                           b=0.1)

    #
    # Indication du délai pour revue
    #
    elif tache.phase in ["R1", "R2", "R3", "Rev"]:
        ctx.set_source_rgba(0.9, 0.8, 0.8, 0.5)
        if tache.phase == "Rev":
            x = posZTaches[0] - wDuree - ecartX / 4
            w = wDuree * 3
        else:
            x = posZTaches[0] - wDuree * 4 - ecartX / 4
            w = wDuree * 3
        ctx.rectangle(x, y, w, h)
        ctx.fill_preserve()
        ctx.set_source_rgba(0.4, 0.4, 0.4, 1)
        ctx.set_line_width(0.0006 * COEF)
        ctx.stroke()

        ctx.set_source_rgb(0.5, 0.8, 0.8)
        ctx.select_font_face(font_family, cairo.FONT_SLANT_NORMAL,
                             cairo.FONT_WEIGHT_BOLD)
        show_text_rect(ctx,
                       getHoraireTxt(tache.GetDelai(), constantes.CHAR_FLECHE),
                       (x, y, w, h),
                       orient='h',
                       fontsizeMinMax=(minFont, 0.015 * COEF),
                       b=0.1,
                       couper=False)

    #
    # Rectangles actifs et points caractéristiques : initialisation
    #
    tache.pts_caract = []

    #
    # Tracé du cadre de la tâche
    #
    if tache.phase == "Rev":
        x = posZTaches[0] + wDuree * 2
        w = posZComp[0] + tailleZComp[0] + ecartX / 4 - x
    elif not tache.phase in ["R1", "R2", "R3", "S"]:
        x = posZTaches[0]
        w = tailleZTaches[0]
    else:
        x = posZTaches[0] - wDuree / 2 - ecartX / 4
        w = posZComp[0] + tailleZComp[0] + ecartX / 4 - x

    tache.pts_caract.append((x, y))

    ctx.set_line_width(0.002 * COEF)
    rectangle_plein(ctx, x, y, w, h, BCoulTache[tache.phase],
                    ICoulTache[tache.phase], ICoulTache[tache.phase][3])

    #
    # Affichage du code de la tâche
    #
    if hasattr(tache, 'code'):
        ctx.select_font_face(font_family, cairo.FONT_SLANT_NORMAL,
                             cairo.FONT_WEIGHT_BOLD)
        ctx.set_source_rgb(0, 0, 0)

        if not tache.phase in ["R1", "R2", "R3", "S"]:
            t = tache.code
            hc = max(hTacheMini / 2, 0.01 * COEF)
        else:
            t = tache.intitule
            hc = h
        show_text_rect(ctx,
                       t, (x, y, tailleZTaches[0], hc),
                       ha='g',
                       wrap=False,
                       fontsizeMinMax=(minFont, 0.02 * COEF),
                       b=0.2)

    #
    # Affichage de l'intitulé de la tâche
    #
    if tache.intituleDansDeroul and tache.intitule != "" and not tache.phase in [
            "R1", "R2", "R3", "S"
    ]:
        ctx.select_font_face(font_family, cairo.FONT_SLANT_ITALIC,
                             cairo.FONT_WEIGHT_NORMAL)
        ctx.set_source_rgb(0, 0, 0)

        # Si on ne peut pas afficher l'intitulé dessous, on le met à coté
        if h - hc < minFont:
            width = ctx.text_extents(t)[2] * 1.2
            rect = (x + width, y, tailleZTaches[0] - width, hc)
        else:
            rect = (x, y + hc, tailleZTaches[0], h - hc)
        if rect[2] > 0:
            show_text_rect(ctx,
                           tache.GetIntit(),
                           rect,
                           ha='g',
                           fontsizeMinMax=(minFont, 0.015 * COEF))

    tache.GetDocument().zones_sens.append(
        Zone([(x, y, tailleZTaches[0], h)], obj=tache))
    #    tache.rect.append([x, y, tailleZTaches[0], h])

    #
    # Tracé des croisements "Tâches" et "Eleves"
    #
    yTaches.append([tache, y + h / 2])
    #    DrawCroisementsCompetencesTaches(ctx, tache, y + h/2)

    #
    # Icone de la tâche
    #
    bmp = tache.icone
    if bmp != None:
        d = min(hTacheMini * 3, h)
        image(ctx, x + w - d, y, d, d, bmp)

#         ctx.save()
#         tfname = tempfile.mktemp()
#         try:
#             bmp.SaveFile(tfname, wx.BITMAP_TYPE_PNG)
#             image = cairo.ImageSurface.create_from_png(tfname)
#         finally:
#             if os.path.exists(tfname):
#                 os.remove(tfname)
#
#         wi = image.get_width()*1.1
#         hi = image.get_height()*1.1
#
#         d = min(hTacheMini * 3, h)
#         s = min(d/wi, d/hi)
#         ctx.translate(x+w-d, y)
#         ctx.scale(s, s)
#         ctx.set_source_surface(image, 0, 0)
#         ctx.paint()
#         ctx.restore()

    y += h
    return y
Ejemplo n.º 3
0
def Draw(ctx,
         prj,
         mouchard=False,
         pourDossierValidation=False,
         entete=False,
         surRect=None):
    """ Dessine une fiche de projet du projet <prj>
        dans un contexte cairo <ctx>
    """

    #        print "Draw séquence"
    #    InitCurseur()

    #    tps = time.time()
    #
    # Options générales
    #
    options = ctx.get_font_options()
    options.set_antialias(cairo.ANTIALIAS_SUBPIXEL)
    options.set_hint_style(cairo.HINT_STYLE_NONE)  #cairo.HINT_STYLE_FULL)#
    options.set_hint_metrics(cairo.HINT_METRICS_OFF)  #cairo.HINT_METRICS_ON)#
    ctx.set_font_options(options)

    DefinirZones(prj, ctx)
    #     gabarit()
    #
    #    pour stocker des zones caractéristiques (à cliquer, ...)
    #
    # Zones sensibles, depuis pySéquence
    prj.zones_sens = []
    # Points caractéristiques des rectangles
    prj.pt_caract = []  # Contenu attendu : ((x,y), code)
    # Points caractéristiques des rectangles (sans code)
    prj.pts_caract = []

    #
    # Type d'enseignement
    #
    tailleTypeEns = taillePro[0] / 2
    t = prj.classe.GetLabel()
    ctx.select_font_face(font_family, cairo.FONT_SLANT_NORMAL,
                         cairo.FONT_WEIGHT_BOLD)
    ctx.set_source_rgb(0.6, 0.6, 0.9)

    h = taillePos[1] * 0.8
    show_text_rect(ctx,
                   t, (posPro[0], posPos[1], tailleTypeEns, h),
                   va='c',
                   ha='g',
                   b=0,
                   orient='h',
                   fontsizeMinMax=(-1, -1),
                   fontsizePref=-1,
                   wrap=True,
                   couper=False,
                   coulBord=(0, 0, 0))

    t = prj.classe.GetLabelComplet()
    ctx.set_source_rgb(0.3, 0.3, 0.8)
    show_text_rect(ctx,
                   t,
                   (posPro[0], posPos[1] + h, tailleTypeEns, taillePos[1] - h),
                   va='c',
                   ha='g',
                   b=0,
                   orient='h',
                   fontsizeMinMax=(-1, -1),
                   fontsizePref=-1,
                   wrap=True,
                   couper=False)

    #
    # Position dans l'année
    #
    #    posPos[0] = posEqu[0] + tailleEqu[0] + ecartX + tailleTypeEns
    posPos[0] = posNom[0] + tailleNom[0] + ecartX + tailleTypeEns
    #    taillePos[0] =  0.72414 - posPos[0] - margeX
    taillePos[0] = taillePro[0] / 2
    ctx.set_line_width(0.0015 * COEF)
    r = (posPos[0], posPos[1], taillePos[0], taillePos[1])
    rects = DrawPeriodes(
        ctx,
        r,
        prj.getRangePeriode(),
        prj.classe.referentiel.periodes,
        #                               [p.periode for p in prj.classe.referentiel.projets.values()],
        prj.classe.referentiel.projets,
        tailleTypeEns=tailleTypeEns)

    for i, re in enumerate(rects):
        prj.zones_sens.append(Zone([re], param="POS" + str(i)))
    prj.zones_sens.append(Zone([r], param="POS"))

    #
    # Etablissement
    #
    if prj.classe.etablissement != "":
        t = prj.classe.etablissement + " (" + prj.classe.ville + ")"
        ctx.select_font_face(font_family, cairo.FONT_SLANT_NORMAL,
                             cairo.FONT_WEIGHT_NORMAL)
        show_text_rect(ctx,
                       t, (posPos[0], posPos[1] + taillePos[1], taillePos[0],
                           posPro[1] - posPos[1] - taillePos[1]),
                       va='c',
                       ha='g',
                       b=0.2,
                       orient='h',
                       fontsizeMinMax=(-1, -1),
                       fontsizePref=-1,
                       wrap=True,
                       couper=False,
                       coulBord=(0, 0, 0))

    #
    # Image
    #
#    prj.support.rect = []
    prj.support.pts_caract = []
    bmp = prj.support.image
    if bmp != None:
        image(ctx, posImg[0], posImg[1], tailleImg[0], tailleImg[1], bmp)

        prj.zones_sens.append(Zone([posImg + tailleImg], obj=prj.support))
        prj.support.pts_caract.append(posImg)

    #
    #  Equipe
    #
    rectEqu = posEqu + tailleEqu
    prj.pt_caract.append(
        (curve_rect_titre(ctx, "Equipe pédagogique", rectEqu, BcoulEqu,
                          IcoulEqu, fontEqu), "Equ"))

    lstTexte = []
    g = None
    c = []
    for i, p in enumerate(prj.equipe):
        lstTexte.append(p.GetNomPrenom(disc=constantes.AFFICHER_DISC_FICHE))
        if p.referent:
            g = i
        c.append(constantes.COUL_DISCIPLINES[p.discipline])
    lstCodes = [" \u25CF"] * len(lstTexte)

    if len(lstTexte) > 0:
        r = liste_code_texte(
            ctx,
            lstCodes,
            lstTexte,
            (posEqu[0], posEqu[1], tailleEqu[0], tailleEqu[1] + 0.0001 * COEF),
            0.1 * tailleEqu[1] + 0.0001 * COEF,
            0.1,
            gras=g,
            lstCoul=c,
            va='c')

    for i, p in enumerate(prj.equipe):
        prj.zones_sens.append(Zone([r[i]], obj=p))
    prj.zones_sens.append(Zone([rectEqu], param="EQU"))

    #
    #  Problématique
    #
    rectPro = posPro + taillePro
    pt = curve_rect_titre(ctx, "Problématique", rectPro, BcoulPro, IcoulPro,
                          fontPro)
    prj.pt_caract.append((pt, "Pb"))
    ctx.select_font_face(font_family, cairo.FONT_SLANT_NORMAL,
                         cairo.FONT_WEIGHT_NORMAL)
    show_text_rect(ctx,
                   constantes.ellipsizer(prj.problematique,
                                         constantes.LONG_MAX_PROBLEMATIQUE),
                   rectPro,
                   ha='g',
                   b=0.5,
                   fontsizeMinMax=(-1, 0.016 * COEF))
    prj.zones_sens.append(Zone([rectPro], param="PB"))

    #    print "     6 ", time.time() - tps

    #
    #  Projet
    #
    rectNom = posNom + tailleNom
    prj.pts_caract.append(
        curve_rect_titre(ctx, prj.GetCode(), rectNom, BcoulNom, IcoulNom,
                         fontNom))
    ctx.select_font_face(font_family, cairo.FONT_SLANT_NORMAL,
                         cairo.FONT_WEIGHT_NORMAL)
    show_text_rect(ctx,
                   prj.GetNom(),
                   rectNom,
                   ha='c',
                   b=0.2,
                   fontsizeMinMax=(-1, 0.016 * COEF))

    prj.zones_sens.append(Zone([rectNom], obj=prj))
    prj.pts_caract.append(posNom)

    #
    #  Support
    #
    prj.support.pt_caract = []
    rectSup = posSup + tailleSup
    pt = curve_rect_titre(ctx, prj.support.GetCode(), rectSup, BcoulSup,
                          IcoulSup, fontSup)
    prj.support.pt_caract.append((pt, "Sup"))
    ctx.select_font_face(font_family, cairo.FONT_SLANT_NORMAL,
                         cairo.FONT_WEIGHT_NORMAL)
    show_text_rect(ctx,
                   prj.support.GetNom(),
                   rectSup,
                   ha='c',
                   b=0.2,
                   fontsizeMinMax=(-1, 0.016 * COEF))

    prj.zones_sens.append(Zone([rectSup], obj=prj.support))
    #     prj.support.pts_caract.append(posSup)

    #
    #  Tableau des compétenecs
    #
    if not entete:
        competences = regrouperLst(prj.GetProjetRef(),
                                   prj.GetCompetencesUtil())
        #         print "competences", competences
        #         prj.pt_caract_comp = []

        if competences != []:

            ctx.set_line_width(0.001 * COEF)
            wc = tailleZComp[0] / len(competences)
            _x = posZComp[0]
            _y0, _y1 = posZElevesH[1], posZDeroul[1] + tailleZDeroul[1]

            for s in competences:
                #            s.rect=((_x, _y, wc, posZTaches[1] - posZComp[1]),)
                ligne(ctx, _x, _y0, _x, _y1, (0, 0, 0))
                ctx.set_source_rgba(0.5, 0.5, 0.5, 0.2)
                ctx.rectangle(_x, _y0, wc, _y1 - _y0)
                ctx.fill()
                _x += wc

            ligne(ctx, _x, _y0, _x, _y1, (0, 0, 0))

            ctx.select_font_face(font_family, cairo.FONT_SLANT_NORMAL,
                                 cairo.FONT_WEIGHT_NORMAL)
            ctx.set_source_rgb(0, 0, 0)
            ctx.set_line_width(0.001 * COEF)
            p = tableauV(ctx, [c[1:] for c in competences],
                         posZComp[0],
                         posZComp[1],
                         tailleZComp[0],
                         tailleZComp[1],
                         0,
                         nlignes=0,
                         va='c',
                         ha='g',
                         orient='v',
                         coul=BCoulCompS)
            for pt in getPts(p):
                prj.pt_caract.append((pt, "Cmp"))

#    print "compétences", time.time() - tps

#
#  Tableau des élèves
#
#    tps = time.time()
    if not entete:
        ctx.select_font_face(font_family, cairo.FONT_SLANT_NORMAL,
                             cairo.FONT_WEIGHT_NORMAL)
        ctx.set_source_rgb(0, 0, 0)
        ctx.set_line_width(0.001 * COEF)
        l = []
        for i, e in enumerate(prj.eleves):
            e.pts_caract = []
            if pourDossierValidation:

                l.append(prj.GetReferentiel().labels["ELEVES"][2].Sing_() +
                         " " + str(i + 1))
            else:
                l.append(e.GetNomPrenom())

        for i, e in enumerate(prj.groupes):
            e.pts_caract = []
            l.append(e.GetNomPrenom())

        #
        # Graduation
        #
        y = posZElevesH[1] + tailleZElevesH[1]
        w = tailleZElevesH[0]
        h = hEleves / 2
        for t, ha in [("0%", 'g'), ("50%", 'c'), ("100%", 'd')]:
            show_text_rect(ctx,
                           t, (posZElevesH[0], y, w, h),
                           ha=ha,
                           b=0.1,
                           fontsizeMinMax=(-1, 0.016 * COEF))

#         prj.pt_caract_eleve = []
        if len(l) > 0:

            #
            # Barres d'évaluabilité
            #
            if prj.GetProjetRef() is None:
                parties = {}
            else:
                parties = prj.GetProjetRef().parties
            for i, e in enumerate(prj.eleves + prj.groupes):
                ev = e.GetEvaluabilite(compil=True)[1]
                y = posZElevesH[1] + i * hEleves
                #            wr = tailleZElevesH[0]*r
                #            ws = tailleZElevesH[0]*s
                hb = hEleves / (len(parties) + 1)
                #            y = posZElevesH[1] + (2*i*hb)+hb/2

                for j, part in enumerate(parties.keys()):

                    barreH(ctx, posZElevesH[0], y + (j + 1) * hb,
                           tailleZElevesH[0], ev[part][0], ev[part][1], hb,
                           (1, 0, 0, 0.7), (0, 1, 0, 0.7), getCoulComp(part))

            rec = tableauH(ctx,
                           l,
                           posZElevesH[0],
                           posZElevesH[1],
                           tailleZElevesH[0],
                           0,
                           tailleZElevesH[1],
                           va='c',
                           ha='d',
                           orient='h',
                           coul=CoulAltern)

            for pt in getPts(rec):
                prj.pt_caract.append((pt, "Elv"))

            #
            # Lignes horizontales
            #
            for i, e in enumerate(prj.eleves + prj.groupes):
                prj.zones_sens.append(Zone([rec[i]], obj=e))
                ctx.set_line_width(0.003 * COEF)

                ligne(ctx, posZElevesH[0] + tailleZElevesH[0], yEleves[i],
                      posZComp[0] + tailleZComp[0], yEleves[i],
                      CoulAltern[i][0][:-1])

            #
            # Lignes verticales
            #
            for i, e in enumerate(prj.eleves + prj.groupes):
                ctx.set_line_width(0.003 * COEF)
                ligne(
                    ctx, xEleves[i], yEleves[i], xEleves[i], posZTaches[1] +
                    tailleZTaches[1] + (i % 2) * (ecartY / 2) + ecartY / 2,
                    CoulAltern[i][0][:-1])

                DrawCroisementsElevesCompetences(ctx, e, yEleves[i])

            #
            # Ombres des lignes verticales
            #
            e = 0.003 * COEF
            ctx.set_line_width(0.003 * COEF)
            for i in range(len(prj.eleves + prj.groupes)):
                y = posZTaches[1] + tailleZTaches[1] + (i % 2) * (
                    ecartY / 2) + ecartY / 2
                ctx.set_source_rgb(1, 1, 1)
                ctx.move_to(xEleves[i] + e, yEleves[i] + e)
                ctx.line_to(xEleves[i] + e, y)
                ctx.move_to(xEleves[i] - e, yEleves[i] + e)
                ctx.line_to(xEleves[i] - e, y)
            ctx.stroke()

#    print "élèves", time.time() - tps

#
#  Tâches
#
    if not entete:
        #    tps = time.time()
        curve_rect_titre(
            ctx, "Tâches à réaliser",
            (posZDeroul[0], posZDeroul[1], tailleZDeroul[0], tailleZDeroul[1]),
            BcoulZDeroul, IcoulZDeroul, fontZDeroul)

        y = posZTaches[1] - ecartTacheY

        # Les positions en Y haut et bas des phases
        yh_phase = {
            'Sup': [[], []],
            'Ana': [[], []],
            'Con': [[], []],
            'DCo': [[], []],
            'Rea': [[], []],
            'Val': [[], []],
            'XXX': [[], []]
        }

        phase = None
        y1 = y2 = y3 = 0  # juste pour éviter une erreur en cas d'echec d'ouverture.
        for t in prj.taches:
            if t.phase == "R1":
                y1 = y
            elif t.phase == "R2":
                y2 = y
            elif t.phase == "R3":
                y3 = y

            if phase != t.phase:
                y += ecartTacheY

            if t.phase != '':
                yb = DrawTacheRacine(ctx, t, y)
                if t.phase in ["Ana", "Con", "DCo", "Rea", "Val", 'XXX']:
                    yh_phase[t.phase][0].append(y)
                    yh_phase[t.phase][1].append(yb)
                y = yb

            if y3 == 0 and t == prj.taches[-1]:
                y3 = y

            phase = t.phase
    #    print "    ", time.time() - tps
    #
    # Les lignes horizontales en face des taches
    # et les croisements Tâche/Competences
    #
        x = posZTaches[0] + tailleZTaches[0]
        for t, y in yTaches:
            if not t.phase in ["R1", "R2", "R3", "S", "Rev"]:
                DrawLigne(ctx, x, y)
            if (t.phase in ["R1", "R2", "R3", "S"]
                    and t.DiffereSuivantEleve()) or t.estPredeterminee():
                dy = hRevue
                y = y - ((len(prj.eleves + prj.groupes) - 1) * dy) / 2
                #            print "phase = ", t.phase
                h = 0.006 * COEF
                for eleve in prj.eleves + prj.groupes:
                    DrawCroisementsCompetencesRevue(ctx, t, eleve, y, h)
                    y += dy
            else:
                DrawCroisementsCompetencesTaches(ctx, t, y)

        # Nom des phases
        for phase, yh in list(yh_phase.items()):
            #        print phase, yh
            if len(yh[0]) > 0:
                yh[0] = min(yh[0])
                yh[1] = max(yh[1])
                ctx.set_source_rgb(BCoulTache[phase][0], BCoulTache[phase][1],
                                   BCoulTache[phase][2])
                ctx.select_font_face(font_family, cairo.FONT_SLANT_ITALIC,
                                     cairo.FONT_WEIGHT_NORMAL)
                if wPhases > yh[1] - yh[0]:
                    orient = "h"
                else:
                    orient = "v"

                if prj.GetProjetRef() is None:
                    n = ""
                else:
                    try:
                        n = prj.GetProjetRef().phases[phase][1]
                    except KeyError:
                        n = ""
                show_text_rect(ctx,
                               n, (posZDeroul[0] + ecartX / 6, yh[0], wPhases,
                                   yh[1] - yh[0]),
                               ha='c',
                               orient=orient,
                               b=0.1,
                               le=0.7,
                               couper=False)

    #            show_text_rect(ctx, constantes.NOM_PHASE_TACHE[prj.GetTypeEnseignement(True)][phase],
    #                           (posZDeroul[0] + ecartX/6, yh[0],
    #                            wPhases, yh[1]-yh[0]),
    #                           ha = 'c', orient = orient, b = 0,
    #                           couper = False)

    #    print "taches", time.time() - tps

    #
    # Durées élève entre revues (uniquement en période "terminale")
    #
    if not entete and prj.GetProjetRef() is not None:
        #    tps = time.time()
        posEpreuve = prj.GetProjetRef().getPeriodeEval()
        if posEpreuve is not None and prj.position == posEpreuve:
            y0 = posZTaches[1]
            y4 = y1 + len(prj.eleves + prj.groupes) * hRevue + 2 * ecartTacheY
            #        y4 = y1+2*ecartTacheY + 0.015
            #        y5 = y2+2*ecartTacheY + 0.015
            y5 = y2 + len(prj.eleves + prj.groupes) * hRevue + 2 * ecartTacheY
            #            print y0, y1, y2, y3, y4, y5
            md1 = md2 = md3 = 0
            for i, e in enumerate(prj.eleves + prj.groupes):
                md1 = max(e.GetDuree(phase="R1"), md1)
                md2 = max(e.GetDuree(phase="R2"), md2)
                md3 = max(e.GetDuree(phase="R3"), md3)

            for i, e in enumerate(prj.eleves + prj.groupes):
                d1 = e.GetDuree(phase="R1")
                d2 = e.GetDuree(phase="R2")
                d3 = e.GetDuree(phase="R3")
                ctx.set_source_rgba(*CoulAltern[i][0])
                ctx.set_line_width(0.005 * COEF)
                if md1 > 0:
                    ctx.move_to(xEleves[i], y0)
                    ctx.line_to(xEleves[i], y0 + (y1 - y0) * d1 / md1)
                    ctx.stroke()
                if md2 > 0:
                    ctx.move_to(xEleves[i], y4)
                    ctx.line_to(xEleves[i], y4 + (y2 - y4) * d2 / md2)
                    ctx.stroke()
                if md3 > 0:
                    ctx.move_to(xEleves[i], y5)
                    ctx.line_to(xEleves[i], y5 + (y3 - y5) * d3 / md3)
                    ctx.stroke()

#    print "durées", time.time() - tps

#
# Croisements élèves/tâches
#
    if not entete:
        #    tps = time.time()
        for t, y in yTaches:
            DrawCroisementsElevesTaches(ctx, t, y)

    #    print "CroisementsElevesTaches", time.time() - tps

    #
    # Durées du projet (durées élèves)
    #
    #    tps = time.time()
        for i, e in enumerate(prj.eleves + prj.groupes):
            #        x = posZElevesV[0]+i*tailleZElevesV[0]/len(prj.eleves)-wEleves/2
            x = xEleves[i] - wEleves * 3 / 4
            y = posZTaches[1] + tailleZTaches[1] + (i % 2) * (ecartY /
                                                              2) + ecartY / 2
            d = e.GetDuree()
            if prj.GetProjetRef() is None:
                taux = 100
            else:
                dureeRef = prj.GetProjetRef().duree
                taux = abs((d - dureeRef) / dureeRef) * 100
    #        print "   duree", d, "/", dureeRef
    #        print "   taux", taux
            if taux < constantes.DELTA_DUREE:
                ctx.set_source_rgb(0.1, 1, 0.1)
            elif taux < constantes.DELTA_DUREE2:
                ctx.set_source_rgb(1, 0.6, 0.1)
            else:
                ctx.set_source_rgb(1, 0.1, 0.1)
            show_text_rect(ctx,
                           getHoraireTxt(d),
                           (x, y, wEleves * 3 / 2, ecartY / 2),
                           ha='c',
                           b=0)

#    print "dureeProjet", time.time() - tps
#
# Informations
#
    if not entete:
        info(ctx, margeX, margeY)
Ejemplo n.º 4
0
def DrawSequenceProjet(ctx, prg, lienDoc, y):
    global yTaches
    doc = lienDoc.GetDoc()
    h = calcH_doc(doc)

    #
    # Flèche verticale indiquant la durée de la séquence/Projet
    #
    ctx.set_source_rgba(0.9, 0.8, 0.8, 0.5)
    x = posZTaches[0] - wDuree - ecartX / 4
    ctx.rectangle(x, y, wDuree, h)
    ctx.fill_preserve()
    ctx.set_source_rgba(0.4, 0.4, 0.4, 1)
    ctx.set_line_width(0.0006 * COEF)
    ctx.stroke()

    ctx.set_source_rgb(0.5, 0.8, 0.8)
    ctx.select_font_face(font_family, cairo.FONT_SLANT_NORMAL,
                         cairo.FONT_WEIGHT_BOLD)

    if h > wDuree:
        show_text_rect(ctx,
                       getHoraireTxt(doc.GetDuree()), (x, y, wDuree, h),
                       orient='v',
                       b=0.1)
    else:
        show_text_rect(ctx,
                       getHoraireTxt(doc.GetDuree()), (x, y, wDuree, h),
                       orient='h',
                       b=0.1)

    #
    # Tracé du cadre de la tâche
    #
    x = posZTaches[0]
    w = tailleZTaches[0]

    #    lienSeq.pts_caract.append((x, y))

    ctx.set_line_width(0.002 * COEF)
    #    print "BcoulPos", BcoulPos
    rectangle_plein(ctx, x, y, w, h, BcoulPos[doc.position],
                    IcoulPos[doc.position], IcoulPos[doc.position][3])

    #
    # Icone du type de document
    #
    ctx.save()
    if doc.nom_obj == u"Séquence":
        bmp = images.Icone_sequence.GetBitmap()
    else:
        bmp = images.Icone_projet.GetBitmap()

    image = wx.lib.wxcairo.ImageSurfaceFromBitmap(bmp)
    ctx.translate(x + ecartX / 5, y + ecartY / 5)
    ctx.scale(hTacheMini / 30, hTacheMini / 30)
    ctx.set_source_surface(image, 0, 0)
    ctx.paint()
    ctx.restore()

    #
    # Affichage du code de la tâche
    #
    #    if hasattr(doc, 'code'):
    #        ctx.select_font_face (font_family, cairo.FONT_SLANT_NORMAL,
    #                              cairo.FONT_WEIGHT_BOLD)
    #        ctx.set_source_rgb (0,0,0)
    #
    #        if not tache.phase in ["R1", "R2", "R3", "S"]:
    #            t = tache.code
    #            hc = max(hTacheMini/2, 0.01 * COEF)
    #        else:
    #            t = tache.intitule
    #            hc = h
    #        show_text_rect(ctx, t, (x, y, tailleZTaches[0], hc), ha = 'g',
    #                       wrap = False, fontsizeMinMax = (minFont, 0.02 * COEF), b = 0.2)
    hc = h

    #
    # Affichage de l'intitulé de la tâche
    #
    ctx.select_font_face(font_family, cairo.FONT_SLANT_ITALIC,
                         cairo.FONT_WEIGHT_NORMAL)
    ctx.set_source_rgb(0, 0, 0)

    # Si on ne peut pas afficher l'intitulé dessous, on le met à coté
    rect = (x, y, tailleZTaches[0], h)
    if rect[2] > 0:
        show_text_rect(ctx,
                       doc.intitule,
                       rect,
                       ha='g',
                       fontsizeMinMax=(minFont, 0.015 * COEF))

#    lienSeq.rect.append([x, y, tailleZTaches[0], h])
    prg.zones_sens.append(Zone([rect], obj=lienDoc))

    #
    # Tracé des croisements "Tâches" et "Eleves"
    #
    yTaches.append([doc, y + h / 2])

    #    DrawCroisementsCompetencesTaches(ctx, tache, y + h/2)

    y += h
    return y
Ejemplo n.º 5
0
def Draw(ctx, prg, mouchard=False):
    """ Dessine une fiche de progression <prg>
        dans un contexte cairo <ctx>
    """

    #        print "Draw progression"
    #    InitCurseur()

    #    tps = time.time()
    #
    # Options générales
    #
    options = ctx.get_font_options()
    options.set_antialias(cairo.ANTIALIAS_SUBPIXEL)
    options.set_hint_style(cairo.HINT_STYLE_NONE)  #cairo.HINT_STYLE_FULL)#
    options.set_hint_metrics(cairo.HINT_METRICS_OFF)  #cairo.HINT_METRICS_ON)#
    ctx.set_font_options(options)

    DefinirZones(prg, ctx)
    #    DefinirCouleurs(prg.GetNbrPeriodes())
    #    print "DefinirCouleurs", IcoulPos

    #
    #    pour stocker des zones caractéristiques (à cliquer, ...)
    #
    prg.zones_sens = []
    prg.pt_caract = []
    #    prg.rect = []
    #    prg.rectComp = {}

    #
    # variables locales
    #
    ref = prg.classe.referentiel
    classe = prg.classe

    #
    # Type d'enseignement
    #
    tailleTypeEns = taillePro[0] / 2
    t = ref.Enseignement[0]
    ctx.select_font_face(font_family, cairo.FONT_SLANT_NORMAL,
                         cairo.FONT_WEIGHT_BOLD)
    ctx.set_source_rgb(0.6, 0.6, 0.9)

    h = taillePos[1] * 0.8
    show_text_rect(ctx,
                   t, (posPro[0], posPos[1], tailleTypeEns, h),
                   va='c',
                   ha='g',
                   b=0,
                   orient='h',
                   fontsizeMinMax=(-1, -1),
                   fontsizePref=-1,
                   wrap=True,
                   couper=False,
                   coulBord=(0, 0, 0))

    t = ref.Enseignement[1]
    ctx.set_source_rgb(0.3, 0.3, 0.8)
    show_text_rect(ctx,
                   t,
                   (posPro[0], posPos[1] + h, tailleTypeEns, taillePos[1] - h),
                   va='c',
                   ha='g',
                   b=0,
                   orient='h',
                   fontsizeMinMax=(-1, -1),
                   fontsizePref=-1,
                   wrap=True,
                   couper=False)

    #
    # Positions dans l'année
    #
    posPos[0] = posNom[0] + tailleNom[0] + ecartX + tailleTypeEns

    taillePos[0] = taillePro[0] / 2
    ctx.set_line_width(0.0015 * COEF)
    r = (posPos[0], posPos[1], taillePos[0], taillePos[1])
    rects = DrawPeriodes(ctx,
                         r,
                         prg.GetPositions(),
                         ref.periodes,
                         tailleTypeEns=tailleTypeEns)
    #    prg.rect.append(posPos+taillePos)

    for i, re in enumerate(rects):
        prg.zones_sens.append(Zone([re], param="POS" + str(i)))
    prg.zones_sens.append(Zone([r], param="POS"))

    #
    # Etablissement
    #
    if classe.etablissement != u"":
        t = classe.etablissement + u" (" + classe.ville + u")"
        ctx.select_font_face(font_family, cairo.FONT_SLANT_NORMAL,
                             cairo.FONT_WEIGHT_NORMAL)
        show_text_rect(ctx,
                       t, (posPos[0], posPos[1] + taillePos[1], taillePos[0],
                           posPro[1] - posPos[1] - taillePos[1]),
                       va='c',
                       ha='g',
                       b=0.2,
                       orient='h',
                       fontsizeMinMax=(-1, -1),
                       fontsizePref=-1,
                       wrap=True,
                       couper=False,
                       coulBord=(0, 0, 0))

    #
    # Image
    #
    bmp = prg.image
    if bmp != None:
        ctx.save()
        tfname = tempfile.mktemp()
        try:
            bmp.SaveFile(tfname, wx.BITMAP_TYPE_PNG)
            image = cairo.ImageSurface.create_from_png(tfname)
        finally:
            if os.path.exists(tfname):
                os.remove(tfname)

        w = image.get_width() * 1.1
        h = image.get_height() * 1.1

        s = min(tailleImg[0] / w, tailleImg[1] / h)
        dx = (tailleImg[0] - s * image.get_width()) / 2
        dy = (tailleImg[1] - s * image.get_height()) / 2
        ctx.translate(posImg[0] + dx, posImg[1] + dy)
        ctx.scale(s, s)
        ctx.set_source_surface(image, 0, 0)
        ctx.paint()
        ctx.restore()

    #
    #  Equipe
    #
    rectEqu = posEqu + tailleEqu
    prg.pt_caract.append(
        curve_rect_titre(ctx, u"Equipe pédagogique", rectEqu, BcoulEqu,
                         IcoulEqu, fontEqu))

    lstTexte = []
    g = None
    c = []
    for i, p in enumerate(prg.equipe):
        lstTexte.append(p.GetNomPrenom(disc=constantes.AFFICHER_DISC_FICHE))
        if p.referent:
            g = i
        c.append(constantes.COUL_DISCIPLINES[p.discipline])
    lstCodes = [u" \u25CF"] * len(lstTexte)

    if len(lstTexte) > 0:
        r = liste_code_texte(ctx,
                             lstCodes,
                             lstTexte,
                             posEqu[0],
                             posEqu[1],
                             tailleEqu[0],
                             tailleEqu[1] + 0.0001 * COEF,
                             0.1 * tailleEqu[1] + 0.0001 * COEF,
                             0.1,
                             gras=g,
                             lstCoul=c,
                             va='c')

    for i, p in enumerate(prg.equipe):
        prg.zones_sens.append(Zone([r[i]], obj=p))
    prg.zones_sens.append(Zone([rectEqu], param="EQU"))
    #        p.rect = [r[i]]
    #        prj.pts_caract.append(getPts(r))

    #
    #  Calendrier
    #
    #    prg.pt_caract.append(posPro)
    rectPro = posPro + taillePro
    prg.pt_caract.append(
        curve_rect_titre(ctx, u"Calendrier", rectPro, BcoulPro, IcoulPro,
                         fontPro))
    ctx.select_font_face(font_family, cairo.FONT_SLANT_NORMAL,
                         cairo.FONT_WEIGHT_NORMAL)
    show_text_rect(ctx,
                   constantes.ellipsizer(u"",
                                         constantes.LONG_MAX_PROBLEMATIQUE),
                   rectPro,
                   ha='g',
                   b=0.5,
                   fontsizeMinMax=(-1, 0.016 * COEF))
    DrawCalendrier(ctx, rectPro, prg.calendrier)
    #    prg.rect.append(rectPro)
    prg.zones_sens.append(Zone([rectPro], param="CAL"))

    #
    #  Années
    #
    #    prg.pt_caract = []
    #    prg.pts_caract = []
    rectNom = posNom + tailleNom
    prg.pt_caract.append(
        curve_rect_titre(ctx, u"Progression pédagogique", rectNom, BcoulNom,
                         IcoulNom, fontNom))
    ctx.select_font_face(font_family, cairo.FONT_SLANT_NORMAL,
                         cairo.FONT_WEIGHT_NORMAL)
    show_text_rect(ctx,
                   u"Années scolaires " + prg.GetAnnees(),
                   rectNom,
                   ha='c',
                   b=0.2,
                   fontsizeMinMax=(-1, 0.016 * COEF))

    prg.zones_sens.append(Zone([rectNom], param="ANN"))
    #    prg.pt_caract.append(posNom)

    #
    #  Tableau des compétenecs
    #
    competences = ref._listesCompetences_simple["S"]

    ctx.set_line_width(0.001 * COEF)
    _x = _x0 = posZComp[0]
    _y0, _y1 = posZElevesH[1] - ecartY / 2, posZDeroul[1] + tailleZDeroul[1]

    lcomp = []

    #    print "competences", competences
    for i, g1 in enumerate(competences):
        k1, h1, l1 = g1
        dx = wColComp / 3
        if len(l1) == 0:
            l1 = [[k1, h1]]
            dx = 0

        coul = list(ICoulComp[i][:3]) + [0.2]
        for k2, h2 in l1:
            #
            # Lignes verticales et rectangles clairs
            #
            rect = (_x, _y0, wColComp, _y1 - _y0)
            ctx.set_source_rgb(0, 0, 0)
            ctx.move_to(_x, _y0)
            ctx.line_to(_x, _y1)
            ctx.stroke()
            ctx.set_source_rgba(*coul)
            ctx.rectangle(*rect[:4])
            ctx.fill()

            #            prg.zones_sens.append(Zone([rect], param = k2))
            #            prg.rectComp[k2] = [rect]
            #            prg.pts_caract.append((_x,_y0))

            _x += wColComp

        # Dernière ligne
        ctx.set_source_rgb(0, 0, 0)
        ctx.move_to(_x, _y0)
        ctx.line_to(_x, _y1)
        ctx.stroke()

        ctx.select_font_face(font_family, cairo.FONT_SLANT_NORMAL,
                             cairo.FONT_WEIGHT_NORMAL)
        ctx.set_source_rgb(0, 0, 0)
        ctx.set_line_width(0.001 * COEF)

        #        # Titre famille de compétences
        #        ht = tailleZComp[1] / 4
        #        show_text_rect(ctx, k1, (_x0, posZComp[1], _x-_x0, ht), va = 'c', ha = 'c', b = 0.3, orient = 'h')

        l = [k2[0] for k2 in l1]
        rects = tableauV(ctx,
                         l,
                         _x0,
                         posZComp[1],
                         _x - _x0,
                         tailleZComp[1],
                         0,
                         nlignes=0,
                         va='c',
                         ha='g',
                         orient='v',
                         coul=ICoulComp[i],
                         b=0.3)

        for i, r in enumerate(rects):
            prg.zones_sens.append(Zone([r], param="CMP" + l[i]))

        lcomp.extend(l)

        #        prg.pt_caract_comp.extend(getPts(p))

        _x += dx
        _x0 = _x

    #
    #  Tableau des CI/Thèmes ?
    #
    if len(ref.CentresInterets) > 0:
        rectCI = (posZElevesH[0], posZElevesH[1], tailleZElevesH[0],
                  tailleZElevesH[1])
        curve_rect_titre(ctx, ref.nomCI, rectCI, BcoulCI, IcoulCI, fontCI)

        ctx.select_font_face(font_family, cairo.FONT_SLANT_NORMAL,
                             cairo.FONT_WEIGHT_NORMAL)
        ctx.set_source_rgb(0, 0, 0)
        ctx.set_line_width(0.0005 * COEF)
        l = []
        for i, e in enumerate(ref.CentresInterets):
            #        e.pts_caract = []
            l.append(e)

        #
        # Croisements divers
        #
        x, y = posZElevesH[0] + ecartX / 2, posZElevesH[1] + ecartY / 2
        w, h = tailleZElevesH[0] - ecartX, tailleZElevesH[1] - ecartY

        #    prg.pt_caract_eleve = []
        if len(l) > 0:
            rec = tableauH(ctx,
                           l,
                           x,
                           y,
                           w,
                           0,
                           h,
                           va='c',
                           ha='d',
                           orient='h',
                           coul=CoulAltern,
                           tailleFixe=True)

            #        prj.pt_caract_eleve = getPts(rec)

            #
            # Lignes horizontales
            #
            for i, e in enumerate(ref.CentresInterets):
                prg.zones_sens.append(Zone([rec[i]], param="CI" + str(i)))

                Ic = CoulAltern[i][0]

                ctx.set_source_rgb(Ic[0], Ic[1], Ic[2])
                ctx.set_line_width(0.003 * COEF)
                ctx.move_to(posZElevesH[0] + tailleZElevesH[0] - ecartX / 2,
                            yEleves[i] + ecartY / 2)
                ctx.line_to(posZComp[0] + tailleZComp[0],
                            yEleves[i] + ecartY / 2)
                ctx.stroke()

            #
            # Lignes verticales
            #
            for i, e in enumerate(ref.CentresInterets):
                Ic = CoulAltern[i][0]

                ctx.set_source_rgb(Ic[0], Ic[1], Ic[2])
                ctx.set_line_width(0.003 * COEF)
                ctx.move_to(xEleves[i], yEleves[i] + ecartY / 2)
                ctx.line_to(
                    xEleves[i], posZTaches[1] + tailleZTaches[1] + (i % 2) *
                    (ecartY / 2) + ecartY / 2)
                ctx.stroke()
    #            DrawCroisementsElevesCompetences(ctx, prg, e, yEleves[i])

    #
    # Ombres des lignes verticales
    #
            e = 0.003 * COEF
            ctx.set_line_width(0.003 * COEF)
            for i in range(len(ref.CentresInterets)):
                y = posZTaches[1] + tailleZTaches[1] + (i % 2) * (
                    ecartY / 2) + ecartY / 2
                ctx.set_source_rgb(1, 1, 1)
                ctx.move_to(xEleves[i] + e, yEleves[i] + e + ecartY / 2)
                ctx.line_to(xEleves[i] + e, y)
                ctx.move_to(xEleves[i] - e, yEleves[i] + e + ecartY / 2)
                ctx.line_to(xEleves[i] - e, y)
            ctx.stroke()

    #
    #  Séquences
    #
    curve_rect_titre(
        ctx, u"Séquences",
        (posZDeroul[0], posZDeroul[1], tailleZDeroul[0], tailleZDeroul[1]),
        BcoulZDeroul, IcoulZDeroul, fontZDeroul)

    y = posZTaches[1] - ecartTacheY

    # Les positions en Y haut et bas des périodes
    yh_phase = {c: [[], []] for c in range(prg.GetNbrPeriodes())}

    position = None
    for t in prg.sequences_projets:
        pos = t.GetPosition()

        if position != pos:
            y += ecartTacheY

        yb = DrawSequenceProjet(ctx, prg, t, y)
        yh_phase[pos][0].append(y)
        yh_phase[pos][1].append(yb)
        y = yb

        position = pos

    #
    # Les lignes horizontales en face des sequences
    # et les croisements Séquences/Competences
    #
    x = posZTaches[0] + tailleZTaches[0]
    for doc, y in yTaches:
        DrawLigne(ctx, x, y)
        DrawCroisementsCompetencesTaches(ctx, prg, doc, lcomp, y)
        if hasattr(doc, 'CI'):
            DrawCroisementsCISeq(ctx, prg, doc, y)

    # Nom des périodes
#    print "yh_phase", yh_phase

    fontsize = wPhases

    for i, (phase, yh) in enumerate(yh_phase.items()):
        if len(yh[0]) > 0:

            _y = min(yh[0])
            yh[1] = max(yh[1])
            y = _y
            h = yh[1] - _y

            c = BcoulPos[phase]
            ctx.set_source_rgb(c[0], c[1], c[2])
            ctx.select_font_face(font_family, cairo.FONT_SLANT_ITALIC,
                                 cairo.FONT_WEIGHT_NORMAL)

            show_text_rect(ctx,
                           str(phase + 1),
                           (posZDeroul[0] + ecartX / 6, y, wPhases, h),
                           fontsizeMinMax=(fontsize, fontsize),
                           ha='c',
                           orient="h",
                           b=0.1,
                           le=0.7,
                           couper=False)

    #
    # Informations
    #
    info(ctx, margeX, margeY)