diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 1eb46cd..1ffe804 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -49,6 +49,7 @@ -- 2023/09/13 Aggiunta ClassifyTopology per la classificazione topologica delle feature. In CollectFeatures aggiunta la raccolta preliminare di alcune informazioni. -- 2022/09/26 Funzione IsFeatureCuttingEntireSection spostata in BeamLib -- 2022/09/26 In ClassifyTopology aggiunto passaggio del parametro nRawId +-- 2023/10/24 Aggiunta scrittura parametro BARLEN nelle info del mach group -- Tabella per definizione modulo local BeamExec = {} @@ -478,6 +479,15 @@ function BeamExec.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, vBeam, bMachGroup -- Impostazione della tavola EgtSetTable( 'Tab') + -- salvo nota con lunghezza grezzo + -- Recupero l'identificativo del gruppo di lavoro corrente + local nMGrpId = EgtGetCurrMachGroup() + -- Lunghezza della barra + local dBarLen = EgtGetInfo( nMGrpId, 'BARLEN', 'd') + if not dBarLen then + EgtSetInfo( nMGrpId, 'BARLEN', dRawL) + end + -- Area tavola local b3Tab = EgtGetTableArea() -- Calcolo posizione estremo TR/BR della tavola rispetto a sua origine in BL diff --git a/LuaLibs/BeamLib.lua b/LuaLibs/BeamLib.lua index 83859fd..adb85e0 100644 --- a/LuaLibs/BeamLib.lua +++ b/LuaLibs/BeamLib.lua @@ -778,13 +778,20 @@ function BeamLib.GetNzLimDownUp( b3Raw, vtN, vtOrtho) else return -0.383 end - elseif b3Raw:getDimZ() < BD.MIN_DIM_HBEAM then + elseif b3Raw:getDimZ() < 300 then -- N_HorAng < 10° if vtN and ( abs( vtN:getY()) < 0.174) then return -0.5 else return -0.259 end + elseif b3Raw:getDimZ() < BD.MIN_DIM_HBEAM then + -- N_HorAng < 10° + if vtN and ( abs( vtN:getY()) < 0.174) then + return -0.342 + else + return -0.259 + end else -- N_HorAng < 10° if vtN and ( abs( vtN:getY()) < 0.174) then diff --git a/LuaLibs/FacesBySaw.lua b/LuaLibs/FacesBySaw.lua index 662dddb..aec4327 100644 --- a/LuaLibs/FacesBySaw.lua +++ b/LuaLibs/FacesBySaw.lua @@ -18,6 +18,7 @@ -- 2023/05/18 Imposto in ogni caso dVzLimDwnUp prima anche di bDownHead. -- 2023/06/14 Aggiunta MakeParallelOne e tolti parametri nForceWorkSide, nForceSCC da MakeOne. -- 2023/09/26 Piccola modifica per Turn su bInvert di MakeOne. +-- 2023/10/24 In MakeOne migliorata gestione taglio con percorso bilinea. Aggiunta funzione GetNameSolidFaceIncludingLine. -- Tabella per definizione modulo local FacesBySaw = {} @@ -140,6 +141,31 @@ function MakeParallelOne( nSurfId, nFacet, sCutting, dSawDiam, nFaceUse, dVzLimD return true, sName, nMchFId end +--------------------------------------------------------------------- +local function GetNameSolidFaceIncludingLine( b3Solid, ptP1Comp, ptP2Comp) + -- se aperto su faccia fronte + if abs( b3Solid:getMin():getY() - ptP1Comp:getY()) < 100 * GEO.EPS_SMALL and abs( b3Solid:getMin():getY() - ptP2Comp:getY()) < 100 * GEO.EPS_SMALL then + return true, 'Front' + -- se aperto su faccia sopra + elseif abs( b3Solid:getMax():getY() - ptP1Comp:getY()) < 100 * GEO.EPS_SMALL and abs( b3Solid:getMax():getY() - ptP2Comp:getY()) < 100 * GEO.EPS_SMALL then + return true, 'Back' + -- se aperto su faccia retro + elseif abs( b3Solid:getMin():getZ() - ptP1Comp:getZ()) < 100 * GEO.EPS_SMALL and abs( b3Solid:getMin():getZ() - ptP2Comp:getZ()) < 100 * GEO.EPS_SMALL then + return true, 'Bottom' + -- se aperto su faccia sotto + elseif abs( b3Solid:getMax():getZ() - ptP1Comp:getZ()) < 100 * GEO.EPS_SMALL and abs( b3Solid:getMax():getZ() - ptP2Comp:getZ()) < 100 * GEO.EPS_SMALL then + return true, 'Top' + -- se aperto su faccia sinistra + elseif abs( b3Solid:getMin():getX() - ptP1Comp:getX()) < 100 * GEO.EPS_SMALL and abs( b3Solid:getMin():getX() - ptP2Comp:getX()) < 100 * GEO.EPS_SMALL then + return true, 'Left' + -- se aperto su faccia destra + elseif abs( b3Solid:getMax():getX() - ptP1Comp:getX()) < 100 * GEO.EPS_SMALL and abs( b3Solid:getMax():getX() - ptP2Comp:getX()) < 100 * GEO.EPS_SMALL then + return true, 'Right' + end + -- se non è sul bordo del solido + return false +end + --------------------------------------------------------------------- function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert) -- se lama con asse parallelo alla faccia, passo alla apposita funzione @@ -202,17 +228,30 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw local vtTg = ptP2 - ptP1 ; vtTg:normalize() local dAllStart = 0 local dAllEnd = 0 + local bIsBiLinea = false + local bCosAngleL1L2 = 0 + local dDist1 = dist( ptP1, ptPm) + local dDist2 = dist( ptP2, ptPm) + -- verifico se la bilinea si trova sul bordo del solido, quindi è una geometria aperta + local nIdSolid = EgtGetParent( EgtGetParent( nSurfId)) + -- recupero ingombro del pezzo + local Ls = EgtGetFirstNameInGroup( nIdSolid, 'Box') + local b3Solid = EgtGetBBoxGlob( Ls or GDB_ID.NULL, GDB_BB.STANDARD) + -- controllo se le linee sono sul bordo della trave, quindi aperte + local bIsL1OnFace = GetNameSolidFaceIncludingLine( b3Solid, ptP1, ptPm) + local bIsL2OnFace = GetNameSolidFaceIncludingLine( b3Solid, ptPm, ptP2) -- se bilinea, scarto la parte più allineata con la direzione ortogonale (se deviazione angolare oltre 20 deg o lunghezza minore di dSawDiam/2 * cos( 20/2)) ma maggiore di un minimo if ( ( ptPm - ptP1) - ( ptPm - ptP1) * vtTg * vtTg):len() > 100 * GEO.EPS_SMALL then + bIsBiLinea = true local vtTg1 = ptPm - ptP1 ; vtTg1:normalize() local vtTg2 = ptP2 - ptPm ; vtTg2:normalize() - local dDist1 = dist( ptP1, ptPm) - local dDist2 = dist( ptP2, ptPm) local dCosMax = 0.951 -- cos( 18°) local dLenMin = 30 local dLenMax = max( 0.5 * dSawDiam * 0.17365 + 1, 2 * dLenMin) --if vtTg1 * vtTg2 < dCosMax or ( dDist1 < dLenMax and dDist1 > dLenMin) or ( dDist2 < dLenMax and dDist2 > dLenMin) then - if vtTg1 * vtTg2 < dCosMax then + + bCosAngleL1L2 = vtTg1 * vtTg2 + if bCosAngleL1L2 < dCosMax then local dOrtho1 = abs( vtTg1 * vtOrthO) local dOrtho2 = abs( vtTg2 * vtOrthO) if dOrtho1 < dOrtho2 or ( abs( dOrtho1 - dOrtho2) < 0.1 and dDist1 > 4 * dDist2) then @@ -267,6 +306,39 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw local dLi2Tang, dLi2Perp, dLo2Tang, dLo2Perp = FacesBySaw.CalcLeadInOutTangGeom( ptP1, ptP2, vtN, dSawDiam/2, vtRef, dCutExtra, b3Box) local dLenLi2 = abs( dLi2Tang) local dLenLo2 = abs( dLo2Tang) + + -- se il lato non lavorato della bilinea è aperto, setto entrata/uscita con la stessa direzione + if bIsBiLinea then + -- angolo tra le due linee + local dAlpha = acos( abs( bCosAngleL1L2)) + -- se ho accorciato ingresso, setto componente tangente e perpendicolare sul percorso di entrata + if abs( dAllStart) > 100 * GEO.EPS_SMALL and bIsL1OnFace then + -- controllo prima che il secondo lato non sia già incluso nella lavorazione del primo + local dDistPtTang = cos( dAlpha) * dDist1 + local dDistPtPerp = abs( sin( dAlpha) * dDist1) + local dDistToCenter = 0.5 * dSawDiam - dDistPtPerp + local dDistPointToCenter = sqrt( dDistPtTang * dDistPtTang + dDistToCenter * dDistToCenter) + -- se distanza al punto è maggiore del raggio lama, significa che non ho già lavorato, quindi calcolo entrata opportunamente + if dDistPointToCenter > 0.5 * dSawDiam then + dLiTang = -dAllStart * cos( dAlpha) + dLiPerp = sin( dAlpha) * dDist1 + end + end + -- se ho accorciato uscita, setto componente tangente e perpendicolare sul percorso di uscita + if abs( dAllEnd) > 100 * GEO.EPS_SMALL and bIsL2OnFace then + -- controllo prima che il secondo lato non sia già incluso nella lavorazione del primo + local dDistPtTang = cos( dAlpha) * dDist2 + local dDistPtPerp = abs( sin( dAlpha) * dDist2) + local dDistToCenter = 0.5 * dSawDiam - dDistPtPerp + local dDistPointToCenter = sqrt( dDistPtTang * dDistPtTang + dDistToCenter * dDistToCenter) + -- se distanza al punto è maggiore del raggio lama, significa che non ho già lavorato, quindi calcolo uscita opportunamente + if dDistPointToCenter > 0.5 * dSawDiam then + dLoTang = -dAllEnd * cos( dAlpha) + dLoPerp = sin( dAlpha) * dDist2 + end + end + end + -- scelgo l'attacco più conveniente (se non taglio praticamente longitudinale) local bLioTang local Ktp = 1.1 diff --git a/LuaLibs/ProcessCut.lua b/LuaLibs/ProcessCut.lua index f8a8677..331e050 100644 --- a/LuaLibs/ProcessCut.lua +++ b/LuaLibs/ProcessCut.lua @@ -22,6 +22,7 @@ -- 2023/08/01 Correzione su offset per taglio doppio di lato. -- 2023/08/01 In caso di pezzi alti su macchina tipo PF i tagli doppi di lato non vengono usati, si usa il metodo standard. -- 2023/09/12 In MakeFromTop abbassato a 590 mm il limite per convertire in LongCut. +-- 2023/10/27 In MakeFromTop corretto massimo materiale in caso di lavorazione da sotto. -- Tabella per definizione modulo local ProcessCut = {} @@ -556,7 +557,7 @@ local function MakeFromTop( sCutting, Proc, nPhase, nRawId, nPartId, dOvmHead, b end -- lavoro la faccia local vtOrthoO - if bFromBottom and dCutV < dMaxVertDepth - BD.CUT_EXTRA and vtN:getZ() > 0 then + if bFromBottom and dCutV < dMaxDepth - BD.CUT_EXTRA and vtN:getZ() > 0 then vtOrthoO = -Z_AX() elseif bHorizCut and ( not bVertCutOk or b3Solid:getDimX() > BD.LEN_SHORT_PART or Proc.AdvTail or ( vtN:getX() > 0 and vtN:getZ() <= 0.708) or ( abs( vtN:getY()) < 0.1 and vtN:getZ() <= 0)) then vtOrthoO = Z_AX() diff --git a/LuaLibs/ProcessLapJoint.lua b/LuaLibs/ProcessLapJoint.lua index b1d4d58..b5ef338 100644 --- a/LuaLibs/ProcessLapJoint.lua +++ b/LuaLibs/ProcessLapJoint.lua @@ -79,6 +79,8 @@ -- 2023/09/27 In MakeMoreFaces e Classify refactoring della gestione scanalatura chiusa. -- 2023/09/27 In MakeLongMoreFaces aggiunto Topology.Classify alla Proc creata. -- 2023/10/03 In MakePocket aggiunto messaggio in caso si rovini il pezzo successivo. +-- 2023/10/25 In LapJoint 2 facce longitudinali faccio di lama solo se taglio completamente. Altrimenti fresa. +-- 2023/10/27 In Lapjoint 2 facce con angolo > 90 deg, se forzata fresa, si svuota la faccia principale e si lavora poi la faccia inclinata. -- Tabella per definizione modulo local ProcessLapJoint = {} @@ -5401,10 +5403,10 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa if not sWarn then sWarn = '' end sWarn = EgtIf( #sWarn > 0, sWarn .. '\n' .. sWarn2, sWarn2) end - -- se ho più di 3 facce e non di forma ad u oppure ho 3 facce e di forma ad u + -- se ho più di 3 facce e non di forma ad u oppure ho 3 facce e di forma ad u oppure groove a 2 facce -- e non sono stati inseriti antischeggia di lama -- controllo se c'è una faccia non ortogonale alla principale e la lavoro con una contornatura o svuotatura - if ( ( Proc.Fct > 3 and not bIsU) or ( Proc.Fct == 3 and bIsU)) and not bMadeASbyBld then + if ( ( Proc.Fct >= 3 and not bIsU) or ( Proc.Fct == 3 and bIsU) or ( Proc.Fct == 2)) and not bMadeASbyBld then -- Recupero le facce adiacenti alla principale local vAdj = EgtSurfTmFacetAdjacencies( Proc.Id, nFacInd)[1] if not vAdj or #vAdj == 0 then @@ -5428,7 +5430,7 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa local ptPs = ( ptP1 + ptP2) / 2 local bOk, sWarn2 bOk, sWarn2 = MachineByMill( Proc, nPhase, nRawId, nPartId, b3Solid, tvtNx, nFacInd, vAdj[i], ptPs, tDimAndRef, - b3Raw, EgtIf( ( Proc.Fct == 3 and bIsU), 0, 2), nUseRoughTool, dAng, sPocketing, sTuuidPk, dFacElev) + b3Raw, EgtIf( ( Proc.Fct == 3 and bIsU) or Proc.Fct == 2, 0, 2), nUseRoughTool, dAng, sPocketing, sTuuidPk, dFacElev) if not bOk then return bOk, sWarn2 end if sWarn2 then if not sWarn then sWarn = '' end @@ -5743,7 +5745,14 @@ function ProcessLapJoint.Make( Proc, nPhase, nRawId, nPartId, dOvmHead) -- leggo i parametri Q per utilizzare la fresa di fianco e/o lama local nUseSideTool = EgtGetInfo( Proc.Id, Q_SIDE_ROUGH_TOOL, 'i') or 0 local bUseBlade = EgtGetInfo( Proc.Id, Q_ANTISPLINT_TYPE, 'i') == 1 - return Long2Cut.Make( Proc, nPhase, nRawId, nPartId, bUseBlade, nUseSideTool) + local bOk, sMyWarn = Long2Cut.Make( Proc, nPhase, nRawId, nPartId, bUseBlade, nUseSideTool) + -- se non sono riuscito a farlo di lama, riprovo con la fresa + if not bOk and bUseBlade then + bUseBlade = false + return Long2Cut.Make( Proc, nPhase, nRawId, nPartId, bUseBlade, nUseSideTool) + else + return bOk, sMyWarn + end -- prima faccia terminale elseif b3Fac1:getDimX() < 1 and abs( vtN2:getX()) < GEO.EPS_SMALL then -- la faccia 0 deve essere quella lunga @@ -5827,7 +5836,14 @@ function ProcessLapJoint.Make( Proc, nPhase, nRawId, nPartId, dOvmHead) if Proc.Box:getDimX() > 0.8 * b3Solid:getDimX() and abs( b3Fac1:getDimX() - b3Fac2:getDimX()) < 50 and abs( b3Fac1:getCenter():getX() - b3Fac2:getCenter():getX()) < 50 then local nUseSideTool = EgtGetInfo( Proc.Id, Q_SIDE_ROUGH_TOOL, 'i') or 0 - return Long2Cut.Make( Proc, nPhase, nRawId, nPartId, bUseBlade, nUseSideTool) + local bOk, sMyWarn = Long2Cut.Make( Proc, nPhase, nRawId, nPartId, bUseBlade, nUseSideTool) + -- se non sono riuscito a farlo di lama, riprovo con la fresa + if not bOk and bUseBlade then + bUseBlade = false + return Long2Cut.Make( Proc, nPhase, nRawId, nPartId, bUseBlade, nUseSideTool) + else + return bOk, sMyWarn + end -- altrimenti else -- verifico se da lavorare con testa da sotto @@ -5838,9 +5854,9 @@ function ProcessLapJoint.Make( Proc, nPhase, nRawId, nPartId, dOvmHead) if VerifyBHSideMill( Proc) then return MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, true) -- se ortogonali e non forzata lama, con fresa - elseif not bUseBlade and bAdj and abs( dAng + 90) < 1 then + elseif not bUseBlade then -- se piccole - if Proc.Box:getDimX() < MAX_MILL_LIN and ( Proc.Box:getDimZ() < MAX_MILL_LIN or Proc.Box:getDimY() < MAX_MILL_LIN) then + if Proc.Box:getDimX() < MAX_MILL_LIN and ( Proc.Box:getDimZ() < MAX_MILL_LIN or Proc.Box:getDimY() < MAX_MILL_LIN) and bAdj and abs( dAng + 90) < 1 then return MakeTwoFacesByMill( Proc, nPhase, nRawId, nPartId, bDownHead) else return MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, true) diff --git a/LuaLibs/ProcessLongCut.lua b/LuaLibs/ProcessLongCut.lua index 6f52027..9af60f7 100644 --- a/LuaLibs/ProcessLongCut.lua +++ b/LuaLibs/ProcessLongCut.lua @@ -30,6 +30,7 @@ -- 2023/05/19 Migliorato calcolo e verifica affondamento per lavorazione con lama con codolo in mezzo. -- 2023/08/01 Ammesso uso lama da sotto fino a N +3deg in verticale. -- 2023/09/26 Modificata chiamata a GetFaceWithMostAdj. +-- 2023/10/24 Migliorata spezzatura taglio passante con due spezzoni -- Tabella per definizione modulo local ProcessLongCut = {} @@ -593,6 +594,11 @@ function ProcessLongCut.Make( Proc, nPhase, nRawId, nPartId, bCustUseBlade, nCus -- recupero l'ingombro del grezzo di appartenenza local b3Raw = EgtGetRawPartBBox( nRawId) local b3Solid = EgtGetBBoxGlob( EgtGetFirstNameInGroup( nPartId, 'Box') or GDB_ID.NULL, GDB_BB.STANDARD) + + -- recupero lunghezza grezzo totale da info sulla macchinata + local dBarLen = EgtGetInfo( EgtGetCurrMachGroup(), 'BARLEN', 'd') + local dOvmHead = b3Raw:getMax():getX() - b3Solid:getMax():getX() + -- dati della faccia local ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, 0, GDB_ID.ROOT) local _, dLen, dWidth = EgtSurfTmFacetMinAreaRectangle( Proc.Id, 0, GDB_ID.ROOT) @@ -1311,8 +1317,18 @@ function ProcessLongCut.Make( Proc, nPhase, nRawId, nPartId, bCustUseBlade, nCus dEndAccDist = min( dEndAccDist, dLen/2) dStartAccDist = dLen - dEndAccDist else - dStartAccDist = dLen/2 - dEndAccDist = dStartAccDist + -- se c'è del grezzo aggiuntivo e, considerando il grezzo mi resta abbastanza materiale per pinzare, allora faccio spezzatura asimmetrica + if BD.MIN_CLAMPING_LEN and ( dBarLen - dLen) > dOvmHead + 100 * GEO.EPS_SMALL and ( dBarLen - dStartAccDist > BD.MIN_CLAMPING_LEN) then + dStartAccDist = dBarLen/2 + dEndAccDist = dLen - dStartAccDist + -- se sono sul fronte, la spezzatura assimmetrica è inversa + if Proc.AffectedFaces.Front then + dStartAccDist, dEndAccDist = dEndAccDist, dStartAccDist + end + else + dStartAccDist = dLen/2 + dEndAccDist = dStartAccDist + end end else nC = 1 @@ -1361,9 +1377,9 @@ function ProcessLongCut.Make( Proc, nPhase, nRawId, nPartId, bCustUseBlade, nCus end -- aggiungo geometria EgtSetMachiningGeometry( {{ Proc.Id, 0}}) - + -- inverto se utensile antiorario per garantire senso di percorrenza migliore + local bInvert = EgtMdbGetCurrMachiningParam( MCH_MP.SPEED) < 0 -- setto workside e eventuale inversione - local bInvert if bInvert then EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.RIGHT) EgtSetMachiningParam( MCH_MP.INVERT, true) diff --git a/LuaLibs/ProcessLongDoubleCut.lua b/LuaLibs/ProcessLongDoubleCut.lua index bc89247..a07c9cf 100644 --- a/LuaLibs/ProcessLongDoubleCut.lua +++ b/LuaLibs/ProcessLongDoubleCut.lua @@ -18,6 +18,8 @@ -- 2023/03/06 Correzione per i casi con lavorazione limitata. -- 2023/03/23 Correzione per caso con doppia lama da sotto. -- 2023/06/07 Sistemazione SCC per macchina TURN +-- 2023/10/24 Migliorata spezzatura taglio passante con due spezzoni +-- 2023/10/25 Se effettivamente un taglio longitudinale e lama non taglia completamente, limito la lavorazione. Altrimenti esco. -- Tabella per definizione modulo local ProcessLong2Cut = {} @@ -311,12 +313,17 @@ end --------------------------------------------------------------------- -- Applicazione della lavorazione function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster, nUseSideToolMaster) - + -- recupero l'ingombro del grezzo di appartenenza + local b3Raw = EgtGetRawPartBBox( nRawId) local b3Solid = EgtGetBBoxGlob( EgtGetFirstNameInGroup( nPartId, 'Box') or GDB_ID.NULL, GDB_BB.STANDARD) -- carico i dati delle face già inserite nelle opportune tabelle local nFaceLimit, tFaceLong, ptC, vtN = IdentifyFaces( Proc) local dLen = Proc.Box:getDimX() + -- recupero lunghezza grezzo totale da info sulla macchinata + local dBarLen = EgtGetInfo( EgtGetCurrMachGroup(), 'BARLEN', 'd') + local dOvmHead = b3Raw:getMax():getX() - b3Solid:getMax():getX() + -- verifico posizione (+1=sopra, -1=sotto, 0=sui lati) local nSide = 0 if vtN[1]:getZ() > 0.0175 and vtN[2]:getZ() > 0.0175 then @@ -811,6 +818,18 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster end -- altrimenti concavo else + -- se effettivamente un taglio longitudinale e lama non taglia completamente, limito la lavorazione. Altrimenti esco. + for k = 1, #vOrd do + if vWidth[vOrd[k]] + BD.CUT_SIC > dMaxDepth then + if not( ProcessLong2Cut.Identify( Proc)) then + return false + else + local sWarn2 = 'Warning in ' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) .. ' : elevation (' .. EgtNumToString( vWidth[vOrd[k]], 1) .. ') bigger than max saw depth (' .. EgtNumToString( dMaxDepth, 1) .. ')' + if not sWarn then sWarn = '' end + sWarn = EgtIf( #sWarn > 0, sWarn .. '\n' .. sWarn2, sWarn2) + end + end + end -- si percorrono i lati alto e basso della faccia for i = 1, nC do -- Posizione braccio portatesta @@ -851,16 +870,27 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster -- ciclo sulle passate local dOffset local dLioPerp + if j == 1 then -- il primo taglio lo faccio completo se angolo interno maggiore di 90 + local dMinOffsBigFace = max( vWidth[vOrd[j]] - dMaxDepth, 0) + -- se la faccia è più grande del massimo materiale lama, allora limito lavorazione + if dMinOffsBigFace > 0 then + dOffset = dMinOffsBigFace -- se angolo interno inferiore di 90° calcolo l'arretramento della lama + un piccolo delta di 0.3 - if dAng < - ( 90 + 10 * GEO.EPS_SMALL) then + elseif dAng < - ( 90 + 10 * GEO.EPS_SMALL) then dOffset = 0.3 + ((dToolThick* vtN[vOrd[1]]) * vtN[vOrd[2]] * vtN[vOrd[2]]):len() else dOffset = 0 end dLioPerp = vWidth[vOrd[j]] + BD.CUT_SIC else -- il secondo ridotto della distanza minima e della componente spessore della lama - dOffset = dDimStrip + ((dToolThick* vtN[vOrd[1]]) - (dToolThick* vtN[vOrd[1]]) * vtN[vOrd[2]] * vtN[vOrd[2]]):len() + local dMinOffsBigFace = max( vWidth[vOrd[j]] - dMaxDepth, 0) + -- se la faccia è più grande del massimo materiale lama, allora limito lavorazione + if dMinOffsBigFace > 0 then + dOffset = dMinOffsBigFace + else + dOffset = dDimStrip + ((dToolThick* vtN[vOrd[1]]) - (dToolThick* vtN[vOrd[1]]) * vtN[vOrd[2]] * vtN[vOrd[2]]):len() + end dLioPerp = vWidth[vOrd[j]] - dOffset + BD.CUT_SIC end local dLioTang = 0 @@ -1048,8 +1078,14 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster dEndAccDist = min( dEndAccDist, dLen/2) dStartAccDist = dLen - dEndAccDist else - dStartAccDist = dLen/2 - dEndAccDist = dStartAccDist + -- se c'è del grezzo aggiuntivo e, considerando il grezzo mi resta abbastanza materiale per pinzare, allora faccio spezzatura asimmetrica + if BD.MIN_CLAMPING_LEN and ( dBarLen - dLen) > dOvmHead + 100 * GEO.EPS_SMALL and ( dBarLen - dStartAccDist > BD.MIN_CLAMPING_LEN) then + dStartAccDist = dBarLen/2 + dEndAccDist = dLen - dStartAccDist + else + dStartAccDist = dLen/2 + dEndAccDist = dStartAccDist + end end else nC = 1 diff --git a/UpdateLog.txt b/UpdateLog.txt index c187f30..5d69ba9 100644 --- a/UpdateLog.txt +++ b/UpdateLog.txt @@ -1,5 +1,11 @@ ==== Beam Update Log ==== +Versione 2.5j2 (27/10/2023) +- Modif : in LapJoint gestito caso groove due facce >90° con fresa, se forzato da parametro Q +- Modif : in LongCut e LongDoubleCut migliorata spezzatura taglio passante con due spezzoni +- Modif : nei tagli di lama migliorata gestione con percorso bilinea +- Modif : in LapJoint 2 facce longitudinali si usa taglio di lama solo se si taglia completamente, altrimenti fresa + Versione 2.5j1 (23/10/2023) - Added : in Process (lancio da EgtCAM5 quindi uso praticamente solo interno) aggiunta possibilità di tenere ordine pezzi in barra come da selezione - Fixed : piccola correzione a Classify di FeatureTopology per casi senza geometria diff --git a/Version.lua b/Version.lua index 153486b..5b2e63c 100644 --- a/Version.lua +++ b/Version.lua @@ -2,5 +2,5 @@ -- Gestione della versione di Beam NAME = 'Beam' -VERSION = '2.5j1' +VERSION = '2.5j2' MIN_EXE = '2.5c1'