|
|
|
@@ -140,6 +140,112 @@ local function MakeChamfer( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
---------------------------------------------------------------------
|
|
|
|
|
local function MakePocket( Proc, nPartId, ptPs, vtN, nFaceRef, nDiffWidth, sMchFind, nUseRoughTool, tBHx)
|
|
|
|
|
|
|
|
|
|
-- calcolo il elevazione dal punto medio
|
|
|
|
|
local dElev
|
|
|
|
|
local dLenIn, dLedOut = BL.GetPointDirDepth( nPartId, ptPs, vtN[nFaceRef])
|
|
|
|
|
if dLenIn > 0 then
|
|
|
|
|
dElev = dLenIn
|
|
|
|
|
elseif dLedOut then
|
|
|
|
|
dElev = dLedOut
|
|
|
|
|
end
|
|
|
|
|
local dCollSic = 2 * BD.COLL_SIC
|
|
|
|
|
local sTuuidMstr
|
|
|
|
|
-- calcolo il diametro utensile
|
|
|
|
|
local dDiamTool
|
|
|
|
|
if nUseRoughTool == 1 then
|
|
|
|
|
-- se feature passante prendo utensile più grande possibile
|
|
|
|
|
if ( Proc.AffectedFaces.Top and Proc.AffectedFaces.Bottom) or ( Proc.AffectedFaces.Front and Proc.AffectedFaces.Back) then
|
|
|
|
|
dDiamTool = nil
|
|
|
|
|
else
|
|
|
|
|
dDiamTool = max( 80, min( tBHx[nFaceRef][1], tBHx[nFaceRef][2]))
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
-- se non uso truciolatore prendo il valore dalle dimensioni minime delle facce
|
|
|
|
|
dDiamTool = min( tBHx[nFaceRef][1], tBHx[nFaceRef][2])
|
|
|
|
|
end
|
|
|
|
|
-- abilitazione lavorazione da sotto (testa da sotto e direzione normale sotto -30deg)
|
|
|
|
|
local bTopHead = ( BD.DOWN_HEAD and vtN[nFaceRef]:getZ() > -0.1)
|
|
|
|
|
local bDownHead = ( BD.DOWN_HEAD and vtN[nFaceRef]:getZ() < 0.1)
|
|
|
|
|
-- recupero la lavorazione
|
|
|
|
|
local sPocketing, _, _, bDownHead = ML.FindPocketing( sMchFind.. EgtIf( bDownHead, '_H2', ''), dDiamTool, dElev + dCollSic, nil, bTopHead, bDownHead)
|
|
|
|
|
if not sPocketing then
|
|
|
|
|
local sErr = 'Error : pocketing not found in library'
|
|
|
|
|
EgtOutLog( sErr)
|
|
|
|
|
return false, sErr
|
|
|
|
|
end
|
|
|
|
|
-- recupero il diametro dell'utensile
|
|
|
|
|
if EgtMdbSetCurrMachining( sPocketing) then
|
|
|
|
|
sTuuidMstr = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID)
|
|
|
|
|
if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuidMstr) or '') then
|
|
|
|
|
dDiamTool = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dDiamTool
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
-- inserisco la lavorazione di svuotatura
|
|
|
|
|
local sName = 'Pock_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) .. 'F' .. tostring( nFaceRef - 1)
|
|
|
|
|
local nMchFId = EgtAddMachining( sName, sPocketing)
|
|
|
|
|
if not nMchFId then
|
|
|
|
|
local sErr = 'Error adding machining ' .. sName .. '-' .. sPocketing
|
|
|
|
|
EgtOutLog( sErr)
|
|
|
|
|
return false, sErr
|
|
|
|
|
end
|
|
|
|
|
-- aggiungo geometria
|
|
|
|
|
EgtSetMachiningGeometry( {{ Proc.Id, (nFaceRef-1)}})
|
|
|
|
|
-- imposto uso faccia
|
|
|
|
|
EgtSetMachiningParam( MCH_MP.FACEUSE, MCH_MILL_FU.ORTHO_CONT)
|
|
|
|
|
-- imposto posizione braccio porta testa
|
|
|
|
|
if vtN[nFaceRef]:getY() < GEO.EPS_SMALL then
|
|
|
|
|
EgtSetMachiningParam( MCH_MP.SCC, MCH_SCC.ADIR_YM)
|
|
|
|
|
else
|
|
|
|
|
EgtSetMachiningParam( MCH_MP.SCC, MCH_SCC.ADIR_YP)
|
|
|
|
|
end
|
|
|
|
|
-- La tasca ha sempre almeno un lato aperto, imposto opportuno attacco
|
|
|
|
|
EgtSetMachiningParam( MCH_MP.SUBTYPE, MCH_POCK_SUB.SPIRALIN)
|
|
|
|
|
-- imposto elevazione
|
|
|
|
|
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
|
|
|
|
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dElev, 1))
|
|
|
|
|
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
|
|
|
|
|
if not ML.ApplyMachining( true, false) then
|
|
|
|
|
-- provo ad allargare leggermente la tasca
|
|
|
|
|
EgtSetMachiningParam( MCH_MP.OFFSR, -0.1)
|
|
|
|
|
if not ML.ApplyMachining( true, false) then
|
|
|
|
|
local _, sErr = EgtGetLastMachMgrError()
|
|
|
|
|
EgtSetOperationMode( nMchFId, false)
|
|
|
|
|
return false, sErr
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return true, '', sTuuidMstr
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
---------------------------------------------------------------------
|
|
|
|
|
local function MachineByMill( Proc, nPhase, nRawId, nPartId, b3Solid, ptC, vtN, nBigInd, nSmaInd, ptPs, tBHx, b3Raw, nDiffWidth, nUseRoughTool, dAng)
|
|
|
|
|
|
|
|
|
|
local sMchFind = 'Pocket'
|
|
|
|
|
-- se feature é larga come trave imposto openpocket
|
|
|
|
|
if nDiffWidth == 0 then
|
|
|
|
|
sMchFind = 'OpenPocket'
|
|
|
|
|
-- altrimenti se non è passante disabilito il truciolatore
|
|
|
|
|
else
|
|
|
|
|
nUseRoughTool = 0
|
|
|
|
|
end
|
|
|
|
|
-- applico la svuotatura
|
|
|
|
|
local bOk, sErr, sTuuidMstr = MakePocket( Proc, nPartId, ptPs, vtN, nBigInd, nDiffWidth, sMchFind, nUseRoughTool, tBHx)
|
|
|
|
|
if not bOk then
|
|
|
|
|
return bOk, sErr
|
|
|
|
|
end
|
|
|
|
|
-- se angolo tra le facce maggiore di 90, inserisco la contornatura o svuotatura del lato più corto
|
|
|
|
|
if dAng > -90 then
|
|
|
|
|
-- applico la svuotatura
|
|
|
|
|
local bOk, sErr = MakePocket( Proc, nPartId, ptPs, vtN, nSmaInd, nDiffWidth, sMchFind, nUseRoughTool, tBHx)
|
|
|
|
|
if not bOk then
|
|
|
|
|
return bOk, sErr
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
---------------------------------------------------------------------
|
|
|
|
|
-- Applicazione della lavorazione al caso due facce
|
|
|
|
|
local function MakeTwoFaces( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
|
|
|
@@ -156,6 +262,7 @@ local function MakeTwoFaces( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
|
|
|
|
return false, sErr
|
|
|
|
|
end
|
|
|
|
|
-- dati delle facce
|
|
|
|
|
local tBHx = {}
|
|
|
|
|
local ptC = {}
|
|
|
|
|
local vtN = {}
|
|
|
|
|
ptC[1], vtN[1] = EgtSurfTmFacetCenter( Proc.Id, 0, GDB_ID.ROOT)
|
|
|
|
@@ -183,11 +290,13 @@ local function MakeTwoFaces( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
|
|
|
|
end
|
|
|
|
|
-- recupero i dati dell'utensile
|
|
|
|
|
local dSawDiam = 400
|
|
|
|
|
local dSawThick = 2
|
|
|
|
|
local dMaxDepth = 0
|
|
|
|
|
if EgtMdbSetCurrMachining( sCutting) then
|
|
|
|
|
local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID)
|
|
|
|
|
if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then
|
|
|
|
|
dSawDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dSawDiam
|
|
|
|
|
dSawThick = EgtTdbGetCurrToolParam( MCH_TP.THICK) or dSawThick
|
|
|
|
|
dMaxDepth = EgtTdbGetCurrToolMaxDepth() or dMaxDepth
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
@@ -239,47 +348,58 @@ local function MakeTwoFaces( Proc, nPhase, nRawId, nPartId, dOvmHead)
|
|
|
|
|
vtRef[2] = vtN[2] ^ vtTg
|
|
|
|
|
if vtRef[2] * vtN[1] < 0 then vtRef[2] = - vtRef[2] end
|
|
|
|
|
-- determino quale faccia è più grande
|
|
|
|
|
local _, dB1, dH1 = EgtSurfTmFacetMinAreaRectangle( Proc.Id, 0)
|
|
|
|
|
local _, dB2, dH2 = EgtSurfTmFacetMinAreaRectangle( Proc.Id, 1)
|
|
|
|
|
local rfFac1, dB1, dH1 = EgtSurfTmFacetMinAreaRectangle( Proc.Id, 0)
|
|
|
|
|
local rfFac2, dB2, dH2 = EgtSurfTmFacetMinAreaRectangle( Proc.Id, 1)
|
|
|
|
|
local nBigInd = EgtIf( dB1 * dH1 >= dB2 * dH2, 1, 2)
|
|
|
|
|
local nSmaInd = 3 - nBigInd
|
|
|
|
|
-- calcolo extra taglio
|
|
|
|
|
local dCutExtra = dExtraUp
|
|
|
|
|
if dAng < -90.5 and dAng > -179.5 then
|
|
|
|
|
dCutExtra = - dSawThick / tan( 180 + dAng) + dExtraUp
|
|
|
|
|
end
|
|
|
|
|
-- verifico se necessari tagli supplementari
|
|
|
|
|
local vCuts = DC.GetDice( nAddGrpId, b3Solid, ptC[nBigInd], vtN[nBigInd], false, ptC[nSmaInd], vtN[nSmaInd])
|
|
|
|
|
--DC.PrintOrderCut( vCuts)
|
|
|
|
|
if #vCuts > 0 then
|
|
|
|
|
-- sistemo posizione nel DB e nome
|
|
|
|
|
for i = 1, #vCuts do
|
|
|
|
|
for j = 1, #vCuts[i] do
|
|
|
|
|
EgtSetName( vCuts[i][j], 'AddCut_' .. tostring( Proc.Id))
|
|
|
|
|
EgtSetInfo( vCuts[i][j], 'TASKID', Proc.TaskId)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
-- eseguo
|
|
|
|
|
for i = 1, #vCuts do
|
|
|
|
|
-- assegno il modo di tagliare
|
|
|
|
|
local vtOrthO = EgtIf( ( i % 2) == 1, vtRef[nSmaInd], vtRef[nBigInd])
|
|
|
|
|
-- lavoro la faccia
|
|
|
|
|
for j = 1, #vCuts[i] do
|
|
|
|
|
local dLocCutExtra = EgtIf( j == #vCuts[i], dCutExtra - dExtraUp, dCutExtra)
|
|
|
|
|
local bOk, sErr = Fbs.MakeOne( vCuts[i][j], 0, sCutting, dSawDiam, vtOrthO, nil, dLocCutExtra, BD.CUT_SIC, 0, 0, 0, nil, b3Raw)
|
|
|
|
|
if not bOk then
|
|
|
|
|
return bOk, sErr
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
-- altrimenti, tagli diretti delle facce
|
|
|
|
|
else
|
|
|
|
|
local bOk, sErr = Fbs.MakeTwo( Proc, nPhase, nRawId, nPartId, dOvmHead, EgtIf( bHead, 'HeadSide', 'TailSide'))
|
|
|
|
|
tBHx[1] = {dH1, dV1, rfFac1}
|
|
|
|
|
tBHx[2] = {dH2, dV2, rfFac2}
|
|
|
|
|
local nUseRoughTool = EgtGetInfo( Proc.Id, 'Q02', 'i')
|
|
|
|
|
if nUseRoughTool == 1 and dAng < -0.1 and dAng > -90 then
|
|
|
|
|
local bOk, sErr = MachineByMill( Proc, nPhase, nRawId, nPartId, b3Solid, ptC, vtN, nBigInd, nSmaInd, ptPs, tBHx, b3Raw, 0, nUseRoughTool, dAng)
|
|
|
|
|
if not bOk then
|
|
|
|
|
return bOk, sErr
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
-- calcolo extra taglio
|
|
|
|
|
local dCutExtra = dExtraUp
|
|
|
|
|
if dAng < -90.5 and dAng > -179.5 then
|
|
|
|
|
dCutExtra = - dSawThick / tan( 180 + dAng) + dExtraUp
|
|
|
|
|
end
|
|
|
|
|
-- verifico se necessari tagli supplementari
|
|
|
|
|
local vCuts = DC.GetDice( nAddGrpId, b3Solid, ptC[nBigInd], vtN[nBigInd], false, ptC[nSmaInd], vtN[nSmaInd])
|
|
|
|
|
--DC.PrintOrderCut( vCuts)
|
|
|
|
|
if #vCuts > 0 then
|
|
|
|
|
-- sistemo posizione nel DB e nome
|
|
|
|
|
for i = 1, #vCuts do
|
|
|
|
|
for j = 1, #vCuts[i] do
|
|
|
|
|
EgtSetName( vCuts[i][j], 'AddCut_' .. tostring( Proc.Id))
|
|
|
|
|
EgtSetInfo( vCuts[i][j], 'TASKID', Proc.TaskId)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
-- eseguo
|
|
|
|
|
for i = 1, #vCuts do
|
|
|
|
|
-- assegno il modo di tagliare
|
|
|
|
|
local vtOrthO = EgtIf( ( i % 2) == 1, vtRef[nSmaInd], vtRef[nBigInd])
|
|
|
|
|
-- lavoro la faccia
|
|
|
|
|
for j = 1, #vCuts[i] do
|
|
|
|
|
local dLocCutExtra = EgtIf( j == #vCuts[i], dCutExtra - dExtraUp, dCutExtra)
|
|
|
|
|
local bOk, sErr = Fbs.MakeOne( vCuts[i][j], 0, sCutting, dSawDiam, vtOrthO, nil, dLocCutExtra, BD.CUT_SIC, 0, 0, 0, nil, b3Raw)
|
|
|
|
|
if not bOk then
|
|
|
|
|
return bOk, sErr
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
-- altrimenti, tagli diretti delle facce
|
|
|
|
|
else
|
|
|
|
|
local bOk, sErr = Fbs.MakeTwo( Proc, nPhase, nRawId, nPartId, dOvmHead, EgtIf( bHead, 'HeadSide', 'TailSide'))
|
|
|
|
|
if not bOk then
|
|
|
|
|
return bOk, sErr
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- eventuale segnalazione ingombro di testa o coda
|
|
|
|
|
if Proc.Head then
|
|
|
|
|
local dOffs = b3Raw:getMax():getX() - dOvmHead - Proc.Box:getMin():getX()
|
|
|
|
|