From 4d342b56c294ec5e0e2221f4975d87bd7fa9e1eb Mon Sep 17 00:00:00 2001 From: SaraP Date: Mon, 6 May 2024 17:05:37 +0200 Subject: [PATCH] 3dPrinting : - corretto errore nel calcolo solidi con spiral vase - nel calcolo solidi migliorata gestione caso problematico con split ricorsivo della curva guida. --- LuaLibs/RunCalcSolids.lua | 74 ++++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 28 deletions(-) diff --git a/LuaLibs/RunCalcSolids.lua b/LuaLibs/RunCalcSolids.lua index 0d23d3c..fa8194a 100644 --- a/LuaLibs/RunCalcSolids.lua +++ b/LuaLibs/RunCalcSolids.lua @@ -92,12 +92,12 @@ local function CreateSpiralVaseCap( nSectId, vtDir, nSolidGrp) local nSurf3 = EgtSurfTmRuled( nSolidGrp, vCrvs[3], vCrvs[4], GDB_RUL.ISOPAR, s_dTol) local nSurf4 = EgtSurfTmByRegion( nSolidGrp, vCrvs[5], s_dTol) local nSurf5 = EgtSurfTmByRegion( nSolidGrp, vCrvs[6], s_dTol) - local nCapSrf = EgtSurfTmBySewing( nSolidGrp, {nSurf1, nSurf2, nSurf3, nSurf4, nSurf5}) - + local nCapSrf = EgtSurfTmByTriangles( nSolidGrp, {nSurf1, nSurf2, nSurf3, nSurf4, nSurf5}) + for i = 1, #vCrvs do EgtErase( vCrvs[i]) end - + return nCapSrf end @@ -111,10 +111,10 @@ local function CreateSpiralVaseSolid( nCrvId, nSolidGrp, LayerParams, dStrand) local vtS = EgtSV( nCrvId, GDB_ID.ROOT) local ptE = EgtEP( nCrvId, GDB_ID.ROOT) local vtE = EgtEV( nCrvId, GDB_ID.ROOT) + local dDelta = ( ptE - ptS) * LayerParams.vtSlicing -- appiattisco la curva local nCrvCopy = EgtCopyGlob( nCrvId, nGrpTmp) - local dDelta = ( ptE - ptS) * LayerParams.vtSlicing - EgtSpiralizeCurveAlongExtrusion( nCrvCopy, - dDelta) + EgtProjectCurveOnPlane( nCrvCopy, ptS, LayerParams.vtSlicing, GDB_RT.GLOB) EgtMergeCurvesInCurveCompo( nCrvCopy) EgtChangeClosedCurveStartPoint( nCrvCopy, ptS, GDB_RT.GLOB) @@ -156,10 +156,7 @@ local function CreateSpiralVaseSolid( nCrvId, nSolidGrp, LayerParams, dStrand) end end - local nSrfId = EgtSurfTmBySewing( nSolidGrp, vSurfs) - if not nSrfId then - nSrfId = EgtSurfTmByTriangles( nSolidGrp, vSurfs) - end + local nSrfId = EgtSurfTmByTriangles( nSolidGrp, vSurfs) -- creazione del mezzo disco iniziale local nCap1 = CreateSpiralVaseCap( nSectId, - vtS, nSolidGrp) @@ -170,7 +167,7 @@ local function CreateSpiralVaseSolid( nCrvId, nSolidGrp, LayerParams, dStrand) -- cancello le curve usate per la costruzione EgtErase( nGrpTmp) - return EgtSurfTmBySewing( nSolidGrp, { nSrfId, nCap1, nCap2}) or EgtSurfTmByTriangles( nSolidGrp, { nSrfId, nCap1, nCap2}) + return EgtSurfTmByTriangles( nSolidGrp, { nSrfId, nCap1, nCap2}) end ---------------------------------------------------------------------- @@ -220,6 +217,36 @@ local function CreateDirectionArrow( nCrvId, nSolidGrp, vtSlicing, dStrand, nLay end +--------------------------------------------------------------------- +local function CreateRecursiveSolid( nCrvId, vSurfs, nSolidGrp, LayerParams, dStrand) + + -- tento la creazione del solido + local nSurf = CreateSolid( nCrvId, nSolidGrp, LayerParams, dStrand - 50 * GEO.EPS_SMALL) + if nSurf then + EgtErase( nCrvId) + table.insert( vSurfs, nSurf) + return true + else + -- se curva singola esco perchè non è possibile spezzare ulteriormente + local _, dParE = EgtCurveDomain( nCrvId) + if abs( dParE - 1) < GEO.EPS_SMALL then + EgtErase( nCrvId) + return false + end + -- se non si tratta di curva singola, spezzo a metà e tento sulle due sottocurve + local dParSplit = floor( dParE / 2 + 0.5) + local nCrvSplit = EgtSplitCurveAtParam( nCrvId, dParSplit) + if not nCrvSplit then + -- errore nello split + EgtErase( nCrvId) + return false + end + local bOk = CreateRecursiveSolid( nCrvId, vSurfs, nSolidGrp, LayerParams, dStrand) + bOk = bOk and CreateRecursiveSolid( nCrvSplit, vSurfs, nSolidGrp, LayerParams, dStrand) + return bOk + end +end + --------------------------------------------------------------------- local function CreateSolidFromCurve( nCrvId, nSolidGrp, LayerParams, nLayer) @@ -293,30 +320,21 @@ local function CreateSolidFromCurve( nCrvId, nSolidGrp, LayerParams, nLayer) end end - -- ritento spezzando la curva + -- ritento spezzando la curva in modo ricorsivo fino ad inidividuare delle sottocurve su cui è possibile calcolare il solido if not nSrfId then EgtOutLog( 'Warning : CreateSolid_2 failed') local nGrp = EgtGroup( nSolidGrp, Frame3d( ORIG(), LayerParams.vtSlicing), GDB_RT.GLOB) EgtRelocateGlob( nGuideId, nGrp) EgtApproxCurve( nGuideId, GDB_CA.LINES, 100 * GEO.EPS_SMALL) EgtRelocateGlob( nGuideId, nSolidGrp) - local nFirstCrv, nCrvNbr = EgtSplitCurveAtCorners( nGuideId, 30) - if nFirstCrv and nCrvNbr > 1 then - local nSrfIds = {} - for nInd2 = 0, nCrvNbr-1 do - local nSrfId2 = CreateSolid( nFirstCrv + nInd2, nSolidGrp, LayerParams, dStrand - 50 * GEO.EPS_SMALL) - EgtErase( nFirstCrv + nInd2) - if nSrfId2 then - table.insert( nSrfIds, nSrfId2) - end - end - if #nSrfIds == nCrvNbr then - nSrfId = EgtSurfTmBySewing( nSolidGrp, nSrfIds) - else - EgtOutLog( 'Warning : CreateSolid_3 failed') - end - else - EgtErase( nFirstCrv) + + local vSurfs = {} + local bOk = CreateRecursiveSolid( nGuideId, vSurfs, nSolidGrp, LayerParams, dStrand) + if #vSurfs > 0 then + nSrfId = EgtSurfTmBySewing( nSolidGrp, vSurfs) + end + if not nSrfId or bOk == false then + EgtOutLog( 'Warning : CreateSolid_3 failed') end EgtErase( nGrp) end