From ecf89edf593424735e8a62930e0cad40ab10b451 Mon Sep 17 00:00:00 2001 From: "andrea.villa" Date: Wed, 8 May 2024 12:12:26 +0200 Subject: [PATCH] - b3Raw sostituito da tabella 'Part', che contiene Id e altre info del pezzo - 'GetUpdateCustomParameters' spostato in BeamLib, da chiamare all'inizio di ogni strategia. - Aggiornamento strategie a nuovo standard --- LuaLibs/BeamExec.lua | 105 ++++++++++++++------------------- LuaLibs/BeamLib.lua | 31 +++++++--- LuaLibs/FeatureData.lua | 16 ++--- Strategies/STR0001/STR0001.lua | 9 ++- Strategies/STR0002/STR0002.lua | 9 ++- 5 files changed, 92 insertions(+), 78 deletions(-) diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 2b3df66..94c87d0 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -453,7 +453,7 @@ local function GetFeatureForcedStrategy( Proc) end ------------------------------------------------------------------------------------------------------------- -local function CollectFeatures( PartId, b3Raw) +local function CollectFeatures( PartId, Part) -- recupero le feature local vProc = {} local LayerId = {} @@ -497,7 +497,7 @@ local function CollectFeatures( PartId, b3Raw) if FeatureData.NeedTopologyFeature( Proc) then Proc.AdjacencyMatrix = FaceData.GetAdjacencyMatrix( Proc) Proc.Faces = FaceData.GetFacesInfo( Proc) - Proc.Topology = FeatureData.ClassifyTopology( Proc, b3Raw) + Proc.Topology = FeatureData.ClassifyTopology( Proc, Part) else Proc.Topology.Family = 'FEATURE' Proc.Topology.Name = 'FEATURE' @@ -539,7 +539,7 @@ local function CollectFeatures( PartId, b3Raw) end ------------------------------------------------------------------------------------------------------------- -local function AreDrillingsMirrored( Proc, ProcMirror, b3Raw) +local function AreDrillingsMirrored( Proc, ProcMirror, Part) if Proc.Id == ProcMirror.Id then return false end -- geometria ausiliaria foro principale @@ -577,7 +577,7 @@ local function AreDrillingsMirrored( Proc, ProcMirror, b3Raw) -- centri allineati, equidistanti dalla mezzeria trave, non troppo vicini local vtDisplacement = ptBC - ptBCMirror - local ptCenRaw = b3Raw:getCenter() + local ptCenRaw = Part.RawBox:getCenter() if nDouble == 2 then local dYMinDistance = max( Proc.Box:getMin():getY(), ProcMirror.Box:getMin():getY()) - min( Proc.Box:getMax():getY(), ProcMirror.Box:getMax():getY()) if not ( abs( vtDisplacement:getX()) < 100 * GEO.EPS_SMALL and abs( vtDisplacement:getZ()) < 100 * GEO.EPS_SMALL and @@ -603,7 +603,7 @@ local function AreDrillingsMirrored( Proc, ProcMirror, b3Raw) end ------------------------------------------------------------------------------------------------------------- -local function GetFeatureInfoAndDependency( vProcSingleRot, b3Raw) +local function GetFeatureInfoAndDependency( vProcSingleRot, Part) -- ciclo tutte le feature for i = 1, #vProcSingleRot do local Proc = vProcSingleRot[i] @@ -621,7 +621,7 @@ local function GetFeatureInfoAndDependency( vProcSingleRot, b3Raw) if BeamData.DOWN_HEAD or BeamData.TWO_EQUAL_HEADS then -- forature if BeamData.DOUBLE_HEAD_DRILLING and ID.IsDrilling( Proc) and ID.IsDrilling( ProcB) and not Proc.Mirror then - if AreDrillingsMirrored( Proc, ProcB, b3Raw) then + if AreDrillingsMirrored( Proc, ProcB, Part) then Proc.Mirror = ProcB end end @@ -649,21 +649,6 @@ local function RunStrategyLibraries( sStrategyId) end end -------------------------------------------------------------------------------------------------------------- --- sovrascrivo i parametri personalizzati salvati su Proc a quelli di default dalla strategia -local function GetUpdateCustomParameters( CustomStrategyParamList, DefaultStrategyParamList) - if CustomStrategyParamList and #CustomStrategyParamList > 0 then - for i = 1, #DefaultStrategyParamList do - for j = 1, #CustomStrategyParamList do - if DefaultStrategyParamList[i].Name == CustomStrategyParamList[j].Name then - DefaultStrategyParamList[i].Value = CustomStrategyParamList[j].Value - end - end - end - end - return DefaultStrategyParamList -end - ------------------------------------------------------------------------------------------------------------- -- ritorna l'indice della strategia migliore, tra le due passate local function GetIndexBestStrategyFromComparison( AvailableStrategies, nIndex1, nIndex2) @@ -711,7 +696,7 @@ end ------------------------------------------------------------------------------------------------------------- -- funzione che processa tutte le feature sul pezzo e trova la miglior strategia di lavorazione tra quelle disponibili -local function GetBestStrategy( vProcSingleRot, b3Raw) +local function GetBestStrategy( vProcSingleRot, Part) -- per ogni feature for i = 1, #vProcSingleRot do -- processo tutte le feature attive @@ -721,32 +706,30 @@ local function GetBestStrategy( vProcSingleRot, b3Raw) if Proc.AvailableStrategies and #Proc.AvailableStrategies > 0 then local nIndexBestStrategy = 0 -- ciclo tutte le strategie della feature - for j = 1, #Proc.AvailableStrategies do + for nIndexCurrentStrategy = 1, #Proc.AvailableStrategies do -- eseguo file config con i parametri di default local CurrentStrategy = {} - CurrentStrategy = RunStrategyLibraries( Proc.AvailableStrategies[j].StrategyId) + CurrentStrategy = RunStrategyLibraries( Proc.AvailableStrategies[nIndexCurrentStrategy].StrategyId) -- controllo che le librerie siano state effettivamente caricate if CurrentStrategy.Config and CurrentStrategy.Script then - - -- salvo sul proc i parametri di defalt letti da strategia e personalizzati da interfaccia - -- N.B. : I parametri personalizzati non più presenti tra i default della strategia, verranno ignorati. Quelli extra avranno valore di default - Proc.AvailableStrategies[j].Parameters = GetUpdateCustomParameters( Proc.AvailableStrategies[j].Parameters, CurrentStrategy.Config.Parameters) - -- eseguo la strategia solo come calcolo fattibilità e voto. Non si applicano le lavorazioni. Si passa la Proc e i parametri personalizzati - Proc.AvailableStrategies[j].RatingResult = CurrentStrategy.Script.Make( false, Proc, Proc.AvailableStrategies[j].Parameters, b3Raw) + Proc.AvailableStrategies[nIndexCurrentStrategy].RatingResult = CurrentStrategy.Script.Make( false, Proc, Part, Proc.AvailableStrategies[nIndexCurrentStrategy].Parameters) -- scelgo la migliore strategia tra le due - nIndexBestStrategy = GetIndexBestStrategyFromComparison( Proc.AvailableStrategies, j, nIndexBestStrategy) + nIndexBestStrategy = GetIndexBestStrategyFromComparison( Proc.AvailableStrategies, nIndexCurrentStrategy, nIndexBestStrategy) -- se scelta strategia standard, esco subito alla prima che trovo completa - if BEAM.GetFirstCompletedStrategy then - break + -- TODO serve paraemtro da Beam&Wall ( oppure da confirgurazione) !!!!!!!! + if BEAM.GetFirstCompletedStrategy and nIndexBestStrategy > 0 then + if Proc.AvailableStrategies[nIndexBestStrategy].RatingResult.Status == 'Complete' then + break + end end -- se non trovo i file della strategia, scrivo che non è più disponibile else - Proc.AvailableStrategies[j].RatingResult = {} - Proc.AvailableStrategies[j].RatingResult.Info = 'Strategy not found' + Proc.AvailableStrategies[nIndexCurrentStrategy].RatingResult = {} + Proc.AvailableStrategies[nIndexCurrentStrategy].RatingResult.Info = 'Strategy not found' end end -- salvo sulla proc la migliore strategia @@ -761,7 +744,7 @@ end ------------------------------------------------------------------------------------------------------------- -- esegue le strategie migliori che ha precedentemente scelto -local function ExecPieceFeatures( vProc, b3Raw) +local function ExecPieceFeatures( vProc, Part) -- applico le strategie scelte for i = 1, #vProc do -- processo tutte le feature attive applicando le lavorazioni @@ -771,15 +754,15 @@ local function ExecPieceFeatures( vProc, b3Raw) local StrategyScriptName = '\\Strategies\\' .. Proc.ChosenStrategy.StrategyId .. '\\' .. Proc.ChosenStrategy.StrategyId local StrategyScript = require( StrategyScriptName) -- eseguo la strategia e si applicano le lavorazioni. Si passa la Proc e i parametri personalizzati - Proc = StrategyScript.Make( true, Proc, Proc.ChosenStrategy.Parameters) + Proc = StrategyScript.Make( true, Proc, Part, Proc.ChosenStrategy.Parameters) end end return vProc end ------------------------------------------------------------------------------------------------------------- -local function PrintFeatures( vProc, b3Raw) - EgtOutLog( ' RawBox=' .. tostring( b3Raw)) +local function PrintFeatures( vProc, Part) + EgtOutLog( ' RawBox=' .. tostring( Part.RawBox)) for i = 1, #vProc do local Proc = vProc[i] local sOut = string.format( ' Id=%3d Grp=%1d Prc=%3d TC=%2d/%d Flg=%2d Down=%s Side=%s Head=%s Tail=%s Fcse=%1d,%1d Diam=%.2f Fct=%2d Box=%s TopoName=%s', @@ -802,11 +785,13 @@ function BeamExec.ProcessFeatures() local nTotErr = 0 local Stats = {} local nOrd = 1 - local nRawId = EgtGetFirstRawPart() - while nRawId do + local Part = {} + Part.IdRaw = EgtGetFirstRawPart() + while Part.IdRaw do -- verifico che il grezzo contenga pezzi oppure sia abbastanza lungo da essere scaricato coi carrelli - local nPartId = EgtGetFirstPartInRawPart( nRawId) - if not nPartId and EgtGetRawPartBBox( nRawId):getDimX() < BeamData.MinRaw then break end + local nPartId = EgtGetFirstPartInRawPart( Part.IdRaw) + Part.RawBox = EgtGetRawPartBBox( Part.IdRaw) + if not nPartId and Part.RawBox:getDimX() < BeamData.MinRaw then break end -- per ogni rotazione, calcolo come lavorare le feature per decidere posizionamento iniziale e in che rotazione verranno lavorate le singole feature local vProcRot = {} @@ -820,30 +805,30 @@ function BeamExec.ProcessFeatures() -- TODO Il numero di rotazioni da calcolare deve dipendere dalle impostazionei del cliente. Per adesso si calcolano tutte e 4, ma può essere ottimizzato for dRotIndex = 1, 4 do - -- ingombro del grezzo - local b3Raw = EgtGetRawPartBBox( nRawId) -- recupero le feature di lavorazione della trave - table.insert( vProcRot, CollectFeatures( nPartId, b3Raw)) + table.insert( vProcRot, CollectFeatures( nPartId, Part)) -- recupero informazioni ausiliarie feature e dipendenze tra feature stesse -- TODO le dipendenze cambiano in base alla rotazione del pezzo? probabilmente no - vProcRot[dRotIndex] = GetFeatureInfoAndDependency( vProcRot[dRotIndex], b3Raw) + vProcRot[dRotIndex] = GetFeatureInfoAndDependency( vProcRot[dRotIndex], Part) -- sceglie la strategia migliore tra quelle disponibili ( presenti nella tabella vProcRot[dRotIndex].AvailableStrategies) - vProcRot[dRotIndex] = GetBestStrategy( vProcRot[dRotIndex], b3Raw) + vProcRot[dRotIndex] = GetBestStrategy( vProcRot[dRotIndex], Part) -- ruoto il grezzo per calcolare la fattibilità delle lavorazioni nella prossima rotazione -- vettore movimento grezzi per rotazione di 90deg ogni step - local dDeltaYZ = EgtGetRawPartBBox( nRawId):getDimY() - EgtGetRawPartBBox( nRawId):getDimZ() + local dDeltaYZ = Part.RawBox:getDimY() - Part.RawBox:getDimZ() local vtMove = Vector3d( 0, dDeltaYZ / 2 * EgtIf( BeamData.RIGHT_LOAD, -1, 1), dDeltaYZ / 2) local bPreMove = ( dDeltaYZ < 0) -- ruoto le travi della fase corrente if bPreMove then - EgtMoveRawPart( nRawId, vtMove) + EgtMoveRawPart( Part.IdRaw, vtMove) end - EgtRotateRawPart( nRawId, X_AX(), EgtIf( BeamData.RIGHT_LOAD, -90, 90)) + EgtRotateRawPart( Part.IdRaw, X_AX(), EgtIf( BeamData.RIGHT_LOAD, -90, 90)) if not bPreMove then - EgtMoveRawPart( nRawId, vtMove) + EgtMoveRawPart( Part.IdRaw, vtMove) end + -- aggiorno info pezzo + Part.RawBox = EgtGetRawPartBBox( Part.IdRaw) end -- TODO da rimuovere o lasciare solo per debug @@ -859,41 +844,39 @@ function BeamExec.ProcessFeatures() if nOrd == 1 then EgtSetCurrPhase( 1) else - BeamLib.AddPhaseWithRawParts( nRawId, BeamData.OriXR, BeamData.PosXR, 0) + BeamLib.AddPhaseWithRawParts( Part, BeamData.OriXR, BeamData.PosXR, 0) end local nPhase = EgtGetCurrPhase() local nDispId = EgtGetPhaseDisposition( nPhase) EgtSetInfo( nDispId, 'TYPE', EgtIf( nPartId, 'START', 'REST')) EgtSetInfo( nDispId, 'ORD', nOrd) - EgtOutLog( ' *** Phase=' .. tostring( nPhase) .. ' Raw=' .. tostring( nRawId) .. ' Part=' .. tostring( nPartId) .. ' ***', 1) - -- ingombro del grezzo - local b3Raw = EgtGetRawPartBBox( nRawId) + EgtOutLog( ' *** Phase=' .. tostring( nPhase) .. ' Raw=' .. tostring( Part.IdRaw) .. ' Part=' .. tostring( nPartId) .. ' ***', 1) -- debug if EgtGetDebugLevel() >= 1 then - PrintFeatures( vProc, b3Raw) + PrintFeatures( vProc, Part) end EgtOutLog( ' *** AddMachinings ***', 1) -- TODO ordinare feature e decidere spezzoni -- ordino le features - -- OrderFeatures( vProc, b3Raw) + -- OrderFeatures( vProc, Part) -- TODO da fare -- esegue le strategie migliori che ha precedentemente scelto - ExecPieceFeatures( vProc, b3Raw) + ExecPieceFeatures( vProc, Part) -- TODO riordinare lavorazioni ottimizzando cambio utensile/spezzone ecc..., mantenendo dipendenze definite prima -- ordino le lavorazioni - -- OrderMachining( vProc, b3Raw) + -- OrderMachining( vProc, Part) EgtOutLog( ' *** End AddMachinings ***', 1) -- passo al grezzo successivo nOrd = nOrd + 1 - nRawId = EgtGetNextRawPart( nRawId) + Part.IdRaw = EgtGetNextRawPart( Part.IdRaw) end return ( nTotErr == 0), Stats diff --git a/LuaLibs/BeamLib.lua b/LuaLibs/BeamLib.lua index 0644f38..5398f1f 100644 --- a/LuaLibs/BeamLib.lua +++ b/LuaLibs/BeamLib.lua @@ -90,9 +90,9 @@ function BeamLib.AddPartEndFace( PartId, b3Solid) end ------------------------------------------------------------------------------------------------------------- -function BeamLib.AddPhaseWithRawParts( nFirstRawId, OriXR, PosXR, dDeltaSucc) +function BeamLib.AddPhaseWithRawParts( Part, OriXR, PosXR, dDeltaSucc) EgtAddPhase() - local nRawId = nFirstRawId + local nRawId = Part.IdRaw local dRawMove = 0 while nRawId do EgtKeepRawPart( nRawId) @@ -210,8 +210,8 @@ function BeamLib.Is3EdgesApprox( Proc, idFace, nAddGrpId) end --------------------------------------------------------------------- ---- ritorna il riferimento di tipo OCS della faccia *idFace* della trimesh *nSurfId* e le dimensioni orizzontale e verticale, eventualmente limitate dal grezzo *b3Raw* -function BeamLib.GetFaceHvRefDim( nSurfId, idFace, b3Raw) +--- ritorna il riferimento di tipo OCS della faccia *idFace* della trimesh *nSurfId* e le dimensioni orizzontale e verticale, eventualmente limitate dal grezzo *Part.RawBox* +function BeamLib.GetFaceHvRefDim( nSurfId, idFace, Part) -- recupero centro e normale della faccia local ptC, vtN = EgtSurfTmFacetCenter( nSurfId, idFace, GDB_ID.ROOT) if not ptC or not vtN then @@ -227,14 +227,14 @@ function BeamLib.GetFaceHvRefDim( nSurfId, idFace, b3Raw) local dDimH = b3HV:getDimX() local dDimV = b3HV:getDimY() -- se definito grezzo (o solido), applico eventuali limiti - if b3Raw then + if Part.RawBox then local dCoeffY = abs( frHV:getVersX():getY()) if dCoeffY > GEO.EPS_SMALL then - dDimH = min( dDimH, b3Raw:getDimY() / dCoeffY) + dDimH = min( dDimH, Part.RawBox:getDimY() / dCoeffY) end local dCoeffZ = abs( frHV:getVersY():getZ()) if dCoeffZ > GEO.EPS_SMALL then - dDimV = min( dDimV, b3Raw:getDimZ() / dCoeffZ) + dDimV = min( dDimV, Part.RawBox:getDimZ() / dCoeffZ) end end @@ -242,5 +242,22 @@ function BeamLib.GetFaceHvRefDim( nSurfId, idFace, b3Raw) return frHV, dDimH, dDimV end +------------------------------------------------------------------------------------------------------------- +-- sovrascrivo i parametri personalizzati salvati su Proc a quelli di default dalla strategia +-- N.B. : I parametri personalizzati non più presenti tra i default della strategia, verranno ignorati. Quelli extra avranno valore di default +-- Il controllo deve essere fatto SEMPRE all'inizio di ogni strategia, per controllare conformità parametri custom +function BeamLib.GetUpdateCustomParameters( CustomStrategyParamList, DefaultStrategyParamList) + if CustomStrategyParamList and #CustomStrategyParamList > 0 then + for i = 1, #DefaultStrategyParamList do + for j = 1, #CustomStrategyParamList do + if DefaultStrategyParamList[i].Name == CustomStrategyParamList[j].Name then + DefaultStrategyParamList[i].Value = CustomStrategyParamList[j].Value + end + end + end + end + return DefaultStrategyParamList +end + ------------------------------------------------------------------------------------------------------------- return BeamLib diff --git a/LuaLibs/FeatureData.lua b/LuaLibs/FeatureData.lua index c0afcab..d6a4e32 100644 --- a/LuaLibs/FeatureData.lua +++ b/LuaLibs/FeatureData.lua @@ -110,15 +110,15 @@ end ------------------------------------------------------------------------------------------------------------- -- restituisce vero se la feature con box b3Proc taglia l'intera sezione della barra, rappresentata dalle sue dimensioni W e H -local function IsFeatureCuttingEntireSection( b3Proc, b3Raw) - return ( b3Proc:getDimY() > ( b3Raw:getDimY() - 500 * GEO.EPS_SMALL) and b3Proc:getDimZ() > ( b3Raw:getDimZ() - 500 * GEO.EPS_SMALL)) +local function IsFeatureCuttingEntireSection( b3Proc, Part) + return ( b3Proc:getDimY() > ( Part.RawBox:getDimY() - 500 * GEO.EPS_SMALL) and b3Proc:getDimZ() > ( Part.RawBox:getDimZ() - 500 * GEO.EPS_SMALL)) end ------------------------------------------------------------------------------------------------------------- -- restituisce vero se la feature con box b3Proc taglia l'intera lunghezza della barra, rappresentata dalle sue dimensioni W e L oppure H e L -local function IsFeatureCuttingEntireLength( b3Proc, b3Raw) - return ( ( b3Proc:getDimY() > ( b3Raw:getDimY() - 500 * GEO.EPS_SMALL) and b3Proc:getDimX() > ( b3Raw:getDimX() - 500 * GEO.EPS_SMALL)) or - ( b3Proc:getDimZ() > ( b3Raw:getDimZ() - 500 * GEO.EPS_SMALL) and b3Proc:getDimX() > ( b3Raw:getDimX() - 500 * GEO.EPS_SMALL))) +local function IsFeatureCuttingEntireLength( b3Proc, Part) + return ( ( b3Proc:getDimY() > ( Part.RawBox:getDimY() - 500 * GEO.EPS_SMALL) and b3Proc:getDimX() > ( Part.RawBox:getDimX() - 500 * GEO.EPS_SMALL)) or + ( b3Proc:getDimZ() > ( Part.RawBox:getDimZ() - 500 * GEO.EPS_SMALL) and b3Proc:getDimX() > ( Part.RawBox:getDimX() - 500 * GEO.EPS_SMALL))) end --------------------------------------------------------------------- @@ -130,13 +130,13 @@ end --------------------------------------------------------------------- -- recupera topologia feature -function FeatureData.ClassifyTopology( Proc, b3Raw) +function FeatureData.ClassifyTopology( Proc, Part) local FeatureTopology = {} if not Proc.AffectedFaces then Proc.AffectedFaces = BeamLib.GetAffectedFaces( Proc) end - local bIsFeatureCuttingEntireSection = IsFeatureCuttingEntireSection( Proc.Box, b3Raw) - local bIsFeatureCuttingEntireLength = IsFeatureCuttingEntireLength( Proc.Box, b3Raw) + local bIsFeatureCuttingEntireSection = IsFeatureCuttingEntireSection( Proc.Box, Part) + local bIsFeatureCuttingEntireLength = IsFeatureCuttingEntireLength( Proc.Box, Part) local bIsAnyDimensionLongAsPart = IsAnyDimensionLongAsPart( Proc) local vAdj = Proc.AdjacencyMatrix local bAllAnglesConcave, bAllRightAngles = AreAllAnglesConcaveOrRight( vAdj) diff --git a/Strategies/STR0001/STR0001.lua b/Strategies/STR0001/STR0001.lua index bdb081c..b8bc90e 100644 --- a/Strategies/STR0001/STR0001.lua +++ b/Strategies/STR0001/STR0001.lua @@ -1,10 +1,17 @@ -- Strategia: STR0001 +-- carico librerie +local BeamLib = require( 'BeamLib') + -- Tabella per definizione modulo local STR0001 = {} ------------------------------------------------------------------------------------------------------------- -function STR0001.Make( AddMachining, Proc, Parameters) +function STR0001.Make( AddMachining, Proc, Part, CustomParameters) + -- carico parametri de default e li aggiorno con quelli passati dal chiamante (potrebbero non essere congruenti) + local StrategyLib = {} + StrategyLib.Config = require( 'STR0001\\STR0001Config') + CustomParameters = BeamLib.GetUpdateCustomParameters( CustomParameters, StrategyLib.Config.Parameters) end diff --git a/Strategies/STR0002/STR0002.lua b/Strategies/STR0002/STR0002.lua index ceb8cbc..bcc12ff 100644 --- a/Strategies/STR0002/STR0002.lua +++ b/Strategies/STR0002/STR0002.lua @@ -1,10 +1,17 @@ -- Strategia: STR0002 +-- carico librerie +local BeamLib = require( 'BeamLib') + -- Tabella per definizione modulo local STR0002 = {} ------------------------------------------------------------------------------------------------------------- -function STR0002.Make( AddMachining, Proc, Parameters) +function STR0002.Make( AddMachining, Proc, Part, CustomParameters) + -- carico parametri de default e li aggiorno con quelli passati dal chiamante (potrebbero non essere congruenti) + local StrategyLib = {} + StrategyLib.Config = require( 'STR0002\\STR0002Config') + CustomParameters = BeamLib.GetUpdateCustomParameters( CustomParameters, StrategyLib.Config.Parameters) end