diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 3fa0c70..474c150 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -1,4 +1,4 @@ --- BeamExec.lua by Egaltech s.r.l. 2020/07/29 +-- BeamExec.lua by Egaltech s.r.l. 2020/09/24 -- Libreria esecuzione lavorazioni per Travi -- 2019/07/11 Aggiunta gestione stato rotazione di feature per TS3. -- 2019/09/04 Corretto controllo feature di testa e coda con sovramateriale di testa elevato. @@ -564,7 +564,7 @@ local function ClassifyFeatures( vProc, b3Raw, Stats) bOk, bDown = Cut.Classify( Proc, b3Raw) -- se doppio taglio elseif DoubleCut.Identify( Proc) then - bOk, bDown = DoubleCut.Classify( Proc) + bOk, bDown = DoubleCut.Classify( Proc, b3Raw) -- se taglio longitudinale elseif LongCut.Identify( Proc) then bOk, bDown = LongCut.Classify( Proc) @@ -737,13 +737,8 @@ local function AddFeatureMachining( Proc, nPhase, nRawId, nPartId, dCurrOvmH, bN bOk, sErr = Cut.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH) -- se doppio taglio ( 1/2-011-X) elseif DoubleCut.Identify( Proc) then - -- se due facce, eseguo doppio taglio - if Proc.Fct == 2 then - bOk, sErr = DoubleCut.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH) - -- altrimenti eseguo singolo taglio - else - bOk, sErr = Cut.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH) - end + -- esecuzione doppio taglio + bOk, sErr = DoubleCut.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH) -- se taglio longitudinale ( 0/3/4-010-X) elseif LongCut.Identify( Proc) then -- esecuzione taglio longitudinale diff --git a/LuaLibs/DiceCut.lua b/LuaLibs/DiceCut.lua index 52ffec7..fd202c2 100644 --- a/LuaLibs/DiceCut.lua +++ b/LuaLibs/DiceCut.lua @@ -147,8 +147,10 @@ local function GetOrtoCutCenter( FacetId, ptC, vtN, vtO, dOffsetEff, dNzLimDwnUp local dLen = Box:getDimX() local dWidth = Box:getDimY() - -- se faccia con un lato piccolo e non diretta troppo verso il basso, non servono dice - if ( dLen < dOffsetEff + 1.0 or dWidth < dOffsetEff + 1.0) and vtN:getZ() > dNzLimDwnUp then + -- se faccia non troppo lunga, con un lato piccolo e non diretta troppo verso il basso, non servono dice + local dMaxLen = BD.MAX_LEN_DICE or 600 + if dLen < dMaxLen and dWidth < dMaxLen and + ( dLen < dOffsetEff + 1.0 or dWidth < dOffsetEff + 1.0) and vtN:getZ() > dNzLimDwnUp then return nil, nil, nil end diff --git a/LuaLibs/ProcessCut.lua b/LuaLibs/ProcessCut.lua index 1ffcfd3..ea81c37 100644 --- a/LuaLibs/ProcessCut.lua +++ b/LuaLibs/ProcessCut.lua @@ -1,4 +1,4 @@ --- ProcessCut.lua by Egaltech s.r.l. 2020/09/22 +-- ProcessCut.lua by Egaltech s.r.l. 2020/09/24 -- Gestione calcolo singoli tagli di lama per Travi -- Tabella per definizione modulo @@ -38,8 +38,7 @@ function ProcessCut.Classify( Proc, b3Raw) local _, DimH, DimV = BL.GetFaceHvRefDim( Proc.Id, 0) -- confronto anche qua la distanza maggiore della faccia con la massima distanza del DiceCut -- e se il rapporto supera il 2 (implica che genera 3 tagli) dichiaro impossibile la lavorazione - if DimH and BD.MAX_DIM_DICE and abs(BD.MAX_DIM_DICE) > 20 * GEO.EPS_SMALL and - abs( DimH / BD.MAX_DIM_DICE) > 2 then + if DimH and BD.MAX_DIM_DICE and abs( BD.MAX_DIM_DICE) > 20 * GEO.EPS_SMALL and abs( DimH / BD.MAX_DIM_DICE) > 2 then return true, true end end @@ -266,7 +265,17 @@ function ProcessCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bFromBottom) if #vCuts[i-1] > 0 then vtO = EgtSurfTmFacetNormVersor( vCuts[i-1][1], 0, GDB_ID.ROOT) elseif vCuts[i+1] and #vCuts[i+1] > 0 then - vtO = EgtSurfTmFacetNormVersor( vCuts[i+1][1], 0, GDB_ID.ROOT) + -- lunghezza faccia nell'eventuale direzione ortogonale + local asseX = EgtSurfTmFacetNormVersor( vCuts[i+1][1], 0, GDB_ID.ROOT) + local asseY = asseX ^ vtN + local Frame = Frame3d( ptC, ptC + asseX, ptC + asseY) + local b3Fac = EgtGetBBoxRef( vCuts[i][1], GDB_BB.STANDARD, Frame) + -- se lunghezza inferiore al limite, accetto la direzione + if b3Fac:getDimX() < dMaxDepth - BD.CUT_EXTRA then + vtO = asseX + else + bNoPerpCuts = true + end else bNoPerpCuts = true end @@ -288,7 +297,7 @@ function ProcessCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bFromBottom) end -- lavoro la faccia for j = 1, #vCuts[i] do - -- se taglio dal basso + -- se taglio dal basso if bDownCut then -- se strato pari composto da 1 o 2 elementi if ( i % 2) == 0 and #vCuts[i] <= 2 then @@ -328,27 +337,40 @@ function ProcessCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bFromBottom) end -- altrimenti tagli diretti della faccia else + -- tagli molto di lato e inclinati sono permessi fino a -45deg + if abs( vtN:getX()) < 0.5 then dNzLimDwnUp = -0.707 end -- lavoro la faccia local vtOrthoO if bFromBottom and dCutV < dMaxDepth - BD.CUT_EXTRA and vtN:getZ() > 0 then vtOrthoO = -Z_AX() elseif bHorizCut then vtOrthoO = Z_AX() - elseif Proc.Head and abs( vtN:getY()) > 0.259 and vtN:getZ() > -0.174 and abs( vtN:getY()) > abs( vtN:getZ()) and dCutH < dMaxDepth + 10 * GEO.EPS_SMALL then - vtOrthoO = X_AX() - elseif Proc.Tail and abs( vtN:getY()) > 0.259 and vtN:getZ() > -0.174 and abs( vtN:getY()) > abs( vtN:getZ()) and dCutH < dMaxDepth + 10 * GEO.EPS_SMALL then - vtOrthoO = -X_AX() - elseif vtN:getY() > -0.02 then - if not Proc.Head then - vtOrthoO = -Y_AX() + elseif b3Solid:getDimX() < BD.LEN_SHORT_PART and abs( vtN:getY()) > 0.259 and vtN:getZ() > -0.174 and abs( vtN:getY()) > abs( vtN:getZ()) and dCutH < dMaxDepth + 10 * GEO.EPS_SMALL then + if Proc.Head then + vtOrthoO = X_AX() else + vtOrthoO = -X_AX() + end + elseif vtN:getZ() < dNzLimDwnUp and abs( vtN:getY()) > 0.259 and abs( vtN:getY()) > abs( vtN:getZ()) and dCutH < dMaxDepth + 10 * GEO.EPS_SMALL then + if Proc.Head then + vtOrthoO = X_AX() + else + vtOrthoO = -X_AX() + end + elseif vtN:getY() > -0.02 then + if Proc.Head then vtOrthoO = Y_AX() + else + vtOrthoO = -Y_AX() end else - vtOrthoO = -Y_AX() + if Proc.Head then + vtOrthoO = Y_AX() + else + vtOrthoO = -Y_AX() + end end - -- tagli molto di lato e inclinati sono permessi fino a -45deg - if abs( vtN:getX()) < 0.5 then dNzLimDwnUp = -0.707 end + -- taglio local bOk, sErr = BL.MakeOneFaceBySaw( Proc.Id, 0, sCutting, dSawDiam, vtOrthoO, dNzLimDwnUp, BD.CUT_EXTRA, BD.CUT_SIC, 0, 0, nil, b3Raw) if not bOk then return bOk, sErr diff --git a/LuaLibs/ProcessDoubleCut.lua b/LuaLibs/ProcessDoubleCut.lua index ab30ed3..5eccc47 100644 --- a/LuaLibs/ProcessDoubleCut.lua +++ b/LuaLibs/ProcessDoubleCut.lua @@ -1,4 +1,4 @@ --- ProcessDoubleCut.lua by Egaltech s.r.l. 2020/09/15 +-- ProcessDoubleCut.lua by Egaltech s.r.l. 2020/09/24 -- Gestione calcolo doppi tagli di lama per Travi -- Tabella per definizione modulo @@ -25,20 +25,27 @@ end --------------------------------------------------------------------- -- Classificazione della feature -function ProcessDoubleCut.Classify( Proc) - -- numero delle facce - local nFacetCnt = EgtSurfTmFacetCount( Proc.Id) - -- se due facce, verifico se convesso - local bConvex = true - if nFacetCnt == 2 then - local bAdj, _, _, dAng = EgtSurfTmFacetsContact( Proc.Id, 0, 1, GDB_ID.ROOT) - bConvex = not bAdj or ( dAng > 0) - end - -- verifico le normali delle facce - for i = 1, nFacetCnt do - local vtN = EgtSurfTmFacetNormVersor( Proc.Id, i-1, GDB_ID.ROOT) - if not bConvex and ( vtN:getZ() < - 0.72 or ( vtN:getZ() < - 0.259 and Proc.Box:getDimX() > BD.MAX_DIM_DICE)) then - return true, true +function ProcessDoubleCut.Classify( Proc, b3Raw) + --se una faccia, uso la classificazione dei tagli singoli + if Proc.Fct == 1 then return Cut.Classify( Proc, b3Raw) end + -- verifico se convesso + local bAdj, _, _, dAng = EgtSurfTmFacetsContact( Proc.Id, 0, 1, GDB_ID.ROOT) + local bConvex = ( not bAdj or ( dAng > 0)) + if bConvex then return true, false end + -- verifico le normali delle facce per tagli da sotto + local dNzLimDwnUp = BL.GetNzLimDownUp( b3Raw) + for i = 1, 2 do + local ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, i-1, GDB_ID.ROOT) + local bDownCut = ( vtN:getZ() <= dNzLimDwnUp) + if bDownCut then + -- dimensione della faccia perpendicolare alla linea di intersezione tra le facce + local vtN2 = EgtSurfTmFacetNormVersor( Proc.Id, 2-i, GDB_ID.ROOT) + local vtX = vtN2 ^ vtN + local frRef = Frame3d( ptC, ptC + 100 * vtX, ptC + 100 * vtN2) + local b3Ref = EgtSurfTmGetFacetBBoxRef( Proc.Id, i-1, GDB_BB.STANDARD, frRef) + if b3Ref:getDimY() > BD.MAX_DIM_DICE then + return true, true + end end end return true, false @@ -134,6 +141,8 @@ end --------------------------------------------------------------------- -- Applicazione della lavorazione function ProcessDoubleCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead) + -- se singola faccia, passo a quella lavorazione + if Proc.Fct == 1 then return Cut.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH) end -- ingombro del grezzo local b3Raw = EgtGetRawPartBBox( nRawId) -- ingombro del pezzo diff --git a/LuaLibs/ProcessDrill.lua b/LuaLibs/ProcessDrill.lua index 1d07524..02adcc8 100644 --- a/LuaLibs/ProcessDrill.lua +++ b/LuaLibs/ProcessDrill.lua @@ -1,4 +1,4 @@ --- ProcessDrill.lua by Egaltech s.r.l. 2020/09/16 +-- ProcessDrill.lua by Egaltech s.r.l. 2020/09/24 -- Gestione calcolo forature per Travi -- Tabella per definizione modulo @@ -203,7 +203,7 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId) local sErr = 'Error : drilling not found in library' EgtOutLog( sErr) return false, sErr - -- altrimenti rifaccio la ricerca foratura senza passare altezza uensile + -- altrimenti rifaccio la ricerca foratura senza passare altezza utensile else dCheckDepth = nil sDrilling, nType, dMaxDepth, dMaxToolLength, dToolDiam, dDiamTh = ML.FindDrilling( dDiam) @@ -242,12 +242,12 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId) local dSubL1 = 0 local dSubL2 = 0 local dSubL3 = 0 - -- se foro su testa o coda e inclinato, limito il massimo affondamento + -- se foro non su testa o coda e inclinato, limito il massimo affondamento if not ( ( Proc.Fcs == 5 or Proc.Fcs == 6) or ( bToInvert and ( Proc.Fce == 5 or Proc.Fce == 6))) then local CosB = abs( vtExtr:getX()) if CosB < BD.DRILL_VX_MAX then local TgA = CosB / sqrt( 1 - CosB * CosB) - dSubL1 = ( dDiamTh - dToolDiam) / 2 * TgA + dSubL1 = ( dDiamTh / 2 + 2) * TgA else dMaxDepth = 0 end @@ -257,7 +257,7 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId) local CosB = abs( vtExtr:getZ()) if CosB < BD.DRILL_VX_MAX then local TgA = CosB / sqrt( 1 - CosB * CosB) - dSubL2 = ( dDiamTh - dToolDiam) / 2 * TgA + dSubL2 = ( dDiamTh / 2 + 2) * TgA else dMaxDepth = 0 end @@ -267,7 +267,7 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId) local CosB = abs( vtExtr:getY()) if CosB < BD.DRILL_VX_MAX then local TgA = CosB / sqrt( 1 - CosB * CosB) - dSubL3 = ( dDiamTh - dToolDiam) / 2 * TgA + dSubL3 = ( dDiamTh / 2 + 2) * TgA else dMaxDepth = 0 end diff --git a/LuaLibs/ProcessDtTenon.lua b/LuaLibs/ProcessDtTenon.lua index 7c44dd2..7877667 100644 --- a/LuaLibs/ProcessDtTenon.lua +++ b/LuaLibs/ProcessDtTenon.lua @@ -249,8 +249,8 @@ function ProcessDtTenon.Make( Proc, nPhase, nRawId, nPartId, dOvmHead) dMaxDist = 2 * ( b3DtTen:getRadius() - b3DtAux:getRadius()) end EgtOutLog( 'MaxDist=' .. EgtNumToString( dMaxDist, 3), 3) - -- Cicli di lavorazione (max 5) - local MAX_PASS = 5 + -- Cicli di lavorazione (max 6) + local MAX_PASS = 6 local nStep = min( ceil( dMaxDist / ( 0.7 * dTDiam)), MAX_PASS) local dStep = min( dMaxDist, 0.7 * dTDiam * MAX_PASS) / nStep for i = nStep, 1, -1 do diff --git a/LuaLibs/ProcessTenon.lua b/LuaLibs/ProcessTenon.lua index 0976426..253b715 100644 --- a/LuaLibs/ProcessTenon.lua +++ b/LuaLibs/ProcessTenon.lua @@ -247,8 +247,8 @@ function ProcessTenon.Make( Proc, nPhase, nRawId, nPartId, dOvmHead) dTenH = dMaxDepth EgtOutLog( sWarn .. ' (process ' .. tostring( Proc.Id) .. ')') end - -- determino il numero di passate concentriche (max 5) - local MAX_PASS = 5 + -- determino il numero di passate concentriche (max 6) + local MAX_PASS = 6 local nPass = min( ceil( dPockL / ( 0.7 * dMillDiam)), MAX_PASS) local dStep = min( dPockL, 0.7 * dMillDiam * MAX_PASS) / nPass for i = nPass, 1, -1 do