diff --git a/LuaLibs/WProcessDrill.lua b/LuaLibs/WProcessDrill.lua index 6865dc9..690f664 100644 --- a/LuaLibs/WProcessDrill.lua +++ b/LuaLibs/WProcessDrill.lua @@ -55,7 +55,7 @@ end --------------------------------------------------------------------- -- Classificazione della feature -function WPD.Classify( Proc, b3Raw) +function WPD.Classify( Proc, b3Raw) -- recupero e verifico l'entità foro local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i') or 0 @@ -156,6 +156,41 @@ function WPD.RotateClassify( Proc) end end +--------------------------------------------------------------------- +local function IsToolDoubleOk( sToolMasterName, sToolDoubleName) + local bIsToolDoubleOk = false + -- dimensioni utensile master + EgtTdbSetCurrTool( sToolMasterName) + local dTMaxMat = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT) + local dTDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) + -- dimensioni utensile double + EgtTdbSetCurrTool( sToolDoubleName) + local dTMaxMatDouble = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT) + local dTDiamDouble = EgtTdbGetCurrToolParam( MCH_TP.DIAM) + -- controllo che siano uguali + bIsToolDoubleOk = ( dTMaxMatDouble > dTMaxMat - 100 * GEO.EPS_SMALL) and + ( abs( dTDiam - dTDiamDouble) < 100 * GEO.EPS_SMALL) and + EgtTdbGetCurrToolParam( MCH_TP.ACTIVE) + return bIsToolDoubleOk +end + +--------------------------------------------------------------------- +local function IsMachiningOkForDouble( sMachining) + local bDoubleOk = false + if sMachining and EgtMdbSetCurrMachining( sMachining) then + -- recupero l'utensile della lavorazione + local sToolMasterName = EgtMdbGetCurrMachiningParam( MCH_MP.TOOL) + if EgtTdbSetCurrTool( sToolMasterName or '') then + -- cerco eventuale utensile in doppio + local sToolDoubleName = EgtTdbGetCurrToolValInNotes( MCH_TP.USERNOTES, 'DOUBLE', 's') + if sToolDoubleName and EgtTdbSetCurrTool( sToolDoubleName) then + bDoubleOk = IsToolDoubleOk( sToolMasterName, sToolDoubleName) + end + end + end + return bDoubleOk +end + --------------------------------------------------------------------- local function IsHorizLongDrill( Proc) -- recupero e verifico l'entità foro @@ -263,10 +298,21 @@ function WPD.Make( Proc, nRawId, b3Raw) end end end + local bUseDLenToFindDrilling = true local sDrilling, nType = WM.FindDrilling( dDiam, dLen, sHead) if not sDrilling then + bUseDLenToFindDrilling = false sDrilling, nType = WM.FindDrilling( dDiam, nil, sHead) end + -- se Proc è settata per essere specchiata cerco la lavorazione adatta e verifico possa essere effettivamente specchiata + if Proc.Double and Proc.Double == 2 then + local sDrillingBackup = sDrilling + sDrilling = WM.FindDrilling( dDiam, EgtIf( bUseDLenToFindDrilling, dLen, nil), 'H1') + if not IsMachiningOkForDouble( sDrilling) then + Proc.Double = 0 + sDrilling = sDrillingBackup + end + end if sHead and not sDrilling then sDrilling, nType = WM.FindDrilling( dDiam, dLen) if not sDrilling then @@ -447,21 +493,26 @@ function WPD.Make( Proc, nRawId, b3Raw) end end EgtSetMachiningParam( MCH_MP.DEPTH, dDepth) - -- Note utente - local sUserNotes = '' + -- leggo eventuali note esistenti della lavorazione + local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) -- se foratura o svuotatura, dichiarazione nessuna generazione sfridi per Vmill if nType == 'Drill' or nType == 'Pocket' then - sUserNotes = 'VMRS=0;' + sUserNotes = EgtSetValInNotes( sUserNotes, 'VMRS', 0) end -- se foratura if nType == 'Drill' then -- aggiungo alle note massima elevazione (coincide con affondamento) - sUserNotes = sUserNotes .. 'MaxElev=' .. EgtNumToString( dDepth, 1) .. ';' + sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dDepth, 1)) -- se foro passante, aggiungo questa qualifica alle note if bOpen then - sUserNotes = sUserNotes .. 'Open=1;' + sUserNotes = EgtSetValInNotes( sUserNotes, 'Open', 1) end end + -- se lavorazione in doppio aggiungo le rispettive note + if Proc.Double and Proc.Double == 2 then + sUserNotes = EgtSetValInNotes( sUserNotes, 'DOUBLE', Proc.Double) + sUserNotes = EgtSetValInNotes( sUserNotes, 'MirrorAx', Proc.MirrorAx) + end EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes) -- eseguo if not EgtApplyMachining( true, false) then diff --git a/LuaLibs/WProcessLapJoint.lua b/LuaLibs/WProcessLapJoint.lua index 90e69ce..b04d9ce 100644 --- a/LuaLibs/WProcessLapJoint.lua +++ b/LuaLibs/WProcessLapJoint.lua @@ -758,8 +758,8 @@ local function IsToolDoubleOk( sToolMasterName, sToolDoubleName) 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 - ( abs( dTMaxMat - dTMaxMatDouble) < 100 * GEO.EPS_SMALL) and - ( abs( dTMaxDepth - dTMaxDepthDouble) < 100 * GEO.EPS_SMALL) and + ( dTMaxMatDouble > dTMaxMat - 100 * GEO.EPS_SMALL) and + ( dTMaxDepthDouble > dTMaxDepth - 100 * GEO.EPS_SMALL) and ( abs( dTDiam - dTDiamDouble) < 100 * GEO.EPS_SMALL) and ( abs( dTDiamTh - dTDiamThDouble) < 100 * GEO.EPS_SMALL) and ( bTipFeed == bTipFeedDouble) and diff --git a/LuaLibs/WallExec.lua b/LuaLibs/WallExec.lua index 47b90be..e0e56e9 100644 --- a/LuaLibs/WallExec.lua +++ b/LuaLibs/WallExec.lua @@ -192,7 +192,7 @@ function WallExec.CollectFeatures( PartId, b3Raw) Proc.TaskId = nTaskId Proc.Box = EgtGetBBoxGlob( ProcId, GDB_BB.STANDARD) Proc.IsOutline = ( Proc.Prc == 251 or Proc.Prc == 252) - + -- recupero l'elenco delle facce della parte interessate dalla feature Proc.AffectedFaces = WL.GetProcessAffectedFaces( Proc) @@ -201,7 +201,7 @@ function WallExec.CollectFeatures( PartId, b3Raw) for i = 1, Proc.Fct do Proc.Face[i] = { Id = i - 1, VtN = EgtSurfTmFacetNormVersor( Proc.Id, i - 1, GDB_ID.ROOT ), Elevation = WL.GetFaceElevation( Proc.Id, i - 1, PartId)} end - + if Proc.Box and not Proc.Box:isEmpty() then table.insert( vProc, Proc) -- se foro @@ -643,16 +643,19 @@ end ------------------------------------------------------------------------------------------------------------- -- Controlla in vProc la presenza di feature da lavorare in doppio e, se trovate, ne setta i parametri local function SetMirroredFeatures( vProc, b3Raw) + local dMinimumDistanceMirroredFeatures = 780 + local vGroovesThrough = {} + local vDrillings = {} for i = 1, #vProc do local Proc = vProc[i] if Proc.Flg ~= 0 then -- AGGIUNGERE DIPENDENZA DA COSTANTE WALLDATA!! - + -- tutte le rabbet, tunnel e groove, tranne le groove passanti che guardano Z+, vengono confrontati con possibili feature mirror if Proc.TopologyLongName == 'Rabbet-Through-RightAngles-Parallel-2'or Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-3' or Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-4' or Proc.TopologyLongName == 'Tunnel-Blind-RightAngles-Parallel-5' or - ( Proc.TopologyLongName == 'Groove-Through-RightAngles-Parallel-3' and Proc.AffectedFaces.Front) then + ( Proc.TopologyLongName == 'Groove-Through-RightAngles-Parallel-3' and Proc.AffectedFaces.Front and Proc.AffectedFaces.Left and Proc.AffectedFaces.Right) then -- feature rivolta verso Y- e parallela a X local bIsFeatureFacingFrontSide = Proc.AffectedFaces.Front -- feature vicino al bordo Y- del grezzo @@ -663,7 +666,7 @@ local function SetMirroredFeatures( vProc, b3Raw) nFaceLookingFrontSide = j - 1 end end - local dMaxDist = 300 + local dMaxDist = 100 if nFaceLookingFrontSide then local ptFaceCenter = EgtSurfTmFacetCenter( Proc.Id, nFaceLookingFrontSide, GDB_ID.ROOT) local dSideDist = abs( ptFaceCenter:getY() - b3Raw:getMin():getY()) @@ -678,7 +681,7 @@ local function SetMirroredFeatures( vProc, b3Raw) 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 = ProcMirror.AffectedFaces.Back + 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 bIsMirrorFeatureOnEdge = false local nMirrorFaceLookingBackSide @@ -703,8 +706,11 @@ local function SetMirroredFeatures( vProc, b3Raw) local bIsMirrorBoxXAligned = abs( Proc.Box:getCenter():getX() - ProcMirror.Box:getCenter():getX()) < 500 * GEO.EPS_SMALL -- 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 bIsMirrorFeatureOnEdge and bIsMirrorFeatureSameDimension and bIsMirrorBoxXAligned and bIsNotMirrorBoxOverlapping then + if bIsMirrorFeatureFacingBackSide and bIsMirrorFeatureOnEdge and bIsMirrorFeatureSameDimension and bIsMirrorBoxXAligned and bIsNotMirrorBoxOverlapping and bIsMirrorFeatureDistanceOk then nMirrorId = ProcMirror.Id local b3Tab = EgtGetTableArea() local ptOnMirrorAx = ( Proc.Box:getCenter() + ProcMirror.Box:getCenter()) / 2 @@ -729,10 +735,145 @@ local function SetMirroredFeatures( vProc, b3Raw) Proc.Stype = 2 end end - + -- le groove passanti, parallele a X e rivolte verso Z+ vanno raccolte, ordinate e accoppiate a 2 a 2 per il doppio + elseif Proc.TopologyLongName == 'Groove-Through-RightAngles-Parallel-3' and Proc.AffectedFaces.Top and Proc.AffectedFaces.Left and Proc.AffectedFaces.Right 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 + elseif Proc.TopologyLongName == 'DRILLING' then + -- recupero e verifico l'entità foro + local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i') or 0 + if AuxId then AuxId = AuxId + Proc.Id end + if not AuxId or EgtGetType( AuxId) ~= GDB_TY.CRV_ARC then + return false + end + -- recupero il vettore del foro + local vtExtr = EgtCurveExtrusion( AuxId, GDB_RT.GLOB) + if Proc.AffectedFaces.Top and AreSameOrOppositeVectorApprox( vtExtr, Z_AX()) then + table.insert( vDrillings, Proc) + end end end end + + -- ordino le groove passanti rivolte verso Z+ in base alla Y crescente + table.sort( vGroovesThrough, function( a, b) return b.Box:getCenter():getY() > a.Box:getCenter():getY() end) + + -- funzione per l'ordinamento dei fori + local function SortDrillingsForMirror( Proc1, Proc2) + local Proc1X = Proc1.Box:getCenter():getX() + local Proc1Y = Proc1.Box:getCenter():getY() + local Proc2X = Proc2.Box:getCenter():getX() + local Proc2Y = Proc2.Box:getCenter():getY() + if Proc1X < Proc2X - 10 * GEO.EPS_SMALL then + return true + elseif abs( Proc1X - Proc2X) < 10 * GEO.EPS_SMALL then + if Proc1Y < Proc2Y - 10 * GEO.EPS_SMALL then + return true + end + end + end + -- ordino le forature aperte verso Z+ in base alla X e poi alla Y crescente + table.sort( vDrillings, SortDrillingsForMirror) + + -- accoppio le groove passanti rivolte verso Z+ + local nCurrentGroove = 1 + while nCurrentGroove <= #vGroovesThrough do + local Proc = vGroovesThrough[nCurrentGroove] + if Proc.Flg ~= 0 then + local b3Proc = EgtGetBBoxGlob( Proc.Id, GDB_BB.STANDARD) + local j = nCurrentGroove + 1 + while j <= #vGroovesThrough do + local ProcMirror = vGroovesThrough[j] + local b3ProcMirror = EgtGetBBoxGlob( ProcMirror.Id, GDB_BB.STANDARD) + -- feature non disattivata e diversa dala i-esima + local bIsMirrorIdOk = ( Proc.Id ~= ProcMirror.Id and ProcMirror.Flg ~= 0) + -- box delle stesse dimensioni + local bIsMirrorFeatureSameDimension = false + bIsMirrorFeatureSameDimension = abs( b3Proc:getDimX() - b3ProcMirror:getDimX()) < 500 * GEO.EPS_SMALL and + abs( b3Proc:getDimY() - b3ProcMirror:getDimY()) < 500 * GEO.EPS_SMALL and + abs( b3Proc:getDimZ() - b3ProcMirror:getDimZ()) < 500 * GEO.EPS_SMALL + -- box allineati in X + local bIsMirrorBoxXAligned = abs( Proc.Box:getCenter():getX() - ProcMirror.Box:getCenter():getX()) < 500 * GEO.EPS_SMALL + -- 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 bIsMirrorIdOk 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() + -- 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 + -- rimuovo dalla lista le groove già assegnate + local ProcMirrorOldId = ProcMirror.Id + table.remove( vGroovesThrough, nCurrentGroove) + if j > #vGroovesThrough or ( vGroovesThrough[j].Id ~= ProcMirrorOldId) then j = j - 1 end + table.remove( vGroovesThrough, j) + nCurrentGroove = 0 + break + end + j = j + 1 + end + end + nCurrentGroove = nCurrentGroove + 1 + end + + -- accoppio le forature + local nCurrentDrilling = 1 + while nCurrentDrilling <= #vDrillings do + local Proc = vDrillings[nCurrentDrilling] + if Proc.Flg ~= 0 then + local j = nCurrentDrilling + 1 + local b3Proc = EgtGetBBoxGlob( Proc.Id, GDB_BB.STANDARD) + while j <= #vDrillings do + local ProcMirror = vDrillings[j] + local b3ProcMirror = EgtGetBBoxGlob( ProcMirror.Id, GDB_BB.STANDARD) + -- feature non disattivata e diversa dala i-esima + local bIsMirrorIdOk = ( Proc.Id ~= ProcMirror.Id and ProcMirror.Flg ~= 0) + -- box delle stesse dimensioni + local bIsMirrorFeatureSameDimension = false + bIsMirrorFeatureSameDimension = abs( b3Proc:getDimX() - b3ProcMirror:getDimX()) < 500 * GEO.EPS_SMALL and + abs( b3Proc:getDimY() - b3ProcMirror:getDimY()) < 500 * GEO.EPS_SMALL and + abs( b3Proc:getDimZ() - b3ProcMirror:getDimZ()) < 500 * GEO.EPS_SMALL + -- box allineati in X + local bIsMirrorBoxXAligned = abs( Proc.Box:getCenter():getX() - ProcMirror.Box:getCenter():getX()) < 10 * GEO.EPS_SMALL + -- 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 bIsMirrorIdOk 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() + -- 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 + -- rimuovo dalla lista le groove già assegnate + local ProcMirrorOldId = ProcMirror.Id + table.remove( vDrillings, nCurrentDrilling) + if j > #vDrillings or ( vDrillings[j].Id ~= ProcMirrorOldId) then j = j - 1 end + table.remove( vDrillings, j) + nCurrentDrilling = 0 + break + end + j = j + 1 + end + end + nCurrentDrilling = nCurrentDrilling + 1 + end end ------------------------------------------------------------------------------------------------------------- @@ -820,7 +961,7 @@ function WallExec.ProcessFeatures() while nOperId do EgtSetCurrMachining( nOperId) local nOperationProcIds = EgtGetMachiningGeometry() - local nOperationProcId = nOperationProcIds[1] + local nOperationProcId = nOperationProcIds[1][1] local nCurrentOperId = nOperId for i = 1, #vProcToDisable do local ProcId = vProcToDisable[i]