diff --git a/LuaLibs/ProcessLapJoint.lua b/LuaLibs/ProcessLapJoint.lua index 2375399..2560094 100644 --- a/LuaLibs/ProcessLapJoint.lua +++ b/LuaLibs/ProcessLapJoint.lua @@ -1,4 +1,4 @@ --- ProcessLapJoint.lua by Egaltech s.r.l. 2020/08/24 +-- ProcessLapJoint.lua by Egaltech s.r.l. 2020/08/28 -- Gestione calcolo mezzo-legno per Travi -- 2019/10/08 Agg. gestione OpenPocket. @@ -324,6 +324,44 @@ local function GetTunnelDimension( Proc, nPartId) return dDimMin, dDimMax, dDepth, vtOrtho, nLongIdFace, nSurfInt end +--------------------------------------------------------------------- +local function GetFaceAdj( Proc, nFacInd, dH, dV, bOutLog) + + -- Recupero le facce adiacenti alla principale + local vAdj = EgtSurfTmFacetAdjacencies( Proc.Id, nFacInd)[1] + if not vAdj or #vAdj == 0 then + local sErr = 'Error : main face without adjacencies' + return -1, sErr + end + if bOutLog then + EgtOutLog( 'Adjac=' .. table.concat( vAdj, ','), 3) + end + -- Riordino le dimensioni per avere dH > dV + if dH < dV then + dH, dV = dV, dH + end + -- Cerco una faccia adiacente alla principale sul lato lungo + local nFacAdj + for i = 1, #vAdj do + if vAdj[i] >= 0 then + local _, ptP1, ptP2, _ = EgtSurfTmFacetsContact( Proc.Id, nFacInd, vAdj[i], GDB_ID.ROOT) + local dLen = dist( ptP1, ptP2) + if dLen > 0.5 * dH then + nFacAdj = vAdj[i] + if bOutLog then + EgtOutLog( string.format( 'Adjac=%d Len=%.3f H=%.3f V=%.3f', vAdj[i], dLen, dH, dV), 3) + end + break + end + end + end + if not nFacAdj then + local sErr = 'Error : main face without long adjacent face' + return -1, sErr + end + return nFacAdj +end + --------------------------------------------------------------------- -- Verifica se feature di testa function ProcessLapJoint.IsHeadFeature( Proc, b3Raw, dCurrOvmH) @@ -517,6 +555,9 @@ function ProcessLapJoint.Classify( Proc, b3Raw) else -- dati della faccia local ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, nFacInd, GDB_ID.ROOT) + -- cerco se c'è faccia adiacente + local nFaceAdj = GetFaceAdj( Proc, nFacInd, dH, dV) + local bIsL = ( Proc.Fct == 2 or TestElleShape3( Proc) or TestElleShape4( Proc) == 2) -- verifico se è lavorabile solo dal basso local bDown = ( vtN:getZ() < BD.NZ_MINA) -- se verso il basso, verifico se utilizzabile seconda faccia @@ -524,6 +565,18 @@ function ProcessLapJoint.Classify( Proc, b3Raw) if nFacInd2 and dElev2 < 2 * dElev then local ptC2, vtN2 = EgtSurfTmFacetCenter( Proc.Id, nFacInd2, GDB_ID.ROOT) bDown = ( vtN2:getZ() < BD.NZ_MINB) + elseif not nFacInd2 and bIsL and nFaceAdj > 0 then + local ptC2, vtN2 = EgtSurfTmFacetCenter( Proc.Id, nFaceAdj, GDB_ID.ROOT) + bDown = ( vtN2:getZ() < BD.NZ_MINB) + end + -- verifico se la faccia principale è sottosquadra, ha forma L e anche la faccia adiacente + elseif vtN:getZ() < -10 * GEO.EPS_SMALL and bIsL and nFaceAdj > 0 then + -- box del pezzo + local b3Solid = EgtGetBBoxGlob( EgtGetFirstNameInGroup( nPartId, 'Box') or GDB_ID.NULL, GDB_BB.STANDARD) + -- se il numero di facce > 2 or il box della feature supera una certa distanza dalle teste allora controllo la z della faccia ausiiaria + if Proc.Fct > 2 or ( Proc.Box:getMax():getX() < b3Solid:getMin():getX() - 150) or ( Proc.Box:getMin():getX() > b3Solid:getMax():getX() + 150) then + local ptC2, vtN2 = EgtSurfTmFacetCenter( Proc.Id, nFaceAdj, GDB_ID.ROOT) + bDown = ( vtN2:getZ() < BD.NZ_MINB) end end return true, bDown @@ -821,33 +874,9 @@ end --------------------------------------------------------------------- local function MakeByMill( Proc, nPhase, nRawId, nPartId, nFacInd, rfFac, dH, dV, dElev, bSpecialApp, sMillMaster, nFacInd2, dFacElev2) - -- Recupero le facce adiacenti alla principale - local vAdj = EgtSurfTmFacetAdjacencies( Proc.Id, nFacInd)[1] - if not vAdj or #vAdj == 0 then - local sErr = 'Error : main face without adjacencies' - EgtOutLog( sErr) - return false, sErr - end - EgtOutLog( 'Adjac=' .. table.concat( vAdj, ','), 3) - -- Riordino le dimensioni per avere dH > dV - if dH < dV then - dH, dV = dV, dH - end -- Cerco una faccia adiacente alla principale sul lato lungo - local nFacAdj - for i = 1, #vAdj do - if vAdj[i] >= 0 then - local _, ptP1, ptP2, _ = EgtSurfTmFacetsContact( Proc.Id, nFacInd, vAdj[i], GDB_ID.ROOT) - local dLen = dist( ptP1, ptP2) - if dLen > 0.5 * dH then - nFacAdj = vAdj[i] - EgtOutLog( string.format( 'Adjac=%d Len=%.3f H=%.3f V=%.3f', vAdj[i], dLen, dH, dV), 3) - break - end - end - end - if not nFacAdj then - local sErr = 'Error : main face without long adjacent face' + local nFacAdj, sErr = GetFaceAdj( Proc, nFacInd, dH, dV, true) + if nFacAdj < 0 then EgtOutLog( sErr) return false, sErr end @@ -893,7 +922,7 @@ local function MakeByMill( Proc, nPhase, nRawId, nPartId, nFacInd, rfFac, dH, dV else sMilling = ML.FindMilling( 'LongSmallCut') if not sMilling then - local sErr = 'Error : milling not found in library' + sErr = 'Error : milling not found in library' EgtOutLog( sErr) return false, sErr end @@ -919,7 +948,7 @@ local function MakeByMill( Proc, nPhase, nRawId, nPartId, nFacInd, rfFac, dH, dV local sName = 'Mill_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) local nMchFId = EgtAddMachining( sName, sMilling) if not nMchFId then - local sErr = 'Error adding machining ' .. sName .. '-' .. sMilling + sErr = 'Error adding machining ' .. sName .. '-' .. sMilling EgtOutLog( sErr) return false, sErr end @@ -966,7 +995,7 @@ local function MakeByMill( Proc, nPhase, nRawId, nPartId, nFacInd, rfFac, dH, dV end -- eseguo if not EgtApplyMachining( true, false) then - local _, sErr = EgtGetLastMachMgrError() + _, sErr = EgtGetLastMachMgrError() EgtSetOperationMode( nMchFId, false) return false, sErr end @@ -3111,13 +3140,14 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, bSinglePart) end -- altrimenti lavorazione di svuotatura o contornatura else + local bUseOtherFace -- se orientata verso il basso, verifico l'alternativa if vtN:getZ() < BD.NZ_MINA and nFacInd2 then ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, nFacInd2, GDB_ID.ROOT) nFacInd, nFacInd2 = nFacInd2, nFacInd dFacElev, dFacElev2 = dFacElev2, dFacElev + bUseOtherFace = true end - rfFac, dH, dV = EgtSurfTmFacetMinAreaRectangle( Proc.Id, nFacInd, GDB_ID.ROOT) -- verifico non sia orientata verso il basso local bFaceOk = ( vtN:getZ() >= BD.NZ_MINA) if not bFaceOk then @@ -3125,6 +3155,35 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, bSinglePart) EgtOutLog( sErr) return false, sErr end + rfFac, dH, dV = EgtSurfTmFacetMinAreaRectangle( Proc.Id, nFacInd, GDB_ID.ROOT) + -- se forma a L e la componente in X è maggiore di 60° allora verifico se posso utilizzare la faccia secondaria + if bIsL and abs( vtN:getX()) > 0.866 then + -- se non ho scambiato la faccia + if not bUseOtherFace then + if nFacInd2 then + ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, nFacInd2, GDB_ID.ROOT) + nFacInd, nFacInd2 = nFacInd2, nFacInd + dFacElev, dFacElev2 = dFacElev2, dFacElev + -- altrimenti cerco la faccia secondaria per adiacenza alla principale + else + -- Cerco una faccia adiacente alla principale sul lato lungo + local nFacAdj, sErr = GetFaceAdj( Proc, nFacInd, dH, dV) + if nFacAdj < 0 then + EgtOutLog( sErr) + return false, sErr + end + nFacInd = nFacAdj + dFacElev = BL.GetFaceElevation( Proc.Id, nFacInd) + ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, nFacInd, GDB_ID.ROOT) + rfFac, dH, dV = EgtSurfTmFacetMinAreaRectangle( Proc.Id, nFacInd, GDB_ID.ROOT) + end + -- altrimenti se ho già cambiato faccia do errore per impossibilità di lavorazione + else + local sErr = 'Error : impossible to machine by side angle too big that cause collision' + EgtOutLog( sErr) + return false, sErr + end + end -- eventuali tagli preliminari do local bOk, sErr = MakePreCuts( Proc, nPhase, nRawId, nPartId, b3Raw, nChamfer)