From 4546497a1e5939a0d82a8dbfecbd4b833b4f3e50 Mon Sep 17 00:00:00 2001 From: "andrea.villa" Date: Fri, 28 Jun 2024 09:30:31 +0200 Subject: [PATCH 1/4] Aggiunta lavorazione (primordiale) di foratura --- CAMAuto/LuaLibs/FeatureData.lua | 8 +++--- CAMAuto/LuaLibs/MachiningLib.lua | 34 ++++++++++++++++++++-- CAMAuto/LuaLibs/WinExec.lua | 2 +- CAMAuto/Strategies/Drilling.lua | 48 ++++++++++++++++++++++++++++++++ 4 files changed, 84 insertions(+), 8 deletions(-) diff --git a/CAMAuto/LuaLibs/FeatureData.lua b/CAMAuto/LuaLibs/FeatureData.lua index 3c831a2..77af7d0 100644 --- a/CAMAuto/LuaLibs/FeatureData.lua +++ b/CAMAuto/LuaLibs/FeatureData.lua @@ -12,8 +12,8 @@ local WinData = require( 'WinData') function FeatureData.GetDrillingData( Proc) local bOk, ptCentre, vtDir, dRadius = EgtCurveIsACircle( Proc.id) - Proc.dDiam = dRadius * 2 - Proc.dLen = abs( EgtCurveThickness( Proc.id)) or 0 + Proc.dDiameter = dRadius * 2 + Proc.dLength = abs( EgtCurveThickness( Proc.id)) or 0 Proc.ptCentre = ptCentre Proc.vtDir = vtDir @@ -28,14 +28,14 @@ function FeatureData.GetCuttingData( Proc) end ------------------------------------------------------------------------------------------------------------- --- Recupero dati foro +-- Recupero dati svuotatura function FeatureData.GetPocketingData( Proc) return Proc end ------------------------------------------------------------------------------------------------------------- --- Recupero dati foro +-- Recupero dati per fresatura function FeatureData.GetMillingData( Proc) return Proc diff --git a/CAMAuto/LuaLibs/MachiningLib.lua b/CAMAuto/LuaLibs/MachiningLib.lua index 133519d..dc5f92f 100644 --- a/CAMAuto/LuaLibs/MachiningLib.lua +++ b/CAMAuto/LuaLibs/MachiningLib.lua @@ -122,7 +122,35 @@ end ------------------------------------------------------------------------------------------------------------- -- funzione per cercare utensile tipo PUNTA A FORARE con certe caratteristiche -- TODO da fare -function MachiningLib.FindDrill() +function MachiningLib.FindDrill( Proc, ToolSearchParameters) + local ToolInfo = {} + + if not ToolSearchParameters.dTolerance then + ToolSearchParameters.dTolerance = 0 + end + + local nBestToolIndex + for i = 1, #TOOLS do + local bIsToolCompatible = false + + -- TODO per il momento si cercano solo le punte. Bisognerebbe valutare anche frese che possono lavorare di testa + if TOOLS[i].sFamily == 'DRILLBIT' then + bIsToolCompatible = true + end + if bIsToolCompatible then + --TODO per il momento si prende il primo utensile con lo stesso diametro, senza considerare altri parametri tipo lunghezza ecc... + if abs( TOOLS[i].dDiameter - ToolSearchParameters.dDiameter) < ToolSearchParameters.dTolerance + GEO.EPS_SMALL * 10 then + if not nBestToolIndex then + nBestToolIndex = i + break + end + end + end + end + + ToolInfo.nToolIndex = nBestToolIndex + + return ToolInfo end ------------------------------------------------------------------------------------------------------------- @@ -194,11 +222,11 @@ function MachiningLib.AddOperation( OperationToInsert) -- creazione lavorazione local nOperationId = EgtCreateMachining( OperationToInsert.Machining.sOperationName, OperationToInsert.Machining.nType, OperationToInsert.Machining.sToolName) - EgtSetCurrMachining( nOperationId) if nOperationId then -- impostazione geometria - EgtSetMachiningGeometry( OperationToInsert.Machining.Geometry) + local bOk = true + bOk = EgtSetMachiningGeometry( OperationToInsert.Machining.Geometry) -- impostazione parametri lavorazione if OperationToInsert.Machining.sDepth then diff --git a/CAMAuto/LuaLibs/WinExec.lua b/CAMAuto/LuaLibs/WinExec.lua index 786f8c8..4b7c0be 100644 --- a/CAMAuto/LuaLibs/WinExec.lua +++ b/CAMAuto/LuaLibs/WinExec.lua @@ -397,7 +397,7 @@ function WinExec.ProcessFeatures( PARTS) for nPart = 1, #PARTS do -- recupero le feature di lavorazione della trave vProc = CollectFeatures( vProc, PARTS[nPart]) - + -- recupero informazioni ausiliarie feature e dipendenze tra feature dello stesso pezzo vProc = GetFeatureInfoAndDependency( vProc, PARTS[nPart]) end diff --git a/CAMAuto/Strategies/Drilling.lua b/CAMAuto/Strategies/Drilling.lua index 8aaf024..9908f32 100644 --- a/CAMAuto/Strategies/Drilling.lua +++ b/CAMAuto/Strategies/Drilling.lua @@ -9,12 +9,60 @@ require( 'EgtBase') -- Carico i dati globali local WinData = require( 'WinData') +local MachiningLib = require( 'MachiningLib') EgtOutLog( ' Drilling started', 1) EgtMdbSave() ------------------------------------------------------------------------------------------------------------- function Drilling.Make( Proc, Part) + local ToolInfo = {} + + local Machining = {} + local AuxInfo = {} + Machining.LeadIn = {} + Machining.LeadOut = {} + Machining.Steps = {} + local ToolSearchParameters = {} + + -- cerco utensile punta a forare + ToolSearchParameters.dDiameter = Proc.dDiameter + ToolSearchParameters.dLength = Proc.dLength + ToolInfo = MachiningLib.FindDrill( Proc, ToolSearchParameters) + + -- se trovato utensile + if ToolInfo.nToolIndex then + Machining.nType = MCH_OY.DRILLING + Machining.nToolIndex = ToolInfo.nToolIndex + Machining.sDepth = 'th' + Machining.Steps.dStep = TOOLS[ToolInfo.nToolIndex].dStep + Machining.Geometry = Proc.id + AuxInfo.nPhase = 1 -- TODO gestire fase + MachiningLib.AddNewMachining( Proc, Machining, AuxInfo) + else + -- provo a cercare uan fresa che faccia una svuotatura + ToolSearchParameters.dMaxToolDiameter = Proc.dDiameter + ToolInfo = MachiningLib.FindDrill( 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.ZIGZAG + 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 = 0 + Machining.Geometry = Proc.id + AuxInfo.nPhase = 1 -- TODO gestire fase + MachiningLib.AddNewMachining( Proc, Machining, AuxInfo) + else + return false + end + end + + return true end From 967519492cc28e6f6c089c1be0c15ba102e4e5f4 Mon Sep 17 00:00:00 2001 From: "andrea.villa" Date: Mon, 15 Jul 2024 08:47:34 +0200 Subject: [PATCH 2/4] - Migliorata foratura. Ora calcola ingresso in sicurezza, fase e lato di lavoro - Migliorato riconoscimento fase di lavoro per profilature - Prima versione gestione tipo macchina, linea o pantografo - Corretto offsetX pezzo in base a ingombro profili di testa - Altre piccole correzioni --- .vscode/settings.json | 5 ++- CAMAuto/LuaLibs/FeatureData.lua | 9 ++++- CAMAuto/LuaLibs/Identity.lua | 11 +----- CAMAuto/LuaLibs/MachiningLib.lua | 51 +++++++++++++++++++++--- CAMAuto/LuaLibs/WinExec.lua | 52 ++++++++++++++----------- CAMAuto/LuaLibs/WinLib.lua | 66 ++++++++++++++++++++++++-------- CAMAuto/ProcessWin.lua | 11 +----- CAMAuto/Strategies/Drilling.lua | 8 ++-- CAMAuto/Strategies/Profiling.lua | 6 +-- 9 files changed, 145 insertions(+), 74 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index f1ae223..91a0c32 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -135,7 +135,10 @@ "EgtMdbSave", "EgtMoveRawPart", "EgtCurveThickness", - "EgtSetCurrMachining" + "EgtSetCurrMachining", + "EgtCAvSetStdTool", + "EgtCAvToolPosStm", + "EgtCAvToolPosBox" ], "Lua.diagnostics.disable": [ "empty-block" diff --git a/CAMAuto/LuaLibs/FeatureData.lua b/CAMAuto/LuaLibs/FeatureData.lua index 77af7d0..50d25f0 100644 --- a/CAMAuto/LuaLibs/FeatureData.lua +++ b/CAMAuto/LuaLibs/FeatureData.lua @@ -12,11 +12,18 @@ local WinData = require( 'WinData') function FeatureData.GetDrillingData( Proc) local bOk, ptCentre, vtDir, dRadius = EgtCurveIsACircle( Proc.id) + vtDir = EgtCurveExtrusion( Proc.id) + local Frame = EgtGetGlobFrame( Proc.id) + -- trasformo punti e vettori in globale + ptCentre:toGlob( Frame) + vtDir:toGlob( Frame) + Proc.dDiameter = dRadius * 2 Proc.dLength = abs( EgtCurveThickness( Proc.id)) or 0 Proc.ptCentre = ptCentre Proc.vtDir = vtDir - + Proc.ReferenceSide = EgtGetInfo( Proc.id, 'REFERENCE_SIDE', 's') or nil + return Proc end diff --git a/CAMAuto/LuaLibs/Identity.lua b/CAMAuto/LuaLibs/Identity.lua index 5437b11..a20ce15 100644 --- a/CAMAuto/LuaLibs/Identity.lua +++ b/CAMAuto/LuaLibs/Identity.lua @@ -35,16 +35,7 @@ end --------------------------------------------------------------------- ----------------------------- PIECES ------------------------------ --------------------------------------------------------------------- -function Identity.GetPieceIndexPart( PARTS, idGeom) - local nIndexPart - for i = 1, #PARTS do - if PARTS[i].id == idGeom then - nIndexPart = i - break - end - end - return nIndexPart -end + --------------------------------------------------------------------- return Identity diff --git a/CAMAuto/LuaLibs/MachiningLib.lua b/CAMAuto/LuaLibs/MachiningLib.lua index dc5f92f..225c56a 100644 --- a/CAMAuto/LuaLibs/MachiningLib.lua +++ b/CAMAuto/LuaLibs/MachiningLib.lua @@ -162,16 +162,47 @@ function MachiningLib.GetPhaseMach( Proc) nPhase = Proc.nPhase -- altrimenti si calcola il comportamento standard else - if Proc.sEntityName == 'Left' or Proc.sEntityName == 'Out' then - nPhase = 1 - end - if Proc.sEntityName == 'Right' or Proc.sEntityName == 'In' then - nPhase = 2 + -- se macchina tipo LINEA + if WinData.MACH_TYPE == 'LINE' then + if Proc.AffectedFaces.bTop then + nPhase = 1 + end + if Proc.AffectedFaces.bFront or Proc.AffectedFaces.bLeft then + nPhase = EgtIf( WinData.FIRST_PHASE_LOAD == 'PUSH', 1, 2) + end + if Proc.AffectedFaces.bBack or Proc.AffectedFaces.bRight then + nPhase = EgtIf( WinData.FIRST_PHASE_LOAD == 'PUSH', 2, 1) + end + -- se macchina tipo PANTOGRAFO + else + if Proc.AffectedFaces.bTop or Proc.AffectedFaces.bLeft or Proc.AffectedFaces.bRight then + nPhase = 1 + end + if Proc.AffectedFaces.bFront then + nPhase = EgtIf( WinData.FIRST_PHASE_LOAD == 'PUSH', 1, 2) + end + if Proc.AffectedFaces.bBack then + nPhase = EgtIf( WinData.FIRST_PHASE_LOAD == 'PUSH', 2, 1) + end end end return nPhase end +------------------------------------------------------------------------------------------------------------- +-- funzione che ritorna la distanza di sicurezza da aggiungere alla lavorazione di foratura per evitare colisioni in rapido +function MachiningLib.GetDrillAdditionalSafeDistanceToRaw( Proc, Part, Machining) + -- se non è foro esco subito + if Proc.sType ~= 'Hole' then + return 0 + end + local bVirtualToolOk = EgtCAvSetStdTool( TOOLS[Machining.nToolIndex].dLength, TOOLS[Machining.nToolIndex].dDiameter, 0) + local dStartSafetyLength = EgtCAvToolPosBox( Proc.ptCentre, Proc.vtDir, Part.b3RawPart, Proc.vtDir) + -- si riporta valore calcolato sulla punta utensile + dStartSafetyLength = dStartSafetyLength - TOOLS[Machining.nToolIndex].dLength + return dStartSafetyLength +end + ------------------------------------------------------------------------------------------------------------- -- salva in lista globale la lavorazione appena calcolata function MachiningLib.AddNewMachining( ProcToAdd, MachiningToAdd, AuxInfoToAdd) @@ -262,6 +293,9 @@ function MachiningLib.AddOperation( OperationToInsert) if OperationToInsert.Machining.dOverlap then EgtSetMachiningParam( MCH_MP.OVERL, OperationToInsert.Machining.dOverlap) end + if OperationToInsert.Machining.dStartSafetyLength then + EgtSetMachiningParam( MCH_MP.STARTPOS, OperationToInsert.Machining.dStartSafetyLength) + end -- step if OperationToInsert.Machining.Steps then @@ -369,6 +403,13 @@ function MachiningLib.AddOperation( OperationToInsert) local ptMin = EgtGetInfo( nClId, 'MMIN', 'p') local ptMax = EgtGetInfo( nClId, 'MMAX', 'p') -- box percorso lavorazione + if ptMin and ptMax then + local dToolRadius = TOOLS[OperationToInsert.Machining.nToolIndex].dTotDiameter / 2 + if dToolRadius then + ptMin = ptMin - Vector3d( dToolRadius, 0, 0) + ptMax = ptMax + Vector3d( dToolRadius, 0, 0) + end + end b3MachEncumbrance = BBox3d( ptMin, ptMax) end diff --git a/CAMAuto/LuaLibs/WinExec.lua b/CAMAuto/LuaLibs/WinExec.lua index 4b7c0be..8247e0c 100644 --- a/CAMAuto/LuaLibs/WinExec.lua +++ b/CAMAuto/LuaLibs/WinExec.lua @@ -113,15 +113,13 @@ function WinExec.GetToolsFromDB() -- se verifica condizioni minime, recupero tutti gli altri dati if bToolLoadedOnSetup and sToolType then - -- TODO Tool.AName -> da rimuovere perchè non serve. Per il momento lo manteniamo solo perchè è più facile vedere e interpretare la lista utensili nella watch di zerobrane - -- Nell'utilizzo, si legge sempre il Tool.Name - Tool.AName = Tool.sName Tool.sTcPos = sToolTCPos Tool.sFamily = sToolFamily Tool.sType = sToolType Tool.nTypeId = nToolTypeId Tool.dMaxMaterial = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT) Tool.dDiameter = EgtTdbGetCurrToolParam( MCH_TP.DIAM) + Tool.dTotDiameter = EgtTdbGetCurrToolParam( MCH_TP.TOTDIAM) Tool.dLength = EgtTdbGetCurrToolParam( MCH_TP.LEN) Tool.dSpeed = EgtTdbGetCurrToolParam( MCH_TP.SPEED) Tool.bIsCCW = Tool.dSpeed < 0 @@ -130,10 +128,9 @@ 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 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 = WinData.GetSetupInfo( Tool.sHead) + Tool.SetupInfo = WinData.GetSetupInfo( {sHead = Tool.sHead, sTcPos = Tool.sTcPos}) Tool.sUUID = EgtTdbGetCurrToolParam( MCH_TP.UUID) Tool.sUserNotes = EgtTdbGetCurrToolParam( MCH_TP.USERNOTES) Tool.dMaxDepth = EgtTdbGetCurrToolMaxDepth() or Tool.dMaxMaterial @@ -199,7 +196,7 @@ end -- *** Inserimento delle lavorazioni nelle travi *** ------------------------------------------------------------------------------------------------------------- -local function CollectFeatures( vProc, Part) +local function CollectFeatures( vProc, Part, nIndexPart) -- recupero le feature local LayerId = {} LayerId[1] = WinLib.GetAddGroup( Part.id) @@ -215,13 +212,12 @@ local function CollectFeatures( vProc, Part) if sType and nDo == 1 then local Proc = {} Proc.idPart = Part.id + Proc.nIndexPart = nIndexPart Proc.id = ProcId Proc.nFlg = 1 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 @@ -246,7 +242,8 @@ local function CollectFeatures( vProc, Part) if ID.IsProfiling( Proc) then Proc = FeatureData.GetProfilingData( Proc) end - + -- informazioni facce + Proc.AffectedFaces = WinLib.GetAffectedFaces( Proc, Part) -- inserisco feature in lista table.insert( vProc, Proc) else @@ -290,6 +287,7 @@ end -- 4) Profili testa -- 5) Profili longitudinali -- 6) Incontri/scontri +-- 7) Listello ferma-vetro -- TODO Ordinamento da fare local function OrderMachining( MACHININGS) @@ -342,7 +340,7 @@ local function AddMachinings( vProc, PARTS) local bMachiningOk = true for nFeatureIndex = 1, #vProc do local Proc = vProc[nFeatureIndex] - local Part = PARTS[vProc[nFeatureIndex].nIndexPiece] + local Part = PARTS[vProc[nFeatureIndex].nIndexPart] if ID.IsDrilling( Proc) then bMachiningOk = Drilling.Make( Proc, Part) end @@ -380,6 +378,14 @@ local function PrintFeatures( vProc, PARTS) end end +------------------------------------------------------------------------------------------------------------- +local function UpdateRawPosition( PARTS) + for i = 1, #PARTS do + PARTS[i].b3FinishedPart = EgtGetBBoxGlob( PARTS[i].id or GDB_ID.NULL, GDB_BB.STANDARD) + PARTS[i].b3RawPart = EgtGetBBoxGlob( PARTS[i].idRaw or GDB_ID.NULL, GDB_BB.STANDARD) + end +end + ------------------------------------------------------------------------------------------------------------- local function CheckAndMovePawPart( nIdRawToMove, vtMove) EgtMoveRawPart( nIdRawToMove, vtMove) @@ -393,10 +399,14 @@ function WinExec.ProcessFeatures( PARTS) local vProc = {} MACHININGS = {} + -- aggiorno posizione grezzi dopo disposizione + EgtSetCurrPhase( 1) + UpdateRawPosition( PARTS) + -- si recuperano tutte le feature di tutti i pezzi in una lista unica for nPart = 1, #PARTS do -- recupero le feature di lavorazione della trave - vProc = CollectFeatures( vProc, PARTS[nPart]) + vProc = CollectFeatures( vProc, PARTS[nPart], nPart) -- recupero informazioni ausiliarie feature e dipendenze tra feature dello stesso pezzo vProc = GetFeatureInfoAndDependency( vProc, PARTS[nPart]) @@ -415,16 +425,14 @@ function WinExec.ProcessFeatures( PARTS) -- ordina le lavorazioni OrderMachining( MACHININGS) - -- scrivo lavorazioni prima fase - EgtSetCurrPhase( 1) + for i = 1, #MACHININGS do if MACHININGS[i].AuxInfo.nPhase == 1 then -- aggiunge effettivamente la lavorazione e restituisce gli ingombri local bIsApplyOk, sErr, b3MachEncumbrance = MachiningLib.AddOperation( MACHININGS[i]) -- TODO ingombro lavorazione mi restituisce dati sbagliati. C'è un riferimento? -- se feature di testa, sposto testa in base a ingombro lavorazione if MACHININGS[i].Proc.bHeadProfile and b3MachEncumbrance then - local nIndexPart = ID.GetPieceIndexPart( PARTS, MACHININGS[i].Proc.idPart) - PARTS[nIndexPart].DispOffsets.Phase1.dOffsetX = b3MachEncumbrance:getMax():getX() - PARTS[nIndexPart].b3FinishedPart:getMin():getX() + 5 + PARTS[MACHININGS[i].Proc.nIndexPart].DispOffsets.Phase1.dOffsetX = b3MachEncumbrance:getMax():getX() - PARTS[MACHININGS[i].Proc.nIndexPart].b3FinishedPart:getMin():getX() + 5 end end end @@ -434,9 +442,8 @@ function WinExec.ProcessFeatures( PARTS) -- sposto pezzo per permettere pinzaggio migliore e non aver colisione in testa for i = 1, #PARTS do - -- TODO Sbaglia a calcolare ingombro!! - --local vtMove = Vector3d( - PARTS[nIndexPart].DispOffsets.Phase1.dOffsetX, - PARTS[nIndexPart].DispOffsets.Phase1.dOffsetY, PARTS[nIndexPart].DispOffsets.Phase1.dOffsetZ) - local vtMove = Vector3d( -60, 0, 0) + -- TODO controllare calcolo ingombro + local vtMove = Vector3d( - PARTS[i].DispOffsets.Phase1.dOffsetX, 0, 0) if vtMove ~= V_NULL() then CheckAndMovePawPart( PARTS[i].idRaw, vtMove) end @@ -444,22 +451,21 @@ function WinExec.ProcessFeatures( PARTS) -- scrivo lavorazioni seconda fase EgtSetCurrPhase( 2) + UpdateRawPosition( PARTS) for i = 1, #MACHININGS do if MACHININGS[i].AuxInfo.nPhase == 2 then -- aggiunge effettivamente la lavorazione local bIsApplyOk, sErr, b3MachEncumbrance = MachiningLib.AddOperation( MACHININGS[i]) -- TODO ingombro lavorazione mi restituisce dati sbagliati. C'è un riferimento? -- se feature di testa, sposto testa in base a ingombro lavorazione if MACHININGS[i].Proc.bHeadProfile and b3MachEncumbrance then - local nIndexPart = ID.GetPieceIndexPart( PARTS, MACHININGS[i].Proc.idPart) - PARTS[nIndexPart].DispOffsets.Phase1.dOffsetX = PARTS[nIndexPart].b3FinishedPart:getMax():getX() - b3MachEncumbrance:getMin():getX() + 5 + PARTS[MACHININGS[i].Proc.nIndexPart].DispOffsets.Phase2.dOffsetX = PARTS[MACHININGS[i].Proc.nIndexPart].b3FinishedPart:getMax():getX() - b3MachEncumbrance:getMin():getX() + 5 end end end -- sposto pezzo per permettere pinzaggio migliore e non aver colisione in testa for i = 1, #PARTS do - -- TODO Sbaglia a calcolare ingombro!! - -- local vtMove = Vector3d( PARTS[nIndexPart].DispOffsets.Phase2.dOffsetX, PARTS[nIndexPart].DispOffsets.Phase2.dOffsetY, PARTS[nIndexPart].DispOffsets.Phase2.dOffsetZ) - local vtMove = Vector3d( 60, 0, 0) + -- TODO controllare calcolo ingombro + local vtMove = Vector3d( PARTS[i].DispOffsets.Phase2.dOffsetX, 0, 0) if vtMove ~= V_NULL() then CheckAndMovePawPart( PARTS[i].idRaw, vtMove) end diff --git a/CAMAuto/LuaLibs/WinLib.lua b/CAMAuto/LuaLibs/WinLib.lua index 6957512..b6a64d5 100644 --- a/CAMAuto/LuaLibs/WinLib.lua +++ b/CAMAuto/LuaLibs/WinLib.lua @@ -15,23 +15,55 @@ EgtOutLog( ' WinLib started', 1) 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 + -- caso speciale foro + if Proc.sType == 'Hole' and Proc.ReferenceSide then + if Proc.ReferenceSide == Part.SideNames.sLeft then + vtFacesAffected.bLeft = true + elseif Proc.ReferenceSide == Part.SideNames.sRight then + vtFacesAffected.bRight = true + elseif Proc.ReferenceSide == Part.SideNames.sFront then + vtFacesAffected.bFront = true + elseif Proc.ReferenceSide == Part.SideNames.sBack then + vtFacesAffected.bBack = true + end + -- caso speciale profilo + elseif Proc.sType == 'Profiling' then + if not Part.SideNames then + Part.SideNames = {} + end + if Proc.b3Box:getMax():getX() < Part.b3FinishedPart:getCenter():getX() then + vtFacesAffected.bLeft = true + Part.SideNames.sLeft = Proc.sEntityName + elseif Proc.b3Box:getMin():getX() > Part.b3FinishedPart:getCenter():getX() then + vtFacesAffected.bRight = true + Part.SideNames.sRight = Proc.sEntityName + elseif Proc.b3Box:getMax():getY() < Part.b3FinishedPart:getCenter():getY() then + vtFacesAffected.bFront = true + Part.SideNames.sFront = Proc.sEntityName + elseif Proc.b3Box:getMin():getY() > Part.b3FinishedPart:getCenter():getY() then + vtFacesAffected.bBack = true + Part.SideNames.sBack = Proc.sEntityName + end + -- caso standard + else + if Proc.b3Box:getMax():getZ() > Part.b3FinishedPart:getMax():getZ() - 500 * GEO.EPS_SMALL then + vtFacesAffected.bTop = true + end + if Proc.b3Box:getMin():getZ() < Part.b3FinishedPart:getMin():getZ() + 500 * GEO.EPS_SMALL then + vtFacesAffected.bBottom = true + end + if Proc.b3Box:getMin():getY() < Part.b3FinishedPart:getMin():getY() + 500 * GEO.EPS_SMALL then + vtFacesAffected.bFront = true + end + if Proc.b3Box:getMax():getY() > Part.b3FinishedPart:getMax():getY() - 500 * GEO.EPS_SMALL then + vtFacesAffected.bBack = true + end + if Proc.b3Box:getMin():getX() < Part.b3FinishedPart:getMin():getX() + 500 * GEO.EPS_SMALL then + vtFacesAffected.bLeft = true + end + if Proc.b3Box:getMax():getX() > Part.b3FinishedPart:getMax():getX() - 500 * GEO.EPS_SMALL then + vtFacesAffected.bRight = true + end end end diff --git a/CAMAuto/ProcessWin.lua b/CAMAuto/ProcessWin.lua index 848e826..69ee3c1 100644 --- a/CAMAuto/ProcessWin.lua +++ b/CAMAuto/ProcessWin.lua @@ -107,14 +107,6 @@ local function GetDataConfig() return true end -------------------------------------------------------------------------------------------------------------- -local function UpdateRawPosition( PARTS) - for i = 1, #PARTS do - PARTS[i].b3FinishedPart = EgtGetBBoxGlob( PARTS[i].id or GDB_ID.NULL, GDB_BB.STANDARD) - PARTS[i].b3RawPart = EgtGetBBoxGlob( PARTS[i].idRaw or GDB_ID.NULL, GDB_BB.STANDARD) - end -end - ------------------------------------------------------------------------------------------------------------- local function GetDispOffsetFromNotes( nPieceIndex) local bAllOffsetsAreOk = false @@ -288,11 +280,10 @@ local function MyProcessPieces() -- si dispongono i pezzi sulla tavola WinData.ExecDisposition( PARTS) - UpdateRawPosition( PARTS) -- Impostazione dell'attrezzaggio di default -- TODO se lascio il campo vuoto non mi carica il default!!!!!!! - local bOk = EgtImportSetup( 'CIAO') + local bOk = EgtImportSetup( 'Standard') return true end diff --git a/CAMAuto/Strategies/Drilling.lua b/CAMAuto/Strategies/Drilling.lua index 9908f32..26ea23e 100644 --- a/CAMAuto/Strategies/Drilling.lua +++ b/CAMAuto/Strategies/Drilling.lua @@ -37,10 +37,11 @@ function Drilling.Make( Proc, Part) Machining.sDepth = 'th' Machining.Steps.dStep = TOOLS[ToolInfo.nToolIndex].dStep Machining.Geometry = Proc.id - AuxInfo.nPhase = 1 -- TODO gestire fase + AuxInfo.nPhase = MachiningLib.GetPhaseMach( Proc) + Machining.dStartSafetyLength = MachiningLib.GetDrillAdditionalSafeDistanceToRaw( Proc, Part, Machining) + 5 -- aggiungo 5mm di sicurezza MachiningLib.AddNewMachining( Proc, Machining, AuxInfo) else - -- provo a cercare uan fresa che faccia una svuotatura + -- provo a cercare una fresa che faccia una svuotatura ToolSearchParameters.dMaxToolDiameter = Proc.dDiameter ToolInfo = MachiningLib.FindDrill( Proc, ToolSearchParameters) -- se trovato utensile @@ -55,14 +56,13 @@ function Drilling.Make( Proc, Part) Machining.LeadIn.dElevation = TOOLS[ToolInfo.nToolIndex].dDiameter/2 Machining.sDepth = 0 Machining.Geometry = Proc.id - AuxInfo.nPhase = 1 -- TODO gestire fase + AuxInfo.nPhase = MachiningLib.GetPhaseMach( Proc) MachiningLib.AddNewMachining( Proc, Machining, AuxInfo) else return false end end - return true end diff --git a/CAMAuto/Strategies/Profiling.lua b/CAMAuto/Strategies/Profiling.lua index 6d913c3..2851732 100644 --- a/CAMAuto/Strategies/Profiling.lua +++ b/CAMAuto/Strategies/Profiling.lua @@ -39,10 +39,10 @@ function Profiling.Make( Proc, Part) 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.LeadIn.dTangentDistance = (TOOLS[ToolInfo.nToolIndex].dTotDiameter / 2) + 10 + Machining.LeadIn.dPerpDistance = (TOOLS[ToolInfo.nToolIndex].dTotDiameter / 2) + 10 Machining.LeadOut.nType = MCH_MILL_LO.TANGENT - Machining.LeadOut.dTangentDistance = TOOLS[ToolInfo.nToolIndex].dDiameter + Machining.LeadOut.dTangentDistance = (TOOLS[ToolInfo.nToolIndex].dTotDiameter / 2) + 10 Machining.LeadOut.dPerpDistance = 0 Machining.Geometry = Proc.id AuxInfo.nPhase = MachiningLib.GetPhaseMach( Proc) From aeeaac33265eec13a130b785511de73688c4b150 Mon Sep 17 00:00:00 2001 From: "andrea.villa" Date: Thu, 3 Oct 2024 11:54:17 +0200 Subject: [PATCH 3/4] - Nuova gestione AddOperation - Prima versione ordinamento lavorazioni - In WinLib funzioni base per ordinamento --- CAMAuto/LuaLibs/MachiningLib.lua | 325 ++++++++++++++++--------------- CAMAuto/LuaLibs/WinExec.lua | 133 +++++++++---- CAMAuto/LuaLibs/WinLib.lua | 25 +++ CAMAuto/ProcessWin.lua | 7 +- CAMAuto/Strategies/Drilling.lua | 27 ++- CAMAuto/Strategies/Profiling.lua | 16 +- 6 files changed, 320 insertions(+), 213 deletions(-) diff --git a/CAMAuto/LuaLibs/MachiningLib.lua b/CAMAuto/LuaLibs/MachiningLib.lua index 225c56a..86f555c 100644 --- a/CAMAuto/LuaLibs/MachiningLib.lua +++ b/CAMAuto/LuaLibs/MachiningLib.lua @@ -200,12 +200,12 @@ function MachiningLib.GetDrillAdditionalSafeDistanceToRaw( Proc, Part, Machining local dStartSafetyLength = EgtCAvToolPosBox( Proc.ptCentre, Proc.vtDir, Part.b3RawPart, Proc.vtDir) -- si riporta valore calcolato sulla punta utensile dStartSafetyLength = dStartSafetyLength - TOOLS[Machining.nToolIndex].dLength - return dStartSafetyLength + return dStartSafetyLength + 5 -- si aggiungono 5mm di sicurezza extra end ------------------------------------------------------------------------------------------------------------- -- salva in lista globale la lavorazione appena calcolata -function MachiningLib.AddNewMachining( ProcToAdd, MachiningToAdd, AuxInfoToAdd) +function MachiningLib.AddNewMachining( ProcToAdd, MachiningToAdd, AuxiliaryDataToAdd) -- Controllo parametri obbligatori if not MachiningToAdd.nType or not MachiningToAdd.nToolIndex or not MachiningToAdd.Geometry or not ProcToAdd.id then return false @@ -239,7 +239,7 @@ function MachiningLib.AddNewMachining( ProcToAdd, MachiningToAdd, AuxInfoToAdd) local Machining = {} Machining.Proc = ProcToAdd Machining.Machining = MachiningToAdd - Machining.AuxInfo = AuxInfoToAdd + Machining.AuxiliaryData = AuxiliaryDataToAdd table.insert( MACHININGS, Machining) return true end @@ -251,171 +251,182 @@ function MachiningLib.AddOperation( OperationToInsert) local sErr = '' local bAreAllMachiningApplyOk = true - -- creazione lavorazione - local nOperationId = EgtCreateMachining( OperationToInsert.Machining.sOperationName, OperationToInsert.Machining.nType, OperationToInsert.Machining.sToolName) + -- parametri generali lavorazione + local MachiningParameters = { + { sName = 'sDepth', nMchParam = MCH_MP.DEPTH_STR}, + { sName = 'bInvert', nMchParam = MCH_MP.INVERT}, + { sName = 'nWorkside', nMchParam = MCH_MP.WORKSIDE}, + { sName = 'nFaceuse', nMchParam = MCH_MP.FACEUSE}, + { sName = 'nSCC', nMchParam = MCH_MP.SCC}, + { sName = 'bToolInvert', nMchParam = MCH_MP.TOOLINVERT}, + { sName = 'sBlockedAxis', nMchParam = MCH_MP.BLOCKEDAXIS}, + { sName = 'sInitialAngles', nMchParam = MCH_MP.INITANGS}, + { sName = 'nHeadSide', nMchParam = MCH_MP.HEADSIDE}, + { sName = 'nSubType', nMchParam = MCH_MP.SUBTYPE}, + { sName = 'dOverlap', nMchParam = MCH_MP.OVERL}, + { sName = 'nStepType', nMchParam = MCH_MP.STEPTYPE}, + { sName = 'dStartSafetyLength', nMchParam = MCH_MP.STARTPOS}, + { sName = 'dReturnPos', nMchParam = MCH_MP.RETURNPOS}, + { sName = 'dRadialOffset', nMchParam = MCH_MP.OFFSR}, + { sName = 'dLongitudinalOffset', nMchParam = MCH_MP.OFFSL}, + { sName = 'dStartSlowLen', nMchParam = MCH_MP.STARTSLOWLEN}, + { sName = 'dEndSlowLen', nMchParam = MCH_MP.ENDSLOWLEN}, + { sName = 'dThrouAddLen', nMchParam = MCH_MP.THROUADDLEN}, + { sName = 'sSystemNotes', nMchParam = MCH_MP.SYSNOTES}, + { sName = 'sUserNotes', nMchParam = MCH_MP.USERNOTES} + } - if nOperationId then - -- impostazione geometria - local bOk = true - bOk = EgtSetMachiningGeometry( OperationToInsert.Machining.Geometry) + -- parametri relativi allo step + MachiningParameters.Steps = { + { sName = 'nStepType', nMchParam = MCH_MP.STEPTYPE}, + { sName = 'dStep', nMchParam = MCH_MP.STEP}, + { sName = 'dSideStep', nMchParam = MCH_MP.SIDESTEP} + } - -- impostazione parametri lavorazione - if OperationToInsert.Machining.sDepth then - EgtSetMachiningParam( MCH_MP.DEPTH_STR, OperationToInsert.Machining.sDepth) - end - if OperationToInsert.Machining.bInvert then - EgtSetMachiningParam( MCH_MP.INVERT, OperationToInsert.Machining.bInvert) - end - if OperationToInsert.Machining.nWorkSide then - EgtSetMachiningParam( MCH_MP.WORKSIDE, OperationToInsert.Machining.nWorkSide) - end - if OperationToInsert.Machining.nFaceuse then - EgtSetMachiningParam( MCH_MP.FACEUSE, OperationToInsert.Machining.nFaceuse) - end - if OperationToInsert.Machining.nSCC then - EgtSetMachiningParam( MCH_MP.SCC, OperationToInsert.Machining.nSCC) - end - if OperationToInsert.Machining.bToolInvert then - EgtSetMachiningParam( MCH_MP.TOOLINVERT, OperationToInsert.Machining.bToolInvert) - end - if OperationToInsert.Machining.sBlockedAxis then - EgtSetMachiningParam( MCH_MP.BLOCKEDAXIS, OperationToInsert.Machining.sBlockedAxis) - end - if OperationToInsert.Machining.sInitialAngles then - EgtSetMachiningParam( MCH_MP.INITANGS, OperationToInsert.Machining.sInitialAngles) - end - if OperationToInsert.Machining.nHeadSide then - EgtSetMachiningParam( MCH_MP.HEADSIDE, OperationToInsert.Machining.nHeadSide) - end - if OperationToInsert.Machining.nSubType then - EgtSetMachiningParam( MCH_MP.SUBTYPE, OperationToInsert.Machining.nSubType) - end - if OperationToInsert.Machining.dOverlap then - EgtSetMachiningParam( MCH_MP.OVERL, OperationToInsert.Machining.dOverlap) - end - if OperationToInsert.Machining.dStartSafetyLength then - EgtSetMachiningParam( MCH_MP.STARTPOS, OperationToInsert.Machining.dStartSafetyLength) - end + -- parametri relativi all'approccio + MachiningParameters.LeadIn = { + { sName = 'nType', nMchParam = MCH_MP.LEADINTYPE}, + { sName = 'dStartAddLength', nMchParam = MCH_MP.STARTADDLEN}, + { sName = 'dTangentDistance', nMchParam = MCH_MP.LITANG}, + { sName = 'dPerpDistance', nMchParam = MCH_MP.LIPERP}, + { sName = 'dElevation', nMchParam = MCH_MP.LIELEV}, + { sName = 'dCompLength', nMchParam = MCH_MP.LICOMPLEN} + } - -- step - if OperationToInsert.Machining.Steps then - if OperationToInsert.Machining.Steps.dStepType then - EgtSetMachiningParam( MCH_MP.STEPTYPE, OperationToInsert.Machining.Steps.dStepType) - end - if OperationToInsert.Machining.Steps.dStep then - EgtSetMachiningParam( MCH_MP.STEP, OperationToInsert.Machining.Steps.dStep) - end - if OperationToInsert.Machining.Steps.dSideStep then - EgtSetMachiningParam( MCH_MP.SIDESTEP, OperationToInsert.Machining.Steps.dSideStep) - end - end + -- parametri relativi alla retrazione + MachiningParameters.LeadOut = { + { sName = 'nType', nMchParam = MCH_MP.LEADOUTTYPE}, + { sName = 'dEndAddLength', nMchParam = MCH_MP.ENDADDLEN}, + { sName = 'dTangentDistance', nMchParam = MCH_MP.LOTANG}, + { sName = 'dPerpDistance', nMchParam = MCH_MP.LOPERP}, + { sName = 'dElevation', nMchParam = MCH_MP.LOELEV}, + { sName = 'dCompLength', nMchParam = MCH_MP.LOCOMPLEN} + } - if OperationToInsert.Machining.dStartPos then - EgtSetMachiningParam( MCH_MP.STARTPOS, OperationToInsert.Machining.dStartPos) - end - if OperationToInsert.Machining.dReturnPos then - EgtSetMachiningParam( MCH_MP.RETURNPOS, OperationToInsert.Machining.dReturnPos) - end + -- parametri da scrivere nelle note utente + local UserNotes = { + { sName = 'dMaxElev', sMchParam = 'MaxElev'} + } - if OperationToInsert.Machining.dRadialOffset then - EgtSetMachiningParam( MCH_MP.OFFSR, OperationToInsert.Machining.dRadialOffset) - end - if OperationToInsert.Machining.dLongitudinalOffset then - EgtSetMachiningParam( MCH_MP.OFFSL, OperationToInsert.Machining.dLongitudinalOffset) - end + -- parametri da scrivere nelle note di sistema + local SystemNotes = { + } - -- paraemtri attacco - if OperationToInsert.Machining.LeadIn then - if OperationToInsert.Machining.LeadIn.nType then - EgtSetMachiningParam( MCH_MP.LEADINTYPE, OperationToInsert.Machining.LeadIn.nType) - end - if OperationToInsert.Machining.LeadIn.dStartAddLength then - EgtSetMachiningParam( MCH_MP.STARTADDLEN, OperationToInsert.Machining.LeadIn.dStartAddLength) - end - if OperationToInsert.Machining.LeadIn.dTangentDistance then - EgtSetMachiningParam( MCH_MP.LITANG, OperationToInsert.Machining.LeadIn.dTangentDistance) - end - if OperationToInsert.Machining.LeadIn.dPerpDistance then - EgtSetMachiningParam( MCH_MP.LIPERP, OperationToInsert.Machining.LeadIn.dPerpDistance) - end - if OperationToInsert.Machining.LeadIn.dElevation then - EgtSetMachiningParam( MCH_MP.LIELEV, OperationToInsert.Machining.LeadIn.dElevation) - end - if OperationToInsert.Machining.LeadIn.dCompLength then - EgtSetMachiningParam( MCH_MP.LICOMPLEN, OperationToInsert.Machining.LeadIn.dCompLength) - end - end - -- parametri uscita - if OperationToInsert.Machining.LeadOut then - if OperationToInsert.Machining.LeadOut.nType then - EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, OperationToInsert.Machining.LeadOut.nType) - end - if OperationToInsert.Machining.LeadOut.dEndAddLength then - EgtSetMachiningParam( MCH_MP.ENDADDLEN, OperationToInsert.Machining.LeadOut.dEndAddLength) - end - if OperationToInsert.Machining.LeadOut.dTangentDistance then - EgtSetMachiningParam( MCH_MP.LOTANG, OperationToInsert.Machining.LeadOut.dTangentDistance) - end - if OperationToInsert.Machining.LeadOut.dPerpDistance then - EgtSetMachiningParam( MCH_MP.LOPERP, OperationToInsert.Machining.LeadOut.dPerpDistance) - end - if OperationToInsert.Machining.LeadOut.dElevation then - EgtSetMachiningParam( MCH_MP.LOELEV, OperationToInsert.Machining.LeadOut.dElevation) - end - if OperationToInsert.Machining.LeadOut.dCompLength then - EgtSetMachiningParam( MCH_MP.LOCOMPLEN, OperationToInsert.Machining.LeadOut.dCompLength) - end - end + local nClonesToAdd = 1 + if OperationToInsert.AuxiliaryData.Clones then + nClonesToAdd = #OperationToInsert.AuxiliaryData.Clones + end + for j = 1, nClonesToAdd do + -- creazione lavorazione + local nOperationId = EgtCreateMachining( OperationToInsert.Machining.sOperationName, OperationToInsert.Machining.nType, OperationToInsert.Machining.sToolName) - if OperationToInsert.Machining.dStartSlowLen then - EgtSetMachiningParam( MCH_MP.STARTSLOWLEN, OperationToInsert.Machining.dStartSlowLen) - end - if OperationToInsert.Machining.dEndSlowLen then - EgtSetMachiningParam( MCH_MP.ENDSLOWLEN, OperationToInsert.Machining.dEndSlowLen) - end - if OperationToInsert.Machining.dThrouAddLen then - EgtSetMachiningParam( MCH_MP.THROUADDLEN, OperationToInsert.Machining.dThrouAddLen) - end + if nOperationId then + -- impostazione geometria + EgtSetMachiningGeometry( OperationToInsert.Machining.Geometry) - -- 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 OperationToInsert.Machining.nMachiningOrder then - -- sSystemNotes = EgtSetValInNotes( sSystemNotes, 'MachiningOrder', OperationToInsert.Machining.nMachiningOrder) - --end - EgtSetMachiningParam( MCH_MP.SYSNOTES, sSystemNotes) - - -- parametri da settare nelle note utente - local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) - if OperationToInsert.Machining.dMaxElev then - sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', OperationToInsert.Machining.dMaxElev) - end - EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes) - - local b3MachEncumbrance = nil - local bIsApplyOk = MachiningLib.ApplyMachining( true, false) - if not bIsApplyOk then - bAreAllMachiningApplyOk = false - nErr, sErr = EgtGetLastMachMgrError() - EgtSetOperationMode( nOperationId, false) - else - local nClId = EgtGetFirstNameInGroup( nOperationId, 'CL') - local ptMin = EgtGetInfo( nClId, 'MMIN', 'p') - local ptMax = EgtGetInfo( nClId, 'MMAX', 'p') - -- box percorso lavorazione - if ptMin and ptMax then - local dToolRadius = TOOLS[OperationToInsert.Machining.nToolIndex].dTotDiameter / 2 - if dToolRadius then - ptMin = ptMin - Vector3d( dToolRadius, 0, 0) - ptMax = ptMax + Vector3d( dToolRadius, 0, 0) + -- impostazione parametri lavorazione + -- TODO scrivere sempre Steps, LeadIn, LeadOut nelle tabelle in modo da non dover controllare ogni volta che ci siano + for k = 1, #MachiningParameters do + local sValue + if OperationToInsert.AuxiliaryData.Clones and OperationToInsert.AuxiliaryData.Clones[j][MachiningParameters[k].sName] then + sValue = OperationToInsert.AuxiliaryData.Clones[j][MachiningParameters[k].sName] + elseif OperationToInsert.Machining[MachiningParameters[k].sName] then + sValue = OperationToInsert.Machining[MachiningParameters[k].sName] + end + if sValue then + EgtSetMachiningParam( MachiningParameters[k].nMchParam, sValue) + end + end + for k = 1, #MachiningParameters.Steps do + local sValue + if OperationToInsert.AuxiliaryData.Clones and OperationToInsert.AuxiliaryData.Clones[j].Steps and OperationToInsert.AuxiliaryData.Clones[j].Steps[MachiningParameters.Steps[k].sName] then + sValue = OperationToInsert.AuxiliaryData.Clones[j].Steps[MachiningParameters.Steps[k].sName] + elseif OperationToInsert.Machining.Steps and OperationToInsert.Machining.Steps[MachiningParameters.Steps[k].sName] then + sValue = OperationToInsert.Machining.Steps[MachiningParameters.Steps[k].sName] + end + if sValue then + EgtSetMachiningParam( MachiningParameters.Steps[k].nMchParam, sValue) + end + end + for k = 1, #MachiningParameters.LeadIn do + local sValue + if OperationToInsert.AuxiliaryData.Clones and OperationToInsert.AuxiliaryData.Clones[j].LeadIn and OperationToInsert.AuxiliaryData.Clones[j].LeadIn[MachiningParameters.LeadIn[k].sName] then + sValue = OperationToInsert.AuxiliaryData.Clones[j].LeadIn[MachiningParameters.LeadIn[k].sName] + elseif OperationToInsert.Machining.LeadIn and OperationToInsert.Machining.LeadIn[MachiningParameters.LeadIn[k].sName] then + sValue = OperationToInsert.Machining.LeadIn[MachiningParameters.LeadIn[k].sName] + end + if sValue then + EgtSetMachiningParam( MachiningParameters.LeadIn[k].nMchParam, sValue) + end + end + for k = 1, #MachiningParameters.LeadOut do + local sValue + if OperationToInsert.AuxiliaryData.Clones and OperationToInsert.AuxiliaryData.Clones[j].LeadOut and OperationToInsert.AuxiliaryData.Clones[j].LeadOut[MachiningParameters.LeadOut[k].sName] then + sValue = OperationToInsert.AuxiliaryData.Clones[j].LeadOut[MachiningParameters.LeadOut[k].sName] + elseif OperationToInsert.Machining.LeadOut and OperationToInsert.Machining.LeadOut[MachiningParameters.LeadOut[k].sName] then + sValue = OperationToInsert.Machining.LeadOut[MachiningParameters.LeadOut[k].sName] + end + if sValue then + EgtSetMachiningParam( MachiningParameters.LeadOut[k].nMchParam, sValue) + end + end + for k = 1, #UserNotes do + local sValue + if OperationToInsert.AuxiliaryData.Clones and OperationToInsert.AuxiliaryData.Clones[j][UserNotes[k].sName] then + sValue = OperationToInsert.AuxiliaryData.Clones[j][UserNotes[k].sName] + elseif OperationToInsert.Machining[UserNotes[k].sName] then + sValue = OperationToInsert.Machining[UserNotes[k].sName] + end + if sValue then + local sUserNotes = '' + sUserNotes = EgtSetValInNotes( sUserNotes, UserNotes[k].sMchParam, sValue) + EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes) + 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 + --if OperationToInsert.Machining.nMachiningOrder then + -- sSystemNotes = EgtSetValInNotes( sSystemNotes, 'MachiningOrder', OperationToInsert.Machining.nMachiningOrder) + --end + for k = 1, #SystemNotes do + local sValue + if OperationToInsert.AuxiliaryData.Clones and OperationToInsert.AuxiliaryData.Clones[j][SystemNotes[k].sName] then + sValue = OperationToInsert.AuxiliaryData.Clones[j][SystemNotes[k].sName] + elseif OperationToInsert.Machining[SystemNotes[k].sName] then + sValue = OperationToInsert.Machining[SystemNotes[k].sName] + end + if sValue then + local sSystemNotes = '' + sSystemNotes = EgtSetValInNotes( sSystemNotes, SystemNotes[k].sMchParam, sValue) + EgtSetMachiningParam( MCH_MP.SYSNOTES, sSystemNotes) end end - b3MachEncumbrance = BBox3d( ptMin, ptMax) - end - return bIsApplyOk, sErr, b3MachEncumbrance - else - return false, 'UNEXPECTED ERROR: Error on creating machining' + local b3MachEncumbrance = nil + local bIsApplyOk = MachiningLib.ApplyMachining( true, false) + if not bIsApplyOk then + bAreAllMachiningApplyOk = false + nErr, sErr = EgtGetLastMachMgrError() + EgtSetOperationMode( nOperationId, false) + else + local nClId = EgtGetFirstNameInGroup( nOperationId, 'CL') + local ptMin = EgtGetInfo( nClId, 'MMIN', 'p') + local ptMax = EgtGetInfo( nClId, 'MMAX', 'p') + -- box percorso lavorazione + if ptMin and ptMax then + local dToolRadius = TOOLS[OperationToInsert.Machining.nToolIndex].dTotDiameter / 2 + if dToolRadius then + ptMin = ptMin - Vector3d( dToolRadius, 0, 0) + ptMax = ptMax + Vector3d( dToolRadius, 0, 0) + end + end + b3MachEncumbrance = BBox3d( ptMin, ptMax) + end + + return bIsApplyOk, sErr, b3MachEncumbrance + else + return false, 'UNEXPECTED ERROR: Error on creating machining' + end end end diff --git a/CAMAuto/LuaLibs/WinExec.lua b/CAMAuto/LuaLibs/WinExec.lua index 8247e0c..2dcea97 100644 --- a/CAMAuto/LuaLibs/WinExec.lua +++ b/CAMAuto/LuaLibs/WinExec.lua @@ -271,65 +271,117 @@ local function GetFeatureInfoAndDependency( vProc, Part) local ProcB = vProc[j] -- TODO dipendenze da controllare : -- * gruppo di forature con aggregato 2/3 uscite - -- * Se 'Left' e 'Out' hanno stesso profilo, vanno concatenati (anche 'Right' se consentito dalle dimensioni) + -- * Se 'Left' e 'Out' hanno stesso profilo, vanno concatenati (anche 'Right' se consentito dalla macchina) end end end return vProc end +------------------------------------------------------------------------------------------------------------- +-- ottimizza le lavorazioni, considerando di ridurre i cambi utensile +local function SortByChangeToolOpt( MACHININGS) + local vProcToSortToolOpt = {} + vProcToSortToolOpt = 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 + -- se stesso utensile + if vProcToSortToolOpt[i].Machining.nToolIndex == vProcToSortToolOpt[j].Machining.nToolIndex then + if i + 1 == j then + -- il confronto riparte dall'ultimo spostato + i = j + else + -- sposto lavorazione confrontata dopo la principale + WinLib.ChangeElementPositionInTable( vProcToSortToolOpt, j, i+1) + -- il confronto riparte dall'ultimo spostato + i = j + end + end + end + end + end + + return vProcToSortToolOpt +end + ------------------------------------------------------------------------------------------------------------- -- Ordina le feature in base a fase di lavorazione -- L'ordine è indicativamente: -- 1) Tagli di testa -- 2) Fori -- 3) Scassi serratura/maniglia --- 4) Profili testa +-- 4) Profili testa / Minizinken -- 5) Profili longitudinali --- 6) Incontri/scontri +-- 6) Incontri/scontri (encounter/clash) -- 7) Listello ferma-vetro -- TODO Ordinamento da fare local function OrderMachining( MACHININGS) + local vProcToSort = MACHININGS + -- funzione di confronto. TRUE = B1 prima di B2. FALSE = B2 prima di B1 + local function CompareFeatures( B1, B2) + -- se secondo disabilitato, va lasciato dopo + if B1.Proc.nFlg ~= 0 and B2.Proc.nFlg == 0 then + return true + elseif B1.AuxiliaryData.nPhase < B2.AuxiliaryData.nPhase then + return true + elseif B1.AuxiliaryData.nPhase > B2.AuxiliaryData.nPhase then + return false + elseif B1.Machining.Geometry == B2.Machining.Geometry then + return B1.AuxiliaryData.nIndexMachining < B2.AuxiliaryData.nIndexMachining + elseif B1.AuxiliaryData.bIsProfiling and B2.AuxiliaryData.bIsDrilling and B2.AuxiliaryData.bExecAfterProfile then + return true + elseif B1.AuxiliaryData.bIsDrilling and B1.AuxiliaryData.bExecAfterProfile and B2.AuxiliaryData.bIsProfiling then + return false + elseif B1.AuxiliaryData.bIsDrilling and B2.AuxiliaryData.bIsProfiling then + return true + elseif B2.AuxiliaryData.bIsDrilling and B1.AuxiliaryData.bIsProfiling then + return false + elseif B1.AuxiliaryData.bIsProfiling and B2.AuxiliaryData.bIsProfiling then + if B1.Proc.b3Box:getCenter():getX() - B2.Proc.b3Box:getCenter():getX() < 10 * GEO.EPS_SMALL then + return EgtIf( B1.AuxiliaryData.nPhase == 1, true, false) -- se arrivati a questo controllo, la fase di lavorazione di entrambe è la stessa, quindi mi basta controllarne una + else + return EgtIf( B1.AuxiliaryData.nPhase == 1, false, true) -- se arrivati a questo controllo, la fase di lavorazione di entrambe è la stessa, quindi mi basta controllarne una + end + elseif B1.AuxiliaryData.bIsDrilling and B2.AuxiliaryData.bIsDrilling then + if B1.Proc.b3Box:getMin():getX() < B2.Proc.b3Box:getMin():getX() then + return true + else + return false + end + else + return false + end + end - -- local vProcToSort = vProc - -- -- funzione di confronto. TRUE = B1 prima di B2. FALSE = B2 prima di B1 - -- local function CompareFeatures( B1, B2) - -- -- se secondo disabilitato, va lasciato dopo - -- if B1.nFlg ~= 0 and B2.nFlg == 0 then - -- return true - -- 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 - -- return true - -- -- altrimenti si inverte - -- else - -- return false - -- end - -- end + -- test della funzione di ordinamento + if EgtGetDebugLevel() >= 3 then + EgtOutLog( ' CompareFeatures Test ') + local bCompTest = true + for i = 1, #vProcToSort do + for j = i + 1, #vProcToSort do + local bComp1 = CompareFeatures( vProcToSort[i], vProcToSort[j]) + local bComp2 = CompareFeatures( vProcToSort[j], vProcToSort[i]) + if bComp1 == bComp2 then + bCompTest = false + EgtOutLog( string.format( ' ProcId : %d vs %d --> ERROR', vProcToSort[i].Proc.id, vProcToSort[j].Proc.id)) + end + end + end + if bCompTest then + EgtOutLog( ' ALL OK') + end + end - -- -- test della funzione di ordinamento - -- if EgtGetDebugLevel() >= 3 then - -- EgtOutLog( ' CompareFeatures Test ') - -- local bCompTest = true - -- for i = 1, #vProcToSort do - -- for j = i + 1, #vProcToSort do - -- local bComp1 = CompareFeatures( vProcToSort[i], vProcToSort[j]) - -- local bComp2 = CompareFeatures( vProcToSort[j], vProcToSort[i]) - -- if bComp1 == bComp2 then - -- bCompTest = false - -- EgtOutLog( string.format( ' ProcId : %d vs %d --> ERROR', vProcToSort[i].id, vProcToSort[j].id)) - -- end - -- end - -- end - -- if bCompTest then - -- EgtOutLog( ' ALL OK') - -- end - -- end + -- eseguo un primo ordinamento + table.sort( vProcToSort, CompareFeatures) - -- -- eseguo ordinamento - -- table.sort( vProcToSort, CompareFeatures) + -- ordino per ottimizzare cambio utensile + MACHININGS = SortByChangeToolOpt( MACHININGS) return true end @@ -425,9 +477,8 @@ function WinExec.ProcessFeatures( PARTS) -- ordina le lavorazioni OrderMachining( MACHININGS) - for i = 1, #MACHININGS do - if MACHININGS[i].AuxInfo.nPhase == 1 then + if MACHININGS[i].AuxiliaryData.nPhase == 1 then -- aggiunge effettivamente la lavorazione e restituisce gli ingombri local bIsApplyOk, sErr, b3MachEncumbrance = MachiningLib.AddOperation( MACHININGS[i]) -- TODO ingombro lavorazione mi restituisce dati sbagliati. C'è un riferimento? -- se feature di testa, sposto testa in base a ingombro lavorazione @@ -453,7 +504,7 @@ function WinExec.ProcessFeatures( PARTS) EgtSetCurrPhase( 2) UpdateRawPosition( PARTS) for i = 1, #MACHININGS do - if MACHININGS[i].AuxInfo.nPhase == 2 then + if MACHININGS[i].AuxiliaryData.nPhase == 2 then -- aggiunge effettivamente la lavorazione local bIsApplyOk, sErr, b3MachEncumbrance = MachiningLib.AddOperation( MACHININGS[i]) -- TODO ingombro lavorazione mi restituisce dati sbagliati. C'è un riferimento? -- se feature di testa, sposto testa in base a ingombro lavorazione diff --git a/CAMAuto/LuaLibs/WinLib.lua b/CAMAuto/LuaLibs/WinLib.lua index b6a64d5..f9a131d 100644 --- a/CAMAuto/LuaLibs/WinLib.lua +++ b/CAMAuto/LuaLibs/WinLib.lua @@ -70,6 +70,31 @@ function WinLib.GetAffectedFaces( Proc, Part) return vtFacesAffected end +------------------------------------------------------------------------------------------------------------- +function WinLib.SwapElements( Table, Pos1, Pos2) + Table[Pos1], Table[Pos2] = Table[Pos2], Table[Pos1] + return Table +end + +------------------------------------------------------------------------------------------------------------- +function WinLib.ChangeElementPositionInTable( Table, nCurrentPosition, nTargetPosition) + -- se indici uguali esco subito + if nTargetPosition == nCurrentPosition then + return Table + end + + local Item = Table[nCurrentPosition] + + if nTargetPosition > nCurrentPosition then + nTargetPosition = nTargetPosition - 1 + end + table.remove( Table, nCurrentPosition) + table.insert( Table, nTargetPosition, Item) + + return Table +end + + ------------------------------------------------------------------------------------------------------------- function WinLib.GetAddGroup( PartId) -- recupero il nome del gruppo di lavoro corrente diff --git a/CAMAuto/ProcessWin.lua b/CAMAuto/ProcessWin.lua index 69ee3c1..dfe566a 100644 --- a/CAMAuto/ProcessWin.lua +++ b/CAMAuto/ProcessWin.lua @@ -7,7 +7,7 @@ -- Intestazioni require( 'EgtBase') _ENV = EgtProtectGlobal() -EgtEnableDebug( true) +EgtEnableDebug( false) -- TODO da cancellare quando verrà passato automaticamente da programma local WIN = {} @@ -283,7 +283,10 @@ local function MyProcessPieces() -- Impostazione dell'attrezzaggio di default -- TODO se lascio il campo vuoto non mi carica il default!!!!!!! - local bOk = EgtImportSetup( 'Standard') + local bOk = EgtImportSetup() + if not bOk then + EgtImportSetup( 'Default') + end return true end diff --git a/CAMAuto/Strategies/Drilling.lua b/CAMAuto/Strategies/Drilling.lua index 26ea23e..371c8bb 100644 --- a/CAMAuto/Strategies/Drilling.lua +++ b/CAMAuto/Strategies/Drilling.lua @@ -14,12 +14,22 @@ local MachiningLib = require( 'MachiningLib') EgtOutLog( ' Drilling started', 1) EgtMdbSave() +------------------------------------------------------------------------------------------------------------- +-- funzione che decide se eseguire le forature dopo le profilature. Solo forature di testa inclinate. Altrimenti sempre prima. +local function IsDrillToMachineAfterProfile( Proc) + local bExecAfterProfile = false + if ( Proc.AffectedFaces.Left or Proc.AffectedFaces.Right) and abs( Proc.vtDir:getX()) > 0.15 then + bExecAfterProfile = true + end + return bExecAfterProfile +end + ------------------------------------------------------------------------------------------------------------- function Drilling.Make( Proc, Part) local ToolInfo = {} local Machining = {} - local AuxInfo = {} + local AuxiliaryData = {} Machining.LeadIn = {} Machining.LeadOut = {} Machining.Steps = {} @@ -37,9 +47,12 @@ function Drilling.Make( Proc, Part) Machining.sDepth = 'th' Machining.Steps.dStep = TOOLS[ToolInfo.nToolIndex].dStep Machining.Geometry = Proc.id - AuxInfo.nPhase = MachiningLib.GetPhaseMach( Proc) - Machining.dStartSafetyLength = MachiningLib.GetDrillAdditionalSafeDistanceToRaw( Proc, Part, Machining) + 5 -- aggiungo 5mm di sicurezza - MachiningLib.AddNewMachining( Proc, Machining, AuxInfo) + AuxiliaryData.bExecAfterProfile = IsDrillToMachineAfterProfile( Proc) + AuxiliaryData.bIsDrilling = true + AuxiliaryData.nIndexMachining = 1 + AuxiliaryData.nPhase = MachiningLib.GetPhaseMach( Proc) + Machining.dStartSafetyLength = MachiningLib.GetDrillAdditionalSafeDistanceToRaw( Proc, Part, Machining) + MachiningLib.AddNewMachining( Proc, Machining, AuxiliaryData) else -- provo a cercare una fresa che faccia una svuotatura ToolSearchParameters.dMaxToolDiameter = Proc.dDiameter @@ -56,8 +69,10 @@ function Drilling.Make( Proc, Part) Machining.LeadIn.dElevation = TOOLS[ToolInfo.nToolIndex].dDiameter/2 Machining.sDepth = 0 Machining.Geometry = Proc.id - AuxInfo.nPhase = MachiningLib.GetPhaseMach( Proc) - MachiningLib.AddNewMachining( Proc, Machining, AuxInfo) + AuxiliaryData.bIsPocketingDrill = true + AuxiliaryData.nIndexMachining = 1 + AuxiliaryData.nPhase = MachiningLib.GetPhaseMach( Proc) + MachiningLib.AddNewMachining( Proc, Machining, AuxiliaryData) else return false end diff --git a/CAMAuto/Strategies/Profiling.lua b/CAMAuto/Strategies/Profiling.lua index 2851732..ab6dc2e 100644 --- a/CAMAuto/Strategies/Profiling.lua +++ b/CAMAuto/Strategies/Profiling.lua @@ -22,7 +22,7 @@ function Profiling.Make( Proc, Part) if Proc.nToolsToUse then for i = 1, Proc.nToolsToUse do local Machining = {} - local AuxInfo = {} + local AuxiliaryData = {} Machining.LeadIn = {} Machining.LeadOut = {} Machining.Steps = {} @@ -33,20 +33,22 @@ function Profiling.Make( Proc, Part) -- se trovato utensile if ToolInfo.nToolIndex then Machining.nType = MCH_MY.MILLING - Machining.nWorkSide = MCH_MILL_WS.RIGHT + 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].dTotDiameter / 2) + 10 - Machining.LeadIn.dPerpDistance = (TOOLS[ToolInfo.nToolIndex].dTotDiameter / 2) + 10 + Machining.LeadIn.dTangentDistance = (TOOLS[ToolInfo.nToolIndex].dTotDiameter / 2) + 30 + Machining.LeadIn.dPerpDistance = (TOOLS[ToolInfo.nToolIndex].dTotDiameter / 2) + 30 Machining.LeadOut.nType = MCH_MILL_LO.TANGENT - Machining.LeadOut.dTangentDistance = (TOOLS[ToolInfo.nToolIndex].dTotDiameter / 2) + 10 + Machining.LeadOut.dTangentDistance = (TOOLS[ToolInfo.nToolIndex].dTotDiameter / 2) + 30 Machining.LeadOut.dPerpDistance = 0 Machining.Geometry = Proc.id - AuxInfo.nPhase = MachiningLib.GetPhaseMach( Proc) - MachiningLib.AddNewMachining( Proc, Machining, AuxInfo) + AuxiliaryData.bIsProfiling = true + AuxiliaryData.nIndexMachining = i + AuxiliaryData.nPhase = MachiningLib.GetPhaseMach( Proc) + MachiningLib.AddNewMachining( Proc, Machining, AuxiliaryData) else return false, 'Tool not found' end From d32e22993e88c84cd3717021fe69d68a1576e0bc Mon Sep 17 00:00:00 2001 From: "andrea.villa" Date: Thu, 3 Oct 2024 12:25:08 +0200 Subject: [PATCH 4/4] Info utensili su profilo Mixed --- Profiles/Profilo78 - Offset.nge | Bin 379769 -> 38613 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Profiles/Profilo78 - Offset.nge b/Profiles/Profilo78 - Offset.nge index b1df1498d2e1e02486b95f357014c05d1107949c..a5d49d4c4e79367dc4f094e1c3a7e8bfc7c09a14 100644 GIT binary patch literal 38613 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 literal 379769 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

v82c&?~XEZEuA}T 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