diff --git a/BatchProcessNew.lua b/BatchProcessNew.lua index 2a2e0c4..312d3d8 100644 --- a/BatchProcessNew.lua +++ b/BatchProcessNew.lua @@ -775,8 +775,7 @@ if bToProcess then end end - -- se scarico a caduta (-101, -102) le lavorazioni dopo separazione vanno disattivate - + -- TODO: se scarico a caduta (-101, -102) le lavorazioni dopo separazione vanno disattivate. Scrivere info feature incompleta su quelle feature -- Salvo il progetto EgtSaveFile( sNgeFile) diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 8fe4516..97a81ad 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -617,6 +617,7 @@ local function CollectFeatures( Part, dRotIndex) local nDo = EgtGetInfo( ProcId, 'DO', 'i') or 1 if nGrp and nPrc and nDo == 1 then local Proc = {} + Proc.isVirtualProc = nInd == 1 -- feature non presente in lista originale BTL ma aggiunta da automatismo Proc.idPart = Part.id Proc.idRaw = Part.idRaw Proc.nIndexPartInParts = Part.nIndexInParts @@ -783,8 +784,8 @@ local function GetFeatureInfoAndDependency( vProcSingleRot, Part) local ProcB = vProcSingleRot[j] -- non si controlla la feature con se stessa o se feature disabilitata if i ~= j and ProcB.nFlg ~= 0 then - -- verifico se il taglio aggiunto manualmente può essere saltato perchè nella stessa posizione c'è un altro taglio di testa - if ID.IsHeadCut( Proc) and ( ID.IsHeadCut( ProcB) and EgtGetInfo( ProcB.id, 'HEAD_ADD_CUT', 'i') == 1) then + -- se entrambi tagli di testa, si tiene sempre il primo ( ma non quello aggiunto dall'automatismo) + if ( ID.IsHeadCut( Proc) and not EgtGetInfo( Proc.id, 'HEAD_ADD_CUT', 'i')) and ID.IsHeadCut( ProcB) then if not Proc.SlaveProcIndexes then Proc.SlaveProcIndexes = {} end @@ -792,8 +793,8 @@ local function GetFeatureInfoAndDependency( vProcSingleRot, Part) ProcB.nIndexMasterProc = i ProcB.nFlg = 0 end - -- verifico se il taglio aggiunto manualmente può essere saltato perchè nella stessa posizione c'è un altro taglio di coda - if ID.IsTailCut( Proc) and ( ID.IsTailCut( ProcB) and EgtGetInfo( ProcB.id, 'HEAD_ADD_CUT', 'i') == 1) then + -- se entrambi tagli di coda, si tiene sempre il primo ( ma non quello aggiunto dall'automatismo) + if ( ID.IsTailCut( Proc) and not EgtGetInfo( Proc.id, 'HEAD_ADD_CUT', 'i')) and ID.IsTailCut( ProcB) then if not Proc.SlaveProcIndexes then Proc.SlaveProcIndexes = {} end @@ -1071,6 +1072,7 @@ local function AddFeatureResultToGlobalList( Proc, OptionalParameters) local dCompletionIndex local dCompositeRating local sInfo + local sApplyInfo if not OptionalParameters then OptionalParameters = {} @@ -1078,13 +1080,19 @@ local function AddFeatureResultToGlobalList( Proc, OptionalParameters) local nRotation = OptionalParameters.nRotation or 1 if Proc.nIndexMasterProc then + -- se è una feature non presente in elenco ed è saltata perchè lavorata da un'altra feature, non si fa passare dai RESULT. + -- se non avesse una master associata, allora risulterà come messaggio su pezzo + if Proc.isVirtualProc then + return + end local ChosenStrategyTable = PROCESSINGS[Proc.nIndexPartInParts].Rotation[Proc.nIndexRotation][Proc.nIndexMasterProc].ChosenStrategy if ChosenStrategyTable then sStrategyId = ChosenStrategyTable.sStrategyId sStatus = ChosenStrategyTable.Result.sStatus dCompletionIndex = ChosenStrategyTable.Result.dCompletionIndex dCompositeRating = ChosenStrategyTable.Result.dCompositeRating - sInfo = ChosenStrategyTable.Result.sInfo + local idFeature = PROCESSINGS[Proc.nIndexPartInParts].Rotation[Proc.nIndexRotation][Proc.nIndexMasterProc].idFeature + sApplyInfo = 'Skipped. Feature machined: ' .. EgtNumToString( idFeature) end elseif Proc.ChosenStrategy then sStrategyId = Proc.ChosenStrategy.sStrategyId @@ -1108,7 +1116,8 @@ local function AddFeatureResultToGlobalList( Proc, OptionalParameters) sStatus = sStatus, dCompletionIndex = dCompletionIndex, dCompositeRating = dCompositeRating, - sInfo = sInfo + sInfo = sInfo, + sApplyInfo = sApplyInfo } } -- scrivo le strategie disponibili solo se ne esistono @@ -1330,7 +1339,6 @@ local function GetBestCombination( ListToCompare, Part) end end end - end end end @@ -1448,14 +1456,14 @@ local function GetCombinationListFromMatrix( ProcessingsOnPart, PartInfo) -- ciclo su tutte le feature, ad eccezione dei tagli testa/coda che dipendono dal risultato delle altre -- tagli testa e coda vengono aggiunti sempre alla fine for nProc = 1, #ProcessingsOnPart.Rotation[1] do - if not ID.IsHeadCut( ProcessingsOnPart.Rotation[1][nProc]) and not ID.IsTailCut( ProcessingsOnPart.Rotation[1][nProc]) then - -- Si controlla sempre la rotazione 1 perchè la dipendenza di una feature da un'altra non dipende dalla rotazione - -- se feature disattivata perchè eseguita da master a lei associata dichiaro comunque eseguita - if ProcessingsOnPart.Rotation[1][nProc].nFlg == 0 and ProcessingsOnPart.Rotation[1][nProc].nIndexMasterProc then - ProcessingsOnPart.Rotation[1][nProc].nIndexRotation = nUnloadPos - table.insert( SingleCombination.Rot0, ProcessingsOnPart.Rotation[1][nProc]) - SingleCombination.nComplete = SingleCombination.nComplete + 1 - else + -- Si controlla sempre la rotazione 1 perchè la dipendenza di una feature da un'altra non dipende dalla rotazione + -- se feature disattivata perchè eseguita da master a lei associata dichiaro comunque eseguita + if ProcessingsOnPart.Rotation[1][nProc].nFlg == 0 and ProcessingsOnPart.Rotation[1][nProc].nIndexMasterProc then + ProcessingsOnPart.Rotation[1][nProc].nIndexRotation = nUnloadPos + table.insert( SingleCombination.Rot0, ProcessingsOnPart.Rotation[1][nProc]) + SingleCombination.nComplete = SingleCombination.nComplete + 1 + else + if not ID.IsHeadCut( ProcessingsOnPart.Rotation[1][nProc]) and not ID.IsTailCut( ProcessingsOnPart.Rotation[1][nProc]) then -- ciclo sulle rotazioni local nNextRot = nUnloadPos local nOffsetIndex = EgtIf( SingleCombination.bPartInCombiIsInverted, 4, 0) @@ -1506,12 +1514,12 @@ local function GetCombinationListFromMatrix( ProcessingsOnPart, PartInfo) table.insert( SingleCombination.Rot0, ProcessingsOnPart.Rotation[nUnloadPos+nOffsetIndex][nProc]) SingleCombination.nNotExecute = SingleCombination.nNotExecute + 1 end - end - else - if ID.IsHeadCut( ProcessingsOnPart.Rotation[1][nProc]) then - SingleCombination.nIndexHeadCutInVProc = nProc - elseif ID.IsTailCut( ProcessingsOnPart.Rotation[1][nProc]) then - SingleCombination.nIndexTailCutInVProc = nProc + else + if ID.IsHeadCut( ProcessingsOnPart.Rotation[1][nProc]) then + SingleCombination.nIndexHeadCutInVProc = nProc + elseif ID.IsTailCut( ProcessingsOnPart.Rotation[1][nProc]) then + SingleCombination.nIndexTailCutInVProc = nProc + end end end end diff --git a/Strategies/Standard/STR0001/STR0001.lua b/Strategies/Standard/STR0001/STR0001.lua index 860dc6e..46681eb 100644 --- a/Strategies/Standard/STR0001/STR0001.lua +++ b/Strategies/Standard/STR0001/STR0001.lua @@ -187,8 +187,15 @@ local function GetTenonStrategy( Proc, Part) -- test finecorsa sulla passata più esterna: se extracorsa, la lavorazione non è fattibile -- TODO sostituire con applicazione della lavorazione? + -- TODO funzione per allungare il percorso?????? local idGeomMaxOffset = EgtCopyGlob( Proc.FeatureInfo.idAddAuxGeom, Part.idTempGroup) EgtOffsetCurve( idGeomMaxOffset, Machining.Milling.AuxiliaryData.Clones[1].dRadialOffset + TOOLS[Machining.Milling.ToolInfo.nToolIndex].dDiameter / 2, Part.idTempGroup) + local vtCurveStart = EgtSV( idGeomMaxOffset, GDB_ID.ROOT) + local vtCurveEnd = EgtEV( idGeomMaxOffset, GDB_ID.ROOT) + local ptCurveStart = EgtSP( idGeomMaxOffset, GDB_ID.ROOT) + -vtCurveStart * Machining.Milling.LeadIn.dTangentDistance + ( Proc.FeatureInfo.vtTenonN ^ -vtCurveStart) * Machining.Milling.LeadIn.dPerpDistance + local ptCurveEnd = EgtEP( idGeomMaxOffset, GDB_ID.ROOT) + vtCurveEnd * Machining.Milling.LeadOut.dTangentDistance + ( vtCurveEnd ^ Proc.FeatureInfo.vtTenonN) * Machining.Milling.LeadOut.dPerpDistance + EgtAddCurveCompoArcTg( idGeomMaxOffset, ptCurveStart, false, GDB_RT.GLOB) + EgtAddCurveCompoArcTg( idGeomMaxOffset, ptCurveEnd, true, GDB_RT.GLOB) local bOutOfStroke = PreSimulationLib.CheckOutOfStrokeFromGeometry( idGeomMaxOffset, Proc.FeatureInfo.vtTenonN, Machining.Milling.nSCC, TOOLS[Machining.Milling.ToolInfo.nToolIndex]) if bOutOfStroke then Machining.Milling.bIsApplicable = false diff --git a/Strategies/Standard/STR0002/STR0002.lua b/Strategies/Standard/STR0002/STR0002.lua index e1c1f8a..94c9153 100644 --- a/Strategies/Standard/STR0002/STR0002.lua +++ b/Strategies/Standard/STR0002/STR0002.lua @@ -494,12 +494,20 @@ function STR0002.Make( bAddMachining, Proc, Part, CustomParameters) Strategy.Result = {} Strategy.Result.dTimeToMachine = 0 + -- se la lavorazione ostacola il pinzaggio, non posso farla if not IsTopologyOk( Proc) then local sErr = 'Feature '.. Proc.idFeature .. ' : strategy ' .. StrategyLib.Config.sStrategyId .. ' not implemented' EgtOutLog( sErr) Strategy.Result = FeatureLib.GetStrategyResultNotApplicable( sErr) return false, Strategy.Result end + -- se la lavorazione ostacola il pinzaggio, non posso farla, serve una lavorazioen che lasci il testimone + if MachiningLib.IsFeatureHinderingClamping( Proc, Part) then + local sErr = 'Feature '.. Proc.idFeature .. ' : strategy ' .. StrategyLib.Config.sStrategyId .. ' not applicable ( Feature hinders clamping)' + EgtOutLog( sErr) + Strategy.Result = FeatureLib.GetStrategyResultNotApplicable( sErr) + return false, Strategy.Result + end local bAreAllMachiningsAdded = true local dFeatureVolume = Proc.dVolume diff --git a/Strategies/Standard/STR0006/STR0006.lua b/Strategies/Standard/STR0006/STR0006.lua index afbbf21..ed3ccb0 100644 --- a/Strategies/Standard/STR0006/STR0006.lua +++ b/Strategies/Standard/STR0006/STR0006.lua @@ -163,8 +163,15 @@ local function GetTenonStrategy( Proc, Part) -- test finecorsa sulla passata più esterna: se extracorsa, la lavorazione non è fattibile -- TODO sostituire con applicazione della lavorazione? + -- TODO funzione per allungare il percorso?????? local idGeomMaxOffset = EgtCopyGlob( Proc.FeatureInfo.idAddAuxGeom, Part.idTempGroup) EgtOffsetCurve( idGeomMaxOffset, Machining.Milling.AuxiliaryData.Clones[1].dRadialOffset + TOOLS[Machining.Milling.ToolInfo.nToolIndex].dDiameter / 2, Part.idTempGroup) + local vtCurveStart = EgtSV( idGeomMaxOffset, GDB_ID.ROOT) + local vtCurveEnd = EgtEV( idGeomMaxOffset, GDB_ID.ROOT) + local ptCurveStart = EgtSP( idGeomMaxOffset, GDB_ID.ROOT) + -vtCurveStart * Machining.Milling.LeadIn.dTangentDistance + ( Proc.FeatureInfo.vtTenonN ^ -vtCurveStart) * Machining.Milling.LeadIn.dPerpDistance + local ptCurveEnd = EgtEP( idGeomMaxOffset, GDB_ID.ROOT) + vtCurveEnd * Machining.Milling.LeadOut.dTangentDistance + ( vtCurveEnd ^ Proc.FeatureInfo.vtTenonN) * Machining.Milling.LeadOut.dPerpDistance + EgtAddCurveCompoArcTg( idGeomMaxOffset, ptCurveStart, false, GDB_RT.GLOB) + EgtAddCurveCompoArcTg( idGeomMaxOffset, ptCurveEnd, true, GDB_RT.GLOB) local bOutOfStroke = PreSimulationLib.CheckOutOfStrokeFromGeometry( idGeomMaxOffset, Proc.FeatureInfo.vtTenonN, Machining.Milling.nSCC, TOOLS[Machining.Milling.ToolInfo.nToolIndex]) if bOutOfStroke then Machining.Milling.bIsApplicable = false diff --git a/Strategies/Standard/STR0007/STR0007.lua b/Strategies/Standard/STR0007/STR0007.lua index 5fecf2d..65d423c 100644 --- a/Strategies/Standard/STR0007/STR0007.lua +++ b/Strategies/Standard/STR0007/STR0007.lua @@ -187,6 +187,7 @@ function GetMortiseStrategy( Proc, Part) -- test finecorsa sulla passata più esterna: se extracorsa, la lavorazione non è fattibile local idGeomMaxOffset = EgtCopyGlob( Proc.FeatureInfo.idAddAuxGeom, Part.idTempGroup) + -- TODO funzione per allungare il percorso?????? EgtAddCurveCompoLineTg( idGeomMaxOffset, Machining.Milling.LeadIn.dTangentDistance, false) EgtAddCurveCompoLineTg( idGeomMaxOffset, Machining.Milling.LeadOut.dTangentDistance, true) EgtOffsetCurve( idGeomMaxOffset, Machining.Milling.AuxiliaryData.Clones[1].dRadialOffset + TOOLS[Machining.Milling.ToolInfo.nToolIndex].dDiameter / 2, Part.idTempGroup) @@ -388,6 +389,7 @@ function GetMortiseAntiSplint( Proc, Part, ToolInfo) local idGeomOffset = EgtCopyGlob( nId1, Part.idTempGroup) EgtOffsetCurve( idGeomOffset, EgtIf( AntiSplint.bInvert, -TOOLS[ToolInfo.nToolIndex].dDiameter / 2, TOOLS[ToolInfo.nToolIndex].dDiameter / 2), Part.idTempGroup) -- trasformo arco in una curva compo per poi allungarla in direzione tangente + -- TODO funzione per allungare il percorso?????? idGeomOffset = EgtCurveCompo( Part.idTempGroup, idGeomOffset) EgtAddCurveCompoLineTg( idGeomOffset, AntiSplint.LeadIn.dTangentDistance, false) EgtAddCurveCompoLineTg( idGeomOffset, AntiSplint.LeadOut.dTangentDistance, true) diff --git a/Strategies/Standard/STR0010/STR0010.lua b/Strategies/Standard/STR0010/STR0010.lua index 48efe24..15ee988 100644 --- a/Strategies/Standard/STR0010/STR0010.lua +++ b/Strategies/Standard/STR0010/STR0010.lua @@ -187,6 +187,14 @@ function STR0010.Make( bAddMachining, Proc, Part, CustomParameters) end end + -- se la lavorazione ostacola il pinzaggio, non posso farla, serve una lavorazioen che lasci il testimone + if MachiningLib.IsFeatureHinderingClamping( Proc, Part) then + local sErr = 'Feature '.. Proc.idFeature .. ' : strategy ' .. StrategyLib.Config.sStrategyId .. ' not applicable ( Feature hinders clamping)' + EgtOutLog( sErr) + Strategy.Result = FeatureLib.GetStrategyResultNotApplicable( sErr) + return false, Strategy.Result + end + -- volume della feature local dFeatureVolume = Proc.dVolume diff --git a/StrategyLibs/BLADEKEEPWASTE.lua b/StrategyLibs/BLADEKEEPWASTE.lua index 5324037..4997299 100644 --- a/StrategyLibs/BLADEKEEPWASTE.lua +++ b/StrategyLibs/BLADEKEEPWASTE.lua @@ -121,7 +121,6 @@ end function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) -- TODO verificare funzionamento con lama da sotto -- TODO scelta utensile è corretto lasciarla a FaceByBlade? - -- attenzione perchè se l'inclinazione della faccia la fa finire oltre lo spigolo questo riduce il massimo (come calcolare????) local Result = {} local Machinings = {}