-- ProcessLongDoubleCut.lua by Egaltech s.r.l. 2019/08/27 -- Gestione calcolo doppio taglio longitudinale per Travi -- Tabella per definizione modulo local ProcessLong2Cut = {} -- Include require( 'EgtBase') local BL = require( 'BeamLib') EgtOutLog( ' ProcessLongDoubleCut started', 1) -- Dati local BD = require( 'BeamData') local ML = require( 'MachiningLib') --------------------------------------------------------------------- -- Riconoscimento della feature function ProcessLong2Cut.Identify( Proc) return ( Proc.Grp == 0 and Proc.Prc == 12) 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 return true, false end --------------------------------------------------------------------- -- Applicazione della lavorazione function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId) -- dati delle facce local nFc = {0,1} local ptC = {} local vtN = {} ptC[1], vtN[1] = EgtSurfTmFacetCenter( Proc.Id, 0, GDB_ID.ROOT) ptC[2], vtN[2] = EgtSurfTmFacetCenter( Proc.Id, 1, GDB_ID.ROOT) if Proc.Fct == 3 then if abs( vtN[1]:getX()) > 0.5 then nFc = {2,1} ptC[1], vtN[1] = EgtSurfTmFacetCenter( Proc.Id, 2, GDB_ID.ROOT) elseif abs( vtN[2]:getX()) > 0.5 then nFc = {0,2} ptC[2], vtN[2] = EgtSurfTmFacetCenter( Proc.Id, 2, GDB_ID.ROOT) end end 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 --end -- verifico posizione (+1=sopra, -1=sotto, 0=sui lati) local nSide = 0 if vtN[1]:getZ() > -10 * GEO.EPS_SMALL and vtN[2]:getZ() > -10 * GEO.EPS_SMALL then nSide = 1 elseif vtN[1]:getZ() < -10 * GEO.EPS_SMALL and vtN[2]:getZ() < -10 * GEO.EPS_SMALL then nSide = -1 end -- angolo diedro per stabilire se taglio convesso local bInt, ptP1, ptP2, dAng = EgtSurfTmFacetsContact( Proc.Id, nFc[1], nFc[2], GDB_ID.ROOT) local bConvex local bOrtho local ptM if bInt then bConvex = ( dAng >= 0) bOrtho = ( abs( dAng + 90) < 1) ptM = ( ptP1 + ptP2) / 2 else bConvex = true bOrtho = false ptM = ( ptC[1] + ptC[2]) / 2 end -- analisi del taglio local vOrd = {} local vFaceUse = {} if nSide == 1 then vOrd = EgtIf( ptC[1]:getY() < ptM:getY(), { 1, 2}, { 2, 1}) vFaceUse = { BL.GetNearestOrthoOpposite( ptC[1] - ptM), BL.GetNearestOrthoOpposite( ptC[2] - ptM)} elseif nSide == -1 then vOrd = EgtIf( ptC[1]:getY() < ptM:getY(), { 1, 2}, { 2, 1}) vFaceUse = { BL.GetNearestParalOpposite( ptC[1] - ptM), BL.GetNearestParalOpposite( ptC[2] - ptM)} else local bFront = ( vtN[1]:getY() < 0) if bFront then vOrd = EgtIf( ptC[1]:getZ() < ptM:getZ(), { 1, 2}, { 2, 1}) vFaceUse = { BL.GetNearestOrthoOpposite( ptC[1] - ptM), BL.GetNearestOrthoOpposite( ptC[2] - ptM)} else vOrd = EgtIf( ptC[1]:getZ() < ptM:getZ(), { 2, 1}, { 1, 2}) vFaceUse = { BL.GetNearestOrthoOpposite( ptC[1] - ptM), BL.GetNearestOrthoOpposite( ptC[2] - ptM)} end end local vWidth = {} _, _, vWidth[1] = BL.GetFaceHvRefDim( Proc.Id, nFc[1]) _, _, vWidth[2] = BL.GetFaceHvRefDim( Proc.Id, nFc[2]) -- 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 -- 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 -- se facce ortogonali (concave), lavoro solo quella con versore maggiormente verso l'alto local nIni, nFin = 1, 2 if bOrtho then if vtN[vOrd[1]]:getZ() >= vtN[vOrd[2]]:getZ() then nFin = 1 else nIni = 2 end end -- su entrambe le facce for i = nIni, nFin 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 -- 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, nFc[vOrd[i]]}}) -- 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 end -- altrimenti è sotto : lavorazione Long2CutDown else local sWarn -- 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) -- 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, nFc[vOrd[i]]}}) -- 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, true) if vWidth[vOrd[i]] + dAgg > dMaxDepth - BD.COLL_SIC then sWarn = 'Warning in double cut : depth (' .. EgtNumToString( vWidth[vOrd[i]] + dAgg, 1) .. ') bigger than max tool depth (' .. EgtNumToString( dMaxDepth - BD.COLL_SIC, 1) .. ')' end local dDepth = min( dMaxDepth - BD.COLL_SIC, vWidth[vOrd[i]] + dAgg) EgtSetMachiningParam( MCH_MP.DEPTH, dDepth) -- eseguo if not EgtApplyMachining( true, false) then local _, sErr = EgtGetLastMachMgrError() EgtSetOperationMode( nMchFId, false) return false, sErr end end end end return true, sWarn end --------------------------------------------------------------------- return ProcessLong2Cut