From fa276949a26f779f9554d2fdd28e8031a86bbed0 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Mon, 4 Sep 2023 17:56:07 +0200 Subject: [PATCH] - in WallExec completata ricerca e esecuzione di fresature in doppio da percorso specchiato - in WMachiningLib resa globale la funzione IsToolDoubleOk - piccole correzioni --- LuaLibs/WMachiningLib.lua | 12 ++- LuaLibs/WProcessFreeContour.lua | 11 +++ LuaLibs/WallExec.lua | 149 +++++++++++++++++++++++++++----- 3 files changed, 147 insertions(+), 25 deletions(-) diff --git a/LuaLibs/WMachiningLib.lua b/LuaLibs/WMachiningLib.lua index c042091..b1892e2 100644 --- a/LuaLibs/WMachiningLib.lua +++ b/LuaLibs/WMachiningLib.lua @@ -187,8 +187,8 @@ function WMachiningLib.FindSurfacing( sType) end end --- incapsulo EgtAddMachining e trascrivo alcune informazioni utili nelle note dell'operazione --------------------------------------------------------------------- +-- incapsulo EgtAddMachining e trascrivo alcune informazioni utili nelle note dell'operazione function WMachiningLib.AddMachining( Proc, sName, sMachining) local nMchId, sFinalName = EgtAddMachining( sName, sMachining) if type(Proc) == 'table' then @@ -200,7 +200,8 @@ function WMachiningLib.AddMachining( Proc, sName, sMachining) end --------------------------------------------------------------------- -local function IsToolDoubleOk( sToolMasterName, sToolDoubleName) +-- verifica se utensile sToolMasterName e gemello sToolDoubleName sono compatibili con la specchiatura +function WMachiningLib.IsToolDoubleOk( sToolMasterName, sToolDoubleName) local bIsToolDoubleOk = false -- dimensioni utensile master EgtTdbSetCurrTool( sToolMasterName) @@ -211,6 +212,7 @@ local function IsToolDoubleOk( sToolMasterName, sToolDoubleName) local dTDiamTh = EgtTdbGetCurrToolThDiam() or 0 local bTipFeed = EgtTdbGetCurrToolParam( MCH_TP.TIPFEED) > 0 local dTMaxDepthOnSide = EgtIf( bIsBlade, EgtTdbGetCurrToolParam( MCH_TP.MAXMAT), min( EgtTdbGetCurrToolValInNotes( MCH_TP.USERNOTES, 'SIDEDEPTH', 'd') or 999, 0.5 * ( dTDiam - dTDiamTh))) + local bIsPrimaryHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD) == 'H1' -- dimensioni utensile double EgtTdbSetCurrTool( sToolDoubleName) local bIsBladeDouble = ( EgtTdbGetCurrToolParam( MCH_TP.TYPE) & MCH_TF.SAWBLADE ~= 0) or false @@ -221,7 +223,8 @@ local function IsToolDoubleOk( sToolMasterName, sToolDoubleName) local bTipFeedDouble = EgtTdbGetCurrToolParam( MCH_TP.TIPFEED) > 0 local dTMaxDepthOnSideDouble = EgtIf( bIsBladeDouble, EgtTdbGetCurrToolParam( MCH_TP.MAXMAT), min( EgtTdbGetCurrToolValInNotes( MCH_TP.USERNOTES, 'SIDEDEPTH', 'd') or 999, 0.5 * ( dTDiamDouble - dTDiamThDouble))) -- controllo che siano uguali - bIsToolDoubleOk = ( bIsBlade == bIsBladeDouble) and + bIsToolDoubleOk = bIsPrimaryHead and + ( bIsBlade == bIsBladeDouble) and ( dTMaxMatDouble > dTMaxMat - 100 * GEO.EPS_SMALL) and ( dTMaxDepthDouble > dTMaxDepth - 100 * GEO.EPS_SMALL) and ( abs( dTDiam - dTDiamDouble) < 100 * GEO.EPS_SMALL) and @@ -233,6 +236,7 @@ local function IsToolDoubleOk( sToolMasterName, sToolDoubleName) end --------------------------------------------------------------------- +-- verifica se la lavorazione sMachining è adatta alla specchiatura function WMachiningLib.IsMachiningOkForDouble( sMachining) local bDoubleOk = false if sMachining and EgtMdbSetCurrMachining( sMachining) then @@ -242,7 +246,7 @@ function WMachiningLib.IsMachiningOkForDouble( sMachining) -- cerco eventuale utensile in doppio local sToolDoubleName = EgtTdbGetCurrToolValInNotes( MCH_TP.USERNOTES, 'DOUBLE', 's') if sToolDoubleName and EgtTdbSetCurrTool( sToolDoubleName) then - bDoubleOk = IsToolDoubleOk( sToolMasterName, sToolDoubleName) + bDoubleOk = WMachiningLib.IsToolDoubleOk( sToolMasterName, sToolDoubleName) end end end diff --git a/LuaLibs/WProcessFreeContour.lua b/LuaLibs/WProcessFreeContour.lua index b3be5cc..c6af9b3 100644 --- a/LuaLibs/WProcessFreeContour.lua +++ b/LuaLibs/WProcessFreeContour.lua @@ -1315,6 +1315,8 @@ local function AddMillings( sMilling, vFace, Proc, nRawId, b3Raw, nConeCut, nAdd nSCC = EgtIf( abs( vFace[i].Norm:getX()) > abs( vFace[i].Norm:getY()), MCH_SCC.ADIR_XP, MCH_SCC.ADIR_YP) end EgtSetMachiningParam( MCH_MP.SCC, nSCC) + -- scrivo nell'operazione il vettore normale alla superfice che servirà per il doppio + EgtSetInfo( nMchId or GDB_ID.NULL, 'NORM_SUM', vFace[i].Norm) -- eseguo if not EgtApplyMachining( true, false) then local _, sErr = EgtGetLastMachMgrError() @@ -1512,6 +1514,13 @@ local function AddMillings( sMilling, vFace, Proc, nRawId, b3Raw, nConeCut, nAdd -- posizione braccio porta testa EgtSetMachiningParam( MCH_MP.SCC, MCH_SCC.ADIR_XP) end + --scrivo nell'operazione il vettore somma delle normali alle superfici che servirà per il doppio + local vtNSum = Vector3d( 0, 0, 0) + for iGeom = 1, #vGeom do + local nFace = vGeom[iGeom][2] + vtNSum = vtNSum + Proc.Face[ nFace + 1].VtN + end + EgtSetInfo( nMchId or GDB_ID.NULL, 'NORM_SUM', vtNSum) -- eseguo if not EgtApplyMachining( true, false) then local _, sErr = EgtGetLastMachMgrError() @@ -1574,6 +1583,8 @@ local function AddMillings( sMilling, vFace, Proc, nRawId, b3Raw, nConeCut, nAdd nSCC = EgtIf( abs( vFace[i].Norm:getX()) > abs( vFace[i].Norm:getY()), MCH_SCC.ADIR_XP, MCH_SCC.ADIR_YP) end EgtSetMachiningParam( MCH_MP.SCC, nSCC) + -- scrivo nell'operazione il vettore normale alla superfice che servirà per il doppio + EgtSetInfo( nMchId or GDB_ID.NULL, 'NORM_SUM', vFace[i].Norm) -- eseguo if not EgtApplyMachining( true, false) then local _, sErr = EgtGetLastMachMgrError() diff --git a/LuaLibs/WallExec.lua b/LuaLibs/WallExec.lua index 3e45b29..81360a3 100644 --- a/LuaLibs/WallExec.lua +++ b/LuaLibs/WallExec.lua @@ -652,11 +652,14 @@ end -- funzione per l'ordinamento delle features in doppio da accoppiare -- ordinate prima in base alla X e poi alla Y local function SortFeaturesForMirror( Proc1, Proc2) + -- tolleranza di ricerca local TOL = EgtIf( Proc1.TopologyLongName == 'DRILLING', WD.DOUBLE_HEAD_DRILLING_TOLERANCE or 0.1 , WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5) + -- recupero i centri dei box lungo X e Y local Proc1X = Proc1.Box:getCenter():getX() local Proc1Y = Proc1.Box:getCenter():getY() local Proc2X = Proc2.Box:getCenter():getX() local Proc2Y = Proc2.Box:getCenter():getY() + -- confronto per ordinamento if Proc1X < Proc2X - TOL then return true elseif abs( Proc1X - Proc2X) < TOL then @@ -666,12 +669,43 @@ local function SortFeaturesForMirror( Proc1, Proc2) end end +------------------------------------------------------------------------------------------------------------- +-- funzione per l'ordinamento delle operazioni in doppio da accoppiare +-- ordinate prima in base alla X e poi alla Y +local function SortOperationsForMirror( nOper1, nOper2) + -- tolleranza di ricerca + local TOL = 0.1 + -- recupero il box della prima operazione + local nClId1 = EgtGetFirstNameInGroup( nOper1, 'CL') + local ptMin1 = EgtGetInfo( nClId1, 'MMIN', 'p') + local ptMax1 = EgtGetInfo( nClId1, 'MMAX', 'p') + local b3Oper1 = BBox3d( ptMin1, ptMax1) + -- recupero il box delle seconda operazione + local nClId2 = EgtGetFirstNameInGroup( nOper2, 'CL') + local ptMin2 = EgtGetInfo( nClId2, 'MMIN', 'p') + local ptMax2 = EgtGetInfo( nClId2, 'MMAX', 'p') + local b3Oper2 = BBox3d( ptMin2, ptMax2) + -- recupero i centri dei box lungo X e Y + local nOper1X = b3Oper1:getCenter():getX() + local nOper1Y = b3Oper1:getCenter():getY() + local nOper2X = b3Oper2:getCenter():getX() + local nOper2Y = b3Oper2:getCenter():getY() + -- confronto per ordinamento + if nOper1X < nOper2X - TOL then + return true + elseif abs( nOper1X - nOper2X) < TOL then + if nOper1Y < nOper2Y - TOL then + return true + end + end +end + ------------------------------------------------------------------------------------------------------------- -- Controlla in vProc la presenza di feature da lavorare in doppio e, se trovate, ne setta i parametri local function SetMirroredFeatures( vProc, b3Raw) - -- interasse minimo local dMinimumDistanceMirroredFeatures = 780 + -- inizializzazione array tasche e forature local vPockets = {} local vDrillings = {} @@ -715,6 +749,7 @@ local function SetMirroredFeatures( vProc, b3Raw) local Proc = vPockets[nCurrentPocket] if Proc.Flg ~= 0 then local b3Proc = EgtGetBBoxGlob( Proc.Id, GDB_BB.STANDARD) + -- cerco evenutale specchiata local nCurrentMirrorPocket = nCurrentPocket + 1 while nCurrentMirrorPocket <= #vPockets do local ProcMirror = vPockets[nCurrentMirrorPocket] @@ -794,7 +829,8 @@ local function SetMirroredFeatures( vProc, b3Raw) Proc.MirrorAx = dYMirrorAx -- Offset Z tra le feature Proc.MirrorDeltaZ = dDeltaZ - -- rimuovo dalla lista le groove già assegnate + + -- rimuovo dalla lista le pocket già assegnate local ProcMirrorOldId = ProcMirror.Id table.remove( vPockets, nCurrentPocket) -- avendo rimosso un elemento dall'array, potrebbe essere cambiato l'elemento nCurrentMirrorPocket @@ -814,8 +850,9 @@ local function SetMirroredFeatures( vProc, b3Raw) while nCurrentDrilling <= #vDrillings do local Proc = vDrillings[nCurrentDrilling] if Proc.Flg ~= 0 then - local nCurrentMirrorDrilling = nCurrentDrilling + 1 local b3Proc = EgtGetBBoxGlob( Proc.Id, GDB_BB.STANDARD) + -- cerco evenutale specchiata + local nCurrentMirrorDrilling = nCurrentDrilling + 1 while nCurrentMirrorDrilling <= #vDrillings do local ProcMirror = vDrillings[nCurrentMirrorDrilling] local b3ProcMirror = EgtGetBBoxGlob( ProcMirror.Id, GDB_BB.STANDARD) @@ -838,14 +875,14 @@ local function SetMirroredFeatures( vProc, b3Raw) local b3Tab = EgtGetTableArea() local ptOnMirrorAx = ( Proc.Box:getCenter() + ProcMirror.Box:getCenter()) / 2 dYMirrorAx = ptOnMirrorAx:getY() - b3Tab:getMin():getY() - -- scrivo i parametri nella lavorazione -- 2: specchiatura in Y Proc.Double = 2 Proc.Mirror = ProcMirror -- posizione Y dell'asse di specchiatura Proc.MirrorAx = dYMirrorAx - -- rimuovo dalla lista le groove già assegnate + + -- rimuovo dalla lista le forature già assegnate local ProcMirrorOldId = ProcMirror.Id table.remove( vDrillings, nCurrentDrilling) -- avendo rimosso un elemento dall'array, potrebbe essere cambiato l'elemento nCurrentMirrorDrilling @@ -866,34 +903,83 @@ end local function SetMirroredOperations() -- interasse minimo local dMinimumDistanceMirroredOperations = 780 - local nOperIdMaster = EgtGetNextOperation( EgtGetPhaseDisposition( 1)) - while nOperIdMaster do + -- inzializzazione array + local vMillings = {} + + -- raccolgo le fresature non già fatte in doppio + local nOperId = EgtGetNextOperation( EgtGetPhaseDisposition( 1)) + while nOperId do + EgtSetCurrMachining( nOperId) + local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) + local bIsDouble = ( EgtGetValInNotes( sUserNotes, 'DOUBLE', 'i') or 0) > 0 + if not bIsDouble and EgtGetOperationType( nOperId) == MCH_OY.MILLING then + table.insert( vMillings, nOperId) + end + nOperId = EgtGetNextOperation( nOperId) + end + + -- ordinamento delle operazioni raccolte secondo X e poi Y crescente + table.sort( vMillings, SortOperationsForMirror) + + -- accoppio le fresature + local nCurrentMilling = 1 + while nCurrentMilling <= #vMillings do + local nOperIdMaster = vMillings[nCurrentMilling] EgtSetCurrMachining( nOperIdMaster) + local sMachining = EgtGetMachiningParam( MCH_MP.NAME, 's') local nClId = EgtGetFirstNameInGroup( nOperIdMaster, 'CL') local nPathId = EgtGetFirstInGroup( nClId or GDB_ID.NULL) - -- vettore direzione utensile lavorazione master + -- vettore direzione utensile e somma normali facce per lavorazione master local vtTool = EgtGetInfo( nPathId, 'EXTR', 'v') + local vtNormSum = EgtGetInfo( nOperIdMaster, 'NORM_SUM', 'v') local ptMin = EgtGetInfo( nClId, 'MMIN', 'p') local ptMax = EgtGetInfo( nClId, 'MMAX', 'p') -- box percorso lavorazione master local b3Operation = BBox3d( ptMin, ptMax) - local sMachining = EgtGetMachiningParam( MCH_MP.NAME, 's') -- lavorazione master adatta alla specchiatura - local bIsMachiningOk = ( EgtGetMachiningParam( MCH_MP.TYPE) == MCH_OY.MILLING) and EgtGetOperationMode( nOperIdMaster) and WM.IsMachiningOkForDouble( sMachining) - local nOperIdMirror = EgtGetNextOperation( EgtGetPhaseDisposition( 1)) + local bIsMachiningOk = EgtGetOperationMode( nOperIdMaster) and WM.IsMachiningOkForDouble( sMachining) if bIsMachiningOk then - while nOperIdMirror do + -- recupero la distanza tra centro di rotazione e punta dell'utensile per aumentare o ridurre l'interasse minimo + local dTipToPivot, dTipToPivotDouble = 999, 999 + local dToolMasterTotLength, dToolMasterTotLengthDouble = 999, 999 + local sToolMasterName = '' + if EgtMdbSetCurrMachining( sMachining) then + -- recupero l'utensile della lavorazione e il suo doppio + sToolMasterName = EgtMdbGetCurrMachiningParam( MCH_MP.TOOL) + if EgtTdbSetCurrTool( sToolMasterName or '') then + dToolMasterTotLength = EgtTdbGetCurrToolParam( MCH_TP.TOTLEN) or dToolMasterTotLength + local sToolDoubleName = EgtTdbGetCurrToolValInNotes( MCH_TP.USERNOTES, 'DOUBLE', 's') + if sToolDoubleName and EgtTdbSetCurrTool( sToolDoubleName) then + dToolMasterTotLengthDouble = EgtTdbGetCurrToolParam( MCH_TP.TOTLEN) or dToolMasterTotLengthDouble + end + end + end + if WD.HEAD_PIVOT_MAIN and WD.HEAD_PIVOT_SECONDARY then + dTipToPivot = dToolMasterTotLength + WD.HEAD_PIVOT_MAIN + dTipToPivotDouble = dToolMasterTotLengthDouble + WD.HEAD_PIVOT_SECONDARY + else + local sOut = 'Error : HEAD_PIVOT_MAIN or HEAD_PIVOT_SECONDARY missing in WallData' + return false, sOut + end + -- cerco eventuale specchiata + local nCurrentMirrorMilling = nCurrentMilling + 1 + while nCurrentMirrorMilling <= #vMillings do + local nOperIdMirror = vMillings[nCurrentMirrorMilling] EgtSetCurrMachining( nOperIdMirror) local nClIdMirror = EgtGetFirstNameInGroup( nOperIdMirror, 'CL') local nPathIdMirror = EgtGetFirstInGroup( nClIdMirror or GDB_ID.NULL) - -- vettore direzione utensile lavorazione mirror + -- vettore direzione utensile e somma normali facce per lavorazione mirror local vtToolMirror = EgtGetInfo( nPathIdMirror, 'EXTR', 'v') + local vtNormSumMirror = EgtGetInfo( nOperIdMirror, 'NORM_SUM', 'v') local ptMinMirror = EgtGetInfo( nClIdMirror, 'MMIN', 'p') local ptMaxMirror = EgtGetInfo( nClIdMirror, 'MMAX', 'p') -- box percorso lavorazione mirror local b3OperationMirror = BBox3d( ptMinMirror, ptMaxMirror) + -- utensile originale lavorazione specchiata + local sOriginalMirrorToolName = EgtGetMachiningParam( MCH_MP.TOOL) + local bIsOriginalMirrorToolSameSize = WM.IsToolDoubleOk( sToolMasterName, sOriginalMirrorToolName) -- lavorazione mirror adatta alla specchiatura - local bIsMirrorMachiningOk = ( EgtGetMachiningParam( MCH_MP.TYPE) == MCH_OY.MILLING) and EgtGetOperationMode( nOperIdMirror) and nOperIdMaster ~= nOperIdMirror + local bIsMirrorMachiningOk = EgtGetOperationMode( nOperIdMirror) and nOperIdMaster ~= nOperIdMirror -- lavorazione master più a sinistra local bIsMirrorSideOk = ( b3OperationMirror:getCenter():getY() - b3Operation:getCenter():getY()) > ( WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5) -- box delle stesse dimensioni @@ -906,13 +992,27 @@ local function SetMirroredOperations() -- box che non si intersecano local bIsNotMirrorBoxOverlapping = not OverlapsXY( b3Operation, b3OperationMirror) -- distanza minima tra le feature + local dTipToPivotProjectionOnY = dTipToPivot * vtTool:getY() + local dTipToPivotProjectionOnYDouble = dTipToPivotDouble * vtToolMirror:getY() local dYMinDistance = max( b3Operation:getMin():getY(), b3OperationMirror:getMin():getY()) - min( b3Operation:getMax():getY(), b3OperationMirror:getMax():getY()) - local bIsMirrorOperationDistanceOk = dYMinDistance > dMinimumDistanceMirroredOperations + 10 * GEO.EPS_SMALL - -- vettori utensile specchiati - vtTool:mirror( Y_AX()) - local bIsMirrorVectorOk = AreSameVectorApprox( vtTool, vtToolMirror) + local bIsMirrorOperationDistanceOk = dYMinDistance > dMinimumDistanceMirroredOperations + dTipToPivotProjectionOnY - dTipToPivotProjectionOnYDouble + 10 * GEO.EPS_SMALL + -- vettori utensile e somma normali facce specchiati + local vtToolMirrored = Vector3d( vtTool) + vtToolMirrored:mirror( Y_AX()) + local bIsMirrorVectorOk = false + if AreSameVectorApprox( vtToolMirrored, vtToolMirror) then + if AreSameVectorApprox(vtTool, vtToolMirror) then + if vtNormSum and vtNormSumMirror then + local vtNormSumMirrored = Vector3d( vtNormSum) + vtNormSumMirrored:mirror( Y_AX()) + bIsMirrorVectorOk = AreSameVectorApprox( vtNormSumMirrored, vtNormSumMirror) + end + else + bIsMirrorVectorOk = true + end + end -- se condizioni corrette, scrivo le note e cancello la specchiata - if bIsMirrorMachiningOk and bIsMirrorSideOk and bIsMirrorOperationSameDimension and bIsMirrorBoxXAligned and bIsNotMirrorBoxOverlapping and bIsMirrorOperationDistanceOk and bIsMirrorVectorOk then + if bIsOriginalMirrorToolSameSize and bIsMirrorMachiningOk and bIsMirrorSideOk and bIsMirrorOperationSameDimension and bIsMirrorBoxXAligned and bIsNotMirrorBoxOverlapping and bIsMirrorOperationDistanceOk and bIsMirrorVectorOk then -- calcolo asse di specchiatura local dYMirrorAx local b3Tab = EgtGetTableArea() @@ -928,12 +1028,19 @@ local function SetMirroredOperations() EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes) -- cancello l'operazione specchiata EgtRemoveOperation( nOperIdMirror) + -- rimuovo dalla lista le fresature già assegnate + local nCurrentMirrorMillingOldId = nCurrentMirrorMilling + table.remove( vMillings, nCurrentMilling) + -- avendo rimosso un elemento dall'array, potrebbe essere cambiato l'elemento nCurrentMirrorPocket + if nCurrentMirrorMilling > #vMillings or ( vMillings[nCurrentMirrorMilling] ~= nCurrentMirrorMillingOldId) then nCurrentMirrorMilling = nCurrentMirrorMilling - 1 end + table.remove( vMillings, nCurrentMirrorMilling) + nCurrentMilling = 0 break end - nOperIdMirror = EgtGetNextOperation( nOperIdMirror) + nCurrentMirrorMilling = nCurrentMirrorMilling + 1 end end - nOperIdMaster = EgtGetNextOperation( nOperIdMaster) + nCurrentMilling = nCurrentMilling + 1 end end