6f41b04fce
- 3D completo - tavola caricata correttamente - ventosa e riferimento
297 lines
9.5 KiB
Lua
297 lines
9.5 KiB
Lua
-- 2024/10/10 10:00:00
|
|
-- Disposition Init for Cms-PK_PL machine
|
|
|
|
-- Intestazioni
|
|
require( 'EgtBase')
|
|
_ENV = EgtProtectGlobal()
|
|
EgtEnableDebug( false)
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Colore del grezzo
|
|
local ColA = Color3d( 255, 165, 0, 30)
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- * Verifica esistenza MachGroup *
|
|
if not EgtGetCurrMachGroup() then
|
|
local sErr = 'InitDisp for Cms-PK_PL : missing CurrMachGroup'
|
|
EgtOutLog( sErr)
|
|
EgtOutText( sErr)
|
|
DISP.ERR = 1
|
|
return
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- *** Disposizione ***
|
|
|
|
-- Scelta della tavola
|
|
local sTab = 'Tab'
|
|
EgtSetTable( sTab)
|
|
local frTab = Frame3d( EgtGetTableRef())
|
|
|
|
-- Se pezzo non definito, esco senza errore (modalità test macchina)
|
|
local Pz = DISP.PARTID
|
|
if not Pz or Pz == GDB_ID.NULL then
|
|
DISP.ERR = 0
|
|
return
|
|
end
|
|
|
|
-- Recupero i dati del pezzo
|
|
local Ls = EgtGetFirstNameInGroup( Pz, 'SOLID')
|
|
local Er = EgtGetFirstNameInGroup( Ls or GDB_ID.NULL, 'RAW')
|
|
local b3Part = EgtGetBBoxGlob( Pz or GDB_ID.NULL, GDB_BB.STANDARD)
|
|
local b3Solid = EgtGetBBoxGlob( Ls or GDB_ID.NULL, GDB_BB.STANDARD)
|
|
-- Se pezzo vuoto, non devo fare alcunchè
|
|
if b3Part:isEmpty() then
|
|
local sErr = 'InitDisp for Cms-PK_PL : empty part'
|
|
EgtOutLog( sErr)
|
|
EgtOutText( sErr)
|
|
DISP.ERR = 2
|
|
return
|
|
end
|
|
|
|
-- Recupero ingombro di grezzi già inseriti
|
|
local b3PrevRaw = BBox3d()
|
|
local nPrevRawId = EgtGetFirstRawPart()
|
|
while nPrevRawId do
|
|
local b3Raw = EgtGetRawPartBBox( nPrevRawId)
|
|
b3PrevRaw:Add( b3Raw)
|
|
nPrevRawId = EgtGetNextRawPart( nPrevRawId)
|
|
end
|
|
b3PrevRaw:toLoc( frTab)
|
|
|
|
-- Richiesta posizione rispetto allo Zero tavola
|
|
local dOverMatXY = 5
|
|
local sOverMatXY = EgtNumToString( EgtToUiUnits( dOverMatXY), 0)
|
|
local dOverMatZ = 0
|
|
local sOverMatZ = EgtNumToString( EgtToUiUnits( dOverMatZ), 0)
|
|
local dSafeDist = 20
|
|
local sSafeDist = EgtNumToString( EgtToUiUnits( dSafeDist), 0)
|
|
local vVal = EgtDialogBox( 'Dati di disposizione', {'Y Position', 'CB:Front,MediumFront,MediumBack,Back'},
|
|
{'X Position', 'CB:Left,Right'},
|
|
{'Safe Dist', sSafeDist},
|
|
{'Sovramateriale XY', sOverMatXY},
|
|
{'Sovramateriale Z', sOverMatZ})
|
|
if not vVal or #vVal < 5 then
|
|
DISP.ERR = 100
|
|
return
|
|
end
|
|
local sRefY = 'B'
|
|
local vYPos = { Front='B', MediumFront='M', MediumBack='N', Back='T'}
|
|
sRefY = vYPos[vVal[1]]
|
|
local sRefX = 'L'
|
|
local vXPos = { Left='L', Right='R'}
|
|
sRefX = vXPos[vVal[2]]
|
|
dSafeDist = EgtFromUiUnits( tonumber( vVal[3]))
|
|
dOverMatXY = EgtFromUiUnits( tonumber( vVal[4]))
|
|
dOverMatZ = EgtFromUiUnits( tonumber( vVal[5]))
|
|
|
|
-- Definizione e posizionamento del grezzo
|
|
local nRaw
|
|
if Er then
|
|
nRaw = EgtAddRawPartWithPart( Pz, Er, 0, ColA)
|
|
EgtSetStatus( Er, GDB_ST.ON)
|
|
else
|
|
nRaw = EgtAddRawPartWithPart( Pz, GDB_ID.NULL, dOverMatXY, ColA)
|
|
if nRaw and dOverMatZ > 10 * GEO.EPS_SMALL then
|
|
local b3Raw = EgtGetRawPartBBox( nRaw)
|
|
local dRawH = b3Raw:getDimZ() + dOverMatZ
|
|
EgtModifyRawPartHeight( nRaw, dRawH)
|
|
end
|
|
end
|
|
if not nRaw then
|
|
local sErr = 'InitDisp for Cms-PK_PL : error defining raw part'
|
|
EgtOutLog( sErr)
|
|
EgtOutText( sErr)
|
|
DISP.ERR = 3
|
|
return
|
|
end
|
|
local b3Raw = EgtGetRawPartBBox( nRaw)
|
|
local bVac = ( b3Raw:getDimY() >= 120)
|
|
local vtOffs, nCorn
|
|
if sRefY == 'B' and sRefX == 'L' then
|
|
vtOffs = Vector3d( 0, 0, 30)
|
|
nCorn = MCH_CR.BL
|
|
elseif sRefY == 'B' and sRefX == 'R' then
|
|
vtOffs = Vector3d( 1700, 0, 30)
|
|
nCorn = MCH_CR.BR
|
|
elseif sRefY == 'M' and sRefX == 'L' then
|
|
vtOffs = Vector3d( 0, 675-10, 30)
|
|
nCorn = MCH_CR.TL
|
|
elseif sRefY == 'M' and sRefX == 'R' then
|
|
vtOffs = Vector3d( 1700, 675-10, 30)
|
|
nCorn = MCH_CR.TR
|
|
elseif sRefY == 'N' and sRefX == 'L' then
|
|
vtOffs = Vector3d( 0, 675+10, 30)
|
|
nCorn = MCH_CR.BL
|
|
elseif sRefY == 'N' and sRefX == 'R' then
|
|
vtOffs = Vector3d( 1700, 675+10, 30)
|
|
nCorn = MCH_CR.BR
|
|
elseif sRefY == 'T' and sRefX == 'L' then
|
|
vtOffs = Vector3d( 0, 1350, 30)
|
|
nCorn = MCH_CR.TL
|
|
elseif sRefY == 'T' and sRefX == 'R' then
|
|
vtOffs = Vector3d( 1700, 1350, 30)
|
|
nCorn = MCH_CR.TR
|
|
end
|
|
if not bVac then
|
|
if sRefY == 'B' or sRefY == 'N' then
|
|
vtOffs = vtOffs + 60 * Y_AX()
|
|
else
|
|
vtOffs = vtOffs - 60 * Y_AX()
|
|
end
|
|
end
|
|
if not EgtMoveToCornerRawPart( nRaw, vtOffs, nCorn) then
|
|
local sErr = 'InitDisp for Cms-PK_PL : error positioning raw part on table'
|
|
EgtOutLog( sErr)
|
|
EgtOutText( sErr)
|
|
DISP.ERR = 4
|
|
return
|
|
end
|
|
|
|
-- Posizionamento dei piani di lavoro, carrelli e ventose
|
|
local DIMT_X = 120
|
|
local OFFS_MIN_T = 200
|
|
local DIMV_Y = 100
|
|
local OFFS_MIN_V = 120
|
|
local SAFE_DIST = dSafeDist + dOverMatXY
|
|
b3Raw = EgtGetRawPartBBox( nRaw)
|
|
b3Raw:toLoc( frTab)
|
|
-- barre (4)
|
|
local vbT = { false, false, false, false}
|
|
local vsNamT = { 'T1', 'T2', 'T3', 'T4'}
|
|
local vdPosT = { EgtGetAxisHomePos( 'T1'), EgtGetAxisHomePos( 'T2'), EgtGetAxisHomePos( 'T3'), EgtGetAxisHomePos( 'T4')}
|
|
if b3Raw:getDimX() < 300 then
|
|
if sRefX == 'L' then
|
|
vbT[1] = true
|
|
vdPosT[1] = b3Raw:getCenter():getX() - DIMT_X / 2
|
|
else
|
|
vbT[4] = true
|
|
vdPosT[2] = vdPosT[1] + OFFS_MIN_T
|
|
vdPosT[3] = vdPosT[2] + OFFS_MIN_T
|
|
vdPosT[4] = b3Raw:getCenter():getX() - DIMT_X / 2
|
|
end
|
|
elseif b3Raw:getDimX() < 650 then
|
|
if sRefX == 'L' then
|
|
vbT[1] = true ; vbT[2] = true
|
|
vdPosT[1] = b3Raw:getMin():getX() + SAFE_DIST
|
|
vdPosT[2] = b3Raw:getMax():getX() - SAFE_DIST - DIMT_X
|
|
else
|
|
vbT[3] = true ; vbT[4] = true
|
|
vdPosT[2] = vdPosT[1] + OFFS_MIN_T
|
|
vdPosT[3] = b3Raw:getMin():getX() + SAFE_DIST
|
|
vdPosT[4] = b3Raw:getMax():getX() - SAFE_DIST - DIMT_X
|
|
end
|
|
elseif b3Raw:getDimX() < 1000 then
|
|
if sRefX == 'L' then
|
|
vbT[1] = true ; vbT[2] = true ; vbT[3] = true
|
|
vdPosT[1] = b3Raw:getMin():getX() + SAFE_DIST
|
|
vdPosT[3] = b3Raw:getMax():getX() - SAFE_DIST - DIMT_X
|
|
vdPosT[2] = ( vdPosT[1] + vdPosT[3]) / 2
|
|
else
|
|
vbT[2] = true ; vbT[3] = true ; vbT[4] = true
|
|
vdPosT[2] = b3Raw:getMin():getX() + SAFE_DIST
|
|
vdPosT[4] = b3Raw:getMax():getX() - SAFE_DIST - DIMT_X
|
|
vdPosT[3] = ( vdPosT[2] + vdPosT[4]) / 2
|
|
end
|
|
else
|
|
vbT[1] = true ; vbT[2] = true ; vbT[3] = true ; vbT[4] = true
|
|
vdPosT[1] = b3Raw:getMin():getX() + SAFE_DIST
|
|
vdPosT[4] = b3Raw:getMax():getX() - SAFE_DIST - DIMT_X
|
|
vdPosT[2] = 0.666 * vdPosT[1] + 0.334 * vdPosT[4]
|
|
vdPosT[3] = 0.334 * vdPosT[1] + 0.666 * vdPosT[4]
|
|
end
|
|
for i = 1, #vbT do
|
|
EgtMoveDispAxis( vsNamT[i], vdPosT[i])
|
|
end
|
|
-- carrelli per ventose o morse (3)
|
|
local vbV = { false, false, false}
|
|
local vdPosV = { EgtGetAxisHomePos( 'T11'), EgtGetAxisHomePos( 'T12'), EgtGetAxisHomePos( 'T13')}
|
|
if not bVac then
|
|
if sRefY == 'B' then
|
|
vbV[1] = true
|
|
vdPosV[1] = b3Raw:getMin():getY() - DIMV_Y / 2 - 10
|
|
elseif sRefY == 'M' then
|
|
vbV[2] = true
|
|
vdPosV[2] = b3Raw:getMax():getY() - DIMV_Y / 2 + 10
|
|
elseif sRefY == 'N' then
|
|
vbV[2] = true
|
|
vdPosV[2] = b3Raw:getMin():getY() - DIMV_Y / 2 - 10
|
|
elseif sRefY == 'T' then
|
|
vbV[3] = true
|
|
vdPosV[2] = vdPosV[1] + OFFS_MIN_V
|
|
vdPosV[3] = b3Raw:getMax():getY() - DIMV_Y / 2 + 10
|
|
end
|
|
elseif b3Raw:getDimY() < 260 then
|
|
if b3Raw:getMin():getY() < 675 then
|
|
vbV[1] = true
|
|
vdPosV[1] = b3Raw:getCenter():getY() - DIMV_Y / 2
|
|
else
|
|
vbV[3] = true
|
|
vdPosV[2] = vdPosV[1] + OFFS_MIN_V
|
|
vdPosV[3] = b3Raw:getCenter():getY() - DIMV_Y / 2
|
|
end
|
|
elseif b3Raw:getDimY() < 450 then
|
|
if b3Raw:getMin():getY() < 675 then
|
|
vbV[1] = true ; vbV[2] = true
|
|
vdPosV[1] = b3Raw:getMin():getY() + SAFE_DIST
|
|
vdPosV[2] = b3Raw:getMax():getY() - SAFE_DIST - DIMV_Y
|
|
else
|
|
vbV[2] = true ; vbV[3] = true
|
|
vdPosV[2] = b3Raw:getMin():getY() + SAFE_DIST
|
|
vdPosV[3] = b3Raw:getMax():getY() - SAFE_DIST - DIMV_Y
|
|
end
|
|
else
|
|
vbV[1] = true ; vbV[2] = true ; vbV[3] = true
|
|
vdPosV[1] = b3Raw:getMin():getY() + SAFE_DIST
|
|
vdPosV[3] = b3Raw:getMax():getY() - SAFE_DIST - DIMV_Y
|
|
vdPosV[2] = ( vdPosV[1] + vdPosV[3]) / 2
|
|
end
|
|
for i = 1, #vbT do
|
|
if vbT[i] then
|
|
for j = 1, #vbV do
|
|
local sVac = vsNamT[ i] .. tostring( j)
|
|
EgtMoveDispAxis( sVac, vdPosV[j])
|
|
end
|
|
end
|
|
end
|
|
-- ventose o morse
|
|
for i = 1, #vbT do
|
|
if vbT[i] then
|
|
local dPosX = vdPosT[i] + DIMT_X / 2
|
|
for j = 1, #vbV do
|
|
if vbV[j] then
|
|
if bVac then
|
|
EgtAddFixture( 'Vac120x100H30', Point3d( dPosX, vdPosV[j] + DIMV_Y / 2, 0))
|
|
else
|
|
EgtAddFixture( 'ViseH30', Point3d( dPosX, vdPosV[j] + DIMV_Y / 2, 0), 0, b3Raw:getDimZ())
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
-- riferimenti
|
|
local dRefX = EgtIf( sRefX == 'L', -10, 1710)
|
|
if sRefY == 'B' then
|
|
EgtAddFixture( 'RefD20', Point3d( dRefX, 100, 0))
|
|
for i = 1, #vbT do
|
|
if bVac and vbT[i] then EgtAddFixture( 'RefD20', Point3d( vdPosT[i] + DIMT_X / 2, -10, 0)) end
|
|
end
|
|
elseif sRefY == 'M' then
|
|
EgtAddFixture( 'RefD20', Point3d( dRefX, 675-110, 0))
|
|
for i = 1, #vbT do
|
|
if bVac and vbT[i] then EgtAddFixture( 'RefD20', Point3d( vdPosT[i] + DIMT_X / 2, 675, 0)) end
|
|
end
|
|
elseif sRefY == 'N' then
|
|
EgtAddFixture( 'RefD20', Point3d( dRefX, 675+110, 0))
|
|
for i = 1, #vbT do
|
|
if bVac and vbT[i] then EgtAddFixture( 'RefD20', Point3d( vdPosT[i] + DIMT_X / 2, 675, 0)) end
|
|
end
|
|
elseif sRefY == 'T' then
|
|
EgtAddFixture( 'RefD20', Point3d( dRefX, 1350-100, 0))
|
|
for i = 1, #vbT do
|
|
if bVac and vbT[i] then EgtAddFixture( 'RefD20', Point3d( vdPosT[i] + DIMT_X / 2, 1350+10, 0)) end
|
|
end
|
|
end
|
|
|
|
DISP.ERR = 0
|