diff --git a/CAMAuto/LuaLibs/FeatureData.lua b/CAMAuto/LuaLibs/FeatureData.lua index 7907e0f..5f757a3 100644 --- a/CAMAuto/LuaLibs/FeatureData.lua +++ b/CAMAuto/LuaLibs/FeatureData.lua @@ -20,6 +20,27 @@ function FeatureData.GetDrillingData( Proc) return Proc end +------------------------------------------------------------------------------------------------------------- +-- Recupero dati taglio +function FeatureData.GetCuttingData( Proc) + + return Proc +end + +------------------------------------------------------------------------------------------------------------- +-- Recupero dati foro +function FeatureData.GetPocketingData( Proc) + + return Proc +end + +------------------------------------------------------------------------------------------------------------- +-- Recupero dati foro +function FeatureData.GetMillingData( Proc) + + return Proc +end + ------------------------------------------------------------------------------------------------------------- -- Recupero dati profilatura function FeatureData.GetProfilingData( Proc) @@ -29,8 +50,8 @@ function FeatureData.GetProfilingData( Proc) for t = 1, Proc.nToolsToUse do local Data = {} Data.sName = EgtGetInfo( Proc.id, 'TOOL_NAME_' .. tostring(t), 's') or 0 - Data.dRadialOvermat = EgtGetInfo( Proc.id, 'OFFR_' .. tostring(t), 'd') or 0 - Data.dLongitudinalOvermat = EgtGetInfo( Proc.id, 'OFFL_' .. tostring(t), 'd') or 0 + Data.dRadialOffset = EgtGetInfo( Proc.id, 'OFFR_' .. tostring(t), 'd') or 0 + Data.dLongitudinalOffset = EgtGetInfo( Proc.id, 'OFFL_' .. tostring(t), 'd') or 0 Data.sSide = EgtGetInfo( Proc.id, 'N', 's') or 0 table.insert( Proc.Tools, Data) end diff --git a/CAMAuto/LuaLibs/MachiningLib.lua b/CAMAuto/LuaLibs/MachiningLib.lua index f39f4cd..fbb61ef 100644 --- a/CAMAuto/LuaLibs/MachiningLib.lua +++ b/CAMAuto/LuaLibs/MachiningLib.lua @@ -8,57 +8,10 @@ local MachiningLib = {} require( 'EgtBase') -- Carico i dati globali -local BeamData = require( 'BeamData') +local WinData = require( 'WinData') EgtOutLog( ' MachiningLib started', 1) ---------------------------------------------------------------------- --- TODO da considerare solo angolo 2D?? -local function GetToolEntryAngle( Proc, vtTool) - local Angle = {} - - local dSinAngle = -10 * GEO.EPS_SMALL - local vtNorm - if Proc.AffectedFaces.bTop then - vtNorm = Z_AX() - dSinAngle = max( dSinAngle, vtTool * vtNorm) - end - if Proc.AffectedFaces.bBottom then - vtNorm = -Z_AX() - dSinAngle = max( dSinAngle, vtTool * vtNorm) - end - if Proc.AffectedFaces.bFront then - vtNorm = -Y_AX() - dSinAngle = max( dSinAngle, vtTool * vtNorm) - end - if Proc.AffectedFaces.bBack then - vtNorm = Y_AX() - dSinAngle = max( dSinAngle, vtTool * vtNorm) - end - if Proc.AffectedFaces.bLeft then - vtNorm = -X_AX() - dSinAngle = max( dSinAngle, vtTool * vtNorm) - end - if Proc.AffectedFaces.bRight then - vtNorm = X_AX() - dSinAngle = max( dSinAngle, vtTool * vtNorm) - end - - local dCosAngle = sqrt( 1 - sqr( dSinAngle)) - local dAngle = acos( dCosAngle) - local dTanAngle - if dAngle ~= 0 and dAngle ~= 90 then - dTanAngle = sqrt( 1 - dCosAngle * dCosAngle) / dCosAngle - end - - Angle.dValue = dAngle - Angle.dSin = dSinAngle - Angle.dCos = dCosAngle - Angle.dTan = dTanAngle - - return Angle - end - ------------------------------------------------------------------------------------------------------------- -- funzione per cercare utensile tipo FRESA con certe caratteristiche function MachiningLib.FindMill( Proc, ToolSearchParameters) @@ -92,19 +45,10 @@ function MachiningLib.FindMill( Proc, ToolSearchParameters) -- scelgo il migliore if bIsToolCompatible then - -- calcolo riduzione del massimo materiale utilizzabile - local ToolEntryAngle = GetToolEntryAngle( Proc, ToolSearchParameters.vtToolDirection) -- se ToolHolder più grande dell'utensile, il primo oggetto in collisione è il ToolHolder. Altrimenti il motore. - local dDimObjToCheck = EgtIf( TOOLS[i].ToolHolder.dDiameter > TOOLS[i].dDiameter, TOOLS[i].ToolHolder.dDiameter, BeamData.C_SIMM_ENC) - local dCurrentMaxMatReduction = BeamData.COLL_SIC or 5 + local dDimObjToCheck = EgtIf( TOOLS[i].ToolHolder.dDiameter > TOOLS[i].dDiameter, TOOLS[i].ToolHolder.dDiameter, WinData.C_SIMM_ENC) + local dCurrentMaxMatReduction = WinData.COLL_SIC or 5 - -- TODO implementare le funzioni di Tool Collision Avoidance (vedi wiki e FacesBysaw -> CalcLeadInOutPerpGeom) - -- TODO considerare anche il caso in cui lo stelo sia più grande del diametro utensile - -- TODO nei confronti tra valori gestire tolleranze - -- calcolo riduzione per non toccare con ToolHolder / Motore - if ToolEntryAngle.dValue > 0 and ToolEntryAngle.dValue < 90 then - dCurrentMaxMatReduction = dCurrentMaxMatReduction / ToolEntryAngle.dSin + ( ( dDimObjToCheck - TOOLS[i].dDiameter) / 2) / ToolEntryAngle.dTan - end -- dCurrMachReduction = negativo -> limitare, positivo -> mm extra disponibili local dCurrentResidualDepth = ToolSearchParameters.dElevation + dCurrentMaxMatReduction - TOOLS[i].dMaxDepth @@ -210,7 +154,7 @@ function MachiningLib.AddNewMachining( ProcToAdd, MachiningToAdd) end -- se nome non definito, assegno alla lavorazioen un nome standard if not MachiningToAdd.sOperationName then - MachiningToAdd.sOperationName = MachiningToAdd.sTypeName .. ( EgtGetName( ProcToAdd.id) or tostring( ProcToAdd.id)) .. '_' .. tostring( MachiningToAdd.Geometry[1][2]) + MachiningToAdd.sOperationName = MachiningToAdd.sTypeName .. ( EgtGetName( ProcToAdd.id) or tostring( ProcToAdd.id)) -- TODO serve scrivere faccia? -->> .. '_' .. tostring( MachiningToAdd.Geometry[1][2]) end if not MachiningToAdd.sToolName then MachiningToAdd.sToolName = TOOLS[MachiningToAdd.nToolIndex].sName @@ -244,8 +188,8 @@ function MachiningLib.AddOperations( vProc, Part) if MACHININGS[i].Machining.bInvert then EgtSetMachiningParam( MCH_MP.INVERT, MACHININGS[i].Machining.bInvert) end - if MACHININGS[i].Machining.nWorkside then - EgtSetMachiningParam( MCH_MP.WORKSIDE, MACHININGS[i].Machining.nWorkside) + 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) diff --git a/CAMAuto/LuaLibs/WinExec.lua b/CAMAuto/LuaLibs/WinExec.lua index c79d716..cc90529 100644 --- a/CAMAuto/LuaLibs/WinExec.lua +++ b/CAMAuto/LuaLibs/WinExec.lua @@ -12,6 +12,20 @@ local WinData = require( 'WinData') local WinLib = require( 'WinLib') local ID = require( 'Identity') local FeatureData = require( 'FeatureData') +local MachiningLib = require( 'MachiningLib') + +-- carico librerie di lavorazione +_G.package.loaded.Drilling = nil +_G.package.loaded.Cutting = nil +_G.package.loaded.Pocketing = nil +_G.package.loaded.Milling = nil +_G.package.loaded.Profiling = nil +local Drilling = require( 'Drilling') +local Cutting = require( 'Cutting') +local Pocketing = require( 'Pocketing') +local Milling = require( 'Milling') +local Profiling = require( 'Profiling') + EgtOutLog( ' WinExec started', 1) EgtMdbSave() @@ -23,7 +37,7 @@ TOOLS = nil MACHININGS = nil ------------------------------------------------------------------------------------------------------------- --- *** COSTANTI *** TODO -> DA SPOSTARE IN BEAMDATA??? +-- *** COSTANTI *** TODO -> DA SPOSTARE IN WINDATA??? ------------------------------------------------------------------------------------------------------------- TH_DIAMETER_HSK63 = 63 TH_LENGTH_HSK63 = 75 @@ -116,10 +130,10 @@ function WinExec.GetToolsFromDB() Tool.Feeds.dStartFeed = EgtTdbGetCurrToolParam( MCH_TP.STARTFEED) Tool.Feeds.dEndFeed = EgtTdbGetCurrToolParam( MCH_TP.ENDFEED) Tool.Feeds.dTipFeed = EgtTdbGetCurrToolParam( MCH_TP.TIPFEED) - -- TODO serve funzione in BeamData che data la posizione dell'utensile e della testa, capisca il montaggio (testa sopra - testa sotto - aggregato - ecc...) + -- TODO serve funzione in WinData che data la posizione dell'utensile e della testa, capisca il montaggio (testa sopra - testa sotto - aggregato - ecc...) Tool.sHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD) Tool.SetupInfo = {} - Tool.SetupInfo = BeamData.GetSetupInfo( Tool.sHead) + Tool.SetupInfo = WinData.GetSetupInfo( Tool.sHead) Tool.sUUID = EgtTdbGetCurrToolParam( MCH_TP.UUID) Tool.sUserNotes = EgtTdbGetCurrToolParam( MCH_TP.USERNOTES) Tool.dMaxDepth = EgtTdbGetCurrToolMaxDepth() or Tool.dMaxMaterial @@ -187,7 +201,7 @@ end local function CollectFeatures( Part) -- recupero le feature - local vProc = {} + local vPartProc = {} local LayerId = {} LayerId[1] = WinLib.GetAddGroup( Part.id) LayerId[2] = EgtGetFirstNameInGroup( Part.id or GDB_ID.NULL, 'Processings') @@ -207,6 +221,8 @@ local function CollectFeatures( Part) Proc.sType = sType Proc.b3Box = EgtGetBBoxGlob( ProcId, GDB_BB.STANDARD) Proc.nPhase = EgtGetInfo( ProcId, 'PHASE', 'i') or nil + -- informazioni facce + Proc.AffectedFaces = WinLib.GetAffectedFaces( Proc, Part) -- se esiste la geometria if Proc.b3Box and not Proc.b3Box:isEmpty() then @@ -217,12 +233,15 @@ local function CollectFeatures( Part) end -- se taglio if ID.IsCutting( Proc) then + Proc = FeatureData.GetCuttingData( Proc) end -- se fresatura if ID.IsMilling( Proc) then + Proc = FeatureData.GetMillingData( Proc) end -- se svuotatura if ID.IsPocketing( Proc) then + Proc = FeatureData.GetPocketingData( Proc) end -- se profilatura if ID.IsProfiling( Proc) then @@ -230,10 +249,10 @@ local function CollectFeatures( Part) end -- inserisco feature in lista - table.insert( vProc, Proc) + table.insert( vPartProc, Proc) else Proc.nFlg = 0 - table.insert( vProc, Proc) + table.insert( vPartProc, Proc) EgtOutLog( ' Feature ' .. tostring( Proc.idFeature) .. ' is empty (no geometry)') end end @@ -241,7 +260,7 @@ local function CollectFeatures( Part) ProcId = EgtGetNext( ProcId) end end - return vProc + return vPartProc end ------------------------------------------------------------------------------------------------------------- @@ -260,6 +279,10 @@ local function GetFeatureInfoAndDependency( vProc, Part) return vProc end +------------------------------------------------------------------------------------------------------------- +local function OrderMachining( vProc, PARTS) +end + ------------------------------------------------------------------------------------------------------------- -- Ordina le feature in base a fase di lavorazione -- L'ordine è indicativamente: @@ -276,9 +299,6 @@ local function OrderFeatures( vProc) -- se secondo disabilitato, va lasciato dopo if B1.nFlg ~= 0 and B2.nFlg == 0 then return true - -- se entrambi disabilitati seguo l'Id - elseif B1.nFlg == 0 and B2.nFlg == 0 then - return ( B1.id < B2.id) elseif B1.nPhase and B2.nPhase and B1.nPhase < B2.nPhase then return true elseif B1.nPhase and B2.nPhase and B2.nPhase < B1.nPhase then @@ -316,9 +336,31 @@ end ------------------------------------------------------------------------------------------------------------- -- applica le lavorazioni -local function AddMachinings( Proc, Part) - -- TODO applicare lavorazioni!! - return Proc +local function AddMachinings( ProcPart, Part) + local bMachiningOk = true + for nFeatureIndex = 1, #ProcPart do + local Proc = ProcPart[nFeatureIndex] + if ID.IsDrilling( Proc) then + bMachiningOk = Drilling.Make( Proc, Part) + end + -- se taglio + if ID.IsCutting( Proc) then + bMachiningOk = Cutting.Make( Proc, Part) + end + -- se fresatura + if ID.IsMilling( Proc) then + bMachiningOk = Milling.Make( Proc, Part) + end + -- se svuotatura + if ID.IsPocketing( Proc) then + bMachiningOk = Pocketing.Make( Proc, Part) + end + -- se profilatura + if ID.IsProfiling( Proc) then + bMachiningOk = Profiling.Make( Proc, Part) + end + end + return bMachiningOk end ------------------------------------------------------------------------------------------------------------- @@ -339,36 +381,42 @@ function WinExec.ProcessFeatures( PARTS) local nOrd = 1 local Part = {} + local vProc = {} for nPart = 1, #PARTS do -- lista contenente le feature da eseguire - local vProc = {} -- recupero le feature di lavorazione della trave - vProc = CollectFeatures( PARTS[nPart]) + table.insert( vProc, CollectFeatures( PARTS[nPart])) -- recupero informazioni ausiliarie feature e dipendenze tra feature stesse - vProc = GetFeatureInfoAndDependency( vProc, PARTS[nPart]) + vProc[nPart] = GetFeatureInfoAndDependency( vProc[nPart], PARTS[nPart]) -- debug if EgtGetDebugLevel() >= 1 then - PrintFeatures( vProc, PARTS[nPart]) + PrintFeatures( vProc[nPart], PARTS[nPart]) end -- ordino le features - vProc = OrderFeatures( vProc) + vProc[nPart] = OrderFeatures( vProc[nPart]) EgtOutLog( ' *** AddMachinings ***', 1) - for i = 1, #vProc do - -- aggiunge le lavorazioni - AddMachinings( vProc[i], PARTS[nPart]) - end + -- TODO da fare + MACHININGS = {} + -- esegue le strategie migliori che ha precedentemente scelto e salva le lavorazioni nella lista globale + AddMachinings( vProc[nPart], PARTS[nPart]) + EgtOutLog( ' *** End AddMachinings ***', 1) -- passo al grezzo successivo nOrd = nOrd + 1 end + OrderMachining( vProc, PARTS) + + -- aggiunge effettivamente le lavorazioni + MachiningLib.AddOperations( vProc, PARTS) + -- Aggiornamento finale di tutto EgtSetCurrPhase( 1) local bApplOk, sApplErrors, sApplWarns = EgtApplyAllMachinings() diff --git a/CAMAuto/LuaLibs/WinLib.lua b/CAMAuto/LuaLibs/WinLib.lua index 04b370e..6957512 100644 --- a/CAMAuto/LuaLibs/WinLib.lua +++ b/CAMAuto/LuaLibs/WinLib.lua @@ -10,6 +10,34 @@ local WinData = require( 'WinData') EgtOutLog( ' WinLib started', 1) +------------------------------------------------------------------------------------------------------------- +-- restituisce le facce della parte interessate dalla feature Proc +function WinLib.GetAffectedFaces( Proc, Part) + local vtFacesAffected = { bTop = false, bBottom = false, bFront = false, bBack = false, bLeft = false, bRight = false} + if Proc.b3Box and not Proc.b3Box:isEmpty() then + if Proc.b3Box:getMax():getZ() > Part.b3Solid:getMax():getZ() - 500 * GEO.EPS_SMALL then + vtFacesAffected.bTop = true + end + if Proc.b3Box:getMin():getZ() < Part.b3Solid:getMin():getZ() + 500 * GEO.EPS_SMALL then + vtFacesAffected.bBottom = true + end + if Proc.b3Box:getMin():getY() < Part.b3Solid:getMin():getY() + 500 * GEO.EPS_SMALL then + vtFacesAffected.bFront = true + end + if Proc.b3Box:getMax():getY() > Part.b3Solid:getMax():getY() - 500 * GEO.EPS_SMALL then + vtFacesAffected.bBack = true + end + if Proc.b3Box:getMin():getX() < Part.b3Solid:getMin():getX() + 500 * GEO.EPS_SMALL then + vtFacesAffected.bLeft = true + end + if Proc.b3Box:getMax():getX() > Part.b3Solid:getMax():getX() - 500 * GEO.EPS_SMALL then + vtFacesAffected.bRight = true + end + end + + return vtFacesAffected +end + ------------------------------------------------------------------------------------------------------------- function WinLib.GetAddGroup( PartId) -- recupero il nome del gruppo di lavoro corrente diff --git a/CAMAuto/ProcessWin.lua b/CAMAuto/ProcessWin.lua index 88be58f..c8c2aa8 100644 --- a/CAMAuto/ProcessWin.lua +++ b/CAMAuto/ProcessWin.lua @@ -41,6 +41,7 @@ _G.package.loaded.WinData = nil _G.package.loaded.WinExec = nil _G.package.loaded.WinLib = nil _G.package.loaded.FeatureData = nil +_G.package.loaded.MachiningLib = nil -- TODO controllare se c'è un modo migliore per resettare librerie delle strategie caricate precedentemente -- Per ottimizzare potremmo anche ciclare solo fino al numero di strategie raggiunto per il momento. @@ -116,7 +117,7 @@ end ------------------------------------------------------------------------------------------------------------- local function GetDataConfig() -- recupero utensili dal magazzino - -- WinExec.GetToolsFromDB() + WinExec.GetToolsFromDB() -- TODO da gestire eventuali errori bloccanti return true @@ -296,6 +297,10 @@ local function MyProcessPieces() -- si dispongono i pezzi sulla tavola WinData.ExecDisposition( PARTS) + -- Impostazione dell'attrezzaggio di default + -- TODO se lascio il campo vuoto non mi carica il default!!!!!!! + local bOk = EgtImportSetup( 'CIAO') + return true end diff --git a/CAMAuto/Strategies/Cutting.lua b/CAMAuto/Strategies/Cutting.lua index 9e6ac0b..ceb4d3d 100644 --- a/CAMAuto/Strategies/Cutting.lua +++ b/CAMAuto/Strategies/Cutting.lua @@ -13,5 +13,10 @@ local WinData = require( 'WinData') EgtOutLog( ' Cutting started', 1) EgtMdbSave() +------------------------------------------------------------------------------------------------------------- +function Cutting.Make( Proc, Part) + return true +end + ------------------------------------------------------------------------------------------------------------- return Cutting \ No newline at end of file diff --git a/CAMAuto/Strategies/Drillin.lua b/CAMAuto/Strategies/Drilling.lua similarity index 72% rename from CAMAuto/Strategies/Drillin.lua rename to CAMAuto/Strategies/Drilling.lua index 6e0ed03..8aaf024 100644 --- a/CAMAuto/Strategies/Drillin.lua +++ b/CAMAuto/Strategies/Drilling.lua @@ -13,5 +13,10 @@ local WinData = require( 'WinData') EgtOutLog( ' Drilling started', 1) EgtMdbSave() +------------------------------------------------------------------------------------------------------------- +function Drilling.Make( Proc, Part) + return true +end + ------------------------------------------------------------------------------------------------------------- return Drilling \ No newline at end of file diff --git a/CAMAuto/Strategies/Milling.lua b/CAMAuto/Strategies/Milling.lua index cb06794..b1dfe09 100644 --- a/CAMAuto/Strategies/Milling.lua +++ b/CAMAuto/Strategies/Milling.lua @@ -13,5 +13,10 @@ local WinData = require( 'WinData') EgtOutLog( ' Milling started', 1) EgtMdbSave() +------------------------------------------------------------------------------------------------------------- +function Milling.Make( Proc, Part) + return true +end + ------------------------------------------------------------------------------------------------------------- return Milling \ No newline at end of file diff --git a/CAMAuto/Strategies/Pocketing.lua b/CAMAuto/Strategies/Pocketing.lua index 944794d..1759916 100644 --- a/CAMAuto/Strategies/Pocketing.lua +++ b/CAMAuto/Strategies/Pocketing.lua @@ -13,5 +13,10 @@ local WinData = require( 'WinData') EgtOutLog( ' Pocketing started', 1) EgtMdbSave() +------------------------------------------------------------------------------------------------------------- +function Pocketing.Make( Proc, Part) + return true +end + ------------------------------------------------------------------------------------------------------------- return Pocketing \ No newline at end of file diff --git a/CAMAuto/Strategies/Profiling.lua b/CAMAuto/Strategies/Profiling.lua index 268cce1..ea7d97f 100644 --- a/CAMAuto/Strategies/Profiling.lua +++ b/CAMAuto/Strategies/Profiling.lua @@ -9,29 +9,51 @@ require( 'EgtBase') -- Carico i dati globali local WinData = require( 'WinData') +local MachiningLib = require( 'MachiningLib') EgtOutLog( ' Profiling started', 1) EgtMdbSave() ------------------------------------------------------------------------------------------------------------- function Profiling.Make( Proc, Part) + local ToolInfo = {} local Machining = {} Machining.LeadIn = {} Machining.LeadOut = {} Machining.Steps = {} - Machining.sDepth = 0 - Machining.dRadialOffset = Proc.dRadialOffset - Machining.dLongitudinalOffset = Proc.dLongitudinalOffset - Machining.Steps.dSideStep = TOOLS[nIndexTool].dSideStep - - Machining.LeadIn.nType = MCH_MILL_LI.TANGENT - Machining.LeadIn.dTangentDistance = TOOLS[nIndexTool].dDiameter - Machining.LeadIn.dPerpDistance = TOOLS[nIndexTool].dDiameter - Machining.LeadOut.nType = MCH_MILL_LI.TANGENT - Machining.LeadOut.dTangentDistance = TOOLS[nIndexTool].dDiameter - Machining.LeadOut.dPerpDistance = 0 - + -- se so che utensili utilizzare, associazione diretta + if Proc.nToolsToUse then + for i = 1, Proc.nToolsToUse do + local ToolSearchParameters = {} + ToolSearchParameters.sName = Proc.Tools[i].sName + ToolSearchParameters.dElevation = 0 + ToolInfo = MachiningLib.FindMill( Proc, ToolSearchParameters) + -- se trovato utensile + if ToolInfo.nToolIndex then + Machining.nType = MCH_MY.MILLING + Machining.nWorkSide = MCH_MILL_WS.RIGHT + Machining.nToolIndex = ToolInfo.nToolIndex + Machining.sDepth = 0 + Machining.dRadialOffset = Proc.Tools[i].dRadialOffset + Machining.dLongitudinalOffset = Proc.Tools[i].dLongitudinalOffset + Machining.LeadIn.nType = MCH_MILL_LI.TANGENT + Machining.LeadIn.dTangentDistance = TOOLS[ToolInfo.nToolIndex].dDiameter + Machining.LeadIn.dPerpDistance = TOOLS[ToolInfo.nToolIndex].dDiameter + Machining.LeadOut.nType = MCH_MILL_LO.TANGENT + Machining.LeadOut.dTangentDistance = TOOLS[ToolInfo.nToolIndex].dDiameter + Machining.LeadOut.dPerpDistance = 0 + Machining.Geometry = Proc.id + MachiningLib.AddNewMachining( Proc, Machining) + else + return false, 'Tool not found' + end + end + -- altrimenti cerco tra quelli disponibili + else + ; --per il momento non serve. Le info sull'utensile arrivano sempre + end + return true end -------------------------------------------------------------------------------------------------------------