diff --git a/LuaLibs/FeatureTopology.lua b/LuaLibs/FeatureTopology.lua index 03dbd55..4cc0573 100644 --- a/LuaLibs/FeatureTopology.lua +++ b/LuaLibs/FeatureTopology.lua @@ -3,6 +3,7 @@ -- 2023/09/26 Aggiunte topologie Strip e Cut. -- 2023/09/27 Modificata GetFacesParallelToPart per tunnel, pocket e groove 3 lati -- 2023/10/16 In GetFacesParallelToPart rimossa Pocket e aggiunto Rabbet al check solo direzione principale +-- 2023/11/03 In Classify ora si settano le AffectedFaces nella Proc, se non già presenti. -- Tabella per definizione modulo local FeatureTopology = {} @@ -163,6 +164,7 @@ end -- riconosce se Proc è una delle topologie standard e, in caso positivo, ne scrive le caratteristiche in campi specifici della Proc stessa restituendo true function FeatureTopology.Classify( Proc, b3Raw) + if not Proc.AffectedFaces then Proc.AffectedFaces = BL.GetProcessAffectedFaces( Proc) end if not Proc.Box or Proc.Box:isEmpty() then return false end @@ -199,9 +201,12 @@ function FeatureTopology.Classify( Proc, b3Raw) elseif Proc.Fct == 2 and bAllAnglesConcave and #vTriangularFaces == 1 then sFamily = 'Bevel' bIsThrough = false - elseif Proc.Fct == 2 and bAllAnglesConcave then + elseif Proc.Fct == 2 and bAllAnglesConcave and ( Proc.AffectedFaces.Left or Proc.AffectedFaces.Right) and ( Proc.AffectedFaces.Front or Proc.AffectedFaces.Back) then sFamily = 'Rabbet' bIsThrough = true + elseif Proc.Fct == 2 and bAllAnglesConcave then + sFamily = 'Groove' + bIsThrough = true elseif Proc.Fct == 2 and not bAllAnglesConcave and bIsAnyDimensionLongAsPart then sFamily = 'DoubleBevel' bIsThrough = true diff --git a/LuaLibs/ProcessLapJoint.lua b/LuaLibs/ProcessLapJoint.lua index b5ef338..678372a 100644 --- a/LuaLibs/ProcessLapJoint.lua +++ b/LuaLibs/ProcessLapJoint.lua @@ -81,6 +81,7 @@ -- 2023/10/03 In MakePocket aggiunto messaggio in caso si rovini il pezzo successivo. -- 2023/10/25 In LapJoint 2 facce longitudinali faccio di lama solo se taglio completamente. Altrimenti fresa. -- 2023/10/27 In Lapjoint 2 facce con angolo > 90 deg, se forzata fresa, si svuota la faccia principale e si lavora poi la faccia inclinata. +-- 2023/11/03 In MakeStaircaseStep aggiunta lavorazione smussi opzionale. -- Tabella per definizione modulo local ProcessLapJoint = {} @@ -153,6 +154,7 @@ local function AssignQIdent( Proc) Q_SIDE_ROUGH_TOOL = '' Q_ANTISPLINT_TYPE = '' Q_MAX_ELEVATION = 'Q10' + Q_STAIRCASE = '' if ( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 16 then Q_FORCE_BLADE = 'Q01' -- i @@ -166,7 +168,8 @@ local function AssignQIdent( Proc) Q_USE_MILL = 'Q02' -- i Q_USE_ROUGH_TOOL = 'Q03' -- i Q_SIDE_ROUGH_TOOL = 'Q04' -- i - Q_BORE_ON_CORNER = 'Q06' -- i + Q_BORE_ON_CORNER = 'Q06' -- i + Q_STAIRCASE = 'Q09' -- i elseif ( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 25 then Q_BORE_ON_CORNER = 'Q01' -- i elseif ( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 30 then @@ -5640,7 +5643,6 @@ local function MakeLongMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead) local nFct = EgtSurfTmFacetCount( vAddId[i]) local AddProc = { Id = vAddId[i], Grp = Proc.Grp, Prc = Proc.Prc, Box = b3Box, TotBox = Proc.Box, Fct = nFct, Flg = Proc.Flg, PartId = Proc.PartId} Topology.Classify( AddProc, b3Raw) - AddProc.AffectedFaces = BL.GetProcessAffectedFaces( AddProc) -- lasciare il false nel sesto parametro (perchè internamente viene verificato se diverso da nil) local bOk, sMyWarn bOk, sMyWarn, bPrevBhSideMill = MakeMoreFaces( AddProc, nPhase, nRawId, nPartId, dOvmHead, bAllWithEndCap, bPrevBhSideMill, bAllWithEndCap) @@ -5667,6 +5669,198 @@ local function TestTwoFacesDownHead( Proc) return bDownHead end +--------------------------------------------------------------------- +local function MakeStaircaseStep( Proc, nRawId, b3Raw, nPartId) + -- box della trave + local b3Solid = EgtGetBBoxGlob( EgtGetFirstNameInGroup( nPartId, 'Box') or GDB_ID.NULL, GDB_BB.STANDARD) + if not b3Solid then + local sErr = 'Error : part box not found' + EgtOutLog( sErr) + return false, sErr + end + -- angolo tra le facce + local _, _, _, dAng = EgtSurfTmFacetsContact( Proc.Id, 0, 1, GDB_ID.ROOT) + -- l'angolo tra le facce deve essere compreso tra 80 e 90.5 deg + if ( dAng > -89.5 + 10 * GEO.EPS_ANG_SMALL) or ( dAng < -100 - 10 * GEO.EPS_ANG_SMALL) then return false end + -- normali delle facce + local vtNRiser = EgtSurfTmFacetNormVersor( Proc.Id, 0, GDB_ID.ROOT) + local vtNTread = EgtSurfTmFacetNormVersor( Proc.Id, 1, GDB_ID.ROOT) + -- la faccia 0 è l'alzata (faccia più verticale), la 1 la pedata; se così non è le scambio + local nFacetRiser, nFacetTread = 0, 1 + if abs( vtNRiser:getZ()) > abs( vtNTread:getZ()) then + EgtSurfTmSwapFacets( Proc.Id, 0, 1) + vtNRiser, vtNTread = vtNTread, vtNRiser + end + -- riferimenti e dimensioni delle facce + local rfFacRiser, dHRiser, dVRiser = EgtSurfTmFacetMinAreaRectangle( Proc.Id, nFacetRiser, GDB_ID.ROOT) + local rfFacTread, dHTread, dVTread = EgtSurfTmFacetMinAreaRectangle( Proc.Id, nFacetTread, GDB_ID.ROOT) + + -- recupero la fresatura + -- verifico se fresatura da sopra + local bIsMillingUpward = ( vtNTread:getZ() >= BD.NZ_MINA) + -- fresatura + local sMilling = ML.FindMilling( 'BirdsMouth', nil, nil, nil, nil, bIsMillingUpward, not bIsMillingUpward) + if not sMilling then + local sErr = 'Error : BirdsMouth not found in library' + EgtOutLog( sErr) + return false, sErr + end + -- dati utensile + local dMillDiam = 50 + local dMillMaxMat = 0 + local dMillRotationSpeed = 0 + if EgtMdbSetCurrMachining( sMilling) then + local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) + if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then + dMillDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dMillDiam + dMillMaxMat = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT) or dMillMaxMat + dMillRotationSpeed = EgtMdbGetCurrMachiningParam( MCH_MP.SPEED) or dMillRotationSpeed + end + end + + -- recupero la lavorazione con lama + -- verifico se uso lama da sotto + local bCutDown = ( BD.DOWN_HEAD and rfFacTread:getVersZ():getZ() < - 0.5) + -- lavorazione con lama + local sCutting = ML.FindCutting( 'HeadSide', not bCutDown, bCutDown) + -- dati utensile + local dSawMaxDepth = 0 + local dSawDiam = 400 + local dSawRotationSpeed = 0 + local dSawThick = 5 + if sCutting then + if EgtMdbSetCurrMachining( sCutting) then + local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) + if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then + dSawMaxDepth = EgtTdbGetCurrToolMaxDepth() or dSawMaxDepth + dSawRotationSpeed = EgtTdbGetCurrToolParam( MCH_MP.SPEED) or dSawRotationSpeed + dSawThick = EgtTdbGetCurrToolParam( MCH_TP.THICK) or dSawThick + end + end + end + + -- calcolo riduzione profondità lama in caso di angolo inferiore a 90deg + local dCutExtraSaw = 0 + if dAng < -91 and dAng > -179 then + dCutExtraSaw = - dSawThick / tan( 180 + dAng) + end + + -- eventuali smussi + -- recupero gruppo per geometria addizionale + local nAddGrpId = BL.GetAddGroup( nPartId) + if not nAddGrpId then + local sErr = 'Error : missing AddGroup' + EgtOutLog( sErr) + return false, sErr + end + -- verifiche per smusso + local nChamfer, dDepthCham, sErrCham = EvaluateQParam( Proc) + -- lavorazione smussi + if nChamfer > 0 then + local _, _, _, vtOrtho, _, nSurfInt = BL.GetTunnelDimension( Proc, nPartId) + local nOk, sErr = MakeChamfer( Proc, true, nAddGrpId, vtOrtho, b3Solid, nSurfInt, dDepthCham) + if nOk < 0 then return false, sErr end + end + + -- fresatura della pedata per fare spazio alla lama + local dMillingDepth = dVTread - dSawMaxDepth + 10 + -- divido in passate orizzontali + local nMillHorizontalSteps = ceil( ( dMillingDepth - 100 * GEO.EPS_SMALL) / ( dMillDiam * 0.6)) + local dMillHorizontalStep = 0 + if nMillHorizontalSteps > 1 then + dMillHorizontalStep = ( dMillingDepth - dMillDiam * 0.6) / ( nMillHorizontalSteps - 1) + end + for i = nMillHorizontalSteps, 1, -1 do + -- inserisco la lavorazione + local sName = 'Mill_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) + local nMchFId = EgtAddMachining( sName, sMilling) + if not nMchFId then + local sErr = 'Error adding machining ' .. sName .. '-' .. sMilling + EgtOutLog( sErr) + return false, sErr + end + -- aggiungo geometria + EgtSetMachiningGeometry( {{ Proc.Id, nFacetTread}}) + -- imposto uso faccia + local nFaceUse = BL.GetNearestOrthoOpposite( vtNTread) + EgtSetMachiningParam( MCH_MP.FACEUSE, nFaceUse) + -- imposto lato di lavoro e eventuale inversione + local bInvert = dMillRotationSpeed < 0 + local nWorkSide = MCH_MILL_WS.LEFT + if bInvert then + nWorkSide = MCH_MILL_WS.RIGHT + end + EgtSetMachiningParam( MCH_MP.WORKSIDE, nWorkSide) + EgtSetMachiningParam( MCH_MP.INVERT, bInvert) + -- imposto posizione braccio porta testa + if vtNTread:getY() < GEO.EPS_SMALL then + EgtSetMachiningParam( MCH_MP.SCC, MCH_SCC.ADIR_YM) + else + EgtSetMachiningParam( MCH_MP.SCC, MCH_SCC.ADIR_YP) + end + -- imposto attacchi e allungamenti + if nFacetTread then + EgtSetMachiningParam( MCH_MP.STARTADDLEN, dMillDiam/2 + 10) + EgtSetMachiningParam( MCH_MP.ENDADDLEN, dMillDiam/2 + 10) + EgtSetMachiningParam( MCH_MP.LEADINTYPE, MCH_MILL_LI.LINEAR) + EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, MCH_MILL_LI.LINEAR) + EgtSetMachiningParam( MCH_MP.LITANG, 0) + EgtSetMachiningParam( MCH_MP.LOTANG, 0) + EgtSetMachiningParam( MCH_MP.LIPERP, 0) + EgtSetMachiningParam( MCH_MP.LOPERP, 0) + end + -- imposto eventuale offset + EgtSetMachiningParam( MCH_MP.OFFSR, dVTread - dMillingDepth + ( i - 1) * dMillHorizontalStep) + -- se step verticale non presente, lo setto + local dMillVerticalStep = EgtGetMachiningParam( MCH_MP.STEP, 'd') + if not dMillVerticalStep or dMillVerticalStep <= 10 * GEO.EPS_SMALL then + dMillVerticalStep = 0.25 * dMillDiam + end + EgtSetMachiningParam( MCH_MP.STEP, dMillVerticalStep) + -- dichiaro non si generano sfridi per VMill + EgtSetMachiningParam( MCH_MP.USERNOTES, 'VMRS=0;') + -- eseguo + if not ML.ApplyMachining( true, false) then + local _, sErr = EgtGetLastMachMgrError() + EgtSetOperationMode( nMchFId, false) + return false, sErr + end + -- eventuale segnalazione ingombro di testa o coda + UpdateEncumbrance( Proc, nRawId, b3Raw, b3Solid) + end + + -- taglio di lama della pedata + -- calcolo faceuse + local nFaceUseTread = EgtIf( vtNRiser * Z_AX() > -GEO.EPS_SMALL, MCH_MILL_FU.ORTHO_DOWN, MCH_MILL_FU.ORTHO_TOP) + -- lavorazioni della faccia + for i = 2, 1, -1 do + local dCutRadialOffsetTread = - dSawMaxDepth / 2 * ( i - 1) + -- componente limite del vettore Z per lama downUp; impostata a -2 per non farla mai rientrare in quel caso + local dVzLimDwnUp = -2 + local bOkSawTread, sErr = Fbs.MakeOne( Proc.Id, nFacetTread, sCutting, dSawDiam, nFaceUseTread, dVzLimDwnUp, dCutRadialOffsetTread + dCutExtraSaw, 0, 0, 0, 0, nil, b3Raw) + if not bOkSawTread then return false, sErr end + end + + -- taglio di lama dell'alzata + -- calcolo faceuse + local nFaceUseRiser = EgtIf( vtNRiser * Z_AX() > -GEO.EPS_SMALL, MCH_MILL_FU.ORTHO_DOWN, MCH_MILL_FU.ORTHO_TOP) + -- divido in passate orizzontali + local nSawStepsRiser = ceil( ( dVRiser - 100 * GEO.EPS_SMALL) / ( dSawMaxDepth * 0.6)) + local dSawStepRiser = 0 + if nSawStepsRiser > 1 then + dSawStepRiser = ( dVRiser - ( dSawMaxDepth * 0.6)) / ( nSawStepsRiser - 1) + end + -- lavorazioni della faccia + for i = nSawStepsRiser, 1, -1 do + local dCutRadialOffsetRiser = - dSawStepRiser * ( i - 1) + -- componente limite del vettore Z per lama downUp; impostata a -2 per non farla mai rientrare in quel caso + local dVzLimDwnUp = -2 + local bOkSawRiser, sErr = Fbs.MakeOne( Proc.Id, nFacetRiser, sCutting, dSawDiam, nFaceUseRiser, dVzLimDwnUp, dCutRadialOffsetRiser + dCutExtraSaw, 0, 0, 0, 0, nil, b3Raw) + if not bOkSawRiser then return false, sErr end + end + +end + --------------------------------------------------------------------- -- Applicazione della lavorazione --------------------------------------------------------------------- @@ -5830,6 +6024,10 @@ function ProcessLapJoint.Make( Proc, nPhase, nRawId, nPartId, dOvmHead) end -- due facce elseif Proc.Fct == 2 then + -- se V passante e attiva Q per lavorazione speciale scala + if EgtGetInfo( Proc.Id, Q_STAIRCASE, 'i') == 1 and Proc.Topology == 'Groove' and Proc.IsThrough == true then + return MakeStaircaseStep( Proc, nRawId, b3Raw, nPartId) + end -- se praticamente è lunga come la trave e sono due facce lunghe local b3Fac1 = EgtSurfTmGetFacetBBoxGlob( Proc.Id, 0, GDB_BB.STANDARD) local b3Fac2 = EgtSurfTmGetFacetBBoxGlob( Proc.Id, 1, GDB_BB.STANDARD)