Modulo:Discendenza: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
sistemazioni
Riga 2:
local p = {}
local pers = {}
-- pers = dati delle persone:
-- id (identificativo)
-- padre (identificativo)
-- testo
-- nota
-- id2 (numero d'ordine tra i figli del padre)
-- x, y, sp (coordinate per il posizionamento) nella tabella
-- figli (elenco di identificativi)
local tabella = {}
-- identificativi delle persone per singola riga
-- local tdg = ''
-- dati per debug
 
--[[ debug
local function mostra2(pid, idt)
local ss = idt .. pers[pid].id .. ' => x = ' .. pers[pid].x .. ', sp = ' .. pers[pid].sp .. ', y = ' .. pers[pid].y .. '<br/>'
Line 12 ⟶ 23:
return ss
end
]]--
 
local function dividi(dati)
Line 27 ⟶ 39:
pers[tonumber(v1[4*m-3])] = { id = tonumber(v1[4*m-3]), padre = tonumber(v1[4*m-2]), testo = v1[4*m-1], nota = v1[4*m], id2 = -1, x = -1, y = -1, sp = 0, figli = {} }
else
err = m -- identifica la riga con errore
end
m = m+1
end
else
err = -1 -- parametri non multipli di 4
end
return err
Line 38 ⟶ 50:
 
local function organizza(pid, plev)
pers[pid].y = plev -- assegna y ad ogni persona
if (not tabella[plev]) then
tabella[plev] = {}
end
table.insert(tabella[plev], pid) -- inserisce la persona in tabella
for i, v in pairs(pers[pid].figli) do
pers[v].id2 = i -- assegna numero del figlio
organizza(v, plev+1) -- ricorsione per assegnare y ai figli
end
end
 
local function limSx(pid, delta, dt) -- calcola la posizione più a sinistra tra gli elementi del ramo per ogni y
local tt = dt
if (tt[pers[pid].y]) then
Line 62 ⟶ 74:
end
 
local function limDx(pid, delta, dt) -- calcola la posizione più a destra tra gli elementi del ramo per ogni y
local tt = dt
if (tt[pers[pid].y]) then
Line 75 ⟶ 87:
end
 
local function riallinea(pid2, n1, n2) -- sposta gli elementi tra i fratelli n1 e n2 per cercare di equispaziarli
local distanza = n2 - n1
local vrf = 0
Line 94 ⟶ 106:
end
 
local function verifica(pid) -- verifica che i rami non si sovrappongano e calcola eventuali spostamenti
local tSx
local tDx
Line 103 ⟶ 115:
local frt2, n
while (frt < fine) do -- controlla tutti i rami fratelli da 1 fino al ramo corrente
frt2 = pers[pers[pers[pid].padre].figli[frt]].id
tDx = limDx(frt2, 0, {}) -- elementi più a destra del ramo fratello per ogni y
tSx = limSx(pid, 0, {}) -- elementi più a sinistra del ramo corrente per ogni y
n = pers[pid].y
while ((tSx[n]) and (tDx[n])) do
if (tSx[n] - tDx[n] + sposta < 2) then -- verifica che ci sia almeno una distanza 2 tra i rami (2 = larghezza casella)
sposta = 2 + tDx[n] - tSx[n]
--[[ debug
tdg = tdg .. '<br/>Sposta: id = ' .. pid .. ' (' .. pers[pid].x .. ',' .. pers[pid].sp .. '), Sx = ' .. tSx[n]
tdg = tdg .. '// id2 = ' .. frt2 .. ' (' .. pers[frt2].x .. ',' .. pers[frt2].sp .. '), Dx = ' .. tDx[n]
Line 118 ⟶ 131:
tdg = tdg .. i .. ' = ' .. v .. ' - '
end
]]--
end
n = n + 1
end
if (sposta > 0) then -- se deve spostare verifica se riallineare elementi intermedi
pers[pid].x = pers[pid].x + sposta
pers[pid].sp = pers[pid].sp + sposta
Line 131 ⟶ 145:
end
 
local function calcolaX1(pid) -- prima verifica di posizionamento
local tt = 0
for i, v in pairs(pers[pid].figli) do
Line 141 ⟶ 155:
if (pers[pid].padre == -1) then -- è capostipite
pers[pid].x = 0
elseif (pers[pers[pid].padre].figli[1]id2 == pid1) then -- è primo figlio
pers[pid].x = 0
else -- è figlio successivo
Line 149 ⟶ 163:
if (pers[pid].padre == -1) then -- è capostipite
pers[pid].x = pers[pers[pid].figli[1]].x
elseif (pers[pers[pid].padre].figli[1]id2 == pid1) then -- è primo figlio
pers[pid].x = pers[pers[pid].figli[1]].x
else -- è figlio successivo
Line 159 ⟶ 173:
if (pers[pid].padre == -1) then -- è capostipite
pers[pid].x = media
elseif (pers[pers[pid].padre].figli[1]id2 == pid1) then -- è primo figlio
pers[pid].x = media
else -- è figlio successivo
Line 167 ⟶ 181:
end
if (tt>0 and pers[pid].padre>-1) then
if not (pers[pers[pid].padre].figli[1]id2 ==> pid1) then
verifica(pid)
end
Line 197 ⟶ 211:
end
 
local function massimoXY(pid, x, y) -- calcola numero colonne e righe totali
local t = {}
t[1] = math.max(x,pers[pid].x)
Line 207 ⟶ 221:
end
 
local function mostra(pid,allinea,largo) -- crea HTML tabella finale
local xy = massimoXY(pid, 0, 0)
local p1, p2, p3, n1,-- n2,posizione n3,all'interno s1,della s2,riga s3,per px,1. nxparte superiore; 2. parte con testo; 3. parte inferiore
local n1 -- padre dell'ultimo elemento analizzato (per connessione tra fratelli)
local s1, s2, s3 -- HTML per 1. parte superiore; 2. parte con testo; 3. parte inferiore
local px, nx -- posizione e padre dell'elemento corrente
local ss = ''
if (allinea == 'destra') then
Line 216 ⟶ 233:
ss = '<center><table cellpadding="1" cellspacing="0" border=0 style="text-align:center;font-size:95%;line-height:110%;margin:10px auto">'
end
local lg = math.floor(100/(xy[1]+2)) -- larghezza percentuale di ogni colonna
if (lg == 0) then lg = 1 end
for n=1,xy[2] do -- analisi delle righe
p1 = 0; p2 = 0; p3 = 0
n1 = 0
Line 228 ⟶ 245:
nx = pers[v].padre
 
if (n>1) then -- 1. parte superiore
s1 = s1 .. '<td style="border-right:1px solid #000'
if (n1 == nx) then s1 = s1 ..';border-top:1px solid #000' end
Line 239 ⟶ 256:
end
 
if (px-p2>0) then -- 2. parte con testo
s2 = s2 .. '<td'
if (px - p2>1) then s2 = s2 .. ' colspan="'.. (px-p2) ..'"' end
Line 249 ⟶ 266:
p2 = px + 2
 
if (n<xy[2]) then -- 3. parte inferiore (non creata per l'ultima riga)
if (#pers[v].figli > 0) then
s3 = s3 .. '<td style="border-right: 1px solid #000'
Line 258 ⟶ 275:
end
end
 
if (n>1) then s1 = s1 .. '</tr>' end -- chiusura delle righe
s2 = s2 .. '</tr>'
if (n<xy[2]) then s3 = s3 .. '</tr>' end
 
ss = ss .. s1 .. s2 .. s3
n = n + 1
end
 
ss = ss .. '</table>' -- chiusura tabella
if (allinea == 'destra') then ss = ss .. '</div>' else ss = ss .. '</center>' end
 
return ss
end
Line 279 ⟶ 300:
capo = v.id
else
err = -1 -- due elementi come capostipite
end
else
if (v.padre == v.id) then
err = i -- elemento figlio di se stesso
elseif (pers[v.padre]) then
table.insert(pers[v.padre].figli,i)
else
err = i -- rinvio a padre non esistente
end
end
Line 301 ⟶ 322:
calcolaX3(capo, 0)
 
-- if (frame.args[4] == '0') then
return mostra(capo, frame.args[2], frame.args[3])
-- else
-- return '<pre>'..mostra2(capo, '')..tdg .. '</pre>'
-- end
end
elseif (err == -1) then