cc55202ec5
- primo commit con versione corrente.
2902 lines
135 KiB
Lua
2902 lines
135 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
|
|
--
|
|
-- Machining_1.lua by EgalWare s.r.l. 2016/23/05 20:00:00
|
|
-- Autore: Dario Sassi
|
|
-- Machining generation for Doors program machine CMS
|
|
-- 2016.11.16 V1.011 FM Manage door limit for shifted disposition
|
|
-- 2017.05 V1.012 FM Mmanage machining optimization
|
|
-- 2017.06.13 V1.013 FM Manage top door disposition by Currcaminfo
|
|
-- 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
|
|
-- 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.16 V1.0b3 FM Extend setup to 50 items
|
|
-- 2018.10.18 V1.0b4 FM Manage better setting the disposition parameter on Inactive door with opposite bevel profiles
|
|
-- 2018.10.23 V1.0b5 FM Manage rough machining
|
|
-- 2018.10.25 V1.0b6 FM Fix problem on AdjustBevel: missing parameter into call function
|
|
-- 2019.01.14 V1.0b7 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.0b8 FM Not generate machining on Group 0 (of MTable ordered table) and print warning message into repot files.
|
|
-- 2019.02.12 V1.0b9 FM Remove empty phase (after the first one)
|
|
-- 2019.03.11 V1.0c1 FM Fix error on delete paths with HIDE and ROUGH suffix
|
|
-- 2019.03.27 V1.0c2 FM Manage check door/jamb dimension by function CheckPieceDimension
|
|
-- 2019.03.27 V1.0c3 FM Fix error on calculation bar disposition and menage better into CheckPieceDimension by shift door values
|
|
-- 2019.03.27 V1.0c3 FM Modify error messages format into CheckPieceDimension
|
|
-- 2019.03.27 V1.0c3 FM Manage estimate time
|
|
-- 2019.03.29 V1.0c4 FM Manage Edge break (EB) and Bevel Edge break (BVEB) profiles
|
|
-- 2019.04.08 V1.0c5 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.0c5 FM Manage Blade groove function AdjustBladeVertCurve
|
|
-- 2019.05.28 v1.0c6 FM Fix problem on update all machining after reorder, now use EgtApplyAllMachinings instead of EgtUpdateAllMachinings
|
|
-- 2021.06.01 v1.0c7 FM Fix error on calculate piece box
|
|
-- 2021.10.28 V1.0c8 FM Fix internal error when calculate Box with STANDARD parameter, now it uses EXACT parameter
|
|
-- 2022.06.10 V1.0c9 FM Manage large width door disposition
|
|
-- 2022.06.20 V1.0d1 FM Manage Part parameter from ddf
|
|
-- 2022.07.27 V1.0d2 FM Modification to use compiled code
|
|
-- 2023.03.29 V1.0d3 FM Fix error on calculate rough paths on Convex profile
|
|
-- 2023.07.06 V1.0d4 FM Fix error on not check new variables dDimPendularDoor and AskCustomTable
|
|
-- 2023.12.01 V1.0d5 FM Manage small planes on Convex profile
|
|
|
|
|
|
-- 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()
|
|
-- Definizione possibilità di lavorare sottosquadra nei profili bevel ( true: non lavora sottosquadra, false: possibile lavorare sottosquadra)
|
|
local NO_WORK_UNDERSQUARE = false
|
|
-- variabili genarazione lavorazioni
|
|
local GEN_MACH = false
|
|
local NOT_GEN_MACH = true
|
|
|
|
-----------------------------------------------------------------
|
|
-- *** 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) .. 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
|
|
|
|
-----------------------------------------------------------------
|
|
-- *** calculate door disposition by parameters ***
|
|
-----------------------------------------------------------------
|
|
local function CalcTopPosition( nTopSideDriveDisp, bAtRight)
|
|
local bTopOnRight
|
|
|
|
if nTopSideDriveDisp and nTopSideDriveDisp == 1 then
|
|
bTopOnRight = true
|
|
elseif nTopSideDriveDisp and nTopSideDriveDisp == 2 then
|
|
bTopOnRight = false
|
|
else
|
|
if bAtRight then -- se serratura a destra
|
|
bTopOnRight = true
|
|
else
|
|
bTopOnRight = false
|
|
end
|
|
end
|
|
|
|
return bTopOnRight
|
|
end
|
|
|
|
-----------------------------------------------------------------
|
|
-- *** Add Machining 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
|
|
|
|
-----------------------------------------------------------------
|
|
-- *** Apply Machining by Mach number ***
|
|
-----------------------------------------------------------------
|
|
local function InsertMachiningByMachNum ( tEndId, nMach, sLocName, nNumGroup, sMach,
|
|
sMachUp, sMachDw, bOk, nNumMach, bModifyMacNote,
|
|
bNotGenMachining, tMachining, dBladePerpLeadIn, dPercRedFeed, bCalMach)
|
|
|
|
local dOverL = EgtGetInfo( tEndId[1], 'OL')
|
|
local dOverR = EgtGetInfo( tEndId[1], 'OFFSTOPATH', 'd')
|
|
local nOffsetDel = EgtIf( bNotGenMachining, 20, 0)
|
|
local nOffsetDelFail = EgtIf( bNotGenMachining, 30, 0)
|
|
|
|
if nMach == 1 then
|
|
local nRes, nMachId, sToolName = MB.AddAndDelMachining( sLocName .. '_G' .. EgtNumToString(nNumGroup,0), sMach, tEndId, dOverL, sLocName,
|
|
bNotGenMachining, nil, dBladePerpLeadIn, dPercRedFeed, nil,
|
|
nil, nil, 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
|
|
-- setto nota per non lavorarla di nuovo
|
|
SetInfoTable( tEndId, 'Mach', 11+ nOffsetDel)
|
|
if bCalMach then
|
|
SetInfoTable( tEndId, 'Machining', sMach)
|
|
nNumMach = nNumMach + 1
|
|
end
|
|
else
|
|
if tMachining then
|
|
table.insert( tMachining,{nMachId,sToolName})
|
|
end
|
|
end
|
|
end
|
|
elseif nMach == 2 then
|
|
local nRes, nMachId, sToolName = MB.AddAndDelMachining( sLocName .. '_G' .. EgtNumToString(nNumGroup,0), sMachUp, tEndId, dOverL, sLocName,
|
|
bNotGenMachining, nil, nil, nil, nil,
|
|
nil, nil, 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
|
|
-- setto nota per non lavorarla di nuovo
|
|
SetInfoTable( tEndId, 'Mach', 12+ nOffsetDel)
|
|
if bCalMach then
|
|
SetInfoTable( tEndId, 'Machining', sMachUp)
|
|
nNumMach = nNumMach + 1
|
|
end
|
|
else
|
|
if tMachining then
|
|
table.insert( tMachining,{nMachId,sToolName})
|
|
end
|
|
end
|
|
end
|
|
elseif nMach == 3 then
|
|
local nRes, nMachId, sToolName = MB.AddAndDelMachining( sLocName .. '_G' .. EgtNumToString(nNumGroup,0), sMachDw, tEndId, dOverL, sLocName,
|
|
bNotGenMachining, nil, nil, nil, nil,
|
|
nil, nil, 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
|
|
-- setto nota per non lavorarla di nuovo
|
|
SetInfoTable( tEndId, 'Mach', 13+ nOffsetDel)
|
|
if bCalMach then
|
|
SetInfoTable( tEndId, 'Machining', sMachDw)
|
|
nNumMach = nNumMach + 1
|
|
end
|
|
else
|
|
if tMachining then
|
|
table.insert( tMachining,{nMachId,sToolName})
|
|
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)
|
|
|
|
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)
|
|
|
|
-- Applico le lavorazioni
|
|
for j = 1, #EntList do
|
|
|
|
local nMachCk = EgtGetInfo( EntList[j], 'MachCk', 'i') or 1
|
|
|
|
if tLocTable[i].Oper == 'AdjustHead' 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])
|
|
-- 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)
|
|
|
|
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)
|
|
|
|
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)
|
|
|
|
-- 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
|
|
|
|
-----------------------------------------------------------------
|
|
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)
|
|
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(2*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)
|
|
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(2*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)
|
|
|
|
-- macchina e tabella di default
|
|
local MachName = 'Cms-PF122R8RR'
|
|
|
|
-- Machinings Table
|
|
local MachiningsTable = 'MachStdTable'
|
|
local MachiningsTableOrd = 'MachStdTable_Ord'
|
|
|
|
-- References on table (respect Zero machine)
|
|
-- Y Table
|
|
local Ori1 = Point3d( -21.991, -57.090, -11.511) * GEO.ONE_INCH
|
|
-- V Table
|
|
local Ori3 = Point3d( -120.420, -57.130, -11.511) * GEO.ONE_INCH
|
|
-- Y Table for wide door
|
|
local Ori9 = Point3d( -21.991, -11.1703, -11.511) * GEO.ONE_INCH
|
|
-- V Table for wide door
|
|
local Ori10 = Point3d( -120.420, -11.1703, -11.511) * GEO.ONE_INCH
|
|
-- shift value
|
|
local vShift = Vector3d(0,0,0)
|
|
local vShiftAct = Vector3d(0,0,0)
|
|
local vNullShift = Vector3d(0,0,0)
|
|
-- tabella raccordi
|
|
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
|
|
|
|
-- resetto la macchinata (riporto il pezzo in area disegno)
|
|
EgtResetCurrMachGroup()
|
|
|
|
-- elimino percorsi eventualmente creati dal Mach
|
|
-- cancello i percorsi ghost e tutti i percorsi di sgrossatura
|
|
local DelList = MB.FindEntitiesWithPartName( tPz, '_HIDE')
|
|
-- ciclo su tutte le entità trovate
|
|
for j = 1, #DelList do
|
|
EgtErase( DelList[j] )
|
|
end
|
|
DelList = MB.FindEntitiesWithPartName( tPz, 'ROUGH_')
|
|
-- ciclo su tutte le entità trovate
|
|
for j = 1, #DelList do
|
|
EgtErase( DelList[j] )
|
|
end
|
|
|
|
-- 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 sCode = 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 nPart = EgtGetInfo( Pz, 'Part', 'i')
|
|
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 dRadiusPrf = tsRadiusProf[1]
|
|
local dPlanePrf = tsPlaneProf[1]
|
|
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 b3Part = EgtGetBBoxGlob( Pz, GDB_BB.EXACT)
|
|
|
|
-- Box solido: lo ottengo dalla somma delle varie superfici della porta
|
|
local b3fx = BBox3d() -- inizializzo il box nullo
|
|
b3fx = MakeBoxFromSolidLayer( Ls, 0, Aux)
|
|
local b3Solid = b3fx
|
|
-- local b3Solid = EgtGetBBoxGlob( Ls, GDB_BB.EXACT)
|
|
|
|
-- Project path, name, extension
|
|
local sFilePath = EgtGetCurrFilePath()
|
|
local sFileDir, sFileName, sFileExt = EgtSplitPath( sFilePath)
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- *** 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
|
|
|
|
local dUseOneTab
|
|
local AskCustomTable
|
|
local dDimPendularDoor
|
|
local dMaxDoorLength
|
|
local dMinDoorLength
|
|
local dMaxDoorWidth
|
|
local dMinDoorWidth
|
|
local dMaxDoorThick
|
|
local dMinDoorThick
|
|
local dWideDoorWidth
|
|
local sLocSecure
|
|
local dMaxOverMat
|
|
local dStepOverMat
|
|
local nTopSideDriveDisp
|
|
local dMaxDistToChain
|
|
local dExtraThruDepth
|
|
local nGenCncAsDdfName
|
|
local dBladePerpLeadIn
|
|
local dPercRedFeed
|
|
|
|
-- imposto i dati macchina secondo le informazioni del file cam
|
|
MachName = mCamData[nNumMachFromCam].MachName
|
|
Ori1 = mCamData[nNumMachFromCam].Ori1
|
|
Ori3 = mCamData[nNumMachFromCam].Ori3
|
|
Ori9 = mCamData[nNumMachFromCam].Ori9
|
|
Ori10 = mCamData[nNumMachFromCam].Ori10
|
|
vShiftAct = mCamData[nNumMachFromCam].Shift1
|
|
dUseOneTab = mCamData[nNumMachFromCam].LimitTable
|
|
AskCustomTable = mCamData[nNumMachFromCam].AskCustomTable
|
|
dDimPendularDoor = mCamData[nNumMachFromCam].DimPendularDoor
|
|
dMaxDoorLength = mCamData[nNumMachFromCam].MaxDoorLength
|
|
dMinDoorLength = mCamData[nNumMachFromCam].MinDoorLength
|
|
dMaxDoorWidth = mCamData[nNumMachFromCam].MaxDoorWidth
|
|
dMinDoorWidth = mCamData[nNumMachFromCam].MinDoorWidth
|
|
dMaxDoorThick = mCamData[nNumMachFromCam].MaxDoorThick
|
|
dMinDoorThick = mCamData[nNumMachFromCam].MinDoorThick
|
|
dWideDoorWidth = mCamData[nNumMachFromCam].WideDoorWidth
|
|
sLocSecure = mCamData[nNumMachFromCam].sLocSecure
|
|
dMaxOverMat = mCamData[nNumMachFromCam].MaxOverMat
|
|
dStepOverMat = mCamData[nNumMachFromCam].StepOverMat or 10
|
|
nTopSideDriveDisp = mCamData[nNumMachFromCam].TopSideDriveDisp
|
|
dMaxDistToChain = mCamData[nNumMachFromCam].MaxDistToChain
|
|
dExtraThruDepth = mCamData[nNumMachFromCam].ExtraThruDepthMachining
|
|
nGenCncAsDdfName = mCamData[nNumMachFromCam].nGenCncAsDdfName or 0
|
|
dBladePerpLeadIn = mCamData[nNumMachFromCam].BladePerpLeadIn or (3*25.4)
|
|
dPercRedFeed = mCamData[nNumMachFromCam].PercRedFeed or 0.3
|
|
|
|
-- se non devo generare il cn esco subito
|
|
if MachinesName[nNumMachFromTable].NcGenerate ~= nil and not MachinesName[nNumMachFromTable].NcGenerate then
|
|
DoorOutLog( string.format(EgtDoorsMsg[492], MachName), 0) -- warning. Cnc generation disable
|
|
return true
|
|
end
|
|
|
|
-- setto come generare il nome del file cnc (di default è uguale al nome del parametro sCode interno ad ddf)
|
|
if nGenCncAsDdfName == 0 then
|
|
-- assegno al nome file il nome del campo code, come faccio nel main quando creo più pezzi
|
|
sFileName = sCode
|
|
end
|
|
|
|
local MTable = TAB.MTable
|
|
local MTableOrd = TABORD.MTable
|
|
local sLocMachId
|
|
local bOk = true
|
|
local bFirstStep = true
|
|
local bShiftMchng = false
|
|
local bSmallShiftedDoor = false
|
|
local bWiderDoor = false
|
|
local sDispMode
|
|
local sNotePhase
|
|
local sTotDispMode = ''
|
|
local sNumGroup = ''
|
|
local bGenFirstStep = false
|
|
local nIndexStartMach = 1
|
|
local bWork = true
|
|
-- variabili utilizzate dentro al ciclo
|
|
local nMchId
|
|
local sTab
|
|
local tabOri
|
|
local Ori
|
|
local OriDw
|
|
local ColA
|
|
local nRaw
|
|
local bMoveRaw
|
|
local bPush
|
|
local bFlip
|
|
-- local bSpin = false
|
|
local bTopOnRight
|
|
-- variabili per disposizione sottopezzi
|
|
local OffsRef
|
|
local OffsVac
|
|
local X1r
|
|
local X2r
|
|
local X3r
|
|
local X1
|
|
local X2
|
|
local Y1r
|
|
local Y2r
|
|
local Y3r
|
|
local Y1
|
|
local Y2
|
|
local nRef1
|
|
local nRef2
|
|
local nRef3
|
|
local nFix1
|
|
local nFix2
|
|
local nFix3
|
|
local nFix4
|
|
local nFix5
|
|
local nFix6
|
|
local nFix7
|
|
local nFix8
|
|
local OffsXSovr = 0
|
|
local OffsYSovr = 0
|
|
-- variabile per tool setup
|
|
local bSetUp
|
|
local MSetup
|
|
local sSetup
|
|
local tListError
|
|
local sListTool
|
|
-- variabili calcolo box
|
|
local b3SolidPiece
|
|
local b3SolidPiece2
|
|
local b3SolidOnTab
|
|
local pMin
|
|
local pMax
|
|
local dOffsX = 0
|
|
local dOffsY = 0
|
|
-- variabili conteggio lavorazioni profilatura bevel e saltate
|
|
local nNumMachSkip = 0
|
|
local bLocMach
|
|
local sMachProf
|
|
local bWorkUnder = false
|
|
-- variabile per conteggio lavorazioni
|
|
local nNumMach
|
|
local nNumSkip
|
|
local tSecMachTab = {}
|
|
local tSecMachTabOrd = {}
|
|
-- 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
|
|
|
|
-- Set Current Machine: si setta sulla fase 1
|
|
EgtSetCurrMachine( MachName)
|
|
|
|
-- faccio tutte le fasi
|
|
while bWork do
|
|
|
|
sDispMode = ''
|
|
|
|
if bFirstStep and not bShiftMchng then
|
|
nNumGroup = nNumGroup + 1
|
|
-- Set Machining Group
|
|
if not sAssemb then -- se pezzo unico
|
|
nMchId = EgtAddMachGroup( 'Mach_' .. EgtNumToString(nNumGroup,0) .. '_' .. MachName)
|
|
else
|
|
nMchId = EgtAddMachGroup( 'Id_'.. EgtNumToString(Pz,0) ..'_'..'Mach_' .. EgtNumToString(nNumGroup,0) .. '_' .. MachName)
|
|
end
|
|
nNumPhase = EgtGetCurrPhase()
|
|
else
|
|
|
|
-- se nessuna lavorazione riutilizzo la vecchia fase
|
|
if nNumMach == 0 then
|
|
|
|
EgtRemoveRawPart( nRaw) -- elimino il grezzo
|
|
|
|
-- elimino la disposizione dei sottopezzi
|
|
local nNumFix = EgtGetFirstFixture()
|
|
while nNumFix do
|
|
EgtRemoveFixture( nNumFix)
|
|
nNumFix = EgtGetFirstFixture()
|
|
end
|
|
else
|
|
nNumPhase = EgtAddPhase() -- creo nuova fase
|
|
end
|
|
|
|
-- rendo corrente la fase
|
|
if nNumPhase then
|
|
EgtSetCurrPhase(nNumPhase)
|
|
end
|
|
|
|
-- se porta large wide cambio la nota a tutte le entità con la nota SkipByLowerPos
|
|
if bWiderDoor then
|
|
local tSkipByPosList = {}
|
|
tSkipByPosList = MB.FindGeomWithNote( Pz, 'SkipByLowerPos', 'i', 1, tSkipByPosList)
|
|
for i = 1, #tSkipByPosList do
|
|
local nMach = EgtGetInfo( tSkipByPosList[i], 'Mach', 'i') or 1
|
|
if nMach > 10 and nMach < 20 then
|
|
nMach = nMach - 10
|
|
EgtSetInfo( tSkipByPosList[i], 'Mach', nMach)
|
|
EgtRemoveInfo( tSkipByPosList[i], 'SkipByLowerPos')
|
|
EgtSetInfo( tSkipByPosList[i], 'AlreadyReduceMach', 1)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-----------------------------------------------------------------------
|
|
-- Calcolo dei sovramateriali e definizione e posizionamento del grezzo
|
|
-----------------------------------------------------------------------
|
|
|
|
if bFirstStep and not bShiftMchng then
|
|
|
|
-- 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
|
|
else -- fase successiva ribaltata o spostata
|
|
|
|
-- i profili con lavorazione disabilitata li posso mettere subito a zero
|
|
if ( not bLockMach and bAtRight) or ( not bHingeMach and not bAtRight) then -- lavorazione lato serratura disabilitata
|
|
dRightOffs = 0
|
|
end
|
|
|
|
if ( not bLockMach and not bAtRight) or ( not bHingeMach and bAtRight) then -- lavorazione lato serratura disabilitata
|
|
dLeftOffs = 0
|
|
end
|
|
|
|
if not bTopMach then -- lavorazione lato top disabilitata
|
|
dTopOffs = 0
|
|
end
|
|
|
|
if not bBottomMach then -- lavorazione lato top disabilitata
|
|
dBottomOffs = 0
|
|
end
|
|
|
|
-- azzero i sovramateriali dei profili che sono stati lavorati
|
|
if sMachProf and #sMachProf > 0 then
|
|
|
|
local sListProf = EgtSplitString( sMachProf, ',')
|
|
for m = 1, #sListProf do
|
|
if string.lower( sListProf[m]) == 'left' then
|
|
dLeftOffs = 0
|
|
elseif string.lower( sListProf[m]) == 'right' then
|
|
dRightOffs = 0
|
|
elseif string.lower( sListProf[m]) == 'top' then
|
|
dTopOffs = 0
|
|
elseif string.lower( sListProf[m]) == 'bottom' then
|
|
dBottomOffs = 0
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if bFirstStep then
|
|
b3SolidPiece = EgtGetBBoxGlob( Pz, GDB_BB.EXACT)
|
|
else
|
|
b3SolidPiece2 = EgtGetBBoxGlob( Pz, GDB_BB.EXACT)
|
|
end
|
|
|
|
if b3SolidPiece and b3SolidPiece2 then
|
|
dOffsX = b3SolidPiece2:getMin():getX() - b3SolidPiece:getMin():getX()
|
|
dOffsY = b3SolidPiece2:getMin():getY() - b3SolidPiece:getMin():getY()
|
|
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 + dOffsX, dBottomOffs + dOffsY, 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 evitae inutili ribaltamenti
|
|
|
|
-- ricavo minimo e massimo del solido del pezzo
|
|
b3SolidOnTab = EgtGetBBoxGlob( Ls, GDB_BB.EXACT)
|
|
pMin = b3SolidOnTab:getMin()
|
|
pMax = b3SolidOnTab:getMax()
|
|
|
|
local tLocMach = {}
|
|
local tLocMachOrd = {}
|
|
|
|
if bFirstStep then
|
|
tLocMach = MTable
|
|
tLocMachOrd = MTableOrd
|
|
if not bShiftMchng then
|
|
sMachProf = ''
|
|
nIndexStartMach = 1
|
|
end
|
|
else
|
|
tLocMach = tSecMachTab
|
|
tLocMachOrd = MTableOrd
|
|
if not bShiftMchng then
|
|
nIndexStartMach = 1
|
|
end
|
|
end
|
|
|
|
-- solo il primo giro, prendo nota dei profili tipo bevel
|
|
-- verifico se cave da sotto o da sopra
|
|
-- verifico se trovate lavorazioni applicate con 'shift'
|
|
if bFirstStep and not bShiftMchng then
|
|
|
|
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)
|
|
-- se flag non ancora settato e trovata geometria e l'associazione è shiftata o la porta è al di sotto del limite..
|
|
-- setto il flag di disposizione iniziale Traslata
|
|
if not bSmallShiftedDoor and #EntList > 0 and
|
|
( ( tLocMach[i].Shift and tLocMach[i].Shift > 0) or dWidthDoor <= DGC.Wl) then
|
|
bSmallShiftedDoor = true
|
|
end
|
|
-- 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
|
|
elseif nUnderGeom and nUnderGeom == -1 then
|
|
nNumGeomTop = nNumGeomTop + 1
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
elseif not bFirstStep and not bShiftMchng then -- se porta ribaltata
|
|
|
|
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
|
|
|
|
if sLocMachId == nNumMachFromTable then
|
|
|
|
-- Recupero le entità
|
|
local EntList = MB.FindEntitiesWithName( Pz, tLocMach[i].Name)
|
|
-- se flag non ancora settato e trovata geometria e l'associazione è shiftata e la porta è al di sotto del limite
|
|
-- setto il flag di disposizione iniziale Traslata
|
|
if not bSmallShiftedDoor and #EntList > 0 and
|
|
( ( tLocMach[i].Shift and tLocMach[i].Shift > 0) or dWidthDoor <= DGC.Wl) then
|
|
bSmallShiftedDoor = true
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- se porta da disporre subito traslata setto i flag
|
|
if bSmallShiftedDoor then
|
|
bShiftMchng = true -- porta traslata
|
|
bGenFirstStep = true -- flag per saltare il primo giro
|
|
end
|
|
-- se porta è più larga della dimensione limite
|
|
if bFirstStep and dWideDoorWidth and dWidthDoor > dWideDoorWidth then
|
|
bWiderDoor = true
|
|
if AskCustomTable and AskCustomTable == 1 then
|
|
local nNumTab = 9
|
|
repeat
|
|
local sNumTab = '9'
|
|
local tPos = EgtDialogBox( 'Origin on table for wide door', {'Origin 1/3 - 9/10', sNumTab})
|
|
|
|
if tPos and #tPos == 1 then
|
|
nNumTab = tonumber( tPos[1])
|
|
if nNumTab == 1 then
|
|
bWiderDoor = false
|
|
elseif nNumTab == 9 then
|
|
bWiderDoor = true
|
|
end
|
|
else
|
|
nNumTab = 0
|
|
end
|
|
until ( nNumTab == 1 or nNumTab == 9)
|
|
end
|
|
|
|
if bWiderDoor then
|
|
bSmallShiftedDoor = false
|
|
bShiftMchng = false
|
|
end
|
|
end
|
|
|
|
-----------------------
|
|
-- *** Disposizione ***
|
|
-----------------------
|
|
|
|
-- Scelta della tavola
|
|
if bFirstStep then
|
|
sTab = 'YTab'
|
|
if b3Solid:getDimY() > dUseOneTab then
|
|
sTab = 'YVTab'
|
|
-- altrimenti se lunghezza è idonea attivare il pendolare ed è selezionabile
|
|
elseif dDimPendularDoor and AskCustomTable and b3Solid:getDimY() <= dDimPendularDoor and AskCustomTable == 1 then
|
|
local nNumTab = 1
|
|
repeat
|
|
local sNumTab = '1'
|
|
local tPos = EgtDialogBox( 'Choose pendular table(1 for Y table, 2 For V table)', {'Table 2 - 1', sNumTab})
|
|
if tPos and #tPos == 1 then
|
|
nNumTab = tonumber( tPos[1])
|
|
if nNumTab == 1 then
|
|
sTab = 'YTab'
|
|
elseif nNumTab == 2 then
|
|
sTab = 'VTab'
|
|
end
|
|
else
|
|
nNumTab = 0
|
|
end
|
|
until ( nNumTab == 1 or nNumTab == 2)
|
|
end
|
|
end
|
|
EgtSetTable( sTab)
|
|
|
|
-- Origine tavola corrente rispetto a Zero macchina
|
|
tabOri = EgtGetTableRef( 1)
|
|
if bWiderDoor then
|
|
-- Scelta dell'origine (ora espressa rispetto Zero Tavola)
|
|
if sTab == 'VTab' then
|
|
Ori = Ori10 - tabOri
|
|
OriDw = Ori1 - tabOri
|
|
-- per Y tab o YV tab
|
|
else
|
|
Ori = Ori9 - tabOri
|
|
OriDw = Ori1 - tabOri
|
|
end
|
|
else
|
|
-- Scelta dell'origine (ora espressa rispetto Zero Tavola)
|
|
if sTab == 'VTab' then
|
|
Ori = Ori3 - tabOri
|
|
else
|
|
Ori = Ori1 - tabOri
|
|
end
|
|
end
|
|
|
|
-- se porta da traslare setto lo shift da applicare
|
|
if bShiftMchng then
|
|
vShift = vShiftAct
|
|
else
|
|
vShift = vNullShift
|
|
end
|
|
|
|
Ori = Ori + Vector3d( 0, 0, 80)
|
|
Ori = Ori + vShift
|
|
if OriDw then
|
|
OriDw = OriDw + Vector3d( 0, 0, 80)
|
|
OriDw = OriDw + vShift
|
|
end
|
|
|
|
-- 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
|
|
-- se non c'è il parametro considero la porta come se avesse bevel down
|
|
-- in caso nessuno dei due lati ha un profilo bevel, utilizzo il parametro Secure passato nel ddf
|
|
-- 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 == 'LHI' or sSwing == 'LHA' 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
|
|
|
|
if bFirstStep then
|
|
|
|
local bOkDisp = false
|
|
|
|
-- 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 ed è 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 base al parametro presente nel curcaminfo
|
|
if ( ( sHingeTrim == 'BD' or sHingeTrim == 'BDEB') and bPush) or
|
|
( ( sHingeTrim == 'BU' or sHingeTrim == 'BUEB') and not bPush) then
|
|
bFlip = true
|
|
bTopOnRight = CalcTopPosition( nTopSideDriveDisp, bAtRight)
|
|
-- 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 base al parametro presente nel curcaminfo
|
|
else
|
|
bFlip = false
|
|
bTopOnRight = CalcTopPosition( nTopSideDriveDisp, not bAtRight)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- se profilo serratura indicato bevel (e da lavorare)
|
|
-- if ( sLockTrim == 'BD' or sLockTrim == 'BU') and bLockMach and not bOkDisp then
|
|
if ( sLockTrim == 'BD' or sLockTrim == 'BU' or sLockTrim == 'BDEB' or sLockTrim == 'BUEB') and not bOkDisp then
|
|
|
|
-- verifico se i profili risultanti sono presenti in tabella
|
|
if sLockTrim == 'BD' and bPush and string.find( sProfiles, 'BU,') then
|
|
bOkDisp = true
|
|
elseif sLockTrim == 'BDEB' and bPush and string.find( sProfiles, 'BU,') then
|
|
bOkDisp = true
|
|
elseif sLockTrim == 'BD' and not bPush and string.find( sProfiles, 'BD,') then
|
|
bOkDisp = true
|
|
elseif sLockTrim == 'BDEB' and not bPush and string.find( sProfiles, 'BD,') then
|
|
bOkDisp = true
|
|
elseif sLockTrim == 'BU' and not bPush and string.find( sProfiles, 'BD,') then
|
|
bOkDisp = true
|
|
elseif sLockTrim == 'BUEB' and not bPush and string.find( sProfiles, 'BD,') then
|
|
bOkDisp = true
|
|
elseif sLockTrim == 'BU' and bPush and string.find( sProfiles, 'BU,') then
|
|
bOkDisp = true
|
|
elseif sLockTrim == '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 base al parametro presente nel curcaminfo
|
|
if ( ( sLockTrim == 'BD' or sLockTrim == 'BDEB') and bPush) or
|
|
( ( sLockTrim == 'BU' or sLockTrim == 'BUEB') and not bPush and not bOppoBevelProf) or
|
|
( ( sLockTrim == 'BU' or sLockTrim == 'BUEB') and bPush and bOppoBevelProf) then
|
|
bFlip = true
|
|
bTopOnRight = CalcTopPosition( nTopSideDriveDisp, bAtRight)
|
|
-- 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 base al parametro presente nel curcaminfo
|
|
else
|
|
bFlip = false
|
|
bTopOnRight = CalcTopPosition( nTopSideDriveDisp, not bAtRight)
|
|
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
|
|
bTopOnRight = CalcTopPosition( nTopSideDriveDisp, bAtRight)
|
|
-- 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 base al parametro presente nel curcaminfo
|
|
else
|
|
bFlip = false
|
|
bTopOnRight = CalcTopPosition( nTopSideDriveDisp, not bAtRight)
|
|
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
|
|
bTopOnRight = CalcTopPosition( nTopSideDriveDisp, bAtRight)
|
|
-- 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 base al parametro presente nel curcaminfo
|
|
else
|
|
bFlip = false
|
|
bTopOnRight = CalcTopPosition( nTopSideDriveDisp, not bAtRight)
|
|
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 atrimenti do errore
|
|
if sSecure and string.upper(sSecure) == '0' then
|
|
-- se parametro da CurrcamInfo non è valido do errore
|
|
if not sLocSecure or ( string.upper(sLocSecure) ~= 'UP' and string.upper(sLocSecure) ~= 'DN') then
|
|
bOk = false
|
|
DGD.EMC = ' ' .. EgtDoorsMsg[590]
|
|
break
|
|
else
|
|
sSecure = sLocSecure
|
|
end
|
|
end
|
|
|
|
-- se lato secure va sopra il ribaltamento è obbligato
|
|
if sSecure and string.upper(sSecure) == 'UP' then
|
|
bFlip = true
|
|
bTopOnRight = CalcTopPosition( nTopSideDriveDisp, bAtRight)
|
|
elseif sSecure and string.upper(sSecure) == 'DN' then
|
|
bFlip = false
|
|
bTopOnRight = CalcTopPosition( nTopSideDriveDisp, not bAtRight)
|
|
-- altrimenti la preferenza sembrerebbe essere ( non è ancora confermata) qualla 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
|
|
bTopOnRight = CalcTopPosition( nTopSideDriveDisp, bAtRight)
|
|
-- se porta a tirare non la ribalto perchè si presta già ad essere bevel down
|
|
else
|
|
bFlip = false
|
|
bTopOnRight = CalcTopPosition( nTopSideDriveDisp, not bAtRight)
|
|
end
|
|
-- in attesa delle considerazioni del cliente, in base alle geometrie trovate ribalto o meno la porta
|
|
else
|
|
|
|
if nNumGeomBottom > nNumGeomTop then
|
|
bFlip = true
|
|
bTopOnRight = CalcTopPosition( nTopSideDriveDisp, bAtRight)
|
|
elseif nNumGeomTop >= nNumGeomBottom then
|
|
bFlip = false
|
|
bTopOnRight = CalcTopPosition( nTopSideDriveDisp, not bAtRight)
|
|
else -- altrimenti vecchio metodo
|
|
bFlip = true
|
|
bTopOnRight = CalcTopPosition( nTopSideDriveDisp, bAtRight)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if bWiderDoor then
|
|
sDispMode = sDispMode .. EgtDoorsMsg[697]
|
|
end
|
|
|
|
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 bShiftMchng then
|
|
sDispMode = sDispMode .. EgtDoorsMsg[510]
|
|
end
|
|
-- sTotDispMode = sTotDispMode .. ' ' .. sDispMode .. '\n'
|
|
|
|
-- se porta è più larga dela parametro limite
|
|
if bWiderDoor then
|
|
-- Muovo porta con l'angolo in alto a destra nella posizione di origine
|
|
bMoveRaw = EgtMoveToCornerRawPart( nRaw, Ori, MCH_CR.TR)
|
|
else
|
|
-- Muovo porta con l'angolo in basso a destra nella posizione di origine
|
|
bMoveRaw = EgtMoveToCornerRawPart( nRaw, Ori, MCH_CR.BR)
|
|
end
|
|
|
|
-- memorizzo i flag per le fasi successive
|
|
bFlipFirst = bFlip
|
|
bTopOnRightFirst = bTopOnRight
|
|
|
|
else -- se sono in ribaltamento porta
|
|
|
|
-- posizioni opposte
|
|
bFlip = not bFlipFirst
|
|
if nTopSideDriveDisp and nTopSideDriveDisp == 1 then
|
|
bTopOnRight = true
|
|
elseif nTopSideDriveDisp and nTopSideDriveDisp == 2 then
|
|
bTopOnRight = false
|
|
else
|
|
bTopOnRight = not bTopOnRightFirst
|
|
end
|
|
|
|
-- faccio le rotazioni della porta e setto per non ribaltarla
|
|
if bWiderDoor then
|
|
EgtRotateRawPart( nRaw, Z_AX(), 180)
|
|
sDispMode = sDispMode .. EgtDoorsMsg[696]
|
|
bFlip = bFlipFirst
|
|
bTopOnRight = bTopOnRightFirst
|
|
end
|
|
|
|
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[EgtIf( bWiderDoor, 482, 481)]
|
|
else
|
|
EgtRotateRawPart( nRaw, Z_AX(), 90)
|
|
sDispMode = sDispMode .. EgtDoorsMsg[EgtIf( bWiderDoor, 481, 482)]
|
|
end
|
|
|
|
if bShiftMchng then
|
|
sDispMode = sDispMode .. EgtDoorsMsg[510]
|
|
end
|
|
-- sTotDispMode = sTotDispMode .. ' ' .. sDispMode .. '\n'
|
|
|
|
-- se porta larga
|
|
if bWiderDoor then
|
|
-- Muovo porta con l'angolo in alto a destra nella posizione di origine
|
|
local dXShift
|
|
if bTopOnRight then
|
|
dXShift = dBottomOffs
|
|
else
|
|
dXShift = dTopOffs
|
|
end
|
|
bMoveRaw = EgtMoveToCornerRawPart( nRaw, Ori+Vector3d( dXShift,0,0), MCH_CR.TR)
|
|
else
|
|
-- Muovo porta con l'angolo in basso a destra nella posizione di origine
|
|
bMoveRaw = EgtMoveToCornerRawPart( nRaw, Ori, MCH_CR.BR)
|
|
end
|
|
end
|
|
|
|
if not bMoveRaw then
|
|
bOk = false
|
|
DGD.EMC = ' ' .. EgtDoorsMsg[528]..EgtDoorsMsg[474] -- Error positioning raw part on table
|
|
break
|
|
end
|
|
|
|
if bFirstStep then
|
|
if bShiftMchng then
|
|
sNotePhase = 'SHIFT'
|
|
else
|
|
sNotePhase = 'NORMAL'
|
|
end
|
|
else
|
|
if bShiftMchng then
|
|
sNotePhase = 'FLIPSHIFT'
|
|
else
|
|
if bWiderDoor then
|
|
sNotePhase = 'NORMAL'
|
|
else
|
|
sNotePhase = 'FLIP'
|
|
end
|
|
end
|
|
end
|
|
|
|
-- salvo una nota con le info della disposizione traslata
|
|
EgtSetInfo( Pz, 'DoorOnTable' .. '_' .. tostring(nNumPhase) .. '_' .. MachName, sDispMode)
|
|
EgtSetInfo( Pz, 'KindPhase' .. '_' .. tostring(nNumPhase) .. '_' .. MachName, sNotePhase)
|
|
EgtSetInfo( Pz, 'WideDoor', bWiderDoor)
|
|
|
|
if bFlip then -- se porta capovolta
|
|
if bWiderDoor then
|
|
if bFirstStep then
|
|
if bTopOnRight then -- se top a destra (effettivo)
|
|
-- il lato destro riferito in alto è quello delle lock (effettivo)
|
|
OffsYSovr = dRightOffs
|
|
-- il lato top si trova a destra (effettivo)
|
|
OffsXSovr = dTopOffs
|
|
else -- se top a sinistra (effettivo)
|
|
-- il lato sinistro riferito in alto è quello delle lock (effettivo)
|
|
OffsYSovr = dLeftOffs
|
|
-- il lato bottom si trova a destra (effettivo)
|
|
OffsXSovr = dBottomOffs
|
|
end
|
|
else
|
|
if bTopOnRight then -- se top a destra (nominale)
|
|
-- il lato sinistro in alto è quello delle hinges (effettivo)
|
|
OffsYSovr = dLeftOffs
|
|
-- il lato bottom si trova a destra (effettivo)
|
|
OffsXSovr = dBottomOffs
|
|
else -- se top a sinistra (nominale)
|
|
-- il lato destro riferito in alto è quello delle hinges (effettivo)
|
|
OffsYSovr = dRightOffs
|
|
-- il lato top si trova a destra (effettivo)
|
|
OffsXSovr = dTopOffs
|
|
end
|
|
end
|
|
else
|
|
if bTopOnRight then -- se top a destra (effettivo)
|
|
-- il lato sinistro riferito in basso è quello delle hinges (effettivo)
|
|
OffsYSovr = dLeftOffs
|
|
-- il lato top si trova a destra (effettivo)
|
|
OffsXSovr = dTopOffs
|
|
else -- se top a sinistra (effettivo)
|
|
-- il lato destro riferito in basso è quello delle hinges (effettivo)
|
|
OffsYSovr = dRightOffs
|
|
-- il lato bottom si trova a destra (effettivo)
|
|
OffsXSovr = dBottomOffs
|
|
end
|
|
end
|
|
else -- altrimenti non è capovolta
|
|
-- se porta larga
|
|
if bWiderDoor then
|
|
if bFirstStep then
|
|
if bTopOnRight then -- se top a destra (effettivo)
|
|
-- il lato sinistro riferito in alto è quello delle lock (effettivo)
|
|
OffsYSovr = dLeftOffs
|
|
-- il lato top si trova a destra (effettivo)
|
|
OffsXSovr = dTopOffs
|
|
else -- se top a sinistra (effettivo)
|
|
-- il lato destro riferito in alto è quello delle lock (effettivo)
|
|
OffsYSovr = dRightOffs
|
|
-- il lato bottom si trova a destra (effettivo)
|
|
OffsXSovr = dBottomOffs
|
|
end
|
|
else
|
|
if bTopOnRight then -- se top a destra (nominale)
|
|
-- il lato destro riferito in alto è quello delle hinges (effettivo)
|
|
OffsYSovr = dRightOffs
|
|
-- il lato bottom si trova a destra (effettivo)
|
|
OffsXSovr = dBottomOffs
|
|
else -- se top a sinistra (nominale)
|
|
-- il lato sinistro in alto è quello delle hinges (effettivo)
|
|
OffsYSovr = dLeftOffs
|
|
-- il lato top si trova a destra (effettivo)
|
|
OffsXSovr = dTopOffs
|
|
end
|
|
end
|
|
else
|
|
if bTopOnRight then -- se top a destra (effettivo)
|
|
-- il lato destro riferito in basso è quello delle hinges (effettivo)
|
|
OffsYSovr = dRightOffs
|
|
-- il lato top si trova a destra (effettivo)
|
|
OffsXSovr = dTopOffs
|
|
else -- se top a sinistra
|
|
-- il lato sinistro riferito in basso è quello delle hinges (effettivo)
|
|
OffsYSovr = dLeftOffs
|
|
-- il lato bottom si trova a destra (effettivo)
|
|
OffsXSovr = dBottomOffs
|
|
end
|
|
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(), dMinDoorLength, dMaxDoorLength, dMinDoorWidth,
|
|
dMaxDoorWidth, dMinDoorThick, dMaxDoorThick)
|
|
|
|
if bFailDim then
|
|
|
|
DGD.ERR = 19
|
|
-- 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
|
|
|
|
-- Inserimento riferimenti e ventose
|
|
local dPosxRef = b3Solid:getDimY()
|
|
if dPosxRef <= dUseOneTab and dPosxRef > 2305.05 then
|
|
dPosxRef = 2305.05
|
|
end
|
|
OffsRef = 70
|
|
OffsVac = 40
|
|
X1r = Ori:getX() + OffsRef
|
|
X2r = Ori:getX() - 150
|
|
X3r = Ori:getX() - dPosxRef + 150
|
|
X1 = Ori:getX() - dPosxRef + 25 + OffsVac - OffsXSovr
|
|
X2 = Ori:getX() - 25 - OffsVac - OffsXSovr
|
|
local dAngRef
|
|
if bWiderDoor then
|
|
Y1r = Ori:getY() - ( Ori9:getY() - Ori1:getY()) + 100
|
|
Y2r = Ori:getY() + OffsRef + abs( vShift:getY())
|
|
Y3r = Ori:getY() + OffsRef + abs( vShift:getY())
|
|
Y1 = Ori:getY() - b3Solid:getDimX() + 25 + OffsVac - OffsYSovr
|
|
if Y1 < (OriDw:getY() + 25 + OffsVac) then
|
|
Y1 = OriDw:getY() + 25 + OffsVac
|
|
end
|
|
Y2 = Ori:getY() - 25 - OffsVac - OffsYSovr
|
|
dAngRef = 180
|
|
else
|
|
Y1r = Ori:getY() + 100
|
|
Y2r = Ori:getY() - OffsRef - abs( vShift:getY())
|
|
Y3r = Ori:getY() - OffsRef - abs( vShift:getY())
|
|
Y1 = Ori:getY() + 25 + OffsVac + OffsYSovr
|
|
Y2 = Ori:getY() + b3Solid:getDimX() - 25 - OffsVac + OffsYSovr
|
|
dAngRef = 0
|
|
end
|
|
nRef1 = EgtAddFixture( 'RefD140SH', Point3d( MB.AdjustXFixture( X1r), Y1r, 0), 90)
|
|
nRef2 = EgtAddFixture( 'RefD140SH', Point3d( MB.AdjustXFixture( X2r), Y2r, 0), dAngRef)
|
|
nRef3 = EgtAddFixture( 'RefD140SH', Point3d( MB.AdjustXFixture( X3r), Y3r, 0), dAngRef)
|
|
nFix1 = EgtAddFixture( 'Sub80X40H80', Point3d( MB.AdjustXFixture( X1), Y1, 0))
|
|
nFix2 = EgtAddFixture( 'Sub80X40H80', Point3d( MB.AdjustXFixture( X1), Y2, 0), 180)
|
|
nFix3 = EgtAddFixture( 'Sub80X40H80', Point3d( MB.AdjustXFixture( 0.66*X1+0.34*X2), Y1, 0))
|
|
nFix4 = EgtAddFixture( 'Sub80X40H80', Point3d( MB.AdjustXFixture( 0.66*X1+0.34*X2), Y2, 0), 180)
|
|
nFix5 = EgtAddFixture( 'Sub80X40H80', Point3d( MB.AdjustXFixture( 0.34*X1+0.66*X2), Y1, 0))
|
|
nFix6 = EgtAddFixture( 'Sub80X40H80', Point3d( MB.AdjustXFixture( 0.34*X1+0.66*X2), Y2, 0), 180)
|
|
nFix7 = EgtAddFixture( 'Sub80X40H80', Point3d( MB.AdjustXFixture( X2), Y1, 0))
|
|
nFix8 = EgtAddFixture( 'Sub80X40H80', Point3d( MB.AdjustXFixture( X2), Y2, 0), 180)
|
|
|
|
-- *** Lavorazioni ***
|
|
local bMakeGhost = EgtIf( bFirstStep, true, false)
|
|
-- ricavo minimo e massimo del solido del pezzo
|
|
b3SolidOnTab = EgtGetBBoxGlob( Ls, GDB_BB.EXACT)
|
|
pMin = b3SolidOnTab:getMin()
|
|
pMax = b3SolidOnTab:getMax()
|
|
|
|
-- print Machining table
|
|
for i = nIndexStartMach, #tLocMach do
|
|
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)
|
|
end
|
|
|
|
-- solo il primo giro aggiusto i profili bevel per essere coerente con la sequenza di tabella
|
|
if bFirstStep and ( not bShiftMchng or bSmallShiftedDoor) then
|
|
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
|
|
-- OPERAZIONI
|
|
if tLocMach[i].Oper and tLocMach[i].Oper == 'AdjustBevel' then
|
|
local sNewName
|
|
_, sNewName = MB.AdjustBevel( EntList[j], tLocMach[i].Name, bFirstStep)
|
|
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 sottp
|
|
if bFlip then
|
|
local nValAppo = nNumGeomBottom
|
|
nNumGeomBottom = nNumGeomTop
|
|
nNumGeomTop = nValAppo
|
|
end
|
|
local bEnBreak = false
|
|
|
|
-- 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 = nIndexStartMach, #tLocMach do
|
|
|
|
-- se devo uscire dal ciclo
|
|
if bEnBreak then break end
|
|
|
|
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 sHide = EgtIf( bFirstStep, '','_HIDE')
|
|
local EntList = MB.FindEntitiesWithName( Pz, tLocMach[i].Name..sHide)
|
|
-- Applico le lavorazioni
|
|
for j = 1, #EntList do
|
|
|
|
local nNewIdEnt
|
|
local nNewIdEnt2
|
|
local nLocMach
|
|
|
|
-- OPERAZIONI
|
|
if tLocMach[i].Oper then
|
|
|
|
if tLocMach[i].Oper == 'AdjustBevel' then
|
|
|
|
local sNewName
|
|
-- ottengo il nome del lato lavorato
|
|
local sEdge = EgtGetName( EgtGetParent( EntList[j]))
|
|
bLocMach, sNewName, nNewIdEnt, nNewIdEnt2 = MB.AdjustBevel( EntList[j], tLocMach[i].Name, bFirstStep, nil, bMakeGhost, bWiderDoor, sEdge, true)
|
|
|
|
if bLocMach then
|
|
|
|
local bInsLav = false
|
|
-- faccio il test per vedere se la lavorazione è applicabile
|
|
local nMach = EgtGetInfo( nNewIdEnt, 'Mach', 'i') or 1
|
|
nLocMach = nMach
|
|
|
|
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 e non scatena lo shift
|
|
-- if bInsLav and ( bShiftMchng or not tLocMach[i].Shift or tLocMach[i].Shift == 0) then
|
|
-- se la lavorazione è applicabile
|
|
if bInsLav then
|
|
if sEdge then
|
|
-- se porta large wide e prima fase inserisco l'eventuale profilo di lavorazione del solo lato lock
|
|
if bWiderDoor and bFirstStep then
|
|
if ( string.lower( sEdge) == 'left' and not bAtRight) or ( string.lower( sEdge) == 'right' and bAtRight) then
|
|
if #sMachProf > 0 then
|
|
sMachProf = sMachProf .. ',' .. sEdge
|
|
else
|
|
sMachProf = sEdge
|
|
end
|
|
end
|
|
else
|
|
if #sMachProf > 0 then
|
|
sMachProf = sMachProf .. ',' .. sEdge
|
|
else
|
|
sMachProf = sEdge
|
|
end
|
|
end
|
|
|
|
-- if bFirstStep then
|
|
-- 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' 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, dMaxOverMat, dStepOverMat, nNewIdEnt, false, bFlip, nil, dOffsLoc)
|
|
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' 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, dMaxOverMat, dStepOverMat, nNewIdEnt, false, bFlip, nil, dOffsLoc)
|
|
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, dMaxOverMat, dStepOverMat, nNewIdEnt, true, bFlip, nil, dOffsLoc)
|
|
if nNewIdEnt2 then
|
|
MB.MakeRoughPaths( dTopOffs, dMaxOverMat, dStepOverMat, nNewIdEnt2, true, bFlip, nil, dOffsLoc)
|
|
end
|
|
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, dMaxOverMat, dStepOverMat, nNewIdEnt, true, bFlip, nil, dOffsLoc)
|
|
if nNewIdEnt2 then
|
|
MB.MakeRoughPaths( dBottomOffs, dMaxOverMat, dStepOverMat, nNewIdEnt2, true, bFlip, nil, dOffsLoc)
|
|
end
|
|
end
|
|
-- 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
|
|
bOk, nNewIdEnt = MB.AdjustThrouCurve( EntList[j], bMakeGhost, true)
|
|
elseif tLocMach[i].Oper == 'AdjustThrouCurve' then
|
|
-- ottengo il nome del lato lavorato
|
|
local sEdge = EgtGetName( EgtGetParent( EntList[j]))
|
|
bLocMach, nNewIdEnt, nNewIdEnt2 = MB.AdjustThrouCurve( EntList[j], bMakeGhost, nil, bWiderDoor, sEdge, true, bFirstStep)
|
|
if bLocMach then
|
|
|
|
local bInsLav = false
|
|
-- faccio un test per vedere che la lavorazione è applicabile
|
|
local nMach = EgtGetInfo( nNewIdEnt, 'Mach', 'i') or 1
|
|
nLocMach = nMach
|
|
|
|
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 e non scatena lo shift
|
|
-- if bInsLav and ( bShiftMchng or not tLocMach[i].Shift or tLocMach[i].Shift == 0) then
|
|
-- se la lavorazione è applicabile
|
|
if bInsLav then
|
|
if sEdge then
|
|
-- se porta large wide e prima fase inserisco l'eventuale profilo di lavorazione del solo lato lock
|
|
if bWiderDoor and bFirstStep then
|
|
if ( string.lower( sEdge) == 'left' and not bAtRight) or ( string.lower( sEdge) == 'right' and bAtRight) then
|
|
if #sMachProf > 0 then
|
|
sMachProf = sMachProf .. ',' .. sEdge
|
|
else
|
|
sMachProf = sEdge
|
|
end
|
|
end
|
|
else
|
|
if #sMachProf > 0 then
|
|
sMachProf = sMachProf .. ',' .. sEdge
|
|
else
|
|
sMachProf = sEdge
|
|
end
|
|
end
|
|
|
|
-- if bFirstStep then
|
|
-- 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' 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, dMaxOverMat, dStepOverMat, nNewIdEnt, false, bFlip, nil, dOffsLoc)
|
|
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' 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, dMaxOverMat, dStepOverMat, nNewIdEnt, false, bFlip, nil, dOffsLoc)
|
|
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, dMaxOverMat, dStepOverMat, nNewIdEnt, true, bFlip, nil, dOffsLoc)
|
|
if nNewIdEnt2 then
|
|
MB.MakeRoughPaths( dTopOffs, dMaxOverMat, dStepOverMat, nNewIdEnt2, true, bFlip, nil, dOffsLoc)
|
|
end
|
|
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, dMaxOverMat, dStepOverMat, nNewIdEnt, true, bFlip, nil, dOffsLoc)
|
|
if nNewIdEnt2 then
|
|
MB.MakeRoughPaths( dBottomOffs, dMaxOverMat, dStepOverMat, nNewIdEnt2, true, bFlip, nil, dOffsLoc)
|
|
end
|
|
end
|
|
-- end
|
|
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, dExtraThruDepth)
|
|
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)
|
|
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
|
|
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
|
|
|
|
-- se la lavorazione non è applicabile e non scatena lo shift
|
|
-- if not bInsLav and ( bShiftMchng or not tLocMach[i].Shift or tLocMach[i].Shift == 0) then
|
|
-- se la lavorazione non è applicabile
|
|
if not bInsLav then
|
|
if bFirstStep then
|
|
-- inserisco in tabella solo se non già presente
|
|
tSecMachTab = AddMachIntable( tLocMach[i], tSecMachTab, i)
|
|
if nMach == 1 then
|
|
EgtSetInfo( nNewIdEnt, 'JoinMach', { nMach ,tLocMach[i].Mach})
|
|
elseif nMach == 2 then
|
|
EgtSetInfo( nNewIdEnt, 'JoinMach', { nMach ,tLocMach[i].MachUp})
|
|
elseif nMach == 3 then
|
|
EgtSetInfo( nNewIdEnt, 'JoinMach', { nMach ,tLocMach[i].MachDw})
|
|
end
|
|
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)
|
|
-- incremento il numero di lavorazioni da sotto
|
|
nNumGeomBottom = nNumGeomBottom + 1
|
|
end
|
|
end
|
|
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], 0, NO_WORK_UNDERSQUARE, bMakeGhost )
|
|
if not bLocMach then
|
|
bOk = false
|
|
end
|
|
elseif tLocMach[i].Oper == 'AdjustVertHole' then
|
|
bLocMach, nNumMachSkipResult, nNewIdEnt = MB.AdjustVertHole( EntList[j], b3Solid:getDimZ(), pMin, pMax, nNumMachSkip, bFirstStep, bWorkUnder, bMakeGhost, dExtraThruDepth)
|
|
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
|
|
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
|
|
|
|
-- se la lavorazione non è applicabile e non scatena lo shift
|
|
-- if not bInsLav and ( bShiftMchng or not tLocMach[i].Shift or tLocMach[i].Shift == 0) then
|
|
-- se la lavorazione non è applicabile
|
|
if not bInsLav then
|
|
if bFirstStep then
|
|
-- inserisco in tabella solo se non già presente
|
|
tSecMachTab = AddMachIntable( tLocMach[i], tSecMachTab, i)
|
|
if nMach == 1 then
|
|
EgtSetInfo( nNewIdEnt, 'JoinMach', { nMach ,tLocMach[i].Mach})
|
|
elseif nMach == 2 then
|
|
EgtSetInfo( nNewIdEnt, 'JoinMach', { nMach ,tLocMach[i].MachUp})
|
|
elseif nMach == 3 then
|
|
EgtSetInfo( nNewIdEnt, 'JoinMach', { nMach ,tLocMach[i].MachDw})
|
|
end
|
|
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)
|
|
-- incremento il numero di lavorazioni da sotto
|
|
nNumGeomBottom = nNumGeomBottom + 1
|
|
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 == 'AdjustBladeVertCurve' then
|
|
bOk, nNewIdEnt = MB.AdjustBladeVertCurve( EntList[j], bMakeGhost)
|
|
end
|
|
else -- se nessuna operazione
|
|
if bMakeGhost then
|
|
nNewIdEnt = MB.MakeGhostCopy( EntList[j])
|
|
else
|
|
nNewIdEnt = EntList[j]
|
|
end
|
|
end
|
|
|
|
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
|
|
|
|
-- se porta large width e la geoemtria è lavorabile, verifico se è in posizione lavorabile
|
|
if bWiderDoor and nMach >= 1 and nMach <= 3 then
|
|
-- considero solo entità con il nome che contiene '_HIDE'
|
|
local sNameEnt = EgtGetName( nNewIdEnt)
|
|
if sNameEnt and string.find( sNameEnt, '_HIDE') then
|
|
local b3f1 = EgtGetBBoxGlob( nNewIdEnt, GDB_BB.EXACT)
|
|
local dYmin = b3f1:getMin():getY()
|
|
-- se il punto minimo è più in basso esco dalla funzione
|
|
if dYmin < ( pMax:getY() - dWideDoorWidth) then
|
|
nNumMachSkip = nNumMachSkip + 1
|
|
nMach = nMach + 10
|
|
EgtSetInfo( nNewIdEnt, 'Mach', nMach)
|
|
EgtSetInfo( nNewIdEnt, 'SkipByLowerPos', 1)
|
|
-- inserisco in tabella solo se non già presente
|
|
tSecMachTab = AddMachIntable( tLocMach[i], tSecMachTab, i)
|
|
end
|
|
end
|
|
if nNewIdEnt2 then
|
|
sNameEnt = EgtGetName( nNewIdEnt2)
|
|
local nMach2 = nMach
|
|
if sNameEnt and string.find( sNameEnt, '_HIDE') then
|
|
local b3f1 = EgtGetBBoxGlob( nNewIdEnt2, GDB_BB.EXACT)
|
|
local dYmin = b3f1:getMin():getY()
|
|
-- se il punto minimo è più in basso esco dalla funzione
|
|
if dYmin < ( pMax:getY() - dWideDoorWidth) then
|
|
nNumMachSkip = nNumMachSkip + 1
|
|
if nMach2 >= 1 and nMach2 <= 3 then
|
|
nMach2 = nMach2 + 10
|
|
end
|
|
EgtSetInfo( nNewIdEnt2, 'Mach', nMach2)
|
|
EgtSetInfo( nNewIdEnt2, 'SkipByLowerPos', 1)
|
|
-- inserisco in tabella solo se non già presente
|
|
tSecMachTab = AddMachIntable( tLocMach[i], tSecMachTab, i)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local bScroll = true
|
|
|
|
-- LAVORAZIONI
|
|
|
|
-- se prima lavorazione, valida, con chiave Shift abilitata, esco dal giro
|
|
--[[
|
|
if ( nMach > 0 and nMach < 4) and
|
|
not bShiftMchng and
|
|
tLocMach[i].Shift == 1 then
|
|
|
|
bShiftMchng = true -- flag per traslazione Y
|
|
-- nIndexStartMach = i -- ripartenza da questa posizione
|
|
nIndexStartMach = 1 -- ripartenza dall'inizio
|
|
nNumMach = 0 -- azzero le lavorazioni in modo da ricreare la disposizione traslata
|
|
bScroll = false -- salto l'applicazione delle lavorazioni in seguito
|
|
bEnBreak = true -- blocco il for della scansione tabella
|
|
|
|
-- cancello tutti i percorsi ghost
|
|
local DelList = MB.FindEntitiesWithPartName( Pz, '_HIDE')
|
|
-- ciclo su tutte le entità trovate
|
|
for j = 1, #DelList do
|
|
EgtErase( DelList[j] )
|
|
end
|
|
DelList = nil
|
|
|
|
-- se fase di ripresa rimetto la nota mach disabilitata
|
|
if not bFirstStep then
|
|
nMach = nMach + 10
|
|
EgtSetInfo( EntList[j], 'Mach', nMach)
|
|
nNumMachSkip = nNumMachSkip + 1
|
|
end
|
|
end
|
|
--]]
|
|
if not bScroll then
|
|
break -- esco dal ciclo for j
|
|
else
|
|
if 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)
|
|
|
|
local bCalMach = true
|
|
-- se non primo passo e nota JoinMach differisce dal mach e dalla lavorazione
|
|
if not bFirstStep then
|
|
|
|
local sJoinMach = EgtGetInfo( nNewIdEnt, 'JoinMach')
|
|
|
|
if sJoinMach and #sJoinMach > 1 then
|
|
local tJoinMach = EgtSplitString( sJoinMach)
|
|
|
|
if tJoinMach and #tJoinMach == 2 then
|
|
local nNumMachRef = tonumber( tJoinMach[1])
|
|
local sMachRefJoin = tJoinMach[2]
|
|
if nNumMachRef ~= nMach then
|
|
bCalMach = false
|
|
elseif nNumMachRef == 1 and sMachRefJoin and tLocMach[i].Mach and tLocMach[i].Mach ~= sMachRefJoin then
|
|
bCalMach = false
|
|
elseif nNumMachRef == 2 and sMachRefJoin and tLocMach[i].MachUp and tLocMach[i].MachUp ~= sMachRefJoin then
|
|
bCalMach = false
|
|
elseif nNumMachRef == 3 and sMachRefJoin and tLocMach[i].MachDw and tLocMach[i].MachDw ~= sMachRefJoin then
|
|
bCalMach = false
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
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, dBladePerpLeadIn, dPercRedFeed, bCalMach)
|
|
else
|
|
local sLocMachName
|
|
if not nLocMach or nLocMach == 1 then
|
|
sLocMachName = tLocMach[i].Mach
|
|
elseif nLocMach == 2 then
|
|
sLocMachName = tLocMach[i].MachUp
|
|
elseif nLocMach == 3 then
|
|
sLocMachName = tLocMach[i].MachDw
|
|
elseif nLocMach == 21 then -- caso particolare quando falliscono sia la lavorazione top che bottom
|
|
sLocMachName = tLocMach[i].Mach
|
|
if tLocMach[i].MachUp then
|
|
sLocMachName = sLocMachName .. ' + ' .. tLocMach[i].MachUp
|
|
end
|
|
end
|
|
DoorOutLog( EgtDoorsMsg[497]..tostring( EntList[j])..' '..tLocMach[i].Name.. EgtDoorsMsg[595].. EgtIf( sLocMachName, sLocMachName, '') ..
|
|
EgtDoorsMsg[596]..tostring( nNumPhase), 0)
|
|
nNumSkip = nNumSkip + 1
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end -- end for
|
|
|
|
local i = 1
|
|
while i <= #tLocMachOrd and not bEnBreak 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..'_HIDE')
|
|
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 è fuori range o non corrispondono le lavorazioni
|
|
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, dMaxDistToChain)
|
|
|
|
-- 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, dBladePerpLeadIn, dPercRedFeed)
|
|
|
|
-- 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
|
|
|
|
-- 11/01/2019 commento la cancellazione della nota per evitare di lavorare una seconda volta una geometria già lavorata
|
|
-- 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 = {}
|
|
|
|
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})
|
|
MB.InsZedByTool( TabZMach, tMachining, k)
|
|
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 == 'Layer' then -- lavorazione layer
|
|
|
|
-- ottengo tutte le entità del gruppo
|
|
local EntListGrp = MB.LoadEntitiesFromGroup( tGroup, Pz, '_HIDE')
|
|
|
|
-- 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, '_HIDE', dMaxDistToChain, EndLastMach,
|
|
dBladePerpLeadIn, dPercRedFeed)
|
|
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..'_HIDE')
|
|
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, dMaxDistToChain)
|
|
|
|
-- 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, dBladePerpLeadIn, dPercRedFeed)
|
|
|
|
-- 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
|
|
|
|
-- 11/01/2019 commento la cancellazione della nota per evitare di lavorare una seconda volta una geometria già lavorata
|
|
-- 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
|
|
|
|
-- se ci sono state lavorazioni accodo la disposizione delle fase
|
|
if nNumMach > 0 then
|
|
sTotDispMode = sTotDispMode .. ' ' .. sDispMode .. '\n'
|
|
else -- altrimenti nessuna lavorazione
|
|
|
|
if not bFirstStep then -- se non è il primo giro elimino la fase vuota
|
|
|
|
-- se ho più di una fase elimino l'ultima fase
|
|
if nNumPhase > 1 then
|
|
EgtRemoveLastPhase()
|
|
end
|
|
|
|
-- setto corrente fase precedente
|
|
if nPrevPhase then
|
|
EgtSetCurrPhase(nPrevPhase)
|
|
nNumPhase = nPrevPhase
|
|
end
|
|
end
|
|
end
|
|
|
|
-- se sono al primissimo giro
|
|
if not bGenFirstStep then
|
|
|
|
-- la lavorazione di traslazione ho rotazione (porta larga) hanno priorità sul ribaltamento
|
|
-- se trovata traslazione setto il flag per il prossimo giro
|
|
if bShiftMchng then
|
|
bGenFirstStep = true
|
|
if not bFirstStep then -- se sono già in ripresa porta resetto il contatore di lavorazioni saltate
|
|
nNumMachSkip = 0 -- resetto per il prossimo giro
|
|
end
|
|
else
|
|
-- 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
|
|
-- con lavorazioni skippate ma già con pezzo non in prima fase e non shiftato, esco
|
|
if not bFirstStep then
|
|
bWork = false
|
|
else
|
|
bFirstStep = false
|
|
end
|
|
nNumMachSkip = 0 -- resetto per il prossimo giro
|
|
end
|
|
end
|
|
else -- altrimenti ho già fatto un giro e ho trovato la traslazione
|
|
-- se nessuna geometria skippata esco
|
|
if 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
|
|
if bFirstStep then -- se ho terminato il giro con eventuale traslazione o rotazione disabilito la traslazione
|
|
-- disativo la traslazione sul giro successvo
|
|
bShiftMchng = false
|
|
-- disattivo il flag che indica di disporre la porta subito traslata
|
|
bSmallShiftedDoor = false
|
|
-- disattivo il flag che indica la porta larga
|
|
bWiderDoor = false
|
|
end
|
|
bFirstStep = false
|
|
end
|
|
end
|
|
|
|
-- se porta larga inibisco il ribaltamento
|
|
-- if bWiderDoor then bWork = false end
|
|
|
|
-- controllo di sicurezza
|
|
if nNumCycle > 4 then bWork = false end
|
|
|
|
nNumCycle = nNumCycle + 1
|
|
end -- end while
|
|
|
|
--------------------------
|
|
--------------------------
|
|
-- *** Tools Setup ***
|
|
--------------------------
|
|
--------------------------
|
|
-- provo a importare l'attrezzaggio di default, se fallisce passo gli altri
|
|
bSetUp = EgtImportSetup()
|
|
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
|
|
else
|
|
sListTool = sListTool .. '\n ' .. string.format( EgtDoorsMsg[554], ' ') .. ' (from Default)'
|
|
end
|
|
|
|
-- se fallito quello di default o utensili mancanti provo quelli indicati 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, 50 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
|
|
elseif k == 9 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup9
|
|
elseif k == 10 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup10
|
|
elseif k == 11 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup11
|
|
elseif k == 12 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup12
|
|
elseif k == 13 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup13
|
|
elseif k == 14 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup14
|
|
elseif k == 15 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup15
|
|
elseif k == 16 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup16
|
|
elseif k == 17 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup17
|
|
elseif k == 18 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup18
|
|
elseif k == 19 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup19
|
|
elseif k == 20 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup20
|
|
elseif k == 21 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup21
|
|
elseif k == 22 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup22
|
|
elseif k == 23 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup23
|
|
elseif k == 24 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup24
|
|
elseif k == 25 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup25
|
|
elseif k == 26 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup26
|
|
elseif k == 27 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup27
|
|
elseif k == 28 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup28
|
|
elseif k == 29 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup29
|
|
elseif k == 30 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup30
|
|
elseif k == 31 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup31
|
|
elseif k == 32 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup32
|
|
elseif k == 33 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup33
|
|
elseif k == 34 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup34
|
|
elseif k == 35 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup35
|
|
elseif k == 36 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup36
|
|
elseif k == 37 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup37
|
|
elseif k == 38 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup38
|
|
elseif k == 39 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup39
|
|
elseif k == 40 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup40
|
|
elseif k == 41 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup41
|
|
elseif k == 42 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup42
|
|
elseif k == 43 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup43
|
|
elseif k == 44 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup44
|
|
elseif k == 45 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup45
|
|
elseif k == 46 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup46
|
|
elseif k == 47 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup47
|
|
elseif k == 48 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup48
|
|
elseif k == 49 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup49
|
|
elseif k == 50 then
|
|
sSetup = mCamData[nNumMachFromCam].Setup50
|
|
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
|
|
-- se ho importato almeno un attrezzaggio do errore
|
|
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
|
|
else -- setup default non definito
|
|
-- assegno ugualmente un attrezzaggio vuoto
|
|
EgtSetInfo( EgtGetCurrSetup(), 'Name', EgtDoorsMsg[555])
|
|
end
|
|
end
|
|
end
|
|
|
|
if nNumGroup > 1 then sNumGroup = '_'..EgtNumToString(nNumGroup,0) end
|
|
|
|
-- Eventuale messaggio di errore
|
|
if not bOk then
|
|
|
|
DoorOutLog( string.format(EgtDoorsMsg[494], MachName), 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], MachName), 0) -- Error on machining calculation
|
|
|
|
-- 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], MachName))
|
|
|
|
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], MachName), EgtDoorsMsg[476], EgtDoorsMsg[477]) -- Error on machining calculation
|
|
else
|
|
EgtOutBox( string.format( EgtDoorsMsg[475], MachName), 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()
|
|
|
|
-- Estimation
|
|
bOk = EgtEstimate( sFileDir..sFileName..sNumGroup..'.html', 'EgtCam5 - '..sFilePath)
|
|
-- NC code generation
|
|
bOk = EgtGenerate( sFileDir..sFileName..sNumGroup..'.cnc', 'EgtCam5 - '..sFilePath)
|
|
|
|
if bOk then
|
|
|
|
if not DGD.ERR then DGD.ERR = 0 end
|
|
DoorOutLog( string.format( '\n'..EgtDoorsMsg[494], MachName), 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 la disposizione nel log
|
|
end
|
|
end
|
|
DoorOutLog( sTotDispMode, 0) -- stampo la disposizione nel log
|
|
|
|
-- cancello e ricreo il file txt
|
|
EgtEraseFile( sFileDir..sFileName..sNumGroup..'.txt')
|
|
--ricreo il file txt con la disposizione
|
|
WriteErrFile( sFileDir..sFileName..sNumGroup..'.txt', sTotDispMode)
|
|
else
|
|
|
|
DGD.ERR = 20
|
|
DGD.EMC = DGD.EMC .. string.format(EgtDoorsMsg[478], MachName, sSetup)
|
|
|
|
-- cancello e ricreo il file txt
|
|
EgtEraseFile( sFileDir..sFileName..sNumGroup..'.txt')
|
|
--ricreo il file txt con la disposizione
|
|
WriteErrFile( sFileDir..sFileName..sNumGroup..'.txt')
|
|
|
|
-- scrivo messaggio nei file log
|
|
DoorOutLog( string.format(EgtDoorsMsg[478], MachName, 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
|
|
EgtOutBox( string.format(EgtDoorsMsg[478], MachName, sSetup), EgtDoorsMsg[476], EgtDoorsMsg[477]) -- Error on Nc part program generation
|
|
end
|
|
return false, nNumGroup
|
|
end
|
|
|
|
-- reset librerie locali
|
|
package.loaded[MachiningsTable] = nil
|
|
package.loaded[MachiningsTableOrd] = nil
|
|
|
|
return true, nNumGroup
|
|
end
|
|
|
|
return MachiningLoc
|