Files
datadoors/Machining_4.lua
Dario Sassi b8df81d05d DataDoors 2.7f4 :
- sulla linea con due macchine la seconda usa sempre i riferimenti standard e non quelli piccoli.
2025-06-21 10:16:58 -04:00

4640 lines
222 KiB
Lua

--
-- EEEEEEEEEE GGGGGG wwww wwww
-- EEEEEEEEEE GGGGGGGGGG wwww wwww
-- EEEE GGGG GGGG wwww wwww wwww
-- EEEE GGGG wwww wwww wwww
-- EEEEEEE GGGG GGGGGGG wwww wwwwww wwww
-- EEEEEEE GGGG GGGGGGG wwww wwwwww wwww
-- EEEE GGGG GGGG wwww wwwwwwww wwww
-- EEEE GGGG GGGG wwww wwww wwww wwww
-- EEEEEEEEEE GGGGGGGGGG wwwwwwww wwwwwwww
-- EEEEEEEEEE GGGGGG wwwwwww wwwwwww
--
-- by EgalWare s.r.l. 10/07/2016
-- Machining generation for Doors program machine Multiax Cxxxx
-- 2017.06.01 V1.011 FM Manage machining optimization
-- 2017.06.13 V1.012 FM Fix bug on calculate box and row piece
-- 2017.06.30 V1.013 FM Manage optimization and assignement of more paths to one machining
-- 2017.11.17 V1.014 FM Add manage parameter dExtraThruDepth from CurrCamInfo for functions AdjustThrouIsle and AdjustVertHole
-- 2017.12.07 V1.014 FM Change hinge shuttle assignement with 3 hinges: 60% always on shuttle near door reference, now V1.3
-- 2017.12.08 V1.015 FM Manage two new probe pointposition , before and after the hinge/pivot to probe always on left of hinge (according to disposition)
-- 2017.12.16 V1.016 FM Change the percentage of shuttle assignement to variable dPercentDoorLength (by Adam L. requests)
-- 2017.12.28 V1.016 FM Set note about hinge side machining
-- 2017.12.28 V1.016 FM Set note about hinge side profile
-- 2017.12.28 V1.016 FM Set note about door shift on Y with hinge not machined profile on reference
-- 2017.12.28 V1.016 FM Set note about door probe error on hinge not machined profile on reference
-- 2017.12.28 V1.016 FM Set note about lock side machining
-- 2018.02.26 V1.0b1 FM Manage door dimension checking
-- 2018.05.17 V1.0b2 FM Calculate the solid box without extra surfaces
-- 2018.10.18 V1.0b3 FM Manage better setting the disposition parameter on Inactive door with opposite bevel profiles
-- 2018.10.23 V1.0b4 FM Manage rough machining
-- 2019.01.14 V1.0b5 FM Manage new CurrCamInfo parameter (nGenCncAsDdfName) to set
-- which name generate the cnc file (by default as parameter sDoorCode or as ddf file name)
-- 2019.01.23 V1.0b6 FM Not generate machining on Group 0 (of MTable ordered table) and print warning message into repot files.
-- 2019.01.24 V1.0b7 FM Extend cases to machine with AdjustHeadChisel operation,
-- use new settings to use with this extended operation: NO_WORK_UPSQUARE, CHISEL_ONLY_HORZNT
-- 2019.03.27 V1.0b8 FM Manage check door/jamb dimension by function CheckPieceDimension
-- 2019.03.27 V1.0b9 FM Fix error on calculation bar disposition and menage better into CheckPieceDimension by shift door values
-- 2019.03.27 V1.0b9 FM Modify error messages format into CheckPieceDimension
-- 2019.03.27 V1.0c1 FM Manage estimate time
-- 2019.03.29 V1.0c2 FM Manage Edge break (EB) and Bevel Edge break (BVEB) profiles
-- 2019.04.08 V1.0c3 FM Manage Blade groove machinings with lead-in lead-out to reduce MTABLE lines
-- Now it uses 1 line for antisplint blade and 1 line for normal blade
-- 2019.04.08 V1.0c3 FM Manage Blade groove function AdjustBladeVertCurve
-- 2019.04.30 v1.0c4 FM Manage function AdjustASplintWithBlade to manage anti-splint paths when machine groove by blade
-- 2019.04.30 v1.0c4 FM Manage function AdjustHeadOnASplint to manage hinge anti-splint paths when machine groove by blade
-- 2019.05.28 v1.0c5 FM Fix problem on update all machining after reorder, now use EgtApplyAllMachinings instead of EgtUpdateAllMachinings
-- 2019.07.22 V1.0c7 FM Manage better the updoor/underdoor machinings counter that generate flags values
-- 2019.08.27 V1.0c8 FM Manage underneath machining checking (by machining note 'UD_CHECK') to disable vacuums
-- (use new underneath distance by variable dDistInterferUnder)
-- 2019.11.05 V1.0c9 FM Manage setup files
-- 2020.03.19 V1.0d0 FM Fix error on check door dimension into CheckPieceDimension (when door is shifted by Bullnose profile on hinge side)
-- 2021.03.18 V1.0d1 FM Add new variables to CurrCamInfo that was managed inside this (dVacOffsY, dMobOffsY, dLeftDistX, dRightDistX, MaxOverMat, StepOverMat)
-- 2021.04.06 V1.0d1 FM Fix error on rename lock profile with _LK suffix
-- 2021.04.07 V1.0d2 FM Manage new CurrCamInfo parameter (ForceDirMachHinge) to force the hinge machining direction (descending or ascending)
-- 2021.04.20 V1.0d3 FM Manage new CurrCamInfo parameter (MaxPosMobBar) to limit the mobile ba to a max value with wide door
-- 2021.05.03 V2.101 FM Manage simulation in background to verify collisions, if something collide, not generate CNC program
-- 2021.05.04 V2.102 FM Manage new CurrCamInfo parameter (nDisableAutoCncName) to disable the automatic cnc name composed when generate cnc by GENERATE button
-- to have always the same cnc file name
-- 2021.05.21 V2.103 FM Manage new CurrCamInfo parameter (EnableCollisionDetect) to manage the collision detection
-- 2021.10.13 V2.104 FM Add variables from CurrCamInfo for define safeety zone around pods
-- 2021.10.26 V2.104 FM Manage FD Wedge Cup (FDWC) profile
-- 2021.10.28 V2.105 FM Fix internal error when calculate Box with STANDARD parameter, now it uses EXACT parameter
-- 2021.11.23 V2.107 FM Manage option side probing. Expand function number of CurrDoorCustomData DGC.Pms: 3 side probe on all hardware (for NE machines) ;
-- 4: side probe on all hardware except hardware on hinge side (for machines with shuttles)
-- 2022.01.17 V2.108 FM Manage Split door cut by new CurrCamInfo parameter sCutDirectionAdmitted: = 'H' for cut along door Height;
-- = 'W' for cut along door Width
-- 2022.05.03 V2.109 FM use table paremeter tMainTabPar.NVP instead of variable bNoVertProf. This allow to unify Machining_4 and Machinin_8 processor
-- 2022.11.15 V2.112 FM Manage side groove region as throu path and not as blind region
-- 2023.01.20 V2.114 FM Modification to use compiled code
-- 2023.03.07 V2.115 FM Fix error on manage region into StartVacVerify function
-- 2023.03.29 V2.116 FM Fix error on calculate rough paths on Convex profile
-- 2023.03.31 V1.117 FM Manage offsetted path ( by path note) to extra path of Convex profile
-- 2023.04.03 V2.118 FM Manage Scrap piece removing
-- 2023.05.12 V2.119 FM Manage virtual milling option into collision avoid check
-- 2023.05.24 V2.120 FM Manage by new function AdjustVertAsOnHeads to modify anti split paths (of door heads) to be vertical on bevelled sides
-- 2023.09.07 V2.121 FM Manage new file .tok (it's a copy of .txt file) to say Dprod when the generation is finished
-- 2023.09.15 V2.122 FM Write shift value note OffSetPhase...
-- 2023.09.16 V2.123 FM Manage invert paths on convex profile when door is dispose bevel up
-- 2023.09.19 V2.124 FM Modify door disposition: if door has top or bottom trimmed side, dispose the door on right reference
-- 2023.12.01 V2.125 FM Manage small planes on Convex profile
-- 2024.01.31 V2.126 FM Manage also door disposition (by SideDoorDefined CurrCamInfo parameter) with lock side on front to be machined by shuttle/s
-- 2024.06.07 V2.127 FM Manage also to mark some geometries to work with shuttles or aggregates ( Five lakes machines)
-- 2024.06.19 V2.128 FM Manage disposition of same door on 2 different machines ( Five lakes machines) and dispose on 2nd table
-- considering the side machinings on 1st machine
-- 2024.06.19 V2.128 FM Manage new DGD.GHT to let with suffix '_HIDE' or '_2HIDE' to manage the machining geometries on different machines (Five lakes machines)
-- 2024.06.21 V2.128 FM Add parameter to AdjustHead to set clockwise paths
-- 2024.08.28 V2.129 FM Manage new DeleteSideProbePathOnSide CurrCamInfo parameter. this parameter must woth with DGC.Pms = 3 and delete the side probe paths
-- on Hinge side or lock side (to be used with machines on line wehre shuttle can be on hinge side or lock side)
-- 2024.08.30 V2.130 FM Manage better the side probe paths and machinings when it use only one machine and when use both machines
-- 2024.09.04 V2.131 FM Manage new dAltRefShort and dTallRefShort CurrCamInfo parameters. This parameter manage the tall reference and thickness reference on short reference type
-- 2024.10.09 V2.132 FM Manage AdjustProbeHole operation to manage Probe on Z
-- 2024.10.15 V2.133 FM Manage new DGC.NPM parameter (NewProbeMean) to indicate new DGD.PROBE meaning
-- 2024.10.15 V2.133 FM Check the real number of machinings and insert this info in the output
-- 2024.11.06 V2.134 FM Manage the % use shuttle from new MainTabPar.PS3H (.PercentUseShtlWith3Hrdw) and .PUSR (.PercentUseShuttleFromRef)
-- If theese paramenters are not present it uses old values inside
-- 2024.11.14 V2.135 FM Manage the flipping geometry into AdjustConeCleanPaths from solid layer than geometry
-- 2025.01.13 V2.136 FM Manage special command found (by variable bSpecialCommandFound) to generate the part program with special command Px
-- 2025.01.17 V2.137 FM Manage parametr from ini file to enable disable the machining with Mtable 'Link' parameter
-- 2025.01.28 V2.138 FM Manage better the error messages printing when .Link parameter is active
-- 2025.02.21 V3.020 DS Corretta assegnazione parametro MaxDoorThick a tMainTabPar.MxDT (invece di sovrascrivere .MnDW) e relativo passaggio a CheckPieceDimension.
-- 2025.03.19 V2.7c2 DS Corretto ordinamento lavorazioni con una o più lavorazioni senza percorso di lavoro.
-- Intestazioni
require( 'EgtBase')
_ENV = EgtProtectGlobal()
EgtEnableDebug( false)
local MachiningLoc = {}
-- Librerie particolari
local sBaseDir = DGD.BASEDIR -- EgtGetSourceDir()
EgtAddToPackagePath( sBaseDir .. 'LuaLibs\\?.lua')
require( 'EgtDoorsBase')
require( 'EgtDoorsData')
local EgtDoorsMsg = require( 'EgtDoorsMsg')
local MB = require( 'MachiningBase')
-- Impostazioni Cam per consentire forature con utensile più piccolo
EgtMdbSetGeneralParam( MCH_GP.HOLEDIAMTOLER, -50)
EgtMdbSave()
-- Criterio di disposizione porta contro riferimenti, se fisso o guidato dalla disposizione porta
-- 0: in base alla disposizione porta, 1: forzato solo a sinistra; -1: forzato solo a destra
local FORCEDISPMODE = 0
-- Definizione possibilità di lavorare sottosquadra nei profili bevel ( true: non lavora sottosquadra, false: possibile lavorare sottosquadra)
local NO_WORK_UNDERSQUARE = false
-- Definizione possibilità di lavorare soprasquadra nei profili bevel ( true: non lavora soprasquadra, false: possibile lavorare soprasquadra)
local NO_WORK_UPSQUARE = false
-- Definizione possibilità di lavorare testa chisel rimanendo solo orizzontale o seguendo il bevel ( per teste non shuttle)
local CHISEL_ONLY_HORZNT = false
-- variabili generazione lavorazioni
local GEN_MACH = false
local NOT_GEN_MACH = true
-- Variabile distanza minima tra pezzo finito e ventosa (in X)
local DIST_MIN_VAC_L = 5.5
local DIST_MIN_VAC_R = 7.5
local KIND_DISP_MODE = 1 -- 1: fixture, prende i sottopezzi dalla cartella fixture; 0: machine, alza i sottopezzi dal disegno della macchina
-- variabile per applicare sempre la lavorazione degli anti-scheggia fatti con gli shuttle ( >= 4 inserisce solo quelle necessarie, < 4 inserisce tutte)
-- in caso il groove sia fatto con lama
local MAXMACH = 4
---------------- VARIABILI GLOBALI -----------------------------------------
-- variabili disposizione porta
local bPush
local bFlip
local bMachUnder -- variabile che indica se sono state inserite lavorazioni da sotto
-----------------------------------------------------------------
-- *** Error write file ***
-----------------------------------------------------------------
local function WriteErrFile( sFileErr, sDispMsg)
local nIdFile = io.open( sFileErr, 'w')
if nIdFile then
if DGD.ERR == 0 then
if DGD.ERM and #DGD.ERM > 0 then
nIdFile:write( 'Err=' .. tostring( DGD.ERR) .. '\n' .. DGD.ERM)
else
nIdFile:write( 'Err=' .. tostring( DGD.ERR))
end
else
if DGD.EMC and #DGD.EMC > 0 then
nIdFile:write( 'Err=' .. tostring( DGD.ERR) .. '\n' .. DGD.EMC)
else
nIdFile:write( 'Err=' .. tostring( DGD.ERR))
end
end
if sDispMsg and #sDispMsg > 0 then
nIdFile:write('\n' .. sDispMsg)
end
nIdFile:close()
end
end
-----------------------------------------------------------------
-- *** Add machining combine in table for second part ***
-----------------------------------------------------------------
local function AddMachIntable( MTMachLine, tSecMcng, nIndexTab)
if tSecMcng then
if #tSecMcng > 0 then
local bFound = false
MTMachLine.Row = nIndexTab
for k = 1, #tSecMcng do
if MTMachLine == tSecMcng[k] then
bFound = true
end
end
-- se non trovato lo inserisco
if not bFound then
table.insert( tSecMcng,MTMachLine)
end
else
MTMachLine.Row = nIndexTab
table.insert( tSecMcng,MTMachLine)
end
end
return tSecMcng
end
local function SetInfoTable( tListEnt, sNameInfo, nValInfo)
for j = 1, #tListEnt do
if tListEnt[j] then
EgtSetInfo( tListEnt[j], sNameInfo, nValInfo)
end
end
end
local function CheckExtSideMach( tListEnt)
local sEdgeNote
for j = 1, #tListEnt do
if tListEnt[j] then
sEdgeNote = EgtGetInfo( tListEnt[j], 'EdgeDoor') or ''
if sEdgeNote == 'T' then -- se lavorato lato top
DGD.MTS = 1
elseif sEdgeNote == 'B' then -- se lavorato lato bottom
DGD.MBS = 1
elseif sEdgeNote == 'H' then -- se lavorato lato hinge
DGD.MHS = 1
elseif sEdgeNote == 'L' then -- se lavorato lato lock
DGD.MLS = 1
end
end
end
end
-----------------------------------------------------------------
-- *** Apply Machining by Mach number ***
-----------------------------------------------------------------
local function InsertMachiningByMachNum ( tEndId, nMach, sLocName, nNumGroup, sMach,
sMachUp, sMachDw, bOk, nNumMach, bModifyMacNote,
bNotGenMachining, tMachining, dBladePerpLeadIn, dPercRedFeed, nIdMachine)
local dOverL = EgtGetInfo( tEndId[1], 'OL')
local dOverR = EgtGetInfo( tEndId[1], 'OFFSTOPATH', 'd')
local sKeepBackSet = EgtGetInfo( tEndId[1], 'KeepBackSet')
local sProbeSide = EgtGetInfo( tEndId[1], 'ProbeSide') -- ProbeMachXY
local nActiveStop = EgtGetInfo( tEndId[1], 'ActiveStopMach', 'i')
local nSetMaxElev = EgtGetInfo( tEndId[1], 'SetMaxElev', 'i')
local nOffsetDel = EgtIf( bNotGenMachining, 20, 0)
local nOffsetDelFail = EgtIf( bNotGenMachining, 30, 0)
local sKeepBackSetCode
local sActiveStop
local sSetMaxElev
local sProbeSideCode
-- determino in base alla disposizione quale codice KeepBackSet dare alla lavorazione
if sKeepBackSet and not bNotGenMachining then
if (bPush and bFlip) or ( not bPush and not bFlip) then -- se lato narrow è in basso (BD)
if sKeepBackSet == 'c' then -- se devo stare in centro allo spessore porta setto per correggere Z di metà valore medio
sKeepBackSetCode = 'CORR_Z_PROBE=1' -- codice moltiplicativo del valore di correzione (media/2)
elseif sKeepBackSet == 'n' then -- se mantenere su lato narrow, setto per non correggere Z
sKeepBackSetCode = 'CORR_Z_PROBE=0' -- codice moltiplicativo del valore di correzione (media/2)
elseif sKeepBackSet == 'w' then -- se mantenere su lato wide, setto per correggere Z
sKeepBackSetCode = 'CORR_Z_PROBE=2' -- codice moltiplicativo del valore di correzione (media/2)
end
else -- altrimenti lato narrow è in alto (BU)
if sKeepBackSet == 'c' then -- se devo stare in centro allo spessore porta setto per correggere Z di metà valore medio
sKeepBackSetCode = 'CORR_Z_PROBE=1' -- codice moltiplicativo del valore di correzione (media/2)
elseif sKeepBackSet == 'n' then -- se mantenere su lato narrow, setto per correggere Z
sKeepBackSetCode = 'CORR_Z_PROBE=2' -- codice moltiplicativo del valore di correzione (media/2)
elseif sKeepBackSet == 'w' then -- se mantenere su lato wide, setto per non correggere Z
sKeepBackSetCode = 'CORR_Z_PROBE=0' -- codice moltiplicativo del valore di correzione (media/2)
end
end
end
-- determino in base alla direzione dell'entità quale codice sProbeSide dare alla lavorazione
if sProbeSide and not bNotGenMachining then
sProbeSideCode = 'CPBP' -- CORR_POS_BY_PROBE
end
--
if nActiveStop and not bNotGenMachining then
sActiveStop = 'ActiveStopMach=1'
end
--
if nSetMaxElev and not bNotGenMachining then
sSetMaxElev = 'MaxElev=0.0'
end
if nMach == 1 then
local nRes, nMachId, sToolName, sNotesMach = MB.AddAndDelMachining( sLocName .. '_G' .. EgtNumToString(nNumGroup,0), sMach, tEndId, dOverL, sLocName,
bNotGenMachining, sKeepBackSetCode, dBladePerpLeadIn, dPercRedFeed, sProbeSideCode,
sActiveStop, sSetMaxElev, dOverR)
if nRes < 0 then -- se la lavorazione ha fallito
bOk = false
if bModifyMacNote then
-- setto nota per non lavorarla di nuovo nemmeno nella generazione reale
SetInfoTable( tEndId, 'Mach', 11+ nOffsetDelFail)
end
if bNotGenMachining then
-- setto nota per non lavorarla di nuovo nemmeno nella generazione reale
SetInfoTable( tEndId, 'Mach', 11+ nOffsetDelFail)
end
elseif nRes == 0 then -- se lavorazione mancante
if bModifyMacNote then
-- setto nota per non lavorarla di nuovo
SetInfoTable( tEndId, 'Mach', 11+ nOffsetDelFail)
end
if bNotGenMachining then
-- setto nota per non lavorarla di nuovo nemmeno nella generazione reale
SetInfoTable( tEndId, 'Mach', 11+ nOffsetDelFail)
end
else -- lavorazione ok
if bModifyMacNote then
-- setto nota per non lavorarla di nuovo
SetInfoTable( tEndId, 'Mach', 11+ nOffsetDel)
end
if bNotGenMachining then
nNumMach = nNumMach + 1
-- setto nota per non lavorarla di nuovo
SetInfoTable( tEndId, 'Mach', 11+ nOffsetDel)
SetInfoTable( tEndId, 'Machining', sMach)
else
if tMachining then
table.insert( tMachining,{nMachId,sToolName})
end
-- verifico se lavorati lati esterni porta
CheckExtSideMach(tEndId)
-- cerco se nelle note ho quella per l'aggregato da sotto
if sNotesMach and #sNotesMach > 0 then -- se la nota non è vuota
local nPosFind, _ = sNotesMach:find( 'UD_CHECK', 1, true)
if nPosFind then -- se trovata nota aggiungo nota alle geometrie per indicare che è lavorata da sotto
SetInfoTable( tEndId, 'UnderneathMach', true)
bMachUnder = true
end
end
-- assegno nota con Id macchina
if nIdMachine and nIdMachine > 0 then
SetInfoTable( tEndId, 'IdMachine', nIdMachine)
end
end
end
elseif nMach == 2 then
local nRes, nMachId, sToolName, sNotesMach = MB.AddAndDelMachining( sLocName .. '_G' .. EgtNumToString(nNumGroup,0), sMachUp, tEndId, dOverL, sLocName,
bNotGenMachining, sKeepBackSetCode, dBladePerpLeadIn, dPercRedFeed, sProbeSideCode,
sActiveStop, sSetMaxElev, dOverR)
if nRes < 0 then -- se la lavorazione ha fallito
bOk = false
if bModifyMacNote then
-- setto nota per non lavorarla di nuovo
SetInfoTable( tEndId, 'Mach', 12+ nOffsetDelFail)
end
if bNotGenMachining then
-- setto nota per non lavorarla di nuovo nemmeno nella generazione reale
SetInfoTable( tEndId, 'Mach', 12+ nOffsetDelFail)
end
elseif nRes == 0 then -- se lavorazione mancante
if bModifyMacNote then
-- setto nota per non lavorarla di nuovo
SetInfoTable( tEndId, 'Mach', 12+ nOffsetDelFail)
end
if bNotGenMachining then
-- setto nota per non lavorarla di nuovo nemmeno nella generazione reale
SetInfoTable( tEndId, 'Mach', 12+ nOffsetDelFail)
end
else -- lavorazione ok
if bModifyMacNote then
-- setto nota per non lavorarla di nuovo
SetInfoTable( tEndId, 'Mach', 12+ nOffsetDel)
end
if bNotGenMachining then
nNumMach = nNumMach + 1
-- setto nota per non lavorarla di nuovo
SetInfoTable( tEndId, 'Mach', 12+ nOffsetDel)
SetInfoTable( tEndId, 'Machining', sMachUp)
else
if tMachining then
table.insert( tMachining,{nMachId,sToolName})
end
-- verifico se lavorati lati esterni porta
CheckExtSideMach(tEndId)
-- cerco se nelle note ho quella per l'aggregato da sotto
if sNotesMach and #sNotesMach > 0 then -- se la nota non è vuota
local nPosFind, _ = sNotesMach:find( 'UD_CHECK', 1, true)
if nPosFind then -- se trovata nota aggiungo nota alle geometrie per indicare che è lavorata da sotto
SetInfoTable( tEndId, 'UnderneathMach', true)
bMachUnder = true
end
end
-- assegno nota con Id macchina
if nIdMachine and nIdMachine > 0 then
SetInfoTable( tEndId, 'IdMachine', nIdMachine)
end
end
end
elseif nMach == 3 then
local nRes, nMachId, sToolName, sNotesMach = MB.AddAndDelMachining( sLocName .. '_G' .. EgtNumToString(nNumGroup,0), sMachDw, tEndId, dOverL, sLocName,
bNotGenMachining, sKeepBackSetCode, dBladePerpLeadIn, dPercRedFeed, sProbeSideCode,
sActiveStop, sSetMaxElev, dOverR)
if nRes < 0 then -- se la lavorazione ha fallito
bOk = false
if bModifyMacNote then
-- setto nota per non lavorarla di nuovo
SetInfoTable( tEndId, 'Mach', 13+ nOffsetDelFail)
end
if bNotGenMachining then
-- setto nota per non lavorarla di nuovo nemmeno nella generazione reale
SetInfoTable( tEndId, 'Mach', 13+ nOffsetDelFail)
end
elseif nRes == 0 then -- se lavorazione mancante
if bModifyMacNote then
-- setto nota per non lavorarla di nuovo
SetInfoTable( tEndId, 'Mach', 13+ nOffsetDelFail)
end
if bNotGenMachining then
-- setto nota per non lavorarla di nuovo nemmeno nella generazione reale
SetInfoTable( tEndId, 'Mach', 13+ nOffsetDelFail)
end
else -- lavorazione ok
if bModifyMacNote then
-- setto nota per non lavorarla di nuovo
SetInfoTable( tEndId, 'Mach', 13+ nOffsetDel)
end
if bNotGenMachining then
nNumMach = nNumMach + 1
-- setto nota per non lavorarla di nuovo
SetInfoTable( tEndId, 'Mach', 13+ nOffsetDel)
SetInfoTable( tEndId, 'Machining', sMachDw)
else
if tMachining then
table.insert( tMachining,{nMachId,sToolName})
end
-- verifico se lavorati lati esterni porta
CheckExtSideMach(tEndId)
-- cerco se nelle note ho quella per l'aggregato da sotto
if sNotesMach and #sNotesMach > 0 then -- se la nota non è vuota
local nPosFind, _ = sNotesMach:find( 'UD_CHECK', 1, true)
if nPosFind then -- se trovata nota aggiungo nota alle geometrie per indicare che è lavorata da sotto
SetInfoTable( tEndId, 'UnderneathMach', true)
bMachUnder = true
end
end
-- assegno nota con Id macchina
if nIdMachine and nIdMachine > 0 then
SetInfoTable( tEndId, 'IdMachine', nIdMachine)
end
end
end
end
return bOk, nNumMach, tMachining
end
-----------------------------------------------------------------
-- *** Calc Machining for same group ***
-----------------------------------------------------------------
local function FindAndCalcGroupMachining( nEndId, nEndIdGhost, tLocTable, nNumMachFromTable, nMach,
nNumGroup, nNumMach, bOk, dBladePerpLeadIn, dPercRedFeed,
bCheckDirection)
local nParendId = EgtGetParent(nEndId)
local EntListMain = MB.FindEntities( nParendId) -- ricavo tutte le entità che sono nello stesso gruppo
local sLocMachId
local bNotGenMachining = true
-- ordinare lavorazioni navette come scritto su foglio nella documentazione
for i = 1, #tLocTable do
if tLocTable[i].On ~= 0 then
sLocMachId = tLocTable[i].MachId
if not sLocMachId then sLocMachId = 1 end
if sLocMachId == nNumMachFromTable then
-- Recupero le entità
local EntList = MB.FindEntitiesWithNameFromTab( EntListMain, tLocTable[i].Name)
-- acquisisco il campo Link se è presente
DGD.LVL = tonumber( tLocTable[i].Link)
-- Applico le lavorazioni
for j = 1, #EntList do
local nMachCk = EgtGetInfo( EntList[j], 'MachCk', 'i') or 1
if ( tLocTable[i].Oper == 'AdjustHead' or tLocTable[i].Oper == 'AdjustHeadOnASplint') and nMachCk > 0 and nMachCk < 10 then
-- assegno la stessa nota nMach dell'entità del gruppo
EgtSetInfo( EntList[j], 'Mach', nMach)
-- duplico entià
local nNewEntId = MB.MakeGhostCopy( EntList[j], bCheckDirection)
-- carico id entità in una tabella
local tListSameMach = {}
table.insert( tListSameMach, nNewEntId)
bOk, nNumMach = InsertMachiningByMachNum( tListSameMach, nMach, tLocTable[i].Name, nNumGroup, tLocTable[i].Mach,
tLocTable[i].MachUp, tLocTable[i].MachDw, bOk, nNumMach, true,
bNotGenMachining, nil, dBladePerpLeadIn, dPercRedFeed, nNumMachFromTable)
local nNewMach = EgtGetInfo( tListSameMach[1], 'Mach', 'i') or 1
if nNewMach > 30 and nNewMach < 40 then
EgtSetInfo( EntList[j], 'Mach', nNewMach-20) -- assegno nota per non lavorarla di nuovo
elseif nNewMach > 40 and nNewMach < 50 then
EgtSetInfo( EntList[j], 'Mach', nNewMach-30) -- assegno nota per non lavorarla di nuovo
end
end
end
end
end
end
return bOk, nNumMach
end
-----------------------------------------------------------------
-- *** Add Machining for same group ***
-----------------------------------------------------------------
local function MakeGroupMachining( nEndId, nParendId, tLocTable, nMach, nNumGroup,
nNumMach, bOk, sGhostName, dMaxDistToChain, EndLastMach,
dBladePerpLeadIn, dPercRedFeed, nIdMachine)
local EntListMain = MB.FindEntities( nParendId) -- ricavo tutte le entità che sono nello stesso gruppo
-- ordinare lavorazioni navette come scritto su foglio nella documentazione
for i = 1, #tLocTable do
-- Recupero le entità
local EntList = MB.FindEntitiesWithNameFromTab( EntListMain, tLocTable[i].Name..sGhostName)
-- Applico le lavorazioni
for j = 1, #EntList do
local nMachCk = EgtGetInfo( EntList[j], 'Mach', 'i') or 1
nMachCk = nMachCk - 30 -- se lavorazione corretta ottengo 1
local nMach2nd = EgtGetInfo( EntList[j], 'Mach2nd', 'i') or 0
if nMachCk > 0 and nMachCk < 10 then nMachCk = 1 end
if nMachCk > 0 and nMachCk < 10 then
local nNewEntId = EntList[j]
local sMachining = EgtGetInfo( nNewEntId, 'Machining')
if sMachining and nMach == 1 and nMach2nd == 0 and sMachining == tLocTable[i].Mach then
-- cerco di unire più entità nella stessa lavorazione ( non da sotto e non oltre una certa distanza)
local tListSameMach = MB.FindEntitiesCompMach( nNewEntId, EntList, sMachining, tLocTable[i].Join, dMaxDistToChain, true)
-- se più di 1 entità le ordino
if #tListSameMach > 1 then
tListSameMach = MB.OrderEnt( tListSameMach, EndLastMach)
EndLastMach = EgtSP( tListSameMach[#tListSameMach], GDB_ID.ROOT )
end
bOk, nNumMach = InsertMachiningByMachNum( tListSameMach, nMach, tLocTable[i].Name, nNumGroup, tLocTable[i].Mach,
tLocTable[i].MachUp, tLocTable[i].MachDw, bOk, nNumMach, true,
GEN_MACH, nil, dBladePerpLeadIn, dPercRedFeed, nIdMachine)
-- se ho assegnato lavorazione a più entità, marco quelle che ho già fatto
SetInfoTable( tListSameMach, 'Mach2nd', 1)
local nNewMach = EgtGetInfo( tListSameMach[1], 'Mach', 'i') or 1
if nNewMach > 30 and nNewMach < 40 then
SetInfoTable( tListSameMach, 'Mach', nNewMach-20) -- assegno nota per non lavorarla di nuovo
elseif nNewMach > 40 and nNewMach < 50 then
SetInfoTable( tListSameMach, 'Mach', nNewMach-30) -- assegno nota per non lavorarla di nuovo
end
end
end
end
-- tolgo di mezzo le note secondarie
for j = 1, #EntList do
EgtRemoveInfo( EntList[j], 'Mach2nd')
end
end
return bOk, nNumMach
end
-----------------------------------------------------------------
-- *** Movimento ventose ***
-----------------------------------------------------------------
local ThroughId, BlindId
-----------------------------------------------------------------
local function StartVacVerify( nIdSolid, bFlipped, dThDoor)
-- regioni passante e cieca non definite
EgtErase( ThroughId or GDB_ID.NULL)
ThroughId = nil
EgtErase( BlindId or GDB_ID.NULL)
BlindId = nil
-- recupero le regioni sopra e sotto della porta messa in macchina
local UpId, DwId
local DwIdExtraBlind = {}
local sExtraBlindRegName
local DwIdExtraGrvBlind = {}
local sExtraGrvBlindRegName
local dZedToMove
-- se porta ribaltata
if bFlipped then
-- superficie a contatto con le ventose
DwId = MB.FindGeomWithName( nIdSolid, 'FLAT_UP', true)
-- superficie sopra
UpId = MB.FindGeomWithName( nIdSolid, 'FLAT_DW', true)
sExtraBlindRegName = 'FLAT_UP_BLIND'
DwIdExtraBlind = MB.FindGeomWithName( nIdSolid, sExtraBlindRegName, false)
sExtraGrvBlindRegName = 'FLAT_UP_SD_BLIND'
DwIdExtraGrvBlind = MB.FindGeomWithName( nIdSolid, sExtraGrvBlindRegName, false)
dZedToMove = dThDoor
else
-- superficie a contatto con le ventose
DwId = MB.FindGeomWithName( nIdSolid, 'FLAT_DW', true)
-- superficie sopra
UpId = MB.FindGeomWithName( nIdSolid, 'FLAT_UP', true)
sExtraBlindRegName = 'FLAT_DW_BLIND'
DwIdExtraBlind = MB.FindGeomWithName( nIdSolid, sExtraBlindRegName, false)
sExtraGrvBlindRegName = 'FLAT_DW_SD_BLIND'
DwIdExtraGrvBlind = MB.FindGeomWithName( nIdSolid, sExtraGrvBlindRegName, false)
dZedToMove = 0
end
-- creo le regioni complementari
local b3Up = EgtGetBBoxGlob( UpId, GDB_BB.EXACT)
local CompUpId = EgtSurfFrRectangle( nIdSolid, b3Up:getMin(), b3Up:getMax(), GDB_RT.GLOB)
local vtNUp = EgtSurfFrNormVersor( UpId, GDB_ID.ROOT)
local vtNCompUp = EgtSurfFrNormVersor( CompUpId, GDB_ID.ROOT)
if not AreSameVectorApprox( vtNUp, vtNCompUp) then EgtInvertSurf( CompUpId) end
EgtSurfFrSubtract( CompUpId, UpId)
if not EgtExistsObj( CompUpId) then CompUpId = nil end
local b3Dw = EgtGetBBoxGlob( DwId, GDB_BB.EXACT)
local CompDwId = EgtSurfFrRectangle( nIdSolid, b3Dw:getMin(), b3Dw:getMax(), GDB_RT.GLOB)
-- faccio una copia per gli altri controlli
local DownRegId = nil
if CompDwId then
DownRegId = EgtCopyGlob( CompDwId, nIdSolid)
EgtInvertSurf( DownRegId)
end
local vtNDw = EgtSurfFrNormVersor( DwId, GDB_ID.ROOT)
local vtNCompDw = EgtSurfFrNormVersor( CompDwId, GDB_ID.ROOT)
if not AreSameVectorApprox( vtNDw, vtNCompDw) then EgtInvertSurf( CompDwId) end
EgtSurfFrSubtract( CompDwId, DwId)
if not EgtExistsObj( CompDwId) then CompDwId = nil end
if CompDwId then EgtInvertSurf( CompDwId) end
-- calcolo le regioni passante e cieca
local ThroughRegId = nil
local BlindRegId = nil
-- se ci sono entrambe le regioni
if CompUpId and CompDwId then
-- per ottenere la regione passante faccio intersezione tra sopra e sotto
EgtSurfFrIntersect( CompUpId, CompDwId)
if EgtExistsObj( CompUpId) then
ThroughRegId = CompUpId
end
-- per ottenere la regione cieca faccio differenza tra sotto e passante
if ThroughRegId then
EgtSurfFrSubtract( CompDwId, ThroughRegId)
if EgtExistsObj( CompDwId) then
BlindRegId = CompDwId
end
else
BlindRegId = CompDwId
end
-- se c'è solo la regione sotto è già quella delle lavorazioni cieche
elseif CompDwId then
BlindRegId = CompDwId
-- se c'è solo la sopra, non interessa e la cancello
elseif CompUpId then
EgtErase( CompUpId)
end
-- sistemazioni finali
if ThroughRegId or #DwIdExtraGrvBlind then
ThroughId = EgtGroup( GDB_ID.ROOT)
EgtSetName( ThroughId, 'THROUGH')
EgtSetColor( ThroughId, RED())
EgtSetLevel( ThroughId, GDB_LV.TEMP)
local nChunk = 0
if ThroughRegId then
while EgtExtractSurfFrChunkLoops( ThroughRegId, nChunk, ThroughId) do
nChunk = nChunk + 1
end
end
-- aggiungo le regioni extra presenti (calcolate dai singoli componenti)
for l = 1, #DwIdExtraGrvBlind do
local nIdBl = DwIdExtraGrvBlind[l]
if nIdBl then
-- faccio la copia e la muovo alla Z bassa
local nTempBlndReg = EgtCopyGlob ( nIdBl, nIdSolid)
if nTempBlndReg then
-- prendo il punto iniziale
local pCenTmp = EgtCP( nTempBlndReg)
if pCenTmp then
EgtMove( nTempBlndReg, Point3d(0,0,dZedToMove) - Point3d(0,0,pCenTmp:getZ()))
end
-- estraggo i contorni e li aggiungo al gruppo blind
nChunk = 0
while EgtExtractSurfFrChunkLoops( nTempBlndReg, nChunk, ThroughId) do
nChunk = nChunk + 1
end
-- cancello la copia locale
EgtErase( nTempBlndReg)
end
end
end
EgtErase( ThroughRegId)
-- EgtSetName( ThroughRegId, 'THROUGH')
-- EgtSetColor( ThroughRegId, RED())
-- EgtSetLevel( ThroughRegId, GDB_LV.TEMP)
end
if BlindRegId or #DwIdExtraBlind > 0 then
BlindId = EgtGroup( GDB_ID.ROOT)
EgtSetName( BlindId, 'BLIND')
EgtSetColor( BlindId, BLUE())
EgtSetLevel( BlindId, GDB_LV.TEMP)
local nChunk = 0
if BlindRegId then
while EgtExtractSurfFrChunkLoops( BlindRegId, nChunk, BlindId) do
nChunk = nChunk + 1
end
end
-- aggiungo le regioni extra presenti (calcolate dai singoli componenti)
for l = 1, #DwIdExtraBlind do
local nIdBl = DwIdExtraBlind[l]
if nIdBl then
-- faccio la copia e la muovo alla Z bassa
local nTempBlndReg = EgtCopyGlob ( nIdBl, nIdSolid)
if nTempBlndReg then
-- prendo il punto iniziale
local pCenTmp = EgtCP( nTempBlndReg)
if pCenTmp then
EgtMove( nTempBlndReg, Point3d(0,0,dZedToMove) - Point3d(0,0,pCenTmp:getZ()))
end
-- estraggo i contorni e li aggiungo al gruppo blind
nChunk = 0
while EgtExtractSurfFrChunkLoops( nTempBlndReg, nChunk, BlindId) do
nChunk = nChunk + 1
end
-- cancello la copia locale
EgtErase( nTempBlndReg)
end
end
end
if BlindRegId then
EgtErase( BlindRegId)
-- EgtSetName( BlindRegId, 'BLIND')
-- EgtSetColor( BlindRegId, BLUE())
-- EgtSetLevel( BlindRegId, GDB_LV.TEMP)
end
end
if DownRegId then
FaceDwId = EgtGroup( GDB_ID.ROOT)
EgtSetName( FaceDwId, 'DWREG')
EgtSetColor( FaceDwId, BLUE())
EgtSetLevel( FaceDwId, GDB_LV.TEMP)
local nChunk = 0
while EgtExtractSurfFrChunkLoops( DownRegId, nChunk, FaceDwId) do
nChunk = nChunk + 1
end
EgtErase( DownRegId)
-- EgtSetName( DownRegId, 'DWREG')
-- EgtSetColor( DownRegId, GREEN())
-- EgtSetLevel( DownRegId, GDB_LV.TEMP)
end
end
-----------------------------------------------------------------
local function ExecVacVerify( ptVac, dDistInterferThru, dDistInterferBlind, dDistInterferUnder, sAngGrooveNote,
nIdSolid, bFlipped, ptVacId)
-- verifica con le regioni passanti
local nId = EgtGetFirstInGroup( ThroughId or GDB_ID.NULL)
while nId do
local ptNear = EgtNP( nId, ptVac, GDB_ID.ROOT)
if ptNear then
local dDist = sqrt( ( ptNear[1] - ptVac[1]) * ( ptNear[1] - ptVac[1]) +
( ptNear[2] - ptVac[2]) * ( ptNear[2] - ptVac[2]))
-- se distanza inferiore al limite ...
if dDist < dDistInterferThru then
return false
end
end
nId = EgtGetNext( nId)
end
-- verifica con le regioni cieche
nId = EgtGetFirstInGroup( BlindId or GDB_ID.NULL)
while nId do
local ptNear = EgtNP( nId, ptVac, GDB_ID.ROOT)
if ptNear then
local dDist = sqrt( ( ptNear[1] - ptVac[1]) * ( ptNear[1] - ptVac[1]) +
( ptNear[2] - ptVac[2]) * ( ptNear[2] - ptVac[2]))
-- se distanza inferiore al limite ...
if dDist < dDistInterferBlind then
return false
end
end
nId = EgtGetNext( nId)
end
-- se ho delle lavorazioni da sotto
if bMachUnder then
local tUnderList = {}
tUnderList = MB.FindGeomWithNote( Pz, 'UnderneathMach', 'b', true, tUnderList)
for i = 1, #tUnderList do
local ptNear = EgtNP( tUnderList[i], ptVac, GDB_ID.ROOT)
if ptNear then
local dDist = sqrt( ( ptNear[1] - ptVac[1]) * ( ptNear[1] - ptVac[1]) +
( ptNear[2] - ptVac[2]) * ( ptNear[2] - ptVac[2]))
-- se distanza inferiore al limite ...
if dDist < dDistInterferUnder then
return false
end
end
end
end
-- se ho groove su top angolo
if sAngGrooveNote and #sAngGrooveNote > 0 then
local tGrooveOnAng = EgtSplitString( sAngGrooveNote)
if tGrooveOnAng and #tGrooveOnAng > 0 then
for i = 1, #tGrooveOnAng do
-- prendo la prima geometria del layer
local nGrvId = EgtGetFirstInGroup( tGrooveOnAng[i])
if nGrvId then
local ptNear = EgtNP( nGrvId, ptVac, GDB_ID.ROOT)
if ptNear then
local dDist = sqrt( ( ptNear[1] - ptVac[1]) * ( ptNear[1] - ptVac[1]) +
( ptNear[2] - ptVac[2]) * ( ptNear[2] - ptVac[2]))
-- controllo che la ventosa sia al di fuori della regione
local DwId
local bDistBtwRegion
-- se porta ribaltata
if bFlipped then
-- superficie a contatto con le ventose
DwId = MB.FindGeomWithName( nIdSolid, 'FLAT_UP', true)
else
DwId = MB.FindGeomWithName( nIdSolid, 'FLAT_DW', true)
end
if DwId then
bDistBtwRegion = EgtSurfFrTestExternal( DwId, ptVacId, 0.1)
end
-- se punto ventosa esterno alla regione e distanza inferiore al limite ...
if bDistBtwRegion and dDist > min( dDistInterferThru, dDistInterferBlind, dDistInterferUnder) then
return false
end
end
end
end
end
end
-- nessuna interferenza
return true
end
-----------------------------------------------------------------
local function EndVacVerify()
-- cancello regioni passante e cieca
EgtErase( ThroughId or GDB_ID.NULL)
ThroughId = nil
EgtErase( BlindId or GDB_ID.NULL)
BlindId = nil
EgtErase( FaceDwId or GDB_ID.NULL)
FaceDwId = nil
end
-----------------------------------------------------------------
local function MoveVac( nId, dVal)
local dOldVal = EgtGetInfo( nId, 'Val', 'd')
EgtMove( nId, Vector3d( 0, 0, dVal - dOldVal), GDB_RT.GLOB)
EgtSetInfo( nId, 'Val', dVal)
end
-----------------------------------------------------------------
local function AddMoveShowHideVac( nMode, nGroupId, sNameVac, sNameCol, dVal, sVacName, pPointApp)
local nVac
local nId = EgtGetFirstNameInGroup( nGroupId or GDB_ID.NULL, sNameVac)
if nMode == 1 then -- se disposizione fixture
EgtSetAlpha( nId, 20) -- imposto trasparenza poco visibile
-- inserisco la ventosa
nVac = EgtAddFixture( sVacName, pPointApp, 0)
elseif nMode == 0 then -- disposizione machine
EgtSetAlpha( nId, 100) -- imposto trasparenza massima visibilità
MoveVac( nId, dVal)
-- muovo anche lo stelo
nId = EgtGetFirstNameInGroup( nGroupId or GDB_ID.NULL, sNameCol)
MoveVac( nId, dVal)
else
EgtSetAlpha( nId, 100) -- imposto trasparenza massima visibilità
end
return nVac
end
-----------------------------------------------------------------
local function MakeBoxFromSolidLayer( nSolidLayer, nProbeMode, nAuxLayer)
-- Box solido: lo ottengo dalla somma delle varie superfici della porta
local tListFaces = {}
if nProbeMode == 2 then
table.insert( tListFaces, EgtGetFirstNameInGroup( nSolidLayer, 'FLAT_UP_2'))
table.insert( tListFaces, EgtGetFirstNameInGroup( nSolidLayer, 'FLAT_DW_2'))
else
table.insert( tListFaces, EgtGetFirstNameInGroup( nSolidLayer, 'FLAT_UP'))
table.insert( tListFaces, EgtGetFirstNameInGroup( nSolidLayer, 'FLAT_DW'))
end
table.insert( tListFaces, EgtGetFirstNameInGroup( nSolidLayer, 'SIDE_LF'))
table.insert( tListFaces, EgtGetFirstNameInGroup( nSolidLayer, 'SIDE_RH'))
table.insert( tListFaces, EgtGetFirstNameInGroup( nSolidLayer, 'SIDE_BT'))
table.insert( tListFaces, EgtGetFirstNameInGroup( nSolidLayer, 'SIDE_TP'))
table.insert( tListFaces, EgtGetFirstNameInGroup( nSolidLayer, 'SIDE'))
-- aggiungo anche il layer AUX escludendo il testo
if nAuxLayer then
local nIdGeom = EgtGetFirstInGroup(nAuxLayer)
local nTypeEnt
while nIdGeom do
-- se elemento passato è un testo lo escludo
nTypeEnt = EgtGetType( nIdGeom)
if nTypeEnt ~= GDB_TY.EXT_TEXT then
table.insert( tListFaces, nIdGeom)
end
nIdGeom = EgtGetNext(nIdGeom)
end
end
local b3fx = BBox3d() -- inizializzo il box nullo
for i = 1, #tListFaces do
if tListFaces[i] then
local b3f1 = EgtGetBBoxGlob( tListFaces[i], GDB_BB.EXACT)
b3fx:Add(b3f1)
end
end
return b3fx
end
-----------------------------------------------------------------
local function CheckPieceDimension ( dLengthDoor, dWidthDoor, dThickDoor, OffsXSovr, OffsYSovr,
ShiftXOri, ShiftYOri, dMinDoorLength, dMaxDoorLength, dMinDoorWidth,
dMaxDoorWidth, dMinDoorThick, dMaxDoorThick)
local bFailDim = false
local sErrMess = ''
local dLimitToCheck
dLimitToCheck = dMinDoorLength - abs(ShiftXOri)
if ( dLengthDoor + OffsXSovr) < dLimitToCheck then -- se lunghezza inferiore
bFailDim = true
sErrMess = string.format(EgtDoorsMsg[617], EgtDoorsMsg[622], EgtToUiUnits(dLengthDoor), EgtToUiUnits(OffsXSovr), EgtToUiUnits(dLengthDoor+OffsXSovr),
EgtToUiUnits(abs(ShiftXOri)), EgtToUiUnits(dLimitToCheck))
if #DGD.EMC > 0 then
DGD.EMC = DGD.EMC .. '\n'.. sErrMess
else
DGD.EMC = '\n'.. sErrMess
end
end
dLimitToCheck = dMaxDoorLength - abs(ShiftXOri)
if ( dLengthDoor + OffsXSovr) > dLimitToCheck then -- se lunghezza superiore
bFailDim = true
sErrMess = string.format(EgtDoorsMsg[616], EgtDoorsMsg[622], EgtToUiUnits(dLengthDoor), EgtToUiUnits(OffsXSovr), EgtToUiUnits(dLengthDoor+OffsXSovr),
EgtToUiUnits(abs(ShiftXOri)), EgtToUiUnits(dLimitToCheck))
if #DGD.EMC > 0 then
DGD.EMC = DGD.EMC .. '\n'.. sErrMess
else
DGD.EMC = '\n'.. sErrMess
end
end
-- dLimitToCheck = dMinDoorWidth - abs(2*ShiftYOri)
dLimitToCheck = dMinDoorWidth + abs(ShiftYOri)
if ( dWidthDoor + (2*OffsYSovr)) < dLimitToCheck then -- se larghezza inferiore
bFailDim = true
sErrMess = string.format(EgtDoorsMsg[619], EgtDoorsMsg[622], EgtToUiUnits(dWidthDoor), EgtToUiUnits(2*OffsYSovr), EgtToUiUnits(dWidthDoor+(2*OffsYSovr)),
EgtToUiUnits(abs(ShiftYOri)), EgtToUiUnits(dLimitToCheck))
if #DGD.EMC > 0 then
DGD.EMC = DGD.EMC .. '\n'.. sErrMess
else
DGD.EMC = '\n'.. sErrMess
end
end
-- dLimitToCheck = dMaxDoorWidth - abs(2*ShiftYOri)
dLimitToCheck = dMaxDoorWidth + abs(ShiftYOri)
if ( dWidthDoor + (2*OffsYSovr)) > dLimitToCheck then -- se larghezza superiore
bFailDim = true
sErrMess = string.format(EgtDoorsMsg[618], EgtDoorsMsg[622], EgtToUiUnits(dWidthDoor), EgtToUiUnits(2*OffsYSovr), EgtToUiUnits(dWidthDoor+(2*OffsYSovr)),
EgtToUiUnits(abs(ShiftYOri)), EgtToUiUnits(dLimitToCheck))
if #DGD.EMC > 0 then
DGD.EMC = DGD.EMC .. '\n'.. sErrMess
else
DGD.EMC = '\n'.. sErrMess
end
end
dLimitToCheck = dMinDoorThick
if dThickDoor < dLimitToCheck then -- se spessore inferiore
bFailDim = true
sErrMess = string.format(EgtDoorsMsg[621], EgtDoorsMsg[622], EgtToUiUnits(dThickDoor), EgtToUiUnits(dLimitToCheck))
if #DGD.EMC > 0 then
DGD.EMC = DGD.EMC .. '\n'.. sErrMess
else
DGD.EMC = '\n'.. sErrMess
end
end
dLimitToCheck = dMaxDoorThick
if dThickDoor > dLimitToCheck then -- se spessore superiore
bFailDim = true
sErrMess = string.format(EgtDoorsMsg[620], EgtDoorsMsg[622], EgtToUiUnits(dThickDoor), EgtToUiUnits(dLimitToCheck))
if #DGD.EMC > 0 then
DGD.EMC = DGD.EMC .. '\n'.. sErrMess
else
DGD.EMC = '\n'.. sErrMess
end
end
return bFailDim
end
-----------------------------------------------------------------
-- *** Funzione di generazione lavorazioni ***
-----------------------------------------------------------------
function MachiningLoc.Calc( tPz, tsAssemb, nNumMachFromTable, nNumMachFromCam, nNumGroup, OptimizeMach)
-- local nTime
-- -- inizializzo il contatore
-- EgtStartCounter()
-- Setto parametro ottimizzazione lavorazioni macchine in linea
DGD.OML = OptimizeMach
-- macchina e tabella di default
-- tabella parametri d'uso per variabili CurrcamInfo
tMainTabPar = {}
--macchina e tabella di default
tMainTabPar.MN = 'Multiax-'
-- Machinings Tables
local MachiningsTable = 'MachStdTable'
local MachiningsTableOrd = 'MachStdTable_Ord'
-- Define door disposition ( on left: 1, on right : -1)
local nDispMode = -1
-- References on table (respect Zero machine)
-- Y Table
tMainTabPar.OR1 = Point3d( -21.991, -57.090, -11.511) * GEO.ONE_INCH
tMainTabPar.OR2 = Point3d( -21.991, -57.090, -11.511) * GEO.ONE_INCH
-- shift value
local vShift = Vector3d(0,0,0)
local vShiftVac = Vector3d(0,0,0)
tMainTabPar.SH1 = Vector3d(0,0,0)
local vNullShift = Vector3d(0,0,0)
tMainTabPar.SHL = Vector3d(0,0,0)
-- variabile per posizione media della porta per il cambio navette
local dPosShuttleChange = 40 * GEO.ONE_INCH
-- tabella raggi profili su ogni lato
local tsRadiusProf = {}
local tsPlaneProf = {}
-- utilizzo la tabella dati cam
local sPathCurrMachtabOri = 'CurrCamInfo'
local mCamData = require( sPathCurrMachtabOri)
-- variabili pezzo singolo
local nPz
local sAssemb
-- variabile check dimensioni porta
local bFailDim = false
-- variabile per comandi speciali nel campo code del ddf
local bSpecialCommandFound
-- resetto la macchinata (riporto il pezzo in area disegno)
EgtResetCurrMachGroup()
-- se la variabile è una tabella, estrapolo solo la porta
local PzIsTab = type(tPz) == 'table'
if PzIsTab then
for v = 1, #tPz do
Pz = tPz[v]
sAssemb = tsAssemb[v]
-- se non ha nota o nota della prima porta esco
if not sAssemb or ( sAssemb and sAssemb == 'first') then
break
end
end
else
Pz = tPz
sAssemb = tsAssemb
end
--------------------------------------------------------------------------------
-- Dati della porta
local sDoorCode = EgtGetInfo( Pz, 'Code')
local dWidthDoor = EgtGetInfo( Pz, 'W', 'd')
local dLengthDoor = EgtGetInfo( Pz, 'H', 'd')
local dThickDoor = EgtGetInfo( Pz, 'T', 'd')
local sSwing = EgtGetInfo( Pz, 'Swing')
MachiningsTable = EgtGetInfo( Pz, 'MTable') -- ottengo la tabella corrente
local sSecure = EgtGetInfo( Pz, 'Secure')
local sHingeTrim = EgtGetInfo( Pz, 'hingeedge_trimming')
local sLockTrim = EgtGetInfo( Pz, 'lockedge_trimming')
local sTopTrim = EgtGetInfo( Pz, 'top_trimming')
local sBottomTrim = EgtGetInfo( Pz, 'bottom_trimming')
local bHingeMach = EgtGetInfo( Pz, 'hingeedge_machining', 'b')
local bLockMach = EgtGetInfo( Pz, 'lockedge_machining', 'b')
local bTopMach = EgtGetInfo( Pz, 'top_machining', 'b')
local bBottomMach = EgtGetInfo( Pz, 'bottom_machining', 'b')
local bAtRight = ( sSwing:sub(1,1) == 'L') -- flag che viene settato a vero se serratura a destra
local bSwingDriveDisp = EgtGetInfo( Pz, 'SwingDriveDisp', 'b' )
local bOppoBevelProf = EgtGetInfo( Pz, 'OppoBevelProf', 'b' )
tsRadiusProf[1] = EgtGetInfo( Pz, 'RadHingeProfile', 'd')
tsRadiusProf[2] = EgtGetInfo( Pz, 'RadLockProfile', 'd')
tsRadiusProf[3] = EgtGetInfo( Pz, 'RadTopProfile', 'd')
tsRadiusProf[4] = EgtGetInfo( Pz, 'RadBottomProfile', 'd')
tsPlaneProf[1] = EgtGetInfo( Pz, 'PlnHingeProfile', 'd')
tsPlaneProf[2] = EgtGetInfo( Pz, 'PlnLockProfile', 'd')
tsPlaneProf[3] = EgtGetInfo( Pz, 'PlnTopProfile', 'd')
tsPlaneProf[4] = EgtGetInfo( Pz, 'PlnBottomProfile', 'd')
local nProbeMode = EgtGetInfo( Pz, 'ProbeMode', 'i') or 0
local nPostProbeSet = EgtGetInfo( Pz, 'PostProbeSet', 'i') or 0
local nNewProbeMeaning = EgtGetInfo( Pz, 'NewProbeMean', 'i') or 0
local dNumHingesPivots = EgtGetInfo( Pz, 'NumHingesPivots', 'd') or 0
local dLeftOffs = EgtGetInfo( EgtGetFirstNameInGroup( Pz, 'Left') or GDB_ID.NULL, 'Offs', 'd') or 0
local dRightOffs = EgtGetInfo( EgtGetFirstNameInGroup( Pz, 'Right') or GDB_ID.NULL, 'Offs', 'd') or 0
local dTopOffs = EgtGetInfo( EgtGetFirstNameInGroup( Pz, 'Top') or GDB_ID.NULL, 'Offs', 'd') or 0
local dBottomOffs = EgtGetInfo( EgtGetFirstNameInGroup( Pz, 'Bottom') or GDB_ID.NULL, 'Offs', 'd') or 0
-- Box pezzo
local Ls = EgtGetFirstNameInGroup( Pz, 'SOLID')
local Aux = EgtGetFirstNameInGroup( Pz, 'AUX')
local b3Part = EgtGetBBoxGlob( Pz, GDB_BB.EXACT)
-- Box solido: lo ottengo dalla somma delle varie superfici della porta
local b3Solid = BBox3d() -- inizializzo il box nullo
b3Solid = MakeBoxFromSolidLayer( Ls, nProbeMode, Aux)
-- Project path, name, extension
local sFilePath = EgtGetCurrFilePath()
local sFileDir, sFileName, sFileExt = EgtSplitPath( sFilePath)
------------------------------------------------------
-- se codice porta contiene comandi speciali
-- che non producono la generazione del part program della porta ma dei part program speciali
if sDoorCode then
local sCode = string.lower(sDoorCode)
if sCode == 'p1' or sCode == 'p2' or sCode == 'p3' or sCode == 'p4' or sCode == 'p5' or sCode == 'p6' then
EgtSetInfo( Pz, 'SpecialCmd', sCode)
bSpecialCommandFound = true
end
end
------------------------------------------------------
--------------------------------------------------------------------------------
-- *** settaggi CAM *** -- Mtable 1
if not MachiningsTable then -- se non c'è il nome della MTable esco
DoorOutLog( string.format(EgtDoorsMsg[597], MachiningsTable), 0) -- errore, file di tabella non trovato
return false
end
EgtAddToPackagePath( sBaseDir .. 'MTables\\?.mtl')
local TAB
if EgtExistsFile( sBaseDir .. 'MTables\\' .. MachiningsTable .. '.mtl') then
TAB = require( MachiningsTable)
if not TAB then
DoorOutLog( string.format(EgtDoorsMsg[490], sBaseDir .. 'MTables\\' .. MachiningsTable .. '.mtl'), 0) -- errore tabella non trovata nel file
return false
end
else
DoorOutLog( string.format(EgtDoorsMsg[597], sBaseDir .. 'MTables\\' .. MachiningsTable .. '.mtl'), 0) -- errore, file di tabella non trovato
return false
end
local MachinesName = TAB.MMachineData
if not MachinesName then
DoorOutLog( string.format(EgtDoorsMsg[491], ''), 0) -- Errore! Nome macchina: non presente in MTable
return false
end
-- *** settaggi CAM *** -- Mtable 2
MachiningsTableOrd = MachiningsTable..'_'..EgtNumToString(nNumMachFromTable,0)
EgtAddToPackagePath( sBaseDir .. 'MTables\\?.otl')
local TABORD
if EgtExistsFile( sBaseDir .. 'MTables\\' .. MachiningsTableOrd .. '.otl') then
TABORD = require( MachiningsTableOrd)
if not TABORD then
DoorOutLog( string.format(EgtDoorsMsg[490], sBaseDir .. 'MTables\\' .. MachiningsTableOrd .. '.otl'), 0) -- errore tabella non trovata nel file
return false
end
else
DoorOutLog( string.format(EgtDoorsMsg[597], sBaseDir .. 'MTables\\' .. MachiningsTableOrd .. '.otl'), 0) -- errore tabella non trovata nel file
return false
end
-- imposto i dati macchina secondo le informazioni del file cam
tMainTabPar.MN = mCamData[nNumMachFromCam].MachName
tMainTabPar.OR1 = mCamData[nNumMachFromCam].Ori1
tMainTabPar.OR2 = mCamData[nNumMachFromCam].Ori2
tMainTabPar.SH1 = mCamData[nNumMachFromCam].Shift1
tMainTabPar.SHL = mCamData[nNumMachFromCam].ShiftLck
tMainTabPar.MxDL = mCamData[nNumMachFromCam].MaxDoorLength
tMainTabPar.MnDL = mCamData[nNumMachFromCam].MinDoorLength
tMainTabPar.MxDW = mCamData[nNumMachFromCam].MaxDoorWidth
tMainTabPar.MnDW = mCamData[nNumMachFromCam].MinDoorWidth
tMainTabPar.MxDT = mCamData[nNumMachFromCam].MaxDoorThick
tMainTabPar.MnDT = mCamData[nNumMachFromCam].MinDoorThick
tMainTabPar.FUS = mCamData[nNumMachFromCam].ForceShuttleUse
tMainTabPar.FDMH = mCamData[nNumMachFromCam].ForceDirMachHinge
tMainTabPar.PS3H = mCamData[nNumMachFromCam].PercentUseShtlWith3Hrdw or 0.6
tMainTabPar.PUSR = mCamData[nNumMachFromCam].PercentUseShuttleFromRef or 0.4
tMainTabPar.FDH = mCamData[nNumMachFromCam].ForceDisableHood
tMainTabPar.AR = mCamData[nNumMachFromCam].dAltRef
tMainTabPar.TR = mCamData[nNumMachFromCam].dTallRef
tMainTabPar.ARS = mCamData[nNumMachFromCam].dAltRefShort or tMainTabPar.AR
tMainTabPar.TRS = mCamData[nNumMachFromCam].dTallRefShort or tMainTabPar.TR
tMainTabPar.VOY = mCamData[nNumMachFromCam].dVacOffsY or 57.5
tMainTabPar.MOY = mCamData[nNumMachFromCam].dMobOffsY or 201.6
tMainTabPar.LDX = mCamData[nNumMachFromCam].dLeftDistX or 118.35
tMainTabPar.RDX = mCamData[nNumMachFromCam].dRightDistX or 170.125
tMainTabPar.MPMB = mCamData[nNumMachFromCam].MaxPosMobBar or 1155
tMainTabPar.LS = mCamData[nNumMachFromCam].sLocSecure
tMainTabPar.MOM = mCamData[nNumMachFromCam].MaxOverMat
tMainTabPar.SOM = mCamData[nNumMachFromCam].StepOverMat or 10
tMainTabPar.MDC = mCamData[nNumMachFromCam].MaxDistToChain
tMainTabPar.ETM = mCamData[nNumMachFromCam].ExtraThruDepthMachining
tMainTabPar.GCDN = mCamData[nNumMachFromCam].GenCncAsDdfName or 0
tMainTabPar.DACN = mCamData[nNumMachFromCam].DisableAutoCncName or 0
tMainTabPar.BPLI = mCamData[nNumMachFromCam].BladePerpLeadIn or (3*25.4)
tMainTabPar.PRF = mCamData[nNumMachFromCam].PercRedFeed or 0.3
tMainTabPar.SDF = mCamData[nNumMachFromCam].SideDoorDefined or 1
FORCEDISPMODE = mCamData[nNumMachFromCam].SideDoorDispose or FORCEDISPMODE -- SideDoorDispose
CHISEL_ONLY_HORZNT = mCamData[nNumMachFromCam].ChiselHorizzontal or CHISEL_ONLY_HORZNT -- new
tMainTabPar.DTG = mCamData[nNumMachFromCam].SafetyDistVacThru or 12
tMainTabPar.DBG = mCamData[nNumMachFromCam].SafetyDistVacBlind or 45
tMainTabPar.DUG = mCamData[nNumMachFromCam].SafetyDistVacUnder or 55
tMainTabPar.ECD = mCamData[nNumMachFromCam].EnableCollisionDetect or 0 -- new
tMainTabPar.EZPB = mCamData[nNumMachFromCam].dExtraZedProbeBevels or 0 -- new
tMainTabPar.PTK = mCamData[nNumMachFromCam].dProbeThickness or 0 -- new
tMainTabPar.NVP = mCamData[nNumMachFromCam].ProfBy5AaxisHead == 1 -- new
tMainTabPar.CDA = mCamData[nNumMachFromCam].sCutDirectionAdmitted or '' -- new
tMainTabPar.BDH = mCamData[nNumMachFromCam].BigDoorHeight or 1800.0 -- new
tMainTabPar.RSM = mCamData[nNumMachFromCam].RemoveScrapMode or 0 -- new
tMainTabPar.MSV = mCamData[nNumMachFromCam].MinScrapValue or 0 -- new
tMainTabPar.FDD = mCamData[nNumMachFromCam].ForceDisposByDust or 0 -- new
tMainTabPar.DSPP = mCamData[nNumMachFromCam].DeleteSideProbePathOnSide or 0 -- new
-- se non devo generare il cn esco subito
if MachinesName[nNumMachFromTable].NcGenerate ~= nil and not MachinesName[nNumMachFromTable].NcGenerate then
DoorOutLog( string.format(EgtDoorsMsg[492], tMainTabPar.MN), 0) -- warning. Cnc generation disable
return true
end
-- setto come generare il nome del file cnc (di default è uguale al nome del parametro interno ad ddf)
if tMainTabPar.GCDN == 0 then
-- assegno al nome file il nome del campo code, come faccio nel main quando creo più pezzi
sFileName = sDoorCode
end
local MTable = TAB.MTable
local MTableOrd = TABORD.MTable
-- variabile principale per definizione disposizione porta a destra o sinistra
local sLocMachId
local bOk = true
local bFirstStep = true
local bShiftedDoor = false
local sDispMode
local sTotDispMode = ''
local sNumGroup = ''
local bWork = true
-- variabili utilizzate dentro al ciclo
local nMchId
local sTab
local tabOri
local Ori
local ColA
local nRaw
local bMoveRaw
local bTopOnRight
-- variabili per disposizione sottopezzi
local dMobOffs
local dVacOffs
local dDistMinX
local dDistMaxX
local dVacOn
local dInterAx
local OffsXSovr = 0
local OffsYSovr = 0
local dDistInterferThru
local dDistInterferBlind
local dDistInterferUnder
-- variabile per tool setup
local MSetup
local sSetup
-- variabili calcolo box
local b3SolidOnTab
local pMin
local pMax
-- variabili conteggio lavorazioni profilatura bevel e saltate
local nNumMachSkip = 0
local bLocMach
local sMachProf
local bWorkUnder = true
-- variabile per conteggio lavorazioni
local nNumMach
local nNumSkip
local tSecMachTab = {}
-- variabili per fase
local nNumPhase
local nNumCycle = 1
-- variabili per gestione ripresa porta
local bFlipFirst
local bTopOnRightFirst
local sProfiles = ''
local nNumGeomBottom = 0
local nNumGeomTop = 0
local nNumGeomBottomHole = 0
local nNumGeomTopHole = 0
-- variabili per geometrie lato Hinge
local nNumTopGeom = 0
local nNumBottomGeom = 0
-- variabile piazzamento porta
local sLight
-- variabile direzione riordino gruppi
local nDirReorderGroups
-- tabella lavorazioni
local tLocMach = {}
local tLocMachOrd = {}
local tSplitDoorEnt = {}
local tSplitDataInf = {}
local bGetSplitCuts = false
local nNumProbeZ
local nDispFront = 1
local DelListTwo = {}
-- per prima cosa verifico se la disposizione é in positivo (disposizione in fronte, standard)
-- o in negativo (disposizione dietro, caso seconda macchina in catena)
-- se le origini hanno campo Y in negativo indica che la disposizione non é sul fronta ma dietro
-- e disposizione porta con lato lock su shuttle (implica di avere alcune geometrie con suffisso _LK o _HD)
-- e inoltre
if ( tMainTabPar.OR1[2] < 0 and tMainTabPar.OR2[2] < 0) and tMainTabPar.SDF == 4 then
nDispFront = -1
DGD.GHT = '_2HIDE'
elseif not DGD.GHT then
DGD.GHT = '_HIDE'
end
-- cancello tutti i percorsi ghost
local DelList = MB.FindEntitiesWithPartName( tPz, DGD.GHT)
-- ciclo su tutte le entità trovate
for j = 1, #DelList do
EgtErase( DelList[j] )
end
-- elimino percorsi eventualmente creati dal Mach
DelList = MB.FindEntitiesWithPartName( tPz, 'ROUGH_')
-- ciclo su tutte le entità trovate
for j = 1, #DelList do
EgtErase( DelList[j] )
end
-- se seconda macchina verifico se ho lavorato un profilo lo setto come fatto
if nDispFront < 0 then
-- se lato hinge da lavorare e ho effettivamente lavorato il lato, lo disabilito
if bHingeMach and DGD.MHS and DGD.MHS == 1 then
bHingeMach = false
if bAtRight then
dLeftOffs = 0
else
dRightOffs = 0
end
end
-- se lato lock da lavorare e ho effettivamente lavorato il lato, lo disabilito
if bLockMach and DGD.MLS and DGD.MLS == 1 then
bLockMach = false
if bAtRight then
dRightOffs = 0
else
dLeftOffs = 0
end
end
-- se lato top da lavorare e ho effettivamente lavorato il lato, lo disabilito
if bTopMach and DGD.MTS and DGD.MTS == 1 then
bTopMach = false
dTopOffs = 0
end
-- se lato bottom da lavorare e ho effettivamente lavorato il lato, lo disabilito
if bBottomMach and DGD.MBS and DGD.MBS == 1 then
bBottomMach = false
dBottomOffs = 0
end
end
-- Set Current Machine: si setta sulla fase 1
EgtSetCurrMachine( tMainTabPar.MN)
-------------------------------------------------------------------------------------------------------
-- per questa macchina è importante differenziare il nome del profilo lato lock rispetto al lato hinge
-- in modo che venga lavorato prima il lato hinge e poi il lock
-------------------------------------------------------------------------------------------------------
-- Recupero le entità
local nLockProf
-- se serratura è a destra cerco il nome dl profilo corrispondente a quel lato
if bAtRight then
nLockProf = EgtGetFirstNameInGroup( Pz, 'Right')
else
nLockProf = EgtGetFirstNameInGroup( Pz, 'Left')
end
local EntListHg = MB.FindEntities( nLockProf)
sLockTrim = sLockTrim..'_LK'
-- rinomino tutte le entità del gruppo
for j = 1, #EntListHg do
local sNameEnt = EgtGetName( EntListHg[j])
if not string.find( sNameEnt, '_LK') then
sNameEnt = sNameEnt .. '_LK'
end
EgtSetName( EntListHg[j], sNameEnt)
end
-- faccio tutte le fasi ( probabilmente solo una perché non sono previsti ribaltamenti)
while bWork do
-- nTime = EgtStopCounter()
-- if not DGD or not DGD.NCGEN then
-- EgtOutBox( string.format( '1 tempo calcolato sec: %s', (nTime/1000)), 'Time1', 'Time1')
-- end
-- -- inizializzo il contatore
-- EgtStartCounter()
sDispMode = ''
bMachUnder = nil
nNumGroup = nNumGroup + 1
-- Set Machining Group
if not sAssemb then -- se pezzo unico
nMchId = EgtAddMachGroup( 'Mach_' .. EgtNumToString( nNumGroup,0) .. '_' .. tMainTabPar.MN)
else
nMchId = EgtAddMachGroup( 'Id_'.. EgtNumToString(Pz,0) ..'_'..'Mach_' .. EgtNumToString(nNumGroup,0) .. '_' .. tMainTabPar.MN)
end
-- nTime = EgtStopCounter()
-- if not DGD or not DGD.NCGEN then
-- EgtOutBox( string.format( '2 tempo calcolato sec: %s', (nTime/1000)), 'Time1', 'Time1')
-- end
-- -- inizializzo il contatore
-- EgtStartCounter()
if nMchId then
local sLocNumGroup = ''
if nNumGroup > 1 then sLocNumGroup = '_'..EgtNumToString(nNumGroup,0) end
-- provo ad eliminare il file .tok per il prod
EgtEraseFile( sFileDir .. sFileName .. sLocNumGroup .. '.tok')
-- se nome cn non generato automaticamente (cioè dal campo interno al ddf) ma dal nome del file
if tMainTabPar.DACN == 1 then
EgtSetInfo( nMchId, 'NcName', sFileName .. sLocNumGroup .. '.cnc')
end
-- assegno al gruppo di lavoro l'info relativo allo stato del controllo collisione
EgtSetInfo( nMchId, 'EnableCollisionDetect', tMainTabPar.ECD)
-- assegno al gruppo di lavoro la lunghezza minima porta
EgtSetInfo( nMchId, 'LongDoorLimit', tMainTabPar.BDH)
-- Simulation for collision check
if tMainTabPar.ECD == 1 then
EgtSetInfo( nMchId, 'Vm', '1')
end
end
nNumPhase = EgtGetCurrPhase()
-----------------------------------------------------------------------
-- Calcolo dei sovramateriali e definizione e posizionamento del grezzo
-----------------------------------------------------------------------
-- se check macchina settato per non gestire grezzo
if MachinesName[nNumMachFromTable].MakeRaw ~= nil and not MachinesName[nNumMachFromTable].MakeRaw then
dLeftOffs = 0
dRightOffs = 0
dTopOffs = 0
dBottomOffs = 0
end
ColA = Color3d( 255, 165, 0, 15)
nRaw = EgtAddRawPart( Point3d(0,0,0),b3Solid:getDimX() + dLeftOffs + dRightOffs,
b3Solid:getDimY() + dTopOffs + dBottomOffs, b3Solid:getDimZ(), ColA)
EgtAddPartToRawPart( Pz, b3Part:getMin() - b3Solid:getMin() + Vector3d( dLeftOffs, dBottomOffs, 0), nRaw)
-- fase premach, in base al profilo cerniere e/o serratura, e se ci sono lavorazioni sopra o sotto o entrambe,
-- decido su quale lato disporre la porta per evitare inutili ribaltamenti
-- ricavo minimo e massimo del solido del pezzo
b3SolidOnTab = EgtGetBBoxGlob( Ls, GDB_BB.EXACT)
pMin = b3SolidOnTab:getMin()
pMax = b3SolidOnTab:getMax()
tLocMach = MTable
tLocMachOrd = MTableOrd
sMachProf = ''
-- in base ai valori di sovramateriale sui lati, se tutti sono al di sotto di 3 volte il valore di attivazione della sgrossatura
-- allora disabilito lo scrapmode
if dLeftOffs < tMainTabPar.MSV and dRightOffs < tMainTabPar.MSV and dTopOffs < tMainTabPar.MSV and dBottomOffs < tMainTabPar.MSV then
tMainTabPar.RSM = 0
end
-- prendo nota dei profili tipo bevel e bull nose
-- verifico se cave da sotto o da sopra
-- verifico se trovate lavorazioni applicate con 'shift'
local nUnderGeom
for i = 1, #tLocMach do
if tLocMach[i].On ~= 0 then
sLocMachId = tLocMach[i].MachId
-- se non c'è il campo macchina setto di default la 1
if not sLocMachId then sLocMachId = 1 end
-- se macchina corrispondente
if sLocMachId == nNumMachFromTable then
local sUpperProfName = string.upper(tLocMach[i].Name)
-- prendo i profili bevel direttamente dalla tabella
if tLocMach[i].Oper and tLocMach[i].Oper == 'AdjustBevel' then
if not string.find( sProfiles, sUpperProfName) then
sProfiles = sProfiles .. sUpperProfName .. ','
end
end
-- Recupero le entità
local EntList = MB.FindEntitiesWithName( Pz, tLocMach[i].Name)
-- Test delle lavorazioni
for j = 1, #EntList do
-- OPERAZIONI
if tLocMach[i].Oper == 'AdjustThrouIsle' then
bLocMach, nUnderGeom = MB.TestThrouIsle( EntList[j], b3Solid:getDimZ(), pMin, pMax, bWorkUnder)
if bLocMach then
if nUnderGeom and nUnderGeom == 1 then
nNumGeomBottom = nNumGeomBottom + 1
elseif nUnderGeom and nUnderGeom == -1 then
nNumGeomTop = nNumGeomTop + 1
end
end
elseif tLocMach[i].Oper == 'AdjustVertHole' then
bLocMach, nUnderGeom = MB.TestVertHole( EntList[j], b3Solid:getDimZ(), pMin, pMax, bWorkUnder)
if bLocMach then
if nUnderGeom and nUnderGeom == 1 then
nNumGeomBottom = nNumGeomBottom + 1
nNumGeomBottomHole = nNumGeomBottomHole + 1
elseif nUnderGeom and nUnderGeom == -1 then
nNumGeomTop = nNumGeomTop + 1
nNumGeomTopHole = nNumGeomTopHole + 1
end
end
end
end
end
end
end
-----------------------
-- *** Disposizione ***
-----------------------
-- controllo se ho profili bullnose sul lato hinge (INDIPENDENTEMENTE CHE SIANO O MENO DA LAVORARE)
if nNumMachFromCam ~= 2 and ( sHingeTrim == '1B' or sHingeTrim == '2B') then -- se profilo cerniere è bullnose
bShiftedDoor = true
end
-- controllo se ho profili bullnose sul lato serratura (INDIPENDENTEMENTE CHE SIANO O MENO DA LAVORARE)
if ( sLockTrim == '1B_LK' or sLockTrim == '2B_LK' or sLockTrim == '3B_LK' or sLockTrim == '4B_LK') then -- se profilo serratura indicato è bullnose
vShiftVac = tMainTabPar.SHL
else
vShiftVac = vNullShift
end
-- Scelta della tavola
sTab = 'Tab'
EgtSetTable( sTab)
-- Origine tavola corrente rispetto a Zero macchina
tabOri = EgtGetTableRef( 1)
-- Rotazione porta in base alla macchina
bMoveRaw = false
-- definito col cliente: prima comanda il lato hinge, se ha il bevel lo si dispone secondo quello che c'è nel ddf
-- se il lato hinge non ha profilo bevel si guarda il profilo lock, se ha un bevel allora guardo quello.
-- in caso di inactive doors con bevel paralleli comanda ovviamente il lato hinge
-- in caso nessuno dei due lati ha un profilo bevel, utilizzo il parametro Secure passato nel ddf
-- se non c'è il parametro considero la porta come se avesse bevel down
-- ed effettuo il ribaltamento e rotazioni in base allo swing ( con DGD.SwDD = 1 nel file EgtDoorsData)
if sSwing == 'RH' or sSwing == 'RHA' or sSwing == 'RHI' or
sSwing == 'LH' or sSwing == 'LHA' or sSwing == 'LHI' then
bPush = true
else
bPush = false
end
local sNumPhase
if nNumPhase and nNumPhase < 10 then
sNumPhase = '0'.. tostring( nNumPhase)
elseif nNumPhase then
sNumPhase = tostring( nNumPhase)
else
sNumPhase = '0'
end
local bOkDisp = false
nNumProbeZ = 0
-- prima controllo che il lato cerniere abbia un bevel (da lavorare), se no passo al lato serratura,
-- se non ha bevel nemmeno il lato serratura considero il parametro secure
-- if ( sHingeTrim == 'BD' or sHingeTrim == 'BU') and bHingeMach then -- se profilo cerniera indicato bevel e da lavorare
if ( sHingeTrim == 'BD' or sHingeTrim == 'BU' or sHingeTrim == 'BDEB' or sHingeTrim == 'BUEB') then -- se profilo cerniera indicato bevel
-- verifico se i profili risultanti sono presenti in tabella
if sHingeTrim == 'BD' and bPush and string.find( sProfiles, 'BU,') then
bOkDisp = true
elseif sHingeTrim == 'BDEB' and bPush and string.find( sProfiles, 'BU,') then
bOkDisp = true
elseif sHingeTrim == 'BD' and not bPush and string.find( sProfiles, 'BD,') then
bOkDisp = true
elseif sHingeTrim == 'BDEB' and not bPush and string.find( sProfiles, 'BD,') then
bOkDisp = true
elseif sHingeTrim == 'BU' and not bPush and string.find( sProfiles, 'BD,') then
bOkDisp = true
elseif sHingeTrim == 'BUEB' and not bPush and string.find( sProfiles, 'BD,') then
bOkDisp = true
elseif sHingeTrim == 'BU' and bPush and string.find( sProfiles, 'BU,') then
bOkDisp = true
elseif sHingeTrim == 'BUEB' and bPush and string.find( sProfiles, 'BU,') then
bOkDisp = true
end
if bOkDisp then
-- casi in cui il bevel indicato nel ddf non corrisponde al bevel generato dallo swing
-- devo ribaltare la porta e la parte top va posizionata in modo che il lato cerniere sia davanti
if ( ( sHingeTrim == 'BD' or sHingeTrim == 'BDEB') and bPush) or
( ( sHingeTrim == 'BU' or sHingeTrim == 'BUEB') and not bPush) then
bFlip = true
if bAtRight then -- se serratura a destra
bTopOnRight = true
else
bTopOnRight = false
end
-- gli altri casi in cui il bevel indicato corrisponde al bevel generato dallo swing
-- non devo ribaltare la porta e la parte top va posizionata in modo che il lato cerniere sia davanti
else
bFlip = false
if bAtRight then -- se serratura a destra
bTopOnRight = false
else
bTopOnRight = true
end
end
end
end
-- se profilo serratura indicato bevel (e da lavorare)
-- if ( sLockTrim == 'BD_LK' or sLockTrim == 'BU_LK') and bLockMach and not bOkDisp then
if ( sLockTrim == 'BD_LK' or sLockTrim == 'BU_LK' or sLockTrim == 'BDEB_LK' or sLockTrim == 'BUEB_LK') and not bOkDisp then
-- verifico se i profili risultanti sono presenti in tabella
if sLockTrim == 'BD_LK' and bPush and string.find( sProfiles, 'BU_LK,') then
bOkDisp = true
elseif sLockTrim == 'BDEB_LK' and bPush and string.find( sProfiles, 'BU_LK,') then
bOkDisp = true
elseif sLockTrim == 'BD_LK' and not bPush and string.find( sProfiles, 'BD_LK,') then
bOkDisp = true
elseif sLockTrim == 'BDEB_LK' and not bPush and string.find( sProfiles, 'BD_LK,') then
bOkDisp = true
elseif sLockTrim == 'BU_LK' and not bPush and string.find( sProfiles, 'BD_LK,') then
bOkDisp = true
elseif sLockTrim == 'BUEB_LK' and not bPush and string.find( sProfiles, 'BD_LK,') then
bOkDisp = true
elseif sLockTrim == 'BU_LK' and bPush and string.find( sProfiles, 'BU_LK,') then
bOkDisp = true
elseif sLockTrim == 'BUEB_LK' and bPush and string.find( sProfiles, 'BU_LK,') then
bOkDisp = true
end
if bOkDisp then
-- casi in cui il bevel indicato nel ddf non corrisponde al bevel generato dallo swing
-- a meno che ho il profilo opposto, in questo caso non ribalto la porta, altrimenti devo ribaltare la porta
-- e la parte top va posizionata in modo che il lato cerniere sia davanti
if ( ( sLockTrim == 'BD_LK' or sLockTrim == 'BDEB_LK') and bPush) or
( ( sLockTrim == 'BU_LK' or sLockTrim == 'BUEB_LK') and not bPush and not bOppoBevelProf) or
( ( sLockTrim == 'BU_LK' or sLockTrim == 'BUEB_LK') and bPush and bOppoBevelProf) then
bFlip = true
if bAtRight then -- se serratura a destra
bTopOnRight = true
else
bTopOnRight = false
end
-- gli altri casi in cui il bevel indicato corrisponde al bevel generato dallo swing
-- non devo ribaltare la porta e la parte top va posizionata in modo che il lato cerniere sia davanti
else
bFlip = false
if bAtRight then -- se serratura a destra
bTopOnRight = false
else
bTopOnRight = true
end
end
end
end
-- se profilo top indicato bevel (e da lavorare)
if ( sTopTrim == 'BD' or sTopTrim == 'BU' or sTopTrim == 'BDEB' or sTopTrim == 'BUEB') and not bOkDisp then
-- verifico se i profili risultanti sono presenti in tabella
if sTopTrim == 'BD' and bPush and string.find( sProfiles, 'BU,') then
bOkDisp = true
elseif sTopTrim == 'BDEB' and bPush and string.find( sProfiles, 'BU,') then
bOkDisp = true
elseif sTopTrim == 'BD' and not bPush and string.find( sProfiles, 'BD,') then
bOkDisp = true
elseif sTopTrim == 'BDEB' and not bPush and string.find( sProfiles, 'BD,') then
bOkDisp = true
elseif sTopTrim == 'BU' and not bPush and string.find( sProfiles, 'BD,') then
bOkDisp = true
elseif sTopTrim == 'BUEB' and not bPush and string.find( sProfiles, 'BD,') then
bOkDisp = true
elseif sTopTrim == 'BU' and bPush and string.find( sProfiles, 'BU,') then
bOkDisp = true
elseif sTopTrim == 'BUEB' and bPush and string.find( sProfiles, 'BU,') then
bOkDisp = true
end
if bOkDisp then
-- casi in cui il bevel indicato nel ddf non corrisponde al bevel generato dallo swing
-- devo ribaltare la porta e la parte top va posizionata in modo che il lato cerniere sia davanti
if ( ( sTopTrim == 'BD' or sTopTrim == 'BDEB') and bPush) or
( ( sTopTrim == 'BU' or sTopTrim == 'BUEB') and not bPush) then
bFlip = true
if bAtRight then -- se serratura a destra
bTopOnRight = true
else
bTopOnRight = false
end
-- gli altri casi in cui il bevel indicato corrisponde al bevel generato dallo swing
-- non devo ribaltare la porta e la parte top va posizionata in modo che il lato cerniere sia davanti
else
bFlip = false
if bAtRight then -- se serratura a destra
bTopOnRight = false
else
bTopOnRight = true
end
end
end
end
-- se profilo top indicato bevel (e da lavorare)
if ( sBottomTrim == 'BD' or sBottomTrim == 'BU' or sBottomTrim == 'BDEB' or sBottomTrim == 'BUEB') and not bOkDisp then
-- verifico se i profili risultanti sono presenti in tabella
if sBottomTrim == 'BD' and bPush and string.find( sProfiles, 'BU,') then
bOkDisp = true
elseif sBottomTrim == 'BDEB' and bPush and string.find( sProfiles, 'BU,') then
bOkDisp = true
elseif sBottomTrim == 'BD' and not bPush and string.find( sProfiles, 'BD,') then
bOkDisp = true
elseif sBottomTrim == 'BDEB' and not bPush and string.find( sProfiles, 'BD,') then
bOkDisp = true
elseif sBottomTrim == 'BU' and not bPush and string.find( sProfiles, 'BD,') then
bOkDisp = true
elseif sBottomTrim == 'BUEB' and not bPush and string.find( sProfiles, 'BD,') then
bOkDisp = true
elseif sBottomTrim == 'BU' and bPush and string.find( sProfiles, 'BU,') then
bOkDisp = true
elseif sBottomTrim == 'BUEB' and bPush and string.find( sProfiles, 'BU,') then
bOkDisp = true
end
if bOkDisp then
-- casi in cui il bevel indicato nel ddf non corrisponde al bevel generato dallo swing
-- devo ribaltare la porta e la parte top va posizionata in modo che il lato cerniere sia davanti
if ( ( sBottomTrim == 'BD' or sBottomTrim == 'BDEB') and bPush) or
( ( sBottomTrim == 'BU' or sBottomTrim == 'BUEB') and not bPush) then
bFlip = true
if bAtRight then -- se serratura a destra
bTopOnRight = true
else
bTopOnRight = false
end
-- gli altri casi in cui il bevel indicato corrisponde al bevel generato dallo swing
-- non devo ribaltare la porta e la parte top va posizionata in modo che il lato cerniere sia davanti
else
bFlip = false
if bAtRight then -- se serratura a destra
bTopOnRight = false
else
bTopOnRight = true
end
end
end
end
-- in caso non ci sia nessun profilo bevel verifico il parametro Secure
if not bOkDisp then
-- se il parametro secure è passato con valore '0' prendo quello del CurCamInfo altrimenti do errore
if sSecure and string.upper(sSecure) == '0' then
-- se parametro da CurrcamInfo non è valido do errore
if not tMainTabPar.LS or ( string.upper(tMainTabPar.LS) ~= 'UP' and string.upper(tMainTabPar.LS) ~= 'DN') then
bOk = false
DGD.EMC = ' ' .. EgtDoorsMsg[590]
break
else
sSecure = tMainTabPar.LS
end
end
-- se lato secure va sopra il ribaltamento è obbligato
if sSecure and string.upper(sSecure) == 'UP' then
bFlip = true
if bAtRight then -- se serratura a destra
bTopOnRight = true
else
bTopOnRight = false
end
elseif sSecure and string.upper(sSecure) == 'DN' then
bFlip = false
if bAtRight then -- se serratura a destra
bTopOnRight = false
else
bTopOnRight = true
end
-- altrimenti la preferenza sembrerebbe essere ( non è ancora confermata) quella di considerare la porta bevel down
-- quindi se è una reverse non deve essere ribaltata, mentre se è normale deve essere ribaltata
-- ed effettuo il ribaltamento e rotazioni in base allo swing ( con DGD.SwDD = 1 nel file EgtDoorsData)
else
if bSwingDriveDisp then -- se metodo di posizionamento guidato dallo swing
-- se porta a spingere ( dovrebbe avere bevel up) la ribalto per essere bevel down
if bPush then
bFlip = true
if bAtRight then -- se serratura a destra
bTopOnRight = true
else
bTopOnRight = false
end
-- se porta a tirare non la ribalto perché si presta già ad essere bevel down
else
bFlip = false
if bAtRight then -- se serratura a destra
bTopOnRight = false
else
bTopOnRight = true
end
end
else -- in base alle geometrie trovate ribalto o meno la porta
if nNumGeomBottom > nNumGeomTop then
bFlip = true
if bAtRight then -- se serratura a destra
bTopOnRight = true
else
bTopOnRight = false
end
elseif nNumGeomTop >= nNumGeomBottom then
bFlip = false
if bAtRight then -- se serratura a destra
bTopOnRight = false
else
bTopOnRight = true
end
else -- altrimenti vecchio metodo
bFlip = true
if bAtRight then -- se serratura a destra
bTopOnRight = true
else
bTopOnRight = false
end
end
end
end
end
-- se il lato in fronte è il lato lock
if tMainTabPar.SDF > 1 and tMainTabPar.SDF < 4 then
bTopOnRight = not bTopOnRight
end
-- faccio le rotazioni della porta
if bFlip then
EgtRotateRawPart( nRaw, Y_AX(), 180)
sDispMode = sDispMode .. EgtDoorsMsg[511] .. sNumPhase .. ' ' .. EgtDoorsMsg[479]
else
sDispMode = sDispMode .. EgtDoorsMsg[511] .. sNumPhase .. ' ' .. EgtDoorsMsg[480]
end
if bTopOnRight then
EgtRotateRawPart( nRaw, Z_AX(), -90)
sDispMode = sDispMode .. EgtDoorsMsg[481]
else
EgtRotateRawPart( nRaw, Z_AX(), 90)
sDispMode = sDispMode .. EgtDoorsMsg[482]
end
if bShiftedDoor then
sDispMode = sDispMode .. EgtDoorsMsg[510]
end
sTotDispMode = sTotDispMode .. ' ' .. sDispMode .. '\n'
-----------------------------------------------------------------------------------------------
-- Scelta della disposizione e di conseguenza dell'origine (ora espressa rispetto Zero Tavola)
-----------------------------------------------------------------------------------------------
local bLocTopOnRight = bTopOnRight
-- se il lato di riferimento è il bottom, inverto il flag della disposizione lato top
if FORCEDISPMODE == 0 and ( tMainTabPar.SDF == 0 or tMainTabPar.SDF == 2) then
bLocTopOnRight = not bTopOnRight
end
if FORCEDISPMODE == 0 then -- disposizione segue il top della porta
if bLocTopOnRight then
nDispMode = -1
else
-- 19.09.2023 richiesta di Mark Hoffman: per problemi di presenza della polvere: se la porta ha lato top e/o bottom lavorate, la disposizione della porta
-- deve essere fatta a destra
if tMainTabPar.FDD > 0 and ( bTopMach or bBottomMach) then
nDispMode = -1
else
nDispMode = 1
end
end
else
nDispMode = FORCEDISPMODE
end
Ori = EgtIf( nDispMode > 0, tMainTabPar.OR1, tMainTabPar.OR2)
-- se porta da traslare setto lo shift da applicare
if bShiftedDoor then
vShift = tMainTabPar.SH1
else
vShift = vNullShift
end
Ori = Ori + vShift
-- se ho macchine in linea, tolgo il prefisso NO_ ai percorsi side probe
if tMainTabPar.DSPP > 0 then
-- debug
-- if tMainTabPar.DSPP == 3 then
-- EgtSaveFile()
-- EgtMove(DGD.PZ, Point3d(0,0,nil) - ORIG())
-- end
-- recupero entità probe di fianco disabilitati
local ProbeList = MB.FindEntitiesWithName( Pz, 'NO_ProbeSidePoint')
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
if bFlip then
EgtSetName( ProbeList[j], 'ProbeSidePoint_secure' )
else
EgtSetName( ProbeList[j], 'ProbeSidePoint_keyway' )
end
end
-- se seconda macchina recupero eventuali entità probe sul lato hinge e lock che sono state disabilitate se il lato è stato lavorato
if nDispFront < 0 then
local sInfoToFind
-- se lato hinge lavorato
if DGD.MHS and DGD.MHS == 1 then
ProbeList = MB.FindEntitiesWithName( Pz, 'NO_Hinge_Probe')
for j = 1, #ProbeList do
sInfoToFind = EgtGetInfo( ProbeList[j], 'OriName', 's') or ''
if #sInfoToFind > 0 then
EgtSetName( ProbeList[j], sInfoToFind)
end
end
end
-- se lato lock lavorato
if DGD.MLS and DGD.MLS == 1 then
ProbeList = MB.FindEntitiesWithName( Pz, 'NO_Shuttle_Probe')
for j = 1, #ProbeList do
sInfoToFind = EgtGetInfo( ProbeList[j], 'OriName', 's') or ''
if #sInfoToFind > 0 then
EgtSetName( ProbeList[j], sInfoToFind)
end
end
end
end
end
-- se c'è probe mode (prod) filtro le geometrie che si trovano sotto
if nProbeMode == 1 then
if bFlip then
DelList = MB.FindEntitiesWithPartName( tPz, 'ProbePoint_keyway')
else
DelList = MB.FindEntitiesWithPartName( tPz, 'ProbePoint_secure')
end
-- cancello tutte le entità trovate
for j = 1, #DelList do
EgtErase( DelList[j] )
end
DelList = MB.FindEntitiesWithPartName( tPz, 'ProbeSidePoint_secure')
-- calcello su tutte le entità trovate
for j = 1, #DelList do
EgtErase( DelList[j] )
end
DelList = MB.FindEntitiesWithPartName( tPz, 'ProbeSidePoint_keyway')
-- calcello su tutte le entità trovate
for j = 1, #DelList do
EgtErase( DelList[j] )
end
-- rinomino i rimanenti
if bFlip then
DelList = MB.FindEntitiesWithPartName( tPz, 'ProbePoint_secure')
else
DelList = MB.FindEntitiesWithPartName( tPz, 'ProbePoint_keyway')
end
-- mi tengo via il numero di probe in Z
nNumProbeZ = #DelList
-- ciclo su tutte le entità trovate
for j = 1, #DelList do
EgtSetName( DelList[j], 'ProbePoint')
end
-- se non c'è probe mode (prod) e abilitata la tastatura di fianco filtro le geometrie che si trovano sopra e sotto
elseif nProbeMode == 0 and nPostProbeSet >= 3 then
DelList = MB.FindEntitiesWithPartName( tPz, 'ProbePoint_secure')
-- calcello su tutte le entità trovate
for j = 1, #DelList do
EgtErase( DelList[j] )
end
DelList = MB.FindEntitiesWithPartName( tPz, 'ProbePoint_keyway')
-- calcello su tutte le entità trovate
for j = 1, #DelList do
EgtErase( DelList[j] )
end
if bFlip then
DelList = MB.FindEntitiesWithPartName( tPz, 'ProbeSidePoint_keyway')
else
DelList = MB.FindEntitiesWithPartName( tPz, 'ProbeSidePoint_secure')
end
-- ciclo su tutte le entità trovate
for j = 1, #DelList do
EgtErase( DelList[j] )
end
-- rinomino i rimanenti cancellando eventualmente quelli indicati dal parametro tMainTabPar.DSPP > 0
if bFlip then
DelList, DelListTwo = MB.FindEntitiesWithPartName( tPz, 'ProbeSidePoint_secure', nil, 'SideApplied', tMainTabPar.DSPP)
else
DelList, DelListTwo = MB.FindEntitiesWithPartName( tPz, 'ProbeSidePoint_keyway', nil, 'SideApplied', tMainTabPar.DSPP)
end
-- ciclo su tutte le entità trovate e le cancello
for j = 1, #DelListTwo do
EgtErase( DelListTwo[j] )
end
-- mi tengo via il numero di probe sul fianco
nNumProbeZ = #DelList
-- ciclo su tutte le entità trovate
for j = 1, #DelList do
EgtSetName( DelList[j], 'ProbeSidePoint')
end
else -- se non c'è il probe point elimino tutti i percorsi di probe (in Z)
DelList = MB.FindEntitiesWithPartName( tPz, 'ProbePoint')
-- ciclo su tutte le entità trovate
for j = 1, #DelList do
EgtErase( DelList[j] )
end
DelList = MB.FindEntitiesWithPartName( tPz, 'ProbeSidePoint')
-- ciclo su tutte le entità trovate
for j = 1, #DelList do
EgtErase( DelList[j] )
end
end
------------------------------------------------------------------
-- calcolo delta Y in base al profilo e al ribaltamento del pezzo
------------------------------------------------------------------
local vExtraYDelta
local dExtraY = 0
local dExtraYOppo = 0
local dDeltaProbe = 0
local dDeltaProbeOppo = 0
local dDeltaProf = 0
local dDeltaProfOppo = 0
local dAltReference = EgtIf( bShiftedDoor, tMainTabPar.ARS, tMainTabPar.AR)
local dThickReference = EgtIf( bShiftedDoor, tMainTabPar.TRS, tMainTabPar.TR)
-- variabili per note relative al lato hinges
local nHingeMach = 0 -- setto default non lavorato
local nLockMach = 0 -- setto default non lavorato
local nTopMach = 0 -- setto default non lavorato
local nBottomMach = 0 -- setto default non lavorato
local nSideType = -1 -- 0 per profili SQ or FDWC
local nSideOppoType = -1 -- 0 per profili SQ
local nTopType = -1 -- 0 per profili SQ or FDWC
local nBottomType = -1 -- 0 per profili SQ or FDWC
-- setto suffisso per le note se macchine in linea
local sLineMachineSuffix = ''
if tMainTabPar.SDF == 4 then
if nDispFront < 0 then
sLineMachineSuffix = '_2'
else
sLineMachineSuffix = '_1'
end
end
-- verifico profilo in battuta (hinge)
if sHingeTrim == 'SQ' or sHingeTrim == 'EB' or sHingeTrim == 'FDWC' then
nSideType = 0
-- se disposizione bevel down uso il riferimento in alto
elseif sHingeTrim == 'BD' or sHingeTrim == 'BDEB' then
nSideType = 1
if dThickDoor > dAltReference then
dExtraY = ( dThickDoor - dAltReference) * TAN3
end
-- se abilitato il side probe
if nProbeMode == 0 and nPostProbeSet >= 3 then
-- calcolo errore del probe tastando dallo spessore - il parametro z extra probe
dDeltaProf = tMainTabPar.EZPB * TAN3
else
-- calcolo errore del probe tastando a metà spessore - il parametro z extra probe
dDeltaProf = ((( dThickDoor / 2) - tMainTabPar.EZPB) * TAN3)
end
dDeltaProbe = dDeltaProf - dExtraY
-- dato che viene compensato il dDeltaProbe nella tastatura. il dDeltaProf risulta essere uguale a dExtraY
dDeltaProf = dExtraY
-- se disposizione bevel up uso il riferimento in basso
elseif sHingeTrim == 'BU' or sHingeTrim == 'BUEB' then
nSideType = 2
dExtraY = ( dAltReference - dThickReference) * TAN3
-- se abilitato il side probe
if nProbeMode == 0 and nPostProbeSet >= 3 then
-- calcolo errore del probe tastando dallo spessore - il parametro z extra probe
dDeltaProf = (( dThickDoor - tMainTabPar.EZPB) * TAN3)
else
-- calcolo errore del probe tastando a metà spessore + il parametro z extra probe
dDeltaProf = ((( dThickDoor / 2) + tMainTabPar.EZPB) * TAN3)
end
dDeltaProbe = dDeltaProf - dExtraY
-- dato che viene compensato il dDeltaProbe nella tastatura. il dDeltaProf risulta essere uguale a dExtraY
dDeltaProf = dExtraY
-- se profilo bull nose verifico in base al raggio
elseif sHingeTrim == '1B' or sHingeTrim == '2B' or
sHingeTrim == '3B' or sHingeTrim == '4B' then
nSideType = 3
-- calcolo punto massimo ingombro profilo
local dAltProf = dThickDoor/2
local dAltcalc = 0
-- se punto max è sotto il minimo riferimento
if dAltProf < ( dAltReference - dThickReference) then
dAltcalc = dAltReference - dThickReference - dAltProf
-- se punto max è sopra il massimo riferimento
elseif dAltProf > dAltReference then
dAltcalc = dAltProf - dAltReference
end
-- se punto massimo profilo non è compreso nel riferimento calcolo il delta Y
if dAltcalc > 0 then
dExtraY = tsRadiusProf[1] - sqrt((tsRadiusProf[1]*tsRadiusProf[1])-(dAltcalc*dAltcalc))
end
-- calcolo errore del probe tastando a metà spessore
dDeltaProbe = -dExtraY
-- dato che viene compensato il dDeltaProbe nella tastatura. il dDeltaProf risulta essere uguale a dExtraY
dDeltaProf = dExtraY
-- se profilo convex verifico in base al raggio
elseif sHingeTrim == 'CV' then
nSideType = 4
-- calcolo punto minimo ingombro profilo
local dAltProf = dThickDoor/2
local dAltcalc = (dThickReference/2)
-- calcolo il delta Y massimo del minimo ingombro profilo
local dMaxInsPrf = sqrt((tsRadiusProf[1]*tsRadiusProf[1])-((dAltProf-tsPlaneProf[1])*(dAltProf-tsPlaneProf[1])))
-- se riferimento è sul max ingombro porta
if ( dThickDoor < dAltReference) and ( dThickDoor > ( dAltReference - dThickReference)) then
dAltcalc = 0
-- se punto minimo ingombro profilo è sotto all'altezza media del riferimento
elseif dAltProf < ( dAltReference - (dThickReference/2)) then
dAltcalc = dAltReference - dAltProf
-- se punto minimo ingombro profilo è sopra all'altezza media del riferimento
elseif dAltProf > ( dAltReference - (dThickReference/2)) then
dAltcalc = dAltProf - dAltReference + dThickReference
end
-- calcolo il delta Y
if dAltcalc > 0 then
dExtraY = sqrt((tsRadiusProf[1]*tsRadiusProf[1])-(dAltcalc*dAltcalc)) - dMaxInsPrf
end
-- calcolo errore del probe tastando a metà spessore
dDeltaProbe = tsRadiusProf[1] - (dExtraY + dMaxInsPrf)
-- dato che viene compensato il dDeltaProbe nella tastatura. il dDeltaProf risulta essere uguale a dExtraY
dDeltaProf = dExtraY
end
-- verifico profilo opposto alla battuta (lock)
if sLockTrim == 'SQ_LK' or sLockTrim == 'EB_LK' then
nSideOppoType = 0
-- se disposizione bevel down uso il riferimento in alto
elseif sLockTrim == 'BD_LK' or sLockTrim == 'BDEB_LK' then
nSideOppoType = 1
if dThickDoor > dAltReference then
dExtraYOppo = ( dThickDoor - dAltReference) * TAN3
end
-- se abilitato il side probe
if nProbeMode == 0 and nPostProbeSet >= 3 then
-- calcolo errore del probe tastando dallo spessore - il parametro z extra probe
dDeltaProfOppo = tMainTabPar.EZPB * TAN3
else
-- calcolo errore del probe tastando a metà spessore - il parametro z extra probe
dDeltaProfOppo = ((( dThickDoor / 2) - tMainTabPar.EZPB) * TAN3)
end
dDeltaProbeOppo = dDeltaProfOppo - dExtraYOppo
-- dato che viene compensato il dDeltaProbeOppo nella tastatura. il dDeltaProf risulta essere uguale a dExtraY
-- dDeltaProfOppo = dExtraYOppo
-- se disposizione bevel up uso il riferimento in basso
elseif sLockTrim == 'BU_LK' or sLockTrim == 'BUEB_LK' then
nSideOppoType = 2
dExtraYOppo = ( dAltReference - dThickReference) * TAN3
-- se abilitato il side probe
if nProbeMode == 0 and nPostProbeSet >= 3 then
-- calcolo errore del probe tastando dallo spessore - il parametro z extra probe
dDeltaProfOppo = (( dThickDoor - tMainTabPar.EZPB) * TAN3)
else
-- calcolo errore del probe tastando a metà spessore + il parametro z extra probe
dDeltaProfOppo = ((( dThickDoor / 2) + tMainTabPar.EZPB) * TAN3)
end
dDeltaProbeOppo = dDeltaProfOppo - dExtraYOppo
-- dato che viene compensato il dDeltaProbeOppo nella tastatura. il dDeltaProf risulta essere uguale a dExtraY
-- dDeltaProfOppo = dExtraYOppo
-- se profilo bull nose verifico in base al raggio
elseif sLockTrim == '1B_LK' or sLockTrim == '2B_LK' or
sLockTrim == '3B_LK' or sLockTrim == '4B_LK' then
nSideOppoType = 3
-- calcolo punto massimo ingombro profilo
local dAltProf = dThickDoor/2
local dAltcalc = 0
-- se punto max è sotto il minimo riferimento
if dAltProf < ( dAltReference - dThickReference) then
dAltcalc = dAltReference - dThickReference - dAltProf
-- se punto max è sopra il massimo riferimento
elseif dAltProf > dAltReference then
dAltcalc = dAltProf - dAltReference
end
-- se punto massimo profilo non è compreso nel riferimento calcolo il delta Y
if dAltcalc > 0 then
dExtraYOppo = tsRadiusProf[2] - sqrt((tsRadiusProf[2]*tsRadiusProf[2])-(dAltcalc*dAltcalc))
end
-- calcolo errore del probe tastando a metà spessore
dDeltaProbeOppo = -dExtraYOppo
-- dato che viene compensato il dDeltaProbeOppo nella tastatura. il dDeltaProf risulta essere uguale a dExtraY
-- dDeltaProfOppo = dExtraYOppo
-- se profilo convex verifico in base al raggio
elseif sLockTrim == 'CV_LK' then
nSideOppoType = 4
local dAltProfOppo
local dAltProfOppoTh
local dExtraYOppoTh
-- se abilitato il side probe
if nProbeMode == 0 and nPostProbeSet >= 3 then
-- calcolo punto minimo ingombro profilo
dAltProfOppoTh = dThickDoor/2 - tsPlaneProf[2]
-- calcolo errore del probe tastando a spessore completo - extra z
dAltProfOppo = (dThickDoor/2) - tMainTabPar.EZPB - tsPlaneProf[2]
-- calcolo il delta Y massimo del minimo ingombro profilo
dExtraYOppo = sqrt((tsRadiusProf[2]*tsRadiusProf[2])-(dAltProfOppo*dAltProfOppo))
dExtraYOppoTh = sqrt((tsRadiusProf[2]*tsRadiusProf[2])-(dAltProfOppoTh*dAltProfOppoTh))
-- calcolo errore del probe tastando dallo spessore - quota extra z
dDeltaProfOppo = dExtraYOppo - dExtraYOppoTh
else
-- calcolo punto minimo ingombro profilo
dAltProfOppo = dThickDoor/2 - tsPlaneProf[2]
-- calcolo il delta Y massimo del minimo ingombro profilo
dExtraYOppo = sqrt((tsRadiusProf[2]*tsRadiusProf[2])-(dAltProfOppo*dAltProfOppo))
-- calcolo errore del probe tastando a metà spessore
dDeltaProfOppo = tsRadiusProf[2] - dExtraYOppo
end
end
-- verifico profilo top
if sTopTrim == 'SQ' or sTopTrim == 'EB' or sTopTrim == 'FDWC' then
nTopType = 0
-- se disposizione bevel down
elseif sTopTrim == 'BD' or sTopTrim == 'BDEB' then
nTopType = 1
-- se disposizione bevel up uso il riferimento in basso
elseif sTopTrim == 'BU' or sTopTrim == 'BUEB' then
nTopType = 2
-- se profilo bull nose verifico in base al raggio
elseif sTopTrim == '1B' or sTopTrim == '2B' or
sTopTrim == '3B' or sTopTrim == '4B' then
nTopType = 3
-- se profilo convex verifico in base al raggio
elseif sTopTrim == 'CV' then
nTopType = 4
end
-- verifico profilo top
if sBottomTrim == 'SQ' or sBottomTrim == 'EB' or sBottomTrim == 'FDWC' then
nBottomType = 0
-- se disposizione bevel down
elseif sBottomTrim == 'BD' or sBottomTrim == 'BDEB' then
nBottomType = 1
-- se disposizione bevel up uso il riferimento in basso
elseif sBottomTrim == 'BU' or sBottomTrim == 'BUEB' then
nBottomType = 2
-- se profilo bull nose verifico in base al raggio
elseif sBottomTrim == '1B' or sBottomTrim == '2B' or
sBottomTrim == '3B' or sBottomTrim == '4B' then
nBottomType = 3
-- se profilo convex verifico in base al raggio
elseif sBottomTrim == 'CV' then
nBottomType = 4
end
-- se profilo hinge è da lavorare annullo il delta Y e setto il valore della nota
if bHingeMach then
dExtraY = 0
nHingeMach = 1
dDeltaProbe = 0
dDeltaProf = 0
end
-- se profilo lock da lavorare setto la variabile per la nota
if bLockMach then
dExtraYOppo = 0
nLockMach = 1
dDeltaProbeOppo = 0
dDeltaProfOppo = 0
end
-- se profilo Top da lavorare setto la variabile per la nota
if bTopMach then
nTopMach = 1
end
-- se profilo Bottom da lavorare setto la variabile per la nota
if bBottomMach then
nBottomMach = 1
end
vExtraYDelta = Vector3d(0, EgtIf( nDispFront > 0, -dExtraY, dExtraYOppo),0)
-- scrivo le note
EgtSetInfo( Pz, 'ExtraCalcMoveY'..sLineMachineSuffix, EgtIf( nDispFront > 0, dExtraY, dExtraYOppo))
EgtSetInfo( Pz, 'ExtraCalcOppoMoveY'..sLineMachineSuffix, EgtIf( nDispFront > 0, dExtraYOppo, dExtraY))
EgtSetInfo( Pz, 'DoorProbeErrorY'..sLineMachineSuffix, EgtIf( nDispFront > 0, dDeltaProbe, dDeltaProbeOppo))
EgtSetInfo( Pz, 'DoorProbeOppoErrorY'..sLineMachineSuffix, EgtIf( nDispFront > 0, dDeltaProbeOppo, dDeltaProbe))
EgtSetInfo( Pz, 'DoorProbeExtraPosZ'..sLineMachineSuffix, tMainTabPar.EZPB)
EgtSetInfo( Pz, 'DoorProbeThick'..sLineMachineSuffix, tMainTabPar.PTK)
EgtSetInfo( Pz, 'DoorProfErrorY'..sLineMachineSuffix, EgtIf( nDispFront > 0, dDeltaProf, dDeltaProfOppo))
EgtSetInfo( Pz, 'DoorProfOppoErrorY'..sLineMachineSuffix, EgtIf( nDispFront > 0, dDeltaProfOppo, dDeltaProf))
EgtSetInfo( Pz, 'SideDisposition'..sLineMachineSuffix, nDispMode)
EgtSetInfo( Pz, 'EdgeDisposition'..sLineMachineSuffix, nDispFront)
-- scrivo nota disabilitazione cuffia
EgtSetInfo( Pz, 'ForceDisableHood', tMainTabPar.FDH)
-- scrivo profilo lato in battuta
EgtSetInfo( Pz, 'SideProfOnRef'..sLineMachineSuffix, EgtIf( nDispFront > 0, nSideType, nSideOppoType))
-- scrivo profilo lato opposto
EgtSetInfo( Pz, 'SideProfOnOppo'..sLineMachineSuffix, EgtIf( nDispFront > 0, nSideOppoType, nSideType))
-- scrivo nota lavorazione lato hinge
EgtSetInfo( Pz, 'SideHingeMach'..sLineMachineSuffix, nHingeMach)
-- scrivo nota tipo profilo lato hinge
EgtSetInfo( Pz, 'SideHingeProf'..sLineMachineSuffix, nSideType)
-- scrivo nota lavorazione lato lock
EgtSetInfo( Pz, 'SideLockMach'..sLineMachineSuffix, nLockMach)
-- scrivo nota tipo profilo lato hinge
EgtSetInfo( Pz, 'SideLockProf'..sLineMachineSuffix, nSideOppoType)
-- scrivo nota lavorazione lato top
EgtSetInfo( Pz, 'SideTopMach'..sLineMachineSuffix, nTopMach)
-- scrivo nota tipo profilo lato top
EgtSetInfo( Pz, 'SideTopProf'..sLineMachineSuffix, nTopType)
-- scrivo nota lavorazione lato bottom
EgtSetInfo( Pz, 'SideBottomMach'..sLineMachineSuffix, nBottomMach)
-- scrivo nota tipo profilo lato bottom
EgtSetInfo( Pz, 'SideBottomProf'..sLineMachineSuffix, nBottomType)
-- scrivo la nota relativa al controllo collisioni
EgtSetInfo( Pz, 'EnableCollisionDetect', tMainTabPar.ECD)
-- scrivo nota con numero geometrie di ProbeZ o probeXY (in base ai settaggi di nProbeMode e nPostProbeSet)
EgtSetInfo( Pz, 'NumProbeZ'..sLineMachineSuffix, nNumProbeZ)
-- assegno al gruppo di lavoro la lunghezza minima porta
EgtSetInfo( Pz, 'LongDoorLimit'..sLineMachineSuffix, tMainTabPar.BDH)
-- scrivo nota flag modalita remove scrap
EgtSetInfo( Pz, 'RemoveScrapMode'..sLineMachineSuffix, tMainTabPar.RSM)
-- sommo il delta spostamento
Ori = Ori + vExtraYDelta
local nLeftCode, nRightCode = MCH_CR.BL, MCH_CR.BR
if nDispFront < 0 then
nLeftCode, nRightCode = MCH_CR.TL, MCH_CR.TR
end
-- Muovo porta con l'angolo indicato dal tipo di disposizione nella posizione di origine
bMoveRaw = EgtMoveToCornerRawPart( nRaw, Ori, EgtIf( nDispMode > 0, nLeftCode, nRightCode))
-- memorizzo i flag per le fasi successive
bFlipFirst = bFlip
bTopOnRightFirst = bTopOnRight
if not bMoveRaw then
bOk = false
DGD.EMC = ' ' .. EgtDoorsMsg[675]..EgtDoorsMsg[474] -- Error positioning raw part on table
break
end
EgtSetInfo( Pz, 'MachineNameFromCurrCamInfo'..sLineMachineSuffix, tMainTabPar.MN)
if bShiftedDoor then
-- salvo una nota con le info della disposizione traslata
EgtSetInfo( Pz, 'DoorOnTable' .. sLineMachineSuffix .. '_' .. tostring(nNumPhase) .. '_' .. tMainTabPar.MN, sDispMode)
EgtSetInfo( Pz, 'KindPhase' .. sLineMachineSuffix .. '_' .. tostring(nNumPhase) .. '_' .. tMainTabPar.MN, 'SHIFT')
-- se porta disposta con lato lock contro riferimenti stampo lo shift del lato lock
if ( tMainTabPar.SDF > 1 and tMainTabPar.SDF < 4) or nDispFront < 0 then
EgtSetInfo( Pz, 'OffSetPhase' .. sLineMachineSuffix .. '_' .. tostring(nNumPhase) .. '_' .. tMainTabPar.MN, vShiftVac)
-- altrimenti porta disposta con lato hinge contro riferimenti stampo lo shift del lato hinge
else
EgtSetInfo( Pz, 'OffSetPhase' .. sLineMachineSuffix .. '_' .. tostring(nNumPhase) .. '_' .. tMainTabPar.MN, vShift)
end
else
-- salvo una nota con le info della disposizione normale
EgtSetInfo( Pz, 'DoorOnTable' .. sLineMachineSuffix .. '_' .. tostring(nNumPhase) .. '_' .. tMainTabPar.MN, sDispMode)
EgtSetInfo( Pz, 'KindPhase' .. sLineMachineSuffix .. '_' .. tostring(nNumPhase) .. '_' .. tMainTabPar.MN, 'NORMAL')
EgtSetInfo( Pz, 'OffSetPhase' .. sLineMachineSuffix .. '_' .. tostring(nNumPhase) .. '_' .. tMainTabPar.MN, vShiftVac)
end
if bFlip then -- se porta capovolta
if bTopOnRight then -- se top a destra
-- se prima macchina, il lato sinistro è quello riferito, se seconda macchina è quello destro
OffsYSovr = EgtIf( nDispFront > 0, dLeftOffs, dRightOffs)
OffsXSovr = EgtIf( nDispMode > 0, dBottomOffs, dTopOffs)
else -- se top a sinistra
-- se prima macchina, il lato destro è quello riferito, se seconda macchina è quello sinistro
OffsYSovr = EgtIf( nDispFront > 0, dRightOffs, dLeftOffs)
OffsXSovr = EgtIf( nDispMode > 0, dTopOffs, dBottomOffs)
end
else -- altrimenti non è capovolta
if bTopOnRight then -- se top a destra
-- se prima macchina, il lato destro è quello riferito, se seconda macchina è quello sinistro
OffsYSovr = EgtIf( nDispFront > 0, dRightOffs, dLeftOffs)
OffsXSovr = EgtIf( nDispMode > 0, dBottomOffs, dTopOffs)
else -- se top a sinistra
-- se prima macchina, il lato sinistro è quello riferito, se seconda macchina è quello destro
OffsYSovr = EgtIf( nDispFront > 0, dLeftOffs, dRightOffs)
OffsXSovr = EgtIf( nDispMode > 0, dTopOffs, dBottomOffs)
end
end
-- Controllo dimensioni pezzo
-- controllo se le dimensioni porta sono compresi nei valori minimi e massimi
bFailDim = CheckPieceDimension( dLengthDoor, dWidthDoor, dThickDoor, OffsXSovr, OffsYSovr,
vShift:getX(), vShift:getY(), tMainTabPar.MnDL, tMainTabPar.MxDL, tMainTabPar.MnDW,
tMainTabPar.MxDW, tMainTabPar.MnDT, tMainTabPar.MxDT)
if bFailDim then
DGD.ERR = 19
-- cancello il file tok
EgtEraseFile( sFileDir..sFileName..'.tok')
-- cancello e ricreo il file txt
EgtEraseFile( sFileDir..sFileName..'.txt')
--ricreo il file txt con la disposizione
WriteErrFile( sFileDir..sFileName..'.txt')
-- se lanciato da DMach stampo anche un messaggio a video
if not DGD or not DGD.NCGEN then
DoorOutLog( ' Err=' .. tostring( DGD.ERR), 0)
DoorOutLog( DGD.EMC, 0)
EgtOutBox( ' Err=' .. tostring( DGD.ERR) .. DGD.EMC, EgtDoorsMsg[476], EgtDoorsMsg[477]) -- Error on Nc part program generation
end
return false
end
-------------------------------------------------------------------------------------------------------------
-- abilito/disabilito geometrie probe in base alla lavorazione del lato hinge e alla disposizione sulla tavola
-------------------------------------------------------------------------------------------------------------
if bHingeMach then -- se profilo hinge è da lavorare rinomino nome entita
-- Recupero le entità probe
local ProbeList = MB.FindEntitiesWithName( Pz, 'Hinge_Probe')
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
EgtSetName( ProbeList[j], 'NO_Hinge_Probe' )
EgtSetInfo( ProbeList[j], 'OriName', 'Hinge_Probe')
end
ProbeList = MB.FindEntitiesWithName( Pz, 'Hinge_Probe_POS')
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
EgtSetName( ProbeList[j], 'NO_Hinge_Probe' )
EgtSetInfo( ProbeList[j], 'OriName', 'Hinge_Probe_POS')
end
ProbeList = MB.FindEntitiesWithName( Pz, 'Hinge_Probe_NEG')
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
EgtSetName( ProbeList[j], 'NO_Hinge_Probe' )
EgtSetInfo( ProbeList[j], 'OriName', 'Hinge_Probe_NEG')
end
-- Recupero le entità pivot
ProbeList = MB.FindEntitiesWithName( Pz, 'Pivot_Probe')
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
EgtSetName( ProbeList[j], 'NO_Pivot_Probe' )
EgtSetInfo( ProbeList[j], 'OriName', 'Pivot_Probe')
end
ProbeList = MB.FindEntitiesWithName( Pz, 'Pivot_Probe_POS')
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
EgtSetName( ProbeList[j], 'NO_Pivot_Probe' )
EgtSetInfo( ProbeList[j], 'OriName', 'Pivot_Probe_POS')
end
ProbeList = MB.FindEntitiesWithName( Pz, 'Pivot_Probe_NEG')
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
EgtSetName( ProbeList[j], 'NO_Pivot_Probe' )
EgtSetInfo( ProbeList[j], 'OriName', 'Pivot_Probe_NEG')
end
-- recupero entità probe di fianco
ProbeList = MB.FindEntitiesWithName( Pz, 'ProbeSidePoint')
local eProSide
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
eProSide = EgtGetInfo( ProbeList[j], 'SideApplied', 'i') or 0
if eProSide == 1 then
EgtSetName( ProbeList[j], 'NO_ProbeSidePoint' )
end
end
-- profilo hinge non lavorato
else
-- il probe deve essere sempre quello a sinistra rispetto al piazzamento
-- considerando lo swing perché le cerniere a seconda di questo vengono ruotate e il probe _POS e _NEG risultano
-- scambiati rispetto al top della porta
local sProbeHingeToFind = ''
local sProbeHingeDis = ''
local sProbePivotToFind = ''
local sProbePivotDis = ''
if nDispMode > 0 then -- se disposizione a sinistra
if ( bPush and bAtRight) or ( not bPush and not bAtRight) then
sProbeHingeToFind = 'Hinge_Probe_NEG'
sProbeHingeDis = 'NO_Hinge_Probe_NEG'
else
sProbeHingeToFind = 'Hinge_Probe_POS'
sProbeHingeDis = 'NO_Hinge_Probe_POS'
end
sProbePivotToFind = 'Pivot_Probe_NEG'
sProbePivotDis = 'NO_Pivot_Probe_NEG'
else -- disposizione a destra
if ( bPush and bAtRight) or ( not bPush and not bAtRight) then
sProbeHingeToFind = 'Hinge_Probe_POS'
sProbeHingeDis = 'NO_Hinge_Probe_POS'
else
sProbeHingeToFind = 'Hinge_Probe_NEG'
sProbeHingeDis = 'NO_Hinge_Probe_NEG'
end
sProbePivotToFind = 'Pivot_Probe_POS'
sProbePivotDis = 'NO_Pivot_Probe_POS'
end
local ProbeList = MB.FindEntitiesWithName( Pz, sProbeHingeToFind)
for j = 1, #ProbeList do
EgtSetName( ProbeList[j], sProbeHingeDis)
end
ProbeList = MB.FindEntitiesWithName( Pz, sProbePivotToFind)
for j = 1, #ProbeList do
EgtSetName( ProbeList[j], sProbePivotDis)
end
-- se non da lavorare e profilo bevel dn cambio lo spessore a: spessore probe + extra probe z
if sHingeTrim == 'BD' or sHingeTrim == 'BDEB' then
-- recupero entità probe di fianco
ProbeList = MB.FindEntitiesWithName( Pz, 'ProbeSidePoint')
local eProSide
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
eProSide = EgtGetInfo( ProbeList[j], 'SideApplied', 'i') or 0
if eProSide == 1 then
EgtModifyCurveThickness( ProbeList[j], -tMainTabPar.EZPB)
EgtSetInfo( ProbeList[j], 'ProfSide', 'BD')
end
end
-- se profilo non lavorato e di tipo bullnose cambio lo spessore a metà porta + extra probe z
elseif sHingeTrim == '1B' or sHingeTrim == '2B' or sHingeTrim == '3B' or sHingeTrim == '4B' or
sHingeTrim == '5B' or sHingeTrim == '6B' or sHingeTrim == '7B' or sHingeTrim == '8B' then
-- recupero entità probe di fianco
ProbeList = MB.FindEntitiesWithName( Pz, 'ProbeSidePoint')
local eProSide
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
eProSide = EgtGetInfo( ProbeList[j], 'SideApplied', 'i') or 0
if eProSide == 1 then
EgtModifyCurveThickness( ProbeList[j], -( dThickDoor/2 + tMainTabPar.EZPB))
end
end
else
-- recupero entità probe di fianco
ProbeList = MB.FindEntitiesWithName( Pz, 'ProbeSidePoint')
local eProSide
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
eProSide = EgtGetInfo( ProbeList[j], 'SideApplied', 'i') or 0
if eProSide == 1 then
EgtModifyCurveThickness( ProbeList[j], -tMainTabPar.EZPB)
-- se profilo bevel up assegno nota
if sHingeTrim == 'BU' or sHingeTrim == 'BUEB' then
EgtSetInfo( ProbeList[j], 'ProfSide', 'BU')
end
end
end
end
end
if bLockMach then -- se profilo lock è da lavorare rinomino nome entita
-- Recupero le entità probe
local ProbeList = MB.FindEntitiesWithName( Pz, 'Shuttle_Probe')
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
EgtSetName( ProbeList[j], 'NO_Shuttle_Probe' )
EgtSetInfo( ProbeList[j], 'OriName', 'Shuttle_Probe')
end
ProbeList = MB.FindEntitiesWithName( Pz, 'Shuttle_Probe_POS')
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
EgtSetName( ProbeList[j], 'NO_Shuttle_Probe' )
EgtSetInfo( ProbeList[j], 'OriName', 'Shuttle_Probe_POS')
end
ProbeList = MB.FindEntitiesWithName( Pz, 'Shuttle_Probe_NEG')
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
EgtSetName( ProbeList[j], 'NO_Shuttle_Probe' )
EgtSetInfo( ProbeList[j], 'OriName', 'Shuttle_Probe_NEG')
end
-- recupero entità probe di fianco su lato secure
local ProbeList = MB.FindEntitiesWithName( Pz, 'ProbeSidePoint')
local eProSide
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
eProSide = EgtGetInfo( ProbeList[j], 'SideApplied', 'i') or 0
if eProSide == 3 then
EgtSetName( ProbeList[j], 'NO_ProbeSidePoint' )
end
end
-- profilo lock non lavorato
else
-- il probe deve essere sempre quello a sinistra rispetto al piazzamento
-- considerando lo swing perché le cerniere a seconda di questo vengono ruotate e il probe _POS e _NEG risultano
-- scambiati rispetto al top della porta
local sProbeLockToFind = ''
local sProbeLockDis = ''
if nDispMode > 0 then -- se disposizione a sinistra
if ( bPush and bAtRight) or ( not bPush and not bAtRight) then
sProbeLockToFind = 'Shuttle_Probe_NEG'
sProbeLockDis = 'NO_Shuttle_Probe_NEG'
else
sProbeLockToFind = 'Shuttle_Probe_POS'
sProbeLockDis = 'NO_Shuttle_Probe_POS'
end
else -- disposizione a destra
if ( bPush and bAtRight) or ( not bPush and not bAtRight) then
sProbeLockToFind = 'Shuttle_Probe_POS'
sProbeLockDis = 'NO_Shuttle_Probe_POS'
else
sProbeLockToFind = 'Shuttle_Probe_NEG'
sProbeLockDis = 'NO_Shuttle_Probe_NEG'
end
end
local ProbeList = MB.FindEntitiesWithName( Pz, sProbeLockToFind)
for j = 1, #ProbeList do
EgtSetName( ProbeList[j], sProbeLockDis)
end
-- se profilo bevel dn cambio lo spessore allo spessore probe + extra probe z
if sLockTrim == 'BD_LK' or sLockTrim == 'BDEB_LK' then
-- recupero entità probe di fianco
local ProbeList = MB.FindEntitiesWithName( Pz, 'ProbeSidePoint')
local eProSide
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
eProSide = EgtGetInfo( ProbeList[j], 'SideApplied', 'i') or 0
if eProSide == 3 then
EgtModifyCurveThickness( ProbeList[j], -tMainTabPar.EZPB)
EgtSetInfo( ProbeList[j], 'ProfSide', 'BD')
end
end
-- se profilo non lavorato e di tipo bullnose cambio lo spessore a metà porta + extra probe z
elseif sLockTrim == '1B_LK' or sLockTrim == '2B_LK' or sLockTrim == '3B_LK' or sLockTrim == '4B_LK' or
sLockTrim == '5B_LK' or sLockTrim == '6B_LK' or sLockTrim == '7B_LK' or sLockTrim == '8B_LK' then
-- recupero entità probe di fianco
local ProbeList = MB.FindEntitiesWithName( Pz, 'ProbeSidePoint')
local eProSide
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
eProSide = EgtGetInfo( ProbeList[j], 'SideApplied', 'i') or 0
if eProSide == 3 then
EgtModifyCurveThickness( ProbeList[j], -( dThickDoor/2 + tMainTabPar.EZPB))
end
end
-- in tutti gli altri profili setto l'affondamento a extra probe z
else
-- recupero entità probe di fianco
local ProbeList = MB.FindEntitiesWithName( Pz, 'ProbeSidePoint')
local eProSide
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
eProSide = EgtGetInfo( ProbeList[j], 'SideApplied', 'i') or 0
if eProSide == 3 then
EgtModifyCurveThickness( ProbeList[j], -tMainTabPar.EZPB)
-- se profilo bevel up assegno nota
if sLockTrim == 'BU_LK' or sLockTrim == 'BUEB_LK' then
EgtSetInfo( ProbeList[j], 'ProfSide', 'BU')
end
end
end
end
end
if bTopMach then -- se profilo top è da lavorare rinomino nome entita
-- recupero entità probe di fianco su lato secure
local ProbeList = MB.FindEntitiesWithName( Pz, 'ProbeSidePoint')
local eProSide
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
eProSide = EgtGetInfo( ProbeList[j], 'SideApplied', 'i') or 0
if eProSide == 2 then
EgtSetName( ProbeList[j], 'NO_ProbeSidePoint' )
end
end
-- se non da lavorare e profilo bevel dn cambio lo spessore allo spessore probe + extra probe z
elseif not bTopMach and ( sTopTrim == 'BD' or sTopTrim == 'BDEB') then
-- recupero entità probe di fianco
local ProbeList = MB.FindEntitiesWithName( Pz, 'ProbeSidePoint')
local eProSide
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
eProSide = EgtGetInfo( ProbeList[j], 'SideApplied', 'i') or 0
if eProSide == 2 then
EgtModifyCurveThickness( ProbeList[j], -tMainTabPar.EZPB)
EgtSetInfo( ProbeList[j], 'ProfSide', 'BD')
end
end
-- se profilo non lavorato e di tipo bullnose cambio lo spessore a metà porta
elseif not bTopMach and ( sTopTrim == '1B' or sTopTrim == '2B' or sTopTrim == '3B' or sTopTrim == '4B' or
sTopTrim == '5B' or sTopTrim == '6B' or sTopTrim == '7B' or sTopTrim == '8B') then
-- recupero entità probe di fianco
local ProbeList = MB.FindEntitiesWithName( Pz, 'ProbeSidePoint')
local eProSide
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
eProSide = EgtGetInfo( ProbeList[j], 'SideApplied', 'i') or 0
if eProSide == 2 then
EgtModifyCurveThickness( ProbeList[j], -( dThickDoor/2 + tMainTabPar.EZPB))
end
end
-- in tutti gli altri profili setto l'affondamento a extra probe z
elseif not bTopMach then
-- recupero entità probe di fianco
local ProbeList = MB.FindEntitiesWithName( Pz, 'ProbeSidePoint')
local eProSide
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
eProSide = EgtGetInfo( ProbeList[j], 'SideApplied', 'i') or 0
if eProSide == 2 then
EgtModifyCurveThickness( ProbeList[j], -tMainTabPar.EZPB)
-- se profilo bevel up assegno nota
if sTopTrim == 'BU' or sTopTrim == 'BUEB' then
EgtSetInfo( ProbeList[j], 'ProfSide', 'BU')
end
end
end
end
if bBottomMach then -- se profilo top è da lavorare rinomino nome entita
-- recupero entità probe di fianco su lato secure
local ProbeList = MB.FindEntitiesWithName( Pz, 'ProbeSidePoint')
local eProSide
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
eProSide = EgtGetInfo( ProbeList[j], 'SideApplied', 'i') or 0
if eProSide == 4 then
EgtSetName( ProbeList[j], 'NO_ProbeSidePoint' )
end
end
-- se non da lavorare e profilo bevel dn cambio lo spessore allo spessore probe + extra probe z
elseif not bBottomMach and ( sBottomTrim == 'BD' or sBottomTrim == 'BDEB') then
-- recupero entità probe di fianco
local ProbeList = MB.FindEntitiesWithName( Pz, 'ProbeSidePoint')
local eProSide
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
eProSide = EgtGetInfo( ProbeList[j], 'SideApplied', 'i') or 0
if eProSide == 4 then
EgtModifyCurveThickness( ProbeList[j], -tMainTabPar.EZPB)
EgtSetInfo( ProbeList[j], 'ProfSide', 'BD')
end
end
-- se profilo non lavorato e di tipo bullnose cambio lo spessore a metà porta
elseif not bBottomMach and ( sBottomTrim == '1B' or sBottomTrim == '2B' or sBottomTrim == '3B' or sBottomTrim == '4B' or
sBottomTrim == '5B' or sBottomTrim == '6B' or sBottomTrim == '7B' or sBottomTrim == '8B') then
-- recupero entità probe di fianco
local ProbeList = MB.FindEntitiesWithName( Pz, 'ProbeSidePoint')
local eProSide
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
eProSide = EgtGetInfo( ProbeList[j], 'SideApplied', 'i') or 0
if eProSide == 4 then
EgtModifyCurveThickness( ProbeList[j], -( dThickDoor/2 + tMainTabPar.EZPB))
end
end
-- in tutti gli altri profili setto l'affondamento a extra probe z
elseif not bBottomMach then
-- recupero entità probe di fianco
local ProbeList = MB.FindEntitiesWithName( Pz, 'ProbeSidePoint')
local eProSide
-- ciclo su tutte le entità trovate
for j = 1, #ProbeList do
eProSide = EgtGetInfo( ProbeList[j], 'SideApplied', 'i') or 0
if eProSide == 4 then
EgtModifyCurveThickness( ProbeList[j], -tMainTabPar.EZPB)
-- se profilo bevel up assegno nota
if sBottomTrim == 'BU' or sBottomTrim == 'BUEB' then
EgtSetInfo( ProbeList[j], 'ProfSide', 'BU')
end
end
end
end
-- *** Lavorazioni ***
-- setto variabili in funzione della disposizione porta
local bMakeGhost = true
-- se esiste la forzatura sulla direzione lavorazione cerniere
if tMainTabPar.FDMH and abs( tMainTabPar.FDMH) == 1 then
nDirReorderGroups = tMainTabPar.FDMH
-- altrimenti come in precedenza, in base alla disposizione lato top porta
else
nDirReorderGroups = nDispMode
end
local dPercentDoorLength
---------------------------------------------------------------------------------------------------------------------------
-- 06/05/2021 in base al seguente avvenimento: porta lunga 3025 con 4 cerniere, 2 per ogni shuttle, e con una groove che
-- sborda sul lato cerniere. Alla chiamata della DANGER_L (nel Processo4) lo shuttle 1 a sinistra chiede di parcheggiare
-- nella posizione calcolata (L88) nel P5INIT che è a pacco con lo shuttle 2 nella parte destra della porta. L'arbitro non
-- da il consenso al parcheggio perchè la posizione è ancora occupata dallo shuttle 2 che sta lavorando e quindi manda
-- in parcheggio lo shuttle 1 fuori (tutto a sinistra) ma che, data la lunghezza elevata della porta, quando il gruppo 4
-- andando a lavorare la groove vicino al lato hinge, rischia di collidere con lo shuttle 1.
-- Quindi per ovviare al problema è stato stabilito, in accordo con Carlo Viviani, di controllare per prima
-- la dimensione della porta, e se la lunghezza porta è maggiore del valore stabilito nella macro P5INIT nella variabile
-- L116 (ad oggi al valore 1800mm) allora la percentuale di distribuzione cerniere passa a 45% (su questa macchina) dalla
-- parte dove la porta è riferita (cioè 45% da sinistra se porta disposta a sinistra, 45% da destra se porta riferita a destra),
-- in questo modo lo shuttle più vicino al riferimento porta lavora meno dello shuttle opposto così, se viene chiamato
-- un danger sul lato opposto al riferimento ci sono più probabilità che lo shuttle vicino al riferimento abbia già finito
-- e la richiesta di parcheggio interno per lo shuttle opposto trova lo spazio disponibile.
---------------------------------------------------------------------------------------------------------------------------
if dLengthDoor >= tMainTabPar.BDH then
dPercentDoorLength = 0.45 -- 45% sempre dalla parte dove è riferita -- EgtIf( nDispMode > 0, 0.52, 0.48)
else
------------------------------------------------------------------------------------------------------------------------------------------
-- V1.4 Gestione percentuali portata nel CurrCamInfo dai nuovi parametri .PS3H (.PercentUseShtlWith3Hrdw) e .PUSR (.PercentUseShuttleFromRef) se presenti
------------------------------------------------------------------------------------------------------------------------------------------
-- quanto viene dopo è stato cambiato
-- Su richiesta del cliente (Adam Linch) in data 06/12/2017 la ripartizione delle tre cerniere è la seguente:
-- 2 cerniere allo shuttle corrispondente al lato di riferimento porta. V1.3
-- quanto viene dopo è stato cambiato
-- assegno una percentuale di 0.6 sempre verso lo shuttle di sinistra (Viviani 30/01/2017)
-- se disposta a sinistra assegno 0.6 da sinistra, se disposta a destra assegno 0.4 da destra, il risultato è quindi
-- sempre 0.6 da sinistra
-- ma con 3 cerniere o 3 pivot, inverto la percentuale, cioè sempre 0.4 da sinistra V1.2
-- V1.1
--local dPercentDoorLength = EgtIf( nDispMode > 0, 0.6, 0.4) -- V1.1
-- V1.2
--local dPercentDoorLength = EgtIf( nDispMode > 0, EgtIf( dNumHingesPivots == 3 ,0.4, 0.6), EgtIf( dNumHingesPivots == 3, 0.6,0.4)) -- V1.2
-- V1.3
-- dPercentDoorLength = EgtIf( nDispMode > 0, EgtIf( dNumHingesPivots == 3 ,0.6, 0.4), EgtIf( dNumHingesPivots == 3, 0.6, 0.4)) -- V1.3
-- V1.4
if tMainTabPar.PS3H <= GEO.EPS_SMALL or tMainTabPar.PS3H >= (1-GEO.EPS_SMALL) then
tMainTabPar.PS3H = 0.6
end
if tMainTabPar.PUSR <= GEO.EPS_SMALL or tMainTabPar.PUSR >= (1-GEO.EPS_SMALL) then
tMainTabPar.PUSR = 0.4
end
-- V1.4
dPercentDoorLength = EgtIf( nDispMode > 0, EgtIf( dNumHingesPivots == 3 , tMainTabPar.PS3H, tMainTabPar.PUSR), EgtIf( dNumHingesPivots == 3, tMainTabPar.PS3H, tMainTabPar.PUSR))
end
-- Se uso shuttle forzato su uno dei due shuttle cambio la percentuale
if tMainTabPar.FUS then
if tMainTabPar.FUS == 1 then
dPercentDoorLength = EgtIf( nDispMode > 0, 1, 0)
elseif tMainTabPar.FUS == 2 then
dPercentDoorLength = EgtIf( nDispMode > 0, 0, 1)
else
tMainTabPar.FUS = 0
end
else
tMainTabPar.FUS = 0
end
-- scrivo la nota
EgtSetInfo( Pz, 'ForceShuttle'..sLineMachineSuffix, tMainTabPar.FUS)
-- calcolo una direzione locale perchè se ha segno opposto e la porta è disposta sul lato opposto, viene fatto un errore nel calcolo della posizione di scambio
local nLocalDirReorderGroup = EgtIf( nDirReorderGroups == nDispMode, nDirReorderGroups, -nDirReorderGroups)
-- quanto segue nella sottostante spiegazione è stato cambiato, vedi sopra
---- determino la posizione del cambio shuttle utilizzando un coefficente di 0.4 verso destra se il posizionamento è a destra
---- e un coefficente di 0.6 verso destra se il posizionamento è a sinistra, in modo
---- da favorire lo shuttle che è dalla parte del riferimento ( a destra con assegnazione nMach a 2 e a sinistra con assegnazione nMach a 3)
dPosShuttleChange = EgtIf( nDispMode > 0, tMainTabPar.OR1:getX(), tMainTabPar.OR2:getX()) + ( dLengthDoor * dPercentDoorLength * nLocalDirReorderGroup) + ( OffsXSovr * nLocalDirReorderGroup) + tabOri:getX()
-- ricavo minimo e massimo del solido del pezzo
b3SolidOnTab = EgtGetBBoxGlob( Ls, GDB_BB.EXACT)
pMin = b3SolidOnTab:getMin()
pMax = b3SolidOnTab:getMax()
local tOrderGrp = {}
-- print Machining table
-- solo il primo giro: aggiusto i profili bevel per essere coerente con la sequenza di tabella
-- riordino i gruppi geometrici che hanno l'operazione AdjustHead o AdjustHeadOnASplint in ordine di X decrescente
for i = 1, #tLocMach do
-- print Machining table
DoorOutLog( 'L'..tostring( i) .. ' EN='.. (tLocMach[i].On or ' ') ..' N='.. tLocMach[i].Name .. ' O='.. (tLocMach[i].Oper or ' ') ..
' M='.. (tLocMach[i].Mach or ' ') .. ' MAC='.. (tLocMach[i].MachName or ' '), -1)
if tLocMach[i].On ~= 0 then
sLocMachId = tLocMach[i].MachId
if not sLocMachId then sLocMachId = 1 end
if sLocMachId == nNumMachFromTable then
-- Recupero le entità
local EntList = MB.FindEntitiesWithName( Pz, tLocMach[i].Name)
-- Applico le lavorazioni
for j = 1, #EntList do
-- OPERAZIONI
if tLocMach[i].Oper then
if tLocMach[i].Oper == 'AdjustBevel' then
local sNewName
_, sNewName = MB.AdjustBevel( EntList[j], tLocMach[i].Name, bFirstStep, tMainTabPar.NVP)
elseif tLocMach[i].Oper == 'AdjustHead' or tLocMach[i].Oper == 'AdjustHeadOnASplint' then
-- nDirReorderGroups = -1 = ordine decrescente ( da dx a sx <--); nDirReorderGroups = 1 ordine crescente ( da sx a dx -->)
MB.ReorderGroup( EntList[j], tOrderGrp, nDirReorderGroups)
-- Nuova ma non va bene
-- MB.ReorderGroup( EntList[j], tOrderGrp, EgtIf( nDispMode > 0 , - nDirReorderGroups, nDirReorderGroups)) -- sempre decrescente;
end
end
end
end
end
end
-- conteggio lavorazioni saltate
nNumMachSkipResult = 0
-- variabile per conteggio lavorazioni
nNumMach = 0
nNumSkip = 0
-- se porta ribatata inverto anche le variabili contatori lavorazioni sopra e sotto
if bFlip then
local nValAppo = nNumGeomBottom
nNumGeomBottom = nNumGeomTop
nNumGeomTop = nValAppo
nValAppo = nNumGeomBottomHole
nNumGeomBottomHole = nNumGeomTopHole
nNumGeomTopHole = nValAppo
end
-- resetto la variabile globale del campo Link della Mtable
DGD.LVL = nil
-- Machining adding, only for selected machine
-- faccio tutto in un unico giro per non dover avere due contatori di break, uno per le operazioni e uno per le lavorazioni
for i = 1, #tLocMach do
if tLocMach[i].On ~= 0 then
sLocMachId = tLocMach[i].MachId
if not sLocMachId then sLocMachId = 1 end
if sLocMachId == nNumMachFromTable then
-- Recupero le entità
local EntList = MB.FindEntitiesWithName( Pz, tLocMach[i].Name)
-- Applico le lavorazioni
for j = 1, #EntList do
local bAdjustHead = false
local nNewIdEnt
-- acquisisco il campo Link se è presente
DGD.LVL = tonumber( tLocMach[i].Link)
-- OPERAZIONI
if tLocMach[i].Oper then
if tLocMach[i].Oper == 'AdjustBevel' then
local sNewName
bLocMach, sNewName, nNewIdEnt = MB.AdjustBevel( EntList[j], tLocMach[i].Name, bFirstStep, tMainTabPar.NVP, bMakeGhost)
if bLocMach then
local bInsLav = false
-- faccio il test per vedere se la lavorazione è applicabile
local nMach = EgtGetInfo( nNewIdEnt, 'Mach', 'i') or 1
if nMach == 1 then
bInsLav = MB.TestMachining( tLocMach[i].Mach, nNewIdEnt)
elseif nMach == 2 then
bInsLav = MB.TestMachining( tLocMach[i].MachUp, nNewIdEnt)
elseif nMach == 3 then
bInsLav = MB.TestMachining( tLocMach[i].MachDw, nNewIdEnt)
end
-- se la lavorazione è applicabile
if bInsLav then
-- ottengo il nome del lato lavorato
local sEdge = EgtGetName( EgtGetParent( EntList[j]))
if sEdge then
if #sMachProf > 0 then
sMachProf = sMachProf .. ',' .. sEdge
else
sMachProf = sEdge
end
-- in base a quale lato è verifico se il sovramateriale supera il valore massimo e genero sgrossatura
if string.lower( sEdge) == 'left' then
local dOffsLoc = 0
if bAtRight then
if sHingeTrim == 'BD' or sHingeTrim == 'BU' or sHingeTrim == 'BDEB' or sHingeTrim == 'BUEB' then
dOffsLoc = dThickDoor * TAN3
elseif sHingeTrim == 'CV' then
-- calcolo minimo ingombro profilo
local dAltProf = dThickDoor/2 - tsPlaneProf[1]
local dMaxInsPrf = sqrt((tsRadiusProf[1]*tsRadiusProf[1])-(dAltProf*dAltProf))
dOffsLoc = tsRadiusProf[1] - dMaxInsPrf
-- assegno al nuovo percorso il delta tra il fondo profilo e il bordo porta
EgtSetInfo( nNewIdEnt, 'OFFSTOPATH', dOffsLoc)
end
elseif not bAtRight then
if sLockTrim == 'BD' or sLockTrim == 'BD_LK' or sLockTrim == 'BU' or sLockTrim == 'BU_LK' or
sLockTrim == 'BDEB' or sLockTrim == 'BDEB_LK' or sLockTrim == 'BUEB' or sLockTrim == 'BUEB_LK' then
dOffsLoc = dThickDoor * TAN3
elseif sLockTrim == 'CV' or sLockTrim == 'CV_LK' then
-- calcolo minimo ingombro profilo
local dAltProf = dThickDoor/2 - tsPlaneProf[2]
local dMaxInsPrf = sqrt((tsRadiusProf[2]*tsRadiusProf[2])-(dAltProf*dAltProf))
dOffsLoc = tsRadiusProf[2] - dMaxInsPrf
-- assegno al nuovo percorso il delta tra il fondo profilo e il bordo porta
EgtSetInfo( nNewIdEnt, 'OFFSTOPATH', dOffsLoc)
end
end
MB.MakeRoughPaths( dLeftOffs, tMainTabPar.MOM, tMainTabPar.SOM, nNewIdEnt, false, bFlip, nil, dOffsLoc, tMainTabPar.RSM)
elseif string.lower( sEdge) == 'right' then
local dOffsLoc = 0
if bAtRight then
if sLockTrim == 'BD' or sLockTrim == 'BD_LK' or sLockTrim == 'BU' or sLockTrim == 'BU_LK' or
sLockTrim == 'BDEB' or sLockTrim == 'BDEB_LK' or sLockTrim == 'BUEB' or sLockTrim == 'BUEB_LK' then
dOffsLoc = dThickDoor * TAN3
elseif sLockTrim == 'CV' or sLockTrim == 'CV_LK' then
-- calcolo minimo ingombro profilo
local dAltProf = dThickDoor/2 - tsPlaneProf[2]
local dMaxInsPrf = sqrt((tsRadiusProf[2]*tsRadiusProf[2])-(dAltProf*dAltProf))
dOffsLoc = tsRadiusProf[2] - dMaxInsPrf
-- assegno al nuovo percorso il delta tra il fondo profilo e il bordo porta
EgtSetInfo( nNewIdEnt, 'OFFSTOPATH', dOffsLoc)
end
elseif not bAtRight then
if sHingeTrim == 'BD' or sHingeTrim == 'BU' or sHingeTrim == 'BDEB' or sHingeTrim == 'BUEB' then
dOffsLoc = dThickDoor * TAN3
elseif sHingeTrim == 'CV' then
-- calcolo minimo ingombro profilo
local dAltProf = dThickDoor/2 - tsPlaneProf[1]
local dMaxInsPrf = sqrt((tsRadiusProf[1]*tsRadiusProf[1])-(dAltProf*dAltProf))
dOffsLoc = tsRadiusProf[1] - dMaxInsPrf
-- assegno al nuovo percorso il delta tra il fondo profilo e il bordo porta
EgtSetInfo( nNewIdEnt, 'OFFSTOPATH', dOffsLoc)
end
end
MB.MakeRoughPaths( dRightOffs, tMainTabPar.MOM, tMainTabPar.SOM, nNewIdEnt, false, bFlip, nil, dOffsLoc, tMainTabPar.RSM)
elseif string.lower( sEdge) == 'top' then
local dOffsLoc = 0
if sTopTrim == 'BD' or sTopTrim == 'BU' or sTopTrim == 'BDEB' or sTopTrim == 'BUEB' then
dOffsLoc = dThickDoor * TAN3
elseif sTopTrim == 'CV' then
-- calcolo minimo ingombro profilo
local dAltProf = dThickDoor/2 - tsPlaneProf[3]
local dMaxInsPrf = sqrt((tsRadiusProf[3]*tsRadiusProf[3])-(dAltProf*dAltProf))
dOffsLoc = tsRadiusProf[3] - dMaxInsPrf
-- assegno al nuovo percorso il delta tra il fondo profilo e il bordo porta
EgtSetInfo( nNewIdEnt, 'OFFSTOPATH', dOffsLoc)
end
MB.MakeRoughPaths( dTopOffs, tMainTabPar.MOM, tMainTabPar.SOM, nNewIdEnt, true, bFlip, nil, dOffsLoc, tMainTabPar.RSM)
elseif string.lower( sEdge) == 'bottom' then
local dOffsLoc = 0
if sBottomTrim == 'BD' or sBottomTrim == 'BU' or sBottomTrim == 'BDEB' or sBottomTrim == 'BUEB' then
dOffsLoc = dThickDoor * TAN3
end
MB.MakeRoughPaths( dBottomOffs, tMainTabPar.MOM, tMainTabPar.SOM, nNewIdEnt, true, bFlip, nil, dOffsLoc, tMainTabPar.RSM)
end
end
end
else
bOk = false
end
elseif tLocMach[i].Oper == 'AdjustVertCurve' then
bOk, nNewIdEnt = MB.AdjustVertCurve( EntList[j], bMakeGhost)
elseif tLocMach[i].Oper == 'AdjustRoughCurve' then
local bInvertOnZPos = false
-- ottengo il nome del lato lavorato
local sEdge = EgtGetName( EgtGetParent( EntList[j]))
if string.lower( sEdge) == 'left' then
if bAtRight then
if sHingeTrim == 'CV' then
bInvertOnZPos = true
end
elseif not bAtRight then
if sLockTrim == 'CV' or sLockTrim == 'CV_LK' then
bInvertOnZPos = true
end
end
elseif string.lower( sEdge) == 'right' then
if bAtRight then
if sLockTrim == 'CV' or sLockTrim == 'CV_LK' then
bInvertOnZPos = true
end
elseif not bAtRight then
if sHingeTrim == 'CV' then
bInvertOnZPos = true
end
end
elseif string.lower( sEdge) == 'top' then
if sTopTrim == 'CV' then
bInvertOnZPos = true
end
elseif string.lower( sEdge) == 'bottom' then
if sBottomTrim == 'CV' then
bInvertOnZPos = true
end
end
bOk, nNewIdEnt = MB.AdjustThrouCurve( EntList[j], bMakeGhost, true, bInvertOnZPos)
elseif tLocMach[i].Oper == 'AdjustThrouCurve' then
bLocMach, nNewIdEnt = MB.AdjustThrouCurve( EntList[j], bMakeGhost)
if bLocMach then
local bInsLav = false
-- faccio un test per vedere che la lavorazione è applicabile
local nMach = EgtGetInfo( nNewIdEnt, 'Mach', 'i') or 1
if nMach == 1 then
bInsLav = MB.TestMachining( tLocMach[i].Mach, nNewIdEnt)
elseif nMach == 2 then
bInsLav = MB.TestMachining( tLocMach[i].MachUp, nNewIdEnt)
elseif nMach == 3 then
bInsLav = MB.TestMachining( tLocMach[i].MachDw, nNewIdEnt)
end
if bInsLav then
-- ottengo il nome del lato lavorato
local sEdge = EgtGetName( EgtGetParent( EntList[j]))
if sEdge then
if #sMachProf > 0 then
sMachProf = sMachProf .. ',' .. sEdge
else
sMachProf = sEdge
end
end
-- in base a quale lato è verifico se il sovramateriale supera il valore massimo e genero sgrossatura
if string.lower( sEdge) == 'left' then
local dOffsLoc = 0
if bAtRight then
if sHingeTrim == 'BD' or sHingeTrim == 'BU' or sHingeTrim == 'BDEB' or sHingeTrim == 'BUEB' then
dOffsLoc = dThickDoor * TAN3
elseif sHingeTrim == 'CV' then
-- calcolo minimo ingombro profilo
local dAltProf = dThickDoor/2 - tsPlaneProf[1]
local dMaxInsPrf = sqrt((tsRadiusProf[1]*tsRadiusProf[1])-(dAltProf*dAltProf))
dOffsLoc = tsRadiusProf[1] - dMaxInsPrf
-- assegno al nuovo percorso il delta tra il fondo profilo e il bordo porta
EgtSetInfo( nNewIdEnt, 'OFFSTOPATH', dOffsLoc)
end
elseif not bAtRight then
if sLockTrim == 'BD' or sLockTrim == 'BD_LK' or sLockTrim == 'BU' or sLockTrim == 'BU_LK' or
sLockTrim == 'BDEB' or sLockTrim == 'BDEB_LK' or sLockTrim == 'BUEB' or sLockTrim == 'BUEB_LK' then
dOffsLoc = dThickDoor * TAN3
elseif sLockTrim == 'CV' or sLockTrim == 'CV_LK' then
-- calcolo minimo ingombro profilo
local dAltProf = dThickDoor/2 - tsPlaneProf[2]
local dMaxInsPrf = sqrt((tsRadiusProf[2]*tsRadiusProf[2])-(dAltProf*dAltProf))
dOffsLoc = tsRadiusProf[2] - dMaxInsPrf
-- assegno al nuovo percorso il delta tra il fondo profilo e il bordo porta
EgtSetInfo( nNewIdEnt, 'OFFSTOPATH', dOffsLoc)
end
end
MB.MakeRoughPaths( dLeftOffs, tMainTabPar.MOM, tMainTabPar.SOM, nNewIdEnt, false, bFlip, nil, dOffsLoc, tMainTabPar.RSM)
elseif string.lower( sEdge) == 'right' then
local dOffsLoc = 0
if bAtRight then
if sLockTrim == 'BD' or sLockTrim == 'BD_LK' or sLockTrim == 'BU' or sLockTrim == 'BU_LK' or
sLockTrim == 'BDEB' or sLockTrim == 'BDEB_LK' or sLockTrim == 'BUEB' or sLockTrim == 'BUEB_LK' then
dOffsLoc = dThickDoor * TAN3
elseif sLockTrim == 'CV' or sLockTrim == 'CV_LK' then
-- calcolo minimo ingombro profilo
local dAltProf = dThickDoor/2 - tsPlaneProf[2]
local dMaxInsPrf = sqrt((tsRadiusProf[2]*tsRadiusProf[2])-(dAltProf*dAltProf))
dOffsLoc = tsRadiusProf[2] - dMaxInsPrf
-- assegno al nuovo percorso il delta tra il fondo profilo e il bordo porta
EgtSetInfo( nNewIdEnt, 'OFFSTOPATH', dOffsLoc)
end
elseif not bAtRight then
if sHingeTrim == 'BD' or sHingeTrim == 'BU' or sHingeTrim == 'BDEB' or sHingeTrim == 'BUEB' then
dOffsLoc = dThickDoor * TAN3
elseif sHingeTrim == 'CV' then
-- calcolo minimo ingombro profilo
local dAltProf = dThickDoor/2 - tsPlaneProf[1]
local dMaxInsPrf = sqrt((tsRadiusProf[1]*tsRadiusProf[1])-(dAltProf*dAltProf))
dOffsLoc = tsRadiusProf[1] - dMaxInsPrf
-- assegno al nuovo percorso il delta tra il fondo profilo e il bordo porta
EgtSetInfo( nNewIdEnt, 'OFFSTOPATH', dOffsLoc)
end
end
MB.MakeRoughPaths( dRightOffs, tMainTabPar.MOM, tMainTabPar.SOM, nNewIdEnt, false, bFlip, nil, dOffsLoc, tMainTabPar.RSM)
elseif string.lower( sEdge) == 'top' then
local dOffsLoc = 0
if sTopTrim == 'BD' or sTopTrim == 'BU' or sTopTrim == 'BDEB' or sTopTrim == 'BUEB' then
dOffsLoc = dThickDoor * TAN3
elseif sTopTrim == 'CV' then
-- calcolo minimo ingombro profilo
local dAltProf = dThickDoor/2 - tsPlaneProf[3]
local dMaxInsPrf = sqrt((tsRadiusProf[3]*tsRadiusProf[3])-(dAltProf*dAltProf))
dOffsLoc = tsRadiusProf[3] - dMaxInsPrf
-- assegno al nuovo percorso il delta tra il fondo profilo e il bordo porta
EgtSetInfo( nNewIdEnt, 'OFFSTOPATH', dOffsLoc)
end
MB.MakeRoughPaths( dTopOffs, tMainTabPar.MOM, tMainTabPar.SOM, nNewIdEnt, true, bFlip, nil, dOffsLoc, tMainTabPar.RSM)
elseif string.lower( sEdge) == 'bottom' then
local dOffsLoc = 0
if sBottomTrim == 'BD' or sBottomTrim == 'BU' or sBottomTrim == 'BDEB' or sBottomTrim == 'BUEB' then
dOffsLoc = dThickDoor * TAN3
end
MB.MakeRoughPaths( dBottomOffs, tMainTabPar.MOM, tMainTabPar.SOM, nNewIdEnt, true, bFlip, nil, dOffsLoc, tMainTabPar.RSM)
end
end
else
bOk = false
end
elseif tLocMach[i].Oper == 'AdjustThrouIsle' then
bLocMach, nNumMachSkipResult, nNewIdEnt = MB.AdjustThrouIsle( EntList[j], b3Solid:getDimZ(), pMin, pMax, nNumMachSkip, bFirstStep, bWorkUnder, bMakeGhost, tMainTabPar.ETM)
if not bLocMach then -- se operazione fallita
bOk = false
end
if nNumMachSkipResult > nNumMachSkip then -- se lavorazione skippata la inserisco nella tabella
if bFirstStep then
-- inserisco in tabella solo se non già presente
tSecMachTab = AddMachIntable( tLocMach[i], tSecMachTab, i)
end
nNumMachSkip = nNumMachSkipResult
else -- se non skippata provo a verificare se la lavorazione è applicabile
local bInsLav = true
-- faccio un test per vedere che la lavorazione è applicabile
local nMach = EgtGetInfo( nNewIdEnt, 'Mach', 'i') or 1
local sResMach
if nMach == 1 then
bInsLav, sResMach = MB.TestMachining( tLocMach[i].Mach, nNewIdEnt)
elseif nMach == 2 then
bInsLav, sResMach = MB.TestMachining( tLocMach[i].MachUp, nNewIdEnt)
elseif nMach == 3 then
bInsLav, sResMach = MB.TestMachining( tLocMach[i].MachDw, nNewIdEnt)
end
if not bInsLav then
if bFirstStep then
-- inserisco in tabella solo se non già presente
tSecMachTab = AddMachIntable( tLocMach[i], tSecMachTab, i)
end
-- se nome lavorazione non nullo, incremento i contatori
if sResMach and #sResMach > 0 then
-- aumento di 1 il numero di lavorazioni skippate
nNumMachSkip = nNumMachSkip + 1
-- ricambio la nota come non lavorabile in questa fase
EgtSetInfo( nNewIdEnt, 'Mach', nMach + 10)
-- se link non esiste o non ha valore negativo allora stampo il messaggio
if not DGD.LVL or DGD.LVL >= 0 then
-- incremento il numero di lavorazioni da sotto
nNumGeomBottom = nNumGeomBottom + 1
end
end
else -- se è andata a buon punto vedo di sottrarle ai contatori degli skip
if nMach == 1 then
if nNumGeomTop > 0 then
nNumGeomTop = nNumGeomTop - 1
end
elseif nMach == 2 then
if nNumGeomBottom > 0 then
nNumGeomBottom = nNumGeomBottom - 1
end
end
end
end
elseif tLocMach[i].Oper == 'AdjustProbeMill' and nProbeMode == 0 and nPostProbeSet > 2 then
local sMachRetured
bLocMach, nNumMachSkipResult, nNewIdEnt = MB.AdjustProbeMill( EntList[j], b3Solid:getDimZ(), pMin, pMax, nNumMachSkip,
bFirstStep, NO_WORK_UNDERSQUARE, bMakeGhost, NO_WORK_UPSQUARE, tMainTabPar.PTK,
tMainTabPar.EZPB)
if not bLocMach then
bOk = false
end
if nNumMachSkipResult > nNumMachSkip then -- se lavorazione skippata la inserisco nella tabella
if bFirstStep then
-- inserisco in tabella solo se non già presente
tSecMachTab = AddMachIntable( tLocMach[i], tSecMachTab, i)
end
nNumMachSkip = nNumMachSkipResult
else -- se non skippata provo a verificare se la lavorazione è applicabile
if bOk then
local bInsLav = true
-- faccio un test per vedere che la lavorazione è applicabile
local nMach = EgtGetInfo( nNewIdEnt, 'Mach', 'i') or 1
nLocMach = nMach
if nMach == 1 then
bInsLav, sMachRetured = MB.TestMachining( tLocMach[i].Mach, nNewIdEnt)
elseif nMach == 2 then
bInsLav, sMachRetured = MB.TestMachining( tLocMach[i].MachUp, nNewIdEnt, true)
elseif nMach == 3 then
bInsLav, sMachRetured = MB.TestMachining( tLocMach[i].MachDw, nNewIdEnt)
end
if not bInsLav then
if bFirstStep then
-- inserisco in tabella solo se non già presente
tSecMachTab = AddMachIntable( tLocMach[i], tSecMachTab, i)
end
-- se c'è nome lavorazione aumento di 1 il numero di lavorazioni skippate
if sMachRetured then
nNumMachSkip = nNumMachSkip + 1
end
-- ricambio la nota come non lavorabile in questa fase
if nMach == 1 then
EgtSetInfo( nNewIdEnt, 'Mach', 11)
elseif nMach == 2 then
EgtSetInfo( nNewIdEnt, 'Mach', 13)
elseif nMach == 3 then
EgtSetInfo( nNewIdEnt, 'Mach', 12)
end
-- se link non esiste o non ha valore negativo allora stampo il messaggio
if not DGD.LVL or DGD.LVL >= 0 then
-- se nome lavorazione non nullo, incremento i contatori
if sMachRetured then
-- incremento il numero di lavorazioni da sotto
nNumGeomBottom = nNumGeomBottom + 1
end
end
else -- se è andata a buon punto setto nota alla porta
EgtSetInfo( Pz, 'ExistsProbeXY'..sLineMachineSuffix, true) -- presenza del probe in XY
end
else
EgtSetInfo( nNewIdEnt, 'Mach', 31)
end
end
elseif tLocMach[i].Oper == 'AdjustHorizDrillX' then
bLocMach, nNewIdEnt = MB.AdjustHorizDrillX( EntList[j], bMakeGhost, true, 0)
if not bLocMach then
bOk = false
end
elseif tLocMach[i].Oper == 'AdjustHorizDrillY' then
bLocMach, nNewIdEnt = MB.AdjustHorizDrillY( EntList[j], bMakeGhost, true, 0)
if not bLocMach then
bOk = false
end
elseif tLocMach[i].Oper == 'AdjustHorizAS' then
bLocMach, nNewIdEnt = MB.AdjustHorizAS( EntList[j], bMakeGhost)
if not bLocMach then
bOk = false
end
elseif tLocMach[i].Oper == 'AdjustHorNegativeAS' then
bLocMach, nNewIdEnt = MB.AdjustHorNegativeAS( EntList[j], bMakeGhost)
if not bLocMach then
bOk = false
end
elseif tLocMach[i].Oper == 'AdjustMortise' then
bLocMach,_, nNewIdEnt = MB.AdjustMortise( EntList[j], nNumMachSkip, NO_WORK_UNDERSQUARE, bMakeGhost, NO_WORK_UPSQUARE)
if not bLocMach then
bOk = false
end
elseif tLocMach[i].Oper == 'AdjustBevelChisel' then
bLocMach,_, nNewIdEnt = MB.AdjustBevelChisel( EntList[j], nNumMachSkip, NO_WORK_UNDERSQUARE, bMakeGhost, NO_WORK_UPSQUARE, CHISEL_ONLY_HORZNT)
if not bLocMach then
bOk = false
end
elseif tLocMach[i].Oper == 'AdjustHeadChisel' then
bLocMach, nNewIdEnt, nNumMachSkipResult = MB.AdjustHeadChisel( EntList[j], bMakeGhost, CHISEL_ONLY_HORZNT, nNumMachSkip, NO_WORK_UPSQUARE, NO_WORK_UNDERSQUARE)
if not bLocMach then
bOk = false
end
if nNumMachSkipResult > nNumMachSkip then -- se lavorazione skippata la inserisco nella tabella
if bFirstStep then
-- inserisco in tabella solo se non già presente
tSecMachTab = AddMachIntable( tLocMach[i], tSecMachTab, i)
end
nNumMachSkip = nNumMachSkipResult
end
elseif tLocMach[i].Oper == 'AdjustVertHole' then
bLocMach, nNumMachSkipResult, nNewIdEnt = MB.AdjustVertHole( EntList[j], b3Solid:getDimZ(), pMin, pMax, nNumMachSkip, bFirstStep, bWorkUnder, bMakeGhost, tMainTabPar.ETM)
if not bLocMach then
bOk = false
end
if nNumMachSkipResult > nNumMachSkip then -- se lavorazione skippata la inserisco nella tabella
if bFirstStep then
-- inserisco in tabella solo se non già presente
tSecMachTab = AddMachIntable( tLocMach[i], tSecMachTab, i)
end
nNumMachSkip = nNumMachSkipResult
else -- se non skippata provo a verificare se la lavorazione è applicabile
local bInsLav = true
-- faccio un test per vedere che la lavorazione è applicabile
local nMach = EgtGetInfo( nNewIdEnt, 'Mach', 'i') or 1
local sResMach
if nMach == 1 then
bInsLav, sResMach = MB.TestMachining( tLocMach[i].Mach, nNewIdEnt)
elseif nMach == 2 then
bInsLav, sResMach = MB.TestMachining( tLocMach[i].MachUp, nNewIdEnt)
elseif nMach == 3 then
bInsLav, sResMach = MB.TestMachining( tLocMach[i].MachDw, nNewIdEnt)
end
if not bInsLav then
if bFirstStep then
-- inserisco in tabella solo se non già presente
tSecMachTab = AddMachIntable( tLocMach[i], tSecMachTab, i)
end
-- se nome lavorazione non nullo, incremento i contatori
if sResMach and #sResMach > 0 then
-- aumento di 1 il numero di lavorazioni skippate
nNumMachSkip = nNumMachSkip + 1
-- ricambio la nota come non lavorabile in questa fase
EgtSetInfo( nNewIdEnt, 'Mach', nMach + 10)
-- se link non esiste o non ha valore negativo allora stampo il messaggio
if not DGD.LVL or DGD.LVL >= 0 then
-- incremento il numero di lavorazioni da sotto
nNumGeomBottom = nNumGeomBottom + 1
end
end
else -- se è andato a buon fine, verifico di sottrarlo alle variabili skip
if nMach == 1 then
if nNumGeomTopHole > 0 then
nNumGeomTopHole = nNumGeomTopHole - 1
nNumGeomTop = nNumGeomTop - 1
end
elseif nMach == 2 then
if nNumGeomBottomHole > 0 then
nNumGeomBottomHole = nNumGeomBottomHole - 1
nNumGeomBottom = nNumGeomBottom - 1
end
end
end
end
elseif tLocMach[i].Oper == 'AdjustHole' then
bLocMach, nNewIdEnt = MB.AdjustHole( EntList[j], bMakeGhost)
if not bLocMach then
bOk = false
end
elseif tLocMach[i].Oper == 'AdjPreHoleAndPocket' and not ( nProbeMode == 1 and nNewProbeMeaning == 0) then
bLocMach, nNewIdEnt = MB.AdjustHole( EntList[j], bMakeGhost)
if not bLocMach then
bOk = false
end
elseif tLocMach[i].Oper == 'AdjustProbeHole' and nProbeMode == 1 then
local sMachRetured
bLocMach, nNumMachSkipResult, nNewIdEnt = MB.AdjustProbeHole( EntList[j], b3Solid:getDimZ(), pMin, pMax, nNumMachSkip,
bFirstStep, false, bMakeGhost)
if not bLocMach then
bOk = false
end
if nNumMachSkipResult > nNumMachSkip then -- se lavorazione skippata la inserisco nella tabella
if bFirstStep then
-- inserisco in tabella solo se non già presente
tSecMachTab = AddMachIntable( tLocMach[i], tSecMachTab, i)
local nMach = EgtGetInfo( nNewIdEnt, 'Mach', 'i') or 1
if nMach == 11 then
EgtSetInfo( nNewIdEnt, 'JoinMach', { 1 ,tLocMach[i].Mach})
elseif nMach == 12 then
EgtSetInfo( nNewIdEnt, 'JoinMach', { 2 ,tLocMach[i].MachUp})
elseif nMach == 13 then
EgtSetInfo( nNewIdEnt, 'JoinMach', { 3 ,tLocMach[i].MachDw})
end
end
nNumMachSkip = nNumMachSkipResult
else -- se non skippata provo a verificare se la lavorazione è applicabile
local bInsLav = true
-- faccio un test per vedere che la lavorazione è applicabile
local nMach = EgtGetInfo( nNewIdEnt, 'Mach', 'i') or 1
nLocMach = nMach
if nMach == 1 then
bInsLav, sMachRetured = MB.TestMachining( tLocMach[i].Mach, nNewIdEnt)
elseif nMach == 2 then
bInsLav, sMachRetured = MB.TestMachining( tLocMach[i].MachUp, nNewIdEnt)
elseif nMach == 3 then -- il metodo AdjustProbeHole non dovrebbe restituire il 3
bInsLav, sMachRetured = MB.TestMachining( tLocMach[i].MachDw, nNewIdEnt)
end
-- se la lavorazione è applicabile setto la nota sul pezzo
if bInsLav then
EgtSetInfo( Pz, 'ExistsProbeZ', true) -- presenza del probe in Z
else -- altrimenti la lavorazione non è applicabile
if bFirstStep then
-- inserisco in tabella solo se non già presente
tSecMachTab = AddMachIntable( tLocMach[i], tSecMachTab, i)
if nMach == 1 then
EgtSetInfo( nNewIdEnt, 'JoinMach', { 2 ,tLocMach[i].MachUp})
elseif nMach == 2 then
EgtSetInfo( nNewIdEnt, 'JoinMach', { 1 ,tLocMach[i].Mach})
elseif nMach == 3 then
EgtSetInfo( nNewIdEnt, 'JoinMach', { nMach ,tLocMach[i].MachDw})
end
end
-- se c'è nome lavorazione aumento di 1 il numero di lavorazioni skippate
if sMachRetured then
nNumMachSkip = nNumMachSkip + 1
end
-- ricambio la nota come non lavorabile in questa fase
if nMach == 1 then
EgtSetInfo( nNewIdEnt, 'Mach', 12)
elseif nMach == 2 then
EgtSetInfo( nNewIdEnt, 'Mach', 11)
else
EgtSetInfo( nNewIdEnt, 'Mach', nMach + 10)
end
-- se link non esiste o non ha valore negativo allora stampo il messaggio
if not DGD.LVL or DGD.LVL >= 0 then
-- se lavorazione presente incremento il numero di lavorazioni da sotto
if sMachRetured then
nNumGeomBottom = nNumGeomBottom + 1
end
end
end
end
elseif tLocMach[i].Oper == 'AdjustHead' then
bLocMach, nNumTopGeom, nNumBottomGeom, nNewIdEnt = MB.AdjustHead( EntList[j], nNumTopGeom, nNumBottomGeom, dPosShuttleChange)
bAdjustHead = true
if not bLocMach then
bOk = false
end
elseif tLocMach[i].Oper == 'AdjustHeadOnASplint' then
bLocMach, nNumTopGeom, nNumBottomGeom, nNewIdEnt = MB.AdjustHeadOnASplint( EntList[j], nNumTopGeom, nNumBottomGeom, dPosShuttleChange, nil,
nDispMode, bFlip, MAXMACH)
bAdjustHead = true
if not bLocMach then
bOk = false
end
elseif tLocMach[i].Oper == 'AdjustBladeVertCurve' then
bOk, nNewIdEnt = MB.AdjustBladeVertCurve( EntList[j], bMakeGhost)
elseif tLocMach[i].Oper == 'AdjustASplintWithBlade' then
bOk, nNewIdEnt = MB.AdjustASplintWithBlade( EntList[j], bMakeGhost, nDispMode, bFlip)
elseif tLocMach[i].Oper == 'AdjustSplitDoor' and not ( nProbeMode == 1 and nNewProbeMeaning == 0) then
if not bGetSplitCuts then
tSplitDoorEnt = EntList
table.insert( tSplitDataInf, { tLocMach[i].Name, nNumGroup, tLocMach[i].Mach, tLocMach[i].MachUp, tLocMach[i].MachDw, nNumMach, bMakeGhost})
bGetSplitCuts = true
end
elseif tLocMach[i].Oper == 'AdjustConeCleanPaths' and not ( nProbeMode == 1 and nNewProbeMeaning == 0) then
bOk, nNewIdEnt = MB.AdjustConeCleanPaths( EntList[j], bMakeGhost, nil, Ls)
elseif tLocMach[i].Oper == 'AdjustVertAsOnHeads' and not ( nProbeMode == 1 and nNewProbeMeaning == 0) then
bLocMach, nNewIdEnt = MB.AdjustVertAsOnHeads( EntList[j], bMakeGhost)
if not bLocMach then
bOk = false
end
end
else -- se nessuna operazione
nNewIdEnt = MB.MakeGhostCopy( EntList[j])
end
-- LAVORAZIONI
local nMach
if nNewIdEnt then
nMach = EgtGetInfo( nNewIdEnt, 'Mach', 'i') or 1
else
nMach = 0
end
if nMach > 30 and nMach < 40 then nMach = nMach - 30 end
if bAdjustHead and nMach > 0 and nMach < 4 then -- se navette
-- riciclo per prendere tutte le entità di un gruppo che devono essere lavorate assieme
bOk, nNumMach = FindAndCalcGroupMachining( EntList[j], nNewIdEnt, tLocMach, nNumMachFromTable, nMach,
nNumGroup, nNumMach, bOk, tMainTabPar.BPLI, tMainTabPar.PRF,
(nDispFront < 0))
elseif nMach > 0 and nMach < 4 then -- se è fuori range non ci entro nemmeno
-- carico id entità in una tabella
local tListSameMach = {}
table.insert( tListSameMach, nNewIdEnt)
bOk, nNumMach = InsertMachiningByMachNum( tListSameMach, nMach, tLocMach[i].Name, nNumGroup, tLocMach[i].Mach,
tLocMach[i].MachUp, tLocMach[i].MachDw, bOk, nNumMach, false,
NOT_GEN_MACH, nil, tMainTabPar.BPLI, tMainTabPar.PRF, nNumMachFromTable)
else
if not bAdjustHead then
-- se link non esiste o non ha valore negativo allora stampo il messaggio
if not DGD.LVL or DGD.LVL >= 0 then
local nTempMach = nMach
local sMachName = ''
if nTempMach >= 10 then
nTempMach = nTempMach - 10
end
if nTempMach == 3 then
sMachName = tLocMach[i].MachDw
elseif nTempMach == 2 then
sMachName = tLocMach[i].MachUp
elseif nTempMach == 1 then
sMachName = tLocMach[i].Mach
end
DoorOutLog( EgtDoorsMsg[497]..tostring( EgtIf( nNewIdEnt, nNewIdEnt, EntList[j]))..' '..tLocMach[i].Name.. EgtDoorsMsg[595]..
sMachName .. EgtDoorsMsg[596]..tostring( nNumPhase), -1)
-- se lavorazione compresa nella Mtable
if nTempMach > 0 and nTempMach < 4 then
DGD.ERM = DGD.ERM .. EgtIf( #DGD.ERM > 0, '\n', '') .. EgtDoorsMsg[497]..tostring( EgtIf( nNewIdEnt, nNewIdEnt, EntList[j]))..' '..
tLocMach[i].Name.. EgtDoorsMsg[595].. sMachName .. EgtDoorsMsg[596]..tostring( nNumPhase)..'\n'
end
nNumSkip = nNumSkip + 1
end
end
end
end
end
end
end
local i = 1
while i <= #tLocMachOrd do
-- carico tutto il gruppo in una tabella
local tGroup = {}
local nNumGrp = tLocMachOrd[i].Group
local sProperty = tLocMachOrd[i].Property
tGroup, i = MB.GetGroup( tLocMachOrd, i, nNumGrp, sProperty)
if sProperty and nNumGrp > 0 then -- se esiste proprietà del gruppo e non è 0
if sProperty == 'MinDist' then -- ottimizzare alla minima distanza
-- prendo l'ultima lavorazione inserita ( lavorazione o disposizione)
local LastMch = EgtGetLastOperation()
local EndLastMach
-- se l'ultima lavorazione non sia nulla o non sia disposizione mi faccio dare il punto finale
if EgtGetOperationType(LastMch) ~= MCH_OY.DISP and EgtGetOperationType(LastMch) ~= MCH_OY.NONE then
EgtSetCurrMachining( LastMch)
EndLastMach = EgtGetMachiningEndPoint()
end
local tMachining = {}
-- creo lavorazioni del gruppo
for k = 1, #tGroup do
-- Recupero le entità
local EntList = MB.FindEntitiesWithName( Pz, tGroup[k].Name..DGD.GHT)
local bAdjustHead = false
-- Applico le lavorazioni
for j = 1, #EntList do
-- LAVORAZIONI
local nMach = EgtGetInfo( EntList[j], 'Mach', 'i') or 1
nMach = nMach - 30 -- se lavorazione corretta ottengo 1
local nMach2nd = EgtGetInfo( EntList[j], 'Mach2nd', 'i') or 0
local sMachining = EgtGetInfo( EntList[j], 'Machining')
-- con questa tabella non ci sono seconde o terze lavorazioni, solo la prima
if nMach > 0 and nMach < 4 then nMach = 1 end
-- se lavorazione esiste e corrisponde e numero lavorazione è = 1
if sMachining and nMach == 1 and nMach2nd == 0 and sMachining == tGroup[k].Mach then
-- cerco di unire più entità nella stessa lavorazione ( non da sotto e non oltre una certa distanza)
local tListSameMach = MB.FindEntitiesCompMach( EntList[j], EntList, sMachining, tGroup[k].Join, tMainTabPar.MDC)
-- se più di 1 entità le ordino
if #tListSameMach > 1 then
tListSameMach = MB.OrderEnt( tListSameMach, EndLastMach)
EndLastMach = EgtSP( tListSameMach[#tListSameMach], GDB_ID.ROOT )
end
bOk, nNumMach, tMachining = InsertMachiningByMachNum( tListSameMach, nMach, tGroup[k].Name, nNumGrp, tGroup[k].Mach,
tGroup[k].MachUp, tGroup[k].MachDw, bOk, nNumMach, bAdjustHead,
GEN_MACH, tMachining, tMainTabPar.BPLI, tMainTabPar.PRF, nNumMachFromTable)
-- se ho assegnato lavorazione a più entità, marco quelle che ho già fatto
SetInfoTable( tListSameMach, 'Mach2nd', 1)
local nNewMach = EgtGetInfo( tListSameMach[1], 'Mach', 'i') or 1
if nNewMach > 30 and nNewMach < 40 then
SetInfoTable( tListSameMach, 'Mach', nNewMach-20) -- assegno nota per non lavorarla di nuovo
elseif nNewMach > 40 and nNewMach < 50 then
SetInfoTable( tListSameMach, 'Mach', nNewMach-30) -- assegno nota per non lavorarla di nuovo
end
end
end
-- tolgo di mezzo le note secondarie
for j = 1, #EntList do
EgtRemoveInfo( EntList[j], 'Mach2nd')
end
end
-- ordino le lavorazioni
if #tMachining > 1 then
-- Tavole per fresature da ordinare
local TabMill = {}
local TabMStEnP = {}
local TabZMach = {}
local TabMachining = {}
for k = 1, #tMachining do
-- Se appartiene alla fase corrente e fresatura non vuota
if EgtGetOperationPhase( tMachining[k][1]) == nNumPhase then
EgtSetCurrMachining( tMachining[k][1])
local ptStart = EgtGetMachiningStartPoint()
local ptEnd = EgtGetMachiningEndPoint()
if ptStart and ptEnd then
table.insert( TabMill, tMachining[k][1])
table.insert( TabMStEnP, { ptStart, ptEnd})
table.insert( TabMachining, tMachining[k])
MB.InsZedByTool( TabZMach, TabMachining, #TabMachining)
end
end
end
-- calcolo ordinamento
EgtSpInit()
for k = 1, #TabMill do
EgtSpAddPoint( TabMStEnP[k][1]:getX(), TabMStEnP[k][1]:getY(), TabZMach[k], 0, 0,
TabMStEnP[k][2]:getX(), TabMStEnP[k][2]:getY(), TabZMach[k], 0, 0)
end
if EndLastMach then
EgtSpSetOpenBound(true,SHP_OB.NEAR_PNT,EndLastMach:getX(),EndLastMach:getY(),0,90,90)
else
EgtSpSetOpenBound(true,SHP_OB.NEAR_PNT,-2000,0,0,90,90)
end
local vMillOrd = EgtSpCalculate(SHP_TY.OPEN)
EgtSpTerminate()
-- applico ordinamento calcolato
-- parto da LastMch precedente
if vMillOrd then
for k = 1, #vMillOrd do
EgtRelocateGlob(TabMill[vMillOrd[k]],LastMch,GDB_IN.AFTER)
LastMch = TabMill[vMillOrd[k]]
end
end
end
elseif sProperty == 'Shuttle' then -- lavorazione con shuttle
-- per ogni layer padre nella lista fatta con il reordergroup
for k = 1, #tOrderGrp do
-- Recupero la prima entità del layer padre
local EntList = MB.FindEntities( tOrderGrp[k][1], true)
-- LAVORAZIONI
local nMach = 1
-- riciclo per prendere tutte le entità di un gruppo che devono essere lavorate assieme
bOk, nNumMach = MakeGroupMachining( EntList, tOrderGrp[k][1], tGroup, nMach, nNumGrp,
nNumMach, bOk, DGD.GHT, tMainTabPar.MDC, EndLastMach,
tMainTabPar.BPLI, tMainTabPar.PRF, nNumMachFromTable)
end
elseif sProperty == 'Layer' then -- lavorazione layer
-- ottengo tutte le entità del gruppo
local EntListGrp = MB.LoadEntitiesFromGroup( tGroup, Pz, DGD.GHT)
-- Applico le lavorazioni
for j = 1, #EntListGrp do
local nParendId = EgtGetParent(EntListGrp[j])
-- Recupero la prima entità del layer padre
local EntList = MB.FindEntities( nParendId, true)
-- LAVORAZIONI
local nMach = 1
-- riciclo per prendere tutte le entità di un gruppo che devono essere lavorate assieme
bOk, nNumMach = MakeGroupMachining( EntList, nParendId, tGroup, nMach, nNumGrp,
nNumMach, bOk, DGD.GHT, tMainTabPar.MDC, EndLastMach,
tMainTabPar.BPLI, tMainTabPar.PRF, nNumMachFromTable)
end
elseif sProperty == '' then -- proprietà nulla
-- creo lavorazioni del gruppo
for k = 1, #tGroup do
-- Recupero le entità
local EntList = MB.FindEntitiesWithName( Pz, tGroup[k].Name..DGD.GHT)
local bAdjustHead = false
-- Applico le lavorazioni
for j = 1, #EntList do
-- LAVORAZIONI
local nMach = EgtGetInfo( EntList[j], 'Mach', 'i') or 1
nMach = nMach - 30 -- se lavorazione corretta ottengo 1
local nMach2nd = EgtGetInfo( EntList[j], 'Mach2nd', 'i') or 0
local sMachining = EgtGetInfo( EntList[j], 'Machining')
-- con questa tabella non ci sono seconde o terze lavorazioni, solo la prima
if nMach > 0 and nMach < 4 then nMach = 1 end
if sMachining and nMach == 1 and nMach2nd == 0 and sMachining == tGroup[k].Mach then
-- cerco di unire più entità nella stessa lavorazione ( non da sotto e non oltre una certa distanza)
local tListSameMach = MB.FindEntitiesCompMach( EntList[j], EntList, sMachining, tGroup[k].Join, tMainTabPar.MDC)
-- se più di 1 entità le ordino
if #tListSameMach > 1 then
tListSameMach = MB.OrderEnt( tListSameMach, EndLastMach)
EndLastMach = EgtSP( tListSameMach[#tListSameMach], GDB_ID.ROOT )
end
bOk, nNumMach = InsertMachiningByMachNum( tListSameMach, nMach, tGroup[k].Name, nNumGrp, tGroup[k].Mach,
tGroup[k].MachUp, tGroup[k].MachDw, bOk, nNumMach, bAdjustHead,
GEN_MACH, nil, tMainTabPar.BPLI, tMainTabPar.PRF, nNumMachFromTable)
-- se ho assegnato lavorazione a più entità, marco quelle che ho già fatto
SetInfoTable( tListSameMach, 'Mach2nd', 1)
local nNewMach = EgtGetInfo( tListSameMach[1], 'Mach', 'i') or 1
if nNewMach > 30 and nNewMach < 40 then
SetInfoTable( tListSameMach, 'Mach', nNewMach-20) -- assegno nota per non lavorarla di nuovo
elseif nNewMach > 40 and nNewMach < 50 then
SetInfoTable( tListSameMach, 'Mach', nNewMach-30) -- assegno nota per non lavorarla di nuovo
end
end
end
-- tolgo di mezzo le note secondarie
for j = 1, #EntList do
EgtRemoveInfo( EntList[j], 'Mach2nd')
end
end
end
elseif nNumGrp == 0 then -- se lavorazioni in gruppo 0 do errore
DGD.ERR = -15
if DGD.EMC and #DGD.EMC > 0 then
DGD.EMC = DGD.EMC .. ' ' .. string.format(EgtDoorsMsg[639], tGroup[1].Name) -- con gruppo 0 c'è solo un'istanza
else
DGD.EMC = '\n' .. ' ' .. string.format(EgtDoorsMsg[639], tGroup[1].Name) -- con gruppo 0 c'è solo un'istanza
end
if DGD.ERM and #DGD.ERM > 0 then
DGD.ERM = DGD.ERM .. ' ' .. string.format(EgtDoorsMsg[639], tGroup[1].Name) -- con gruppo 0 c'è solo un'istanza
else
DGD.ERM = ' ' .. string.format(EgtDoorsMsg[639], tGroup[1].Name) -- con gruppo 0 c'è solo un'istanza
end
end
i = i + 1
end
--------------------------------------------------------------------------------------------------------
-- elimino eventuali lavorazioni di side probe che non hanno lavorazioni nel layer a cui appartiene
--------------------------------------------------------------------------------------------------------
-- se ho cancellazione percorsi probe side ( che indica gestione macchine in linea)
if tMainTabPar.DSPP > 0 then
local PrevMch = EgtGetPhaseDisposition( nNumPhase)
local nOperId = EgtGetNextOperation( PrevMch)
while nOperId do
local bDeletedMach = false
-- solo sulle contornature
if EgtGetOperationType( nOperId) == MCH_OY.MILLING then
-- prendo la geometria della lavorazione
EgtSetCurrMachining( nOperId)
local Geo = EgtGetMachiningGeometry()
-- se restituisce una tabella coerente
if type(Geo) == 'table' and type(Geo[1]) == 'table' and Geo[1][1] and Geo[1][1] > 0 then
nPath = Geo[1][1]
-- prendo il nome della geometria
local sNameGeom = EgtGetName( nPath)
-- se è una side probe
if string.find( sNameGeom, 'ProbeSidePoint' .. DGD.GHT) then
-- acquisisco l'id del layer
local nLayerId = EgtGetParent( nPath)
-- cerco nel layer tutte le entità che sono state lavorate e che dalle note risultano lavorate con la macchina corrente
local Ent = EgtGetFirstInGroup( nLayerId)
local bFound = false
while Ent and not bFound do
if Ent ~= nPath then
local nProbeSideFlag = EgtGetInfo( Ent, 'ProbeSide', 'i') or 0
local nMachineId = EgtGetInfo( Ent, 'IdMachine', 'i') or 0
local sNameEnt = EgtGetName( Ent)
-- verifico se hanno entrambe le note che indicano la lavorazione presente
if nProbeSideFlag == 1 and nMachineId == nNumMachFromTable then
-- flag indice presenza lavorazione, non cancella la lavorazione di side probe
bFound = true
end
end
Ent = EgtGetNext( Ent)
end
-- se non ho trovato lavorazioni elimino la side probe machining
if not bFound then
local nMachToDel = nOperId
nOperId = EgtGetNextOperation( nOperId)
EgtRemoveOperation( nMachToDel)
bDeletedMach = true
end
end
end
end
if not bDeletedMach then
-- Passo alla operazione successiva
nOperId = EgtGetNextOperation( nOperId)
end
end
-- riparto per le lavorazioni di probe in Z
nOperId = EgtGetNextOperation( PrevMch)
while nOperId do
local bDeletedMach = false
-- solo sulle contornature
if EgtGetOperationType( nOperId) == MCH_OY.DRILLING then
-- prendo la geometria della lavorazione
EgtSetCurrMachining( nOperId)
local Geo = EgtGetMachiningGeometry()
-- se restituisce una tabella coerente
if type(Geo) == 'table' and type(Geo[1]) == 'table' and Geo[1][1] and Geo[1][1] > 0 then
nPath = Geo[1][1]
-- prendo il nome della geometria
local sNameGeom = EgtGetName( nPath)
-- se è una probe in Z
if string.find( sNameGeom, 'ProbePoint' .. DGD.GHT) then
-- acquisisco l'id del layer
local nLayerId = EgtGetParent( nPath)
-- cerco nel layer tutte le entità che sono state lavorate e che dalle note risultano lavorate con la macchina corrente
local Ent = EgtGetFirstInGroup( nLayerId)
local bFound = false
while Ent and not bFound do
if Ent ~= nPath then
local sProbeFlag = EgtGetInfo( Ent, 'KeepBackSet', 's') or ''
local nMachineId = EgtGetInfo( Ent, 'IdMachine', 'i') or 0
local sNameEnt = EgtGetName( Ent)
-- verifico se hanno entrambe le note che indicano la lavorazione presente
if #sProbeFlag >= 1 and nMachineId == nNumMachFromTable then
-- flag indice presenza lavorazione, non cancella la lavorazione di side probe
bFound = true
end
end
Ent = EgtGetNext( Ent)
end
-- se non ho trovato lavorazioni elimino la side probe machining
if not bFound then
local nMachToDel = nOperId
nOperId = EgtGetNextOperation( nOperId)
EgtRemoveOperation( nMachToDel)
bDeletedMach = true
end
end
end
end
if not bDeletedMach then
-- Passo alla operazione successiva
nOperId = EgtGetNextOperation( nOperId)
end
end
end
----------------------------------------
-- Inserimento riferimenti e ventose
----------------------------------------
-- Offset ventose da bordo pezzo in Y
dVacOffs = tMainTabPar.VOY
-- Offset barra riferimenti mobile da riferimenti quando posizione 0
dMobOffs = tMainTabPar.MOY + dVacOffs
-- Lunghezza minima per alzare prima ventosa da bordo sinistro
dDistMinX = tMainTabPar.LDX + 40 + DIST_MIN_VAC_L -- distanza misurata tra appoggio riferimento e centro ventose + quota sicurezza ( R ventosa + sicurezza)
-- Lunghezza minima per alzare prima ventosa da bordo destro
dDistMaxX = tMainTabPar.RDX + 40 + DIST_MIN_VAC_R -- distanza misurata tra appoggio riferimento e centro ventose + quota sicurezza ( R ventosa + sicurezza)
-- Posizione ventose in alto
dVacOn = 110
-- Interasse ventose
dInterAx = 232
-- distanza interferenza con cave passanti
dDistInterferThru = 42 + tMainTabPar.DTG -- modificato da 20 a 12 il 26/10/2017 su richiesta di Mark
dDistInterferBlind = 42 + tMainTabPar.DBG
dDistInterferUnder = 42 + tMainTabPar.DUG
-- Ventose
local nTabId = EgtGetTableId( 'Tab')
local nMobId = EgtGetFirstNameInGroup( nTabId or GDB_ID.NULL, 'MOBILE')
local nFixId = EgtGetFirstNameInGroup( nTabId or GDB_ID.NULL, 'FIXED')
local nDispId = EgtGetPhaseDisposition( nNumPhase)
-- se gruppi richiesti non trovati
if not nMobId or not nFixId then
bOk = false
DGD.EMC = ' ' .. EgtDoorsMsg[675]..EgtDoorsMsg[530] -- Error on MOBILE or FIXED table bar'
break
end
-- Posizionamento barra mobile
local dOldVal = EgtGetInfo( nMobId, 'Val', 'd')
-- calcolo nuova posizione con: larghezza finita porta ( uso getDimX perché presa prima della disposizione porta) +
-- sovramateriale a contatto con il riferimento in basso - distanza ventose - offset barra
local dNewVal = b3Solid:getDimX() + OffsYSovr + vShift:getY() + vShiftVac:getY() - dVacOffs - dMobOffs
-- controllo che la posizione non supera la posizione massima raggiungibile dalla barra mobile
if dNewVal > tMainTabPar.MPMB then
dNewVal = tMainTabPar.MPMB
end
if nDispFront > 0 then
EgtMove( nMobId, Vector3d( 0, dNewVal - dOldVal, 0), GDB_RT.GLOB)
else
EgtMove( nMobId, Vector3d( 0, dOldVal - dNewVal, 0), GDB_RT.GLOB)
end
EgtSetInfo( nMobId, 'Val', dNewVal)
EgtSetInfo( nDispId, 'MOB', dNewVal)
-- posizionamento barra mobile e fissa in X
-- disposizione a sinistra
if nDispMode > 0 then
dOldVal = EgtGetInfo( nFixId, 'ValXL', 'd')
dNewVal = tMainTabPar.LDX
if dOldVal and dNewVal then
EgtMove( nFixId, Vector3d( dNewVal - dOldVal, 0, 0), GDB_RT.GLOB)
EgtMove( nMobId, Vector3d( dNewVal - dOldVal, 0, 0), GDB_RT.GLOB)
EgtSetInfo( nFixId, 'ValXL', dNewVal)
EgtSetInfo( nDispId, 'MOBL', dNewVal)
end
-- disposizione a destra
else
dOldVal = EgtGetInfo( nFixId, 'ValXR', 'd')
dNewVal = tMainTabPar.RDX
if dOldVal and dNewVal then
EgtMove( nFixId, Vector3d( dOldVal - dNewVal, 0, 0), GDB_RT.GLOB)
EgtMove( nMobId, Vector3d( dOldVal - dNewVal, 0, 0), GDB_RT.GLOB)
EgtSetInfo( nFixId, 'ValXR', dNewVal)
EgtSetInfo( nDispId, 'MOBR', dNewVal)
end
end
-- Elevazione ventose con: altezza porta ( uso getDimY perché presa prima della disposizione porta) +
-- sovramateriale a contatto con il riferimento a sx - distanza ventosa
local dCalcLen = b3Solid:getDimY() + OffsXSovr - EgtIf( nDispMode > 0, dDistMinX, dDistMaxX)
-- predispongo regioni per verifica interferenza con lavorazioni passanti o da sotto
StartVacVerify( Ls, bFlip, dThickDoor)
-- verifico se presente groove applicato a top su angolo
local sAngGrooveNote = EgtGetInfo( Pz, 'GrooveOnAngle', 's')
-- ciclo sulle ventose
local nInd = 1
local nIndVac
local nNumTotVacRow = 13
local nCountFailed = 0
local nIniFailed = 0
local nMiddleFailed = 0
local nEndFailed = 0
local nMaxIniFailed = 0
local nMaxMiddleFailed = 0
local nMaxEndFailed = 0
while dCalcLen > 0 and nInd <= nNumTotVacRow do
nIndVac = EgtIf( nDispMode > 0, nInd, ( nNumTotVacRow - nInd + 1))
local sInd = tostring( nIndVac)
-- eseguo verifica
local nCenFixId = EgtGetFirstNameInGroup( nFixId, 'CEN'..sInd)
local pPntFix = EgtSP( nCenFixId, GDB_ID.ROOT)
local bCanUpFix = ExecVacVerify( pPntFix, dDistInterferThru, dDistInterferBlind, dDistInterferUnder, EgtIf( nInd < 3, sAngGrooveNote, nil),
Ls, bFlip, nCenFixId)
local nCenMobId = EgtGetFirstNameInGroup( nMobId, 'CEN'..sInd)
local pPntMob = EgtSP( nCenMobId, GDB_ID.ROOT)
local bCanUpMob = ExecVacVerify( pPntMob, dDistInterferThru, dDistInterferBlind, dDistInterferUnder, EgtIf( nInd < 3, sAngGrooveNote, nil),
Ls, bFlip, nCenMobId)
-- eventuale movimento
if bCanUpFix and bCanUpMob then
local nIdFix = AddMoveShowHideVac( KIND_DISP_MODE, nFixId, 'VAC'..sInd, 'ROD'..sInd, dVacOn, 'VAC_D80', ( pPntFix - tabOri))
local nIdMov = AddMoveShowHideVac( KIND_DISP_MODE, nMobId, 'VAC'..sInd, 'ROD'..sInd, dVacOn, 'VAC_D80', ( pPntMob - tabOri))
-- salvo lo stato e info modalità disposizione
EgtSetInfo( nDispId, 'VAC'..sInd, dVacOn)
EgtSetInfo( nDispId, 'KIND_DISP_MODE'..sInd, KIND_DISP_MODE)
-- EgtSetInfo( nDispId, 'FIXIDS'..sInd, nIdFix)
-- EgtSetInfo( nDispId, 'MOBIDS'..sInd, nIdMov)
EgtSetInfo( nDispId, 'FIXPOS'..sInd, ( pPntFix - tabOri))
EgtSetInfo( nDispId, 'MOBPOS'..sInd, ( pPntMob - tabOri))
-- interrompo le serie negative
if nInd > 1 then
nCountFailed = 0
if nMaxIniFailed < nIniFailed then
nMaxIniFailed = nIniFailed
end
if nMaxMiddleFailed < nMiddleFailed then
nMaxMiddleFailed = nMiddleFailed
end
if nMaxEndFailed < nEndFailed then
nMaxEndFailed = nEndFailed
end
nIniFailed = 0
nMiddleFailed = 0
nEndFailed = 0
end
else
EgtRemoveInfo( nDispId, 'VAC'..sInd)
EgtRemoveInfo( nDispId, 'KIND_DISP_MODE'..sInd)
AddMoveShowHideVac( 2, nFixId, 'VAC'..sInd) -- rendo visibile ventosa
AddMoveShowHideVac( 2, nMobId, 'VAC'..sInd) -- rendo visibile ventosa
nCountFailed = nCountFailed + 1
if nInd == 1 then -- setto solo il fallimento iniziale
nIniFailed = nCountFailed
elseif nInd == nNumTotVacRow or ( dCalcLen - dInterAx) <= 0 then -- setto solo quello finale e annullo il medio
nEndFailed = nCountFailed
if nMaxEndFailed < nEndFailed then
nMaxEndFailed = nEndFailed
end
nMiddleFailed = 0
else -- se fallisce riga intermedia aggiorno solo i contatori già iniziati
if nIniFailed > 0 then
nIniFailed = nCountFailed
elseif nEndFailed > 0 then
nEndFailed = nCountFailed - 1
else
nMiddleFailed = nCountFailed
end
end
end
-- aggiorno la lunghezza di calcolo e l'indice
dCalcLen = dCalcLen - dInterAx
nInd = nInd + 1
end
-- elimino geometrie per verifica
EndVacVerify()
-- riassegno la quantità di file che effettivamente potrebbero essere alzate
nInd = nInd - 1
-- casi di scarse ventose :
-- tutte le ventose basse
if nInd > 0 and ( nMaxIniFailed == nInd or nMaxMiddleFailed == nInd or nMaxEndFailed == nInd) then
DGD.EMC = ' ' .. EgtDoorsMsg[531]
bOk = false
break
-- ventose iniziali ( parte destra)
elseif nInd > 0 and nMaxIniFailed / nInd > 0.35 then
local nNumMsg = EgtIf( nDispMode > 0, 532, 534)
DGD.EMC = ' ' .. EgtDoorsMsg[nNumMsg]
bOk = false
break
-- ventose intermedie
elseif nInd > 0 and nMaxMiddleFailed / nInd > 0.45 then
DGD.EMC = ' ' .. EgtDoorsMsg[533]
bOk = false
break
-- ventose finali ( parte sinistra)
elseif nInd > 0 and nMaxEndFailed / nInd > 0.35 then
local nNumMsg = EgtIf( nDispMode > 0, 534, 532)
DGD.EMC = ' ' .. EgtDoorsMsg[nNumMsg]
bOk = false
break
-- somma di vari intervalli
elseif ( nMaxIniFailed + nMaxMiddleFailed + nMaxEndFailed) >= nInd/2 then
DGD.EMC = ' ' .. EgtDoorsMsg[531]
bOk = false
break
end
-------------------------------------------------
-- gestione messaggi LIGHT: red, yellow, green
-------------------------------------------------
-- se ho geometrie da entrambe le parti la luce è red
if nNumGeomBottom > 0 and nNumGeomTop > 0 then
sLight = 'RED'
-- se non ho geometrie la luce è green
elseif nNumGeomBottom == 0 and nNumGeomTop == 0 then
sLight = 'GREEN'
-- se una delle due ha delle geometrie
else
-- in caso di geometrie tutte sotto luce yellow
if nNumGeomBottom > 0 then
sLight = 'YELLOW'
-- in caso di geometrie tutte sopra luce green
elseif nNumGeomTop > 0 then
sLight = 'GREEN'
end
end
-- *** Tools Setup ***
-- provo a importare l'attrezzaggio di default, se fallisce passo gli altri
local bSetUp = EgtImportSetup()
local tListError
local sListTool = ''
if bSetUp then -- se importato quello di default
sSetup = EgtGetDefaultSetupName()
-- verifico se l'attrezzaggio è idoneo
bSetUp, tListError = EgtVerifyCurrSetup()
-- se attrezzaggio andato a buon fine setto il nome dell'attrezzaggio di default
if bSetUp then
-- assegno nota con il nome del file setup assegnato
EgtSetInfo( EgtGetCurrSetup(), 'Name', sSetup)
else -- preparo la lista degli utensili mancanti
sListTool = string.format( EgtDoorsMsg[552], sSetup) .. ' (Default)'
sListTool = sListTool .. '\n ' .. EgtDoorsMsg[553]
for k = 1, #tListError do
sListTool = sListTool .. '\n ' .. tListError[k]
end
end
end
-- se fallito quello di default o utensili mancanti provo quello indicato nel CurrCamInfo
if not bSetUp then
local sDefSetUp = sSetup -- mi tengo via il nome dell'attrezzaggio di default
local nContImport = 0
-- ciclo tra quelli disponibili
for k = 1, 8 do
if not bSetUp then
if k == 1 then
sSetup = mCamData[nNumMachFromCam].Setup1
elseif k == 2 then
sSetup = mCamData[nNumMachFromCam].Setup2
elseif k == 3 then
sSetup = mCamData[nNumMachFromCam].Setup3
elseif k == 4 then
sSetup = mCamData[nNumMachFromCam].Setup4
elseif k == 5 then
sSetup = mCamData[nNumMachFromCam].Setup5
elseif k == 6 then
sSetup = mCamData[nNumMachFromCam].Setup6
elseif k == 7 then
sSetup = mCamData[nNumMachFromCam].Setup7
elseif k == 8 then
sSetup = mCamData[nNumMachFromCam].Setup8
end
-- se nome attrezzaggio non è vuoto
if sSetup and #sSetup > 0 then
bSetUp = EgtImportSetup(sSetup)
end
if bSetUp then -- se importato il fle da CurrCamInfo
nContImport = nContImport + 1
-- verifico se l'attrezzaggio è idoneo
bSetUp, tListError = EgtVerifyCurrSetup()
if bSetUp then -- se è andato bene
-- assegno nota con il nome del file setup assegnato
EgtSetInfo( EgtGetCurrSetup(), 'Name', sSetup)
break
else -- se utensili mancanti prendo la lista e passo al successivo
sListTool = sListTool .. '\n ' .. string.format( EgtDoorsMsg[552], sSetup) .. string.format(' (from CurrCamInfo Setup%s)', k)
sListTool = sListTool .. '\n ' .. EgtDoorsMsg[553]
for k = 1, #tListError do
sListTool = sListTool .. '\n ' .. tListError[k]
end
end
else -- se non importato carico il messaggio di errore e passo al successivo
sListTool = sListTool .. '\n ' .. string.format( EgtDoorsMsg[554], sSetup) .. string.format(' (from CurrCamInfo Setup%s)', k)
end
end
end
-- se nessuno è andato bene verifico se il primo era stato importato
if not bSetUp then
if ( sDefSetUp and #sDefSetUp > 0) or
nContImport > 0 then
if DGD.EMC and #DGD.EMC > 0 then
DGD.EMC = DGD.EMC .. '\n' .. ' ' .. EgtDoorsMsg[551]
else
DGD.EMC = ' ' .. EgtDoorsMsg[551]
end
bOk = false
if #sListTool > 0 then
DGD.EMC = DGD.EMC .. sListTool
end
break
else -- setup default non definito
-- assegno ugualmente un attrezzaggio vuoto
EgtSetInfo( EgtGetCurrSetup(), 'Name', EgtDoorsMsg[555])
end
else -- ha importato il file da CurrCamInfo
-- verifico se l'attrezzaggio è idoneo
bSetUp, tListError = EgtVerifyCurrSetup()
if bSetUp then -- se è andato bene
-- assegno nota con il nome del file setup assegnato
EgtSetInfo( EgtGetCurrSetup(), 'Name', sSetup)
else -- se utensili mancanti
sListTool = sListTool .. '\n ' .. string.format( EgtDoorsMsg[552], sSetup) .. string.format(' (from CurrCamInfo Setup%s)', 1)
sListTool = sListTool .. '\n ' .. EgtDoorsMsg[553]
for k = 1, #tListError do
sListTool = sListTool .. '\n ' .. tListError[k]
end
DGD.EMC = DGD.EMC .. sListTool
bOk = false
break
end
end
end
-- se nessuna geometria skippata esco
if nNumMachSkip and nNumMachSkip == 0 then bWork = false end
-- se lavorazioni skippate abilito il ribaltamento porta in altra fase
if nNumMachSkip and nNumMachSkip > 0 then
nNumMachSkip = 0 -- resetto per il prossimo giro
-- per interrompere il giro forzatamente ( perché nessun ribaltamento) setto bWork
bWork = false
end
nNumCycle = nNumCycle + 1
-- se deve uscire dal ciclo, prima di farlo, eseguo l'eventuale split della porta
if not bWork then
-- gestione taglio longitudinale split door
-- assegnamento variabili
-- se è una porta e nessuna lavorazione da sotto
if not sAssemb and nNumGeomBottom == 0 then
local EntList = tSplitDoorEnt
if #EntList == 1 then
-- acquisisco nota direzione taglio e la confronto con il parametro del currcaminfo
local sDirCut = EgtGetInfo( EntList[1], 'DirectionCut', 's')
if sDirCut and
( ( sDirCut == 'H' and string.find( tMainTabPar.CDA, 'H')) or
( sDirCut == 'W' and string.find( tMainTabPar.CDA, 'W'))) then
bLocMach, nNewIdEnt = MB.AdjustThrouCurve( EntList[1], tSplitDataInf[1][7])
if bLocMach then
local bInsLav = false
local nMach = EgtGetInfo( nNewIdEnt, 'Mach', 'i') or 1
nLocMach = nMach
if nMach == 1 then
-- carico id entità in una tabella
local tListSameMach = {}
table.insert( tListSameMach, nNewIdEnt)
bOk, nNumMach = InsertMachiningByMachNum( tListSameMach, nMach, tSplitDataInf[1][1], tSplitDataInf[1][2], tSplitDataInf[1][3],
tSplitDataInf[1][4], tSplitDataInf[1][5], bOk, tSplitDataInf[1][6], false,
NGEN_MACH, nil, tMainTabPar.BPLI, tMainTabPar.PRF)
end
else
bOk = false
end
end
-- se ho più di un taglio do errore
elseif #EntList > 1 then
-- se lanciato da DMach stampo anche un messaggio a video
if not DGD or not DGD.NCGEN then
if DGD.EMC and #DGD.EMC > 0 then
EgtOutBox( DGD.EMC .. '\n' .. EgtDoorsMsg[695], EgtDoorsMsg[476], EgtDoorsMsg[477])
else
EgtOutBox( EgtDoorsMsg[695], EgtDoorsMsg[476], EgtDoorsMsg[477])
end
else
-- scrivo messaggio nei file log
DoorOutLog( EgtDoorsMsg[695], 0)
end
-- Salvo progetto
EgtSaveFile()
return false, nNumGroup
end
end
end
end -- end while
local nNoMach
-- se ho una luce faccio una ulteriore verifica sul numero delle lavorazioni
if sLight then
local PrevMch = EgtGetPhaseDisposition( nNumPhase)
local nOperId = EgtGetNextOperation( PrevMch)
-- se non ho lavorazioni, nemmeno codici speciali, setto luce purple e flag nessuna lavorazione
if not nOperId and not bSpecialCommandFound then
sLight = 'PURPLE'
nNoMach = 1
else
nNoMach = 0
end
end
--bOk = false -- per forzare l'errore
if nNumGroup > 1 then sNumGroup = '_'..EgtNumToString( nNumGroup,0) end
-- Eventuale messaggio di errore
if not bOk then
DoorOutLog( string.format(EgtDoorsMsg[494], tMainTabPar.MN), 0) -- inizio lavorazione su macchina
DGD.ERR = 20
DoorOutLog( ' Err=' .. tostring( DGD.ERR), 1)
-- stampo gli errori del machiningBase
if DGD.EMC and #DGD.EMC > 0 then
DoorOutLog( DGD.EMC, 0)
end
DoorOutLog( string.format( EgtDoorsMsg[475], tMainTabPar.MN), 0) -- Error on machining calculation
-- cancello il file tok
EgtEraseFile( sFileDir..sFileName..sNumGroup..'.tok')
-- cancello il file cn e il txt
EgtEraseFile( sFileDir..sFileName..sNumGroup..'.cnc')
EgtEraseFile( sFileDir..sFileName..sNumGroup..'.txt')
--ricreo il file txt con l'errore
WriteErrFile( sFileDir..sFileName..sNumGroup..'.txt', string.format( EgtDoorsMsg[475], tMainTabPar.MN))
if not DGD.NCGEN then -- modificato not DGD con not DGD.NCGEN perche ho incluso EgtDoorsData dove esiste DGD
if DGD.EMC and #DGD.EMC > 0 then
EgtOutBox( DGD.EMC .. '\n' .. string.format( EgtDoorsMsg[475], tMainTabPar.MN), EgtDoorsMsg[476], EgtDoorsMsg[477]) -- Error on machining calculation
else
EgtOutBox( string.format( EgtDoorsMsg[475], tMainTabPar.MN), EgtDoorsMsg[476], EgtDoorsMsg[477]) -- Error on machining calculation
end
end
-- Salvo progetto
EgtSaveFile()
return false, nNumGroup
end
-- Applica tutte le lavorazioni ( che comprende anche l'aggiornamento, EgtUpdateAllMachinings con il calcolo assi macchina e movimenti tra lavorazioni e finale)
EgtApplyAllMachinings( false, false)
-- Salvo progetto
EgtSaveFile()
-- nTime = EgtStopCounter()
-- if not DGD or not DGD.NCGEN then
-- EgtOutBox( string.format( '3 tempo calcolato sec: %s', (nTime/1000)), 'Timex', 'Timex')
-- end
-- -- inizializzo il contatore
-- EgtStartCounter()
-- controllo collisioni
local bSimOk
-- Simulation for collision check
if tMainTabPar.ECD == 1 then
DoorOutLog( ' +++ Simulating with collision check >>>', 0)
EgtOutText( 'Start hidden simulation to find collision, It keep some time')
local nErr, sErr
-- se non ho lavorazioni non simulo
if nNoMach == 1 then
bSimOk = true
else
bSimOk, nErr, sErr = EgtSimulate()
if not bSimOk then
if nErr == MCH_SHE.INIT then
DGD.ERR = 33
DGD.EMC = DGD.EMC .. string.format(EgtDoorsMsg[686], sErr)
EgtOutBox( string.format(EgtDoorsMsg[686], sErr), 'Simulation', 'Simulation')
elseif nErr == MCH_SHE.COLLISION then
DGD.ERR = 33
DGD.EMC = DGD.EMC .. string.format(EgtDoorsMsg[687], sErr)
EgtOutBox( string.format(EgtDoorsMsg[687], sErr), 'Collision', 'Collision')
elseif nErr == MCH_SHE.OUTSTROKE then
DGD.ERR = 33
DGD.EMC = DGD.EMC .. string.format(EgtDoorsMsg[688], sErr)
EgtOutBox( string.format(EgtDoorsMsg[688], sErr), 'Outstroke', 'Outstroke')
else
DGD.ERR = 33
DGD.EMC = DGD.EMC .. string.format(EgtDoorsMsg[689], sErr)
EgtOutBox( string.format(EgtDoorsMsg[689], sErr), 'Simulation', 'Simulation')
end
end
EgtOutText( 'hidden simulation finished')
end
else
bSimOk = true
end
-- nTime = EgtStopCounter()
-- if not DGD or not DGD.NCGEN then
-- EgtOutBox( string.format( '4 tempo calcolato sec: %s', (nTime/1000)), 'Timex', 'Timex')
-- end
-- -- inizializzo il contatore
-- EgtStartCounter()
if bSimOk then
-- se non ho lavorazioni non generao nulla
if nNoMach ~= 1 then
-- Estimation
bOk = EgtEstimate( sFileDir..sFileName..sNumGroup..'.html', 'EgtCam5 - '..sFilePath)
-- NC code generation
bOk = EgtGenerate( sFileDir..sFileName..sNumGroup..'.cnc', 'EgtCam5 - '..sFilePath)
end
else
bOk = false
-- luce di caricamento porta
if sLight then
DGD.ERM = ' LIGHT='..sLight..'\n'..DGD.ERM
end
end
if bOk then
if not DGD.ERR then DGD.ERR = 0 end
-- luce di caricamento porta
if sLight then
DGD.ERM = ' LIGHT='..sLight..'\n'..DGD.ERM
end
DoorOutLog( string.format( '\n'..EgtDoorsMsg[494], tMainTabPar.MN), 0) -- inizio lavorazione su macchina
DoorOutLog( ' Err=' .. tostring( DGD.ERR), 1)
if not DGD.NCGEN then
if DGD.ERM and #DGD.ERM > 0 then
DoorOutLog( DGD.ERM, 0) -- stampo eventuali errori
end
end
DoorOutLog( sTotDispMode, 0) -- stampo la disposizione nel log
-- cancello il file tok
EgtEraseFile( sFileDir..sFileName..sNumGroup..'.tok')
-- cancello e ricreo il file txt
EgtEraseFile( sFileDir..sFileName..sNumGroup..'.txt')
-- se non ho lavorazioni non generao nulla
if nNoMach ~= 1 then
--ricreo il file txt con la disposizione
WriteErrFile( sFileDir..sFileName..sNumGroup..'.txt', sTotDispMode)
-- copio il file txt con nuova estensione .tok
EgtCopyFile( sFileDir..sFileName..sNumGroup..'.txt', sFileDir..sFileName..sNumGroup..'.tok')
end
else
-- se la simulazione è stata corretta ma errore nella generazione
if bSimOk then
DGD.ERR = 20
DGD.EMC = DGD.EMC .. string.format(EgtDoorsMsg[478], tMainTabPar.MN, sSetup)
end
-- cancello il file tok
EgtEraseFile( sFileDir..sFileName..sNumGroup..'.tok')
-- cancello e ricreo il file txt
EgtEraseFile( sFileDir..sFileName..sNumGroup..'.txt')
--ricreo il file txt con la disposizione
WriteErrFile( sFileDir..sFileName..sNumGroup..'.txt')
-- se la simulazione è stata corretta ma errore nella generazione
if bSimOk then
-- scrivo messaggio nei file log
DoorOutLog( string.format(EgtDoorsMsg[478], tMainTabPar.MN, sSetup), 0) -- Error on Nc part program generation
-- se lanciato da DMach stampo anche un messaggio a video
if not DGD or not DGD.NCGEN then
DoorOutLog( ' Err=' .. tostring( DGD.ERR), 0)
EgtOutBox( string.format(EgtDoorsMsg[478], tMainTabPar.MN, sSetup), EgtDoorsMsg[476], EgtDoorsMsg[477]) -- Error on Nc part program generation
end
else
if not DGD.NCGEN then
if DGD.ERM and #DGD.ERM > 0 then
DoorOutLog( DGD.ERM, 0) -- stampo eventuali errori
end
end
-- scrivo messaggio nei file log
DoorOutLog( EgtDoorsMsg[690], 0) -- Error on simulation
-- se lanciato da DMach stampo anche un messaggio a video
if not DGD or not DGD.NCGEN then
DoorOutLog( ' Err=' .. tostring( DGD.ERR), 0)
EgtOutBox( EgtDoorsMsg[690], EgtDoorsMsg[476], EgtDoorsMsg[477]) -- Error on simulation
end
end
return false, nNumGroup
end
-- nTime = EgtStopCounter()
-- if not DGD or not DGD.NCGEN then
-- EgtOutBox( string.format( '5 tempo calcolato sec: %s', (nTime/1000)), 'Timex', 'Timex')
-- end
-- reset librerie locali
package.loaded[MachiningsTable] = nil
package.loaded[MachiningsTableOrd] = nil
return true, nNumGroup, nNoMach
end
return MachiningLoc