diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index ab49133..ec1df78 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -521,7 +521,8 @@ local function ClassifyFeatures( vProc, b3Raw, Stats) -- se mezzo-legno di testa elseif RidgeLap.Identify( Proc) then bOk, bDown = RidgeLap.Classify( Proc) - -- se mezzo-legno, fessura, fessura frontale, notch, tasca, tacca, taglio a triangolo + -- se fessura, fessura frontale, tacca, tacca cantonale, mezzo-legno, scanalatura-battuta, + -- mezzolegno tipo chalet-tavoa di chiusura, rivestimento, mezzolegno chalet, tasca, taglio a triangolo elseif LapJoint.Identify( Proc) then bOk, bDown = LapJoint.Classify( Proc) -- se foratura diff --git a/LuaLibs/ProcessDtMortise.lua b/LuaLibs/ProcessDtMortise.lua index 94fb553..390ae2c 100644 --- a/LuaLibs/ProcessDtMortise.lua +++ b/LuaLibs/ProcessDtMortise.lua @@ -1,4 +1,4 @@ --- ProcessDtMortise.lua by Egaltech s.r.l. 2020/03/31 +-- ProcessDtMortise.lua by Egaltech s.r.l. 2020/04/11 -- Gestione calcolo mortase a coda di rondice per Travi -- Tabella per definizione modulo @@ -49,59 +49,48 @@ function ProcessDtMortise.Classify( Proc) end --------------------------------------------------------------------- -local function ExtractTopPath( nProcId, vtOrtho, nAddGrpId, rfFac0, dZedTop) - - -- estraggo percorso di contorno - local nAuxTop, nNumTop = EgtExtractSurfTmLoops( nProcId, nAddGrpId) - if nNumTop ~= 1 then - -- elimino i percorsi creati - for i = 1, nNumTop do - EgtErase( nAuxTop + i - 1) +local function CalcTopPath( nProcId, AuxId, nAddGrpId, dAltMort, dSideAng, b3Solid) + -- copio la curva di base + local NewAuxId = EgtCopyGlob( AuxId, nAddGrpId) + if not NewAuxId then return end + -- ne allungo gli estremi + EgtExtendCurveStartByLen( NewAuxId, 100) + EgtExtendCurveEndByLen( NewAuxId, 100) + -- eseguo traslazione e offset per portarla sul top + local vtMove = EgtCurveExtrusion( AuxId, GDB_RT.GLOB) * ( dAltMort - 10 * GEO.EPS_SMALL) + EgtMove( NewAuxId, vtMove, GDB_RT.GLOB) + local dOffset = dAltMort * tan( dSideAng) + if not EgtOffsetCurve( NewAuxId, dOffset) then return end + -- la limito entro la trave + local refBox = Frame3d( b3Solid:getMin()) + local vtBoxDiag = b3Solid:getMax() - b3Solid:getMin() + local nCount + NewAuxId, nCount = EgtTrimFlatCurveWithBox( NewAuxId, refBox, vtBoxDiag, true, true, GDB_RT.GLOB) + -- se divisa in più parti, le unisco congiungendole con segmenti + if nCount > 1 then + if EgtGetType( NewAuxId) ~= GDB_TY.CRV_COMPO then + NewAuxId = EgtCurveCompo( nAddGrpId, NewAuxId) end - return nil, 0 - else - -- fondo tra loro le curve compatibili - EgtMergeCurvesInCurveCompo( nAuxTop) - -- esplodo il percorso in modo da avere entità separate per poterle controllare - local nStartId, nCount = EgtExplodeCurveCompo( nAuxTop) - if nStartId then - -- tabella con identificativi delle curve - tEnt = EgtTableFill( nStartId, nCount) - -- elimino le curve che non stanno al bordo superiore - for i = nCount, 1, -1 do - local ptP1 = EgtSP( tEnt[i], GDB_RT.GLOB) - local ptP2 = EgtEP( tEnt[i], GDB_RT.GLOB) - ptP1:toLoc( rfFac0) - ptP2:toLoc( rfFac0) - -- se ha variazioni in Z o non è alla giusta Z, cancello l'entità - if ( abs( ptP1:getZ() - ptP2:getZ()) > 10 * GEO.EPS_SMALL) or - ( abs( ptP1:getZ() - dZedTop) > 10 * GEO.EPS_SMALL) then - EgtErase( tEnt[i]) - table.remove( tEnt, i) - end - end - -- ricreo il percorso - local ptStart = EgtSP( tEnt[1]) - local nFirstId, nCnt = EgtCurveCompoByReorder( nAddGrpId, tEnt, ptStart, true) - if not nFirstId then return nil, 0 end - -- deve rimanere un solo percorso - if nCnt > 1 then - for nId = nFirstId, nFirstId + nCnt - 1 do - EgtErase( nFirstId) - end - return nil, 0 - end - -- modifico estrusione percorso - EgtModifyCurveExtrusion( nFirstId, vtOrtho, GDB_RT.GLOB) - return nFirstId, 1 + for i = 2, nCount do + local CrvId = NewAuxId + i - 1 + local ptStart = EgtSP( CrvId, GDB_ID.ROOT) + EgtAddCurveCompoLine( NewAuxId, ptStart, GDB_RT.GLOB) + EgtAddCurveCompoCurve( NewAuxId, CrvId) end end - return nil, 0 + return NewAuxId end --------------------------------------------------------------------- -- Applicazione della lavorazione function ProcessDtMortise.Make( Proc, nPhase, nRawId, nPartId) + -- ingombro del pezzo + local b3Solid = EgtGetBBoxGlob( EgtGetFirstNameInGroup( nPartId, 'Box') or GDB_ID.NULL, GDB_BB.STANDARD) + if not b3Solid then + local sErr = 'Error on process ' .. tostring( Proc.Id) .. ' part box not found' + EgtOutLog( sErr) + return false, sErr + end -- recupero e verifico l'entità curva local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i') if AuxId then AuxId = AuxId + Proc.Id end @@ -129,13 +118,13 @@ function ProcessDtMortise.Make( Proc, nPhase, nRawId, nPartId) -- recupero il diametro dell'utensile e l'angolo di spoglia local dToolDiam = 100 local dMaxMat = 30 - local dSideAngle = 0 + local dSideAng = 0 if EgtMdbSetCurrMachining( sMilling) then local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then dToolDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dToolDiam dMaxMat = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT) or dMaxMat - dSideAngle = EgtTdbGetCurrToolParam( MCH_TP.SIDEANG) or dSideAngle + dSideAng = EgtTdbGetCurrToolParam( MCH_TP.SIDEANG) or dSideAng end end -- se parametro interno abilitato e il percorso non è chiuso, aggiungo percorso e lavorazione antischeggia @@ -153,12 +142,12 @@ function ProcessDtMortise.Make( Proc, nPhase, nRawId, nPartId) EgtOutLog( sErr) return false, sErr end - -- estraggo il percorso top mortise - local nAuxId1 = ExtractTopPath( Proc.Id, vtExtr, nAddGrpId, rfFac0, dAltMort) + -- calcolo il percorso top mortise + local nAuxId1 = CalcTopPath( Proc.Id, AuxId, nAddGrpId, dAltMort, dSideAng, b3Solid) -- se esiste il percorso if nAuxId1 then -- creo percorso sulla parte alta della mortasa - local dToolRadDelta = dAltMort * tan( dSideAngle) + local dToolRadDelta = dAltMort * tan( dSideAng) local dTopDiam = dToolDiam + 2 * dToolRadDelta -- recupero punto iniziale e finale del percorso local ptStart = EgtSP( nAuxId1, GDB_RT.GLOB) diff --git a/LuaLibs/ProcessHeadCut.lua b/LuaLibs/ProcessHeadCut.lua index dc8245e..1c3da51 100644 --- a/LuaLibs/ProcessHeadCut.lua +++ b/LuaLibs/ProcessHeadCut.lua @@ -1,4 +1,4 @@ --- ProcessSplit.lua by Egaltech s.r.l. 2020/01/24 +-- ProcessSplit.lua by Egaltech s.r.l. 2020/04/10 -- Gestione calcolo tagli di testa per Travi -- Tabella per definizione modulo @@ -8,7 +8,7 @@ local ProcessHeadCut = {} require( 'EgtBase') local BL = require( 'BeamLib') -EgtOutLog( ' ProcessSplit started', 1) +EgtOutLog( ' ProcessHeadCut started', 1) -- Dati local BD = require( 'BeamData') diff --git a/LuaLibs/ProcessLapJoint.lua b/LuaLibs/ProcessLapJoint.lua index 11907c3..56a7a67 100644 --- a/LuaLibs/ProcessLapJoint.lua +++ b/LuaLibs/ProcessLapJoint.lua @@ -1,4 +1,4 @@ --- ProcessLapJoint.lua by Egaltech s.r.l. 2020/04/06 +-- ProcessLapJoint.lua by Egaltech s.r.l. 2020/04/07 -- Gestione calcolo mezzo-legno per Travi -- 2019/10/08 Agg. gestione OpenPocket. @@ -910,23 +910,12 @@ local function ChooseCorner( Proc, nFacInd) local tFacAdj = {} for i = 1, #vAdj do if vAdj[i] >= 0 then - for j = 1, #vAdj do - if vAdj[j] >= 0 and j ~= i then - local bInsert = true - for k = 1, #tFacAdj do - local nFace1 = tFacAdj[k][1] - local nFace2 = tFacAdj[k][2] - if ( nFace1 == vAdj[i] and nFace2 == vAdj[j]) or - ( nFace1 == vAdj[j] and nFace2 == vAdj[i]) then - bInsert = false - end - end - if bInsert then - local _, ptP1, ptP2, dAng = EgtSurfTmFacetsContact( Proc.Id, vAdj[i], vAdj[j], GDB_ID.ROOT) - if ptP1 and ptP2 then - local dLen = dist( ptP1, ptP2) - table.insert( tFacAdj, { vAdj[i], vAdj[j], dLen, ptP1, ptP2, dAng}) - end + for j = i+1, #vAdj do + if vAdj[j] >= 0 then + local _, ptP1, ptP2, dAng = EgtSurfTmFacetsContact( Proc.Id, vAdj[i], vAdj[j], GDB_ID.ROOT) + if ptP1 and ptP2 and dAng < 0 then + local dLen = dist( ptP1, ptP2) + table.insert( tFacAdj, { vAdj[i], vAdj[j], dLen, ptP1, ptP2, dAng}) end end end @@ -959,6 +948,10 @@ local function MakeContourCorner( Proc, nPhase, nRawId, nPartId, b3Raw, nFacInd, -- ottengo gli angoli dove applicare il percorso con fresa più piccola local dMaxLen, nIdLine, tFacAdj = ChooseCorner( Proc, nFacInd) + -- se non trovato nessun angolo interno valido esco + if #tFacAdj == 0 then + return true, sMyWarn + end -- prendo il primo versore local _, vtN1 = EgtSurfTmFacetCenter( Proc.Id, nFacInd, GDB_ID.ROOT) -- se direzione tende verso una delle alle 3 direzioni azzero l'altezza extra @@ -975,10 +968,9 @@ local function MakeContourCorner( Proc, nPhase, nRawId, nPartId, b3Raw, nFacInd, for i = 1, #tFacAdj do sMyWarn = '' -- le 2 facce di contatto devono essere perpendicolari o non sottossquadra rispetto alla faccia di fondo - -- e ra le due facce deve esserci un angolo interno local _, ptP1, ptP2, dAng = EgtSurfTmFacetsContact( Proc.Id, nFacInd, tFacAdj[i][1], GDB_ID.ROOT) local _, ptP1x, ptP2x, dAngx = EgtSurfTmFacetsContact( Proc.Id, nFacInd, tFacAdj[i][2], GDB_ID.ROOT) - if ( dAng < 0 and 180 + dAng >= 90 - 10 * GEO.EPS_SMALL) and ( dAngx < 0 and 180 + dAngx >= 90 - 10 * GEO.EPS_SMALL) and ( tFacAdj[i][6] < 0) then + if ( dAng < 0 and 180 + dAng >= 90 - 10 * GEO.EPS_SMALL) and ( dAngx < 0 and 180 + dAngx >= 90 - 10 * GEO.EPS_SMALL) then -- prendo la lunghezza di adiacenza delle due linee local dLen1 = dist( ptP1, ptP2) local dLen2 = dist( ptP1x, ptP2x) @@ -1121,10 +1113,11 @@ local function MakeContourCorner( Proc, nPhase, nRawId, nPartId, b3Raw, nFacInd, end return true, sMyWarn end + --------------------------------------------------------------------- local function MakeCleanCorner( Proc, nPhase, nRawId, nPartId, b3Raw, nFacInd, nAddGrpId, dDiam) - local sMyWarn + local sMyWarn = '' local pAuxId = {} local nAuxId local AuxId @@ -1135,16 +1128,14 @@ local function MakeCleanCorner( Proc, nPhase, nRawId, nPartId, b3Raw, nFacInd, n -- ottengo l'angolo di riferimento dove applicare il percorso di pulitura local dMaxLen, nIdLine, tFacAdj = ChooseCorner( Proc, nFacInd) + -- se non trovato nessun angolo valido esco + if #tFacAdj == 0 then + return true, sMyWarn + end -- prendo il primo versore local _, vtN1 = EgtSurfTmFacetCenter( Proc.Id, nFacInd, GDB_ID.ROOT) local _, vtN2 = EgtSurfTmFacetCenter( Proc.Id, tFacAdj[nIdLine][1], GDB_ID.ROOT) local _, vtN3 = EgtSurfTmFacetCenter( Proc.Id, tFacAdj[nIdLine][2], GDB_ID.ROOT) - - if not tFacAdj then - local sErr = 'Error on process ' .. tostring( Proc.Id) .. ' geometry not found for clean corner' - EgtOutLog( sErr) - return false, sErr - end -- trovo il punto sulla superfice di riferimento local _, ptLocP1, ptLocP2, _ = EgtSurfTmFacetsContact( Proc.Id, nFacInd, tFacAdj[nIdLine][1], GDB_ID.ROOT) local nIdIniPoint @@ -1294,15 +1285,15 @@ local function MakeCleanCorner( Proc, nPhase, nRawId, nPartId, b3Raw, nFacInd, n return true, sMyWarn end + --------------------------------------------------------------------- local function MakeDrillOnCorner( Proc, nPhase, nRawId, nPartId, b3Raw, nFacInd, nAddGrpId, dDiam, bSpecialMach) - local sMyWarn + local sMyWarn = '' -- ottengo l'angolo dove applicare il foro local dMaxLen, nIdLine, tFacAdj = ChooseCorner( Proc, nFacInd) - if not tFacAdj then - local sErr = 'Error on process ' .. tostring( Proc.Id) .. ' geometry not found for drilling' - EgtOutLog( sErr) - return false, sErr + -- se non trovato nessun angolo interno valido esco + if #tFacAdj == 0 then + return true, sMyWarn end -- trovo il punto sulla superfice di riferimento local _, ptLocP1, ptLocP2, _ = EgtSurfTmFacetsContact( Proc.Id, nFacInd, tFacAdj[nIdLine][1], GDB_ID.ROOT) @@ -3074,7 +3065,7 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, bSingle_part) -- se processo 20 vedo se ho truciolatore abilitato if Proc.Prc == 20 then -- se forzato uso truciolatore altrimenti prosegue con fresa più piccola - if EgtGetInfo( Proc.Id, sUseRoughTool, 'i') == 1 then + if EgtGetInfo( Proc.Id, sUseRoughTool, 'i') ~= 0 then sMchFind = 'OpenPocket' nUseRoughTool = 1 end