diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index d9eeb9a..a1732f6 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -35,8 +35,9 @@ -- 2022/08/01 Tolleranza su sezione portata a 0.1 mm (100 * GEO.EPS_SMALL). -- 2022/08/08 Modifica per macchine senza BD.MAX_WIDTH2 e BD.MAX_HEIGHT2. -- 2022/08/18 Aggiunta gestione macchine con testa da sotto con lama da sotto disabilitata. --- 2022/09/21 Nella funzione di ordinamento il foro del birdsmouth viene sempre fatto prima della lavorazione stessa -- 2022/09/28 I fori vengono sempre fatti prima delle tacche. +-- 2022/09/29 Aggiunta la ricerca di feature specchiate, al momento solo per DtMortise, con le relative funzioni. + -- Tabella per definizione modulo local BeamExec = {} @@ -1368,6 +1369,109 @@ local function MoveDrillsOnTenon( vProc) end end +------------------------------------------------------------------------------------------------------------- +-- Estrazione parametri P da lavorazioni di tipo DtMortise +local function GetPParametersDtMortise( Proc) + local vPParameters = { + { 'P01', 'd'}, + { 'P02', 'd'}, + { 'P03', 'd'}, + { 'P04', 'i'}, + { 'P05', 'i'}, + { 'P06', 'd'}, + { 'P07', 'd'}, + { 'P09', 'd'}, + { 'P10', 'd'}, + { 'P11', 'd'}, + { 'P12', 'd'}, + { 'P13', 'd'}, + { 'P14', 'd'}, + { 'P15', 'd'} + } + for i = 1, #vPParameters do + vPParameter = vPParameters[i] + vPParameter[3] = EgtGetInfo( Proc.Id, vPParameter[1], vPParameter[2]) + end + return vPParameters +end + +------------------------------------------------------------------------------------------------------------- +-- Controlla se la feature ProcMirror รจ la specchiata di Proc, per feature di tipo DtMortise +local function CheckMirrorDtMortise( Proc, ProcMirror, dHBeam) + local bIsMirror = true + local vPParametersProc = GetPParametersDtMortise( Proc) + local vPParametersMirror = GetPParametersDtMortise( ProcMirror) + local nP02, nP06 = 2, 6 + -- controllo che i parametri P delle due feature, tranne P02 e P06, siano uguali + for i = 1, #vPParametersProc do + local vPParameterProc = vPParametersProc[i] + local vPParameterMirror = vPParametersMirror[i] + if vPParameterProc[1] ~= 'P02' and vPParameterProc[1] ~= 'P06'then + bIsMirror = ( abs( vPParameterProc[3] - vPParameterMirror[3]) < 100 * GEO.EPS_SMALL) + if bIsMirror == false then break end + elseif vPParameterProc[1] == 'P02' then + nP02 = i + elseif vPParameterProc[1] == 'P06' then + nP06 = i + end + end + -- se gli altri parametri P sono uguali, verifico che P02 e P06 siano compatibili con feature specchiate + if bIsMirror == true then + bIsMirror = ( ( vPParametersProc[nP02][3] == 0 and abs( vPParametersMirror[nP02][3] - dHBeam) < 100 * GEO.EPS_SMALL) and + ( vPParametersProc[nP06][3] == 90 and vPParametersMirror[nP06][3] == -90)) or + ( ( vPParametersMirror[nP02][3] == 0 and abs( vPParametersProc[nP02][3] - dHBeam) < 100 * GEO.EPS_SMALL) and + ( vPParametersMirror[nP06][3] == 90 and vPParametersProc[nP06][3] == -90)) + end + return bIsMirror +end + +------------------------------------------------------------------------------------------------------------- +-- Cerca se esiste una feature specchiata di Proc e nel caso ne restituisce la posizione in vProc +local function FindMirrorFeature( vProc, Proc, sFeatureType, dHBeam) + local nProcMirror + -- se mortasa a coda di rondine + if sFeatureType == 'DtMortise' then + Proc.Side = EgtGetInfo( Proc.Id, 'SIDE', 'i') + if Proc.Side == 1 or Proc.Side == 3 then + for i = 1, #vProc do + local ProcMirror = vProc[i] + if DtMortise.SideIdentify(ProcMirror) then + ProcMirror.Side = EgtGetInfo( ProcMirror.Id, 'SIDE', 'i') + if ( Proc.Side == 1 and ProcMirror.Side == 3) or ( Proc.Side == 3 and ProcMirror.Side == 1) then + local bIsMirror = CheckMirrorDtMortise( Proc, ProcMirror, dHBeam) + if bIsMirror then nProcMirror = i end + end + end + end + end + end + -- se foratura (da implementare) + return nProcMirror +end + +------------------------------------------------------------------------------------------------------------- +-- Cerca in vProc la presenza di feature specchiate. Se le trova scrive in Proc e nelle info l'Id della specchiata. +local function SetMirroredFeatures( vProc, dHBeam) + for i = 1, #vProc do + local Proc = vProc[i] + local sFeatureType + if DtMortise.SideIdentify(Proc) then + sFeatureType = 'DtMortise' + elseif Drill.Identify(Proc) then + sFeatureType = 'Drill' + end + if ( sFeatureType == 'DtMortise' or sFeatureType == 'Drill') and not Proc.MirrorId then + local nProcMirror = FindMirrorFeature( vProc, Proc, sFeatureType, dHBeam) + if nProcMirror then + Proc.MirrorId = vProc[nProcMirror].Id + vProc[nProcMirror].MirrorId = Proc.Id + EgtSetInfo( Proc.Id, 'MIRRORID', vProc[nProcMirror].Id) + EgtSetInfo( vProc[nProcMirror].Id, 'MIRRORID', Proc.Id) + end + end + end +end + ------------------------------------------------------------------------------------------------------------- -- verifica se ci sono forature da lavorare dopo tagli di testa o coda e nel caso le classifica come Head o Tail e gli assegna l'Id della rispettiva feature di taglio local function SetDrillingsToMachineAfterHeadOrTailCut( vProc, vMachineBeforeIntersectingDrillings) @@ -1462,6 +1566,11 @@ function BeamExec.ProcessFeatures() if BD.IMPROVE_HEAD_TAIL_DRILLINGS then SetDrillingsToMachineAfterHeadOrTailCut( vProc, vMachineBeforeIntersectingDrillings) end + -- verifica presenza di feature specchiate per eventuali lavorazioni simultanee + local bConcurrentDoubleHead = BD.DOUBLE_HEAD_MIRRORED_FEATURES and ( BD.TWO_EQUAL_HEADS or BD.TWO_UP_DOWN_HEADS) + if bConcurrentDoubleHead then + SetMirroredFeatures( vProc, EgtGetRawPartBBox( nRawId):getDimZ()) + end -- le ordino lungo X OrderFeatures( vProc, b3Raw) -- le classifico diff --git a/LuaLibs/ProcessDtMortise.lua b/LuaLibs/ProcessDtMortise.lua index def01c1..e7ebb09 100644 --- a/LuaLibs/ProcessDtMortise.lua +++ b/LuaLibs/ProcessDtMortise.lua @@ -7,6 +7,7 @@ -- 2021/12/01 Se frontale aggiungo taglio con Grp e Proc di vero taglio (per aggiornare ingombro di testa /coda). -- 2022/06/01 Modifiche per evitare di entrare nel legno con mortase parziali. -- 2022/08/18 Migliorato calcolo dello step. +-- 2022/09/29 Aggiunto riconoscimento della sola feature laterale. -- Tabella per definizione modulo local ProcessDtMortise = {} @@ -39,6 +40,12 @@ function ProcessDtMortise.FrontIdentify( Proc) return (( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 56) end +--------------------------------------------------------------------- +-- Riconoscimento della sola feature laterale +function ProcessDtMortise.SideIdentify( Proc) + return (( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 55) +end + --------------------------------------------------------------------- -- Verifica se feature di coda function ProcessDtMortise.IsTailFeature( Proc, b3Raw)