DataBeam :

- aggiunta gestione feature Dovetail (1/2/3/4-138-X)
- correzioni e migliorie varie.
This commit is contained in:
Dario Sassi
2020-04-25 09:51:20 +00:00
parent 2c5529b87b
commit 4ba7936167
7 changed files with 1917 additions and 182 deletions
+28 -138
View File
@@ -1,4 +1,4 @@
-- ProcessTyroleanDovetail.lua by Egaltech s.r.l. 2020/04/20
-- ProcessTyroleanDovetail.lua by Egaltech s.r.l. 2020/04/23
-- Gestione calcolo giunzione tirolese
-- Tabella per definizione modulo
@@ -83,7 +83,7 @@ end
---------------------------------------------------------------------
-- Classificazione della feature
function ProcessTyroleanDovetail.Classify( Proc)
function ProcessTyroleanDovetail.Classify( Proc, b3Raw)
-- verifico le normali delle facce
local nFacetCnt = EgtSurfTmFacetCount( Proc.Id)
local nFlatFaceNeg
@@ -98,7 +98,7 @@ function ProcessTyroleanDovetail.Classify( Proc)
end
-- se trovata faccia rastremata rivolta verso Z-
-- verifico se lunghezza faccia piatta è compatibile con il taglio di lama
if FlatFaceNeg then
if nFlatFaceNeg then
-- se ho 3 facce sicuramente è gruppo 3 o 4, setto il ribaltamento senza ulteriori controlli
if nFacetCnt == 3 then
bDown = true
@@ -110,15 +110,18 @@ function ProcessTyroleanDovetail.Classify( Proc)
local nOtherFace = EgtIf( nFlatFaceNeg == 0, nFlatFaceNeg + 1, nFlatFaceNeg - 1)
local bAdj , ptP1, ptP2, dAng = EgtSurfTmFacetsContact( Proc.Id, nFlatFaceNeg, nOtherFace, GDB_ID.ROOT)
local dDist = dist( ptP1, ptP2)
local dLenface
-- se non sono uguali prendo la dimensione diversa dalla lunghezza di adiacenza
if abs( dDist - dH) < 10 * GEO.EPS_SMALL then
dLenface = dV
local dLargeface
local dDelta = 100000
local dDeltadH = abs( dDist - dH)
local dDeltadV = abs( dDist - dV)
-- prendo la dimensione diversa dalla lunghezza di adiacenza
if dDeltadH < dDeltadV then
dLargeface = dV
else
dLenface = dH
end
dLargeface = dH
end
-- se lunghezza faccia maggiore di taglio lama da sotto setto il ribaltamento
if dLenface > BD.MAX_LEN_RIDGELAP_FROM_BOTTOM - 10 * GEO.EPS_SMALL then
if dLargeface > BD.GetMaxLenRidgeLapFromBottom( b3Raw:getDimZ()) then
bDown = true
end
-- se angolo tra le facce è maggiore di 90 non è raggiungibile dalla lama setto il ribaltamento
@@ -407,104 +410,8 @@ local function MakeMachByBlade( Proc, nPhase, nRawId, nPartId, dOvmHead, b3Raw,
return true
end
--[[
---------------------------------------------------------------------
local function MakePocket( Proc, nPartId, ptPs, tvtN, nFaceRef, sMchFind, sMasterPocket, dPrevFaceElev, sPrefixName, tDimAndRef, dAng)
-- calcolo l'elevazione dal punto medio
local dElev
local dLenIn, dLedOut = BL.GetPointDirDepth( nPartId, ptPs, tvtN[2])
if dLenIn > 0 then
dElev = dLenIn
elseif dLedOut then
dElev = dLedOut
end
local dCollSic = 2 * BD.COLL_SIC
-- calcolo il diametro utensile
local dDiamTool
local dFaceDiamTool
if tDimAndRef then
-- prendo il valore dalle dimensioni minime delle facce
dFaceDiamTool = min( tDimAndRef[2][1], tDimAndRef[2][2])
end
-- se ho lavorazione precedente ricalcolo grossolanamente l'elevazione
if dPrevFaceElev and dPrevFaceElev > 0 and dAng then
dElev = dElev + ( sqrt( ( dElev * dElev) - ( dPrevFaceElev * dPrevFaceElev)) * sin(dAng))
elseif dPrevFaceElev and dPrevFaceElev > dElev then
dElev = dPrevFaceElev
end
local sPocketing
if sMasterPocket then
sPocketing = sMasterPocket
else
sPocketing = ML.FindPocketing( sMchFind, dFaceDiamTool, dElev + dCollSic)
end
if not sPocketing then
local sErr = 'Error on process ' .. tostring( Proc.Id) .. ' pocketing not found in library'
EgtOutLog( sErr)
return false, sErr
end
dDiamTool = 20
local dMaxDepth = 0
local sTuuidPk
if EgtMdbSetCurrMachining( sPocketing) then
sTuuidPk = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID)
if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuidPk) or '') then
dMaxDepth = ( EgtTdbGetCurrToolMaxDepth() or dMaxDepth)
dDiamTool = EgtTdbGetCurrToolParam( MCH_TP.DIAM)
end
end
-- se nome svuotatura non è stato ricalcolato, confronto il diametro utensile utilizzato con il minimo faccia e se non sono compatibili esco
if sMasterPocket and dFaceDiamTool and dDiamTool >= dFaceDiamTool then
return false, '', sTuuidPk, dDiamTool, dElev
end
-- inserisco la lavorazione di svuotatura
local sName = sPrefixName .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) .. 'F' .. tostring( nFaceRef)
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)}})
-- imposto uso faccia
EgtSetMachiningParam( MCH_MP.FACEUSE, MCH_MILL_FU.ORTHO_CONT)
-- imposto posizione braccio porta testa
if tvtN[2]:getY() < GEO.EPS_SMALL then
EgtSetMachiningParam( MCH_MP.SCC, MCH_SCC.ADIR_YM)
else
EgtSetMachiningParam( MCH_MP.SCC, MCH_SCC.ADIR_YP)
end
-- imposto opportuno attacco
EgtSetMachiningParam( MCH_MP.SUBTYPE, MCH_POCK_SUB.SPIRALIN)
-- se elevazione superiore a massimo affondamento della fresa, riduco opportunamente
local sWarn
-- if dElev > dMaxDepth + 10 * GEO.EPS_SMALL then
-- EgtSetMachiningParam( MCH_MP.DEPTH, dMaxDepth - dElev)
-- dElev = dMaxDepth
-- sWarn = 'Warning in process ' .. tostring( Proc.Id) .. ' : elevation bigger than max tool depth'
-- EgtOutLog( sWarn)
-- end
-- imposto elevazione e dichiaro non si generano sfridi per VMill
local sNotes = 'MaxElev=' .. EgtNumToString( dElev, 1) .. ';'
sNotes = sNotes .. 'VMRS=0;'
EgtSetMachiningParam( MCH_MP.USERNOTES, sNotes)
if not EgtApplyMachining( true, false) then
-- provo ad allargare leggermente la tasca
EgtSetMachiningParam( MCH_MP.OFFSR, -0.1)
if not EgtApplyMachining( true, false) then
local _, sErr = EgtGetLastMachMgrError()
EgtSetOperationMode( nMchFId, false)
return false, sErr
end
end
return true, sWarn, sTuuidPk, dDiamTool
end
]]--
---------------------------------------------------------------------
local function MakeMillCut( Proc, i, j, k, sMilling, nFacInd, pPPnt, rfFac, dOffs, dOffrRad, dAddOffsRad, nStep, dToolDiam, dStep)
local function MakeMillCut( Proc, i, j, k, sMilling, nFacInd, TabNAD, rfFac, dOffs, dOffrRad, dAddOffsRad, nStep, dToolDiam, dStep)
local sWarn = ''
-- inserisco la lavorazione di fresatura
-- per evitare nomi lavorazioni coincidenti, concateno anche il Proc.Id se il nome (del Proc.Id) è presente
@@ -523,7 +430,7 @@ local function MakeMillCut( Proc, i, j, k, sMilling, nFacInd, pPPnt, rfFac, dOff
-- aggiungo geometria
EgtSetMachiningGeometry( {{ Proc.Id, nFacInd}})
-- imposto uso faccia
local nFaceUse = BL.GetNearestOrthoOpposite( pPPnt[j][1])
local nFaceUse = BL.GetNearestOrthoOpposite( TabNAD[j][1])
EgtSetMachiningParam( MCH_MP.FACEUSE, nFaceUse)
-- imposto posizione braccio porta testa
local nSCC = MCH_SCC.ADIR_YM
@@ -620,10 +527,10 @@ local function MakeMachByMill( Proc, nPhase, nRawId, nPartId, dOvmHead, b3Raw, b
dStepmach = dMaxMat * 0.5
end
-- recupero la faccia con il maggior numero di adiacenze e l'elevazione relativa
local nFacInd, dFacElev, nFacInd2, dFacElev2 = BL.GetFaceWithMostAdj( Proc.Id, nPartId, false, sin(dSideAngle))
local nFacInd, dFacElev = BL.GetFaceWithMostAdj( Proc.Id, nPartId, false, sin(dSideAngle))
if not nFacInd or nFacInd < 0 then
-- provo eliminando i sottosquadra
nFacInd, dFacElev, nFacInd2, dFacElev2 = BL.GetFaceWithMostAdj( Proc.Id, nPartId, false, -2)
nFacInd, dFacElev = BL.GetFaceWithMostAdj( Proc.Id, nPartId, false, -2)
if not nFacInd or nFacInd < 0 then
local sErr = 'Error on process ' .. tostring( Proc.Id) .. ' MakeMachByMill could not find reference face'
EgtOutLog( sErr)
@@ -663,7 +570,7 @@ local function MakeMachByMill( Proc, nPhase, nRawId, nPartId, dOvmHead, b3Raw, b
-- vettore di riferimento per le facce ortogonali all'asse trave
local vtRef = Vector3d( 0, vtN:getY(), vtN:getZ())
vtRef:normalize()
local pPPnt = {}
local TabNAD = {}
-- ciclo inserimento tagli antischeggia sulle facce
for i = 1, nFacetCnt do
if (i-1) ~= nFacInd then
@@ -673,7 +580,7 @@ local function MakeMachByMill( Proc, nPhase, nRawId, nPartId, dOvmHead, b3Raw, b
local dTrim
local bTouch, ptP1, ptP2, dAng = EgtSurfTmFacetsContact( Proc.Id, nFacInd, (i-1), GDB_ID.ROOT)
if dAng then
pPPnt[i] = { vtN2, dAng, dist( ptP1, ptP2)}
TabNAD[i] = { vtN2, dAng, dist( ptP1, ptP2)}
end
if bTouch and dAng < 0 and dAng > -90 - 5 * GEO.EPS_SMALL then
dTrim = 0
@@ -704,11 +611,11 @@ local function MakeMachByMill( Proc, nPhase, nRawId, nPartId, dOvmHead, b3Raw, b
-- calcolo la larghezza (solo 1 volta)
if i == 1 then
-- se ho un sottosquadra maggiore dell'angolo di spoglia utensile
if bUCutMax and ( 90 + pPPnt[j][2]) < dSideAngle then
if bUCutMax and ( 90 + TabNAD[j][2]) < dSideAngle then
dParzElev = dFacElev
end
local dDeltadH = abs( pPPnt[j][3] - dH)
local dDeltadV = abs( pPPnt[j][3] - dV)
local dDeltadH = abs( TabNAD[j][3] - dH)
local dDeltadV = abs( TabNAD[j][3] - dV)
if dDeltadH < dDeltadV then
if dDeltadH < dDelta + 10 * GEO.EPS_SMALL then
dDelta = dDeltadH
@@ -724,7 +631,7 @@ local function MakeMachByMill( Proc, nPhase, nRawId, nPartId, dOvmHead, b3Raw, b
end
end
-- valori negativi di offset corrispondono ad un allargamento (perchè dParzElev è negativo)
dOffsSide = dOffsSide + ( tan( 90 + pPPnt[j][2]) * dParzElev)
dOffsSide = dOffsSide + ( tan( 90 + TabNAD[j][2]) * dParzElev)
end
end
-- se la larghezza è più grande dell'utensile allora posso lavorare il passo
@@ -734,12 +641,12 @@ local function MakeMachByMill( Proc, nPhase, nRawId, nPartId, dOvmHead, b3Raw, b
for j = 1, nFacetCnt do
if (j-1) ~= nFacInd then
-- calcolo l'offset radiale in base all'affondamento
local dOffrRad = ( tan( 90 + pPPnt[j][2]) * dOffs)
if bUCutMax and ( 90 + pPPnt[j][2]) < dSideAngle then
dOffrRad = -( tan( 90 + pPPnt[j][2]) * dFacElev)
local dOffrRad = ( tan( 90 + TabNAD[j][2]) * dOffs)
if bUCutMax and ( 90 + TabNAD[j][2]) < dSideAngle then
dOffrRad = -( tan( 90 + TabNAD[j][2]) * dFacElev)
end
-- inserisco la lavorazione di fresatura
local bOk, sErr = MakeMillCut( Proc, i, j, nil, sMilling, nFacInd, pPPnt, rfFac, dOffs, dOffrRad, 0, nStep, dToolDiam, dStep)
local bOk, sErr = MakeMillCut( Proc, i, j, nil, sMilling, nFacInd, TabNAD, rfFac, dOffs, dOffrRad, 0, nStep, dToolDiam, dStep)
if not bOk then
return false, sErr
else
@@ -752,7 +659,7 @@ local function MakeMachByMill( Proc, nPhase, nRawId, nPartId, dOvmHead, b3Raw, b
for k = 1, nStepSide do
local dAddOffsRad = ( k * dStepSide) + EgtIf( k == nStepSide, ( dToolDiam * 0.1), 0)
-- inserisco la lavorazione di fresatura
local bOk, sErr = MakeMillCut( Proc, i, j, k, sMilling, nFacInd, pPPnt, rfFac, dOffs, dOffrRad, dAddOffsRad, nStep, dToolDiam, dStep)
local bOk, sErr = MakeMillCut( Proc, i, j, k, sMilling, nFacInd, TabNAD, rfFac, dOffs, dOffrRad, dAddOffsRad, nStep, dToolDiam, dStep)
if not bOk then
return false, sErr
else
@@ -777,23 +684,6 @@ local function MakeMachByMill( Proc, nPhase, nRawId, nPartId, dOvmHead, b3Raw, b
-- return false, sErr
-- end
-- recupero la lavorazione
--local dCollSic = 2 * BD.COLL_SIC
--if abs( vtN:getX()) > 0.996 or abs( vtN:getY()) > 0.996 or abs( vtN:getZ()) > 0.996 then dCollSic = 0 end
--local dDiam = min( dH, dV)
--sMchFind = 'OpenPocketTCone'
--local sPocketing = ML.FindPocketing( sMchFind, dDiam, dFacElev + dCollSic)
---- se non trova una svuotatura adatta emetto un warning
--if not sPocketing then
-- local sWarn = 'Warning on process ' .. tostring( Proc.Id) .. ' not found any pocket or tool'
-- EgtOutLog( sErr)
-- return false, sErr
--end
---- eseguo la svuotatura della faccia principale
--local tvtNx = {}
--tvtNx[2] = vtN
--local bOk, sWarn = MakePocket( Proc, nPartId, ptC, tvtNx, nFacInd, sMchFind, sPocketing, dFacElev, 'PockTCone')
--if not bOk then return false, sWarn end
return true, sWarn
end