diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 3bc1560..80ebab5 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -443,7 +443,7 @@ local function CalcHeadTailMachBeforeIntersDrillings( vProc, b3Raw) for i = 1, #vProc do local Proc = vProc[i] if Proc.Box and not Proc.Box:isEmpty() then - if Proc.Fct == 1 and BL.IsFeatureCuttingEntireSection( Proc.Box, b3Raw:getDimY(), b3Raw:getDimZ()) and ( Proc.Head or Proc.Tail) and Proc.Prc ~= 350 then + if Proc.Fct == 1 and ( BL.IsFeatureCuttingEntireSection( Proc.Box, b3Raw:getDimY(), b3Raw:getDimZ()) or Cut.Identify( Proc)) and ( Proc.Head or Proc.Tail) and Proc.Prc ~= 350 then if Proc.Head and Proc.Box:getCenter():getX() < dHeadX then dHeadX = Proc.Box:getCenter():getX() nHeadId = Proc.Id @@ -915,6 +915,22 @@ local function ReorderFeatureWithDependency( vProc) table.insert( vProc, nRefIndex, table.remove( vProc, i)) i = max( nRefIndex - 1, 1) end + elseif Drill.Identify( vProc[i]) and vProc[i].Dependency and vProc[i].Dependency.ExecAfter and vProc[i].Dependency.ExecAfter.Id then + local nRefId = vProc[i].Dependency.ExecAfter.Id + local nRefIndex + + for j = 1, #vProc do + if i ~= j and vProc[j].Id == nRefId then + nRefIndex = j + break + end + end + + -- se il processo deve stare dopo, ma ora è prima + if nRefIndex and nRefIndex > i then + table.insert( vProc, nRefIndex, table.remove( vProc, i)) + i = max( nRefIndex - 1, 1) + end end i = i + 1 end diff --git a/LuaLibs/ProcessLapJoint.lua b/LuaLibs/ProcessLapJoint.lua index 17646f2..f507527 100644 --- a/LuaLibs/ProcessLapJoint.lua +++ b/LuaLibs/ProcessLapJoint.lua @@ -1004,7 +1004,7 @@ end --------------------------------------------------------------------- -- Lavorazione con fresa --------------------------------------------------------------------- -local function MakeOneFaceByMill( Proc, nPhase, nRawId, nPartId) +local function MakeOneFaceByMill( Proc, nPhase, nRawId, nPartId, nForcedFacInd, nSideInd) -- recupero l'ingombro del grezzo di appartenenza local b3Raw = EgtGetRawPartBBox( nRawId) -- recupero l'ingombro della trave @@ -1015,13 +1015,16 @@ local function MakeOneFaceByMill( Proc, nPhase, nRawId, nPartId) return false, sErr end -- verifico il numero di facce della tacca - assert( ( Proc.Fct == 1), 'Error : MakeOneFaceByMill in LapJoint with ' .. tostring( Proc.Fct) .. ' faces') + if not nForcedFacInd then + assert( ( Proc.Fct == 1), 'Error : MakeOneFaceByMill in LapJoint with ' .. tostring( Proc.Fct) .. ' faces') + nForcedFacInd = 0 + end -- dati della faccia - local ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, 0, GDB_ID.ROOT) + local ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, nForcedFacInd, GDB_ID.ROOT) -- verifico se orientata verso l'alto local bUp = ( vtN:getZ() >= BD.NZ_MINA) -- scelta faccia da lavorare - local nFacInd = 0 + local nFacInd = nForcedFacInd -- recupero la lavorazione local sMilling = ML.FindMilling( 'BirdsMouth') if not sMilling then @@ -1029,6 +1032,16 @@ local function MakeOneFaceByMill( Proc, nPhase, nRawId, nPartId) EgtOutLog( sErr) return false, sErr end + local dTDiam = 50 + local dMaxMat = 0 + if EgtMdbSetCurrMachining( sMilling) then + local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) + if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then + dTDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dTDiam + dMaxMat = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT) or dMaxMat + end + end + dTDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dTDiam -- inserisco la lavorazione di fresatura local sName = 'Mill_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) local nMchFId = EgtAddMachining( sName, sMilling) @@ -1039,8 +1052,17 @@ local function MakeOneFaceByMill( Proc, nPhase, nRawId, nPartId) end -- aggiungo geometria EgtSetMachiningGeometry( {{ Proc.Id, nFacInd}}) - -- imposto uso faccia e lato correzione - if vtN:getX() > 0 then + -- imposto uso faccia e lato correzione se forzate da fuori forzo lavorazione della faccia + if nSideInd and nForcedFacInd then + EgtSetMachiningParam( MCH_MP.FACEUSE, MCH_MILL_FU.NONE) + EgtSetMachiningParam( MCH_MP.ENDADDLEN, -dTDiam / 2) + EgtSetMachiningParam( MCH_MP.STARTADDLEN, -dTDiam / 2) + local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or '' + sUserNotes = EgtSetValInNotes( sUserNotes, 'EdgesFaceUse', EgtNumToString( nSideInd)) + EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes) + EgtSetMachiningParam( MCH_MP.LIPERP, dTDiam / 2) + EgtSetMachiningParam( MCH_MP.LOPERP, dTDiam / 2) + elseif vtN:getX() > 0 then EgtSetMachiningParam( MCH_MP.FACEUSE, EgtIf( bUp, MCH_MILL_FU.ORTHO_LEFT, MCH_MILL_FU.PARAL_LEFT)) else EgtSetMachiningParam( MCH_MP.FACEUSE, EgtIf( bUp, MCH_MILL_FU.ORTHO_RIGHT, MCH_MILL_FU.PARAL_RIGHT)) @@ -4767,7 +4789,7 @@ local function MakeByPockets( Proc, nPhase, nRawId, nPartId, nChamfer, dDepthCha end end end - return 1, sWarn, dDimMin, dDimMax, dDepth, vtOrtho, nLundIdFace, dDiamTool, bDoubleSide, nPathInt, nSurfInt, bOneShot, bMillDown, nFirstMachId + return 1, sWarn, dDimMin, dDimMax, dDepth, vtOrtho, nLundIdFace, dDiamTool, bDoubleSide, nPathInt, nSurfInt, bOneShot, bMillDown, nFirstMachId, nil, sPocketing end end end @@ -7511,14 +7533,34 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa end -- provo con contornatura local dDiamTool = 20 + local nChoosenFacInd = nFacInd2 + local dChoosenFacElev = dFacElev2 if bIsL then local bOk, sErr bOk, sWarn, dDiamTool = MakeByMill( Proc, nPhase, nRawId, nPartId, nFacInd, rfFac, dH, dV, dFacElev, dCollSic, true, sMilling, nFacInd2, dFacElev2) if not bOk then return bOk, sWarn end else - local sErr = 'Error : Impossible mill special LapJoint' - EgtOutLog( sErr) - return false, sErr + -- provo ancora con la pocketing dell'altra faccia + local sPocketing = ML.FindPocketing( sMchFind, dDiam, dFacElev + dCollSic) + if sPocketing then + nChoosenFacInd = nFacInd + dChoosenFacElev = dFacElev + local Edges = BL.GetEdgesInfo( Proc, Proc.Face[nFacInd+1]) + local nSideInd + for i = 1, #Edges do + if Edges[i].AdjacentFaceId == nFacInd2 then + nSideInd = i - 1 + break + end + end + -- se pocketing ok forza facet e spigolo di lavoro + bOk, sWarn = MakeOneFaceByMill( Proc, nPhase, nRawId, nPartId, nFacInd2, nSideInd) + if not bOk then return bOk, sWarn end + else + local sErr = 'Error : Impossible mill special LapJoint' + EgtOutLog( sErr) + return false, sErr + end end -- inserisco la lavorazione di svuotatura local sName = 'Pock_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) @@ -7529,7 +7571,7 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa return false, sErr end -- aggiungo geometria - EgtSetMachiningGeometry( {{ Proc.Id, nFacInd2}}) + EgtSetMachiningGeometry( {{ Proc.Id, nChoosenFacInd}}) -- imposto uso faccia EgtSetMachiningParam( MCH_MP.FACEUSE, MCH_MILL_FU.ORTHO_CONT) -- imposto posizione braccio porta testa @@ -7544,7 +7586,7 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa end -- imposto elevazione local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or '' - sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dFacElev2, 1)) + sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dChoosenFacElev, 1)) EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes) -- eseguo if not ML.ApplyMachining( true, false) then @@ -8068,7 +8110,7 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa bSetOpenBorders = true end nOk, sErr, dDimMin, dDimMax, dDepth, vtOrtho, nLundIdFace, dDiamTool, bDoubleSide, nPathInt, nSurfInt, bOneShot, bMillDown, nFirstMachId, - bOrthoFaces = MakeByPockets( Proc, nPhase, nRawId, nPartId, nChamfer, dDepthCham, nAddGrpId, sMyMchFind, bIs3Faces, b3Solid, bOrthoFacesMaster, bMillDown, bSetOpenBorders, bIsU, bIsL) + bOrthoFaces, sPocketing = MakeByPockets( Proc, nPhase, nRawId, nPartId, nChamfer, dDepthCham, nAddGrpId, sMyMchFind, bIs3Faces, b3Solid, bOrthoFacesMaster, bMillDown, bSetOpenBorders, bIsU, bIsL) if nOk == -3 then bTryWithBlades = true elseif nOk == -2 then @@ -8102,6 +8144,7 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa end -- se abilitato dal parametro Q inserisco pulitura spigoli o contorno con fresa più piccola local nContourSmallTool = EgtGetInfo( Proc.Id, Q_CONTOUR_SMALL_TOOL, 'i') or 0 + local nCleanCorner = EgtGetInfo( Proc.Id, Q_CLEAN_CORNER, 'i') or 0 if nContourSmallTool > 0 then local bOk, sWarn2 = MakeRoundCleanCornerOrContour( Proc, nPhase, nRawId, nPartId, b3Raw, nFacInd, nAddGrpId, dDiamTool, nContourSmallTool, bMillDown, @@ -8113,6 +8156,43 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa sWarn = EgtIf( #sWarn > 0, sWarn .. '\n' .. sWarn2, sWarn2) end end + -- se richiesta pulizia spigoli con fresa a V + if nCleanCorner > 0 then + local dMaxToolMaterial = 0 + if EgtMdbSetCurrMachining( sPocketing) then + local sTuuidPk = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) + if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuidPk) or '') then + dMaxToolMaterial = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT) or dMaxToolMaterial + end + end + local nNewProc + local vtSpec = vtN + if not ( Proc.Fct == 3 and bIsU) then + nNewProc = RemoveBottomFaceAndReorder( Proc, nAddGrpId, nFacInd, vtN) + -- se U passante ricavo vettore da "sopra" con componente Z forzata in positivo + else + nNewProc = EgtCopyGlob( Proc.Id, nAddGrpId) or GDB_ID.NULL + local nNumFacet = EgtSurfTmFacetCount( nNewProc) + -- vettore normale ad una delle facce adiacenti + local vtOther = EgtSurfTmFacetNormVersor( Proc.Id, Proc.Face[nFacInd+1].Adjacencies[1], GDB_ID.ROOT) + -- ricavo vettore verso l'alto (simulo faccia di fondo) + vtSpec = vtN ^ vtOther + -- se negativo in Z forzo positivo + if vtSpec:getZ() < 0 then + vtSpec:mirror(vtSpec) + end + ReorderFaces( nNewProc, nNumFacet, vtSpec) + -- normale della lavorazione clean corner + vtN = vtSpec + end + local vFace, dDepth = GetFacesData( nNewProc, dDiamTool, dMaxToolMaterial, ( dDiamTool/2), nAddGrpId, Proc.PartId, vtN) + local bCleanCornerOk, sCleanCornerWarn = AddMillCorner( vFace, Proc, dDiamTool, nAddGrpId, nNewProc, vtN) + if not bCleanCornerOk then return false, sCleanCornerWarn end + if sCleanCornerWarn then + if not sWarn then sWarn = '' end + sWarn = EgtIf( #sWarn > 0, sWarn .. '\n' .. sCleanCornerWarn, sCleanCornerWarn) + end + end end end bOk = true @@ -8328,7 +8408,26 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa -- se richiesta pulizia spigoli con fresa a V if nCleanCorner > 0 then local dThElev = dToolThDiameter / 2 * sqrt( vtN:getX() * vtN:getX() + vtN:getY() * vtN:getY()) - local nNewProc = RemoveBottomFaceAndReorder( Proc, nAddGrpId, nFacInd, vtN) + local nNewProc + local vtSpec = vtN + if not ( Proc.Fct == 3 and bIsU) then + nNewProc = RemoveBottomFaceAndReorder( Proc, nAddGrpId, nFacInd, vtN) + -- se U passante ricavo vettore da "sopra" con componente Z forzata in positivo + else + nNewProc = EgtCopyGlob( Proc.Id, nAddGrpId) or GDB_ID.NULL + local nNumFacet = EgtSurfTmFacetCount( nNewProc) + -- vettore normale ad una delle facce adiacenti + local vtOther = EgtSurfTmFacetNormVersor( Proc.Id, Proc.Face[nFacInd+1].Adjacencies[1], GDB_ID.ROOT) + -- ricavo vettore verso l'alto (simulo faccia di fondo) + vtSpec = vtN ^ vtOther + -- se negativo in Z forzo positivo + if vtSpec:getZ() < 0 then + vtSpec:mirror(vtSpec) + end + ReorderFaces( nNewProc, nNumFacet, vtSpec) + -- normale della lavorazione clean corner + vtN = vtSpec + end local vFace, dDepth = GetFacesData( nNewProc, dToolDiameter, dMaxToolMaterial, ( dToolDiameter/2), nAddGrpId, Proc.PartId, vtN) local bCleanCornerOk, sCleanCornerWarn = AddMillCorner( vFace, Proc, dToolDiameter, nAddGrpId, nNewProc, vtN) if not bCleanCornerOk then return false, sCleanCornerWarn end diff --git a/UpdateLog.txt b/UpdateLog.txt index 489b829..b4fed34 100644 --- a/UpdateLog.txt +++ b/UpdateLog.txt @@ -1,5 +1,10 @@ ==== Beam Update Log ==== +Versione 3.1f3 (25/06/2026) +- Modif : LapJoint - migliorata gestione BirdsMouth con più di 3 facce +- Modif : Per identificare feature di testa, oltre che verificare se sia troncante, si controlla anche la feature taglio +- Added : LapJoint - CleanCorner per tasche a 3 facce a U + Versione 3.1f2 (18/06/2026) - Added : Gestione svuotature in doppio tipo NT diff --git a/Version.lua b/Version.lua index 7b46ba6..60f155f 100644 --- a/Version.lua +++ b/Version.lua @@ -2,5 +2,5 @@ -- Gestione della versione di Beam NAME = 'Beam' -VERSION = '3.1f2' +VERSION = '3.1f3' MIN_EXE = '3.1b1'