diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index b651358..8ae0b48 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -29,6 +29,7 @@ EgtMdbSave() ------------------------------------------------------------------------------------------------------------- TOOLS = nil STRATEGIES = nil +MACHININGS = nil ------------------------------------------------------------------------------------------------------------- -- *** COSTANTI *** TODO -> DA SPOSTARE IN BEAMDATA??? @@ -825,7 +826,9 @@ end ------------------------------------------------------------------------------------------------------------- -- esegue le strategie migliori che ha precedentemente scelto -local function ExecPieceFeatures( vProc, Part) +local function CalculateMachinings( vProc, Part) + local bAreAllApplyOk = true + MACHININGS = {} -- applico le strategie scelte for i = 1, #vProc do -- processo tutte le feature attive applicando le lavorazioni @@ -835,7 +838,7 @@ local function ExecPieceFeatures( vProc, Part) local StrategyScriptName = Proc.ChosenStrategy.sStrategyId .. '\\' .. Proc.ChosenStrategy.sStrategyId 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, Part, Proc.ChosenStrategy.Parameters) + bAreAllApplyOk, _ = StrategyScript.Make( true, Proc, Part, Proc.ChosenStrategy.Parameters) end end return vProc @@ -959,13 +962,17 @@ end vProc = OrderFeatures( vProc) -- TODO da fare - -- esegue le strategie migliori che ha precedentemente scelto - ExecPieceFeatures( vProc, Part) + MACHININGS = {} + -- esegue le strategie migliori che ha precedentemente scelto e salva le lavorazioni nella lista globale + CalculateMachinings( vProc, Part) -- TODO riordinare lavorazioni ottimizzando cambio utensile/spezzone ecc..., mantenendo dipendenze definite prima -- ordino le lavorazioni -- OrderMachining( vProc, Part) + -- aggiunge effettivamente le lavorazioni + MachiningLib.AddOperations( vProc, Part) + -- TODO da rimuovere o lasciare solo per debug if EgtGetDebugLevel() >= 3 then diff --git a/LuaLibs/MachiningLib.lua b/LuaLibs/MachiningLib.lua index 109b7ea..8e9a543 100644 --- a/LuaLibs/MachiningLib.lua +++ b/LuaLibs/MachiningLib.lua @@ -291,192 +291,201 @@ function MachiningLib.FindChainSaw( Proc, ToolSearchParameters) end ------------------------------------------------------------------------------------------------------------- --- funzione per aggiungere una nuova lavorazione --- TODO da fare -function MachiningLib.AddNewMachining( Proc, Machining) - local nErr - local sErr = '' - +-- salva in lista globale la lavorazione appena calcolata +function MachiningLib.AddNewMachining( ProcToAdd, MachiningToAdd) -- Controllo parametri obbligatori - if not Machining.nType or not Machining.nToolIndex or not Machining.Geometry or not Proc.id then - return false, sErr + if not MachiningToAdd.nType or not MachiningToAdd.nToolIndex or not MachiningToAdd.Geometry or not ProcToAdd.id then + return false end -- Drilling - if Machining.nType == MCH_MY.DRILLING then - Machining.sTypeName = 'Drill_' + if MachiningToAdd.nType == MCH_MY.DRILLING then + MachiningToAdd.sTypeName = 'Drill_' -- Milling - elseif Machining.nType == MCH_MY.MILLING then + elseif MachiningToAdd.nType == MCH_MY.MILLING then -- se utensile lama - if TOOLS[Machining.nToolIndex].sFamily == 'SAWBLADE' then - Machining.sTypeName = 'Cut_' + if TOOLS[MachiningToAdd.nToolIndex].sFamily == 'SAWBLADE' then + MachiningToAdd.sTypeName = 'Cut_' else - Machining.sTypeName = 'Mill_' + MachiningToAdd.sTypeName = 'Mill_' end -- Pocketing - elseif Machining.nType == MCH_MY.POCKETING then - Machining.sTypeName = 'Pocket_' + elseif MachiningToAdd.nType == MCH_MY.POCKETING then + MachiningToAdd.sTypeName = 'Pocket_' -- Mortising - elseif Machining.nType == MCH_MY.MORTISING then - Machining.sTypeName = 'ChSaw_' + elseif MachiningToAdd.nType == MCH_MY.MORTISING then + MachiningToAdd.sTypeName = 'ChSaw_' end - -- se nome non definito, assegno alla lavorazioen un nome standard - if not Machining.sOperationName then - Machining.sOperationName = Machining.sTypeName .. ( EgtGetName( Proc.id) or tostring( Proc.id)) .. '_' .. tostring( Machining.idFaceToMachine) + if not MachiningToAdd.sOperationName then + MachiningToAdd.sOperationName = MachiningToAdd.sTypeName .. ( EgtGetName( ProcToAdd.id) or tostring( ProcToAdd.id)) .. '_' .. tostring( MachiningToAdd.idFaceToMachine) end - if not Machining.sToolName then - Machining.sToolName = TOOLS[Machining.nToolIndex].sName + if not MachiningToAdd.sToolName then + MachiningToAdd.sToolName = TOOLS[MachiningToAdd.nToolIndex].sName end + local MachiningAppo = {} + MachiningAppo.Proc = ProcToAdd + MachiningAppo.Machining = MachiningToAdd + table.insert( MACHININGS, MachiningAppo) + return true +end - -- creazione lavorazione - local nOperationId = EgtCreateMachining( Machining.sOperationName, Machining.nType, Machining.sToolName) +------------------------------------------------------------------------------------------------------------- +-- funzione per aggiungere una nuova lavorazione +function MachiningLib.AddOperations( vProc, Part) + local nErr + local sErr = '' - if nOperationId then - -- impostazione geometria - EgtSetMachiningGeometry( Machining.Geometry) + for i = 1, #MACHININGS do + -- creazione lavorazione + local nOperationId = EgtCreateMachining( MACHININGS[i].Machining.sOperationName, MACHININGS[i].Machining.nType, MACHININGS[i].Machining.sToolName) - -- impostazione parametri lavorazione - if Machining.sDepth then - EgtSetMachiningParam( MCH_MP.DEPTH_STR, Machining.sDepth) - end - if Machining.bInvert then - EgtSetMachiningParam( MCH_MP.INVERT, Machining.bInvert) - end - if Machining.nWorkside then - EgtSetMachiningParam( MCH_MP.WORKSIDE, Machining.nWorkside) - end - if Machining.nFaceuse then - EgtSetMachiningParam( MCH_MP.FACEUSE, Machining.nFaceuse) - end - if Machining.nSCC then - EgtSetMachiningParam( MCH_MP.SCC, Machining.nSCC) - end - if Machining.bToolInvert then - EgtSetMachiningParam( MCH_MP.TOOLINVERT, Machining.bToolInvert) - end - if Machining.sBlockedAxis then - EgtSetMachiningParam( MCH_MP.BLOCKEDAXIS, Machining.sBlockedAxis) - end - if Machining.sInitialAngles then - EgtSetMachiningParam( MCH_MP.INITANGS, Machining.sInitialAngles) - end - if Machining.nHeadSide then - EgtSetMachiningParam( MCH_MP.HEADSIDE, Machining.nHeadSide) - end - if Machining.nSubType then - EgtSetMachiningParam( MCH_MP.SUBTYPE, Machining.nSubType) - end - if Machining.dOverlap then - EgtSetMachiningParam( MCH_MP.OVERL, Machining.dOverlap) - end + if nOperationId then + -- impostazione geometria + EgtSetMachiningGeometry( MACHININGS[i].Machining.Geometry) - -- step - if Machining.Steps then - if Machining.Steps.dStepType then - EgtSetMachiningParam( MCH_MP.STEPTYPE, Machining.Steps.dStepType) + -- impostazione parametri lavorazione + if MACHININGS[i].Machining.sDepth then + EgtSetMachiningParam( MCH_MP.DEPTH_STR, MACHININGS[i].Machining.sDepth) end - if Machining.Steps.dStep then - EgtSetMachiningParam( MCH_MP.STEP, Machining.Steps.dStep) + if MACHININGS[i].Machining.bInvert then + EgtSetMachiningParam( MCH_MP.INVERT, MACHININGS[i].Machining.bInvert) end - if Machining.Steps.dSideStep then - EgtSetMachiningParam( MCH_MP.SIDESTEP, Machining.Steps.dSideStep) + if MACHININGS[i].Machining.nWorkside then + EgtSetMachiningParam( MCH_MP.WORKSIDE, MACHININGS[i].Machining.nWorkside) + end + if MACHININGS[i].Machining.nFaceuse then + EgtSetMachiningParam( MCH_MP.FACEUSE, MACHININGS[i].Machining.nFaceuse) + end + if MACHININGS[i].Machining.nSCC then + EgtSetMachiningParam( MCH_MP.SCC, MACHININGS[i].Machining.nSCC) + end + if MACHININGS[i].Machining.bToolInvert then + EgtSetMachiningParam( MCH_MP.TOOLINVERT, MACHININGS[i].Machining.bToolInvert) + end + if MACHININGS[i].Machining.sBlockedAxis then + EgtSetMachiningParam( MCH_MP.BLOCKEDAXIS, MACHININGS[i].Machining.sBlockedAxis) + end + if MACHININGS[i].Machining.sInitialAngles then + EgtSetMachiningParam( MCH_MP.INITANGS, MACHININGS[i].Machining.sInitialAngles) + end + if MACHININGS[i].Machining.nHeadSide then + EgtSetMachiningParam( MCH_MP.HEADSIDE, MACHININGS[i].Machining.nHeadSide) + end + if MACHININGS[i].Machining.nSubType then + EgtSetMachiningParam( MCH_MP.SUBTYPE, MACHININGS[i].Machining.nSubType) + end + if MACHININGS[i].Machining.dOverlap then + EgtSetMachiningParam( MCH_MP.OVERL, MACHININGS[i].Machining.dOverlap) end - end - if Machining.dStartPos then - EgtSetMachiningParam( MCH_MP.STARTPOS, Machining.dStartPos) - end - if Machining.dReturnPos then - EgtSetMachiningParam( MCH_MP.RETURNPOS, Machining.dReturnPos) - end + -- step + if MACHININGS[i].Machining.Steps then + if MACHININGS[i].Machining.Steps.dStepType then + EgtSetMachiningParam( MCH_MP.STEPTYPE, MACHININGS[i].Machining.Steps.dStepType) + end + if MACHININGS[i].Machining.Steps.dStep then + EgtSetMachiningParam( MCH_MP.STEP, MACHININGS[i].Machining.Steps.dStep) + end + if MACHININGS[i].Machining.Steps.dSideStep then + EgtSetMachiningParam( MCH_MP.SIDESTEP, MACHININGS[i].Machining.Steps.dSideStep) + end + end - if Machining.dRadialOffset then - EgtSetMachiningParam( MCH_MP.OFFSR, Machining.dRadialOffset) - end - if Machining.dLongitudinalOffset then - EgtSetMachiningParam( MCH_MP.OFFSL, Machining.dLongitudinalOffset) - end + if MACHININGS[i].Machining.dStartPos then + EgtSetMachiningParam( MCH_MP.STARTPOS, MACHININGS[i].Machining.dStartPos) + end + if MACHININGS[i].Machining.dReturnPos then + EgtSetMachiningParam( MCH_MP.RETURNPOS, MACHININGS[i].Machining.dReturnPos) + end - -- paraemtri attacco - if Machining.LeadIn then - if Machining.LeadIn.nType then - EgtSetMachiningParam( MCH_MP.LEADINTYPE, Machining.LeadIn.nType) + if MACHININGS[i].Machining.dRadialOffset then + EgtSetMachiningParam( MCH_MP.OFFSR, MACHININGS[i].Machining.dRadialOffset) end - if Machining.LeadIn.dStartAddLength then - EgtSetMachiningParam( MCH_MP.STARTADDLEN, Machining.LeadIn.dStartAddLength) + if MACHININGS[i].Machining.dLongitudinalOffset then + EgtSetMachiningParam( MCH_MP.OFFSL, MACHININGS[i].Machining.dLongitudinalOffset) end - if Machining.LeadIn.dTangentDistance then - EgtSetMachiningParam( MCH_MP.LITANG, Machining.LeadIn.dTangentDistance) - end - if Machining.LeadIn.dPerpDistance then - EgtSetMachiningParam( MCH_MP.LIPERP, Machining.LeadIn.dPerpDistance) - end - if Machining.LeadIn.dElevation then - EgtSetMachiningParam( MCH_MP.LIELEV, Machining.LeadIn.dElevation) - end - if Machining.LeadIn.dCompLength then - EgtSetMachiningParam( MCH_MP.LICOMPLEN, Machining.LeadIn.dCompLength) - end - end - -- parametri uscita - if Machining.LeadOut then - if Machining.LeadOut.nType then - EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, Machining.LeadOut.nType) - end - if Machining.LeadOut.dEndAddLength then - EgtSetMachiningParam( MCH_MP.ENDADDLEN, Machining.LeadOut.dEndAddLength) - end - if Machining.LeadOut.dTangentDistance then - EgtSetMachiningParam( MCH_MP.LOTANG, Machining.LeadOut.dTangentDistance) - end - if Machining.LeadOut.dPerpDistance then - EgtSetMachiningParam( MCH_MP.LOPERP, Machining.LeadOut.dPerpDistance) - end - if Machining.LeadOut.dElevation then - EgtSetMachiningParam( MCH_MP.LOELEV, Machining.LeadOut.dElevation) - end - if Machining.LeadOut.dCompLength then - EgtSetMachiningParam( MCH_MP.LOCOMPLEN, Machining.LeadOut.dCompLength) - end - end - if Machining.dStartSlowLen then - EgtSetMachiningParam( MCH_MP.STARTSLOWLEN, Machining.dStartSlowLen) - end - if Machining.dEndSlowLen then - EgtSetMachiningParam( MCH_MP.ENDSLOWLEN, Machining.dEndSlowLen) - end - if Machining.dThrouAddLen then - EgtSetMachiningParam( MCH_MP.THROUADDLEN, Machining.dThrouAddLen) - end + -- paraemtri attacco + if MACHININGS[i].Machining.LeadIn then + if MACHININGS[i].Machining.LeadIn.nType then + EgtSetMachiningParam( MCH_MP.LEADINTYPE, MACHININGS[i].Machining.LeadIn.nType) + end + if MACHININGS[i].Machining.LeadIn.dStartAddLength then + EgtSetMachiningParam( MCH_MP.STARTADDLEN, MACHININGS[i].Machining.LeadIn.dStartAddLength) + end + if MACHININGS[i].Machining.LeadIn.dTangentDistance then + EgtSetMachiningParam( MCH_MP.LITANG, MACHININGS[i].Machining.LeadIn.dTangentDistance) + end + if MACHININGS[i].Machining.LeadIn.dPerpDistance then + EgtSetMachiningParam( MCH_MP.LIPERP, MACHININGS[i].Machining.LeadIn.dPerpDistance) + end + if MACHININGS[i].Machining.LeadIn.dElevation then + EgtSetMachiningParam( MCH_MP.LIELEV, MACHININGS[i].Machining.LeadIn.dElevation) + end + if MACHININGS[i].Machining.LeadIn.dCompLength then + EgtSetMachiningParam( MCH_MP.LICOMPLEN, MACHININGS[i].Machining.LeadIn.dCompLength) + end + end + -- parametri uscita + if MACHININGS[i].Machining.LeadOut then + if MACHININGS[i].Machining.LeadOut.nType then + EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, MACHININGS[i].Machining.LeadOut.nType) + end + if MACHININGS[i].Machining.LeadOut.dEndAddLength then + EgtSetMachiningParam( MCH_MP.ENDADDLEN, MACHININGS[i].Machining.LeadOut.dEndAddLength) + end + if MACHININGS[i].Machining.LeadOut.dTangentDistance then + EgtSetMachiningParam( MCH_MP.LOTANG, MACHININGS[i].Machining.LeadOut.dTangentDistance) + end + if MACHININGS[i].Machining.LeadOut.dPerpDistance then + EgtSetMachiningParam( MCH_MP.LOPERP, MACHININGS[i].Machining.LeadOut.dPerpDistance) + end + if MACHININGS[i].Machining.LeadOut.dElevation then + EgtSetMachiningParam( MCH_MP.LOELEV, MACHININGS[i].Machining.LeadOut.dElevation) + end + if MACHININGS[i].Machining.LeadOut.dCompLength then + EgtSetMachiningParam( MCH_MP.LOCOMPLEN, MACHININGS[i].Machining.LeadOut.dCompLength) + end + end - -- parametri da settare nelle note di sistema - -- TODO da decidere quali sono le note da salvare qui. Probabilmente tutte quelle relative all'ordine delle lavorazioni - local sSystemNotes = EgtGetMachiningParam( MCH_MP.SYSNOTES) - --if Machining.nMachiningOrder then - -- sSystemNotes = EgtSetValInNotes( sSystemNotes, 'MachiningOrder', Machining.nMachiningOrder) - --end - EgtSetMachiningParam( MCH_MP.SYSNOTES, sSystemNotes) + if MACHININGS[i].Machining.dStartSlowLen then + EgtSetMachiningParam( MCH_MP.STARTSLOWLEN, MACHININGS[i].Machining.dStartSlowLen) + end + if MACHININGS[i].Machining.dEndSlowLen then + EgtSetMachiningParam( MCH_MP.ENDSLOWLEN, MACHININGS[i].Machining.dEndSlowLen) + end + if MACHININGS[i].Machining.dThrouAddLen then + EgtSetMachiningParam( MCH_MP.THROUADDLEN, MACHININGS[i].Machining.dThrouAddLen) + end - -- parametri da settare nelle note utente - local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) - if Machining.dMaxElev then - sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', Machining.dMaxElev) - end - EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes) + -- parametri da settare nelle note di sistema + -- TODO da decidere quali sono le note da salvare qui. Probabilmente tutte quelle relative all'ordine delle lavorazioni + local sSystemNotes = EgtGetMachiningParam( MCH_MP.SYSNOTES) + --if MACHININGS[i].Machining.nMachiningOrder then + -- sSystemNotes = EgtSetValInNotes( sSystemNotes, 'MachiningOrder', MACHININGS[i].Machining.nMachiningOrder) + --end + EgtSetMachiningParam( MCH_MP.SYSNOTES, sSystemNotes) - local bIsApplyOk = MachiningLib.ApplyMachining( true, false) - if not bIsApplyOk then - nErr, sErr = EgtGetLastMachMgrError() - EgtSetOperationMode( nOperationId, false) + -- parametri da settare nelle note utente + local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) + if MACHININGS[i].Machining.dMaxElev then + sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', MACHININGS[i].Machining.dMaxElev) + end + EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes) + + local bIsApplyOk = MachiningLib.ApplyMachining( true, false) + if not bIsApplyOk then + nErr, sErr = EgtGetLastMachMgrError() + EgtSetOperationMode( nOperationId, false) + return false, sErr + end + else return false, sErr end - else - return false, sErr - end - return true, sErr + end + return true, sErr end ------------------------------------------------------------------------------------------------------------- diff --git a/Strategies/STR0002/STR0002.lua b/Strategies/STR0002/STR0002.lua index 82f3142..a7a0f05 100644 --- a/Strategies/STR0002/STR0002.lua +++ b/Strategies/STR0002/STR0002.lua @@ -91,7 +91,7 @@ local function GetBestPocketingStrategy( Proc) ToolSearchParameters.dMaxToolDiameter = min( Strategy.Parameters.dMaxCornerRadius * 2, dFaceHeight, dFaceWidth) -- cerco fresa che può anche non lavorare di testa elseif Proc.Topology.sName == 'Groove-4-Blind' then - local dFaceWidth = Proc.MainFaces.BottomFaces[1].MainEdges.LongEdges[1].dLength + local dFaceWidth = Proc.MainFaces.BottomFaces[2].MainEdges.BottomEdge.dLength ToolSearchParameters.sType = 'MILL_NOTIP' ToolSearchParameters.dMaxToolDiameter = min( Strategy.Parameters.dMaxCornerRadius * 2, dFaceWidth) elseif Proc.Topology.sName == 'Groove-3-Through' then @@ -154,7 +154,14 @@ local function GetBestPocketingStrategy( Proc) Milling = {} Milling.bIsApplicable = false if Proc.Topology.sName ~= 'Pocket-5-Blind' then - if Proc.Topology.sName == 'Groove-4-Blind' or Proc.Topology.sName == 'Groove-3-Blind' then + if Proc.Topology.sName == 'Groove-4-Blind' then + ToolSearchParameters.dElevation = Proc.MainFaces.BottomFaces[2].dElevation + ToolSearchParameters.vtToolDirection = Proc.MainFaces.BottomFaces[2].vtN + Milling.vtFaceNormal = Proc.MainFaces.BottomFaces[2].vtN + Milling.idFaceToMachine = Proc.MainFaces.BottomFaces[2].id + Milling.idProc = Proc.id + Milling.dElevation = Proc.MainFaces.BottomFaces[2].dElevation + elseif Proc.Topology.sName == 'Groove-3-Blind' then ToolSearchParameters.dElevation = Proc.MainFaces.LongFaces[1].dElevation ToolSearchParameters.vtToolDirection = Proc.MainFaces.LongFaces[1].vtN Milling.vtFaceNormal = Proc.MainFaces.LongFaces[1].vtN @@ -340,7 +347,7 @@ function STR0002.Make( bAddMachining, Proc, Part, CustomParameters) return false, Strategy.Result end - local bApplyMachiningOK = true + local bAreAllApplyOk = true local ToolInfo = {} local Pocketing = {} Pocketing.Steps = {} @@ -439,7 +446,7 @@ function STR0002.Make( bAddMachining, Proc, Part, CustomParameters) _, vtNSplitFace = EgtSurfTmFacetCenter( vAddId[i], k - 1, GDB_ID.ROOT) if vtNSplitFace and AreSameVectorApprox( vtNSplitFace, Strategy.Machining[j].vtFaceNormal) then Pocketing.Geometry = {{ vAddId[i], k - 1}} - bApplyMachiningOK, Strategy.Result.sInfo = MachiningLib.AddNewMachining( Proc, Pocketing) + bAreAllApplyOk = MachiningLib.AddNewMachining( Proc, Pocketing) break end end @@ -462,15 +469,15 @@ function STR0002.Make( bAddMachining, Proc, Part, CustomParameters) Pocketing.bToolInvert = true end Pocketing.Geometry = {{ Strategy.Machining[i].idProc, Strategy.Machining[i].idFaceToMachine}} - bApplyMachiningOK, Strategy.Result.sInfo = MachiningLib.AddNewMachining( Proc, Pocketing) + bAreAllApplyOk = MachiningLib.AddNewMachining( Proc, Pocketing) end end end else - bApplyMachiningOK = false + bAreAllApplyOk = false end - return bApplyMachiningOK, Strategy.Result + return bAreAllApplyOk, Strategy.Result end -------------------------------------------------------------------------------------------------------------