|
|
|
@@ -0,0 +1,200 @@
|
|
|
|
|
-- RunPrepareExport.lua by Egaltech s.r.l. 2023/10/19
|
|
|
|
|
-- Creo le geometrie da esportare con 3dm
|
|
|
|
|
|
|
|
|
|
-- Tabella per definizione modulo
|
|
|
|
|
local RunPrepareExport = {}
|
|
|
|
|
|
|
|
|
|
-- Intestazioni
|
|
|
|
|
require( 'EgtBase')
|
|
|
|
|
|
|
|
|
|
EgtOutLog( ' RunPreprareExport started', 1)
|
|
|
|
|
|
|
|
|
|
-- Dati
|
|
|
|
|
local AMD = require( 'AddManData')
|
|
|
|
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
|
|
local function CalcCurves( nSliceId, nDestGrp, vtSlicing)
|
|
|
|
|
|
|
|
|
|
-- scorro tutti i gruppi di curve
|
|
|
|
|
local vCrvs = EgtGetNameInGroup( nSliceId, CONTOUR_GRP .. '*')
|
|
|
|
|
for j = 1, #vCrvs do
|
|
|
|
|
-- cerco il gruppo del toolpath
|
|
|
|
|
local nTPath = EgtGetFirstNameInGroup( vCrvs[j], TOOLPATH_GRP)
|
|
|
|
|
if nTPath then
|
|
|
|
|
local nId = EgtGetFirstInGroup( nTPath)
|
|
|
|
|
while nId do
|
|
|
|
|
-- se non è wipe creo la fat curve da estrudere per creare il solido
|
|
|
|
|
local nType = EgtGetInfo( nId, KEY_TYPE, 'i')
|
|
|
|
|
if nType ~= TYPE.WIPE then
|
|
|
|
|
local dStrand = EgtGetInfo( nId, KEY_CRV_STRAND, 'd')
|
|
|
|
|
|
|
|
|
|
-- TO DO : da sostituire con offset di Vroni che per curve aperte è la fat curve
|
|
|
|
|
local nCopy = EgtCopyGlob( nId, nDestGrp)
|
|
|
|
|
local nCopyInv = EgtCopyGlob( nId, nDestGrp)
|
|
|
|
|
EgtInvertCurve( nCopyInv)
|
|
|
|
|
EgtAddCurveCompoCurve( nCopy, nCopyInv)
|
|
|
|
|
local nCrv, nCnt = EgtOffsetCurveAdv( nCopy, 0.5 * dStrand)
|
|
|
|
|
-- se fallisce ritento con valore leggermente diverso
|
|
|
|
|
if not nCrv or nCnt == 0 then
|
|
|
|
|
nCrv, nCnt = EgtOffsetCurveAdv( nCopy, 0.5 * dStrand - 0.05)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if nCrv and nCnt > 0 then
|
|
|
|
|
-- se sono curve chiuse piccoli aggistamenti per creare un percorso unico
|
|
|
|
|
if nCnt > 1 then
|
|
|
|
|
for nLoopId = nCrv + 1, nCrv + nCnt - 1 do
|
|
|
|
|
EgtInvertCurve( nLoopId)
|
|
|
|
|
local dLen = EgtCurveLength( nLoopId)
|
|
|
|
|
local dPar1 = EgtCurveParamAtLength( nLoopId, dLen * 0.5)
|
|
|
|
|
local dPar2 = EgtCurveParamAtLength( nLoopId, dLen * 0.5 + 2 * GEO.EPS_SMALL)
|
|
|
|
|
local ptM = EgtUP( nLoopId, dPar1)
|
|
|
|
|
local ptM2 = EgtUP( nLoopId, dPar2)
|
|
|
|
|
local _, _, dParRef1 = EgtPointCurveDist( ptM, nCrv)
|
|
|
|
|
local _, _, dParRef2 = EgtPointCurveDist( ptM, nCrv)
|
|
|
|
|
EgtTrimCurveStartEndAtParam( nCrv, dParRef2, dParRef1)
|
|
|
|
|
EgtTrimCurveStartEndAtParam( nLoopId, dPar2, dPar1)
|
|
|
|
|
EgtInvertCurve( nLoopId)
|
|
|
|
|
EgtAddCurveCompoLine( nCrv, EgtSP( nLoopId))
|
|
|
|
|
EgtAddCurveCompoCurve( nCrv, nLoopId)
|
|
|
|
|
EgtCloseCurveCompo( nCrv)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if nType == TYPE.OUTER_SHELL or nType == TYPE.EXTRA_OUTER_SHELL then
|
|
|
|
|
EgtSetColor( nCrv, EgtStdColor( 'TEAL'))
|
|
|
|
|
elseif nType == TYPE.INNER_SHELL or nType == TYPE.EXTRA_SHELL then
|
|
|
|
|
EgtSetColor( nCrv, EgtStdColor( 'ORANGE'))
|
|
|
|
|
elseif nType == TYPE.LINK then
|
|
|
|
|
EgtSetColor( nCrv, EgtStdColor( 'GRAY'))
|
|
|
|
|
elseif nType == TYPE.INFILL then
|
|
|
|
|
EgtSetColor( nCrv, EgtStdColor( 'YELLOW'))
|
|
|
|
|
elseif nType == TYPE.COASTING then
|
|
|
|
|
EgtSetColor( nCrv, EgtStdColor( 'BLUE'))
|
|
|
|
|
elseif nType == TYPE.RIB then
|
|
|
|
|
EgtSetColor( nCrv, EgtStdColor( 'OLIVE'))
|
|
|
|
|
elseif nType == TYPE.AUX_SOLID then
|
|
|
|
|
EgtSetColor( nCrv, EgtStdColor( 'AQUA'))
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
EgtErase( nCopy)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
nId = EgtGetNext( nId)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- copio le frecce direzione dal gruppo dei solidi
|
|
|
|
|
local nSolidGrp = EgtGetFirstNameInGroup( vCrvs[j], SOLID_GRP)
|
|
|
|
|
if nSolidGrp then
|
|
|
|
|
local nId = EgtGetFirstNameInGroup( nSolidGrp, DIR_ARROW)
|
|
|
|
|
while nId do
|
|
|
|
|
local nCopy = EgtCopyGlob( nId, nDestGrp)
|
|
|
|
|
EgtSetMode( nCopy, GDB_MD.STD)
|
|
|
|
|
EgtSetStatus( nCopy, GDB_ST.ON)
|
|
|
|
|
nId = EgtGetNextName( nId, DIR_ARROW)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
|
|
local function CalcSpiralVase( nSliceId, nDestGrp)
|
|
|
|
|
|
|
|
|
|
-- scorro tutti i gruppi di curve
|
|
|
|
|
local vCrvs = EgtGetNameInGroup( nSliceId, CONTOUR_GRP .. '*')
|
|
|
|
|
for j = 1, #vCrvs do
|
|
|
|
|
-- recupero il solido dal gruppo
|
|
|
|
|
local nSolidGrp = EgtGetFirstNameInGroup( vCrvs[j], SOLID_GRP)
|
|
|
|
|
if nSolidGrp then
|
|
|
|
|
local vSolids = EgtGetAllInGroup( nSolidGrp)
|
|
|
|
|
for i = 1, #vSolids do
|
|
|
|
|
EgtCopyGlob( vSolids[i], nDestGrp)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
|
|
function RunPrepareExport.Exec()
|
|
|
|
|
|
|
|
|
|
local nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. '*')
|
|
|
|
|
if not nPartId then
|
|
|
|
|
EgtOutBox( 'Error : no part', 'Export')
|
|
|
|
|
return GDB_ID.NULL
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- creo o recupero il gruppo per l'esportazione
|
|
|
|
|
local nGrp = EgtGetFirstNameInGroup( GDB_ID.ROOT, LAY_EXPORT)
|
|
|
|
|
if not nGrp then
|
|
|
|
|
-- se non esiste creo il gruppo
|
|
|
|
|
nGrp = EgtGroup( GDB_ID.ROOT)
|
|
|
|
|
EgtSetName( nGrp, LAY_EXPORT)
|
|
|
|
|
EgtSetStatus( nGrp, GDB_ST.OFF)
|
|
|
|
|
EgtSetLevel( nGrp, GDB_LV.TEMP)
|
|
|
|
|
else
|
|
|
|
|
-- se il gruppo esiste già non devo fare nulla
|
|
|
|
|
return nGrp
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- creo il punto di origine del riferimento
|
|
|
|
|
local ptRef = EgtGetInfo( nPartId, KEY_ORIG_REF, 'p')
|
|
|
|
|
if not ptRef then
|
|
|
|
|
local nFrameId = EgtGetFirstNameInGroup( EgtGetFirstNameInGroup( nPartId, LAY_FRAME), FRAME_PART)
|
|
|
|
|
ptRef = EgtSP( nFrameId or GDB_ID.NULL, GDB_ID.ROOT)
|
|
|
|
|
end
|
|
|
|
|
local nPnt = EgtPoint( nGrp, ptRef, GDB_RT.GLOB)
|
|
|
|
|
EgtSetName( nPnt, KEY_ORIG_REF)
|
|
|
|
|
EgtSetStatus( nPnt, GDB_ST.OFF)
|
|
|
|
|
|
|
|
|
|
-- recupero alcune info utili e le assegno al punto per poterle leggere da ThreeJS
|
|
|
|
|
local dH = EgtGetInfo( nPartId, KEY_SLICE_STEP, 'd')
|
|
|
|
|
EgtSetInfo( nPnt, KEY_SLICE_STEP, dH)
|
|
|
|
|
local vtSlicing = EgtGetInfo( nPartId, KEY_SLICING_DIR, 'v')
|
|
|
|
|
EgtSetInfo( nPnt, KEY_SLICING_DIR, vtSlicing)
|
|
|
|
|
local bSpiralVase = EgtGetInfo( nPartId, KEY_SPIRAL_VASE, 'b') or false
|
|
|
|
|
EgtSetInfo( nPnt, KEY_SPIRAL_VASE, bSpiralVase)
|
|
|
|
|
|
|
|
|
|
-- recupero gli slices
|
|
|
|
|
local vSlices = EgtGetNameInGroup( nPartId, SLICE_LAYER .. '*') or {}
|
|
|
|
|
if #vSlices == 0 then
|
|
|
|
|
EgtOutBox( 'Error : no slices', 'Export')
|
|
|
|
|
return GDB_ID.NULL
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- verifico che nel primo slice siano presenti sia i toolpath sia i solidi
|
|
|
|
|
local nCrvGrp = EgtGetFirstNameInGroup( vSlices[1], CONTOUR_GRP .. '*')
|
|
|
|
|
if not nCrvGrp then
|
|
|
|
|
EgtOutBox( 'Error : no toolpaths', 'Export')
|
|
|
|
|
return GDB_ID.NULL
|
|
|
|
|
end
|
|
|
|
|
local nTPath = EgtGetFirstNameInGroup( nCrvGrp, TOOLPATH_GRP)
|
|
|
|
|
if not nTPath then
|
|
|
|
|
EgtOutBox( 'Error : no toolpaths', 'Export')
|
|
|
|
|
return GDB_ID.NULL
|
|
|
|
|
end
|
|
|
|
|
local nSolid = EgtGetFirstNameInGroup( nCrvGrp, SOLID_GRP)
|
|
|
|
|
if not nSolid then
|
|
|
|
|
EgtOutBox( 'Error : no solids', 'Export')
|
|
|
|
|
return GDB_ID.NULL
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for i = 1, #vSlices do
|
|
|
|
|
|
|
|
|
|
-- creo il gruppo corrispondente
|
|
|
|
|
local nDestGrp = EgtGroup( nGrp)
|
|
|
|
|
EgtSetName( nDestGrp, EgtGetName( vSlices[i]))
|
|
|
|
|
EgtSetStatus( nDestGrp, GDB_ST.OFF)
|
|
|
|
|
|
|
|
|
|
if bSpiralVase then
|
|
|
|
|
CalcSpiralVase( vSlices[i], nDestGrp)
|
|
|
|
|
else
|
|
|
|
|
CalcCurves( vSlices[i], nDestGrp, vtSlicing)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return nGrp
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
---------------------------------------------------------------------
|
|
|
|
|
return RunPrepareExport
|