Page 1 sur 1

[Resolu] Diagramme type Gantt

Publié : mar. 22/sept./2015 9:57
par blendman
Salut

J'essaie de réaliser un petit utilitaire, permettant de visualiser les projets sur lesquels j'ai travaillé, afin d'obtenir un diagramme.
Mais je bloque sur un petit soucis, les données sont décalées (par rapport aux mois).

Code : Tout sélectionner

;{ INFOS
; Nom : 
; by blendman
; 5.31 
; date 

;}

;{ Changes

; [21/09/2015] (0.10) (1)
; - UI, window


;}

;{ Enumeration, constantes 
#Window_main = 0
#SoftwareName = "Gantt Diagram"
#SoftwareVersion = "0.10"

Enumeration ; gadget
  #G_btn
  #G_canvas
EndEnumeration

Enumeration ; menu
  #menu_open
EndEnumeration


;}

Structure sDate
  
  X_start.i
  X_end.i
  
  X_day.i
  X_Year.i
  X_Month.i
  
  StartDate.i
 
  
EndStructure

Structure sProject
  
  Name$
  List NewDate.sDate()
  Color.i
    
EndStructure


Global NewList Project.sProject()


Procedure AddNewProject(name$, color=-1)
  
  AddElement(Project())
  With Project()
    \Name$ = Name$
    If color = -1
      \Color=RGBA(Random(255),Random(255),Random(255),255)
    Else
      \Color = color
    EndIf
  EndWith
  
EndProcedure

Procedure AddProjectData(name$,startyear,startmonth,startday,endyear,endmonth,endday)
  
  ForEach Project()
    If Project()\Name$ = name$
      Break
    EndIf
  Next
  
  AddElement(Project()\NewDate())
  
  With Project()\NewDate()
    year = Date(startyear,startmonth,startday,0,0,0)/(60*60*24)
    ;year1 = Date(startyear,01,01,0,0,0)/(60*60*24)
    ;\StartDate  = Date(startyear,startmonth,startday,0,0,0)/(60*60*24) - year1
    
    \X_start  = Date(startyear,startmonth,startday,0,0,0)/(60*60*24) - year
    \X_end    = (Date(endyear,endmonth,endday,0,0,0)/(60*60*24) - year) + 1 
    
    \X_day = startday
    \X_Month = startmonth
    \X_Year = startyear
    
    Debug Str(\X_start)+"/"+Str(\X_end)
    
  EndWith
  
  ; FormatDate("%dd/%mm/%yyyy", D_start)
EndProcedure


Procedure UpdateCanvas()
  
  If StartDrawing(CanvasOutput(#g_canvas))
    
    Box(0,0,OutputWidth(),OutputHeight(),RGBA(255,255,255,255))
    
    xx = 80
    yy = 10
    hh = 40
    
    h1 = OutputHeight()-100+10   
    Month$ = "Jan,Fev,Mars,Avril,Mai,Juin,Juil,Aout,Sept,Oct,Nov,Dec,"

    W_month = (OutputWidth()-100)/12
    
    
    
    ForEach Project()
      x1 = 0
      w1 = 0
      With project()
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(10,30+hh*i,\Name$,0)
        
        DrawingMode(#PB_2DDrawing_AlphaBlend)
        ForEach \NewDate()
          
          Select \NewDate()\X_Month
            Case 1,3,5,7,8,10,12
              day = 31
            Case 2
              day = 28
            Default
              day =30
          EndSelect
          W_day.d = W_month/Day ; size of one day
          
          DayFinalsize.d = \NewDate()\X_day*W_day -1
         
          x1 = W_month * (\NewDate()\X_Month-1) + DayFinalsize
          w = W_day*\NewDate()\X_end
          Debug "Taille du mois: "+Str(W_month)+" ("+Str(\NewDate()\X_Month)+") / Nb j: "+StrF(day,3)+" / jour: "+StrF(W_day,3)+" / total: "+Str(w)
          Box(xx+x1,yy+i*hh,w,hh,\color)         
          Line(xx,yy+i*hh,OutputWidth()-100,1,RGBA(120,120,120,125)) ; line horizontal
        Next 
      EndWith 
      i+1
    Next
    
    ; the last line
    Line(xx,yy+i*hh,OutputWidth()-100,1,RGBA(120,120,120,125))
    
    
    For i = 0 To 12 ; for the months
      DrawingMode(#PB_2DDrawing_AlphaBlend)
      Line(xx+W_month*i,10,1,OutputHeight()-100,RGBA(200,200,200,255))
      
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(xx+W_month*i,h1,StringField(Month$,i+1,","),0)
    Next
      
    
    Line(xx,10,1,OutputHeight()-100,RGBA(0,0,0,255))
    Line(xx,h1,OutputWidth()-100,1,RGBA(0,0,0,255)) ; line hor

    StopDrawing()
  EndIf
  
EndProcedure

flag = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
w = 1024
h = 768



If OpenWindow(#Window_main,0,0,w,h, #SoftwareName + " " + #SoftwareVersion, Flag)
  
  
  ;{ menu
  If CreateMenu(0, WindowID(0))
    MenuTitle("File")
    MenuItem(#menu_open, "Open")
  EndIf  
  ;}
  
  ;{ Gadget
  XX = 50
  If CanvasGadget(#G_canvas,xx,0,WindowWidth(#Window_main)-xx-10,WindowHeight(#Window_main))
    
    ; test add some data:
    AddNewProject("Projet1")
    AddProjectData("Projet1",2014,05,01,2014,05,31)
    AddProjectData("Projet1",2014,06,12,2014,06,28)
    AddProjectData("Projet1",2014,07,02,2014,07,13)
    
    AddNewProject("Projet2")
    AddProjectData("Projet2",2014,01,01,2014,02,17)
    AddProjectData("Projet2",2014,03,08,2014,03,28)
    
    UpdateCanvas()
  EndIf
  ;}
  
EndIf

Repeat
  
  Repeat
    
    EventID     = WindowEvent()
    EventGadget = EventGadget()
    EventMenu   = EventMenu()
    EventWindow = EventWindow()
    
    Select EventID
        
        
      Case #PB_Event_Menu
        ;{ menu
        Select EventMenu
        EndSelect
        ;}
        
      Case #PB_Event_SizeWindow
        
      Case #PB_Event_Gadget
        ;{ gadget
        Select EventGadget
        EndSelect
        ;}
        
      Case #PB_Event_CloseWindow 
        quit = 1
        
    EndSelect
    
  Until event = 0 Or quit = 1
  
Until Quit = 1
Si vous avez une idée, je suis preneur ^^.
Merci.

EDIT : j'ai corrigé un peu le code, ça commence à être mieux, mais ce n'est pas encore ça ^^

EDIT 2 : bon, j'ai corrigé d'autres choses et je crois que ça fonctionne plutôt correctement maintenant. J'ai donc indiqué résolu dans 'lentête, je laisse le code pour ceux que ça intéresse ;)

Re: [Resolu] Diagramme type Gantt

Publié : mar. 22/sept./2015 11:05
par Anonyme2
Je me souviens (il y a longtemps) du chemin critique pour ce diagramme (c'était pénible : juste mon avis mais assez efficace sur le résultat).
Tu l'as mis en évidence ?