From 4a5c213de61d0e48416ba90a39a7bb2264285a16 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Fri, 11 Aug 2023 18:51:02 +0200 Subject: [PATCH] - refactoring di SetMirroredMachinings - da definire cosa specchiare se feature non sul bordo --- LuaLibs/WallExec.lua | 220 +++++++++++++++++++++---------------------- 1 file changed, 105 insertions(+), 115 deletions(-) diff --git a/LuaLibs/WallExec.lua b/LuaLibs/WallExec.lua index 316ba33..5a00a45 100644 --- a/LuaLibs/WallExec.lua +++ b/LuaLibs/WallExec.lua @@ -644,7 +644,7 @@ 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) - local TOL = EgtIf( Proc1.TopologyLongName == 'DRILLING', WD.DOUBLE_HEAD_DRILLING_TOLERANCE , WD.DOUBLE_HEAD_POCKET_TOLERANCE) + local TOL = EgtIf( Proc1.TopologyLongName == 'DRILLING', WD.DOUBLE_HEAD_DRILLING_TOLERANCE or 0.1 , WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5) local Proc1X = Proc1.Box:getCenter():getX() local Proc1Y = Proc1.Box:getCenter():getY() local Proc2X = Proc2.Box:getCenter():getX() @@ -663,109 +663,23 @@ end local function SetMirroredFeatures( vProc, b3Raw) local dMinimumDistanceMirroredFeatures = 780 - local vGroovesThrough = {} + local vPockets = {} local vDrillings = {} - -- in base alla topologia cerco subito la feature mirror oppure raccolgo tutte le feature simili e le accoppio successivamente for i = 1, #vProc do local Proc = vProc[i] if Proc.Flg ~= 0 then - -- tutte le rabbet, tunnel e groove sul fianco vengono confrontate con possibili feature mirror + -- raccolgo le tasche compatibili if WD.DOUBLE_HEAD_POCKET and - ( - ( Proc.TopologyLongName == 'Rabbet-Through-RightAngles-Parallel-2' and Proc.AffectedFaces.Front) or - ( Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-3' and Proc.AffectedFaces.Front) or - ( Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-4' and Proc.AffectedFaces.Front) or - ( Proc.TopologyLongName == 'Tunnel-Blind-RightAngles-Parallel-5' and Proc.AffectedFaces.Front) or - ( Proc.TopologyLongName == 'Groove-Through-RightAngles-Parallel-3' and Proc.AffectedFaces.Front and Proc.AffectedFaces.Left and Proc.AffectedFaces.Right) - ) then - -- feature vicino al bordo Y- del grezzo - local bIsFeatureOnEdgeOrPocket = false - local nFaceLookingFrontSide - for j = 1, Proc.Fct do - if AreOppositeVectorApprox( Proc.Face[j].VtN, Y_AX()) then - nFaceLookingFrontSide = j - 1 - end - end - local dMaxDist = 200 - if nFaceLookingFrontSide then - local ptFaceCenter = EgtSurfTmFacetCenter( Proc.Id, nFaceLookingFrontSide, GDB_ID.ROOT) - local dSideDist = abs( ptFaceCenter:getY() - b3Raw:getMin():getY()) - bIsFeatureOnEdgeOrPocket = dSideDist < dMaxDist - end - -- mirror XY sul lato opposto - local nMirrorId - local dYMirrorAx - local dDeltaZ - local bIsMirrorTowardsBottom = false - -- cerco una possibile feature mirror - for j = 1, #vProc do - local ProcMirror = vProc[j] - if ProcMirror.TopologyLongName == Proc.TopologyLongName and ProcMirror.Id ~= Proc.Id and ProcMirror.Flg ~= 0 then - -- feature specchiata rivolta verso Y+ e parallela a X - local bIsMirrorFeatureFacingBackSide = EgtIf( Proc.TopologyLongName == 'Groove-Through-RightAngles-Parallel-3', ProcMirror.AffectedFaces.Back and Proc.AffectedFaces.Left and Proc.AffectedFaces.Right, ProcMirror.AffectedFaces.Back) - -- feature specchiata vicino al bordo Y+ del grezzo - local bIsMirrorFeatureOnEdgeOrPocket = false - local nMirrorFaceLookingBackSide - for k = 1, ProcMirror.Fct do - if AreSameVectorApprox( ProcMirror.Face[k].VtN, Y_AX()) then - nMirrorFaceLookingBackSide = k - 1 - end - end - if nMirrorFaceLookingBackSide then - local ptMirrorFaceCenter = EgtSurfTmFacetCenter( ProcMirror.Id, nMirrorFaceLookingBackSide, GDB_ID.ROOT) - local dMirrorSideDist = abs( ptMirrorFaceCenter:getY() - b3Raw:getMax():getY()) - bIsMirrorFeatureOnEdgeOrPocket = bIsMirrorFeatureFacingBackSide and ( dMirrorSideDist < dMaxDist) - end - -- box delle stesse dimensioni - local bIsMirrorFeatureSameDimension = false - local b3Proc = EgtGetBBoxGlob( Proc.Id, GDB_BB.STANDARD) - local b3ProcMirror = EgtGetBBoxGlob( ProcMirror.Id, GDB_BB.STANDARD) - bIsMirrorFeatureSameDimension = abs( b3Proc:getDimX() - b3ProcMirror:getDimX()) < ( WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5) and - abs( b3Proc:getDimY() - b3ProcMirror:getDimY()) < ( WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5) and - abs( b3Proc:getDimZ() - b3ProcMirror:getDimZ()) < ( WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5) - -- box allineati in X - local bIsMirrorBoxXAligned = abs( Proc.Box:getCenter():getX() - ProcMirror.Box:getCenter():getX()) < WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5 - -- box che non si intersecano - local bIsNotMirrorBoxOverlapping = not OverlapsXY( b3Proc, b3ProcMirror) - -- distanza minima tra le feature - local dYMinDistance = max( b3Proc:getMin():getY(), b3ProcMirror:getMin():getY()) - min( b3Proc:getMax():getY(), b3ProcMirror:getMax():getY()) - local bIsMirrorFeatureDistanceOk = dYMinDistance > dMinimumDistanceMirroredFeatures + 10 * GEO.EPS_SMALL - -- se tutte vere le condizioni, calcolo i parametri da passare alle lavorazioni - if bIsMirrorFeatureFacingBackSide and bIsMirrorFeatureOnEdgeOrPocket and bIsMirrorFeatureSameDimension and bIsMirrorBoxXAligned and bIsNotMirrorBoxOverlapping and bIsMirrorFeatureDistanceOk then - nMirrorId = ProcMirror.Id - local b3Tab = EgtGetTableArea() - local ptOnMirrorAx = ( Proc.Box:getCenter() + ProcMirror.Box:getCenter()) / 2 - dYMirrorAx = ptOnMirrorAx:getY() - b3Tab:getMin():getY() - dDeltaZ = ProcMirror.Box:getMax():getZ() - Proc.Box:getMax():getZ() - bIsMirrorTowardsBottom = ProcMirror.AffectedFaces.Bottom - end - end - end - -- se ho trovato una feature mirror e le condizioni precedenti sono soddisfatte, posso scrivere i parametri nella lavorazione - if nMirrorId and bIsFeatureOnEdgeOrPocket then - -- 2: specchiatura in Y - Proc.Double = 2 - Proc.MirrorId = nMirrorId - -- posizione Y dell'asse di specchiatura - Proc.MirrorAx = dYMirrorAx - -- Offset Z tra le feature - Proc.MirrorDeltaZ = dDeltaZ - -- se sono groove cieche e la principale guarda su e l'altra guarda giù, la principale va trattata come sidegroove in accordo con la seconda - if ( Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-3' or Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-4') and - Proc.AffectedFaces.Top and bIsMirrorTowardsBottom then - Proc.Stype = 2 - end - end - -- le groove non sul fianco e rivolte verso Z+ vanno raccolte, ordinate e accoppiate a 2 a 2 per il doppio - elseif WD.DOUBLE_HEAD_POCKET and ( - ( Proc.TopologyLongName == 'Groove-Through-RightAngles-Parallel-3' and Proc.AffectedFaces.Top and Proc.AffectedFaces.Left and Proc.AffectedFaces.Right) or - ( Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-4' and Proc.AffectedFaces.Top and ( Proc.AffectedFaces.Left or Proc.AffectedFaces.Right)) or - ( Proc.TopologyLongName == 'Tunnel-Blind-RightAngles-Parallel-5' and Proc.AffectedFaces.Top) + ( Proc.TopologyLongName == 'Rabbet-Through-RightAngles-Parallel-2' and ( Proc.AffectedFaces.Front or Proc.AffectedFaces.Back)) or + ( Proc.TopologyLongName == 'Groove-Through-RightAngles-Parallel-3' and ( not Proc.AffectedFaces.Bottom and Proc.AffectedFaces.Left and Proc.AffectedFaces.Right)) or + ( Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-3') or + ( Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-4') or + ( Proc.TopologyLongName == 'Tunnel-Blind-RightAngles-Parallel-5' and not Proc.AffectedFaces.Bottom) ) then - table.insert( vGroovesThrough, Proc) - -- i fori verticali e aperti verso Z+ vanno raccolti, ordinati e accoppiati a 2 a 2 per il doppio a parità di X + table.insert( vPockets, Proc) + -- raccolgo i fori verticali e aperti verso Z+ elseif WD.DOUBLE_HEAD_DRILLING and Proc.TopologyLongName == 'DRILLING' then -- recupero e verifico la geometria del foro local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i') or 0 @@ -781,24 +695,89 @@ local function SetMirroredFeatures( vProc, b3Raw) end end - -- ordinamento delle feature che vanno accoppiate - -- groove verso Z+ - table.sort( vGroovesThrough, SortFeaturesForMirror) - -- forature verso Z+ + -- ordinamento delle feature raccolte secondo X e poi Y crescente + table.sort( vPockets, SortFeaturesForMirror) table.sort( vDrillings, SortFeaturesForMirror) -- accoppio le groove passanti rivolte verso Z+ - local nCurrentGroove = 1 - while nCurrentGroove <= #vGroovesThrough do - local Proc = vGroovesThrough[nCurrentGroove] + local nCurrentPocket = 1 + while nCurrentPocket <= #vPockets do + local Proc = vPockets[nCurrentPocket] if Proc.Flg ~= 0 then local b3Proc = EgtGetBBoxGlob( Proc.Id, GDB_BB.STANDARD) - local nCurrentMirrorGroove = nCurrentGroove + 1 - while nCurrentMirrorGroove <= #vGroovesThrough do - local ProcMirror = vGroovesThrough[nCurrentMirrorGroove] + local nCurrentMirrorPocket = nCurrentPocket + 1 + while nCurrentMirrorPocket <= #vPockets do + local ProcMirror = vPockets[nCurrentMirrorPocket] local b3ProcMirror = EgtGetBBoxGlob( ProcMirror.Id, GDB_BB.STANDARD) - -- feature non disattivata e diversa da nCurrentGroove + -- feature non disattivata e diversa da nCurrentPocket local bIsMirrorIdOk = ( Proc.Id ~= ProcMirror.Id and ProcMirror.Flg ~= 0) + + -- feature mirror della stessa classe topologica + local bIsMirrorTopologyOk = ( Proc.TopologyLongName == ProcMirror.TopologyLongName) + + -- determino se di fianco o in mezzo al singolo pannello + local bLapVsTop = Proc.AffectedFaces.Front and + ( + Proc.TopologyLongName == 'Rabbet-Through-RightAngles-Parallel-2' or + Proc.TopologyLongName == 'Groove-Through-RightAngles-Parallel-3' or + Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-3' or + Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-4' or + Proc.TopologyLongName == 'Tunnel-Blind-RightAngles-Parallel-5' + ) + + -- distanza della feature master e della feature mirror dal bordo del master panel + local bIsFeatureOnEdge, bIsMirrorFeatureOnEdge = false, false + if bLapVsTop then + local dMaxDistanceFromEdge = 200 + -- feature master Y- + local nFaceLookingFrontSide + for i = 1, Proc.Fct do + if AreOppositeVectorApprox( Proc.Face[i].VtN, Y_AX()) then + nFaceLookingFrontSide = i - 1 + end + end + if nFaceLookingFrontSide then + local ptFaceCenter = EgtSurfTmFacetCenter( Proc.Id, nFaceLookingFrontSide, GDB_ID.ROOT) + local dSideDist = abs( ptFaceCenter:getY() - b3Raw:getMin():getY()) + bIsFeatureOnEdge = dSideDist < dMaxDistanceFromEdge + end + -- feature mirror Y+ + local nMirrorFaceLookingFrontSide + for i = 1, ProcMirror.Fct do + if AreSameVectorApprox( ProcMirror.Face[i].VtN, Y_AX()) then + nMirrorFaceLookingFrontSide = i - 1 + end + end + if nMirrorFaceLookingFrontSide then + local ptMirrorFaceCenter = EgtSurfTmFacetCenter( ProcMirror.Id, nMirrorFaceLookingFrontSide, GDB_ID.ROOT) + local dMirrorSideDist = abs( ptMirrorFaceCenter:getY() - b3Raw:getMax():getY()) + bIsMirrorFeatureOnEdge = dMirrorSideDist < dMaxDistanceFromEdge + end + end + + -- se di fianco, si sceglie se le feature sono compatibili con il doppio e nel caso che tipo di lavorazione fare + -- -1: no doppio, 0: nessuna preferenza, 1: pocket, 2: side (scambio faccia principale) + local nDoubleType = 0 + if bLapVsTop and ( Proc.AffectedFaces.Top or Proc.AffectedFaces.Bottom) then + -- side + if bIsFeatureOnEdge and bIsMirrorFeatureOnEdge then + nDoubleType = 2 + -- no doppio + elseif Proc.AffectedFaces.Bottom or + ProcMirror.AffectedFaces.Bottom then + nDoubleType = -1 + else + nDoubleType = 1 + end + end + + -- corrispondenza nella posizione delle feature. Se di fianco il lato master è sempre quello verso l'operatore, se sopra nessun vincolo + local bIsMirrorSideOk = ( bLapVsTop and ProcMirror.AffectedFaces.Back) or + Proc.TopologyLongName == 'Groove-Through-RightAngles-Parallel-3' and Proc.AffectedFaces.Top and ProcMirror.AffectedFaces.Top or + Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-4' and Proc.AffectedFaces.Top and Proc.AffectedFaces.Left and ProcMirror.AffectedFaces.Top and ProcMirror.AffectedFaces.Left or + Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-4' and Proc.AffectedFaces.Top and Proc.AffectedFaces.Right and ProcMirror.AffectedFaces.Top and ProcMirror.AffectedFaces.Right or + Proc.TopologyLongName == 'Tunnel-Blind-RightAngles-Parallel-5' and Proc.AffectedFaces.Top and ProcMirror.AffectedFaces.Top + -- box delle stesse dimensioni local bIsMirrorFeatureSameDimension = false bIsMirrorFeatureSameDimension = abs( b3Proc:getDimX() - b3ProcMirror:getDimX()) < ( WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5) and @@ -812,30 +791,41 @@ local function SetMirroredFeatures( vProc, b3Raw) local dYMinDistance = max( b3Proc:getMin():getY(), b3ProcMirror:getMin():getY()) - min( b3Proc:getMax():getY(), b3ProcMirror:getMax():getY()) local bIsMirrorFeatureDistanceOk = dYMinDistance > dMinimumDistanceMirroredFeatures + 10 * GEO.EPS_SMALL -- se tutte vere le condizioni, calcolo i parametri da passare alle lavorazioni - if bIsMirrorIdOk and bIsMirrorFeatureSameDimension and bIsMirrorBoxXAligned and bIsNotMirrorBoxOverlapping and bIsMirrorFeatureDistanceOk then + if nDoubleType > -1 and bIsMirrorIdOk and bIsMirrorTopologyOk and bIsMirrorSideOk and bIsMirrorFeatureSameDimension and bIsMirrorBoxXAligned and bIsNotMirrorBoxOverlapping and bIsMirrorFeatureDistanceOk then local dYMirrorAx local b3Tab = EgtGetTableArea() local ptOnMirrorAx = ( Proc.Box:getCenter() + ProcMirror.Box:getCenter()) / 2 dYMirrorAx = ptOnMirrorAx:getY() - b3Tab:getMin():getY() + local dDeltaZ = EgtIf( nDoubleType == 0, ProcMirror.Box:getMax():getZ() - Proc.Box:getMax():getZ(), 0) + -- forzo side o pocket, se necessario + if nDoubleType == 1 then + EgtSetInfo( Proc.Id, 'PCKT', 1) + EgtSetInfo( ProcMirror.Id, 'PCKT', 1) + elseif nDoubleType == 2 then + Proc.Stype = 2 + ProcMirror.Stype = 2 + end -- scrivo i parametri nella lavorazione -- 2: specchiatura in Y Proc.Double = 2 Proc.MirrorId = ProcMirror.Id -- posizione Y dell'asse di specchiatura Proc.MirrorAx = dYMirrorAx + -- Offset Z tra le feature + Proc.MirrorDeltaZ = dDeltaZ -- rimuovo dalla lista le groove già assegnate local ProcMirrorOldId = ProcMirror.Id - table.remove( vGroovesThrough, nCurrentGroove) - -- avendo rimosso un elemento dall'array, potrebbe essere cambiato l'elemento nCurrentMirrorGroove - if nCurrentMirrorGroove > #vGroovesThrough or ( vGroovesThrough[nCurrentMirrorGroove].Id ~= ProcMirrorOldId) then nCurrentMirrorGroove = nCurrentMirrorGroove - 1 end - table.remove( vGroovesThrough, nCurrentMirrorGroove) - nCurrentGroove = 0 + table.remove( vPockets, nCurrentPocket) + -- avendo rimosso un elemento dall'array, potrebbe essere cambiato l'elemento nCurrentMirrorPocket + if nCurrentMirrorPocket > #vPockets or ( vPockets[nCurrentMirrorPocket].Id ~= ProcMirrorOldId) then nCurrentMirrorPocket = nCurrentMirrorPocket - 1 end + table.remove( vPockets, nCurrentMirrorPocket) + nCurrentPocket = 0 break end - nCurrentMirrorGroove = nCurrentMirrorGroove + 1 + nCurrentMirrorPocket = nCurrentMirrorPocket + 1 end end - nCurrentGroove = nCurrentGroove + 1 + nCurrentPocket = nCurrentPocket + 1 end -- accoppio le forature