diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index f514d09..85a8ac7 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -129,6 +129,192 @@ EgtMdbSave() ------------------------------------------------------------------------------------------------------------- -- *** Inserimento delle travi nel grezzo *** +------------------------------------------------------------------------------------------------------------- +local function IsHeadFeature( Proc, b3Raw, dCurrOvmH) + -- feature sempre di testa o coda per il gruppo + if Proc.Grp == 1 or Proc.Grp == 2 then + return ( Proc.Box:getCenter():getX() > b3Raw:getCenter():getX() - 0.5 * dCurrOvmH) + end + -- feature sempre di testa o coda nonostante il gruppo + if ( Proc.Grp == 3 or Proc.Grp == 4) and + ( Proc.Prc == 38 or Proc.Prc == 51 or Proc.Prc == 56 or Proc.Prc == 100 or Proc.Prc == 101 or Proc.Prc == 102 or Proc.Prc == 103 or Proc.Prc == 106) then + return ( Proc.Box:getCenter():getX() > b3Raw:getCenter():getX() - 0.5 * dCurrOvmH) + end + -- gestioni speciali + if LapJoint.Identify( Proc) then + return LapJoint.IsHeadFeature( Proc, b3Raw, dCurrOvmH) + end + if Drill.Identify( Proc) then + return Drill.IsHeadFeature( Proc, b3Raw, dCurrOvmH) + end + if RoundArch.Identify( Proc) then + return RoundArch.IsHeadFeature( Proc, b3Raw, dCurrOvmH) + end + if Dovetail.Identify( Proc) then + return Dovetail.IsHeadFeature( Proc, b3Raw, dCurrOvmH) + end + if FreeContour.Identify( Proc) then + return FreeContour.IsHeadFeature( Proc, b3Raw, dCurrOvmH) + end + -- non è di testa + return false +end + +------------------------------------------------------------------------------------------------------------- +local function IsTailFeature( Proc, b3Raw, dCurrOvmH, dCurrOvmT) + -- lunghezza di riferimento per spostare le feature di coda appena prima + local dAdvTailLen = BD.LEN_VERY_SHORT_PART or BD.LEN_SHORT_PART + -- feature sempre di testa o coda per il gruppo (se non troppo lunga) + if Proc.Grp == 1 or Proc.Grp == 2 then + -- se abilitato avanzamento lavorazione feature di coda e pezzo corto (quindi a caduta) e feature in coda + if BD.ADVANCE_TAIL_CUT and b3Raw:getDimX() < dAdvTailLen and Proc.Box:getCenter():getX() < b3Raw:getCenter():getX() - 0.5 * dCurrOvmH then + -- se taglio, lo avanzo + if Proc.Prc == 10 then + return false, true + end + end + -- standard + return ( Proc.Box:getCenter():getX() < b3Raw:getCenter():getX() - 0.5 * dCurrOvmH and Proc.Box:getDimX() < BD.MAX_LEN_HTFEA) + end + -- feature sempre di testa o coda nonostante il gruppo + if ( Proc.Grp == 3 or Proc.Grp == 4) and + ( Proc.Prc == 38 or Proc.Prc == 51 or Proc.Prc == 56 or Proc.Prc == 100 or Proc.Prc == 101 or Proc.Prc == 102 or Proc.Prc == 103 or Proc.Prc == 106) then + -- se abilitato avanzamento lavorazione feature di coda e pezzo corto (quindi a caduta) e feature in coda + if BD.ADVANCE_TAIL_CUT and b3Raw:getDimX() < dAdvTailLen and Proc.Box:getCenter():getX() < b3Raw:getCenter():getX() - 0.5 * dCurrOvmH then + -- se profilo front solo con smusso, lo avanzo + if Proc.Prc == 100 and ProfFront.OnlyChamfer( Proc) then + return false, true + end + -- se profilo concavo solo con smusso, lo avanzo + if Proc.Prc == 101 and ProfConcave.OnlyChamfer( Proc) then + return false, true + end + -- se profilo convesso solo con smusso, lo avanzo + if Proc.Prc == 102 and ProfConvex.OnlyChamfer( Proc) then + return false, true + end + -- se profilo caudato solo con smusso, lo avanzo + if Proc.Prc == 103 and ProfCamb.OnlyChamfer( Proc) then + return false, true + end + -- se profilo head solo con smusso, lo avanzo + if Proc.Prc == 106 and ProfHead.OnlyChamfer( Proc) then + return false, true + end + end + -- standard + return ( Proc.Box:getCenter():getX() < b3Raw:getCenter():getX() - 0.5 * dCurrOvmH) + end + -- gestioni speciali + if LapJoint.Identify( Proc) then + return LapJoint.IsTailFeature( Proc, b3Raw) + end + if Drill.Identify( Proc) then + return Drill.IsTailFeature( Proc, b3Raw, dCurrOvmT) + end + if DtMortise.Identify( Proc) then + return DtMortise.IsTailFeature( Proc, b3Raw) + end + if RoundArch.Identify( Proc) then + return RoundArch.IsTailFeature( Proc, b3Raw) + end + if Dovetail.Identify( Proc) then + return Dovetail.IsTailFeature( Proc, b3Raw) + end + if FreeContour.Identify( Proc) then + return FreeContour.IsTailFeature( Proc, b3Raw) + end + -- non è di coda + return false +end + +------------------------------------------------------------------------------------------------------------- +local function CollectFeatures( PartId, b3Raw, dCurrOvmH, dCurrOvmT) + -- recupero le feature + local vProc = {} + local LayerId = {} + LayerId[1] = BL.GetAddGroup( PartId) + LayerId[2] = EgtGetFirstNameInGroup( PartId or GDB_ID.NULL, 'Processings') + for nInd = 1, 2 do + local ProcId = EgtGetFirstInGroup( LayerId[nInd] or GDB_ID.NULL) + while ProcId do + local nEntType = EgtGetType( ProcId) + if nEntType == GDB_TY.SRF_MESH or nEntType == GDB_TY.EXT_TEXT or + nEntType == GDB_TY.CRV_LINE or nEntType == GDB_TY.CRV_ARC or nEntType == GDB_TY.CRV_BEZ or nEntType == GDB_TY.CRV_COMPO then + local nGrp = EgtGetInfo( ProcId, 'GRP', 'i') + local nPrc = EgtGetInfo( ProcId, 'PRC', 'i') + local nDo = EgtGetInfo( ProcId, 'DO', 'i') or 1 + local nCutId = EgtGetInfo( EgtGetParent( EgtGetParent( ProcId)), 'CUTID', 'i') or 0 + local nTaskId = EgtGetInfo( ProcId, 'TASKID', 'i') or 0 + if nGrp and nPrc and nDo == 1 then + local Proc = {} + Proc.Id = ProcId + Proc.Grp = nGrp + Proc.Prc = nPrc + Proc.Flg = 1 + Proc.Fct = EgtSurfTmFacetCount( ProcId) or 0 + Proc.Diam = 0 + Proc.Fcs = 0 + Proc.Fce = 0 + Proc.CutId = nCutId + Proc.TaskId = nTaskId + Proc.Box = EgtGetBBoxGlob( ProcId, GDB_BB.STANDARD) + if Proc.Box and not Proc.Box:isEmpty() then + Proc.Head = IsHeadFeature( Proc, b3Raw, dCurrOvmH) + Proc.Tail, Proc.AdvTail = IsTailFeature( Proc, b3Raw, dCurrOvmH, dCurrOvmT) + table.insert( vProc, Proc) + -- se foro + if Drill.Identify( Proc) then + -- assegno diametro e facce di ingresso e uscita (dati tabelle sempre per riferimento) + Proc.Diam, Proc.Fcs, Proc.Fce = Drill.GetData( Proc, b3Raw) + -- verifico se necessaria seconda lavorazione da parte opposta per foro più lungo della punta + if Drill.Split( Proc, b3Raw) then + -- aggiorno flags prima parte foro (dati tabelle sempre per riferimento) + Proc.Flg = 2 + Proc.Head = Drill.IsHeadFeature( Proc, b3Raw, dCurrOvmH) + Proc.Tail = Drill.IsTailFeature( Proc, b3Raw, dCurrOvmH, dCurrOvmT) + -- definisco dati seconda parte + local Proc2 = {} + Proc2.Id = ProcId + Proc2.Grp = nGrp + Proc2.Prc = nPrc + Proc2.Flg = -2 + Proc2.Box = BBox3d( Proc.Box) + Proc2.Fct = Proc.Fct + Proc2.Diam = Proc.Diam + Proc2.Head = Drill.IsHeadFeature( Proc2, b3Raw, dCurrOvmH) + Proc2.Tail = Drill.IsTailFeature( Proc2, b3Raw, dCurrOvmH) + Proc2.Fcs = Proc.Fce + Proc2.Fce = Proc.Fcs + Proc2.CutId = Proc.CutId + Proc2.TaskId = Proc.TaskId + table.insert( vProc, Proc2) + end + -- se BlockHaus HalfLap + elseif Proc.Prc == 37 then + local nFacInd = BL.GetFaceWithMostAdj( Proc.Id, PartId) + if nFacInd then + local vtN = EgtSurfTmFacetNormVersor( Proc.Id, nFacInd, GDB_ID.ROOT) + if vtN then + Proc.vtN = Vector3d( vtN) + end + end + end + else + Proc.Head = false + Proc.Tail = false + Proc.Flg = 0 + table.insert( vProc, Proc) + EgtOutLog( ' Feature ' .. tostring( Proc.Id) .. ' is empty (no geometry)') + end + end + end + ProcId = EgtGetNext( ProcId) + end + end + return vProc +end + ------------------------------------------------------------------------------------------------------------- local function AnalyzeHeadFeatures( b3Solid, vProc, dRawW, dRawH) local nReplacedFeatureId = nil @@ -376,105 +562,6 @@ local function Verify90DegRotation( nRawId) ( dRawH < BD.MAX_WIDTH2 + 10 * GEO.EPS_SMALL and dRawW < BD.MAX_HEIGHT2 + 10 * GEO.EPS_SMALL) end -------------------------------------------------------------------------------------------------------------- -local function IsHeadFeature( Proc, b3Raw, dCurrOvmH) - -- feature sempre di testa o coda per il gruppo - if Proc.Grp == 1 or Proc.Grp == 2 then - return ( Proc.Box:getCenter():getX() > b3Raw:getCenter():getX() - 0.5 * dCurrOvmH) - end - -- feature sempre di testa o coda nonostante il gruppo - if ( Proc.Grp == 3 or Proc.Grp == 4) and - ( Proc.Prc == 38 or Proc.Prc == 51 or Proc.Prc == 56 or Proc.Prc == 100 or Proc.Prc == 101 or Proc.Prc == 102 or Proc.Prc == 103 or Proc.Prc == 106) then - return ( Proc.Box:getCenter():getX() > b3Raw:getCenter():getX() - 0.5 * dCurrOvmH) - end - -- gestioni speciali - if LapJoint.Identify( Proc) then - return LapJoint.IsHeadFeature( Proc, b3Raw, dCurrOvmH) - end - if Drill.Identify( Proc) then - return Drill.IsHeadFeature( Proc, b3Raw, dCurrOvmH) - end - if RoundArch.Identify( Proc) then - return RoundArch.IsHeadFeature( Proc, b3Raw, dCurrOvmH) - end - if Dovetail.Identify( Proc) then - return Dovetail.IsHeadFeature( Proc, b3Raw, dCurrOvmH) - end - if FreeContour.Identify( Proc) then - return FreeContour.IsHeadFeature( Proc, b3Raw, dCurrOvmH) - end - -- non è di testa - return false -end - -------------------------------------------------------------------------------------------------------------- -local function IsTailFeature( Proc, b3Raw, dCurrOvmH, dCurrOvmT) - -- lunghezza di riferimento per spostare le feature di coda appena prima - local dAdvTailLen = BD.LEN_VERY_SHORT_PART or BD.LEN_SHORT_PART - -- feature sempre di testa o coda per il gruppo (se non troppo lunga) - if Proc.Grp == 1 or Proc.Grp == 2 then - -- se abilitato avanzamento lavorazione feature di coda e pezzo corto (quindi a caduta) e feature in coda - if BD.ADVANCE_TAIL_CUT and b3Raw:getDimX() < dAdvTailLen and Proc.Box:getCenter():getX() < b3Raw:getCenter():getX() - 0.5 * dCurrOvmH then - -- se taglio, lo avanzo - if Proc.Prc == 10 then - return false, true - end - end - -- standard - return ( Proc.Box:getCenter():getX() < b3Raw:getCenter():getX() - 0.5 * dCurrOvmH and Proc.Box:getDimX() < BD.MAX_LEN_HTFEA) - end - -- feature sempre di testa o coda nonostante il gruppo - if ( Proc.Grp == 3 or Proc.Grp == 4) and - ( Proc.Prc == 38 or Proc.Prc == 51 or Proc.Prc == 56 or Proc.Prc == 100 or Proc.Prc == 101 or Proc.Prc == 102 or Proc.Prc == 103 or Proc.Prc == 106) then - -- se abilitato avanzamento lavorazione feature di coda e pezzo corto (quindi a caduta) e feature in coda - if BD.ADVANCE_TAIL_CUT and b3Raw:getDimX() < dAdvTailLen and Proc.Box:getCenter():getX() < b3Raw:getCenter():getX() - 0.5 * dCurrOvmH then - -- se profilo front solo con smusso, lo avanzo - if Proc.Prc == 100 and ProfFront.OnlyChamfer( Proc) then - return false, true - end - -- se profilo concavo solo con smusso, lo avanzo - if Proc.Prc == 101 and ProfConcave.OnlyChamfer( Proc) then - return false, true - end - -- se profilo convesso solo con smusso, lo avanzo - if Proc.Prc == 102 and ProfConvex.OnlyChamfer( Proc) then - return false, true - end - -- se profilo caudato solo con smusso, lo avanzo - if Proc.Prc == 103 and ProfCamb.OnlyChamfer( Proc) then - return false, true - end - -- se profilo head solo con smusso, lo avanzo - if Proc.Prc == 106 and ProfHead.OnlyChamfer( Proc) then - return false, true - end - end - -- standard - return ( Proc.Box:getCenter():getX() < b3Raw:getCenter():getX() - 0.5 * dCurrOvmH) - end - -- gestioni speciali - if LapJoint.Identify( Proc) then - return LapJoint.IsTailFeature( Proc, b3Raw) - end - if Drill.Identify( Proc) then - return Drill.IsTailFeature( Proc, b3Raw, dCurrOvmT) - end - if DtMortise.Identify( Proc) then - return DtMortise.IsTailFeature( Proc, b3Raw) - end - if RoundArch.Identify( Proc) then - return RoundArch.IsTailFeature( Proc, b3Raw) - end - if Dovetail.Identify( Proc) then - return Dovetail.IsTailFeature( Proc, b3Raw) - end - if FreeContour.Identify( Proc) then - return FreeContour.IsTailFeature( Proc, b3Raw) - end - -- non è di coda - return false -end - ------------------------------------------------------------------------------------------------------------- local function PrintFeatures( vProc, b3Raw) EgtOutLog( ' RawBox=' .. tostring( b3Raw)) @@ -494,93 +581,6 @@ local function PrintFeatures( vProc, b3Raw) end end -------------------------------------------------------------------------------------------------------------- -local function CollectFeatures( PartId, b3Raw, dCurrOvmH, dCurrOvmT) - -- recupero le feature - local vProc = {} - local LayerId = {} - LayerId[1] = BL.GetAddGroup( PartId) - LayerId[2] = EgtGetFirstNameInGroup( PartId or GDB_ID.NULL, 'Processings') - for nInd = 1, 2 do - local ProcId = EgtGetFirstInGroup( LayerId[nInd] or GDB_ID.NULL) - while ProcId do - local nEntType = EgtGetType( ProcId) - if nEntType == GDB_TY.SRF_MESH or nEntType == GDB_TY.EXT_TEXT or - nEntType == GDB_TY.CRV_LINE or nEntType == GDB_TY.CRV_ARC or nEntType == GDB_TY.CRV_BEZ or nEntType == GDB_TY.CRV_COMPO then - local nGrp = EgtGetInfo( ProcId, 'GRP', 'i') - local nPrc = EgtGetInfo( ProcId, 'PRC', 'i') - local nDo = EgtGetInfo( ProcId, 'DO', 'i') or 1 - local nCutId = EgtGetInfo( EgtGetParent( EgtGetParent( ProcId)), 'CUTID', 'i') or 0 - local nTaskId = EgtGetInfo( ProcId, 'TASKID', 'i') or 0 - if nGrp and nPrc and nDo == 1 then - local Proc = {} - Proc.Id = ProcId - Proc.Grp = nGrp - Proc.Prc = nPrc - Proc.Flg = 1 - Proc.Fct = EgtSurfTmFacetCount( ProcId) or 0 - Proc.Diam = 0 - Proc.Fcs = 0 - Proc.Fce = 0 - Proc.CutId = nCutId - Proc.TaskId = nTaskId - Proc.Box = EgtGetBBoxGlob( ProcId, GDB_BB.STANDARD) - if Proc.Box and not Proc.Box:isEmpty() then - Proc.Head = IsHeadFeature( Proc, b3Raw, dCurrOvmH) - Proc.Tail, Proc.AdvTail = IsTailFeature( Proc, b3Raw, dCurrOvmH, dCurrOvmT) - table.insert( vProc, Proc) - -- se foro - if Drill.Identify( Proc) then - -- assegno diametro e facce di ingresso e uscita (dati tabelle sempre per riferimento) - Proc.Diam, Proc.Fcs, Proc.Fce = Drill.GetData( Proc, b3Raw) - -- verifico se necessaria seconda lavorazione da parte opposta per foro più lungo della punta - if Drill.Split( Proc, b3Raw) then - -- aggiorno flags prima parte foro (dati tabelle sempre per riferimento) - Proc.Flg = 2 - Proc.Head = Drill.IsHeadFeature( Proc, b3Raw, dCurrOvmH) - Proc.Tail = Drill.IsTailFeature( Proc, b3Raw, dCurrOvmH, dCurrOvmT) - -- definisco dati seconda parte - local Proc2 = {} - Proc2.Id = ProcId - Proc2.Grp = nGrp - Proc2.Prc = nPrc - Proc2.Flg = -2 - Proc2.Box = BBox3d( Proc.Box) - Proc2.Fct = Proc.Fct - Proc2.Diam = Proc.Diam - Proc2.Head = Drill.IsHeadFeature( Proc2, b3Raw, dCurrOvmH) - Proc2.Tail = Drill.IsTailFeature( Proc2, b3Raw, dCurrOvmH) - Proc2.Fcs = Proc.Fce - Proc2.Fce = Proc.Fcs - Proc2.CutId = Proc.CutId - Proc2.TaskId = Proc.TaskId - table.insert( vProc, Proc2) - end - -- se BlockHaus HalfLap - elseif Proc.Prc == 37 then - local nFacInd = BL.GetFaceWithMostAdj( Proc.Id, PartId) - if nFacInd then - local vtN = EgtSurfTmFacetNormVersor( Proc.Id, nFacInd, GDB_ID.ROOT) - if vtN then - Proc.vtN = Vector3d( vtN) - end - end - end - else - Proc.Head = false - Proc.Tail = false - Proc.Flg = 0 - table.insert( vProc, Proc) - EgtOutLog( ' Feature ' .. tostring( Proc.Id) .. ' is empty (no geometry)') - end - end - end - ProcId = EgtGetNext( ProcId) - end - end - return vProc -end - ------------------------------------------------------------------------------------------------------------- local function OrderFeatures( vProc, b3Raw)