diff --git a/LuaLibs/WProcessFreeContour.lua b/LuaLibs/WProcessFreeContour.lua index a4fed1b..35a7cc6 100644 --- a/LuaLibs/WProcessFreeContour.lua +++ b/LuaLibs/WProcessFreeContour.lua @@ -1,4 +1,4 @@ --- ProcessFreeContour.lua by Egaltech s.r.l. 2024/03/24 +-- ProcessFreeContour.lua by Egaltech s.r.l. 2026/03/30 -- Gestione calcolo profilo libero per Pareti -- 2021/11/15 Penna e chiodature sono sempre riportate sulla faccia sopra anche se nel progetto sono sotto. -- 2021/12/10 In taglio con lama aggiunta gestione SCC per testa Gearbox. @@ -717,19 +717,19 @@ local function MakeCustomPath( vGeom, nConeCut, dMillDiam, nAddGrpId, dThick, bC end --------------------------------------------------------------------- -local function CalcInterference( nNewProc, vtExtr, ptCentr, dDiam1, dDiam2, - dTall1, dTall2, dDiam3, dTall3) - local ptCentrGrid1 = ptCentr + ( vtExtr * 0.01) +local function CalcInterference( nNewProc, vtExtr, ptCentr, + dDiam1, dTall1, dDiam2, dTall2, dDiam3, dTall3) + local ptCentrGrid1 = ptCentr + 0.1 * vtExtr local frOriTool = Frame3d( ptCentrGrid1, vtExtr) - local bColl1 = EgtTestConeSurface( frOriTool, dDiam1/2, dDiam2/2, dTall1, nNewProc, 0, GDB_RT.GLOB) + local bColl1 = EgtTestConeSurface( frOriTool, dDiam1 / 2, dDiam2 / 2 - 0.1, dTall1, nNewProc, 0, GDB_RT.GLOB) if bColl1 then return true end - local ptCentrGrid2 = ptCentr + ( vtExtr * ( dTall1 + 0.01)) + local ptCentrGrid2 = ptCentr + dTall1 * vtExtr frOriTool = Frame3d( ptCentrGrid2, vtExtr) - local bColl2 = EgtTestCylSurface( frOriTool, dDiam2/2, (dTall2-dTall1), nNewProc, 0, GDB_RT.GLOB) + local bColl2 = EgtTestCylSurface( frOriTool, dDiam2 / 2 - 0.1, dTall2, nNewProc, 0, GDB_RT.GLOB) if bColl2 then return true end - local ptCentrGrid3 = ptCentr + ( vtExtr * ( dTall2 + 0.01)) + local ptCentrGrid3 = ptCentr + ( dTall1 + dTall2) * vtExtr frOriTool = Frame3d( ptCentrGrid3, vtExtr) - local bColl3 = EgtTestCylSurface( frOriTool, dDiam3/2, (dTall3-dTall2), nNewProc, 0, GDB_RT.GLOB) + local bColl3 = EgtTestCylSurface( frOriTool, dDiam3 / 2 - 0.1, dTall3, nNewProc, 0, GDB_RT.GLOB) if bColl3 then return true end -- restituisco risultato controllo collisioni return false @@ -785,8 +785,8 @@ end --------------------------------------------------------------------- local function AddMillCornerMachining( nPartId, nNewProc, nFacInd, tFacAdj, nTypeConeCut, nAddGrpId, dToolDiam, dThick, sMilling, dOffsAng, dDepthMach, - bThruThick, dThSurf, dDiam1, dDiam2, dTall1, - dTall2, dDiam3, dTall3, bMakeLocSurf, vFace) + bThruThick, dThSurf, dConeSideAng, dDiam1, dTall1, + dDiam2, dTall2, dDiam3, dTall3, bMakeLocSurf, vFace) -- variabili costruzione geometria local pAuxId = {} local nAuxId @@ -854,23 +854,21 @@ local function AddMillCornerMachining( nPartId, nNewProc, nFacInd, tFacAdj, nTyp -- sommo i tre versori per avere una direzione media vtExtrExit = vtN2 + vtN3 vtExtrExit:normalize() - -- se tipo 1 calcolo angolo tilt di 45° - if nTypeConeCut == 1 then - vtExtr = vtExtrExit + Z_AX() - -- altrimenti tipo 2, calcolo angolo tilt di 33° (dalla verticale) - else - vtExtr = vtExtrExit + Vector3d(0,0,1.539865) - end + -- calcolo la componente Z dipendente dall'angolo tilt + local dAlfa = EgtClamp( dConeSideAng, 15, 30) + local dGamma = 90 - asin( sqrt( 2) * sin( dConeSideAng)) + local dTanGamma = sin( dGamma) / cos( dGamma) + vtExtr = vtExtrExit + Vector3d( 0, 0, dTanGamma) vtExtr:normalize() - local vtCheck = Vector3d(vtExtr) + local vtCheck = Vector3d( vtExtr) -- se ho un offset angolare ruoto il percorso - if abs(dOffsAng) > 100 * GEO.EPS_SMALL then + if abs( dOffsAng) > 100 * GEO.EPS_ANG_SMALL then vtCheck:rotate( Z_AX(), dOffsAng) end -- controllo se c'è collisione con le facce della superfice - if nTypeConeCut == 1 and CalcInterference( nNewProc.Id, vtCheck, tFacAdj[nIdEndPoint] + Point3d( 0, 0, -dDepthMach), dDiam1, dDiam2, - dTall1, dTall2, dDiam3, dTall3) then - local sErr = 'Collision detect from clean corner tool and surface' + if nTypeConeCut == 1 and CalcInterference( nNewProc.Id, vtCheck, tFacAdj[nIdEndPoint] + Point3d( 0, 0, -dDepthMach), + dDiam1, dTall1, dDiam2, dTall2, dDiam3, dTall3) then + local sErr = 'Collision detected between clean corner tool and surface' EgtOutLog( sErr) return true, '' end @@ -1054,22 +1052,26 @@ local function AddMillCorner( nTypeConeCut, vFace, Proc, nRawId, b3Raw, -- recupero i dati dell'utensile local dMillDiam = 20 local dMillTotDiam = 20 - local dMillDiamTh = 20 - local dToolLength = 20 - local dThickTool = 20 - local dSideAng = 0 + local dMillLength = 20 + local dMillThick = 20 + local dMillSideAng = 0 + local dMillStemLength = 10 + local dMillThDiam = 70 + local dMillThLength = 20 if EgtMdbSetCurrMachining( sMilling) then local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then - dMillDiamTh = EgtTdbGetCurrToolThDiam() or dMillDiamTh + dMillThDiam = EgtTdbGetCurrToolThDiam() or dMillThDiam + dMillThLength = EgtTdbGetCurrToolThLength() or dMillThLength dMillTotDiam = EgtTdbGetCurrToolParam( MCH_TP.TOTDIAM) or dMillTotDiam - dSideAng = EgtTdbGetCurrToolParam( MCH_TP.SIDEANG) or dSideAng + dMillSideAng = EgtTdbGetCurrToolParam( MCH_TP.SIDEANG) or dMillSideAng dMillDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dMillDiam - dThickTool = EgtTdbGetCurrToolParam( MCH_TP.THICK) or dThickTool - dToolLength = EgtTdbGetCurrToolParam( MCH_TP.LEN) or dToolLength - dMaxDepth = EgtTdbGetCurrToolMaxDepth() or dMaxDepth -- qui è la distanza dal portautensile - -- calcolo il secondo diametro del cono - dMillTotDiam = dMillDiam + ( abs( dThickTool) * tan( dSideAng)) * 2 + dMillThick = EgtTdbGetCurrToolParam( MCH_TP.THICK) or dMillThick + dMillLength = EgtTdbGetCurrToolParam( MCH_TP.LEN) or dMillLength + -- diametro massimo del cono + dMillTotDiam = dMillDiam + ( abs( dMillThick) * tan( dMillSideAng)) * 2 + -- lunghezza del gambo + dMillStemLength = dMillLength - abs( dMillThick) - dMillThLength end end -- verifico se ciclo chiuso @@ -1157,21 +1159,21 @@ local function AddMillCorner( nTypeConeCut, vFace, Proc, nRawId, b3Raw, -- primo taglio local bOk, sErr = AddMillCornerMachining( Proc.PartId, nNewProc, nFacInd, tFacAdj, nTypeConeCut, nAddGrpId, dToolDiam, dThick, sMilling, -dAngOffs, dDepthMach, - bThruThick, dDepth, dMillDiam, dMillTotDiam, abs(dThickTool), - dMaxDepth, dMillDiamTh, dToolLength, bMakeLocSurf, vFace) + bThruThick, dDepth, dMillSideAng, dMillDiam, abs( dMillThick), + dMillTotDiam, dMillStemLength, dMillThDiam, dMillThLength, bMakeLocSurf, vFace) if not bOk then return bOk, sErr end -- secondo taglio bOk, sErr = AddMillCornerMachining( Proc.PartId, nNewProc, nFacInd, tFacAdj, nTypeConeCut, nAddGrpId, dToolDiam, dThick, sMilling, dAngOffs, dDepthMach, - bThruThick, dDepth, dMillDiam, dMillTotDiam, abs(dThickTool), - dMaxDepth, dMillDiamTh, dToolLength, bMakeLocSurf, vFace) + bThruThick, dDepth, dMillSideAng, dMillDiam, abs( dMillThick), + dMillTotDiam, dMillStemLength, dMillThDiam, dMillThLength, bMakeLocSurf, vFace) if not bOk then return bOk, sErr end -- altrimenti ho un solo percorso else local bOk, sErr = AddMillCornerMachining( Proc.PartId, nNewProc, nFacInd, tFacAdj, nTypeConeCut, nAddGrpId, dToolDiam, dThick, sMilling, 0, dDepthMach, - bThruThick, dDepth, dMillDiam, dMillTotDiam, abs(dThickTool), - dMaxDepth, dMillDiamTh, dToolLength, bMakeLocSurf, vFace) + bThruThick, dDepth, dMillSideAng, dMillDiam, abs( dMillThick), + dMillTotDiam, dMillStemLength, dMillThDiam, dMillThLength, bMakeLocSurf, vFace) if not bOk then return bOk, sErr end end end diff --git a/LuaLibs/WProcessLapJoint.lua b/LuaLibs/WProcessLapJoint.lua index 673b238..edd6227 100644 --- a/LuaLibs/WProcessLapJoint.lua +++ b/LuaLibs/WProcessLapJoint.lua @@ -1,4 +1,4 @@ --- WProcessLapJoint.lua by Egaltech s.r.l. 2023/10/02 +-- WProcessLapJoint.lua by Egaltech s.r.l. 2026/03/30 -- Gestione calcolo mezzo-legno per Pareti -- 2021/08/27 DS Se tre o più facce con flag PCKT=1 forzo svuotatura con fresa (per Variant). -- 2021/08/29 DS Se svuotatura di fianco setto flag per farla dopo i tagli. @@ -698,20 +698,20 @@ local function ReorderFacesFromTab( nIdSurf, vFace) end --------------------------------------------------------------------- -local function CalcInterference( nNewProc, vtExtr, ptCentr, dDiam1, dDiam2, - dTall1, dTall2, dDiam3, dTall3) +local function CalcInterference( nNewProc, vtExtr, ptCentr, + dDiam1, dTall1, dDiam2, dTall2, dDiam3, dTall3) - local ptCentrGrid1 = ptCentr + ( vtExtr * 0.01) + local ptCentrGrid1 = ptCentr + 0.1 * vtExtr local frOriTool = Frame3d( ptCentrGrid1, vtExtr) - local bColl1 = EgtTestConeSurface( frOriTool, dDiam1/2, dDiam2/2, dTall1, nNewProc, 0, GDB_RT.GLOB) + local bColl1 = EgtTestConeSurface( frOriTool, dDiam1 / 2, dDiam2 / 2 - 0.1, dTall1, nNewProc, 0, GDB_RT.GLOB) if bColl1 then return true end - local ptCentrGrid2 = ptCentr + ( vtExtr * ( dTall1 + 0.01)) + local ptCentrGrid2 = ptCentr + dTall1 * vtExtr frOriTool = Frame3d( ptCentrGrid2, vtExtr) - local bColl2 = EgtTestCylSurface( frOriTool, dDiam2/2, (dTall2-dTall1), nNewProc, 0, GDB_RT.GLOB) + local bColl2 = EgtTestCylSurface( frOriTool, dDiam2 / 2 - 0.1, dTall2, nNewProc, 0, GDB_RT.GLOB) if bColl2 then return true end - local ptCentrGrid3 = ptCentr + ( vtExtr * ( dTall2 + 0.01)) + local ptCentrGrid3 = ptCentr + ( dTall1 + dTall2) * vtExtr frOriTool = Frame3d( ptCentrGrid3, vtExtr) - local bColl3 = EgtTestCylSurface( frOriTool, dDiam3/2, (dTall3-dTall2), nNewProc, 0, GDB_RT.GLOB) + local bColl3 = EgtTestCylSurface( frOriTool, dDiam3 / 2 - 0.1, dTall3, nNewProc, 0, GDB_RT.GLOB) if bColl3 then return true end -- restituisco risultato controllo collisioni return false @@ -758,8 +758,8 @@ end --------------------------------------------------------------------- local function AddMillCornerMachining( nPartId, nNewProc, nFacInd, tFacAdj, nTypeConeCut, nAddGrpId, dToolDiam, dThick, sMilling, dOffsAng, dDepthMach, - bThruThick, dThSurf, dDiam1, dDiam2, dTall1, - dTall2, dDiam3, dTall3, bMakeLocSurf, vFace) + bThruThick, dThSurf, dConeSideAng, dDiam1, dTall1, + dDiam2, dTall2, dDiam3, dTall3, bMakeLocSurf, vFace) -- variabili costruzione geometria local pAuxId = {} local nAuxId @@ -826,23 +826,21 @@ local function AddMillCornerMachining( nPartId, nNewProc, nFacInd, tFacAdj, nTyp -- sommo i tre versori per avere una direzione media vtExtrExit = vtN2 + vtN3 vtExtrExit:normalize() - -- se tipo 1 calcolo angolo tilt di 45° - if nTypeConeCut == 1 then - vtExtr = vtExtrExit + Z_AX() - -- altrimenti tipo 2, calcolo angolo tilt di 33° (dalla verticale) - else - vtExtr = vtExtrExit + Vector3d(0,0,1.539865) - end + -- calcolo la componente Z dipendente dall'angolo tilt + local dAlfa = EgtClamp( dConeSideAng, 15, 30) + local dGamma = 90 - asin( sqrt( 2) * sin( dConeSideAng)) + local dTanGamma = sin( dGamma) / cos( dGamma) + vtExtr = vtExtrExit + Vector3d( 0, 0, dTanGamma) vtExtr:normalize() local vtCheck = Vector3d(vtExtr) -- se ho un offset angolare ruoto il percorso - if abs(dOffsAng) > 100 * GEO.EPS_SMALL then + if abs( dOffsAng) > 100 * GEO.EPS_ANG_SMALL then vtCheck:rotate( Z_AX(), dOffsAng) end -- controllo se c'è collisione con le facce della superfice - if nTypeConeCut == 1 and CalcInterference( nNewProc.Id, vtCheck, tFacAdj[nIdEndPoint] + Point3d( 0, 0, -dDepthMach), dDiam1, dDiam2, - dTall1, dTall2, dDiam3, dTall3) then - local sErr = 'Collision detect from clean corner tool and surface' + if nTypeConeCut == 1 and CalcInterference( nNewProc.Id, vtCheck, tFacAdj[nIdEndPoint] + Point3d( 0, 0, -dDepthMach), + dDiam1, dTall1, dDiam2, dTall2, dDiam3, dTall3) then + local sErr = 'Collision detected between clean corner tool and surface' EgtOutLog( sErr) return true, '' end @@ -1029,22 +1027,26 @@ local function AddMillCorner( nTypeConeCut, vFace, Proc, nRawId, b3Raw, -- recupero i dati dell'utensile local dMillDiam = 20 local dMillTotDiam = 20 - local dMillDiamTh = 20 - local dToolLength = 20 - local dThickTool = 20 - local dSideAng = 0 + local dMillLength = 20 + local dMillThick = 20 + local dMillSideAng = 0 + local dMillStemLength = 10 + local dMillThDiam = 70 + local dMillThLength = 20 if EgtMdbSetCurrMachining( sMilling) then local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then - dMillDiamTh = EgtTdbGetCurrToolThDiam() or dMillDiamTh + dMillThDiam = EgtTdbGetCurrToolThDiam() or dMillThDiam + dMillThLength = EgtTdbGetCurrToolThLength() or dMillThLength dMillTotDiam = EgtTdbGetCurrToolParam( MCH_TP.TOTDIAM) or dMillTotDiam - dSideAng = EgtTdbGetCurrToolParam( MCH_TP.SIDEANG) or dSideAng + dMillSideAng = EgtTdbGetCurrToolParam( MCH_TP.SIDEANG) or dMillSideAng dMillDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dMillDiam - dThickTool = EgtTdbGetCurrToolParam( MCH_TP.THICK) or dThickTool - dToolLength = EgtTdbGetCurrToolParam( MCH_TP.LEN) or dToolLength - dMaxDepth = EgtTdbGetCurrToolMaxDepth() or dMaxDepth -- qui è la distanza dal portautensile - -- calcolo il secondo diametro del cono - dMillTotDiam = dMillDiam + ( abs(dThickTool) * tan(dSideAng)) * 2 + dMillThick = EgtTdbGetCurrToolParam( MCH_TP.THICK) or dMillThick + dMillLength = EgtTdbGetCurrToolParam( MCH_TP.LEN) or dMillLength + -- diametro massimo del cono + dMillTotDiam = dMillDiam + ( abs( dMillThick) * tan( dMillSideAng)) * 2 + -- lunghezza del gambo + dMillStemLength = dMillLength - abs( dMillThick) - dMillThLength end end -- copio la feature nel layer di appoggio @@ -1135,21 +1137,21 @@ local function AddMillCorner( nTypeConeCut, vFace, Proc, nRawId, b3Raw, -- primo taglio local bOk, sErr = AddMillCornerMachining( Proc.PartId, nNewProc, nFacInd, tFacAdj, nTypeConeCut, nAddGrpId, dToolDiam, dThick, sMilling, -dAngOffs, dDepthMach, - bThruThick, dDepth, dMillDiam, dMillTotDiam, abs(dThickTool), - dMaxDepth, dMillDiamTh, dToolLength, bMakeLocSurf, vFace) + bThruThick, dDepth, dMillSideAng, dMillDiam, abs( dMillThick), + dMillTotDiam, dMillStemLength, dMillThDiam, dMillThLength, bMakeLocSurf, vFace) if not bOk then return bOk, sErr end -- secondo taglio bOk, sErr = AddMillCornerMachining( Proc.PartId, nNewProc, nFacInd, tFacAdj, nTypeConeCut, nAddGrpId, dToolDiam, dThick, sMilling, dAngOffs, dDepthMach, - bThruThick, dDepth, dMillDiam, dMillTotDiam, abs(dThickTool), - dMaxDepth, dMillDiamTh, dToolLength, bMakeLocSurf, vFace) + bThruThick, dDepth, dMillSideAng, dMillDiam, abs( dMillThick), + dMillTotDiam, dMillStemLength, dMillThDiam, dMillThLength, bMakeLocSurf, vFace) if not bOk then return bOk, sErr end -- altrimenti ho un solo percorso else local bOk, sErr = AddMillCornerMachining( Proc.PartId, nNewProc, nFacInd, tFacAdj, nTypeConeCut, nAddGrpId, dToolDiam, dThick, sMilling, 0, dDepthMach, - bThruThick, dDepth, dMillDiam, dMillTotDiam, abs(dThickTool), - dMaxDepth, dMillDiamTh, dToolLength, bMakeLocSurf, vFace) + bThruThick, dDepth, dMillSideAng, dMillDiam, abs( dMillThick), + dMillTotDiam, dMillStemLength, dMillThDiam, dMillThLength, bMakeLocSurf, vFace) if not bOk then return bOk, sErr end end end diff --git a/Process.lua b/Process.lua index e940068..2408229 100644 --- a/Process.lua +++ b/Process.lua @@ -1,4 +1,4 @@ --- Process.lua by Egaltech s.r.l. 2022/05/09 +-- Process.lua by Egaltech s.r.l. 2026/03/30 -- Gestione calcolo disposizione e lavorazioni per Pareti -- Si opera sulla macchina corrente -- 2020/12/09 Come per BatchProcess.lua si gestiscono anche rotazioni di inversione con valori negativi. @@ -108,6 +108,10 @@ local function MyProcessInputData() -- Recupero informazione se progetto o produzione local bProj = ( EgtGetInfo( EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or GDB_ID.NULL, 'PROJECT', 'i') == 1) + + -- Verifico se progetto deriva da BeamWall + local _, _, sExt = EgtSplitPath( EgtGetCurrFilePath() or '') + local bBwProj = ( ( string.upper( sExt or '') == '.BWE')) -- Eseguo eventuali rotazioni e inversioni testa-coda for i = 1, #vWall do @@ -115,7 +119,7 @@ local function MyProcessInputData() -- rotazione local dRotAng = EgtGetInfo( vWall[i].Id, 'ROTATED', 'd') if dRotAng then - if abs( dRotAng) > GEO.EPS_ANG_SMALL and not EgtExistsInfo( vWall[i].Id, 'ROTATED_DONE') then + if abs( dRotAng) > GEO.EPS_ANG_SMALL and not bBwProj and not EgtExistsInfo( vWall[i].Id, 'ROTATED_DONE') then local ptRotCen = b3Solid:getCenter() EgtRotate( vWall[i].Id, ptRotCen, X_AX(), dRotAng, GDB_RT.GLOB) b3Solid:rotate( ptRotCen, X_AX(), dRotAng) @@ -125,7 +129,7 @@ local function MyProcessInputData() -- inversione local dInvAng = EgtGetInfo( vWall[i].Id, 'INVERTED', 'd') if dInvAng then - if abs( dInvAng - 180) > GEO.EPS_ANG_SMALL and abs( dInvAng + 180) > GEO.EPS_ANG_SMALL and not EgtExistsInfo( vWall[i].Id, 'INVERTED_DONE') then + if abs( dInvAng - 180) > GEO.EPS_ANG_SMALL and abs( dInvAng + 180) > GEO.EPS_ANG_SMALL and not bBwProj and not EgtExistsInfo( vWall[i].Id, 'INVERTED_DONE') then local ptInvCen = b3Solid:getCenter() EgtRotate( vWall[i].Id, ptInvCen, Z_AX(), dInvAng - 180, GDB_RT.GLOB) b3Solid:rotate( ptInvCen, Z_AX(), dInvAng - 180) @@ -134,7 +138,7 @@ local function MyProcessInputData() end -- correzioni per rotazioni non centrate di produzioni TS3 (quasi sempre multipli di 90 deg) local sType = EgtGetInfo( vWall[i].Id, 'TYPE', 's') - if not bProj and dRotAng and dInvAng and sType ~= 'LAYER' then + if not bProj and not bBwProj and dRotAng and dInvAng and sType ~= 'LAYER' then if abs( dInvAng - 0) < GEO.EPS_ANG_SMALL then if abs( dRotAng - 180) < GEO.EPS_ANG_SMALL then vWall[i].PosZ = vWall[i].PosZ - vWall[i].Box:getDimY() diff --git a/UpdateLog.txt b/UpdateLog.txt index 41c98b0..2ce8b15 100644 --- a/UpdateLog.txt +++ b/UpdateLog.txt @@ -1,5 +1,9 @@ ==== Wall Update Log ==== +Versione 3.1c1 (02/04/2026) +- Added : in CleanCorner si gestiscono angoli diversi da 30 +- Fixed : in puliture con sega a catena corrett scelta errata del lato + Versione 2.7k1 (20/11/2025) - Modif : in LapJoint con Q08=1 ora si fanno con milling anche tasche a L cieche da sopra - Fixed : in LapJoint correzione alle lavorazioni inclinate diff --git a/Version.lua b/Version.lua index 16fb06d..12f781a 100644 --- a/Version.lua +++ b/Version.lua @@ -1,6 +1,6 @@ --- Version.lua by Egalware s.r.l. 2026/01/22 +-- Version.lua by Egalware s.r.l. 2026/03/30 -- Gestione della versione di Wall NAME = 'Wall' -VERSION = '3.1a1' +VERSION = '3.1c1' MIN_EXE = '3.1a1'