diff --git a/LuaLibs/ProcessStepJoint.lua b/LuaLibs/ProcessStepJoint.lua index 88c0780..cc9bc6c 100644 --- a/LuaLibs/ProcessStepJoint.lua +++ b/LuaLibs/ProcessStepJoint.lua @@ -140,6 +140,112 @@ local function MakeChamfer( Proc, nPhase, nRawId, nPartId, dOvmHead) return true end +--------------------------------------------------------------------- +local function MakePocket( Proc, nPartId, ptPs, vtN, nFaceRef, nDiffWidth, sMchFind, nUseRoughTool, tBHx) + + -- calcolo il elevazione dal punto medio + local dElev + local dLenIn, dLedOut = BL.GetPointDirDepth( nPartId, ptPs, vtN[nFaceRef]) + if dLenIn > 0 then + dElev = dLenIn + elseif dLedOut then + dElev = dLedOut + end + local dCollSic = 2 * BD.COLL_SIC + local sTuuidMstr + -- calcolo il diametro utensile + local dDiamTool + if nUseRoughTool == 1 then + -- se feature passante prendo utensile più grande possibile + if ( Proc.AffectedFaces.Top and Proc.AffectedFaces.Bottom) or ( Proc.AffectedFaces.Front and Proc.AffectedFaces.Back) then + dDiamTool = nil + else + dDiamTool = max( 80, min( tBHx[nFaceRef][1], tBHx[nFaceRef][2])) + end + else + -- se non uso truciolatore prendo il valore dalle dimensioni minime delle facce + dDiamTool = min( tBHx[nFaceRef][1], tBHx[nFaceRef][2]) + end + -- abilitazione lavorazione da sotto (testa da sotto e direzione normale sotto -30deg) + local bTopHead = ( BD.DOWN_HEAD and vtN[nFaceRef]:getZ() > -0.1) + local bDownHead = ( BD.DOWN_HEAD and vtN[nFaceRef]:getZ() < 0.1) + -- recupero la lavorazione + local sPocketing, _, _, bDownHead = ML.FindPocketing( sMchFind.. EgtIf( bDownHead, '_H2', ''), dDiamTool, dElev + dCollSic, nil, bTopHead, bDownHead) + if not sPocketing then + local sErr = 'Error : pocketing not found in library' + EgtOutLog( sErr) + return false, sErr + end + -- recupero il diametro dell'utensile + if EgtMdbSetCurrMachining( sPocketing) then + sTuuidMstr = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) + if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuidMstr) or '') then + dDiamTool = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dDiamTool + end + end + -- inserisco la lavorazione di svuotatura + local sName = 'Pock_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) .. 'F' .. tostring( nFaceRef - 1) + local nMchFId = EgtAddMachining( sName, sPocketing) + if not nMchFId then + local sErr = 'Error adding machining ' .. sName .. '-' .. sPocketing + EgtOutLog( sErr) + return false, sErr + end + -- aggiungo geometria + EgtSetMachiningGeometry( {{ Proc.Id, (nFaceRef-1)}}) + -- imposto uso faccia + EgtSetMachiningParam( MCH_MP.FACEUSE, MCH_MILL_FU.ORTHO_CONT) + -- imposto posizione braccio porta testa + if vtN[nFaceRef]:getY() < GEO.EPS_SMALL then + EgtSetMachiningParam( MCH_MP.SCC, MCH_SCC.ADIR_YM) + else + EgtSetMachiningParam( MCH_MP.SCC, MCH_SCC.ADIR_YP) + end + -- La tasca ha sempre almeno un lato aperto, imposto opportuno attacco + EgtSetMachiningParam( MCH_MP.SUBTYPE, MCH_POCK_SUB.SPIRALIN) + -- imposto elevazione + local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or '' + sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dElev, 1)) + EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes) + if not ML.ApplyMachining( true, false) then + -- provo ad allargare leggermente la tasca + EgtSetMachiningParam( MCH_MP.OFFSR, -0.1) + if not ML.ApplyMachining( true, false) then + local _, sErr = EgtGetLastMachMgrError() + EgtSetOperationMode( nMchFId, false) + return false, sErr + end + end + return true, '', sTuuidMstr +end + +--------------------------------------------------------------------- +local function MachineByMill( Proc, nPhase, nRawId, nPartId, b3Solid, ptC, vtN, nBigInd, nSmaInd, ptPs, tBHx, b3Raw, nDiffWidth, nUseRoughTool, dAng) + + local sMchFind = 'Pocket' + -- se feature é larga come trave imposto openpocket + if nDiffWidth == 0 then + sMchFind = 'OpenPocket' + -- altrimenti se non è passante disabilito il truciolatore + else + nUseRoughTool = 0 + end + -- applico la svuotatura + local bOk, sErr, sTuuidMstr = MakePocket( Proc, nPartId, ptPs, vtN, nBigInd, nDiffWidth, sMchFind, nUseRoughTool, tBHx) + if not bOk then + return bOk, sErr + end + -- se angolo tra le facce maggiore di 90, inserisco la contornatura o svuotatura del lato più corto + if dAng > -90 then + -- applico la svuotatura + local bOk, sErr = MakePocket( Proc, nPartId, ptPs, vtN, nSmaInd, nDiffWidth, sMchFind, nUseRoughTool, tBHx) + if not bOk then + return bOk, sErr + end + end + return true +end + --------------------------------------------------------------------- -- Applicazione della lavorazione al caso due facce local function MakeTwoFaces( Proc, nPhase, nRawId, nPartId, dOvmHead) @@ -156,6 +262,7 @@ local function MakeTwoFaces( Proc, nPhase, nRawId, nPartId, dOvmHead) return false, sErr end -- dati delle facce + local tBHx = {} local ptC = {} local vtN = {} ptC[1], vtN[1] = EgtSurfTmFacetCenter( Proc.Id, 0, GDB_ID.ROOT) @@ -183,11 +290,13 @@ local function MakeTwoFaces( Proc, nPhase, nRawId, nPartId, dOvmHead) end -- recupero i dati dell'utensile local dSawDiam = 400 + local dSawThick = 2 local dMaxDepth = 0 if EgtMdbSetCurrMachining( sCutting) then local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then dSawDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dSawDiam + dSawThick = EgtTdbGetCurrToolParam( MCH_TP.THICK) or dSawThick dMaxDepth = EgtTdbGetCurrToolMaxDepth() or dMaxDepth end end @@ -239,47 +348,58 @@ local function MakeTwoFaces( Proc, nPhase, nRawId, nPartId, dOvmHead) vtRef[2] = vtN[2] ^ vtTg if vtRef[2] * vtN[1] < 0 then vtRef[2] = - vtRef[2] end -- determino quale faccia è più grande - local _, dB1, dH1 = EgtSurfTmFacetMinAreaRectangle( Proc.Id, 0) - local _, dB2, dH2 = EgtSurfTmFacetMinAreaRectangle( Proc.Id, 1) + local rfFac1, dB1, dH1 = EgtSurfTmFacetMinAreaRectangle( Proc.Id, 0) + local rfFac2, dB2, dH2 = EgtSurfTmFacetMinAreaRectangle( Proc.Id, 1) local nBigInd = EgtIf( dB1 * dH1 >= dB2 * dH2, 1, 2) local nSmaInd = 3 - nBigInd - -- calcolo extra taglio - local dCutExtra = dExtraUp - if dAng < -90.5 and dAng > -179.5 then - dCutExtra = - dSawThick / tan( 180 + dAng) + dExtraUp - end - -- verifico se necessari tagli supplementari - local vCuts = DC.GetDice( nAddGrpId, b3Solid, ptC[nBigInd], vtN[nBigInd], false, ptC[nSmaInd], vtN[nSmaInd]) - --DC.PrintOrderCut( vCuts) - if #vCuts > 0 then - -- sistemo posizione nel DB e nome - for i = 1, #vCuts do - for j = 1, #vCuts[i] do - EgtSetName( vCuts[i][j], 'AddCut_' .. tostring( Proc.Id)) - EgtSetInfo( vCuts[i][j], 'TASKID', Proc.TaskId) - end - end - -- eseguo - for i = 1, #vCuts do - -- assegno il modo di tagliare - local vtOrthO = EgtIf( ( i % 2) == 1, vtRef[nSmaInd], vtRef[nBigInd]) - -- lavoro la faccia - for j = 1, #vCuts[i] do - local dLocCutExtra = EgtIf( j == #vCuts[i], dCutExtra - dExtraUp, dCutExtra) - local bOk, sErr = Fbs.MakeOne( vCuts[i][j], 0, sCutting, dSawDiam, vtOrthO, nil, dLocCutExtra, BD.CUT_SIC, 0, 0, 0, nil, b3Raw) - if not bOk then - return bOk, sErr - end - end - end - -- altrimenti, tagli diretti delle facce - else - local bOk, sErr = Fbs.MakeTwo( Proc, nPhase, nRawId, nPartId, dOvmHead, EgtIf( bHead, 'HeadSide', 'TailSide')) + tBHx[1] = {dH1, dV1, rfFac1} + tBHx[2] = {dH2, dV2, rfFac2} + local nUseRoughTool = EgtGetInfo( Proc.Id, 'Q02', 'i') + if nUseRoughTool == 1 and dAng < -0.1 and dAng > -90 then + local bOk, sErr = MachineByMill( Proc, nPhase, nRawId, nPartId, b3Solid, ptC, vtN, nBigInd, nSmaInd, ptPs, tBHx, b3Raw, 0, nUseRoughTool, dAng) if not bOk then return bOk, sErr end + else + -- calcolo extra taglio + local dCutExtra = dExtraUp + if dAng < -90.5 and dAng > -179.5 then + dCutExtra = - dSawThick / tan( 180 + dAng) + dExtraUp + end + -- verifico se necessari tagli supplementari + local vCuts = DC.GetDice( nAddGrpId, b3Solid, ptC[nBigInd], vtN[nBigInd], false, ptC[nSmaInd], vtN[nSmaInd]) + --DC.PrintOrderCut( vCuts) + if #vCuts > 0 then + -- sistemo posizione nel DB e nome + for i = 1, #vCuts do + for j = 1, #vCuts[i] do + EgtSetName( vCuts[i][j], 'AddCut_' .. tostring( Proc.Id)) + EgtSetInfo( vCuts[i][j], 'TASKID', Proc.TaskId) + end + end + -- eseguo + for i = 1, #vCuts do + -- assegno il modo di tagliare + local vtOrthO = EgtIf( ( i % 2) == 1, vtRef[nSmaInd], vtRef[nBigInd]) + -- lavoro la faccia + for j = 1, #vCuts[i] do + local dLocCutExtra = EgtIf( j == #vCuts[i], dCutExtra - dExtraUp, dCutExtra) + local bOk, sErr = Fbs.MakeOne( vCuts[i][j], 0, sCutting, dSawDiam, vtOrthO, nil, dLocCutExtra, BD.CUT_SIC, 0, 0, 0, nil, b3Raw) + if not bOk then + return bOk, sErr + end + end + end + -- altrimenti, tagli diretti delle facce + else + local bOk, sErr = Fbs.MakeTwo( Proc, nPhase, nRawId, nPartId, dOvmHead, EgtIf( bHead, 'HeadSide', 'TailSide')) + if not bOk then + return bOk, sErr + end + end end end + -- eventuale segnalazione ingombro di testa o coda if Proc.Head then local dOffs = b3Raw:getMax():getX() - dOvmHead - Proc.Box:getMin():getX()