- refactoring di SetMirroredMachinings

- da definire cosa specchiare se feature non sul bordo
This commit is contained in:
luca.mazzoleni
2023-08-11 18:51:02 +02:00
parent d0cecd6a0d
commit 4a5c213de6
+105 -115
View File
@@ -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