From d9d505fc44e0424ca0dde1166ab85770362ea649 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Tue, 4 Nov 2025 17:40:48 +0100 Subject: [PATCH] =?UTF-8?q?-=20update=20versione=20minima=20Cam5=20-=20in?= =?UTF-8?q?=20BeamExec=20corretto=20il=20calcolo=20di=20nCycles:=20ora=20i?= =?UTF-8?q?l=20calcolo=20dell'inversione=20si=20fa=20solo=20se=20richiesto?= =?UTF-8?q?=20-=20in=20BeamExec=20rimossa=20cancellazione=20entit=C3=A0=20?= =?UTF-8?q?temporanee:=20si=20mette=20tutto=20nel=20gruppo=20idTemp;=20ade?= =?UTF-8?q?guate=20le=20funzioni=20che=20creano=20geometrie=20temporanee?= =?UTF-8?q?=20-=20in=20MachiningLib=20Check2DBladeCollision=20migliorata?= =?UTF-8?q?=20e=20ultimata:=20da=20testare?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LuaLibs/BeamExec.lua | 20 ++-------- LuaLibs/DiceCut.lua | 47 ++++++++++++---------- LuaLibs/MachiningLib.lua | 52 +++++++++++++++---------- Strategies/Standard/STR0002/STR0002.lua | 31 ++++++--------- Strategies/Standard/STR0015/STR0015.lua | 12 +++--- StrategyLibs/BLADETOWASTE.lua | 25 ++++++------ Version.lua | 4 +- 7 files changed, 94 insertions(+), 97 deletions(-) diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 6bb9267..b12cc13 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -1205,7 +1205,8 @@ function BeamExec.GetProcessings( PARTS, bCalcBestPieceUnloadPosition) if not PARTS[nPart].id and PARTS[nPart].b3Raw:getDimX() < BeamData.dMinRaw then break end local vProcRot = {} - local nCycles = EgtIf( bCalcBestPieceUnloadPosition, 2, 1) -- se è prerotazione, oltre al ciclo normale, si devono verificare anche invertiti + -- se è prerotazione, oltre al ciclo normale, si devono verificare anche invertiti + local nCycles = EgtIf( bCalcBestPieceUnloadPosition and PARTS[nPart].GeneralParameters.GEN_sPiecesLoadingPosition ~= 'BTL_POSITION', 2, 1) -- per ogni inversione for nInvertIndex = 1, nCycles do -- per ogni rotazione @@ -1529,7 +1530,7 @@ end function BeamExec.GetCombinationMatrix( PARTS, bCalcBestPieceUnloadPosition) -- ricerca strategia di lavorazione per ogni pezzo e applicazione lavorazioni for nPart = 1, #PARTS do - local nCycles = EgtIf( bCalcBestPieceUnloadPosition, 2, 1) + local nCycles = EgtIf( bCalcBestPieceUnloadPosition and PARTS[nPart].GeneralParameters.GEN_sPiecesLoadingPosition ~= 'BTL_POSITION', 2, 1) -- per ogni inversione for nInvertIndex = 1, nCycles do -- calcolo della migliore strategia per ogni rotazione del pezzo @@ -1703,21 +1704,8 @@ function BeamExec.ProcessMachinings( PARTS) bAllStrategiesApplied = false MACHININGS, bAllStrategiesApplied = CalculateMachinings( vProcHeadTail, PARTS[nPart], MatrixResult.nInitialPosition) - -- cancellazione entità create ma non usate - -- TODO funzione? - local idAddGroup = BeamLib.GetAddGroup( PARTS[nPart].id) - local idCurrentEntity = EgtGetFirstInGroup( idAddGroup or GDB_ID.NULL) - while idCurrentEntity do - if EgtGetLevel( idCurrentEntity) == GDB_LV.TEMP then - local idEntityToDelete = idCurrentEntity - idCurrentEntity = EgtGetNext( idCurrentEntity) - EgtErase( idEntityToDelete) - else - idCurrentEntity = EgtGetNext( idCurrentEntity) - end - end - -- ordinamento lavorazioni + -- TODO sostituire con sorting Egt -- TODO completare ordinamento. Mancano le dipendenze. -- TODO la FinalizeSorting andrebbe rimossa e usato un sorting che non viola le dipendenze MACHININGS = MachiningLib.PrepareMachiningsForSorting( PARTS[nPart]) diff --git a/LuaLibs/DiceCut.lua b/LuaLibs/DiceCut.lua index 0211b3e..7b0bde2 100644 --- a/LuaLibs/DiceCut.lua +++ b/LuaLibs/DiceCut.lua @@ -16,7 +16,7 @@ local BeamData = require( 'BeamData') ---------------------------------------------------------------------------------------------------------------------------------------------------- -- creo i piani paralleli -- GetParallelPlanes: restituisce un vettore con gli indici delle superfici --- nAddGrpId: il layer +-- idAddGroup: il layer -- b3BoxDicing: il grezzo della barra -- ptC: il punto centrale del piano della feature -- vtN: il versore normale del piano della feature @@ -30,7 +30,7 @@ local BeamData = require( 'BeamData') -- vtNCut*: il punto centrale della superfice limitante (se non esistono altre superfici può essere omesso) -- ptCCut1*: il punto centrale della superfice limitante (se non esistono altre superfici può essere omesso) -- vtNCut1*: il punto centrale della superfice limitante (se non esistono altre superfici può essere omesso) -local function GetParallelPlanes( nAddGrpId, b3BoxDicing, ptC, vtN, nCopyPlane, dOffset, nStep, Color, dTolerance, bNoTolOnFirstCut, ptCCut, vtNCut, ptCCut1, vtNCut1 ) +local function GetParallelPlanes( idAddGroup, b3BoxDicing, ptC, vtN, nCopyPlane, dOffset, nStep, Color, dTolerance, bNoTolOnFirstCut, ptCCut, vtNCut, ptCCut1, vtNCut1 ) local ptMyCCut local AreaMin = 5*5 if ptCCut and vtNCut then @@ -46,7 +46,7 @@ local function GetParallelPlanes( nAddGrpId, b3BoxDicing, ptC, vtN, nCopyPlane, local TabellaTmSurfParallel = {} local i = nCopyPlane while i < nStep do - local SurfId = EgtSurfTmPlaneInBBox( nAddGrpId, ptC + ( i * dOffset) * vtN, vtN, b3BoxDicing, GDB_RT.GLOB) + local SurfId = EgtSurfTmPlaneInBBox( idAddGroup, ptC + ( i * dOffset) * vtN, vtN, b3BoxDicing, GDB_RT.GLOB) local nFacet = EgtSurfTmFacetCount( SurfId or GDB_ID.NULL) if nFacet == 0 then -- se sono al primo taglio do una possibilità in più di girare @@ -86,11 +86,11 @@ end ---------------------------------------------------------------------------------------------------------------------------------------------------- -- GetOrderedCutTable: --- nAddGrpId: il layer +-- idAddGroup: il layer -- TabParallelPlanes: tabella delle superfici dei piani paralleli -- TabOrtoPlanes: tabella delle superfici dei piani ortogonali -- stampo l'ordine dei piani di taglio (prima tagli ortogonali piu' esterni poi taglio parallelo collettivo) -local function GetOrderedCutTable( nAddGrpId, TabParallelPlanes, TabOrtoPlanes) +local function GetOrderedCutTable( idAddGroup, TabParallelPlanes, TabOrtoPlanes) local StepParallel = #TabParallelPlanes local StepOrto = #TabOrtoPlanes local TabellaOrderParallelCut1 = {} @@ -99,8 +99,8 @@ local function GetOrderedCutTable( nAddGrpId, TabParallelPlanes, TabOrtoPlanes) TabellaOrderParallelCut1[IndexTmP] = {} for IndexOrto=1, StepOrto do local ptOrtoN, vtNOrtoN = EgtSurfTmFacetCenter( TabOrtoPlanes[IndexOrto ], 0, GDB_ID.ROOT) - local Copy1Id = EgtCopySurfTmFacet( TabParallelPlanes[IndexTmP], 0, nAddGrpId) - local Copy2Id = EgtCopySurfTmFacet( TabParallelPlanes[IndexTmP], 0, nAddGrpId) + local Copy1Id = EgtCopySurfTmFacet( TabParallelPlanes[IndexTmP], 0, idAddGroup) + local Copy2Id = EgtCopySurfTmFacet( TabParallelPlanes[IndexTmP], 0, idAddGroup) if Copy1Id and ptOrtoN then EgtCutSurfTmPlane( Copy1Id, ptOrtoN, -vtNOrtoN, false, GDB_RT.GLOB) EgtCutSurfTmPlane( Copy2Id, ptOrtoN, vtNOrtoN, false, GDB_RT.GLOB) @@ -295,8 +295,8 @@ local function VerifyFirstOrthoCut( CutTable, dOffsetParallel, b3BoxDicing) local dLongSize = x1 + x2 -- se faccia piccola e non orientata verso il basso, elimino ortogonale e unisco le due parti if dLongSize <= dOffsetParallel + 1.0 then - local nAddGrpId = EgtGetParent( Cut1Id) - local SurfId = EgtSurfTmBySewing( nAddGrpId, { Cut1Id, Cut2Id}) + local idAddGroup = EgtGetParent( Cut1Id) + local SurfId = EgtSurfTmBySewing( idAddGroup, { Cut1Id, Cut2Id}) --EgtSetColor( SurfId, Color3d( FUCHSIA(), 60)) EgtErase( CutOId) table.remove( CutTable[1], 1) @@ -338,7 +338,7 @@ end ---------------------------------------------------------------------------------------------------------------------------------------------------- -- ricavo l'altezza del BoundingBox assegnati gli estremi del grezzo e la feature -- le funzioni commentate permettono di vedere la creazione di BoundingBox -local function DistanzaMassima( nAddGrpId, ptC1, vtN1, ptC2, vtN2, b3BoxDicing, TPoint) +local function DistanzaMassima( idAddGroup, ptC1, vtN1, ptC2, vtN2, b3BoxDicing, TPoint) -- calcolo il riferimento nel piano 1 local Frame1 = Frame3d( ptC1, vtN1) -- determino l'ingombro in questo riferimento della parte di trave compresa nel o nei piani @@ -353,7 +353,7 @@ local function DistanzaMassima( nAddGrpId, ptC1, vtN1, ptC2, vtN2, b3BoxDicing, end -- eventuale altra faccia if ptC2 and vtN2 then - local IdAux = EgtGroup( nAddGrpId) + local IdAux = EgtGroup( idAddGroup) local IdSurf2 = EgtSurfTmPlaneInBBox( IdAux, ptC2, vtN2, b3BoxDicing, GDB_RT.GLOB) EgtCutSurfTmPlane( IdSurf2, ptC1, -vtN1, false, GDB_RT.GLOB) if IdSurf2 then @@ -394,7 +394,12 @@ end --------------------------------------------------------------------------------------------------------------- function DiceCut.GetDice( Part, Face1, Face2, OptionalParameters) -- gruppo per geometria addizionale - local nAddGrpId = BeamLib.GetAddGroup( Part.id) + local idAddGroup + if OptionalParameters.bSaveAddedGeometries then + idAddGroup = BeamLib.GetAddGroup( Part.id) + else + idAddGroup = BeamLib.GetTempGroup() + end -- faccia primaria local ptCMainFace @@ -437,10 +442,10 @@ function DiceCut.GetDice( Part, Face1, Face2, OptionalParameters) if ptCSubordinateFace and vtNSubordinateFace then TBoxPoint = VerificaEstremiGrezzo( ptCSubordinateFace, vtNSubordinateFace, TBoxPoint) end - local dElevP = DistanzaMassima( nAddGrpId, ptCMainFace, vtNMainFace, ptCSubordinateFace, vtNSubordinateFace, b3BoxDicing, TBoxPoint) + local dElevP = DistanzaMassima( idAddGroup, ptCMainFace, vtNMainFace, ptCSubordinateFace, vtNSubordinateFace, b3BoxDicing, TBoxPoint) local dElevO if ptCSubordinateFace and vtNSubordinateFace and not AreOppositeVectorApprox( vtNSubordinateFace, vtNMainFace) then - dElevO = DistanzaMassima( nAddGrpId, ptCSubordinateFace, vtNSubordinateFace, ptCMainFace, vtNMainFace, b3BoxDicing, TBoxPoint) + dElevO = DistanzaMassima( idAddGroup, ptCSubordinateFace, vtNSubordinateFace, ptCMainFace, vtNMainFace, b3BoxDicing, TBoxPoint) end -- TODO parte sotto da aggiungere???? se sì va passata anche la dimensione cubetto ridotta dOffsetOrthogonalReduced @@ -474,7 +479,7 @@ function DiceCut.GetDice( Part, Face1, Face2, OptionalParameters) -- PIANI PARALLELI alla faccia di taglio local TabellaTmSurfP = {} - local TabFromIn = GetParallelPlanes( nAddGrpId, b3BoxDicing, ptCMainFace, vtNMainFace, 0, dOffsetParallel, nStepParallel, Color3d( FUCHSIA(), 60), dTolerance, true, ptCSubordinateFace, vtNSubordinateFace) + local TabFromIn = GetParallelPlanes( idAddGroup, b3BoxDicing, ptCMainFace, vtNMainFace, 0, dOffsetParallel, nStepParallel, Color3d( FUCHSIA(), 60), dTolerance, true, ptCSubordinateFace, vtNSubordinateFace) for i = #TabFromIn, 1, -1 do table.insert( TabellaTmSurfP, TabFromIn[i]) end @@ -483,12 +488,12 @@ function DiceCut.GetDice( Part, Face1, Face2, OptionalParameters) -- orientamento definito da seconda faccia if not bGetOrtoPlanes then local TabellaTmSurfOrto = {} - local TabFromIn = GetParallelPlanes( nAddGrpId, b3BoxDicing, ptCSubordinateFace, vtNSubordinateFace, 0, dOffsetOrthogonal, nStepOrthogonal, Color3d( GREEN(), 60), dTolerance, false, ptCMainFace, vtNMainFace) + local TabFromIn = GetParallelPlanes( idAddGroup, b3BoxDicing, ptCSubordinateFace, vtNSubordinateFace, 0, dOffsetOrthogonal, nStepOrthogonal, Color3d( GREEN(), 60), dTolerance, false, ptCMainFace, vtNMainFace) for i = #TabFromIn, 1, -1 do table.insert( TabellaTmSurfOrto, TabFromIn[i]) end - local TabellaOrderParallelCut = GetOrderedCutTable( nAddGrpId, TabellaTmSurfP, TabellaTmSurfOrto) -- Ottiene la tabella dei tagli paralleli ordinati - local TabellaOrderOrtoCut = GetOrderedCutTable( nAddGrpId, TabellaTmSurfOrto, TabellaTmSurfP) -- Ottiene la tabella dei tagli ortogonali da riordinare per strato + local TabellaOrderParallelCut = GetOrderedCutTable( idAddGroup, TabellaTmSurfP, TabellaTmSurfOrto) -- Ottiene la tabella dei tagli paralleli ordinati + local TabellaOrderOrtoCut = GetOrderedCutTable( idAddGroup, TabellaTmSurfOrto, TabellaTmSurfP) -- Ottiene la tabella dei tagli ortogonali da riordinare per strato TabGREEN = SortOrtoCutsByNormalMethod( TabellaOrderParallelCut, TabellaOrderOrtoCut) -- I tagli ortogonali vengono ordinati per strato TabFUCHSIA = TabellaOrderParallelCut -- I tagli paralleli sono già ordinati @@ -535,12 +540,12 @@ function DiceCut.GetDice( Part, Face1, Face2, OptionalParameters) if OffsetRel and CopyPlane and dCenOffs then ptCInner = ptCInner + dCenOffs * vtO - local TabRight = GetParallelPlanes( nAddGrpId, b3BoxDicing, ptCStart, vtO, CopyPlane, -OffsetRel, nStepOrthogonal, Color3d( GREEN(), 60), + local TabRight = GetParallelPlanes( idAddGroup, b3BoxDicing, ptCStart, vtO, CopyPlane, -OffsetRel, nStepOrthogonal, Color3d( GREEN(), 60), dTolerance, false, ptCInner, vtNInner, ptCOuter, vtNOuter) if CopyPlane == 0 then CopyPlane = 1 end - local TabLeft = GetParallelPlanes( nAddGrpId, b3BoxDicing, ptCStart, vtO, CopyPlane, OffsetRel, nStepOrthogonal, Color3d( GREEN(), 60), + local TabLeft = GetParallelPlanes( idAddGroup, b3BoxDicing, ptCStart, vtO, CopyPlane, OffsetRel, nStepOrthogonal, Color3d( GREEN(), 60), dTolerance, false, ptCInner, vtNInner, ptCOuter, vtNOuter) -- carico la tabella con gli indici riordinati local TempOrtoTab = {} @@ -551,7 +556,7 @@ function DiceCut.GetDice( Part, Face1, Face2, OptionalParameters) table.insert( TempOrtoTab, TabRight[i]) end -- creo una tabella per ogni piano per generare i tagli sulla Inner - local TempParTab = GetOrderedCutTable( nAddGrpId, {TabellaTmSurfP[PlnInd]}, TempOrtoTab) + local TempParTab = GetOrderedCutTable( idAddGroup, {TabellaTmSurfP[PlnInd]}, TempOrtoTab) for i = 1, #TempParTab do table.insert( TabFUCHSIA, TempParTab[i]) end diff --git a/LuaLibs/MachiningLib.lua b/LuaLibs/MachiningLib.lua index 8da8dd4..9f530b5 100644 --- a/LuaLibs/MachiningLib.lua +++ b/LuaLibs/MachiningLib.lua @@ -284,28 +284,44 @@ local function IsFaceZOutOfRange ( vtNFace, Tool) end ------------------------------------------------------------------------------------------------------------- -local function Check2DBladeCollision( Edge, vtHead, Part, Tool, dDepthToMachine) +-- nel piano perpendicolare alla direzione di taglio, se c'è intersezione tra motore e trave c'è collisione +local function Check2DBladeCollision( Edge, vtNFace, vtHead, Part, Tool, dDepthToMachine) local idTempGroup = BeamLib.GetTempGroup() - -- nel piano perpendicolare alla direzione di taglio, se c'è intersezione tra motore e trave c'è collisione - -- riferimento perpendicolare al taglio, X nel verso della normale al lato e Y verso il motore - local ptMid = Point3d( ( Edge.ptStart + Edge.ptEnd) / 2) + local ptMachining = Point3d( ( Edge.ptStart + Edge.ptEnd) / 2) + Edge.vtN * ( Edge.dElevation - dDepthToMachine) local vtEdge = Edge.ptEnd - Edge.ptStart vtEdge:normalize() - local frBlade = Frame3d( ptMid, vtEdge, Edge.vtN) - -- silhouette del pezzo nel riferimento - local idFirstCurve, nCurveCount = EgtGetSurfTmSilhouette( Part.idBoxTm, vtEdge, 10 * GEO.EPS_SMALL, idTempGroup) + -- costruzione flat region del pezzo nel piano perpendicolare al taglio + -- si estrae prima la silhouette nel piano + local idFirstCurve, nCurveCount = EgtGetSurfTmSilhouette( Part.idBoxTm, vtEdge, 10 * GEO.EPS_SMALL, idTempGroup, GDB_RT.GLOB) -- se più curve c'è qualcosa che non va: errore if nCurveCount > 1 then error( 'Check2DBladeCollision : error in part box') end - - -- flat region del pezzo nel riferimento + -- creazione flat region dalla silhouette local idPartSurfFr = EgtSurfFlatRegion( idTempGroup, idFirstCurve) - -- flat region del motore nel riferimento + -- costruzione flat region approssimata del motore nel piano perpendicolare al taglio + -- punto di congiunzione tra motore e lama + local ptMaxElev = ptMachining + Edge.vtN * Tool.dMaxMaterial + -- se taglio standard (no DownUp) il punto va spostato dello spessore lama + if AreSameVectorApprox( vtNFace, vtHead) then + ptMaxElev = ptMaxElev + vtNFace * Tool.dThickness + end + -- TODO qui sostituire con il valore reale letto dal SetupInfo + local dHeadDepth = 480 + local dHeadWidth = 480 + local ptOpposite = ptMaxElev + Edge.vtN * dHeadWidth + local ptCross = ptOpposite + vtHead * dHeadDepth + local idHeadRectangle = EgtRectangle3P( idTempGroup, ptMaxElev, ptCross, ptOpposite, GDB_RT.GLOB) + -- flat region dal rettangolo + local idHeadSurfFr = EgtSurfFlatRegion( idTempGroup, idHeadRectangle) + + -- intersezione + --local idTestSurfFr = EgtCopyGlob( idPartSurfFr, idTempGroup) + local bCollisionFound = EgtSurfFrIntersect( idPartSurfFr, idHeadSurfFr) return false end @@ -321,7 +337,7 @@ function MachiningLib.GetBladeEngagement( Face, Edge, Part, Tool, dDepthToMachin if not IsFaceZOutOfRange( Face.vtN, Tool) then -- TODO verifica collisione carro Z, collisione traversa PF, collisione 'C' Fast... La riduzione percorso cambia questo test? - if bAvoidCollisionCheckForStandardCut or not Check2DBladeCollision( Edge, Face.vtN, Part, Tool, dDepthToMachine) then + if bAvoidCollisionCheckForStandardCut or not Check2DBladeCollision( Edge, Face.vtN, Face.vtN, Part, Tool, dDepthToMachine) then return true, sBladeEngagement end @@ -345,7 +361,7 @@ function MachiningLib.GetBladeEngagement( Face, Edge, Part, Tool, dDepthToMachin end -- orientamento faccia / utensile compatibili con DownUp: lavorabile - if not Check2DBladeCollision( Edge, -Face.vtN, Part, Tool, dDepthToMachine) then + if not Check2DBladeCollision( Edge, Face.vtN, -Face.vtN, Part, Tool, dDepthToMachine) then sBladeEngagement = 'DownUp' @@ -1387,9 +1403,9 @@ function MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Machining, Part) local ProcTm = FeatureLib.GetProcFromTrimesh( Machining.Geometry[1][1], Part) local dDepthToMachine = min( ProcTm.Faces[Machining.Geometry[1][2] + 1].dElevation, ( Machining.dMaxElev or ProcTm.Faces[Machining.Geometry[1][2] + 1].dElevation)) - ( max( 0, Machining.dResidualDepth or 0)) local nSteps = max( ceil( ( dDepthToMachine - 50 * GEO.EPS_SMALL) / TOOLS[Machining.nToolIndex].dStep), 1) - local nAddGroupId = BeamLib.GetAddGroup( Part.id) + local idTempGroup = BeamLib.GetTempGroup() -- TODO in futuro creare flatregion (se ci fossero isole il calcolo del percorso non sarebbe corretto) - local idFaceContour = EgtExtractSurfTmFacetLoops( ProcTm.id, Machining.Geometry[1][2], nAddGroupId) + local idFaceContour = EgtExtractSurfTmFacetLoops( ProcTm.id, Machining.Geometry[1][2], idTempGroup) -- si settano i lati aperti della curva derivata dalla superficie for i = 1, #ProcTm.Faces[Machining.Geometry[1][2] + 1].Edges do if ProcTm.Faces[Machining.Geometry[1][2] + 1].Edges[i].bIsOpen then @@ -1397,7 +1413,7 @@ function MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Machining, Part) end end -- dal momento che la funzione EgtPocketing non considera il grezzo, nei casi ottimizzati si deve correggere l'offset - local idTestCurve = EgtCopyGlob( idFaceContour, nAddGroupId ) + local idTestCurve = EgtCopyGlob( idFaceContour, idTempGroup ) local bIsOptimizedPocketing = ( TOOLS[Machining.nToolIndex].dDiameter > TOOLS[Machining.nToolIndex].dSideStep - 10 * GEO.EPS_SMALL) and EgtOffsetCurve( idTestCurve, -TOOLS[Machining.nToolIndex].dDiameter / 2 - 10 * GEO.EPS_SMALL) if not bIsOptimizedPocketing then @@ -1413,7 +1429,7 @@ function MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Machining, Part) end end -- calcolo percorso di svuotatura replicando il calcolo che fa la svuotatura - local idPocketingPath = EgtPocketing( idFaceContour, TOOLS[Machining.nToolIndex].dDiameter / 2, TOOLS[Machining.nToolIndex].dSideStep, 0, Machining.nSubType, true, nAddGroupId) + local idPocketingPath = EgtPocketing( idFaceContour, TOOLS[Machining.nToolIndex].dDiameter / 2, TOOLS[Machining.nToolIndex].dSideStep, 0, Machining.nSubType, true, idTempGroup) local dPocketingPathLength = EgtCurveLength( idPocketingPath) -- calcolo lunghezze e tempi totali if dPocketingPathLength then @@ -1425,10 +1441,6 @@ function MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Machining, Part) dLengthToMachineAllStepsWithLeadInOut = 99999 * nSteps dTimeToMachineTotal = dLengthToMachineAllStepsWithLeadInOut / dToolFeed end - -- le geometrie create si settano da cancellare - EgtSetLevel( idFaceContour, GDB_LV.TEMP) - EgtSetLevel( idPocketingPath, GDB_LV.TEMP) - EgtSetLevel( idTestCurve, GDB_LV.TEMP) else error( 'GetTimeToMachineAllStepsWithLeadInOut : unknown machining type') end diff --git a/Strategies/Standard/STR0002/STR0002.lua b/Strategies/Standard/STR0002/STR0002.lua index d47f3a6..eda5f52 100644 --- a/Strategies/Standard/STR0002/STR0002.lua +++ b/Strategies/Standard/STR0002/STR0002.lua @@ -428,7 +428,12 @@ end local function GetSplitSurfaces( Proc, Part, bAddMachining) local vAddId = {} local vAddIdTunnel = {} - local nAddGrpId = BeamLib.GetAddGroup( Part.id) + local idAddGroup + if bAddMachining then + idAddGroup = BeamLib.GetAddGroup( Part.id) + else + idAddGroup = BeamLib.GetTempGroup() + end local nOriginalTmIdTunnel = GDB_ID.NULL if Proc.MainFaces.TunnelAddedFaces then nOriginalTmIdTunnel = Proc.MainFaces.TunnelAddedFaces.MiddleFaceTm.id @@ -438,18 +443,14 @@ local function GetSplitSurfaces( Proc, Part, bAddMachining) local FeatureSplittingPoints = FeatureLib.GetFeatureSplittingPoints( Proc, Part) if #FeatureSplittingPoints == 0 then - local nAddId = EgtCopyGlob( Proc.id, nAddGrpId) or GDB_ID.NULL - local nAddIdTunnel = EgtCopyGlob( nOriginalTmIdTunnel, nAddGrpId) or GDB_ID.NULL - if not bAddMachining then - EgtSetLevel( nAddId, GDB_LV.TEMP) - EgtSetLevel( nAddIdTunnel, GDB_LV.TEMP) - end + local nAddId = EgtCopyGlob( Proc.id, idAddGroup) or GDB_ID.NULL + local nAddIdTunnel = EgtCopyGlob( nOriginalTmIdTunnel, idAddGroup) or GDB_ID.NULL table.insert( vAddId, nAddId) table.insert( vAddIdTunnel, nAddIdTunnel) else for i = 1, #FeatureSplittingPoints do - local nAddId = EgtCopyGlob( Proc.id, nAddGrpId) or GDB_ID.NULL - local nAddIdTunnel = EgtCopyGlob( nOriginalTmIdTunnel, nAddGrpId) or GDB_ID.NULL + local nAddId = EgtCopyGlob( Proc.id, idAddGroup) or GDB_ID.NULL + local nAddIdTunnel = EgtCopyGlob( nOriginalTmIdTunnel, idAddGroup) or GDB_ID.NULL if i == 1 then -- prima superficie, va tagliata solo a sinistra local ptSplit = FeatureSplittingPoints[i] + Vector3d( -BeamData.MILL_OVERLAP / 2, 0, 0) @@ -465,23 +466,15 @@ local function GetSplitSurfaces( Proc, Part, bAddMachining) EgtCutSurfTmPlane( nAddId, ptSplit, X_AX(), true, GDB_RT.GLOB) EgtCutSurfTmPlane( nAddIdTunnel, ptSplit, X_AX(), true, GDB_RT.GLOB) end - if not bAddMachining then - EgtSetLevel( nAddId, GDB_LV.TEMP) - EgtSetLevel( nAddIdTunnel, GDB_LV.TEMP) - end table.insert( vAddId, nAddId) table.insert( vAddIdTunnel, nAddIdTunnel) end -- taglio ultima superficie, va tagliata solo a destra - local nAddId = EgtCopyGlob( Proc.id, nAddGrpId) or GDB_ID.NULL - local nAddIdTunnel = EgtCopyGlob( nOriginalTmIdTunnel, nAddGrpId) or GDB_ID.NULL + local nAddId = EgtCopyGlob( Proc.id, idAddGroup) or GDB_ID.NULL + local nAddIdTunnel = EgtCopyGlob( nOriginalTmIdTunnel, idAddGroup) or GDB_ID.NULL local ptSplit = FeatureSplittingPoints[#FeatureSplittingPoints] + Vector3d( BeamData.MILL_OVERLAP / 2, 0, 0) EgtCutSurfTmPlane( nAddId, ptSplit, X_AX(), true, GDB_RT.GLOB) EgtCutSurfTmPlane( nAddIdTunnel, ptSplit, X_AX(), true, GDB_RT.GLOB) - if not bAddMachining then - EgtSetLevel( nAddId, GDB_LV.TEMP) - EgtSetLevel( nAddIdTunnel, GDB_LV.TEMP) - end table.insert( vAddId, nAddId) table.insert( vAddIdTunnel, nAddIdTunnel) end diff --git a/Strategies/Standard/STR0015/STR0015.lua b/Strategies/Standard/STR0015/STR0015.lua index c53cff6..1be1101 100644 --- a/Strategies/Standard/STR0015/STR0015.lua +++ b/Strategies/Standard/STR0015/STR0015.lua @@ -108,15 +108,17 @@ local function GetRoughStrategy( Proc, Part, bSaveAddedGeometries) local nMidFacet = Proc.nFct // 2 -- faccia a metà circa local vtN = EgtSurfTmFacetNormVersor( Proc.id, nMidFacet, GDB_ID.ROOT) - local nAddGroupId = BeamLib.GetAddGroup( Part.id) + local idAddGroup + if bSaveAddedGeometries then + idAddGroup = BeamLib.GetAddGroup( Part.id) + else + idAddGroup = BeamLib.GetTempGroup() + end -- aggiungo piano di sgrossatura e lo lavoro local ptStart, vtNP = GetSawCutData( Proc, Proc.idAddAuxGeom, vtNF, vtN) - local AddId = EgtSurfTmPlaneInBBox( nAddGroupId, ptStart, vtNP, Part.b3Part, GDB_RT.GLOB) + local AddId = EgtSurfTmPlaneInBBox( idAddGroup, ptStart, vtNP, Part.b3Part, GDB_RT.GLOB) -- se la faccia è stata creata if AddId then - if not bSaveAddedGeometries then - EgtSetLevel( AddId, GDB_LV.TEMP) - end -- creo piano di taglio sulla testa del tenone local OptionalParameters = { dMaxWasteVolume = Strategy.Parameters.dMaxWasteVolume, diff --git a/StrategyLibs/BLADETOWASTE.lua b/StrategyLibs/BLADETOWASTE.lua index 95f79b0..1989ea3 100644 --- a/StrategyLibs/BLADETOWASTE.lua +++ b/StrategyLibs/BLADETOWASTE.lua @@ -343,13 +343,8 @@ local function GetBestBlade( Proc, Part, Face, OptionalParameters) end -local function SetDiceFaceInfo( Proc, idDiceFace, bSaveAddedGeometries) - EgtSetName( idDiceFace, 'Face' .. tostring( Proc.idFeature) .. '_Dice') - -- TODO la scrittura del TaskId probabilmente non serve (è fatta nell'AddOperations) - EgtSetInfo( idDiceFace, 'TASKID', Proc.idTask) - if not bSaveAddedGeometries then - EgtSetLevel( idDiceFace, GDB_LV.TEMP) - end +local function SetDiceFaceInfo( Proc, idDiceFace) + EgtSetName( idDiceFace, 'Face' .. tostring( Proc.idFeature or 'Add') .. '_Dice') end @@ -699,6 +694,7 @@ local function CutWithDicing( Proc, Part, OptionalParameters) OptionalParametersDiceCut.dOffsetOrthogonal = dDiceDimension OptionalParametersDiceCut.dOffsetOrthogonalReduced = dDiceDimensionReduced OptionalParametersDiceCut.b3BoxDicing = b3BoxDicing + OptionalParametersDiceCut.bSaveAddedGeometries = bSaveAddedGeometries local vCuts = DiceCut.GetDice( Part, Face1, Face2, OptionalParametersDiceCut) -- se nessun cubetto trovato, si richiama ricorsivamente la BladeToWaste forzando di non fare i cubetti @@ -715,7 +711,7 @@ local function CutWithDicing( Proc, Part, OptionalParameters) local bAreOrthogonalCutsInverted = false for i = 1, #vCuts do for j = 1, #vCuts[i] do - SetDiceFaceInfo( Proc, vCuts[i][j], bSaveAddedGeometries) + SetDiceFaceInfo( Proc, vCuts[i][j]) if ( i % 2) == 1 then local vtO = EgtSurfTmFacetNormVersor( vCuts[i][j], 0, GDB_ID.ROOT) if ( Face1.vtN:getY() > 0.766 and vtO:getY() < -0.05) or @@ -968,13 +964,14 @@ function BLADETOWASTE.Make( ProcOrId, Part, OptionalParameters) -- TODO qui sostituire con check topologia DoubleBevel if dAngleBetweenFaces > 10 * GEO.EPS_SMALL then -- si creano superfici singole per le facce, estese fino al box della parte - local nAddGrpId = BeamLib.GetAddGroup( Part.id) - local idFace1 = EgtSurfTmPlaneInBBox( nAddGrpId, Proc.Faces[1].ptCenter, Proc.Faces[1].vtN, Part.b3Part, GDB_ID.ROOT) - local idFace2 = EgtSurfTmPlaneInBBox( nAddGrpId, Proc.Faces[2].ptCenter, Proc.Faces[2].vtN, Part.b3Part, GDB_ID.ROOT) - if not bSaveAddedGeometries then - EgtSetLevel( idFace1, GDB_LV.TEMP) - EgtSetLevel( idFace2, GDB_LV.TEMP) + local idAddGroup + if bSaveAddedGeometries then + idAddGroup = BeamLib.GetAddGroup( Part.id) + else + idAddGroup = BeamLib.GetTempGroup() end + local idFace1 = EgtSurfTmPlaneInBBox( idAddGroup, Proc.Faces[1].ptCenter, Proc.Faces[1].vtN, Part.b3Part, GDB_ID.ROOT) + local idFace2 = EgtSurfTmPlaneInBBox( idAddGroup, Proc.Faces[2].ptCenter, Proc.Faces[2].vtN, Part.b3Part, GDB_ID.ROOT) -- lavorazione facce local Machinings1, Result1 = MakeOneFace( idFace1, Part, OptionalParameters) diff --git a/Version.lua b/Version.lua index 5b1915f..113782f 100644 --- a/Version.lua +++ b/Version.lua @@ -2,5 +2,5 @@ -- Gestione della versione di Beam NAME = 'Beam' -VERSION = '2.6d1' -MIN_EXE = '2.6g1' +VERSION = '2.8a1' +MIN_EXE = '2.7j2'