Italian B4J - LAVAGNA GRUPPI DI LAVORO (progetto e avanzamenti)

ivanomonti

Expert
Licensed User
Longtime User
ciao ragazzi, mi sto facendo la mia lavagna grafica dove contiene obiect a secondo della nota che voglio inserire, come si mettono le ancore a codice?


lavagna.jpg
 
Last edited:

ivanomonti

Expert
Licensed User
Longtime User
Per un layout come quello, gli ancoraggi non sono utili, dovrai usare lo script.

(anche se capisco che non lo è, a prima vista mi ha fatto pensare ai bei tempi, quando esisteva il calcio 😄:()
infatti ho usato il codice e ho ottenuto il risultato.

Ora ho altro quesito un poco piu drammatico, disegno lo scenario:

Questa lavagna e per miei scopi personali in quanto mi perdo molto i vari scenari di vita quotidiana, devo agganciare ogni cosa ad una scheda, esempio i gruppi di lavoro come sono composti e allacciarli fra loro (vedi immagine gruppo rosso e gruppo blu), esiste un leader con i suoi seguaci, devo creare quelle belle freccie che partono dal leader ai seguaci, ogni elemento (button) lo si può posizionare dove si vuole nella lavagna che e lunga 3000px in orizzontale, quindi molti elementi saranno nascosti, ma attraverso in find rihiamo tutto il gruppo rivedendo ovviamante dal leader ai suoi seguaci. ovviamente le note verranno legate alla scheda (button alieno) così come video, allarmi ecc ecc

Allego un progetto scritto 10 o 11 anni fa, tutto dentro in un canvas, ma non voglio rifarlo così, vorrei cambiare l'idea perchè questo fun un lavoro assurdo hahahah


Come posso creare questo giochetto delle linee?

2020-04-11_005234.jpg


questi elementi sono tutti oggetti tradizionali, button, pane, label ecc ecc che ha codice si impaginano sullo schermo in realtime, tutto va alla perfezione, eventi e altro fila liscio a parte io che ho dimenticato un botto di cose nella programmazione.

2020-04-11_004949.jpg
 
Last edited:

ivanomonti

Expert
Licensed User
Longtime User
Per ora sono arrivato fino qui ma credo che domani possa trovare la soluzione per creare il ragno (linee) che raggruppa in base al gruppo di appartenenza, con un semplice click sul bottone group mi si disegnano le aree di un canvas a seconda della posizione del bottone di riferimento, dai poi non e così male b4j :cool: (notte)


2020-04-11_025119.jpg
 

LucaMs

Expert
Licensed User
Longtime User
Temo che dovrai comunque usare i Canvas, non penso si possa creare una View, una linea inclinabile e agganciabile.

Suggerimento: per ogni linea, crea un Type contenente le coordinate (le due coppie x,y e le view collegate).
 

ivanomonti

Expert
Licensed User
Longtime User
Ecco il primo risultao con poche righe di codice ma noto in piccolo rallentamento che di sicuro posso migliorare, nel frattempo ho visto anche questa propietà che non conosco e secondo come dice erel e piu veloce di 8x

BitmapCreator contro il classico Drawline o DrawRect... chi lo conosce bene questa proprietà?


2020-04-11_142223.jpg
 

LucaMs

Expert
Licensed User
Longtime User
Ecco il primo risultao con poche righe di codice
Come hai fatto? Puoi spostare quei Pane (suppongo siano tali) a runtime (l'utente, col mouse) e le righe seguono...?

BitmapCreator contro il classico Drawline o DrawRect... chi lo conosce bene questa proprietà?
E' un vero, proprio e grande oggetto, non è una semplice proprietà.
Complesso lavorarci... soprattutto se non si studia il suo funzionamento.
 

ivanomonti

Expert
Licensed User
Longtime User
Come hai fatto? Puoi spostare quei Pane (suppongo siano tali) a runtime (l'utente, col mouse) e le righe seguono...?


E' un vero, proprio e grande oggetto, non è una semplice proprietà.
Complesso lavorarci... soprattutto se non si studia il suo funzionamento.

molto semplice alla fine il problema e solo non fare lavorare troppo la cpu nel continuare a fare disegnare il tutto, la lavagna ha tre strati

1) lavagna fisica (pane)
2) griglia (canvas)
3) ragnatela (canvas)

nella lavagna aggiungo i button e ne creo una list di proprietà come x,y,w,h + dati record + dati gruppo + master e slave, il codice sotto fa due cose

1) mi disegna un rettangolo colorato in base al colore del gruppo scelto
2) mi legge e chi è master memorizzando le sue coordinate x,y
3) mi legge i suoi slave e le sue coordinate x,y
4) disegna la riga

Unico problema che non puoi fare eseguire la riscrittura di tutto perchè ne rallenta la CPU quindi ho fatto la scelta di riscrivere al rilascio del bottone del mouse del bottone che vado a postare nella lavagna. L'effetto non è cio che volevo ma al momento va benissimo.

Ogni volta che posto un elemento la raganatela si rincompone


ragnatela:
Sub ragnoclear(grid As Pane, cvs As Canvas)
    cvs.ClearRect(0,0,cvs.Width,cvs.Height)
End Sub

Sub ragnodraw(grid As Pane, cvs As Canvas)
    
    cvs.ClearRect(0,0,cvs.Width,cvs.Height)
    
    If groupValue = False Then Return
    
    For i = 0 To lavagna.NumberOfNodes-1
        If grid.GetNode(i) Is Button Then
            Dim ls As List = grid.GetNode(i).Tag
            If ls.Get(18) = "master" Then
                cvs.DrawRect(grid.GetNode(i).Left-1,grid.GetNode(i).Top-1,grid.GetNode(i).PrefWidth+2,grid.getNode(i).PrefHeight+3,ls.Get(17), True,3)
                listMaster.Add(ls)
            Else
                cvs.DrawRect(grid.GetNode(i).Left-1,grid.GetNode(i).Top-1,grid.GetNode(i).PrefWidth+2,grid.getNode(i).PrefHeight+3,ls.Get(17), True,1)
                listSlave.Add(ls)
            End If
        End If
    Next
    
    Dim x,y,x2,y2 As Int
    
    For i=0 To listMaster.Size-1
        Dim lsM As List = listMaster.Get(i)
        x = lsM.Get(0) +( lsM.Get(2)/2)
        y = lsM.Get(1) +( lsM.Get(3)/2)
        For ii=0 To listSlave.Size-1
            Dim lsS As List = listSlave.Get(ii)
            If lsS.Get(16) = lsM.Get(16) Then
                x2=lsS.Get(0) + ( lsS.Get(2)/2)
                y2=lsS.Get(1) + ( lsS.Get(3)/2)
                cvs.DrawLine(x, y, x2, y2, lsS.Get(17),1)
            End If
        Next
    Next

End Sub
 

ivanomonti

Expert
Licensed User
Longtime User
Non mi sembra affatto lento; inoltre, piccolo dettaglio... nel video sei in modalità Debug! In Release andrebbe ancora molto più velocemente.



? Di che tipo è "grid"?

la disegno io, per avere un effetto piu professionale ahahahha
 

ivanomonti

Expert
Licensed User
Longtime User
ho guardato meglio; è un Pane, che passi come parametro.

1) lavagna fisica (pane) dove appoggio ogni singolo bottone che uso come grafico visivo ma non lo devo ridisegnare ogni volta che faccio griglia o linee rosse
2) griglia (canvas) disegno righe verticali ed orizzontali e faccio griglia
3) ragnatela (canvas) disegno i bordi rossi e le linee in modo che quando ridisegno esso non devo rifare la griglia

codice in mainform:
#Region Project Attributes
    #MainFormWidth: 1000
    #MainFormHeight: 700
    #AdditionalJar: sqlite-jdbc-3.7.2
#End Region

Sub Process_Globals
    Private fx As JFX
    Public MainForm As Form
    Public lavagna As Pane
    Public  lineCanvas, ragnoCanvas As Canvas
    Private scrolllavagna As ScrollPane
    Private tools As ToolsLayout
    Public groupValue As Boolean = False
    Public listMaster, listSlave As List
End Sub

Sub AppStart (Form1 As Form, Args() As String)
    MainForm = Form1
    MainForm.Show
    MainForm.Title = "Lavagna"
    MainForm.Resizable = False
    
    lavagna.Initialize("lavagna")
    lavagna.PrefHeight = 685
    lavagna.PrefWidth = 6000
    lavagna.Style="-fx-background-color:#2D2D30"
    
    scrolllavagna.Initialize("scrolllavagna")
    scrolllavagna.InnerNode = lavagna
    scrolllavagna.PrefHeight = 700
    scrolllavagna.PrefWidth = 3000
    scrolllavagna.Pannable = False
    scrolllavagna.HPosition=0
    scrolllavagna.Style=lavagna.Style
    
    MainForm.RootPane.AddNode(scrolllavagna,90,0,910,700)
    tools.Initialize()
    
    Dim img As Image
    img.Initialize(File.DirAssets,"Menu-01.png")
    Dim imgw As ImageView
    imgw.Initialize("imgw")
    imgw.SetImage(img)
    MainForm.RootPane.AddNode(imgw,MainForm.WindowWidth-58,10,32,32)
    
    listMaster.Initialize()
    listSlave.Initialize()
    
    gridcanvas
    
End Sub

Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
    Return True
End Sub

public Sub gridcanvas
    lineCanvas = createCanvasGrid(lavagna, 0, 0, lavagna.PrefWidth, lavagna.PrefHeight, True)
    ragnoCanvas = createCanvasGrid(lavagna, 0, 0, lavagna.PrefWidth, lavagna.PrefHeight, True)
End Sub

Sub createCanvasGrid(grid As Pane, x As Int, y As Int, width As Int, height As Int, sharp As Boolean) As Canvas

    Dim cvs As Canvas
    cvs.Initialize("")
    grid.AddNode(cvs, x, y, width, height)

    For x = 0 To width Step 10
        Dim x1 As Double
        If sharp Then x1 = x + 0.5 Else x1 = x
        cvs.DrawLine(x1, 0, x1, height, fx.Colors.Black, 1.0)
    Next

    For y = 0 To  height Step 10
        Dim y1 As Double
        If sharp Then y1 = y + 0.5 Else y1 = y
        cvs.DrawLine(0, y1, width, y1, fx.Colors.Black, 1.0)
    Next
    
    Return cvs
    
End Sub

Public Sub group(grid As Pane, cvs As Canvas)
    
    cvs.ClearRect(0,0,cvs.Width,cvs.Height)
    
    Dim sharp As Boolean = True

    For x = 0 To grid.PrefWidth Step 10
        Dim x1 As Double
        If sharp Then x1 = x + 0.5 Else x1 = x
        cvs.DrawLine(x1, 0, x1, grid.PrefHeight, fx.Colors.Black, 1.0)
    Next

    For y = 0 To  grid.PrefHeight Step 10
        Dim y1 As Double
        If sharp Then y1 = y + 0.5 Else y1 = y
        cvs.DrawLine(0, y1, grid.PrefWidth, y1, fx.Colors.Black, 1.0)
    Next
    
End Sub

Sub ragnoclear(grid As Pane, cvs As Canvas)
    cvs.ClearRect(0,0,cvs.Width,cvs.Height)
End Sub

Sub ragnodraw(grid As Pane, cvs As Canvas)
    
    cvs.ClearRect(0,0,cvs.Width,cvs.Height)
    
    If groupValue = False Then Return
    
    For i = 0 To lavagna.NumberOfNodes-1
        If grid.GetNode(i) Is Button Then
            Dim ls As List = grid.GetNode(i).Tag
            If ls.Get(18) = "master" Then
                cvs.DrawRect(grid.GetNode(i).Left-1,grid.GetNode(i).Top-1,grid.GetNode(i).PrefWidth+2,grid.getNode(i).PrefHeight+3,ls.Get(17), True,3)
                listMaster.Add(ls)
            Else
                cvs.DrawRect(grid.GetNode(i).Left-1,grid.GetNode(i).Top-1,grid.GetNode(i).PrefWidth+2,grid.getNode(i).PrefHeight+3,ls.Get(17), True,1)
                listSlave.Add(ls)
            End If
        End If
    Next
    
    Dim x,y,x2,y2 As Int
    
    For i=0 To listMaster.Size-1
        Dim lsM As List = listMaster.Get(i)
        x = lsM.Get(0) +( lsM.Get(2)/2)
        y = lsM.Get(1) +( lsM.Get(3)/2)
        For ii=0 To listSlave.Size-1
            Dim lsS As List = listSlave.Get(ii)
            If lsS.Get(16) = lsM.Get(16) Then
                x2=lsS.Get(0) + ( lsS.Get(2)/2)
                y2=lsS.Get(1) + ( lsS.Get(3)/2)
                cvs.DrawLine(x, y, x2, y2, lsS.Get(17),1)
            End If
        Next
    Next

End Sub
 

ivanomonti

Expert
Licensed User
Longtime User
Accetto anche commenti di scambio vedute, mi raccomando non solo sbirciare e poi copiare hahahahh
 

LucaMs

Expert
Licensed User
Longtime User
Accetto anche commenti di scambio vedute, mi raccomando non solo sbirciare e poi copiare hahahahh
Io avrei lavorato molto ma molto di più, cercando la perfezione 😄 :(

Vai avanti così; come ti ho detto, a me la velocità sembra già molto buona e, oltretutto, nel video hai lanciato il progetto in modalità Debug, mentre in Release sarà parecchio più veloce.
 

ivanomonti

Expert
Licensed User
Longtime User
Io avrei lavorato molto ma molto di più, cercando la perfezione 😄 :(

Vai avanti così; come ti ho detto, a me la velocità sembra già molto buona e, oltretutto, nel video hai lanciato il progetto in modalità Debug, mentre in Release sarà parecchio più veloce.

ho un problema che forse mi sai dare una mano,,, devo inserire un immagine in un sqlite e poi passarla ad image,, mai fatto io,,, sembra una cazzata ma è vera,, come si gestisce l'immagine in un campo image di sqlite?


importa record:
Dim i As Int = -1
    Do While rs.NextRow
        Dim imvalue As List
        imvalue.Initialize
        For i=0 To rs.ColumnCount-1
            imvalue.Add(rs.GetString2(i))
        Next
        ' creo object
        Dim bt As Button
        bt.Initialize("im")
        bt.Tag = imvalue
        bt.Text = imvalue.Get(13) ' company
        bt.Style = "-fx-background-color:#1E1E1E"
        bt.TextColor= fx.Colors.ARGB(255,200,200,200)
        ' creo immagine object (icona)
        Dim imw As ImageView
        imw.Initialize("")
        imw.SetImage(imvalue.Get(14)) ' bombaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
        imw.PrefHeight = 24
        imw.PrefWidth = 24
        SetGraphic(bt, imw)
        Main.lavagna.AddNode(bt,imvalue.Get(0),imvalue.Get(1),imvalue.Get(2),imvalue.Get(3))
        If Main.groupValue = True Then Main.ragnodraw(Main.lavagna,Main.ragnoCanvas)
    Loop
tabella sqlite:
CREATE TABLE [item] (
  [left] TEXT(255),
  [top] TEXT(255),
  [width] TEXT(255),
  [Height] TEXT(255),
  [TrueFalse] TEXT(255),
  [fullname] TEXT(255),
  [Address] TEXT(255),
  [zip] TEXT(255),
  [city] TEXT(255),
  [country] TEXT(255),
  [phone] TEXT(255),
  [mail] TEXT(255),
  [url] TEXT(255),
  [company] TEXT(255),
  [icon] IMAGE, ' <<<<<<<<<<<<<<<<<<<<<<<<<<< campo image sqlite >>>>>>>>>>>>>>>>>>>>>>>
  [id] TEXT(255),
  [group] TEXT(255),
  [colorgroup] TEXT(255),
  [masterslave] TEXT(255));
 

ivanomonti

Expert
Licensed User
Longtime User
Ci sono un paio di modi ma... sicuro di voler salvare l'immagine nel DB? Occuperà molto spazio. Se possibile, meglio salvare nel DB il percorso dei file immagine.

vero anche questo ma sono immagini massimo 128x128 px, se domani voglio metterlo su mysql in rete dovrei fare anche un ftp

1) modo 1 =
2) modo 2 =
 
Top