From 68921b5df5d1147f7b9f5c8b095682d63805a959 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Thu, 7 Mar 2024 15:08:57 +0100 Subject: [PATCH] - Implementate le lavorazioni in doppio per fori specchiati non passanti e DrillPocket --- LuaLibs/BeamExec.lua | 134 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 107 insertions(+), 27 deletions(-) diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 0f122d1..89eef6b 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -58,6 +58,7 @@ -- 2024/02/19 In Collect aggiunta la scrittura nella Proc di Width e Height delle facce. -- 2024/02/29 Migliorata 'CompareFeatures' per ordine forature -- 2024/03/04 Creata funzione calcolo dipendenze tra feature con calcolo topologia. +-- 2024/03/07 Implementate le lavorazioni in doppio per fori specchiati non passanti e DrillPocket. -- Tabella per definizione modulo local BeamExec = {} @@ -347,9 +348,11 @@ local function CollectFeatures( PartId, b3Raw, dCurrOvmH, dCurrOvmT) if not Proc.Face then Proc.Face = {} for i = 1, Proc.Fct do - local _, dFaceWidth, dFaceHeight = BL.GetFaceHvRefDim( Proc.Id, i - 1, b3Raw) - Proc.Face[i] = { Id = i - 1, VtN = EgtSurfTmFacetNormVersor( Proc.Id, i - 1, GDB_ID.ROOT ), Width = dFaceWidth, Height = dFaceHeight} + Proc.Face[i] = { Id = i - 1, VtN = EgtSurfTmFacetNormVersor( Proc.Id, i - 1, GDB_ID.ROOT )} if Proc.Fct < 10 then + local _, dFaceWidth, dFaceHeight = BL.GetFaceHvRefDim( Proc.Id, i - 1, b3Raw) + Proc.Face[i].Width = dFaceWidth + Proc.Face[i].Height = dFaceHeight Proc.Face[i].Elevation = EgtSurfTmFacetElevationInBBox( Proc.Id, i - 1, b3Solid, true, GDB_ID.ROOT) end end @@ -1552,30 +1555,29 @@ local function CheckMirrorPocket( Proc, ProcMirror, b3Raw, AuxId) return false end end - -- devono avere il centro allineato, essere equidistanti dalla mezzaria trave e non essere troppo vicine + -- devono avere il centro allineato, essere equidistanti dalla mezzeria trave e non essere troppo vicine local vtDisplacement = ptBC - ptBCMirror local ptCenRaw = b3Raw:getCenter() - local dMinimumDistanceMirroredFeatures = 50 if AreSameOrOppositeVectorApprox( vtExtr, Y_AX()) then local dYMinDistance = max( b3Proc:getMin():getY(), b3ProcMirror:getMin():getY()) - min( b3Proc:getMax():getY(), b3ProcMirror:getMax():getY()) - if not ( abs( vtDisplacement:getX()) < 500 * GEO.EPS_SMALL and abs( vtDisplacement:getZ()) < 500 * GEO.EPS_SMALL and + if not ( abs( vtDisplacement:getX()) < 500 * GEO.EPS_SMALL and abs( vtDisplacement:getZ()) < 500 * GEO.EPS_SMALL and ( abs( ptBC:getY() - ptCenRaw:getY()) - abs( ptBCMirror:getY() - ptCenRaw:getY())) < 500 * GEO.EPS_SMALL and - dYMinDistance > dMinimumDistanceMirroredFeatures + 10 * GEO.EPS_SMALL) then + dYMinDistance > MIRROR_POCKETS_MIN_DISTANCE + 10 * GEO.EPS_SMALL) then return false end elseif AreSameOrOppositeVectorApprox( vtExtr, Z_AX()) then local dZMinDistance = max( b3Proc:getMin():getZ(), b3ProcMirror:getMin():getZ()) - min( b3Proc:getMax():getZ(), b3ProcMirror:getMax():getZ()) - if not ( abs( vtDisplacement:getX()) < 500 * GEO.EPS_SMALL and abs( vtDisplacement:getY()) < 500 * GEO.EPS_SMALL and + if not ( abs( vtDisplacement:getX()) < 500 * GEO.EPS_SMALL and abs( vtDisplacement:getY()) < 500 * GEO.EPS_SMALL and ( abs( ptBC:getZ() - ptCenRaw:getZ()) - abs( ptBCMirror:getZ() - ptCenRaw:getZ())) < 500 * GEO.EPS_SMALL and - dZMinDistance > dMinimumDistanceMirroredFeatures + 10 * GEO.EPS_SMALL) then + dZMinDistance > MIRROR_POCKETS_MIN_DISTANCE + 10 * GEO.EPS_SMALL) then return false end else return false end -- devono avere box con le stesse dimensioni - if not ( abs( b3DtMrt:getDimX() - b3DtMrtMirror:getDimX()) < 500 * GEO.EPS_SMALL and - abs( b3DtMrt:getDimY() - b3DtMrtMirror:getDimY()) < 500 * GEO.EPS_SMALL and + if not ( abs( b3DtMrt:getDimX() - b3DtMrtMirror:getDimX()) < 500 * GEO.EPS_SMALL and + abs( b3DtMrt:getDimY() - b3DtMrtMirror:getDimY()) < 500 * GEO.EPS_SMALL and abs( b3DtMrt:getDimZ() - b3DtMrtMirror:getDimZ()) < 500 * GEO.EPS_SMALL) then return false end @@ -1767,18 +1769,21 @@ local function VerifyDrillMirrored( Proc, vProc, b3Raw) if not AuxId or EgtGetType( AuxId) ~= GDB_TY.CRV_ARC then return end + -- verifico se foratura splittata oppure da specchiare + local bIsDrillingOkForMirror = abs( Proc.Flg) == 2 or ( Proc.Mirror ~= nil) + if not bIsDrillingOkForMirror then return end -- recupero direzione e dimensioni del foro local vtExtr = EgtCurveExtrusion( AuxId, GDB_RT.GLOB) local dDiam = 2 * EgtArcRadius( AuxId) local dLen = abs( EgtCurveThickness( AuxId)) - local dMachiningDepth = dLen / 2 + BD.DRILL_OVERLAP + local dMachiningDepth = EgtIf( abs( Proc.Flg) == 2, dLen / 2 + BD.DRILL_OVERLAP, dLen) -- recupero lavorazione adatta local sDrilling, sType, dMaxDepth = ML.FindDrilling( dDiam, dMachiningDepth, true, false, true) if not sDrilling then sDrilling, sType, dMaxDepth = ML.FindDrilling( dDiam, 0, true, false, true) dMachiningDepth = dMaxDepth or dMachiningDepth end - if not sDrilling or sType ~= 'Drill' or not EgtMdbSetCurrMachining( sDrilling) then + if not sDrilling or ( sType ~= 'Drill' and sType ~= 'Pocket') or not EgtMdbSetCurrMachining( sDrilling) then return end local dDrillingStep = EgtMdbGetCurrMachiningParam( MCH_MP.STEP) @@ -1786,7 +1791,8 @@ local function VerifyDrillMirrored( Proc, vProc, b3Raw) if not EgtTdbSetCurrTool( EgtMdbGetCurrMachiningParam( MCH_MP.TOOL) or '') then return end - -- recupero la lunghezza della parte inclinata della punta + -- recupero diametro utensile e lunghezza della parte inclinata della punta + local dToolDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM, 'd') local dToolTipLength = EgtTdbGetCurrToolParam( MCH_TP.TOTLEN) - EgtTdbGetCurrToolParam( MCH_TP.LEN) -- recupero eventuale utensile in doppio, suo diametro e massima lavorazione local sToolDoubleName = EgtTdbGetCurrToolValInNotes( MCH_TP.USERNOTES, 'DOUBLE', 's') @@ -1795,24 +1801,27 @@ local function VerifyDrillMirrored( Proc, vProc, b3Raw) end local dToolDoubleDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM, 'd') local dToolDoubleMaxDepth = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT) + dMachiningDepth = min( dMachiningDepth, dToolDoubleMaxDepth) -- recupero la lunghezza della parte inclinata della punta local dToolDoubleTipLength = EgtTdbGetCurrToolParam( MCH_TP.TOTLEN) - EgtTdbGetCurrToolParam( MCH_TP.LEN) + -- se foratura splittata, verifico che la distanza minima tra le due punte sia rispettata + if abs( Proc.Flg) == 2 and not ( ( ( 2 * dDrillingStep - dToolTipLength - dToolDoubleTipLength) - MIRROR_DRILLINGS_MIN_DISTANCE) > 10 * GEO.EPS_SMALL) then + return + end -- verifico se in doppio - local dMinimumDistanceMirroredFeatures = 40 - dMachiningDepth = min( dMachiningDepth, dToolDoubleMaxDepth) - if abs( Proc.Flg) == 2 and dToolDoubleDiam < dDiam + 10 * GEO.EPS_SMALL and dToolDoubleDiam > dDiam - BD.DRILL_TOL - 10 * GEO.EPS_SMALL and - (( 2 * dDrillingStep - dToolTipLength - dToolDoubleTipLength) - dMinimumDistanceMirroredFeatures) > 10 * GEO.EPS_SMALL then - if Proc.Fce ~= 0 then + if ( abs( dToolDiam - dToolDoubleDiam) < 10 * GEO.EPS_SMALL) then + if Proc.Fce ~= 0 or Proc.Mirror then if Proc.Flg == -2 then vtExtr = -vtExtr end + local ProcToDisable = EgtIf( abs( Proc.Flg) == 2, Proc, Proc.Mirror) if ( not BD.DOWN_HEAD and AreSameVectorApprox( vtExtr, Y_AX())) or ( BD.DOWN_HEAD and AreOppositeVectorApprox( vtExtr, Y_AX())) then Proc.Double = 2 Proc.MachDepthDouble = dMachiningDepth - DisableOtherDrilling( Proc, vProc) + DisableOtherDrilling( ProcToDisable, vProc) elseif BD.DOWN_HEAD and AreSameVectorApprox( vtExtr, Z_AX()) then Proc.Double = 3 Proc.MachDepthDouble = dMachiningDepth - DisableOtherDrilling( Proc, vProc) + DisableOtherDrilling( ProcToDisable, vProc) end end end @@ -1894,25 +1903,93 @@ local function SetDrillingsToMachineAfterHeadOrTailCut( vProc, vMachineBeforeInt end end +------------------------------------------------------------------------------------------------------------- +local function AreDrillingsMirrored( Proc, ProcMirror, b3Raw) + if Proc.Id == ProcMirror.Id then return false end + + -- geometria ausiliaria foro principale + AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i') + if AuxId then AuxId = AuxId + Proc.Id end + if not AuxId or EgtGetType( AuxId ) ~= GDB_TY.CRV_ARC then return false end + -- geometria ausiliaria foro specchiato + local AuxIdMirror = EgtGetInfo( ProcMirror.Id, 'AUXID', 'i') + if AuxIdMirror then AuxIdMirror = AuxIdMirror + ProcMirror.Id end + if not AuxIdMirror or EgtGetType( AuxIdMirror ) ~= GDB_TY.CRV_ARC then return false end + -- dati del foro principale + local vtExtr = EgtCurveExtrusion( AuxId, GDB_RT.GLOB) + local ptBC = EgtGP( AuxId, GDB_RT.GLOB) + -- dati del foro specchiato + local vtExtrMirror = EgtCurveExtrusion( AuxIdMirror, GDB_RT.GLOB) + local ptBCMirror = EgtGP( AuxIdMirror, GDB_RT.GLOB) + + -- direzione fori + local nDouble + if AreOppositeVectorApprox( vtExtr, vtExtrMirror) then + -- fori lungo Y + -- per macchine tipo PF il foro principale è sul lato back, per macchine tipo PF1250 è sul lato front + if ( BD.TWO_EQUAL_HEADS and AreSameVectorApprox( vtExtr, Y_AX())) or + ( BD.DOWN_HEAD and AreOppositeVectorApprox( vtExtr, Y_AX())) then + nDouble = 2 + -- fori lungo Z + elseif BD.DOWN_HEAD and AreSameVectorApprox( vtExtr, Z_AX()) then + nDouble = 3 + else + return false + end + else + return false + end + + -- centri allineati, equidistanti dalla mezzeria trave, non troppo vicini + local vtDisplacement = ptBC - ptBCMirror + local ptCenRaw = b3Raw:getCenter() + if nDouble == 2 then + local dYMinDistance = max( Proc.Box:getMin():getY(), ProcMirror.Box:getMin():getY()) - min( Proc.Box:getMax():getY(), ProcMirror.Box:getMax():getY()) + if not ( abs( vtDisplacement:getX()) < 100 * GEO.EPS_SMALL and abs( vtDisplacement:getZ()) < 100 * GEO.EPS_SMALL and + ( abs( ptBC:getY() - ptCenRaw:getY()) - abs( ptBCMirror:getY() - ptCenRaw:getY())) < 100 * GEO.EPS_SMALL and + dYMinDistance > MIRROR_DRILLINGS_MIN_DISTANCE + 10 * GEO.EPS_SMALL) then + return false + end + else + local dZMinDistance = max( Proc.Box:getMin():getZ(), ProcMirror.Box:getMin():getZ()) - min( Proc.Box:getMax():getZ(), ProcMirror.Box:getMax():getZ()) + if not ( abs( vtDisplacement:getX()) < 100 * GEO.EPS_SMALL and abs( vtDisplacement:getY()) < 100 * GEO.EPS_SMALL and + ( abs( ptBC:getZ() - ptCenRaw:getZ()) - abs( ptBCMirror:getZ() - ptCenRaw:getZ())) < 100 * GEO.EPS_SMALL and + dZMinDistance > MIRROR_DRILLINGS_MIN_DISTANCE + 10 * GEO.EPS_SMALL) then + return false + end + end + + return true +end + ------------------------------------------------------------------------------------------------------------- function GetFeatureInfoAndDependency( vProc, b3Raw) -- ciclo tutte le feature for i = 1, #vProc do + local Proc = vProc[i] -- calcolo topologia della feature - if NeedTopologyFeature( vProc[i]) then - Topology.Classify( vProc[i], b3Raw) + if NeedTopologyFeature( Proc) then + Topology.Classify( Proc, b3Raw) -- se non richiesto, setto 'SPECIAL' else - vProc[i].Topology = 'SPECIAL' - vProc[i].TopologyLongName = vProc[i].Topology + Proc.Topology = 'SPECIAL' + Proc.TopologyLongName = Proc.Topology end - -- controllo la feature con tutte le altre per recuperare le dipendenze for j = 1, #vProc do local ProcB = vProc[j] -- verifico se feature tipo LapJoint è attraversata da almeno un foro - if ( vProc[i].Topology == 'Pocket' or vProc[i].Topology == 'Tunnel' or vProc[i].Topology == 'Groove' or Mortise.Identify( vProc[i])) and Drill.Identify( ProcB) and Overlaps( vProc[i].Box, ProcB.Box) then - vProc[i].PassedByHole = true + if ( Proc.Topology == 'Pocket' or Proc.Topology == 'Tunnel' or Proc.Topology == 'Groove' or Mortise.Identify( Proc)) and Drill.Identify( ProcB) and Overlaps( Proc.Box, ProcB.Box) then + Proc.PassedByHole = true + end + -- verifiche per specchiature + if BD.DOWN_HEAD or BD.TWO_EQUAL_HEADS then + -- forature + if BD.DOUBLE_HEAD_DRILLING and Drill.Identify( Proc) and Drill.Identify( ProcB) and not Proc.Mirror then + if AreDrillingsMirrored( Proc, ProcB, b3Raw) then + Proc.Mirror = ProcB + end + end end end end @@ -1923,6 +2000,9 @@ function BeamExec.ProcessFeatures() if BD.IMPROVE_HEAD_TAIL_DRILLINGS == nil then BD.IMPROVE_HEAD_TAIL_DRILLINGS = true end + -- costanti per doppio + MIRROR_DRILLINGS_MIN_DISTANCE = 40 + MIRROR_POCKETS_MIN_DISTANCE = 50 -- verifica se possibile rotazione di 90 gradi BD.ROT90 = BD.ROT90 and Verify90DegRotation( EgtGetFirstRawPart()) -- ciclo sui pezzi