From b44b95dcc52587b8f57b8f90e154009997ec9cc7 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Fri, 26 Apr 2019 17:16:29 +0000 Subject: [PATCH] DataBeam : - unificato LongDoubleCut. --- LuaLibs/ProcessLongDoubleCut.lua | 222 +++++++++++++++++++++---------- 1 file changed, 155 insertions(+), 67 deletions(-) diff --git a/LuaLibs/ProcessLongDoubleCut.lua b/LuaLibs/ProcessLongDoubleCut.lua index 591bf62..7fc2c10 100644 --- a/LuaLibs/ProcessLongDoubleCut.lua +++ b/LuaLibs/ProcessLongDoubleCut.lua @@ -1,4 +1,4 @@ --- ProcessLongDoubleCut.lua by Egaltech s.r.l. 2019/04/01 +-- ProcessLongDoubleCut.lua by Egaltech s.r.l. 2019/04/26 -- Gestione calcolo doppio taglio longitudinale per Travi -- Tabella per definizione modulo @@ -23,13 +23,13 @@ end -- Classificazione della feature function ProcessLong2Cut.Classify( Proc) -- verifico le normali delle facce - local nFacetCnt = EgtSurfTmFacetCount( Proc.Id) - for i = 1, nFacetCnt do - local vtN = EgtSurfTmFacetNormVersor( Proc.Id, i-1, GDB_ID.ROOT) - if vtN:getZ() < - 0.707 then - return true, true - end - end + --local nFacetCnt = EgtSurfTmFacetCount( Proc.Id) + --for i = 1, nFacetCnt do + -- local vtN = EgtSurfTmFacetNormVersor( Proc.Id, i-1, GDB_ID.ROOT) + -- if vtN:getZ() < - 0.707 then + -- return true, true + -- end + --end return true, false end @@ -43,13 +43,18 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId) ptC[2], vtN[2] = EgtSurfTmFacetCenter( Proc.Id, 1, GDB_ID.ROOT) local dLen = EgtGetBBoxGlob( Proc.Id, GDB_BB.STANDARD):getDimX() -- verifico che il doppio taglio longitudinale non sia orientato verso il basso - if vtN[1]:getZ() < - 0.707 or vtN[2]:getZ() < - 0.707 then - local sErr = 'Error on process ' .. tostring( Proc.Id) .. ' Longitudinal Double Cut from bottom impossible' - EgtOutLog( sErr) - return false, sErr + --if vtN[1]:getZ() < - 0.707 or vtN[2]:getZ() < - 0.707 then + -- local sErr = 'Error on process ' .. tostring( Proc.Id) .. ' Longitudinal Double Cut from bottom impossible' + -- EgtOutLog( sErr) + -- return false, sErr + --end + -- verifico posizione (+1=sopra, -1=sotto, 0=sui lati) + local nSide = 0 + if vtN[1]:getZ() > 0 and vtN[2]:getZ() > 0 then + nSide = 1 + elseif vtN[1]:getZ() < 0 and vtN[2]:getZ() < 0 then + nSide = -1 end - -- verifico se sopra o sui lati - local bTop = ( vtN[1]:getZ() > 0 and vtN[2]:getZ() > 0) -- angolo diedro per stabilire se taglio convesso local _, ptP1, ptP2, dAng = EgtSurfTmFacetsContact( Proc.Id, 0, 1, GDB_ID.ROOT) local ptM = ( ptP1 + ptP2) / 2 @@ -57,9 +62,12 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId) -- analisi del taglio local vOrd = {} local vFaceUse = {} - if bTop then + if nSide == 1 then vOrd = EgtIf( ptC[1]:getY() < ptM:getY(), { 1, 2}, { 2, 1}) vFaceUse = {[vOrd[1]] = MCH_MILL_FU.ORTHO_BACK, [vOrd[2]] = MCH_MILL_FU.ORTHO_FRONT} + elseif nSide == -1 then + vOrd = EgtIf( ptC[1]:getY() < ptM:getY(), { 1, 2}, { 2, 1}) + vFaceUse = {[vOrd[1]] = MCH_MILL_FU.PARAL_BACK, [vOrd[2]] = MCH_MILL_FU.PARAL_FRONT} else local bFront = ( vtN[1]:getY() < 0) if bFront then @@ -75,54 +83,137 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId) vWidth[vOrd[1]] = 2 * sqrt( vtDiff1:getY() * vtDiff1:getY() + vtDiff1:getZ() * vtDiff1:getZ()) local vtDiff2 = ptC[vOrd[2]] - ptM vWidth[vOrd[2]] = 2 * sqrt( vtDiff2:getY() * vtDiff2:getY() + vtDiff2:getZ() * vtDiff2:getZ()) - -- recupero la lavorazione - local sMilling = ML.FindMilling( 'Long2Cut') - if not sMilling then - local sErr = 'Error on process ' .. tostring( Proc.Id) .. ' milling not found in library' - EgtOutLog( sErr) - return false, sErr - end - -- recupero i dati dell'utensile - local dToolDiam = 0 - local dMaxDepth = 0 - if EgtMdbSetCurrMachining( sMilling) then - local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) - if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then - dToolDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dToolDiam - dMaxDepth = EgtTdbGetCurrToolMaxDepth() or dMaxDepth + + -- Se non è sotto : lavorazione Long2Cut + if nSide ~= - 1 then + -- recupero la lavorazione + local sMilling = ML.FindMilling( 'Long2Cut') + if not sMilling then + local sErr = 'Error on process ' .. tostring( Proc.Id) .. ' milling not found in library' + EgtOutLog( sErr) + return false, sErr end - end - -- determino il numero di parti in cui dividere la lavorazione - local dEndLen = BD.LONGCUT_ENDLEN - if dLen < 2 * dEndLen + BD.LONGCUT_MAXLEN then - dEndLen = dLen / 3 - end - local nC = ceil( ( dLen - 2 * dEndLen) / BD.LONGCUT_MAXLEN) - local dC = 0 - if nC > 0 then dC = ( dLen - 2 * dEndLen) / nC end - nC = nC + 2 - -- ciclo sulle parti - local nM = 0 - for j = 1, nC do - -- su entrambe le facce - for i = 1, 2 do - -- Limitazioni della lavorazione - local nPos = EgtIf( i == 1, j, nC - j + 1) - local dSal = EgtIf( nPos == 1, 0, - dEndLen - ( nPos - 2) * dC) - local dEal = EgtIf( nPos == nC, 0, - dEndLen - ( nC - nPos - 1) * dC) - -- Posizione braccio portatesta - local nSCC = EgtIf( ( j == 1 or j == nC - 1), MCH_SCC.ADIR_XP, MCH_SCC.ADIR_XM) - -- ciclo sulle passate - local nO = 1 - local dStep = 0 - local dAgg = EgtIf( bConvex, 2 * BD.CUT_EXTRA, BD.CUT_EXTRA) - if vWidth[vOrd[i]] + dAgg > dToolDiam then - nO = ceil(( vWidth[vOrd[i]] + dAgg) / dToolDiam) - if nO > 1 then - dStep = ( vWidth[vOrd[i]] + dAgg - dToolDiam) / ( nO - 1) + -- recupero i dati dell'utensile + local dToolDiam = 0 + local dMaxDepth = 0 + if EgtMdbSetCurrMachining( sMilling) then + local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) + if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then + dToolDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dToolDiam + dMaxDepth = EgtTdbGetCurrToolMaxDepth() or dMaxDepth + end + end + -- determino il numero di parti in cui dividere la lavorazione + local dEndLen = BD.LONGCUT_ENDLEN + if dLen < 2 * dEndLen + BD.LONGCUT_MAXLEN then + dEndLen = dLen / 3 + end + local nC = ceil( ( dLen - 2 * dEndLen) / BD.LONGCUT_MAXLEN) + local dC = 0 + if nC > 0 then dC = ( dLen - 2 * dEndLen) / nC end + nC = nC + 2 + -- ciclo sulle parti + local nM = 0 + for j = 1, nC do + -- su entrambe le facce + for i = 1, 2 do + -- Limitazioni della lavorazione + local nPos = EgtIf( i == 1, j, nC - j + 1) + local dSal = EgtIf( nPos == 1, 0, - dEndLen - ( nPos - 2) * dC) + local dEal = EgtIf( nPos == nC, 0, - dEndLen - ( nC - nPos - 1) * dC) + -- Posizione braccio portatesta + local nSCC = EgtIf( ( j == 1 or j == nC - 1), MCH_SCC.ADIR_XP, MCH_SCC.ADIR_XM) + -- ciclo sulle passate + local nO = 1 + local dStep = 0 + local dAgg = EgtIf( bConvex, 2 * BD.CUT_EXTRA, BD.CUT_EXTRA) + if vWidth[vOrd[i]] + dAgg > dToolDiam then + nO = ceil(( vWidth[vOrd[i]] + dAgg) / dToolDiam) + if nO > 1 then + dStep = ( vWidth[vOrd[i]] + dAgg - dToolDiam) / ( nO - 1) + end + end + for k = 1, nO do + -- determino direzione di movimento + local bToLeft = ( i == 1) + -- inserisco le parti di lavorazione + nM = nM + 1 + local sNameF = 'L2C_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) .. '_' .. tostring( nM) + local nMchFId = EgtAddMachining( sNameF, sMilling) + if not nMchFId then + local sErr = 'Error adding machining ' .. sNameF .. '-' .. sMilling + EgtOutLog( sErr) + return false, sErr + end + -- aggiungo geometria + EgtSetMachiningGeometry( {{ Proc.Id, vOrd[i] - 1}}) + -- limito opportunamente la lavorazione + EgtSetMachiningParam( MCH_MP.STARTADDLEN, dSal) + EgtSetMachiningParam( MCH_MP.ENDADDLEN, dEal) + -- imposto posizione braccio porta testa per non ingombrare agli estremi + EgtSetMachiningParam( MCH_MP.SCC, nSCC) + -- imposto uso faccia + EgtSetMachiningParam( MCH_MP.FACEUSE, vFaceUse[vOrd[i]]) + -- imposto lato di lavoro e inversione + EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.LEFT) + EgtSetMachiningParam( MCH_MP.INVERT, false) + -- imposto offset radiale (nullo se concavo) + if k < nO then + EgtSetMachiningParam( MCH_MP.OFFSR, ( nO - k) * dStep) + else + EgtSetMachiningParam( MCH_MP.OFFSR, EgtIf( bConvex, - BD.CUT_EXTRA, 0)) + end + -- eseguo + if not EgtApplyMachining( true, false) then + local _, sErr = EgtGetLastMachMgrError() + EgtSetOperationMode( nMchFId, false) + return false, sErr + end end end - for k = 1, nO do + end + + -- altrimenti è sotto : lavorazione Long2CutDown + else + -- recupero la lavorazione + local sMilling = ML.FindMilling( 'Long2CutDown') + if not sMilling then + local sErr = 'Error on process ' .. tostring( Proc.Id) .. ' milling not found in library' + EgtOutLog( sErr) + return false, sErr + end + -- recupero i dati dell'utensile + local dToolDiam = 0 + local dMaxDepth = 0 + if EgtMdbSetCurrMachining( sMilling) then + local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) + if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then + dToolDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dToolDiam + dMaxDepth = EgtTdbGetCurrToolMaxDepth() or dMaxDepth + end + end + -- aggiuntivo sull'affondamento + local dAgg = EgtIf( bConvex, BD.CUT_EXTRA, 0) + -- determino il numero di parti in cui dividere la lavorazione + local dEndLen = BD.LONGCUT_ENDLEN + if dLen < 2 * dEndLen + BD.LONGCUT_MAXLEN then + dEndLen = dLen / 3 + end + local nC = ceil( ( dLen - 2 * dEndLen) / BD.LONGCUT_MAXLEN) + local dC = 0 + if nC > 0 then dC = ( dLen - 2 * dEndLen) / nC end + nC = nC + 2 + -- ciclo sulle parti + local nM = 0 + for j = 1, nC do + -- su entrambe le facce + for i = 1, 2 do + -- Limitazioni della lavorazione + local nPos = EgtIf( i == 1, j, nC - j + 1) + local dSal = EgtIf( nPos == 1, 0, - dEndLen - ( nPos - 2) * dC) + local dEal = EgtIf( nPos == nC, 0, - dEndLen - ( nC - nPos - 1) * dC) + -- Posizione braccio portatesta + local nSCC = EgtIf( ( j == 1 or j == nC - 1), MCH_SCC.ADIR_XP, MCH_SCC.ADIR_XM) -- determino direzione di movimento local bToLeft = ( i == 1) -- inserisco le parti di lavorazione @@ -145,13 +236,9 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId) EgtSetMachiningParam( MCH_MP.FACEUSE, vFaceUse[vOrd[i]]) -- imposto lato di lavoro e inversione EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.LEFT) - EgtSetMachiningParam( MCH_MP.INVERT, false) - -- imposto offset radiale (nullo se concavo) - if k < nO then - EgtSetMachiningParam( MCH_MP.OFFSR, ( nO - k) * dStep) - else - EgtSetMachiningParam( MCH_MP.OFFSR, EgtIf( bConvex, - BD.CUT_EXTRA, 0)) - end + EgtSetMachiningParam( MCH_MP.INVERT, true) + local dDepth = min( dMaxDepth, vWidth[vOrd[i]] + dAgg) + EgtSetMachiningParam( MCH_MP.DEPTH, dDepth) -- eseguo if not EgtApplyMachining( true, false) then local _, sErr = EgtGetLastMachMgrError() @@ -161,6 +248,7 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId) end end end + return true end