3dPrinting :

- corretto errore nel calcolo solidi con spiral vase
- nel calcolo solidi migliorata gestione caso problematico con split ricorsivo della curva guida.
This commit is contained in:
SaraP
2024-05-06 17:05:37 +02:00
parent f12d8b56c8
commit 4d342b56c2
+46 -28
View File
@@ -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