DataBeam :
- correzioni su LapJoint.
This commit is contained in:
+90
-31
@@ -1,4 +1,4 @@
|
||||
-- ProcessLapJoint.lua by Egaltech s.r.l. 2020/08/24
|
||||
-- ProcessLapJoint.lua by Egaltech s.r.l. 2020/08/28
|
||||
-- Gestione calcolo mezzo-legno per Travi
|
||||
-- 2019/10/08 Agg. gestione OpenPocket.
|
||||
|
||||
@@ -324,6 +324,44 @@ local function GetTunnelDimension( Proc, nPartId)
|
||||
return dDimMin, dDimMax, dDepth, vtOrtho, nLongIdFace, nSurfInt
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function GetFaceAdj( Proc, nFacInd, dH, dV, bOutLog)
|
||||
|
||||
-- Recupero le facce adiacenti alla principale
|
||||
local vAdj = EgtSurfTmFacetAdjacencies( Proc.Id, nFacInd)[1]
|
||||
if not vAdj or #vAdj == 0 then
|
||||
local sErr = 'Error : main face without adjacencies'
|
||||
return -1, sErr
|
||||
end
|
||||
if bOutLog then
|
||||
EgtOutLog( 'Adjac=' .. table.concat( vAdj, ','), 3)
|
||||
end
|
||||
-- Riordino le dimensioni per avere dH > dV
|
||||
if dH < dV then
|
||||
dH, dV = dV, dH
|
||||
end
|
||||
-- Cerco una faccia adiacente alla principale sul lato lungo
|
||||
local nFacAdj
|
||||
for i = 1, #vAdj do
|
||||
if vAdj[i] >= 0 then
|
||||
local _, ptP1, ptP2, _ = EgtSurfTmFacetsContact( Proc.Id, nFacInd, vAdj[i], GDB_ID.ROOT)
|
||||
local dLen = dist( ptP1, ptP2)
|
||||
if dLen > 0.5 * dH then
|
||||
nFacAdj = vAdj[i]
|
||||
if bOutLog then
|
||||
EgtOutLog( string.format( 'Adjac=%d Len=%.3f H=%.3f V=%.3f', vAdj[i], dLen, dH, dV), 3)
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
if not nFacAdj then
|
||||
local sErr = 'Error : main face without long adjacent face'
|
||||
return -1, sErr
|
||||
end
|
||||
return nFacAdj
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- Verifica se feature di testa
|
||||
function ProcessLapJoint.IsHeadFeature( Proc, b3Raw, dCurrOvmH)
|
||||
@@ -517,6 +555,9 @@ function ProcessLapJoint.Classify( Proc, b3Raw)
|
||||
else
|
||||
-- dati della faccia
|
||||
local ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, nFacInd, GDB_ID.ROOT)
|
||||
-- cerco se c'è faccia adiacente
|
||||
local nFaceAdj = GetFaceAdj( Proc, nFacInd, dH, dV)
|
||||
local bIsL = ( Proc.Fct == 2 or TestElleShape3( Proc) or TestElleShape4( Proc) == 2)
|
||||
-- verifico se è lavorabile solo dal basso
|
||||
local bDown = ( vtN:getZ() < BD.NZ_MINA)
|
||||
-- se verso il basso, verifico se utilizzabile seconda faccia
|
||||
@@ -524,6 +565,18 @@ function ProcessLapJoint.Classify( Proc, b3Raw)
|
||||
if nFacInd2 and dElev2 < 2 * dElev then
|
||||
local ptC2, vtN2 = EgtSurfTmFacetCenter( Proc.Id, nFacInd2, GDB_ID.ROOT)
|
||||
bDown = ( vtN2:getZ() < BD.NZ_MINB)
|
||||
elseif not nFacInd2 and bIsL and nFaceAdj > 0 then
|
||||
local ptC2, vtN2 = EgtSurfTmFacetCenter( Proc.Id, nFaceAdj, GDB_ID.ROOT)
|
||||
bDown = ( vtN2:getZ() < BD.NZ_MINB)
|
||||
end
|
||||
-- verifico se la faccia principale è sottosquadra, ha forma L e anche la faccia adiacente
|
||||
elseif vtN:getZ() < -10 * GEO.EPS_SMALL and bIsL and nFaceAdj > 0 then
|
||||
-- box del pezzo
|
||||
local b3Solid = EgtGetBBoxGlob( EgtGetFirstNameInGroup( nPartId, 'Box') or GDB_ID.NULL, GDB_BB.STANDARD)
|
||||
-- se il numero di facce > 2 or il box della feature supera una certa distanza dalle teste allora controllo la z della faccia ausiiaria
|
||||
if Proc.Fct > 2 or ( Proc.Box:getMax():getX() < b3Solid:getMin():getX() - 150) or ( Proc.Box:getMin():getX() > b3Solid:getMax():getX() + 150) then
|
||||
local ptC2, vtN2 = EgtSurfTmFacetCenter( Proc.Id, nFaceAdj, GDB_ID.ROOT)
|
||||
bDown = ( vtN2:getZ() < BD.NZ_MINB)
|
||||
end
|
||||
end
|
||||
return true, bDown
|
||||
@@ -821,33 +874,9 @@ end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function MakeByMill( Proc, nPhase, nRawId, nPartId, nFacInd, rfFac, dH, dV, dElev, bSpecialApp, sMillMaster, nFacInd2, dFacElev2)
|
||||
-- Recupero le facce adiacenti alla principale
|
||||
local vAdj = EgtSurfTmFacetAdjacencies( Proc.Id, nFacInd)[1]
|
||||
if not vAdj or #vAdj == 0 then
|
||||
local sErr = 'Error : main face without adjacencies'
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
EgtOutLog( 'Adjac=' .. table.concat( vAdj, ','), 3)
|
||||
-- Riordino le dimensioni per avere dH > dV
|
||||
if dH < dV then
|
||||
dH, dV = dV, dH
|
||||
end
|
||||
-- Cerco una faccia adiacente alla principale sul lato lungo
|
||||
local nFacAdj
|
||||
for i = 1, #vAdj do
|
||||
if vAdj[i] >= 0 then
|
||||
local _, ptP1, ptP2, _ = EgtSurfTmFacetsContact( Proc.Id, nFacInd, vAdj[i], GDB_ID.ROOT)
|
||||
local dLen = dist( ptP1, ptP2)
|
||||
if dLen > 0.5 * dH then
|
||||
nFacAdj = vAdj[i]
|
||||
EgtOutLog( string.format( 'Adjac=%d Len=%.3f H=%.3f V=%.3f', vAdj[i], dLen, dH, dV), 3)
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
if not nFacAdj then
|
||||
local sErr = 'Error : main face without long adjacent face'
|
||||
local nFacAdj, sErr = GetFaceAdj( Proc, nFacInd, dH, dV, true)
|
||||
if nFacAdj < 0 then
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
@@ -893,7 +922,7 @@ local function MakeByMill( Proc, nPhase, nRawId, nPartId, nFacInd, rfFac, dH, dV
|
||||
else
|
||||
sMilling = ML.FindMilling( 'LongSmallCut')
|
||||
if not sMilling then
|
||||
local sErr = 'Error : milling not found in library'
|
||||
sErr = 'Error : milling not found in library'
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
@@ -919,7 +948,7 @@ local function MakeByMill( Proc, nPhase, nRawId, nPartId, nFacInd, rfFac, dH, dV
|
||||
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
|
||||
sErr = 'Error adding machining ' .. sName .. '-' .. sMilling
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
@@ -966,7 +995,7 @@ local function MakeByMill( Proc, nPhase, nRawId, nPartId, nFacInd, rfFac, dH, dV
|
||||
end
|
||||
-- eseguo
|
||||
if not EgtApplyMachining( true, false) then
|
||||
local _, sErr = EgtGetLastMachMgrError()
|
||||
_, sErr = EgtGetLastMachMgrError()
|
||||
EgtSetOperationMode( nMchFId, false)
|
||||
return false, sErr
|
||||
end
|
||||
@@ -3111,13 +3140,14 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, bSinglePart)
|
||||
end
|
||||
-- altrimenti lavorazione di svuotatura o contornatura
|
||||
else
|
||||
local bUseOtherFace
|
||||
-- se orientata verso il basso, verifico l'alternativa
|
||||
if vtN:getZ() < BD.NZ_MINA and nFacInd2 then
|
||||
ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, nFacInd2, GDB_ID.ROOT)
|
||||
nFacInd, nFacInd2 = nFacInd2, nFacInd
|
||||
dFacElev, dFacElev2 = dFacElev2, dFacElev
|
||||
bUseOtherFace = true
|
||||
end
|
||||
rfFac, dH, dV = EgtSurfTmFacetMinAreaRectangle( Proc.Id, nFacInd, GDB_ID.ROOT)
|
||||
-- verifico non sia orientata verso il basso
|
||||
local bFaceOk = ( vtN:getZ() >= BD.NZ_MINA)
|
||||
if not bFaceOk then
|
||||
@@ -3125,6 +3155,35 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, bSinglePart)
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
rfFac, dH, dV = EgtSurfTmFacetMinAreaRectangle( Proc.Id, nFacInd, GDB_ID.ROOT)
|
||||
-- se forma a L e la componente in X è maggiore di 60° allora verifico se posso utilizzare la faccia secondaria
|
||||
if bIsL and abs( vtN:getX()) > 0.866 then
|
||||
-- se non ho scambiato la faccia
|
||||
if not bUseOtherFace then
|
||||
if nFacInd2 then
|
||||
ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, nFacInd2, GDB_ID.ROOT)
|
||||
nFacInd, nFacInd2 = nFacInd2, nFacInd
|
||||
dFacElev, dFacElev2 = dFacElev2, dFacElev
|
||||
-- altrimenti cerco la faccia secondaria per adiacenza alla principale
|
||||
else
|
||||
-- Cerco una faccia adiacente alla principale sul lato lungo
|
||||
local nFacAdj, sErr = GetFaceAdj( Proc, nFacInd, dH, dV)
|
||||
if nFacAdj < 0 then
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
nFacInd = nFacAdj
|
||||
dFacElev = BL.GetFaceElevation( Proc.Id, nFacInd)
|
||||
ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, nFacInd, GDB_ID.ROOT)
|
||||
rfFac, dH, dV = EgtSurfTmFacetMinAreaRectangle( Proc.Id, nFacInd, GDB_ID.ROOT)
|
||||
end
|
||||
-- altrimenti se ho già cambiato faccia do errore per impossibilità di lavorazione
|
||||
else
|
||||
local sErr = 'Error : impossible to machine by side angle too big that cause collision'
|
||||
EgtOutLog( sErr)
|
||||
return false, sErr
|
||||
end
|
||||
end
|
||||
-- eventuali tagli preliminari
|
||||
do
|
||||
local bOk, sErr = MakePreCuts( Proc, nPhase, nRawId, nPartId, b3Raw, nChamfer)
|
||||
|
||||
Reference in New Issue
Block a user