From c62f1818c7494040754e80d17c9adcbad8e325e5 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Fri, 24 Oct 2025 12:51:47 +0200 Subject: [PATCH] =?UTF-8?q?-=20in=20BLADETOWASTE=20e=20DiceCut=20eliminati?= =?UTF-8?q?=20tutti=20i=20riferimenti=20al=20DownUp:=20il=20tipo=20di=20la?= =?UTF-8?q?vorazione=20si=20verificher=C3=A0=20direttamente=20in=20FaceByB?= =?UTF-8?q?lade=20o=20FindBlade=20-=20in=20FaceData.GetFacesInfo=20si=20sa?= =?UTF-8?q?lva=20l'id=20della=20trimesh=20nella=20faccia=20-=20in=20HEADCU?= =?UTF-8?q?T=20il=20box=20per=20i=20cubetti=20viene=20copiato=20non=20per?= =?UTF-8?q?=20riferimento?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LuaLibs/DiceCut.lua | 18 +- LuaLibs/FaceData.lua | 5 +- Strategies/Standard/HEADCUT/HEADCUT.lua | 3 +- StrategyLibs/BLADETOWASTE.lua | 216 +++++++++--------------- StrategyLibs/FACEBYBLADE.lua | 12 ++ 5 files changed, 106 insertions(+), 148 deletions(-) diff --git a/LuaLibs/DiceCut.lua b/LuaLibs/DiceCut.lua index 137fe07..0211b3e 100644 --- a/LuaLibs/DiceCut.lua +++ b/LuaLibs/DiceCut.lua @@ -134,7 +134,7 @@ end -- vtO: il versore dei piani ortogonali -- dOffsetEff: offset della distanza dal punto centrale -- Verifica se l'asse X del box costruito sopra la superficie è più grande di un certo offset -local function GetOrtoCutCenter( FacetId, ptC, vtN, vtO, dOffsetEff, dMinNzDownUp) +local function GetOrtoCutCenter( FacetId, ptC, vtN, vtO, dOffsetEff) local FrameLocal = Frame3d( EgtSurfTmFacetCenter( FacetId, 0, GDB_ID.ROOT)) EgtSetGridFrame(FrameLocal) local IdAuxLocal = EgtGroup(EgtGetParent( FacetId), FrameLocal) @@ -156,7 +156,7 @@ local function GetOrtoCutCenter( FacetId, ptC, vtN, vtO, dOffsetEff, dMinNzDownU -- TODO si può eliminare questo test dato che vengono verificate già volume e dimensione del cubetto?? local dMaxLen = BeamData.MAX_LEN_DICE or 600 if dLen < dMaxLen and dWidth < dMaxLen and - ( dLen < dOffsetEff + 1.0 or dWidth < dOffsetEff + 1.0) and vtN:getZ() > dMinNzDownUp then + ( dLen < dOffsetEff + 1.0 or dWidth < dOffsetEff + 1.0) then return nil, nil, nil end @@ -261,7 +261,7 @@ end -- dOffsetParallel: offset della distanza dal punto centrale -- b3BoxDicing: il grezzo della barra -- Verifica se l'asse X del box costruito sopra le 2 facce è più piccolo di un certo offset e quindi la faccia O è superflua -local function VerifyFirstOrthoCut( CutTable, dOffsetParallel, b3BoxDicing, dMinNzDownUp) +local function VerifyFirstOrthoCut( CutTable, dOffsetParallel, b3BoxDicing) if not CutTable[1] or not CutTable[2] then return end @@ -294,7 +294,7 @@ local function VerifyFirstOrthoCut( CutTable, dOffsetParallel, b3BoxDicing, dMin -- lunghezza totale faccia 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 and vtN1:getZ() > dMinNzDownUp then + if dLongSize <= dOffsetParallel + 1.0 then local nAddGrpId = EgtGetParent( Cut1Id) local SurfId = EgtSurfTmBySewing( nAddGrpId, { Cut1Id, Cut2Id}) --EgtSetColor( SurfId, Color3d( FUCHSIA(), 60)) @@ -430,8 +430,6 @@ function DiceCut.GetDice( Part, Face1, Face2, OptionalParameters) local nStepOrthogonal = OptionalParameters.nStepOrthogonal or 100 -- distanza tra piani paralleli e piani di taglio (era sempre 0, serve???) local dTolerance = OptionalParameters.dTolerance or 0 - -- inclinazione limite per taglio da sotto - local dMinNzDownUp = OptionalParameters.dMinNzDownUp or -2 --Ricavo le altezze dei BoundingBox contenente feature e estremi del grezzo local TBoxPoint = CalcolaPuntiEstremiBox( b3BoxDicing) @@ -508,10 +506,10 @@ function DiceCut.GetDice( Part, Face1, Face2, OptionalParameters) end -- calcolo la direzione dei piani ortogonali local vtO = VectorFromUprightOrtho( vtNInner) - if vtNInner:getZ() > -0.0175 or vtNInner:getZ() < dMinNzDownUp or abs( vtNInner:getY()) > 0.8 then + if vtNInner:getZ() > -0.0175 or abs( vtNInner:getY()) > 0.8 then vtO:rotate( vtNInner, 90) -- se diretto troppo ortogonalmente all'asse trave e taglio non da sotto, lo ruoto ulteriormente - if ( abs( vtO:getY()) > 4 * abs( vtO:getX()) or b3BoxDicing:getDimZ() > 620) and vtNInner:getZ() > dMinNzDownUp then + if ( abs( vtO:getY()) > 4 * abs( vtO:getX()) or b3BoxDicing:getDimZ() > 620) then vtO:rotate( vtNInner, 90) -- se faccia principale verso il basso (almeno -3deg), lo inverto per iniziare da sopra if vtNInner:getZ() < -0.05 then @@ -533,7 +531,7 @@ function DiceCut.GetDice( Part, Face1, Face2, OptionalParameters) -- CopyPlane: 0 => crea la prima faccia direttamente sul punto passato -- CopyPlane: 1 => crea la prima faccia e tutte le altre con l'offset passato -- CopyPlane: 0.5 => crea la prima faccia a metà offset e tutte le altre con l'offest intero - local OffsetRel, CopyPlane, dCenOffs, ptCStart = GetOrtoCutCenter( TabellaTmSurfP[PlnInd], ptCInner, vtNInner, vtO, dOffsetOrthogonal, dMinNzDownUp) + local OffsetRel, CopyPlane, dCenOffs, ptCStart = GetOrtoCutCenter( TabellaTmSurfP[PlnInd], ptCInner, vtNInner, vtO, dOffsetOrthogonal) if OffsetRel and CopyPlane and dCenOffs then ptCInner = ptCInner + dCenOffs * vtO @@ -582,7 +580,7 @@ function DiceCut.GetDice( Part, Face1, Face2, OptionalParameters) -- Se esiste la superficie limitante (nFacet == 2) verifica se il taglio più esterno è superfluo e quindi viene eliminato if not bGetOrtoPlanes then - VerifyFirstOrthoCut( UltimateTable, dOffsetParallelOriginal, b3BoxDicing, dMinNzDownUp) + VerifyFirstOrthoCut( UltimateTable, dOffsetParallelOriginal, b3BoxDicing) -- se rimangono due sole facce, devono coincidere con le originali e quindi sono superflue if #UltimateTable == 2 and #UltimateTable[1] == 1 and #UltimateTable[2] == 1 then EgtErase( UltimateTable[1][1]) diff --git a/LuaLibs/FaceData.lua b/LuaLibs/FaceData.lua index 3476b4e..679b7e1 100644 --- a/LuaLibs/FaceData.lua +++ b/LuaLibs/FaceData.lua @@ -175,6 +175,7 @@ function FaceData.GetFacesInfo( Proc, Part, FacesToGet) for i = 1, Proc.nFct do Faces[i] = {} Faces[i].id = i - 1 + Faces[i].idTrimesh = Proc.id Faces[i].ptCenter, Faces[i].vtN = EgtSurfTmFacetCenter( Proc.id, i - 1, GDB_ID.ROOT) if Proc.nFct < 6 or FaceIsToGet( i) then -- frame OCS faccia @@ -215,6 +216,7 @@ function FaceData.GetFacesInfo( Proc, Part, FacesToGet) end ------------------------------------------------------------------------------------------------------------- +-- TODO valutare se scrivere in gruppo temporaneo che non richiede di passare ogni volta idPart; passare Face invece dell'id? function FaceData.IsFaceRectangular( Proc, idFace) local nAddGrpId = BeamLib.GetAddGroup( Proc.idPart) local nContourId, nContourCnt = EgtExtractSurfTmFacetLoops( Proc.id, idFace, nAddGrpId) @@ -233,11 +235,12 @@ function FaceData.IsFaceRectangular( Proc, idFace) end ------------------------------------------------------------------------------------------------------------- +-- TODO valutare se scrivere in gruppo temporaneo che non richiede di passare ogni volta idPart; passare Face invece dell'id? function FaceData.IsFaceRhomboid( Proc, idFace) local nAddGrpId = BeamLib.GetAddGroup( Proc.idPart) local nContourId, nContourCnt = EgtExtractSurfTmFacetLoops( Proc.id, idFace, nAddGrpId) if nContourCnt > 1 then - error( 'IsFaceRectangular : too many loops') + error( 'IsFaceRhomboid : too many loops') end local bIsTrapezoid = EgtCurveIsATrapezoid( nContourId) diff --git a/Strategies/Standard/HEADCUT/HEADCUT.lua b/Strategies/Standard/HEADCUT/HEADCUT.lua index ef3f568..216cdb9 100644 --- a/Strategies/Standard/HEADCUT/HEADCUT.lua +++ b/Strategies/Standard/HEADCUT/HEADCUT.lua @@ -86,8 +86,7 @@ function HEADCUT.Make( bAddMachining, Proc, Part, CustomParameters) if not bExecutePrecutOnly then local OptionalParameters = {} -- si parte dal box della feature e si aggiunge il punto estremo del grezzo - -- ATTENZIONE : Proc.b3Box viene modificata dato che il tipo Box è come se fosse una tabella, ma da qui passa solo 1 volta per pezzo quindi non dovrebbero esserci problemi - local b3BoxDicing = Proc.b3Box + local b3BoxDicing = BBox3d( Proc.b3Box) b3BoxDicing:Add( Part.b3Raw:getMax()) b3BoxDicing:expand( 1000 * GEO.EPS_SMALL) OptionalParameters.b3BoxDicing = b3BoxDicing diff --git a/StrategyLibs/BLADETOWASTE.lua b/StrategyLibs/BLADETOWASTE.lua index 7818ef4..ae36c09 100644 --- a/StrategyLibs/BLADETOWASTE.lua +++ b/StrategyLibs/BLADETOWASTE.lua @@ -204,7 +204,7 @@ local function CompareEdgesNoPreference( EdgeA, EdgeB) end -local function GetEdgeToMachine( Edges, vtNFace, sBladeType, bAllowFastCuts) +local function GetEdgeToMachine( Edges, sBladeType, bAllowFastCuts) local EdgeToMachine = {} local EdgesSorted = {} @@ -222,14 +222,6 @@ local function GetEdgeToMachine( Edges, vtNFace, sBladeType, bAllowFastCuts) elseif sBladeType == 'Bottom' then table.sort( EdgesSorted, CompareEdgesBottomHead) EdgeToMachine = EdgesSorted[1] - elseif sBladeType == 'TopDownUp' then - local vtEdgeDirection - if vtNFace:getY() > -0.02 then - vtEdgeDirection = -Y_AX() - else - vtEdgeDirection = Y_AX() - end - EdgeToMachine = BeamLib.FindEdgeBestOrientedAsDirection( Edges, vtEdgeDirection) elseif sBladeType == 'TopGuillotine' then table.sort( EdgesSorted, CompareEdgesTopHeadGuillotine) EdgeToMachine = EdgesSorted[1] @@ -262,9 +254,10 @@ local function GetBestBlade( Proc, Part, Face, OptionalParameters) local dMinNzTopBladeIfEqual = OptionalParameters.dMinNzTopBlade or sin(-5) local dMaxNyTopBlade = OptionalParameters.dMaxNyTopBlade or sin(1) local dShortPartLength = OptionalParameters.dShortPartLength or BeamData.LEN_SHORT_PART - local dElevationTop = OptionalParameters.dElevationTop - local dElevationBottom = OptionalParameters.dElevationBottom - local dElevationTopDownUp = OptionalParameters.dElevationTopDownUp or 0 + local EdgeToMachineTop = OptionalParameters.EdgeToMachineTop + local EdgeToMachineBottom = OptionalParameters.EdgeToMachineBottom + local dElevationTop = EdgeToMachineTop and EdgeToMachineTop.dElevation + BeamData.CUT_EXTRA or nil + local dElevationBottom = EdgeToMachineBottom and EdgeToMachineBottom.dElevation + BeamData.CUT_EXTRA or nil -- se ho già l'utensile, devo solo discriminare se è lama sopra o sotto e verificare se ci arriva if OptionalParameters.nToolIndex then @@ -282,20 +275,24 @@ local function GetBestBlade( Proc, Part, Face, OptionalParameters) local ToolInfo -- ricerca lama testa sopra ToolInfo = MachiningLib.FindBlade( Proc, { - vtN = Face.vtN, bAllowTopHead = true, bAllowBottomHead = false, - dElevation = dElevationTop + dElevation = dElevationTop, + vtN = Face.vtN, + vtToolDirection = EdgeToMachineTop.vtN, + b3Raw = Part.b3Raw }) if ToolInfo.dResidualDepth < 10 * GEO.EPS_SMALL then nToolIndexTop = ToolInfo.nToolIndex end -- ricerca lama testa sotto ToolInfo = MachiningLib.FindBlade( Proc, { - vtN = Face.vtN, bAllowTopHead = false, bAllowBottomHead = true, - dElevation = dElevationBottom + dElevation = dElevationBottom, + vtN = Face.vtN, + vtToolDirection = EdgeToMachineBottom.vtN, + b3Raw = Part.b3Raw }) if ToolInfo.dResidualDepth < 10 * GEO.EPS_SMALL then nToolIndexBottom = ToolInfo.nToolIndex @@ -337,19 +334,8 @@ local function GetBestBlade( Proc, Part, Face, OptionalParameters) -- assegnazione tipo lama if nChosenToolIndex == nToolIndexBottom then sChosenBladeType = 'Bottom' - -- se lama sopra va verificato se va usata in DownUp elseif nChosenToolIndex == nToolIndexTop then - local dMinNzDownUp = TOOLS[nToolIndexTop].SetupInfo.GetMinNzDownUp( Part.b3Raw, Face.vtN, nil, TOOLS[nToolIndexTop]) - local dCurrentResidualDepth = dElevationTopDownUp - TOOLS[nToolIndexTop].dMaxDepth - if Face.vtN:getZ() < dMinNzDownUp then - if ( dCurrentResidualDepth > 10 * GEO.EPS_SMALL) then - -- TODO serve messaggio per motivare il non applicabile?? - nChosenToolIndex = nil - end - sChosenBladeType = 'TopDownUp' - else - sChosenBladeType = 'Top' - end + sChosenBladeType = 'Top' end -- se non trovata alcuna lama ritorna nil @@ -379,19 +365,17 @@ local function GetSingleCutStrategy( Proc, Part, OptionalParameters) -- se non arrivano dall'esterno si cercano i migliori disponibili local EdgeToMachineList = OptionalParameters.EdgeToMachineList or { - Top = GetEdgeToMachine( FaceToMachine.Edges, FaceToMachine.vtN, 'Top', bAllowFastCuts), - Bottom = GetEdgeToMachine( FaceToMachine.Edges, FaceToMachine.vtN, 'Bottom', bAllowFastCuts), - TopDownUp = GetEdgeToMachine( FaceToMachine.Edges, FaceToMachine.vtN, 'TopDownUp', bAllowFastCuts), - TopGuillotine = GetEdgeToMachine( FaceToMachine.Edges, FaceToMachine.vtN, 'TopGuillotine', bAllowFastCuts) + Top = GetEdgeToMachine( FaceToMachine.Edges, 'Top', bAllowFastCuts), + Bottom = GetEdgeToMachine( FaceToMachine.Edges, 'Bottom', bAllowFastCuts), + TopGuillotine = GetEdgeToMachine( FaceToMachine.Edges, 'TopGuillotine', bAllowFastCuts) } local sChosenBladeType -- se nToolIndex è presente, GetBestBlade sceglierà solo il lato, altrimenti sceglierà lama e lato local OptionalParametersGetBestBlade = { - dElevationTop = EdgeToMachineList.Top.dElevation + BeamData.CUT_EXTRA, - dElevationBottom = EdgeToMachineList.Bottom.dElevation + BeamData.CUT_EXTRA, - dElevationTopDownUp = EdgeToMachineList.TopDownUp.dElevation + BeamData.CUT_EXTRA, + EdgeToMachineTop = EdgeToMachineList.Top, + EdgeToMachineBottom = EdgeToMachineList.Bottom, nToolIndex = nToolIndex } nToolIndex, sChosenBladeType = GetBestBlade( Proc, Part, FaceToMachine, OptionalParametersGetBestBlade) @@ -402,26 +386,14 @@ local function GetSingleCutStrategy( Proc, Part, OptionalParameters) -- ricerca lama migliore testa sopra local ToolInfo = MachiningLib.FindBlade( Proc, { - vtN = FaceToMachine.vtN, bAllowTopHead = true, - bAllowBottomHead = false + bAllowBottomHead = false, + vtN = FaceToMachine.vtN, + vtToolDirection = EdgeToMachineList.Top.vtN, + b3Raw = Part.b3Raw }) nToolIndexGuillotine = ToolInfo.nToolIndex - -- se non trovato utensile, si prova in DownUp - if not nToolIndexGuillotine then - ToolInfo = MachiningLib.FindBlade( Proc, { - vtN = -FaceToMachine.vtN, - bAllowTopHead = true, - bAllowBottomHead = false}) - if ToolInfo.nToolIndex then - local dMinNzDownUp = TOOLS[ToolInfo.nToolIndex].SetupInfo.GetMinNzDownUp( Part.b3Raw, FaceToMachine.vtN, EdgeToMachineList.TopGuillotine.vtN, TOOLS[ToolInfo.nToolIndex]) - if FaceToMachine.vtN:getZ() < dMinNzDownUp then - nToolIndexGuillotine = ToolInfo.nToolIndex - end - end - end - -- test fattibilità taglio a ghigliottina if nToolIndexGuillotine then local dRadialOffset = FaceByBlade.GetRadialOffsetForGuillotine( nToolIndexGuillotine, EdgeToMachineList.TopGuillotine.dLength) @@ -437,7 +409,7 @@ local function GetSingleCutStrategy( Proc, Part, OptionalParameters) end -local function GetDualSideCutStrategy( Proc, OptionalParameters) +local function GetDualSideCutStrategy( Proc, Part, OptionalParameters) -- parametri opzionali OptionalParameters = OptionalParameters or {} @@ -458,17 +430,21 @@ local function GetDualSideCutStrategy( Proc, OptionalParameters) -- ricerca lama testa sopra local ToolInfoTopBlade = MachiningLib.FindBlade( Proc, { - vtN = FaceToMachine.vtN, bAllowTopHead = true, bAllowBottomHead = false, - dElevation = dDepthToMachineTop + dElevation = dDepthToMachineTop, + vtN = FaceToMachine.vtN, + vtToolDirection = EdgeToMachine.vtN, + b3Raw = Part.b3Raw }) -- ricerca lama testa sotto local ToolInfoBottomBlade = MachiningLib.FindBlade( Proc, { - vtN = FaceToMachine.vtN, bAllowTopHead = false, bAllowBottomHead = true, - dElevation = dDepthToMachineBottom + dElevation = dDepthToMachineBottom, + vtN = FaceToMachine.vtN, + vtToolDirection = EdgeToMachine.vtN, + b3Raw = Part.b3Raw }) local bIsTopLimited = ToolInfoTopBlade.dResidualDepth > 10 * GEO.EPS_SMALL @@ -481,10 +457,12 @@ local function GetDualSideCutStrategy( Proc, OptionalParameters) dDepthToMachineBottom = EdgeToMachine.dElevation - dDepthToMachineTop + BeamData.CUT_EXTRA_MIN -- ricerca lama sotto con la nuova depth ToolInfoBottomBlade = MachiningLib.FindBlade( Proc, { - vtN = FaceToMachine.vtN, bAllowTopHead = false, bAllowBottomHead = true, - dElevation = dDepthToMachineBottom + dElevation = dDepthToMachineBottom, + vtN = FaceToMachine.vtN, + vtToolDirection = EdgeToMachine.vtN, + b3Raw = Part.b3Raw }) bIsBottomLimited = ToolInfoBottomBlade.dResidualDepth > 10 * GEO.EPS_SMALL @@ -495,10 +473,12 @@ local function GetDualSideCutStrategy( Proc, OptionalParameters) dDepthToMachineTop = EdgeToMachine.dElevation - dDepthToMachineBottom + BeamData.CUT_EXTRA_MIN -- ricerca lama sopra con la nuova depth ToolInfoTopBlade = MachiningLib.FindBlade( Proc, { - vtN = FaceToMachine.vtN, bAllowTopHead = true, bAllowBottomHead = false, - dElevation = dDepthToMachineTop + dElevation = dDepthToMachineTop, + vtN = FaceToMachine.vtN, + vtToolDirection = EdgeToMachine.vtN, + b3Raw = Part.b3Raw }) bIsTopLimited = ToolInfoTopBlade.dResidualDepth > 10 * GEO.EPS_SMALL end @@ -526,10 +506,12 @@ local function GetDualSideCutStrategy( Proc, OptionalParameters) -- ricerca lama testa sopra local ToolInfo = MachiningLib.FindBlade( Proc, { - vtN = FaceToMachine.vtN, bAllowTopHead = true, bAllowBottomHead = false, - dElevation = dDepthToMachine + dElevation = dDepthToMachine, + vtN = FaceToMachine.vtN, + vtToolDirection = EdgeToMachine.vtN, + b3Raw = Part.b3Raw }) -- se lama ci arriva si assegnano utensili e profondità da ritornare @@ -607,7 +589,7 @@ local function CutWholeWaste( Proc, Part, OptionalParameters) elseif FaceData.IsFaceRhomboid( Proc, Proc.Faces[1].id) then local CuttingParametersList - CuttingParametersList, EdgeToMachine = GetDualSideCutStrategy( Proc, OptionalParameters) + CuttingParametersList, EdgeToMachine = GetDualSideCutStrategy( Proc, Part, OptionalParameters) if CuttingParametersList then local OptionalParametersFaceByBlade = { @@ -704,9 +686,6 @@ local function CutWithDicing( Proc, Part, OptionalParameters) return Machinings, Result end - -- limite per taglio DownUp - local dMinNzDownUp = TOOLS[nToolIndex].SetupInfo.GetMinNzDownUp( Part.b3Raw, Face1.vtN, nil, TOOLS[nToolIndex]) - -- calcolo dimensione cubetto e eventuale cubetto ridotto (tagli orizzontali con affondamento verticale) local dDiceDimension = min( TOOLS[nToolIndex].dMaxMaterial, BeamData.MAX_DIM_DICE) local dDiceDimensionReduced = dDiceDimension @@ -719,7 +698,6 @@ local function CutWithDicing( Proc, Part, OptionalParameters) OptionalParametersDiceCut.dOffsetParallel = dDiceDimension OptionalParametersDiceCut.dOffsetOrthogonal = dDiceDimension OptionalParametersDiceCut.dOffsetOrthogonalReduced = dDiceDimensionReduced - OptionalParametersDiceCut.dMinNzDownUp = dMinNzDownUp OptionalParametersDiceCut.b3BoxDicing = b3BoxDicing local vCuts = DiceCut.GetDice( Part, Face1, Face2, OptionalParametersDiceCut) @@ -818,77 +796,45 @@ local function CutWithDicing( Proc, Part, OptionalParameters) local Cutting = {} local vtNCurrentFace = EgtSurfTmFacetNormVersor( vCuts[i][j], 0, GDB_ID.ROOT) local FaceToMachine = { id = 0, vtN = vtNCurrentFace} - -- se taglio DownUp e strato pari composto da 1 o 2 elementi (tutti gli altri casi vengono saltati) - if ( vtNCurrentFace:getZ() < dMinNzDownUp) and ( ( i % 2) == 0) and ( #vCuts[i] <= 2) then - -- il primo elemento prende la direzione prevista, il secondo quella opposta - local vtToolDirectionNew = Vector3d( vtToolDirection) - if j ~= 1 then - vtToolDirectionNew = -vtToolDirection - end - -- lavorazione - local ProcTrimesh = FeatureLib.GetProcFromTrimesh( vCuts[i][j], Part) - local _, Edges = FaceData.GetEdgesInfo( vCuts[i][j], 0) - local EdgeToMachine = BeamLib.FindEdgeBestOrientedAsDirection( Edges, vtToolDirectionNew) - local dDepthToMachine = EdgeToMachine.dElevation + BeamData.CUT_EXTRA - local OptionalParametersFaceByBlade = { - dDepthToMachine = dDepthToMachine, - nToolIndex = nToolIndex, - dRadialStepSpan = 0, - dExtendAfterTail = dExtendAfterTail - } - Cutting = FaceByBlade.Make( ProcTrimesh, Part, FaceToMachine, EdgeToMachine, OptionalParametersFaceByBlade) - Cutting.ptCenter = Point3d( ProcTrimesh.Faces[1].ptCenter:getX(), 0, 0) - - if Cutting.bIsApplicable then - table.insert( Machinings, Cutting) - else - bIsDicingOk = false - end - if Cutting.sStage == 'AfterTail' then - bMoveAfterSplit = true - end - -- caso generale - else - -- in generale sta sollevato di pochissimo - local dExtraCut = -0.1 - -- se tagli paralleli - if ( i % 2) == 0 then - -- se non ci sono tagli ortogonali devo affondare - if bNoPerpCuts then + -- in generale sta sollevato di pochissimo + local dExtraCut = -0.1 + -- se tagli paralleli + if ( i % 2) == 0 then + -- se non ci sono tagli ortogonali devo affondare + if bNoPerpCuts then + dExtraCut = BeamData.CUT_EXTRA + -- se è faccia singola si affonda + elseif Proc.nFct < 2 then + -- se tagli ortogonali invertiti, devo approfondire dello spessore lama + if bAreOrthogonalCutsInverted then + dExtraCut = TOOLS[nToolIndex].dThickness + -- se ultimo taglio, devo affondare + elseif j == #vCuts[i] then dExtraCut = BeamData.CUT_EXTRA - -- se è faccia singola si affonda - elseif Proc.nFct < 2 then - -- se tagli ortogonali invertiti, devo approfondire dello spessore lama - if bAreOrthogonalCutsInverted then - dExtraCut = TOOLS[nToolIndex].dThickness - -- se ultimo taglio, devo affondare - elseif j == #vCuts[i] then - dExtraCut = BeamData.CUT_EXTRA - end end end - local ProcTrimesh = FeatureLib.GetProcFromTrimesh( vCuts[i][j], Part) - local _, Edges = FaceData.GetEdgesInfo( vCuts[i][j], 0) - local EdgeToMachine = BeamLib.FindEdgeBestOrientedAsDirection( Edges, vtToolDirection) - local dDepthToMachine = EdgeToMachine.dElevation + dExtraCut - local OptionalParametersFaceByBlade = { - dDepthToMachine = dDepthToMachine, - nToolIndex = nToolIndex, - dRadialStepSpan = 0, - dExtendAfterTail = dExtendAfterTail - } - Cutting = FaceByBlade.Make( ProcTrimesh, Part, FaceToMachine, EdgeToMachine, OptionalParametersFaceByBlade) - Cutting.ptCenter = Point3d( ProcTrimesh.Faces[1].ptCenter:getX(), 0, 0) + end + local ProcTrimesh = FeatureLib.GetProcFromTrimesh( vCuts[i][j], Part) + local _, Edges = FaceData.GetEdgesInfo( vCuts[i][j], 0) + local EdgeToMachine = BeamLib.FindEdgeBestOrientedAsDirection( Edges, vtToolDirection) + local dDepthToMachine = EdgeToMachine.dElevation + dExtraCut + local OptionalParametersFaceByBlade = { + dDepthToMachine = dDepthToMachine, + nToolIndex = nToolIndex, + dRadialStepSpan = 0, + dExtendAfterTail = dExtendAfterTail + } + Cutting = FaceByBlade.Make( ProcTrimesh, Part, FaceToMachine, EdgeToMachine, OptionalParametersFaceByBlade) + Cutting.ptCenter = Point3d( ProcTrimesh.Faces[1].ptCenter:getX(), 0, 0) - if Cutting.bIsApplicable then - table.insert( Machinings, Cutting) - bIsDicingOk = true - else - bIsDicingOk = false - end - if Cutting.sStage == 'AfterTail' then - bMoveAfterSplit = true - end + if Cutting.bIsApplicable then + table.insert( Machinings, Cutting) + bIsDicingOk = true + else + bIsDicingOk = false + end + if Cutting.sStage == 'AfterTail' then + bMoveAfterSplit = true end end end @@ -1096,7 +1042,7 @@ function BLADETOWASTE.Make( ProcOrId, Part, OptionalParameters) local OptionalParametersGetSingleCutStrategy = { bReduceBladePath = false, nFaceToMachineIndex = i, - EdgeToMachineList = { Top = EdgeToMachine, Bottom = EdgeToMachine, TopDownUp = EdgeToMachine} + EdgeToMachineList = { Top = EdgeToMachine, Bottom = EdgeToMachine} } nToolIndex = GetSingleCutStrategy( Proc, Part, OptionalParametersGetSingleCutStrategy) end diff --git a/StrategyLibs/FACEBYBLADE.lua b/StrategyLibs/FACEBYBLADE.lua index fb791e6..00cfb3f 100644 --- a/StrategyLibs/FACEBYBLADE.lua +++ b/StrategyLibs/FACEBYBLADE.lua @@ -187,6 +187,18 @@ local function GetSCC( vtMachiningDirection, vtEdgeDirection, vtNFace) end +function FACEBYBLADE.GetCuttingType( FaceToMachine, EdgeToMachine) +local SCuttingType + + + + + + + return SCuttingType +end + + -- dato un certo offset radiale (uscente) e la distanza da mantenere dallo spigolo, calcola di quanto la lama deve arretrare lateralmente rispetto al centro per lavorare il lato function FACEBYBLADE.GetPathReductionLength( nToolIndex, dRadialOffset, OptionalParameters) local Tool = TOOLS[nToolIndex]