Compare commits

...

14 Commits

Author SHA1 Message Date
luca.mazzoleni a548c26eed Merge branch 'develop' into BugFix/Approx3EdgesFaces 2022-12-13 09:49:43 +01:00
luca.mazzoleni 3b46a5b285 BugFix/Approx3EdgesFaces:
- in freeContour aggiunta la funzione Is3EdgesApprox per riconoscere come 3 lati anche facce con lati aggiuntivi molto corti (<15 mm)
2022-12-13 09:48:53 +01:00
luca.mazzoleni 3bf3ba3b43 Improvement/SideMillGreater90:
- piccole correzioni e miglioramenti
2022-12-06 12:41:47 +01:00
luca.mazzoleni d236b19d6a Improvement/SideMillGreater90:
- piccola correzione
2022-12-02 18:35:46 +01:00
luca.mazzoleni b62b694112 Improvement/SideMillGreater90:
- Corretto calcolo profondità per lavorazione verticale con angolo ottuso
2022-12-02 18:10:17 +01:00
SaraP ade9d3ffe9 DataWall :
- nel nesting aggiunto controllo sul diametro dei fori
- in FlipAndRot corretto controllo sulle rotazioni.
2022-12-02 17:58:39 +01:00
luca.mazzoleni b2f1645322 Improvement/SideMillGreater90:
- aggiunto ripasso lato inclinato anche per svuotatura
2022-12-02 15:38:04 +01:00
luca.mazzoleni 5023887f2e Improvement/SideMillGreater90:
- aggiunto warning per lapjoint da sotto con angolo ottuso non completata
2022-12-01 16:08:15 +01:00
luca.mazzoleni d37e4bdf8d Improvement/SideMillGreater90: - in lapjoint, per 2 facce con angolo > 90°, implementata lavorazione principale verticale; per quelle dall'alto si fa anche finitura del lato inclinato 2022-12-01 11:46:50 +01:00
SaraP 6ccbc4f0cd DataWall :
- nel nesting corretta la rimozione dei parametri Q.
2022-11-30 15:00:44 +01:00
luca.mazzoleni 9babfe01f3 Merge remote-tracking branch 'origin/HEAD' into develop 2022-11-29 09:29:40 +01:00
DarioS 4c6d40ee11 DataWall :
- taglio lama quasi orizzontale ora viene fatto con svuotatura
- LapJoint con lama massima inclinazione 60deg
2022-11-25 15:37:58 +01:00
DarioS e07a1d63cb DataWall :
- in nesting migliorati controlli esistenza dati
- in controllo spessori per inserimento in pannello si usa tolleranza di 0.1 (prima era 0.01) come in EgtBeamWall.
2022-11-25 09:40:34 +01:00
luca.mazzoleni be4df143e4 Merge branch 'BugFix/SideGrooveMaxElevation' into develop 2022-09-30 12:51:04 +02:00
7 changed files with 333 additions and 222 deletions
+1 -1
View File
@@ -358,7 +358,7 @@ if bToProcess then
local vWallErr = {} local vWallErr = {}
for i = 2, #vWall do for i = 2, #vWall do
local dDimH = vWall[i].Box:getDimZ() local dDimH = vWall[i].Box:getDimZ()
if abs( dDimH - dRawH) > 10 * GEO.EPS_SMALL then if abs( dDimH - dRawH) > 100 * GEO.EPS_SMALL then
table.insert( vWallErr, i) table.insert( vWallErr, i)
end end
end end
+1 -1
View File
@@ -56,7 +56,7 @@ function WMachiningLib.FindMilling( sType, dDepth, sTuuid, nTool_ID, dMaxDiam, d
local Milling = Millings[i] local Milling = Millings[i]
if Milling.On and Milling.Type == sType and SetCurrMachiningAndTool( Milling.Name) then if Milling.On and Milling.Type == sType and SetCurrMachiningAndTool( Milling.Name) then
local nMchType = EgtMdbGetCurrMachiningParam( MCH_MP.TYPE) local nMchType = EgtMdbGetCurrMachiningParam( MCH_MP.TYPE)
local sMyTuuid = EgtGetMachiningParam( MCH_MP.TUUID) local sMyTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID)
local dTMaxMat = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT) local dTMaxMat = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT)
local dTMaxDepth = EgtIf( WD.MILL_MAX_DEPTH_AS_MAT, dTMaxMat, EgtTdbGetCurrToolMaxDepth()) local dTMaxDepth = EgtIf( WD.MILL_MAX_DEPTH_AS_MAT, dTMaxMat, EgtTdbGetCurrToolMaxDepth())
local dTDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) local dTDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM)
+10 -4
View File
@@ -1,4 +1,4 @@
-- WProcessCut.lua by Egaltech s.r.l. 2020/11/13 -- WProcessCut.lua by Egaltech s.r.l. 2020/11/25
-- Gestione calcolo taglio di testa o longitudinale per Pareti -- Gestione calcolo taglio di testa o longitudinale per Pareti
-- Tabella per definizione modulo -- Tabella per definizione modulo
@@ -8,6 +8,7 @@ local WPC = {}
require( 'EgtBase') require( 'EgtBase')
local WL = require( 'WallLib') local WL = require( 'WallLib')
local FreeContour = require( 'WProcessFreeContour') local FreeContour = require( 'WProcessFreeContour')
local LapJoint = require( 'WProcessLapJoint')
EgtOutLog( ' WProcessCut started', 1) EgtOutLog( ' WProcessCut started', 1)
@@ -29,7 +30,7 @@ function WPC.Classify( Proc, b3Raw)
-- verifico abbia una sola faccia -- verifico abbia una sola faccia
if Proc.Fct ~= 1 then return false end if Proc.Fct ~= 1 then return false end
-- controllo la normale -- controllo la normale
local ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, 0, GDB_ID.ROOT) local vtN = EgtSurfTmFacetNormVersor( Proc.Id, 0, GDB_ID.ROOT)
if vtN:getZ() < - 0.5 then return false end if vtN:getZ() < - 0.5 then return false end
return true return true
end end
@@ -41,7 +42,7 @@ function WPC.FlipClassify( Proc)
-- verifico abbia una sola faccia -- verifico abbia una sola faccia
if Proc.Fct ~= 1 then return 0, 0 end if Proc.Fct ~= 1 then return 0, 0 end
-- controllo la normale -- controllo la normale
local ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, 0, GDB_ID.ROOT) local vtN = EgtSurfTmFacetNormVersor( Proc.Id, 0, GDB_ID.ROOT)
local vtNZ = vtN:getZ() local vtNZ = vtN:getZ()
if vtNZ > - GEO.EPS_SMALL then if vtNZ > - GEO.EPS_SMALL then
nFlip0 = 100 nFlip0 = 100
@@ -67,7 +68,12 @@ end
--------------------------------------------------------------------- ---------------------------------------------------------------------
-- Applicazione della lavorazione -- Applicazione della lavorazione
function WPC.Make( Proc, nRawId, b3Raw) function WPC.Make( Proc, nRawId, b3Raw)
return FreeContour.Make( Proc, nRawId, b3Raw) local vtN = EgtSurfTmFacetNormVersor( Proc.Id, 0, GDB_ID.ROOT)
if vtN :getZ() > 0.866 then
return LapJoint.Make( Proc, nRawId, b3Raw)
else
return FreeContour.Make( Proc, nRawId, b3Raw)
end
end end
--------------------------------------------------------------------- ---------------------------------------------------------------------
+31 -1
View File
@@ -12,6 +12,7 @@
-- 2022/04/26 Migliorata gestione caso pocketing. -- 2022/04/26 Migliorata gestione caso pocketing.
-- 2022/08/05 Aggiunta segnalazione aree vietate non gestite. -- 2022/08/05 Aggiunta segnalazione aree vietate non gestite.
-- 2022/08/29 Corretta gestione tipo Pocket senza fondo (sono lavorabili da entrambe le parti con fresatura). -- 2022/08/29 Corretta gestione tipo Pocket senza fondo (sono lavorabili da entrambe le parti con fresatura).
-- 2022/12/13 Aggiunta la funzione Is3EdgesApprox per riconoscere come 3 lati anche facce con lati aggiuntivi molto corti (<15 mm)
-- Tabella per definizione modulo -- Tabella per definizione modulo
local WPF = {} local WPF = {}
@@ -1233,6 +1234,33 @@ local function GetMaxDepth( vtNz, dMillDiam, dDiamTh, dMaxDepth, dFreeLen)
end end
end end
---------------------------------------------------------------------
-- Funzione per determinare se la faccia ha lati molto corti (trascurabili) ed è quindi approssimabile ad una 3 facce
local function Is3EdgesApprox( Proc, nFacet, nAddGrpId)
local bResult = false
local nContourId = EgtExtractSurfTmFacetLoops( Proc.Id, nFacet, nAddGrpId)
EgtMergeCurvesInCurveCompo( nContourId)
-- recupero il numero effettivo di lati
local _, nEntityCount = EgtCurveDomain( nContourId)
local nEdges = nEntityCount
if nContourId then
if nEntityCount and nEntityCount == 3 then
bResult = true
-- rimuovo i lati molto corti dal conteggio totale
elseif nEntityCount then
for i = 1, nEntityCount do
local dLength = EgtCurveCompoLength( nContourId, i - 1)
if dLength < 15 then nEdges = nEdges - 1 end
end
end
if nEdges == 3 then bResult = true end
end
if bResult == true then
EgtOutLog( 'FreeContour : Face with ' .. tointeger( nEntityCount) .. ' edges skipped (approx 3 edges)')
end
return bResult
end
--------------------------------------------------------------------- ---------------------------------------------------------------------
local function AddMillings( sMilling, vFace, Proc, nRawId, b3Raw, nConeCut, nAddGrpId) local function AddMillings( sMilling, vFace, Proc, nRawId, b3Raw, nConeCut, nAddGrpId)
-- flag per fresature non passanti -- flag per fresature non passanti
@@ -1358,8 +1386,10 @@ local function AddMillings( sMilling, vFace, Proc, nRawId, b3Raw, nConeCut, nAdd
return 0, sErr return 0, sErr
end end
end end
-- verifico se la faccia ha alcuni lati molto corti e può essere approssimata ad una 3 lati
local bIs3EdgesApprox = Is3EdgesApprox( Proc, vFace[i].Fac, nAddGrpId)
-- se tutta la faccia o la sua fine senza taglio, inserisco una fresatura -- se tutta la faccia o la sua fine senza taglio, inserisco una fresatura
if ( vFace[i].Type & 2) ~= 0 or ( vFace[i].Type == 4 and vFace[i].Edges > 3) then if ( vFace[i].Type & 2) ~= 0 or ( vFace[i].Type == 4 and ( vFace[i].Edges > 3 and not bIs3EdgesApprox)) then
-- inserisco la lavorazione -- inserisco la lavorazione
local sName = 'Free_' .. ( EgtGetName( Proc.PartId) or tostring( Proc.PartId)) local sName = 'Free_' .. ( EgtGetName( Proc.PartId) or tostring( Proc.PartId))
local nMchId = EgtAddMachining( sName, sMilling) local nMchId = EgtAddMachining( sName, sMilling)
+179 -121
View File
@@ -1,4 +1,4 @@
-- WProcessLapJoint.lua by Egaltech s.r.l. 2022/02/04 -- WProcessLapJoint.lua by Egaltech s.r.l. 2022/11/15
-- Gestione calcolo mezzo-legno per Pareti -- Gestione calcolo mezzo-legno per Pareti
-- 2021/08/27 DS Se tre o più facce con flag PCKT=1 forzo svuotatura con fresa (per Variant). -- 2021/08/27 DS Se tre o più facce con flag PCKT=1 forzo svuotatura con fresa (per Variant).
-- 2021/08/29 DS Se svuotatura di fianco setto flag per farla dopo i tagli. -- 2021/08/29 DS Se svuotatura di fianco setto flag per farla dopo i tagli.
@@ -10,6 +10,8 @@
-- 2022/02/03 DS Gorge larga come gambo più sicurezza. -- 2022/02/03 DS Gorge larga come gambo più sicurezza.
-- 2022/02/04 DS In svuotatura aggiunta gestione WD.MAXDIAM_POCK_CORNER in presenza di almeno un angolo interno. -- 2022/02/04 DS In svuotatura aggiunta gestione WD.MAXDIAM_POCK_CORNER in presenza di almeno un angolo interno.
-- 2022/09/30 In MakeSideGrooveByMill sistemato il calcolo del massimo sottosquadro dell'utensile per determinare la fattibilità della tasca. -- 2022/09/30 In MakeSideGrooveByMill sistemato il calcolo del massimo sottosquadro dell'utensile per determinare la fattibilità della tasca.
-- 2022/11/15 DS Con lama massima inclinazione 60deg.
-- 2022/12/01 Per 2 facce con angolo > 90° implementata lavorazione principale verticale. Se da sopra, aggiunta ripresa del lato inclinato.
-- Tabella per definizione modulo -- Tabella per definizione modulo
local WPL = {} local WPL = {}
@@ -113,7 +115,7 @@ function WPL.Classify( Proc, b3Raw)
vtN[1] = EgtSurfTmFacetNormVersor( Proc.Id, 0, GDB_ID.ROOT) vtN[1] = EgtSurfTmFacetNormVersor( Proc.Id, 0, GDB_ID.ROOT)
vtN[2] = EgtSurfTmFacetNormVersor( Proc.Id, 1, GDB_ID.ROOT) vtN[2] = EgtSurfTmFacetNormVersor( Proc.Id, 1, GDB_ID.ROOT)
-- verifico se è lavorabile da sopra o di fianco -- verifico se è lavorabile da sopra o di fianco
return ( vtN[1]:getZ() >= - 0.01 or vtN[2]:getZ() >= - 0.01) return ( vtN[1]:getZ() >= - 0.028 or vtN[2]:getZ() >= - 0.028)
-- se più di 2 facce -- se più di 2 facce
else else
local nFacInd, dElev, nFacInd2, dElev2 = WL.GetFaceWithMostAdj( Proc.Id, Proc.PartId) local nFacInd, dElev, nFacInd2, dElev2 = WL.GetFaceWithMostAdj( Proc.Id, Proc.PartId)
@@ -1374,10 +1376,18 @@ local function MakeByMill( Proc, nFacet, nOthFac, nRawId, b3Raw, dSideDist)
end end
--------------------------------------------------------------------- ---------------------------------------------------------------------
local function MakeSideGrooveByMill( Proc, nFacet, nRawId, b3Raw, sCustomMach, dMaxDepthOnSide, bEnablePreMill, bMachFromDn, dAng, bAsEnablePreMill, nSinglePass) local function MakeSideGrooveByMill( Proc, nFacet, nRawId, b3Raw, sCustomMach, dMaxDepthOnSide, bEnablePreMill, bMachFromDn, dAng, bAsEnablePreMill, nSinglePass, bExcludeFinishing)
-- dati della faccia local sWarn
-- dati della faccia principale (la più verticale)
local ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, nFacet, GDB_ID.ROOT) local ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, nFacet, GDB_ID.ROOT)
local dElev = WL.GetFaceElevation( Proc.Id, nFacet, nRawId) local dElev = WL.GetFaceElevation( Proc.Id, nFacet, nRawId)
-- dati della faccia più orizzontale
local nOtherFacet = abs( nFacet - 1)
local vtN2 = EgtSurfTmFacetNormVersor( Proc.Id, nOtherFacet, GDB_ID.ROOT)
local dElevOtherFacet = WL.GetFaceElevation( Proc.Id, nOtherFacet, nRawId)
-- se lap joint 2 facce dal basso e angolo negativo
local bExcludeSideMill = Proc.Fct == 2 and vtN:getZ() < -0.01 and vtN2:getZ() < -0.01
-- dimensioni della faccia principale
local _, dH, dV = EgtSurfTmFacetMinAreaRectangle( Proc.Id, nFacet, GDB_ID.ROOT) local _, dH, dV = EgtSurfTmFacetMinAreaRectangle( Proc.Id, nFacet, GDB_ID.ROOT)
local dThick = min( dH, dV) local dThick = min( dH, dV)
local frFace = Frame3d( ptC, vtN) local frFace = Frame3d( ptC, vtN)
@@ -1792,121 +1802,129 @@ local function MakeSideGrooveByMill( Proc, nFacet, nRawId, b3Raw, sCustomMach, d
end end
end end
end end
-- inserisco la lavorazione di ribasso o gola
local sName = EgtIf( bEnablePreMill ~= nil, 'SideMill_', 'Mill_') .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) local dStepOri
local nMchFId = EgtAddMachining( sName, sMilling) if not bExcludeSideMill then
if not nMchFId then -- inserisco la lavorazione di ribasso o gola
local sErr = 'Error adding machining ' .. sName .. '-' .. sMilling local sName = EgtIf( bEnablePreMill ~= nil, 'SideMill_', 'Mill_') .. ( EgtGetName( Proc.Id) or tostring( Proc.Id))
EgtOutLog( sErr) local nMchFId = EgtAddMachining( sName, sMilling)
return false, sErr if not nMchFId then
end local sErr = 'Error adding machining ' .. sName .. '-' .. sMilling
EgtSetInfo( nMchFId, 'Part', Proc.PartId) EgtOutLog( sErr)
-- se ho abilitato la lavorazione di lama per garantire passaggio utensile, setto la nota per spostare la fresatura dopo i tagli di lama return false, sErr
if bEnablePreMill or bAsEnablePreMill then
EgtSetInfo( nMchFId, 'MOVE_AFTER', 1)
end
-- aggiungo geometria
EgtSetMachiningGeometry( {{ Proc.Id, nFacet}})
-- imposto posizione braccio porta testa
--local nSCC = MCH_SCC.ADIR_ZP
--if abs( vtN:getZ()) < GEO.EPS_SMALL then
-- nSCC = EgtIf( Proc.Box:getDimX() >= Proc.Box:getDimY(), MCH_SCC.ADIR_YP, MCH_SCC.ADIR_XP)
--end
local nSCC = MCH_SCC.ADIR_NEAR
EgtSetMachiningParam( MCH_MP.SCC, nSCC)
-- imposto modo di lavorare la faccia
local nFaceUse = WL.GetNearestParalOpposite( Z_AX(), vtN)
EgtSetMachiningParam( MCH_MP.FACEUSE, nFaceUse)
-- imposto elevazione e step
local dStep = EgtGetMachiningParam( MCH_MP.STEP)
if dStep < GEO.EPS_SMALL then dStep = 0.75 * dMaxMat end
local nStep = ceil( ( dThick - dMaxMat) / dStep)
dStep = max( ( dThick - dMaxMat) / max( nStep, 1), 0)
local dMaxElev = max( ( nStep + 1) * dStep - GEO.EPS_SMALL, 0)
if nSinglePass and nSinglePass > 0 then
dStep = 0
if nSinglePass == 1 then
EgtSetMachiningParam( MCH_MP.DEPTH, dMaxMat)
end end
end EgtSetInfo( nMchFId, 'Part', Proc.PartId)
EgtSetMachiningParam( MCH_MP.STEP, dStep) -- se ho abilitato la lavorazione di lama per garantire passaggio utensile, setto la nota per spostare la fresatura dopo i tagli di lama
EgtSetMachiningParam( MCH_MP.USERNOTES, 'MaxElev=' .. EgtNumToString( dMaxElev, 3) .. ';') if bEnablePreMill or bAsEnablePreMill then
-- setto il lato di lavoro standard EgtSetInfo( nMchFId, 'MOVE_AFTER', 1)
EgtSetMachiningParam( MCH_MP.INVERT, true) end
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.LEFT) -- aggiungo geometria
-- modifico ingressi e uscita EgtSetMachiningGeometry( {{ Proc.Id, nFacet}})
-- se ho inserito il pretaglio modifico -- imposto posizione braccio porta testa
if bEnablePreMill or bAsEnablePreMill then --local nSCC = MCH_SCC.ADIR_ZP
if nModifyLeadInOut > 0 then --if abs( vtN:getZ()) < GEO.EPS_SMALL then
-- Confronto il raggio fresa con l'elevazione dalla normale per vedere se devo modificare l'uscita -- nSCC = EgtIf( Proc.Box:getDimX() >= Proc.Box:getDimY(), MCH_SCC.ADIR_YP, MCH_SCC.ADIR_XP)
if dElev > ( 0.5 * dMillDiam) then --end
if nModifyLeadInOut == 1 then local nSCC = MCH_SCC.ADIR_NEAR
-- setto il tipo di passo a una via EgtSetMachiningParam( MCH_MP.SCC, nSCC)
EgtSetMachiningParam( MCH_MP.STEPTYPE, MCH_MILL_ST.ONEWAY) -- imposto modo di lavorare la faccia
-- modifico il tipo di uscita local nFaceUse = WL.GetNearestParalOpposite( Z_AX(), vtN)
EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, MCH_MILL_LO.PERP_TG) EgtSetMachiningParam( MCH_MP.FACEUSE, nFaceUse)
-- imposto elevazione e step
local dStep = EgtGetMachiningParam( MCH_MP.STEP)
dStepOri = dStep
if dStep < GEO.EPS_SMALL then dStep = 0.75 * dMaxMat end
local nStep = ceil( ( dThick - dMaxMat) / dStep)
dStep = max( ( dThick - dMaxMat) / max( nStep, 1), 0)
local dMaxElev = max( ( nStep + 1) * dStep - GEO.EPS_SMALL, 0)
if nSinglePass and nSinglePass > 0 then
dStep = 0
if nSinglePass == 1 then
EgtSetMachiningParam( MCH_MP.DEPTH, dMaxMat)
end
end
EgtSetMachiningParam( MCH_MP.STEP, dStep)
EgtSetMachiningParam( MCH_MP.USERNOTES, 'MaxElev=' .. EgtNumToString( dMaxElev, 3) .. ';')
-- setto il lato di lavoro standard
EgtSetMachiningParam( MCH_MP.INVERT, true)
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.LEFT)
-- modifico ingressi e uscita
-- se ho inserito il pretaglio modifico
if bEnablePreMill or bAsEnablePreMill then
if nModifyLeadInOut > 0 then
-- Confronto il raggio fresa con l'elevazione dalla normale per vedere se devo modificare l'uscita
if dElev > ( 0.5 * dMillDiam) then
if nModifyLeadInOut == 1 then
-- setto il tipo di passo a una via
EgtSetMachiningParam( MCH_MP.STEPTYPE, MCH_MILL_ST.ONEWAY)
-- modifico il tipo di uscita
EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, MCH_MILL_LO.PERP_TG)
EgtSetMachiningParam( MCH_MP.LIPERP, 0)
-- modifico dati supplementari uscita
EgtSetMachiningParam( MCH_MP.LOPERP, 0.5)
EgtSetMachiningParam( MCH_MP.LOTANG, -( dLongGorge + dExtraLongIni + dExtraLongEnd))
else
EgtSetMachiningParam( MCH_MP.LIPERP, dElev)
EgtSetMachiningParam( MCH_MP.LOPERP, dElev)
end
end
-- setto allungamenti iniziali e finali
EgtSetMachiningParam( MCH_MP.STARTADDLEN, dExtraLongIni)
EgtSetMachiningParam( MCH_MP.ENDADDLEN, dExtraLongEnd)
if bInvertMach then
-- setto il lato di lavoro invertito
EgtSetMachiningParam( MCH_MP.INVERT, false)
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.RIGHT)
end
else
-- setto allungamenti iniziali e finali
EgtSetMachiningParam( MCH_MP.STARTADDLEN, dExtraLongIni)
EgtSetMachiningParam( MCH_MP.ENDADDLEN, dExtraLongEnd)
-- Confronto il raggio fresa con l'elevazione dalla normale per vedere se devo modificare l'uscita
if dElev > ( 0.5 * dMillDiam) then
-- setto allungamenti perpendicolari
EgtSetMachiningParam( MCH_MP.LIPERP, 0) EgtSetMachiningParam( MCH_MP.LIPERP, 0)
-- modifico dati supplementari uscita EgtSetMachiningParam( MCH_MP.LOPERP, 0)
EgtSetMachiningParam( MCH_MP.LOPERP, 0.5) end
EgtSetMachiningParam( MCH_MP.LOTANG, -( dLongGorge + dExtraLongIni + dExtraLongEnd)) end
else -- se richiesto, setto la nota per spostare la lavorazione alla fine
EgtSetMachiningParam( MCH_MP.LIPERP, dElev) if not WD.SIDEMILL_BEFORE then
EgtSetMachiningParam( MCH_MP.LOPERP, dElev) EgtSetInfo( nMchFId, 'MOVE_AFTER', 1)
end
else
if nModifyLeadInOut > 0 then
-- Confronto il raggio fresa con l'elevazione dalla normale per vedere se devo modificare l'uscita
if dElev > ( 0.5 * dMillDiam) then
-- setto il tipo di passo a una via
EgtSetMachiningParam( MCH_MP.STEPTYPE, 1)
end
if bInvertMach then
-- setto il lato di lavoro invertito
EgtSetMachiningParam( MCH_MP.INVERT, false)
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.RIGHT)
end end
end end
-- setto allungamenti iniziali e finali -- setto allungamenti iniziali e finali
EgtSetMachiningParam( MCH_MP.STARTADDLEN, dExtraLongIni) EgtSetMachiningParam( MCH_MP.STARTADDLEN, dExtraLongIni)
EgtSetMachiningParam( MCH_MP.ENDADDLEN, dExtraLongEnd) EgtSetMachiningParam( MCH_MP.ENDADDLEN, dExtraLongEnd)
if bInvertMach then -- se richiesto, setto la nota per spostare la lavorazione alla fine
-- setto il lato di lavoro invertito if not WD.SIDEMILL_BEFORE then
EgtSetMachiningParam( MCH_MP.INVERT, false) EgtSetInfo( nMchFId, 'MOVE_AFTER', 1)
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.RIGHT)
end
else
-- setto allungamenti iniziali e finali
EgtSetMachiningParam( MCH_MP.STARTADDLEN, dExtraLongIni)
EgtSetMachiningParam( MCH_MP.ENDADDLEN, dExtraLongEnd)
-- Confronto il raggio fresa con l'elevazione dalla normale per vedere se devo modificare l'uscita
if dElev > ( 0.5 * dMillDiam) then
-- setto allungamenti perpendicolari
EgtSetMachiningParam( MCH_MP.LIPERP, 0)
EgtSetMachiningParam( MCH_MP.LOPERP, 0)
end end
end end
-- se richiesto, setto la nota per spostare la lavorazione alla fine -- eseguo
if not WD.SIDEMILL_BEFORE then if not EgtApplyMachining( true, false) then
EgtSetInfo( nMchFId, 'MOVE_AFTER', 1) local _, sErr = EgtGetLastMachMgrError()
EgtSetOperationMode( nMchFId, false)
return false, sErr
end end
else else
if nModifyLeadInOut > 0 then sWarn = 'Warning in LapJoint : upside down groove with obtuse angle not completed'
-- Confronto il raggio fresa con l'elevazione dalla normale per vedere se devo modificare l'uscita EgtOutLog( sWarn)
if dElev > ( 0.5 * dMillDiam) then
-- setto il tipo di passo a una via
EgtSetMachiningParam( MCH_MP.STEPTYPE, 1)
end
if bInvertMach then
-- setto il lato di lavoro invertito
EgtSetMachiningParam( MCH_MP.INVERT, false)
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.RIGHT)
end
end
-- setto allungamenti iniziali e finali
EgtSetMachiningParam( MCH_MP.STARTADDLEN, dExtraLongIni)
EgtSetMachiningParam( MCH_MP.ENDADDLEN, dExtraLongEnd)
-- se richiesto, setto la nota per spostare la lavorazione alla fine
if not WD.SIDEMILL_BEFORE then
EgtSetInfo( nMchFId, 'MOVE_AFTER', 1)
end
end
-- eseguo
if not EgtApplyMachining( true, false) then
local _, sErr = EgtGetLastMachMgrError()
EgtSetOperationMode( nMchFId, false)
return false, sErr
end end
-- verifico se devo lavorare anche la seconda faccia basandomi sul valore dell'angolo interno -- verifico se devo lavorare anche la seconda faccia basandomi sul valore dell'angolo interno
if dAng and dAng > -90 + 10 * GEO.EPS_SMALL then if dAng and dAng > -90 + 10 * GEO.EPS_SMALL and not bExcludeFinishing then
local nOtherFacet = abs( nFacet - 1)
-- inserisco la lavorazione di contornatura -- inserisco la lavorazione di contornatura
local sName = 'Mill_Oth_Fac_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) local sName = 'Mill_Oth_Fac_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id))
local nMchFId = EgtAddMachining( sName, sMilling) local nMchFId = EgtAddMachining( sName, sMilling)
@@ -1919,7 +1937,6 @@ local function MakeSideGrooveByMill( Proc, nFacet, nRawId, b3Raw, sCustomMach, d
-- aggiungo geometria -- aggiungo geometria
EgtSetMachiningGeometry( {{ Proc.Id, nOtherFacet}}) EgtSetMachiningGeometry( {{ Proc.Id, nOtherFacet}})
-- imposto posizione braccio porta testa -- imposto posizione braccio porta testa
local vtN2 = EgtSurfTmFacetNormVersor( Proc.Id, nOtherFacet, GDB_ID.ROOT)
local nSCC = MCH_SCC.ADIR_ZP local nSCC = MCH_SCC.ADIR_ZP
if AreSameOrOppositeVectorApprox( vtN2, Z_AX()) then if AreSameOrOppositeVectorApprox( vtN2, Z_AX()) then
nSCC = EgtIf( Proc.Box:getDimX() >= Proc.Box:getDimY(), MCH_SCC.ADIR_YP, MCH_SCC.ADIR_XP) nSCC = EgtIf( Proc.Box:getDimX() >= Proc.Box:getDimY(), MCH_SCC.ADIR_YP, MCH_SCC.ADIR_XP)
@@ -1927,12 +1944,22 @@ local function MakeSideGrooveByMill( Proc, nFacet, nRawId, b3Raw, sCustomMach, d
EgtSetMachiningParam( MCH_MP.SCC, nSCC) EgtSetMachiningParam( MCH_MP.SCC, nSCC)
-- imposto modo di lavorare la faccia -- imposto modo di lavorare la faccia
EgtSetMachiningParam( MCH_MP.FACEUSE, nFace2ndFace) EgtSetMachiningParam( MCH_MP.FACEUSE, nFace2ndFace)
EgtSetMachiningParam( MCH_MP.STEP, 0)
local dMaxElev = dMaxMat local dMaxElev = dMaxMat
local dStepOtherFace = 0
local dDepthOtherFace = dMaxMat
if Proc.Fct == 2 and abs( vtN2:getZ()) > 0.99 and abs( vtN2:getZ()) < 1.01 then
dStepOtherFace = dStepOri or EgtGetMachiningParam( MCH_MP.STEP)
if dStepOtherFace < GEO.EPS_SMALL then dStepOtherFace = 0.75 * dMaxMat end
local nStepOtherFace = ceil( ( dElevOtherFacet - dMaxMat) / dStepOtherFace)
dStepOtherFace = max( ( dElevOtherFacet - dMaxMat) / max( nStepOtherFace, 1), 0)
dMaxElev = max( ( nStepOtherFace + 1) * dStepOtherFace - GEO.EPS_SMALL, 0)
dDepthOtherFace = dElevOtherFacet
end
EgtSetMachiningParam( MCH_MP.STEP, dStepOtherFace)
EgtSetMachiningParam( MCH_MP.USERNOTES, 'MaxElev=' .. EgtNumToString( dMaxElev, 3) .. ';') EgtSetMachiningParam( MCH_MP.USERNOTES, 'MaxElev=' .. EgtNumToString( dMaxElev, 3) .. ';')
if bMachFromDn then if bMachFromDn then
EgtSetMachiningParam( MCH_MP.INVERT, true) EgtSetMachiningParam( MCH_MP.INVERT, true)
EgtSetMachiningParam( MCH_MP.DEPTH, dMaxMat) EgtSetMachiningParam( MCH_MP.DEPTH, dDepthOtherFace)
else else
EgtSetMachiningParam( MCH_MP.INVERT, false) EgtSetMachiningParam( MCH_MP.INVERT, false)
end end
@@ -1978,7 +2005,7 @@ local function MakeSideGrooveByMill( Proc, nFacet, nRawId, b3Raw, sCustomMach, d
end end
end end
-- se richiesto, setto la nota per spostare la lavorazione alla fine -- se richiesto, setto la nota per spostare la lavorazione alla fine
if not WD.SIDEMILL_BEFORE then if bEnablePreMill or bAsEnablePreMill or not WD.SIDEMILL_BEFORE then
EgtSetInfo( nMchFId, 'MOVE_AFTER', 1) EgtSetInfo( nMchFId, 'MOVE_AFTER', 1)
end end
else else
@@ -2012,9 +2039,12 @@ local function MakeSideGrooveByMill( Proc, nFacet, nRawId, b3Raw, sCustomMach, d
EgtSetOperationMode( nMchFId, false) EgtSetOperationMode( nMchFId, false)
return false, sErr return false, sErr
end end
elseif bExcludeSideMill then
local sErr = 'Feature not machinable by orientation'
EgtOutLog( sErr)
return false, sErr
end end
return true, sWarn
return true
end end
--------------------------------------------------------------------- ---------------------------------------------------------------------
@@ -2027,6 +2057,10 @@ local function MakeByPocketing( Proc, nFacet, nRawId, b3Raw, bCheckQPar)
-- gruppo ausiliario -- gruppo ausiliario
local nAddGrpId = WL.GetAddGroup( Proc.PartId) local nAddGrpId = WL.GetAddGroup( Proc.PartId)
local nNewProc, nNumFacet = RemoveBottomFaceAndReorder( Proc, nAddGrpId, nFacet) local nNewProc, nNumFacet = RemoveBottomFaceAndReorder( Proc, nAddGrpId, nFacet)
-- se una sola faccia
if Proc.Fct == 1 then
dDiam = 2 * dDiam
end
-- se forma ad L -- se forma ad L
local bIsL = ( Proc.Fct == 2 or TestElleShape3( Proc.Id, Proc.Fct) or TestElleShape4( Proc.Id, Proc.Fct) == 2) local bIsL = ( Proc.Fct == 2 or TestElleShape3( Proc.Id, Proc.Fct) or TestElleShape4( Proc.Id, Proc.Fct) == 2)
if bIsL then if bIsL then
@@ -2067,8 +2101,9 @@ local function MakeByPocketing( Proc, nFacet, nRawId, b3Raw, bCheckQPar)
local dMillDiam = 20 local dMillDiam = 20
local dMaxDepth = 0 local dMaxDepth = 0
local dThDiam = 100 local dThDiam = 100
local sTuuid
if EgtMdbSetCurrMachining( sPocketing) then if EgtMdbSetCurrMachining( sPocketing) then
local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID)
if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then
dMillDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dMillDiam dMillDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dMillDiam
dMaxDepth = EgtIf( WD.MILL_MAX_DEPTH_AS_MAT, EgtTdbGetCurrToolParam( MCH_TP.MAXMAT), EgtTdbGetCurrToolMaxDepth()) or dMaxDepth dMaxDepth = EgtIf( WD.MILL_MAX_DEPTH_AS_MAT, EgtTdbGetCurrToolParam( MCH_TP.MAXMAT), EgtTdbGetCurrToolMaxDepth()) or dMaxDepth
@@ -2135,7 +2170,7 @@ local function MakeByPocketing( Proc, nFacet, nRawId, b3Raw, bCheckQPar)
else else
EgtErase( nNewProc) EgtErase( nNewProc)
end end
return true, sWarn return true, sWarn, sTuuid
end end
--------------------------------------------------------------------- ---------------------------------------------------------------------
@@ -2313,11 +2348,12 @@ local function MakeTwoFaces( Proc, nRawId, b3Raw)
EgtOutLog( sErr) EgtOutLog( sErr)
return false, sErr return false, sErr
end end
local vtN = EgtSurfTmFacetNormVersor( Proc.Id, nFacInd, GDB_ID.ROOT) local vtNTemp = EgtSurfTmFacetNormVersor( Proc.Id, nFacInd, GDB_ID.ROOT)
local dSideDist local dSideDist
local ptMid = ( ptP1 + ptP2) / 2 local ptMid = ( ptP1 + ptP2) / 2
-- faccia orizzontale -- faccia orizzontale
local nFacet = EgtIf( vtN:getZ() >= WD.NZ_MINA, nFacInd, nFacInd2) local nFacet = EgtIf( vtNTemp:getZ() >= WD.NZ_MINA, nFacInd, nFacInd2)
local vtN = EgtSurfTmFacetNormVersor( Proc.Id, nFacet, GDB_ID.ROOT)
-- faccia verticale -- faccia verticale
local nFacetVert = EgtIf( nFacet == nFacInd, nFacInd2, nFacInd) local nFacetVert = EgtIf( nFacet == nFacInd, nFacInd2, nFacInd)
local vtNV = EgtSurfTmFacetNormVersor( Proc.Id, nFacetVert, GDB_ID.ROOT) local vtNV = EgtSurfTmFacetNormVersor( Proc.Id, nFacetVert, GDB_ID.ROOT)
@@ -2369,8 +2405,13 @@ local function MakeTwoFaces( Proc, nRawId, b3Raw)
if bEnableMillOnSide and dMaxDepthOnSide > 0 then if bEnableMillOnSide and dMaxDepthOnSide > 0 then
bLikeAsMakeFirstGroove = false bLikeAsMakeFirstGroove = false
return MakeSideGrooveByMill( Proc, nFacetVert, nRawId, b3Raw, EgtIf( bEnableMillOnSide and dMaxDepthOnSide, sMillOnSide, nil), dMaxDepthOnSide, bMakeFirstGroove, bMachFromDn, dAng, bLikeAsMakeFirstGroove) return MakeSideGrooveByMill( Proc, nFacetVert, nRawId, b3Raw, EgtIf( bEnableMillOnSide and dMaxDepthOnSide, sMillOnSide, nil), dMaxDepthOnSide, bMakeFirstGroove, bMachFromDn, dAng, bLikeAsMakeFirstGroove)
elseif MakeByMill( Proc, nFacet, 1 - nFacet, nRawId, b3Raw, dSideDist) then else
return true local bOk, sErr = MakeByMill( Proc, nFacet, 1 - nFacet, nRawId, b3Raw, dSideDist)
-- se angolo ottuso riprendo il lato quasi verticale
if bOk and dAng and dAng > -90 + 10 * GEO.EPS_SMALL then
local bOk2, sErr2 = MakeSideGrooveByMill( Proc, nFacetVert, nRawId, b3Raw, EgtIf( bEnableMillOnSide and dMaxDepthOnSide, sMillOnSide, nil), dMaxDepthOnSide, bMakeFirstGroove, bMachFromDn, dAng, false, nil, true)
end
return bOk, sErr
end end
elseif bEnableMillOnSide and dMaxDepthOnSide > 0 then elseif bEnableMillOnSide and dMaxDepthOnSide > 0 then
bLikeAsMakeFirstGroove = true bLikeAsMakeFirstGroove = true
@@ -2378,9 +2419,27 @@ local function MakeTwoFaces( Proc, nRawId, b3Raw)
if bOk then return true end if bOk then return true end
end end
-- se non inclinate o capacità di taglio non sufficiente o non molto grandi (80mm), provo con contornatura o svuotatura -- se non inclinate o capacità di taglio non sufficiente o non molto grandi (80mm), provo con contornatura o svuotatura
if not sCutting or dSawMaxDepth < dDimY[1] + WD.CUT_SIC or dSawMaxDepth < dDimY[2] + WD.CUT_SIC or dDimY[1] < 80 or dDimY[2] < 80 then if vtN:getZ() > 0.866 or vtNV:getZ() > 0.866 or not sCutting or dSawMaxDepth < dDimY[1] + WD.CUT_SIC or dSawMaxDepth < dDimY[2] + WD.CUT_SIC or dDimY[1] < 80 or dDimY[2] < 80 then
-- eseguo la svuotatura -- eseguo la svuotatura
return MakeByPocketing( Proc, nFacet, nRawId, b3Raw) local bOk, sErr, sTuuid = MakeByPocketing( Proc, nFacet, nRawId, b3Raw)
-- se angolo ottuso riprendo il lato quasi verticale
if bOk and dAng and dAng > -90 + 10 * GEO.EPS_SMALL then
local _, dHVert, dVVert = EgtSurfTmFacetMinAreaRectangle( Proc.Id, nFacetVert, GDB_ID.ROOT)
local dDepth = min( dHVert, dVVert)
local _, dHHor, dVHor = EgtSurfTmFacetMinAreaRectangle( Proc.Id, nFacet, GDB_ID.ROOT)
local dDiam = 2 * min( dHHor, dVHor)
local sMillObtuseAngle = WM.FindMilling( 'FreeContour', dDepth, sTuuid, nil, dDiam, nil, nil, nil)
if not sMillObtuseAngle then
sMillObtuseAngle = WM.FindMilling( 'FreeContour', dDepth, nil, nil, dDiam, nil, nil, nil)
end
if not sMillObtuseAngle then
local sErrMillNotFound = 'Error : Processing to finish obtuse angle not found in library'
EgtOutLog( sErrMillNotFound)
return true, sErrMillNotFound
end
local bOk2, sErr2 = MakeSideGrooveByMill( Proc, nFacetVert, nRawId, b3Raw, sMillObtuseAngle, dMaxDepthOnSide, bMakeFirstGroove, bMachFromDn, dAng, false, nil, true)
end
return bOk, sErr
end end
-- se una delle due facce rivolta verso il basso -- se una delle due facce rivolta verso il basso
elseif vtN[1]:getZ() < -0.001 or vtN[2]:getZ() < -0.001 then elseif vtN[1]:getZ() < -0.001 or vtN[2]:getZ() < -0.001 then
@@ -2538,7 +2597,6 @@ local function MakeMoreFaces( Proc, nRawId, b3Raw)
local sErr = 'Side milling not possible' local sErr = 'Side milling not possible'
EgtOutLog( sErr) EgtOutLog( sErr)
return true, sErr return true, sErr
end end
-- fessura verticale -- fessura verticale
elseif Proc.Stype == 3 then elseif Proc.Stype == 3 then
+6 -5
View File
@@ -349,16 +349,17 @@ if not bManualRot then
local nRotateOpt = 0 local nRotateOpt = 0
if #RotateFeatureStates > 0 then if #RotateFeatureStates > 0 then
-- calcolo lato con punteggio minore o molteplicita' piu' alta -- calcolo lato con punteggio minore o molteplicita' piu' alta
local nRotMax = 0 local nRotMax = MinList[1].Rot
local nScoreMax = 0 local nScoreMax = MinList[1].Score
local nScoreCnt = 0 local nScoreCnt = MinList[1].ScoreCnt
for nInd = 1, #MinList do for nInd = 2, #MinList do
if MinList[nInd].Score > nScoreMax then if MinList[nInd].Score > nScoreMax then
nRotMax = MinList[nInd].Rot nRotMax = MinList[nInd].Rot
nScoreMax = MinList[nInd].Score nScoreMax = MinList[nInd].Score
nScoreCnt = MinList[nInd].ScoreCnt nScoreCnt = MinList[nInd].ScoreCnt
elseif MinList[nInd].Score == nScoreMax then elseif MinList[nInd].Score == nScoreMax then
if MinList[nInd].ScoreCnt > nScoreCnt then -- se punteggio > 0 conservo quello con molteplicità più alta, se punteggio = 0 conservo quello con molteplicità più bassa
if ( nScoreMax ~= 0 and MinList[nInd].ScoreCnt > nScoreCnt) or ( nScoreMax == 0 and MinList[nInd].ScoreCnt < nScoreCnt) then
nRotMax = MinList[nInd].Rot nRotMax = MinList[nInd].Rot
nScoreMax = MinList[nInd].Score nScoreMax = MinList[nInd].Score
nScoreCnt = MinList[nInd].ScoreCnt nScoreCnt = MinList[nInd].ScoreCnt
+105 -89
View File
@@ -1,4 +1,4 @@
-- NestProcess.lua by Egaltech s.r.l. 2022/06/23 -- NestProcess.lua by Egaltech s.r.l. 2022/11/24
-- Gestione nesting automatico pareti -- Gestione nesting automatico pareti
-- Intestazioni -- Intestazioni
@@ -509,80 +509,84 @@ local function ClassifyDrillsOnLateralFaces( nPartId, dMinSheetWidth)
local vPartProc = WE.CollectFeatures( nPartId) local vPartProc = WE.CollectFeatures( nPartId)
for nInd = 1, #vPartProc do repeat for nInd = 1, #vPartProc do repeat
if Drill.Identify( vPartProc[nInd]) then if Drill.Identify( vPartProc[nInd]) then
-- identifico su quali facce si trova il foro -- identifico su quali facce si trova il foro
local bOpen = ( vPartProc[nInd].Fcs ~= 0 and vPartProc[nInd].Fce ~= 0) local bOpen = ( vPartProc[nInd].Fcs ~= 0 and vPartProc[nInd].Fce ~= 0)
local AuxId = EgtGetInfo( vPartProc[nInd].Id, 'AUXID', 'i') or 0 local AuxId = EgtGetInfo( vPartProc[nInd].Id, 'AUXID', 'i') or 0
if AuxId then AuxId = AuxId + vPartProc[nInd].Id end if AuxId then AuxId = AuxId + vPartProc[nInd].Id end
if not AuxId or EgtGetType( AuxId) ~= GDB_TY.CRV_ARC then break end if not AuxId or EgtGetType( AuxId) ~= GDB_TY.CRV_ARC then break end
local ptDrill = EgtCP( AuxId, GDB_RT.GLOB) -- verifico se diametro compatibile con la punta
local dLen = abs( EgtCurveThickness( AuxId)) local dDiam = 2 * EgtArcRadius( AuxId)
local bLong = dLen > WD.HOR_DRILL_LEN - 1 if abs( dDiam - WD.HOR_DRILL_DIAM) < WD.DRILL_TOL + GEO.EPS_SMALL then
local bOnlyOnRef = dLen + dDeltaRaw > WD.HOR_DRILL_LEN - GEO.EPS_SMALL and not bLong local ptDrill = EgtCP( AuxId, GDB_RT.GLOB)
local dLen = abs( EgtCurveThickness( AuxId))
-- faccia Front local bLong = dLen > WD.HOR_DRILL_LEN - 1
local dTol = GEO.EPS_SMALL local bOnlyOnRef = dLen + dDeltaRaw > WD.HOR_DRILL_LEN - GEO.EPS_SMALL and not bLong
if ( abs( ptDrill:getY() - ptPartMin:getY()) < dTol) then
DrillOnFaces.F.nbr = DrillOnFaces.F.nbr + 1
if bOnlyOnRef then DrillOnFaces.F.OnlyOnRef = true end
if bOpen then
DrillOnFaces.B.nbr = DrillOnFaces.B.nbr + 1
if bOnlyOnRef then DrillOnFaces.B.OnlyOnRef = true end
else
DrillOnFaces.F.closed = true
end
if bLong then
DrillOnFaces.F.long = true
if bOpen then DrillOnFaces.B.long = true end
end
-- faccia Back -- faccia Front
elseif ( abs( ptDrill:getY() - ptPartMax:getY()) < dTol) then local dTol = GEO.EPS_SMALL
DrillOnFaces.B.nbr = DrillOnFaces.B.nbr + 1 if ( abs( ptDrill:getY() - ptPartMin:getY()) < dTol) then
if bOnlyOnRef then DrillOnFaces.B.OnlyOnRef = true end
if bOpen then
DrillOnFaces.F.nbr = DrillOnFaces.F.nbr + 1 DrillOnFaces.F.nbr = DrillOnFaces.F.nbr + 1
if bOnlyOnRef then DrillOnFaces.F.OnlyOnRef = true end if bOnlyOnRef then DrillOnFaces.F.OnlyOnRef = true end
else if bOpen then
DrillOnFaces.B.closed = true DrillOnFaces.B.nbr = DrillOnFaces.B.nbr + 1
end if bOnlyOnRef then DrillOnFaces.B.OnlyOnRef = true end
if bLong then else
DrillOnFaces.B.long = true DrillOnFaces.F.closed = true
if bOpen then DrillOnFaces.F.long = true end
end end
if bLong then
-- faccia Left DrillOnFaces.F.long = true
elseif ( abs( ptDrill:getX() - ptPartMin:getX()) < dTol) then if bOpen then DrillOnFaces.B.long = true end
DrillOnFaces.L.nbr = DrillOnFaces.L.nbr + 1 end
if bOnlyOnRef then DrillOnFaces.L.OnlyOnRef = true end
if bOpen then -- faccia Back
DrillOnFaces.R.nbr = DrillOnFaces.R.nbr + 1 elseif ( abs( ptDrill:getY() - ptPartMax:getY()) < dTol) then
if bOnlyOnRef then DrillOnFaces.R.OnlyOnRef = true end DrillOnFaces.B.nbr = DrillOnFaces.B.nbr + 1
else if bOnlyOnRef then DrillOnFaces.B.OnlyOnRef = true end
DrillOnFaces.L.closed = true if bOpen then
end DrillOnFaces.F.nbr = DrillOnFaces.F.nbr + 1
if bOnlyOnRef then DrillOnFaces.F.OnlyOnRef = true end
else
DrillOnFaces.B.closed = true
end
if bLong then if bLong then
DrillOnFaces.L.long = true DrillOnFaces.B.long = true
if bOpen then DrillOnFaces.R.long = true end if bOpen then DrillOnFaces.F.long = true end
end end
-- faccia Right -- faccia Left
elseif ( abs( ptDrill:getX() - ptPartMax:getX()) < dTol) then elseif ( abs( ptDrill:getX() - ptPartMin:getX()) < dTol) then
DrillOnFaces.R.nbr = DrillOnFaces.R.nbr + 1 DrillOnFaces.L.nbr = DrillOnFaces.L.nbr + 1
if bOnlyOnRef then DrillOnFaces.R.OnlyOnRef = true end
if bOpen then
DrillOnFaces.L.nbr = DrillOnFaces.L.nbr + 1
if bOnlyOnRef then DrillOnFaces.L.OnlyOnRef = true end if bOnlyOnRef then DrillOnFaces.L.OnlyOnRef = true end
else if bOpen then
DrillOnFaces.R.closed = true DrillOnFaces.R.nbr = DrillOnFaces.R.nbr + 1
end if bOnlyOnRef then DrillOnFaces.R.OnlyOnRef = true end
if bLong then else
DrillOnFaces.R.long = true DrillOnFaces.L.closed = true
if bOpen then DrillOnFaces.L.long = true end end
if bLong then
DrillOnFaces.L.long = true
if bOpen then DrillOnFaces.R.long = true end
end
-- faccia Right
elseif ( abs( ptDrill:getX() - ptPartMax:getX()) < dTol) then
DrillOnFaces.R.nbr = DrillOnFaces.R.nbr + 1
if bOnlyOnRef then DrillOnFaces.R.OnlyOnRef = true end
if bOpen then
DrillOnFaces.L.nbr = DrillOnFaces.L.nbr + 1
if bOnlyOnRef then DrillOnFaces.L.OnlyOnRef = true end
else
DrillOnFaces.R.closed = true
end
if bLong then
DrillOnFaces.R.long = true
if bOpen then DrillOnFaces.L.long = true end
end
end end
end end
end end
until true until true
@@ -1574,33 +1578,33 @@ local function AddParts(RawParts, vPartsDoneManually)
end end
nOutline, nCnt = EgtGetSurfTmSilhouette( SolidId, Z_AX(), 10, nOutlineLayer, GDB_RT.GLOB) nOutline, nCnt = EgtGetSurfTmSilhouette( SolidId, Z_AX(), 10, nOutlineLayer, GDB_RT.GLOB)
EgtBeamShowSolid( nPartId, false) EgtBeamShowSolid( nPartId, false)
for nInd = 0, nCnt - 1 do for nInd = 0, nCnt - 1 do
EgtSetName( nOutline + nInd, 'ON_TMP') EgtSetName( nOutline + nInd, 'ON_TMP')
EgtSetStatus( nOutline + nInd, 0) EgtSetStatus( nOutline + nInd, 0)
end end
local nCurrOutline = nOutline local nCurrOutline = nOutline
if nCnt > 0 then if nCnt > 0 then
local frSum local frSum
EgtScale( nOutline, GLOB_FRM(), 1, 1, 0, GDB_RT.GLOB) EgtScale( nOutline, GLOB_FRM(), 1, 1, 0, GDB_RT.GLOB)
EgtModifyCurveExtrusion( nOutline, Z_AX(), GDB_RT.GLOB) EgtModifyCurveExtrusion( nOutline, Z_AX(), GDB_RT.GLOB)
-- verifico che la prima curva sia l'unico loop esterno -- verifico che la prima curva sia l'unico loop esterno
local vCrvRef = EgtCurveArea( nOutline) local vtCrvRefN = EgtCurveArea( nOutline)
for nInd = 1, nCnt - 1 do for nInd = 1, nCnt - 1 do
local vCrv = EgtCurveArea( nOutline + nInd) local vtCrvN = EgtCurveArea( nOutline + nInd)
-- se trovo più loop esterni uso come contorno quello del box (quindi forzo nCurrOutline a nil) -- se trovo più loop esterni uso come contorno quello del box (quindi forzo nCurrOutline a nil)
if abs( vCrv * vCrvRef - 1) < GEO.EPS_SMALL then if vtCrvN and vtCrvRefN and AreSameVectorApprox( vtCrvN, vtCrvRefN) then
nCurrOutline = nil nCurrOutline = nil
for nInd2 = 0, nCnt - 1 do for nInd2 = 0, nCnt - 1 do
EgtErase( nOutline + nInd2) EgtErase( nOutline + nInd2)
end end
nCnt = 1 nCnt = 1
break break
end end
end end
--local frSum = EgtSurfFlatRegion(nOutlineLayer, nOutline) --local frSum = EgtSurfFlatRegion(nOutlineLayer, nOutline)
--EgtSaveFile("c:\\Temp\\ProvaNesting.nge") --EgtSaveFile("c:\\Temp\\ProvaNesting.nge")
-- -- per ogni contorno creo flat region e le sommo -- -- per ogni contorno creo flat region e le sommo
@@ -1626,7 +1630,7 @@ local function AddParts(RawParts, vPartsDoneManually)
-- EgtErase(nOutline + nIndex) -- EgtErase(nOutline + nIndex)
-- end -- end
end end
if nCurrOutline and nCurrOutline ~= GDB_ID.NULL then if nCurrOutline and nCurrOutline ~= GDB_ID.NULL then
nOutline = nCurrOutline nOutline = nCurrOutline
else else
@@ -1769,11 +1773,11 @@ local function AddParts(RawParts, vPartsDoneManually)
end end
-- aggiungo finestre -- aggiungo finestre
for nInd = 1, nCnt - 1 do for nInd = 1, nCnt - 1 do
local tmp1, tmp2, area = EgtCurveArea( nOutline + nInd) local _, _, dArea = EgtCurveArea( nOutline + nInd)
if area > WD.NEST_HOLE_MIN_AREA then if dArea and dArea > WD.NEST_HOLE_MIN_AREA then
EgtModifyCurveExtrusion( nOutline + nInd, Z_AX(), GDB_RT.GLOB) EgtModifyCurveExtrusion( nOutline + nInd, Z_AX(), GDB_RT.GLOB)
EgtAutoNestAddHoleToPart( nPartId, nOutline + nInd) EgtAutoNestAddHoleToPart( nPartId, nOutline + nInd)
end end
end end
-- aggiungo aree di lavorazione del pezzo -- aggiungo aree di lavorazione del pezzo
@@ -2177,21 +2181,33 @@ if bNestingOk then
end end
end end
-- se è lap joint dall'alto -- se è lap joint dall'alto
if nFaceInd ~= -1 and nFaceDownInd == -1 then if nFaceInd ~= -1 and nFaceDownInd == -1 then
local bResetQ = false
local ptCen = EgtSurfTmFacetCenter( Proc.Id, nFaceInd, GDB_ID.ROOT) local ptCen = EgtSurfTmFacetCenter( Proc.Id, nFaceInd, GDB_ID.ROOT)
-- se all'interno rimuovo info Q -- se all'interno rimuovo info Q
if EnclosesPointXY( b3Raw, ptCen) then if EnclosesPointXY( b3Raw, ptCen) then
bResetQ = true
elseif Proc.Fct == 2 then
-- se non è interno ma ha 2 facce non ortogonali rimuovo info Q
local vtN1 = EgtSurfTmFacetNormVersor( Proc.Id, 0, GDB_ID.ROOT)
local vtN2 = EgtSurfTmFacetNormVersor( Proc.Id, 1, GDB_ID.ROOT)
if abs( vtN1 * vtN2) > GEO.EPS_SMALL then
bResetQ = true
end
end
if bResetQ then
-- resetto parametro Q -- resetto parametro Q
if Proc.Prc == 30 then if Proc.Prc == 30 then
EgtRemoveInfo( Proc.Id, "Q08") EgtRemoveInfo( Proc.Id, "Q08")
EgtRemoveInfo( Proc.Id, "Q08A") EgtRemoveInfo( Proc.Id, "Q08A")
else else
EgtRemoveInfo( Proc.Id, "Q03") EgtRemoveInfo( Proc.Id, "Q03")
EgtRemoveInfo( Proc.Id, "Q03A") EgtRemoveInfo( Proc.Id, "Q03A")
end end
end end
end end
elseif DoubleCut.Identify( Proc) then elseif DoubleCut.Identify( Proc) then
-- verifico se due facce e rivolto verso l'alto -- verifico se due facce e rivolto verso l'alto
if Proc.Fct == 2 then if Proc.Fct == 2 then