diff --git a/CAMAuto/LuaLibs/FeatureData.lua b/CAMAuto/LuaLibs/FeatureData.lua index bd39009..93f954b 100644 --- a/CAMAuto/LuaLibs/FeatureData.lua +++ b/CAMAuto/LuaLibs/FeatureData.lua @@ -37,6 +37,12 @@ end ------------------------------------------------------------------------------------------------------------- -- Recupero dati svuotatura function FeatureData.GetPocketingData( Proc) + local vtDir = EgtCurveExtrusion( Proc.id) + local Frame = EgtGetGlobFrame( Proc.id) + + Proc.dLength = abs( EgtCurveThickness( Proc.id)) or 0 + Proc.vtDir = vtDir + Proc.sReferenceSide = EgtGetInfo( Proc.id, 'REFERENCE_SIDE', 's') or nil return Proc end diff --git a/CAMAuto/LuaLibs/WinExec.lua b/CAMAuto/LuaLibs/WinExec.lua index 647b790..c321b85 100644 --- a/CAMAuto/LuaLibs/WinExec.lua +++ b/CAMAuto/LuaLibs/WinExec.lua @@ -303,9 +303,9 @@ local function SortByChangeToolOpt( MACHININGS) for i = 1, #vProcToSortToolOpt do for j = i + 1, #vProcToSortToolOpt do -- se sono su stessa fase - if vProcToSortToolOpt[i].AuxiliaryData.nPhase == vProcToSortToolOpt[j].AuxiliaryData.nPhase then + if vProcToSortToolOpt[i].AuxiliaryData.nPhase == vProcToSortToolOpt[j].AuxiliaryData.nPhase and not vProcToSortToolOpt[i].AuxiliaryData.bHeadProfile and not vProcToSortToolOpt[j].AuxiliaryData.bHeadProfile then -- se stesso utensile - if vProcToSortToolOpt[i].Machining.nToolIndex == vProcToSortToolOpt[j].Machining.nToolIndex then + if vProcToSortToolOpt[i].Machining.nToolIndex == vProcToSortToolOpt[j].Machining.nToolIndex and vProcToSortToolOpt[i].Machining.dLongitudinalOffset == vProcToSortToolOpt[j].Machining.dLongitudinalOffset then if i + 1 == j then -- il confronto riparte dall'ultimo spostato i = j @@ -578,6 +578,10 @@ function WinExec.ProcessFeatures( PARTS) for i = 1, #PARTS do maxOffsetX[i] = 80 - PARTS[i].RawOffset.dOverMatRight end + + -- variabile per offset aggiuntivo in X a causa di una lavorazione sul Top vicino alla testa + local addOffsetX = 0 + -- scrivo lavorazioni seconda fase EgtSetCurrPhase( 2) UpdateRawPosition( PARTS) @@ -585,6 +589,9 @@ function WinExec.ProcessFeatures( PARTS) if MACHININGS[i].AuxiliaryData.nPhase == 2 then -- aggiunge effettivamente la lavorazione local bIsApplyOk, sErr, b3MachEncumbrance = MachiningLib.AddOperation( MACHININGS[i]) + if MACHININGS[i].Proc.AffectedFaces.bTop and b3MachEncumbrance:getMin():getX() > (PARTS[MACHININGS[i].Proc.nIndexPart].b3Part:getMax():getX() - maxOffsetX[MACHININGS[i].Proc.nIndexPart] - 10) then + addOffsetX = b3MachEncumbrance:getMin():getX() - (PARTS[MACHININGS[i].Proc.nIndexPart].b3Part:getMax():getX() - maxOffsetX[MACHININGS[i].Proc.nIndexPart] - 5) + end -- se feature di testa, sposto testa in base a ingombro lavorazione if MACHININGS[i].Proc.bHeadProfile and b3MachEncumbrance then -- profilo di testa obliquo @@ -600,7 +607,7 @@ function WinExec.ProcessFeatures( PARTS) -- sposto pezzo per permettere pinzaggio migliore e non aver colisione in testa for i = 1, #PARTS do -- TODO controllare calcolo ingombro - local vtMove = Vector3d( PARTS[i].DispOffsets.Phase2.dOffsetX, 0, 0) + local vtMove = Vector3d( PARTS[i].DispOffsets.Phase2.dOffsetX + addOffsetX, 0, 0) if vtMove ~= V_NULL() then CheckAndMoveRawPart( PARTS[i].idRaw, vtMove) end diff --git a/CAMAuto/Strategies/Pocketing.lua b/CAMAuto/Strategies/Pocketing.lua index 1759916..d18b3fa 100644 --- a/CAMAuto/Strategies/Pocketing.lua +++ b/CAMAuto/Strategies/Pocketing.lua @@ -9,13 +9,55 @@ require( 'EgtBase') -- Carico i dati globali local WinData = require( 'WinData') +local MachiningLib = require( 'MachiningLib') EgtOutLog( ' Pocketing started', 1) EgtMdbSave() +------------------------------------------------------------------------------------------------------------- +-- funzione che decide se eseguire le forature dopo le profilature. Solo forature di testa inclinate. Altrimenti sempre prima. +local function IsPocketToMachineAfterProfile( Proc) + local bExecAfterProfile = false + if Proc.AffectedFaces.bTop then + bExecAfterProfile = true + end + return bExecAfterProfile +end + ------------------------------------------------------------------------------------------------------------- function Pocketing.Make( Proc, Part) - return true + local Machining = { LeadIn = {}, LeadOut = {}, Steps = {}} + local AuxiliaryData = {} + local ToolSearchParameters = {} + + -- cerco utensile svuotatura + ToolSearchParameters.sType = 'MILL_STD' + ToolSearchParameters.dElevation = Proc.dLength + ToolSearchParameters.vDirection = Proc.vtDir + ToolSearchParameters.bIsVerticalHead = AreSameVectorApprox( Proc.vtDir, Vector3d(0,0,1)) + ToolSearchParameters.bIsHorizontalHead = not ToolSearchParameters.bIsVerticalHead + local ToolInfo = MachiningLib.FindMill( Proc, ToolSearchParameters) + -- se trovato utensile + if ToolInfo.nToolIndex then + Machining.nType = MCH_OY.POCKETING + Machining.nSubType = MCH_POCK_SUB.SPIRALOUT + Machining.LeadIn.nType = MCH_POCK_LI.HELIX + Machining.Steps.dStep = TOOLS[ToolInfo.nToolIndex].dStep + Machining.Steps.dSideStep = TOOLS[ToolInfo.nToolIndex].dSideStep + Machining.nToolIndex = ToolInfo.nToolIndex + Machining.LeadIn.dTangentDistance = TOOLS[ToolInfo.nToolIndex].dDiameter/2 + Machining.LeadIn.dElevation = TOOLS[ToolInfo.nToolIndex].dDiameter/2 + Machining.sDepth = Proc.dLength + Machining.Geometry = Proc.id + AuxiliaryData.nIndexMachining = 1 + AuxiliaryData.nPhase = MachiningLib.GetPhaseMach( Proc) + AuxiliaryData.bExecAfterProfile = IsPocketToMachineAfterProfile( Proc) + MachiningLib.AddNewMachining( Proc, Machining, AuxiliaryData) + return true + end + + -- non ha trovato un utensile valido + return false end -------------------------------------------------------------------------------------------------------------