diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index 8172c13..764cc12 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -296,6 +296,7 @@ LAY_FRAME = "Frame" VIEWPARAMS = 'ViewParams' IMPORTED_SOLID = 'ImportedSolid' RESULT_READ_PROG = 'ResultReadProg' +LAY_EXPORT = "ExportLayer" KEY_PART_ON_TABLE = 'PartOnTable' KEY_RESULT = 'Result' diff --git a/LuaLibs/RunPrepareExport.lua b/LuaLibs/RunPrepareExport.lua new file mode 100644 index 0000000..98d9962 --- /dev/null +++ b/LuaLibs/RunPrepareExport.lua @@ -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 \ No newline at end of file diff --git a/LuaLibs/RunSlicing.lua b/LuaLibs/RunSlicing.lua index 1c34b80..1a4ee24 100644 --- a/LuaLibs/RunSlicing.lua +++ b/LuaLibs/RunSlicing.lua @@ -79,6 +79,13 @@ local function RemoveOldSlices( nPartId) EgtErase( nInfillId) nInfillId = EgtGetFirstNameInGroup( nPartId, INFILL_GRP .. '*') end + + -- rimuovo gruppo per export + local nExportGrpId = EgtGetFirstNameInGroup( GDB_ID.ROOT, LAY_EXPORT) + if nExportGrpId then + EgtErase( nExportGrpId) + end + end --------------------------------------------------------------------- diff --git a/PrepareExport.lua b/PrepareExport.lua new file mode 100644 index 0000000..7f256dd --- /dev/null +++ b/PrepareExport.lua @@ -0,0 +1,17 @@ +-- PrepareExport.lua by Egaltech s.r.l. 2023/10/19 +-- Creo le geometrie da esportare con 3dm + +-- Intestazioni +require( 'EgtBase') +_ENV = EgtProtectGlobal() +EgtEnableDebug( false) + +-- Imposto direttorio libreria specializzata per Stampa 3d +EgtAddToPackagePath( PRINT.BASEDIR .. '\\LuaLibs\\?.lua') + +-- Librerie +_G.package.loaded.RunPrepareExport = nil +local RPE = require( 'RunPrepareExport') + +-- Calcolo +PRINT.EXPORTLAYER = RPE.Exec()