diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index ca944a2..33b0994 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -40,6 +40,7 @@ -- 2022/12/23 Corrette rotazioni 90 deg per macchine con carico da destra. -- 2022/12/28 Implementata gestione forature e code di rondine in doppio. -- 2023/01/31 Implementata gestione mortase in doppio. +-- 2023/01/31 Nelle lavorazioni in doppio aggiunta la minima distanza tra le feature. -- Tabella per definizione modulo @@ -1379,14 +1380,15 @@ local function MoveDrillsOnTenon( vProc) end ------------------------------------------------------------------------------------------------------------- --- Controlla se la feature ProcMirror è la specchiata di Proc, per feature di tipo Mortise o DtMortise -local function CheckMirrorMortise( Proc, ProcMirror, b3Raw, AuxId) +-- Controlla se la feature ProcMirror è la specchiata di Proc, per feature di tipo tasca o simile +local function CheckMirrorPocket( Proc, ProcMirror, b3Raw, AuxId) -- recupero i dati geometrici della curva Proc local vtExtr = EgtCurveExtrusion( AuxId, GDB_RT.GLOB) local ptBC = EgtGP( AuxId, GDB_RT.GLOB) local rfDtMrt = EgtSurfTmFacetMinAreaRectangle( Proc.Id, 0, GDB_RT.GLOB) local b3DtMrt = EgtGetBBoxRef( Proc.Id, GDB_BB.STANDARD, rfDtMrt) + local b3Proc = EgtGetBBoxGlob( Proc.Id, GDB_BB.STANDARD) -- determino l'asse della curva Proc local vtAx = EgtEV( AuxId, GDB_RT.GLOB) - EgtSV( AuxId, GDB_RT.GLOB) @@ -1397,13 +1399,14 @@ local function CheckMirrorMortise( Proc, ProcMirror, b3Raw, AuxId) return false end -- se Mortise, se curva di contorno aperta la rendo chiusa - if Mortise.SideIdentify( Proc) then - BL.ConvertToClosedCurve( AuxIdMirror) + if Mortise.SideIdentify( ProcMirror) then + BL.ConvertToClosedCurve( ProcMirror, AuxIdMirror) end -- recupero i dati geometrici della curva ProcMirror local vtExtrMirror = EgtCurveExtrusion( AuxIdMirror, GDB_RT.GLOB) local ptBCMirror = EgtGP( AuxIdMirror, GDB_RT.GLOB) local b3DtMrtMirror = EgtGetBBoxRef( ProcMirror.Id, GDB_BB.STANDARD, rfDtMrt) + local b3ProcMirror = EgtGetBBoxGlob( ProcMirror.Id, GDB_BB.STANDARD) -- determino l'asse della curva ProcMirror local vtAxMirror = EgtEV( AuxIdMirror, GDB_RT.GLOB) - EgtSV( AuxIdMirror, GDB_RT.GLOB) @@ -1411,13 +1414,19 @@ local function CheckMirrorMortise( Proc, ProcMirror, b3Raw, AuxId) local bIsMirror = true local vtDisplacement = ptBC - ptBCMirror local ptCenRaw = b3Raw:getCenter() - -- controllo che il centro delle due mortase sia allineato e che queste siano equidistanti dalla mezzeria della trave + local dYMinDistance = EgtIf( ptBC:getY() > ptBCMirror:getY(), abs( b3ProcMirror:getMax():getY() - b3Proc:getMin():getY()), abs( b3Proc:getMax():getY() - b3ProcMirror:getMin():getY())) + local dZMinDistance = EgtIf( ptBC:getZ() > ptBCMirror:getZ(), abs( b3ProcMirror:getMax():getZ() - b3Proc:getMin():getZ()), abs( b3Proc:getMax():getZ() - b3ProcMirror:getMin():getZ())) + local dMinimumDistanceMirroredFeatures = 60 + -- controllo che il centro delle due mortase sia allineato, che queste siano equidistanti dalla mezzeria della trave + -- e che queste non siano troppo vicine if AreSameOrOppositeVectorApprox( vtExtr, Y_AX()) then bIsMirror = 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 + ( abs( ptBC:getY() - ptCenRaw:getY()) - abs( ptBCMirror:getY() - ptCenRaw:getY())) < 500 * GEO.EPS_SMALL and + dYMinDistance - dMinimumDistanceMirroredFeatures > 10 * GEO.EPS_SMALL elseif AreSameOrOppositeVectorApprox( vtExtr, Z_AX()) then bIsMirror = 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 + ( abs( ptBC:getZ() - ptCenRaw:getZ()) - abs( ptBCMirror:getZ() - ptCenRaw:getZ())) < 500 * GEO.EPS_SMALL and + dZMinDistance - dMinimumDistanceMirroredFeatures > 10 * GEO.EPS_SMALL end -- controllo che le dimensioni dei due box siano le stesse bIsMirror = bIsMirror and abs( b3DtMrt:getDimX() - b3DtMrtMirror:getDimX()) < 500 * GEO.EPS_SMALL and @@ -1445,7 +1454,7 @@ local function VerifyMortiseMirrored( Proc, vProc, b3Raw) -- recupero versore estrusione della curva supplementare local vtExtr = EgtCurveExtrusion( AuxId, GDB_ID.ROOT) -- Se curva di contorno aperta la converto in curva chiusa - BL.ConvertToClosedCurve( AuxId) + BL.ConvertToClosedCurve( Proc, AuxId) -- recupero i dati della faccia di fondo local frMor, dL, dW = EgtSurfTmFacetMinAreaRectangle( Proc.Id, 0, GDB_ID.ROOT) -- determino larghezza della mortasa @@ -1500,7 +1509,7 @@ local function VerifyMortiseMirrored( Proc, vProc, b3Raw) for i = 1, #vProc do local ProcMirror = vProc[i] if Mortise.SideIdentify( ProcMirror) and ProcMirror.Id ~= Proc.Id and ProcMirror.Flg ~= 0 then - if CheckMirrorMortise( Proc, ProcMirror, b3Raw, AuxId) then + if CheckMirrorPocket( Proc, ProcMirror, b3Raw, AuxId) then if ( not BD.DOWN_HEAD and AreSameVectorApprox( vtExtr, Y_AX())) or ( BD.DOWN_HEAD and AreOppositeVectorApprox( vtExtr, Y_AX())) then Proc.Double = 2 @@ -1569,7 +1578,7 @@ local function VerifyDtMortiseMirrored( Proc, vProc, b3Raw) for i = 1, #vProc do local ProcMirror = vProc[i] if DtMortise.SideIdentify( ProcMirror) and ProcMirror.Id ~= Proc.Id and ProcMirror.Flg ~= 0 then - if CheckMirrorMortise( Proc, ProcMirror, b3Raw, AuxId) then + if CheckMirrorPocket( Proc, ProcMirror, b3Raw, AuxId) then if ( not BD.DOWN_HEAD and AreSameVectorApprox( vtExtr, Y_AX())) or ( BD.DOWN_HEAD and AreOppositeVectorApprox( vtExtr, Y_AX())) then Proc.Double = 2 @@ -1632,10 +1641,13 @@ local function VerifyDrillMirrored( Proc, vProc, b3Raw) if not sDrilling or sType ~= 'Drill' or not EgtMdbSetCurrMachining( sDrilling) then return end + local dDrillingStep = EgtMdbGetCurrMachiningParam( MCH_MP.STEP) -- recupero il suo utensile if not EgtTdbSetCurrTool( EgtMdbGetCurrMachiningParam( MCH_MP.TOOL) or '') then return end + -- recupero la lunghezza della parte inclinata della punta + 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') if not sToolDoubleName or not EgtTdbSetCurrTool( sToolDoubleName) or not EgtTdbGetCurrToolParam( MCH_TP.ACTIVE) then @@ -1643,9 +1655,13 @@ local function VerifyDrillMirrored( Proc, vProc, b3Raw) end local dToolDoubleDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM, 'd') local dToolDoubleMaxDepth = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT) + -- recupero la lunghezza della parte inclinata della punta + local dToolDoubleTipLength = EgtTdbGetCurrToolParam( MCH_TP.TOTLEN) - EgtTdbGetCurrToolParam( MCH_TP.LEN) -- 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 then + 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 Proc.Flg == -2 then vtExtr = -vtExtr end if ( not BD.DOWN_HEAD and AreSameVectorApprox( vtExtr, Y_AX())) or diff --git a/LuaLibs/BeamLib.lua b/LuaLibs/BeamLib.lua index 480142d..865be86 100644 --- a/LuaLibs/BeamLib.lua +++ b/LuaLibs/BeamLib.lua @@ -1083,7 +1083,7 @@ function BeamLib.SetOpenSide( nPathInt, vtOrtho, b3Solid, nAddGrpId, nStartPoint end ------------------------------------------------------------------------------------------------------------- -function BeamLib.ConvertToClosedCurve( AuxId) +function BeamLib.ConvertToClosedCurve( Proc, AuxId) local bCurveModified = false if not EgtCurveIsClosed( AuxId) then local NewId, nCount = EgtExtractSurfTmFacetLoops( Proc.Id, 0, EgtGetParent( Proc.Id)) @@ -1092,6 +1092,7 @@ function BeamLib.ConvertToClosedCurve( AuxId) for i = 1, nCount - 1 do EgtErase( NewId + i) end + local vtExtr = EgtCurveExtrusion( AuxId, GDB_ID.ROOT) -- sostituisco il loop esterno alla curva originale EgtModifyCurveExtrusion( NewId, vtExtr, GDB_ID.ROOT) EgtRelocate( NewId, AuxId, GDB_IN.AFTER) diff --git a/LuaLibs/ProcessMortise.lua b/LuaLibs/ProcessMortise.lua index ad8c6c1..150871a 100644 --- a/LuaLibs/ProcessMortise.lua +++ b/LuaLibs/ProcessMortise.lua @@ -296,7 +296,7 @@ function ProcessMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH) -- recupero versore estrusione della curva supplementare local vtExtr = EgtCurveExtrusion( AuxId, GDB_ID.ROOT) -- se curva di contorno aperta la rendo chiusa - BL.ConvertToClosedCurve( AuxId) + BL.ConvertToClosedCurve( Proc, AuxId) -- verifico se frontale local bFront = ( Proc.Prc == 51) -- recupero i dati della faccia di fondo