-- CalcPaths.lua by Egaltech s.r.l. 2022/06/28 -- Calcolo percorsi di lavoro per Stampa 3d -- Tabella per definizione modulo local CalcPaths = {} -- Intestazioni require( 'EgtBase') EgtOutLog( ' CalcPaths started', 1) -- Dati local AMD = require( 'AddManData') --------------------------------------------------------------------- local s_nPartId --------------------------------------------------------------------- local function GetLayerParamsForPathCalc() local LayerParams = {} LayerParams.nShellsNbr = EgtGetInfo( s_nPartId, KEY_SHELLS_NBR, 'i') LayerParams.dStrand = EgtGetInfo( s_nPartId, KEY_STRAND, 'd') LayerParams.dOffs = EgtGetInfo( s_nPartId, KEY_OFFSET_SLICE, 'd') LayerParams.nFloorNbr = EgtGetInfo( s_nPartId, KEY_FLOOR_NBR, 'i') LayerParams.vtSlicing = EgtGetInfo( s_nPartId, KEY_SLICING_DIR, 'v') -- parametri setti LayerParams.dSettiOverlap = EgtGetInfo( s_nPartId, KEY_SETTI_OVERLAP, 'd') LayerParams.nSettiShellsNbr = EgtGetInfo( s_nPartId, KEY_SETTI_SHELLS_NBR, 'i') LayerParams.bSettiInvertOrder = EgtGetInfo( s_nPartId, KEY_SETTI_INVERT_ORDER, 'b') return LayerParams end --------------------------------------------------------------------- local function GetLayerStartPoint( nLayId) local ptStart -- recupero il punto di partenza usato nel layer precedente local nPrev = EgtGetPrev( nLayId) local nCrvGrp = EgtGetFirstNameInGroup( nPrev, CONTOUR_GRP..'*') local nPathGrp = EgtGetFirstNameInGroup( nCrvGrp, PATH_GRP) local nCrv = EgtGetFirstInGroup( nPathGrp) if nCrv then ptStart = EgtSP( nCrv, GDB_ID.ROOT) else ptStart = EgtGetInfo( s_nPartId, KEY_START_POINT, 'p') end return ptStart end --------------------------------------------------------------------- local function GetPathsFromSurf( nSrfId, sName, nType, nGrpId, nLayId) local nChunks = EgtSurfFrChunkCount( nSrfId) for nC = 0, nChunks - 1 do -- estraggo i contorni local nCrvId, nCrvCnt = EgtExtractSurfFrChunkLoops( nSrfId, nC, nGrpId) for nInd = 0, nCrvCnt - 1 do EgtSetName( nCrvId + nInd, sName) EgtSetInfo( nCrvId + nInd, KEY_TYPE, nType) -- se è loop interno lo inverto per averlo orientato in senso antiorario if nInd > 0 then EgtInvertCurve( nCrvId + nInd) end -- verifico soddisfi i requisiti (lunghezza e area) local dLen = EgtCurveLength( nCrvId + nInd) local _ , _ , dArea = EgtCurveArea( nCrvId + nInd) if dLen < MIN_LEN or dArea < MIN_AREA then EgtErase( nCrvId + nInd) return end -- scelta start point local ptStart = GetLayerStartPoint( nLayId) EgtChangeClosedCurveStartPoint( nCrvId + nInd, ptStart, GDB_RT.GLOB) end end end -------------------------------------------------------------------- local function AddFloor( nSrfId, nGrpId, LayerParams, nFloorNbr) -- local nSrfCopy = EgtCopyGlob( nSrfId, nGrpId) -- local dOffs = 0.5 * LayerParams.dStrand - LayerParams.dOffs + LayerParams.nShellsNbr * LayerParams.dStrand -- local dAng = 0 -- -- if EgtSurfFrOffset( nSrfCopy, - dOffs) and EgtSurfFrChunkCount( nSrfCopy) > 0 then -- local nCrvId, nCnt = EgtGetSurfFrZigZagInfill( nSrfCopy, nGrpId, LayerParams.dStrand + 10 * GEO.EPS_SMALL, dAng, false, false) -- for nInd = 0, nCnt - 1 do -- local dLen = EgtCurveLength( nCrvId + nInd) -- if dLen < MIN_LEN then -- EgtErase( nCrvId + nInd) -- else -- EgtSetName( nCrvId + nInd, INFILL_CRV) -- EgtSetInfo( nCrvId + nInd, KEY_TYPE, TYPE.INFILL) -- end -- end -- EgtErase( nSrfCopy) -- end end -------------------------------------------------------------------- local function ReorderSetti( nGrp, bInvertOrder) EgtSpInit() local vIds = EgtGetNameInGroup( nGrp, SETTI_CRV .. '*') for i = 1, #vIds do local pt = EgtMP( vIds[i], GDB_RT.GLOB) EgtSpAddPoint( pt:getX(), pt:getY(), pt:getZ(), 0, 0, pt:getX(), pt:getY(), pt:getZ(), 0, 0) end local vOrd, dLen = EgtSpCalculate( SHP_TY.OPEN) EgtSpTerminate() local vOrderedSetti = {} if bInvertOrder then for i = #vOrd, 1, -1 do table.insert( vOrderedSetti, vIds[vOrd[i]]) end else for i = 1, #vOrd do table.insert( vOrderedSetti, vIds[vOrd[i]]) end end return vOrderedSetti end -------------------------------------------------------------------- local function CalcSettiPaths( nSliceGrp, nSettiGrp, LayerParams, nStmId) -- calcolo gli offset local dOffs = ( LayerParams.nSettiShellsNbr - 1) * LayerParams.dStrand / 2 local nOffsGrp = EgtGroup( nSettiGrp) local vSetti = EgtGetNameInGroup( nSettiGrp, SETTI_CRV .. '*') for i = 1, #vSetti do for k = 0, LayerParams.nSettiShellsNbr - 1 do local nNewId = EgtOffsetCurveAdv( vSetti[i], - dOffs + k * LayerParams.dStrand) EgtSetName( nNewId, EgtGetName( vSetti[i])) EgtSetInfo( nNewId, KEY_TYPE, TYPE.SETTO) EgtRelocateGlob( nNewId, nOffsGrp) end end -- riordino setti local vOrderedSetti = ReorderSetti( nOffsGrp, LayerParams.bSettiInvertOrder) -- scorro i gruppi di curve local nCrvGrp = EgtGetFirstNameInGroup( nSliceGrp, CONTOUR_GRP .. '*') while nCrvGrp do local nSettiPathGrp = EgtGetFirstNameInGroup( nCrvGrp, SETTI_GRP) local nSrf = EgtGetFirstNameInGroup( nSettiPathGrp, LAYER_SRF) if nSrf then for i = 1, #vOrderedSetti do local nNewId = EgtCopyGlob( vOrderedSetti[i], nSettiPathGrp) -- trim dei setti con la regione offsettata local nCrv, nCnt = EgtTrimCurveWithRegion( nNewId, nSrf, true, false) -- elimino tratti troppo corti for nId = nCrv, nCrv + nCnt - 1 do local dLen = EgtCurveLength( nId) if dLen < MIN_LEN then EgtErase( nId) end end end end if not EgtGetFirstNameInGroup( nSettiPathGrp, SETTI_CRV .. '*') then EgtErase( nSettiPathGrp) end nCrvGrp = EgtGetNextName( nCrvGrp, CONTOUR_GRP .. '*') end end --------------------------------------------------------------------- function CalcPaths.Exec( nPartId, nStmId) s_nPartId = nPartId local vLayIds = EgtGetNameInGroup( s_nPartId, SLICE_LAYER.."*") if not vLayIds then EgtOutBox( 'Error no slice', 'PathCalc') return end -- recupero i parametri per calcolo dei path local LayerParams = GetLayerParamsForPathCalc() -- scorro tutti i suoi layer for nIdx = 1, #vLayIds do local nSettiGrp = EgtGetFirstNameInGroup( vLayIds[nIdx], SETTI_GRP) -- scorro tutti i gruppi di contorni local nCrvGrpId = EgtGetFirstNameInGroup( vLayIds[nIdx], CONTOUR_GRP.."*") or GDB_ID.NULL while nCrvGrpId ~= GDB_ID.NULL do -- verifico se il path e il solido sono già stati calcolati local nGrpId = EgtGetFirstNameInGroup( nCrvGrpId, PATH_GRP) or GDB_ID.NULL if nGrpId == GDB_ID.NULL then nGrpId = EgtGroup( nCrvGrpId) EgtSetName( nGrpId, PATH_GRP) else EgtEmptyGroup( nGrpId) EgtSetStatus( nGrpId, GDB_ST.ON) end local nSolidGrpId = EgtGetFirstNameInGroup( nCrvGrpId, SOLID_GRP) or GDB_ID.NULL if nSolidGrpId ~= GDB_ID.NULL then EgtErase( nSolidGrpId) end -- recupero la superficie ottenuta dallo slicing local nSrf = EgtGetFirstNameInGroup( nCrvGrpId, LAYER_SRF) if nSrf then -- esterno local nSrfId = EgtCopyGlob( nSrf, nCrvGrpId) local dOffs = 0.5 * LayerParams.dStrand - LayerParams.dOffs local bOk = ( EgtSurfFrOffset( nSrfId, -dOffs) and EgtSurfFrChunkCount( nSrfId) > 0) if not bOk then EgtErase( nSrfId) nSrfId = EgtCopyGlob( nSrf, nCrvGrpId) bOk = ( EgtSurfFrOffset( nSrfId, -dOffs + 0.05) and EgtSurfFrChunkCount( nSrfId) > 0) end -- se offset riuscito, estraggo i contorni (pareti esterne) if bOk then GetPathsFromSurf( nSrfId, SHELL_CRV..'0', TYPE.OUTER_SHELL, nGrpId, vLayIds[nIdx]) else EgtOutLog( 'Error on ExtOffset (layer '..tostring( nIdx)..') - CalcPaths') end EgtErase( nSrfId) -- calcolo pareti interne for nInd2 = 1, LayerParams.nShellsNbr - 1 do -- offset della superficie originale local nSrfId = EgtCopy( nSrf, nGrpId) local bOk = ( EgtSurfFrOffset( nSrfId, - dOffs - nInd2 * LayerParams.dStrand) and EgtSurfFrChunkCount( nSrfId) > 0) if not bOk then EgtErase( nSrfId) nSrfId = EgtCopyGlob( nSrf, nCrvGrpId) bOk = ( EgtSurfFrOffset( nSrfId, -dOffs + 0.05 - nInd2 * LayerParams.dStrand) and EgtSurfFrChunkCount( nSrfId) > 0) end -- se offset riuscito, estraggo i contorni ( pareti interne) if bOk then GetPathsFromSurf( nSrfId, SHELL_CRV..tostring( nInd2), TYPE.INNER_SHELL, nGrpId, vLayIds[nIdx]) else EgtOutLog( 'Error on IntOffset (layer '..tostring( nIdx)..') - CalcPaths') end EgtErase( nSrfId) end -- setti if nSettiGrp then -- creo o svuoto il gruppo per i setti local nSettiPathGrp = EgtGetFirstNameInGroup( nCrvGrpId, SETTI_GRP) if not nSettiPathGrp then nSettiPathGrp = EgtGroup( nCrvGrpId) EgtSetName( nSettiPathGrp, SETTI_GRP) EgtSetStatus( nSettiPathGrp, GDB_ST.OFF) else EgtEmptyGroup( nSettiPathGrp) end -- calcolo superficie di offset da usare per i setti local nSrfId = EgtCopy( nSrf, nSettiPathGrp) local dOffs = 0.5 * LayerParams.dStrand - LayerParams.dOffs + ( LayerParams.nShellsNbr - 1) * LayerParams.dStrand + ( 1 - LayerParams.dSettiOverlap / 100) * LayerParams.dStrand local bOk = ( EgtSurfFrOffset( nSrfId, - dOffs) and EgtSurfFrChunkCount( nSrfId) > 0) if not bOk then EgtErase( nSrfId) nSrfId = EgtCopyGlob( nSrf, nSettiPathGrp) bOk = ( EgtSurfFrOffset( nSrfId, - dOffs + 0.05) and EgtSurfFrChunkCount( nSrfId) > 0) end -- se non ho una superficie errore ed elimino il gruppo dei setti if not bOk then EgtErase( nSettiPathGrp) EgtOutLog( 'Error on Offset (Setti) (layer '..tostring( nIdx)..') - CalcPaths') end end -- gestione eventuale floor if nIdx <= LayerParams.nFloorNbr then AddFloor( nSrf, nGrpId, LayerParams, nIdx) end end -- passo al gruppo di contorni successivo nCrvGrpId = EgtGetNextName( nCrvGrpId, CONTOUR_GRP.."*") or GDB_ID.NULL end -- sistemo eventuali setti if nSettiGrp then CalcSettiPaths( vLayIds[nIdx], nSettiGrp, LayerParams, nStmId) end if EgtProcessEvents( nIdx / #vLayIds * 100, 0) == 1 then EgtDraw() return end end end --------------------------------------------------------------------- return CalcPaths