Compare commits

...

12 Commits

Author SHA1 Message Date
SaraP e015136592 3dPrinting 2.5e2 ;
- corretto errore nel lead in/lead out dei setti quando terminano su altro setto
- migliorie varie per lead in, lead out e link dei setti.
2023-05-24 08:26:27 +02:00
SaraP 72d1b61c6a 3dPrinting 2.5d5 :
- corretto errore nel trim dei setti.
2023-04-28 14:38:45 +02:00
SaraP 02fe05d5e1 3dPrinting 2.5d4 :
- corretto errore nel calcolo del lead out per setti.
2023-04-20 12:03:45 +02:00
SaraP 3c839716f8 3dPrinting :
- corretto errore nel collegamento setti.
2023-04-18 11:29:46 +02:00
SaraP 2fc63b0d25 3dPrinting :
- piccola correzione slicing.
2023-04-17 17:47:02 +02:00
SaraP 9c42a70c6a 3dPrinting 2.5d3 :
- migliorata gestione di setti con fori
- gestione di setti con link disegnato dall'utente dallo stesso lato del solido.
2023-04-17 17:17:59 +02:00
DarioS 922c5510c0 3dPrinting :
- in Generazione CN al salvataggio progetto si impone la nuova estensione "icrs".
2023-04-11 13:16:17 +02:00
DarioS 56ff8468f0 3dPrinting :
- aggiunto Version.lua alla compilazione.
2023-04-11 11:43:25 +02:00
SaraP 63efafde60 3dPrinting 2.5d1 :
- migliorata segnalazione errori.
2023-04-04 08:59:33 +02:00
SaraP 49c8361bc5 3dPrinting :
- nei FilledSolid il riempimento di tipo none viene realizzato con unica passata lungo il perimetro.
2023-03-22 11:52:45 +01:00
SaraP a7c7bd63ed 3dPrinting :
- migliorie nei riempimenti a zigzag per SolidFill
- gestione SolidFill con buchi.
2023-03-21 12:14:39 +01:00
Samuele Locatelli 4da4b8cf4d Merge branch 'develop' 2023-03-20 15:16:59 +01:00
8 changed files with 1178 additions and 529 deletions
+1
View File
@@ -16,3 +16,4 @@ REM Compilazione 32 e 64 bit
\EgtProg\Dll32\luac54 -o bin\CalcSolids.lua CalcSolids.lua \EgtProg\Dll32\luac54 -o bin\CalcSolids.lua CalcSolids.lua
\EgtProg\Dll32\luac54 -o bin\GcodeGenerate.lua GcodeGenerate.lua \EgtProg\Dll32\luac54 -o bin\GcodeGenerate.lua GcodeGenerate.lua
\EgtProg\Dll32\luac54 -o bin\Slicing.lua Slicing.lua \EgtProg\Dll32\luac54 -o bin\Slicing.lua Slicing.lua
\EgtProg\Dll32\luac54 -o bin\Version.lua Version.lua
+3
View File
@@ -109,6 +109,7 @@ KEY_START_RIB = "StartRib"
KEY_ORIGINAL_RIB = "OriginalRib" KEY_ORIGINAL_RIB = "OriginalRib"
KEY_LOOP_RIB = "LoopRib" KEY_LOOP_RIB = "LoopRib"
KEY_RIBS_USER_LINK = "RibWithUserLink" KEY_RIBS_USER_LINK = "RibWithUserLink"
KEY_RIBS_USER_LINK_SAME_SIDE = "RibUserLinkOnSameSide"
KEY_RIBS_USER_LINK_CCW = "RibUserLinkCCW" KEY_RIBS_USER_LINK_CCW = "RibUserLinkCCW"
KEY_RIBS_USER_LINK_ORDER = "RibUserLinkOrder" KEY_RIBS_USER_LINK_ORDER = "RibUserLinkOrder"
KEY_RIBS_USER_LINK_TOT = "RibsUserLinkParts" KEY_RIBS_USER_LINK_TOT = "RibsUserLinkParts"
@@ -152,6 +153,7 @@ KEY_INVERTED_CRV = "InvertedCrv"
KEY_CLOSED_CRV = "ClosedCrv" KEY_CLOSED_CRV = "ClosedCrv"
KEY_ASSOCIATED_SURF = "AssociatedSurf" KEY_ASSOCIATED_SURF = "AssociatedSurf"
KEY_ASSOCIATED_CRVS = "AssociatedCrvs" KEY_ASSOCIATED_CRVS = "AssociatedCrvs"
KEY_ORIGINAL_SURF = "OriginalSurf"
KEY_HAS_SOLIDS = "Solids" KEY_HAS_SOLIDS = "Solids"
KEY_BOX_MIN_Z = "PartBoxMinZ" KEY_BOX_MIN_Z = "PartBoxMinZ"
KEY_START_POINT = "StartPoint" KEY_START_POINT = "StartPoint"
@@ -284,6 +286,7 @@ SLICE_ADV_TYPE = {
--------------------------------------------------------------------- ---------------------------------------------------------------------
RIBS_GRP = "Ribs" RIBS_GRP = "Ribs"
RIBS_CRV = "Rib" RIBS_CRV = "Rib"
RIBS_LOOP_GRP = "RibsLoops"
SHELL_NBR_GRP = "ShellNbrRegions" SHELL_NBR_GRP = "ShellNbrRegions"
SHELL_NBR_CRV = "ShellNbrRegion" SHELL_NBR_CRV = "ShellNbrRegion"
+802 -220
View File
File diff suppressed because it is too large Load Diff
+77 -30
View File
@@ -15,6 +15,13 @@ local AMD = require( 'AddManData')
--------------------------------------------------------------------- ---------------------------------------------------------------------
local s_nPartId local s_nPartId
-- costanti
local TOLER = 0.05
local MID_TOLER = 0.1
local BIG_TOLER = 2.0
local MIN_LEN = 20.0
local MIN_AREA = 25.0
--------------------------------------------------------------------- ---------------------------------------------------------------------
local function ComputeZSlices( dSliceStep, dZmin, dDeltaZ, dZmax) local function ComputeZSlices( dSliceStep, dZmin, dDeltaZ, dZmax)
@@ -70,6 +77,49 @@ local function ComputeMaxH( vIds, frSlicing, HMax, dSliceStep)
return GEO.INFINITO return GEO.INFINITO
end end
--------------------------------------------------------------------
local function ReadParam( nId, sKey, sType, defVal, table)
-- verifico se info nell'oggetto specifico
local info = EgtGetInfo( nId, sKey, sType)
-- altrimenti recupero info dai parametri generali
if info == nil then info = EgtGetInfo( s_nPartId, sKey, sType) end
-- o assegno valore di default
if info == nil then info = defVal end
-- se presente, inserisco l'info nella tabella
if table then table[sKey] = info end
return info
end
--------------------------------------------------------------------
local function ExtractRibsLoops( nRibsGrp, nStmId)
local nLoopGrp = EgtGroup( s_nPartId)
EgtSetName( nLoopGrp, RIBS_LOOP_GRP)
EgtSetStatus( nLoopGrp, GDB_ST.OFF)
-- recupero tutti i setti
local vIds = EgtGetAllInGroup( nRibsGrp)
for i = 1, #vIds do
-- se trimesh
if EgtGetType( vIds[i]) == GDB_TY.SRF_MESH then
-- trim con il solido
local nCopy = EgtCopyGlob( vIds[i], nLoopGrp)
local nType = ReadParam( vIds[i], KEY_RIBS_TYPE, 'i', RIB_TYPE.INTERNAL)
EgtSurfTmCut( nCopy, nStmId, nType ~= RIB_TYPE.EXTERNAL, false)
-- estraggo i contorni
local nCrv, nCnt = EgtExtractSurfTmLoops( nCopy, nLoopGrp)
if nCrv then
-- assegno nome che permetta di ricondurli alla superficie da cui derivano
for nId = nCrv, nCrv + nCnt - 1 do
EgtSetName( nId, SURF_LOOP .. tostring( vIds[i]))
end
end
end
end
end
-------------------------------------------------------------------- --------------------------------------------------------------------
local function AdjustAuxSolids( nSolidsLay) local function AdjustAuxSolids( nSolidsLay)
@@ -105,21 +155,6 @@ local function AdjustAuxSolids( nSolidsLay)
EgtErase( nGrpTmp) EgtErase( nGrpTmp)
end end
--------------------------------------------------------------------
local function ReadParam( nId, sKey, sType, defVal, table)
-- verifico se info nell'oggetto specifico
local info = EgtGetInfo( nId, sKey, sType)
-- altrimenti recupero info dai parametri generali
if info == nil then info = EgtGetInfo( s_nPartId, sKey, sType) end
-- o assegno valore di default
if info == nil then info = defVal end
-- se presente, inserisco l'info nella tabella
if table then table[sKey] = info end
return info
end
-------------------------------------------------------------------- --------------------------------------------------------------------
local function GetRibParams( nId) local function GetRibParams( nId)
@@ -171,7 +206,7 @@ local function GetAuxSolidsParams( nId)
end end
-------------------------------------------------------------------- --------------------------------------------------------------------
local function SlicingExtraObjects( vtSlicing, nLay, nType, sNameGrp, sName, nStmId) local function SlicingExtraObjects( vtSlicing, nLay, nType, sNameGrp, sName, vErr, nStmId)
-- recupero gli oggeti di cui fare slicing -- recupero gli oggeti di cui fare slicing
local vIds = EgtGetAllInGroup( nLay) local vIds = EgtGetAllInGroup( nLay)
@@ -203,7 +238,6 @@ local function SlicingExtraObjects( vtSlicing, nLay, nType, sNameGrp, sName, nSt
if vParams[KEY_SHELL_NBR_DIFF] == 0 then bToBeDone = false end if vParams[KEY_SHELL_NBR_DIFF] == 0 then bToBeDone = false end
elseif nType == TYPE.AUX_SOLID then elseif nType == TYPE.AUX_SOLID then
vParams = GetAuxSolidsParams( vIds[i]) vParams = GetAuxSolidsParams( vIds[i])
if vParams[KEY_AUX_SOLIDS_INFILL] == INFILL_TYPE.NONE then bToBeDone = false end
end end
table.insert( tabParams, vParams) table.insert( tabParams, vParams)
table.insert( vToBeDone, bToBeDone) table.insert( vToBeDone, bToBeDone)
@@ -234,7 +268,8 @@ local function SlicingExtraObjects( vtSlicing, nLay, nType, sNameGrp, sName, nSt
-- recupero quota per slicing -- recupero quota per slicing
local dZ = EgtGetInfo( nLayId, KEY_SLICE_REAL_Z, 'd') local dZ = EgtGetInfo( nLayId, KEY_SLICE_REAL_Z, 'd')
local dDeltaZ = EgtGetInfo( nLayId, KEY_SLICE_DELTAZ, 'd') local dDeltaZ = EgtGetInfo( nLayId, KEY_SLICE_DELTAZ, 'd')
-- creo gruppo per le costolature local nLayCnt = EgtGetInfo( nLayId, KEY_SLICE_NBR, 'i')
-- creo gruppo per gli oggetti
local nGrp = EgtGroup( nLayId) local nGrp = EgtGroup( nLayId)
EgtSetName( nGrp, sNameGrp) EgtSetName( nGrp, sNameGrp)
EgtSetStatus( nGrp, GDB_ST.OFF) EgtSetStatus( nGrp, GDB_ST.OFF)
@@ -257,6 +292,7 @@ local function SlicingExtraObjects( vtSlicing, nLay, nType, sNameGrp, sName, nSt
end end
if nSrfCnt > 0 or bOpen then if nSrfCnt > 0 or bOpen then
EgtOutLog( 'Warning : recalc at layer '.. EgtNumToString( nLayCnt) .. ' (object)')
-- elimino vecchio risultato -- elimino vecchio risultato
for j = nNewId, nNewId + nPntCnt + nCrvCnt + nSrfCnt - 1 do for j = nNewId, nNewId + nPntCnt + nCrvCnt + nSrfCnt - 1 do
EgtErase( j) EgtErase( j)
@@ -266,18 +302,34 @@ local function SlicingExtraObjects( vtSlicing, nLay, nType, sNameGrp, sName, nSt
end end
if nNewId then if nNewId then
-- rimuovo punti -- rimuovo punti
for nId = nNewId, nNewId + nPntCnt -1 do for nId = nNewId, nNewId + nPntCnt -1 do
EgtErase( nId) EgtErase( nId)
end end
-- concateno le curve
local vChain = {}
for nId = nNewId + nPntCnt, nNewId + nPntCnt + nCrvCnt - 1 do
table.insert( vChain, nId)
end
local nChainId, nCnt = EgtCurveCompoByChain( nGrp, vChain, ORIG(), true, GDB_RT.LOC, BIG_TOLER)
-- rinomino le curve, correggo di DeltaZ e assegno parametri -- rinomino le curve, correggo di DeltaZ e assegno parametri
for nId = nNewId + nPntCnt, nNewId + nPntCnt + nCrvCnt - 1 do for nId = nNewId + nPntCnt, nNewId + nPntCnt + nCrvCnt - 1 do
EgtSetName( nId, sName .. tostring( i)) EgtSetName( nId, sName .. tostring( i))
EgtMove( nId, - ( dDeltaZ + dCorr) * vtSlicing) EgtMove( nId, - ( dDeltaZ + dCorr) * vtSlicing)
EgtSetInfo( nId, KEY_ORIGINAL_SURF, vIds[i])
for sKey, sVal in pairs( tabParams[i]) do for sKey, sVal in pairs( tabParams[i]) do
EgtSetInfo( nId, sKey, sVal) EgtSetInfo( nId, sKey, sVal)
end end
-- se ho ancora curve aperte, segnalo errore
if nType ~= TYPE.RIB and not EgtCurveIsClosed( nId) then
EgtOutLog( 'Error : hole in object (layer '.. EgtNumToString( nLayCnt) ..') - CalcSlices')
table.insert( vErr, nLayCnt)
end
end end
-- rimuovo superfici -- rimuovo superfici
for nId = nNewId + nPntCnt + nCrvCnt, nNewId + nPntCnt + nCrvCnt + nSrfCnt - 1 do for nId = nNewId + nPntCnt + nCrvCnt, nNewId + nPntCnt + nCrvCnt + nSrfCnt - 1 do
EgtErase( nId) EgtErase( nId)
@@ -337,7 +389,7 @@ local function SlicingNoSolid( nRibsLay, vZSlices, dDeltaZStart, dZmin, frSlicin
if EgtProcessEvents( EgtIf( PRINT, 100, 0) + 20, 0) == 1 then return false end if EgtProcessEvents( EgtIf( PRINT, 100, 0) + 20, 0) == 1 then return false end
-- slicing dei setti -- slicing dei setti
SlicingExtraObjects( vtSlicing, nRibsLay, TYPE.RIB, RIBS_GRP, RIBS_CRV) SlicingExtraObjects( vtSlicing, nRibsLay, TYPE.RIB, RIBS_GRP, RIBS_CRV, vErr)
if EgtProcessEvents( EgtIf( PRINT, 100, 0) + 100, 0) == 1 then return false end if EgtProcessEvents( EgtIf( PRINT, 100, 0) + 100, 0) == 1 then return false end
return true return true
@@ -345,13 +397,6 @@ end
--------------------------------------------------------------------- ---------------------------------------------------------------------
local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicing, vErr) local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicing, vErr)
-- costanti
local TOLER = 0.05
local MID_TOLER = 0.1
local BIG_TOLER = 2.0
local MIN_LEN = 20.0
local MIN_AREA = 25.0
local vtSlicing = frSlicing:getVersZ() local vtSlicing = frSlicing:getVersZ()
@@ -395,7 +440,7 @@ local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicin
dDeltaZ = dDeltaZ + EgtIf( vtRecalc and vtRecalc:getZ() > 0, -0.01, 0.01) dDeltaZ = dDeltaZ + EgtIf( vtRecalc and vtRecalc:getZ() > 0, -0.01, 0.01)
-- eseguo il ricalcolo solo a quella quota -- eseguo il ricalcolo solo a quella quota
EgtPlaneSurfTmInters( ORIG() + ( dPosZ + dDeltaZ) * vtSlicing, vtSlicing, nStmId, nLayId, GDB_RT.GLOB, TOLER) EgtPlaneSurfTmInters( ORIG() + ( dPosZ + dDeltaZ) * vtSlicing, vtSlicing, nStmId, nLayId, GDB_RT.GLOB, TOLER)
EgtOutLog( 'Warning : Recalc at Lay'.. EgtNumToString( nLayCnt)) EgtOutLog( 'Warning : recalc at layer '.. EgtNumToString( nLayCnt))
end end
EgtSetInfo( nLayId, KEY_SLICE_DELTAZ, dDeltaZ) EgtSetInfo( nLayId, KEY_SLICE_DELTAZ, dDeltaZ)
@@ -586,6 +631,7 @@ local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicin
-- se vero errore lo segnalo -- se vero errore lo segnalo
if bErr then if bErr then
EgtOutLog( 'Error : hole in solid (layer '.. EgtNumToString( nLayCnt) ..') - CalcSlices')
table.insert( vErr, nLayCnt) table.insert( vErr, nLayCnt)
-- cambio nome al layer -- cambio nome al layer
EgtSetName( nLayId, '__' .. SLICE_LAYER .. EgtNumToString( nLayCnt)) EgtSetName( nLayId, '__' .. SLICE_LAYER .. EgtNumToString( nLayCnt))
@@ -617,14 +663,15 @@ local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicin
-- costolature -- costolature
local nRibsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_RIBS) local nRibsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_RIBS)
if nRibsLay then if nRibsLay then
SlicingExtraObjects( vtSlicing, nRibsLay, TYPE.RIB, RIBS_GRP, RIBS_CRV, nStmId) ExtractRibsLoops( nRibsLay, nStmId)
SlicingExtraObjects( vtSlicing, nRibsLay, TYPE.RIB, RIBS_GRP, RIBS_CRV, vErr, nStmId)
end end
if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 1) / ( #vZSlices + 3) * 100, 0) == 1 then return false end if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 1) / ( #vZSlices + 3) * 100, 0) == 1 then return false end
-- solidi per regioni con diverso numero di passate -- solidi per regioni con diverso numero di passate
local nShellNbrLay = EgtGetFirstNameInGroup( s_nPartId, LAY_SHELL_NBR) local nShellNbrLay = EgtGetFirstNameInGroup( s_nPartId, LAY_SHELL_NBR)
if nShellNbrLay then if nShellNbrLay then
SlicingExtraObjects( vtSlicing, nShellNbrLay, TYPE.EXTRA_SHELL, SHELL_NBR_GRP, SHELL_NBR_CRV, nStmId) SlicingExtraObjects( vtSlicing, nShellNbrLay, TYPE.EXTRA_SHELL, SHELL_NBR_GRP, SHELL_NBR_CRV, vErr, nStmId)
end end
if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 2) / ( #vZSlices + 3) * 100, 0) == 1 then return false end if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 2) / ( #vZSlices + 3) * 100, 0) == 1 then return false end
@@ -632,7 +679,7 @@ local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicin
local nAuxSolidsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_AUX_SOLIDS) local nAuxSolidsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_AUX_SOLIDS)
if nAuxSolidsLay then if nAuxSolidsLay then
AdjustAuxSolids( nAuxSolidsLay) AdjustAuxSolids( nAuxSolidsLay)
SlicingExtraObjects( vtSlicing, nAuxSolidsLay, TYPE.AUX_SOLID, AUX_SOLIDS_GRP, AUX_SOLIDS_CRV, nStmId) SlicingExtraObjects( vtSlicing, nAuxSolidsLay, TYPE.AUX_SOLID, AUX_SOLIDS_GRP, AUX_SOLIDS_CRV, vErr, nStmId)
end end
if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 3) / ( #vZSlices + 3) * 100, 0) == 1 then return false end if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 3) / ( #vZSlices + 3) * 100, 0) == 1 then return false end
end end
+286 -276
View File
@@ -349,18 +349,25 @@ local function AddRetraction( nCrvId, vtSlicing, dCoastingLen, dWipeLen, dWipeDi
nCopyId = nil nCopyId = nil
EgtTrimCurveEndAtLen( nWipeId, dWipeLen) EgtTrimCurveEndAtLen( nWipeId, dWipeLen)
else else
-- se extra shell, infill a zigzag, spiral vase o rib che non termina sulla parete
local vtDir = EgtEV( nCoastingId or nCrvId, GDB_ID.ROOT) local vtDir = EgtEV( nCoastingId or nCrvId, GDB_ID.ROOT)
local dAng = dWipeDir + s_nDefaultWipeAng local dAng = dWipeDir + s_nDefaultWipeAng
-- verifico se necessario cambiare il segno all'angolo -- verifico se necessario cambiare il segno all'angolo
local bChangeSign = false local bChangeSign = false
-- riempimento
if nType == TYPE.INFILL or nType == TYPE.AUX_SOLID then if nType == TYPE.INFILL or nType == TYPE.AUX_SOLID then
local vtS = EgtGetInfo( nCrvId, KEY_ZIG_ZAG_DIR, 'v') local vtS = EgtGetInfo( nCrvId, KEY_ZIG_ZAG_DIR, 'v')
local bSameDir = AreSameVectorApprox( vtS, vtDir) local bSameDir = AreSameVectorApprox( vtS, vtDir)
bChangeSign = ( bInverted == bSameDir) bChangeSign = ( bInverted == bSameDir)
else -- rib
elseif nType == TYPE.RIB then
local bInvertStrandOrder = EgtGetInfo( nCrvId, KEY_RIBS_INVERT_STRAND_ORDER, 'b') or false
local bInvertDir = EgtGetInfo( nCrvId, KEY_RIBS_INVERT_DIR, 'b') or false
bChangeSign = ( bInvertDir ~= bInvertStrandOrder)
-- extra shell
elseif nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL then
bChangeSign = bInverted bChangeSign = bInverted
end end
vtDir:rotate( vtSlicing, EgtIf( bChangeSign, - dAng, dAng)) vtDir:rotate( vtSlicing, EgtIf( bChangeSign, - dAng, dAng))
local ptS = EgtEP( nCoastingId or nCrvId, GDB_ID.ROOT) local ptS = EgtEP( nCoastingId or nCrvId, GDB_ID.ROOT)
local ptE = FindWipeEndPoint( ptS, vtDir, dWipeLen, vtSlicing) local ptE = FindWipeEndPoint( ptS, vtDir, dWipeLen, vtSlicing)
@@ -561,318 +568,329 @@ end
------------------------------------------------------------------- -------------------------------------------------------------------
--------------------------- RIBS ----------------------------------- --------------------------- RIBS -----------------------------------
-------------------------------------------------------------------- --------------------------------------------------------------------
local function VerifyRibsLink( nLinkId, nCurr, nNext, dStrand, nGrpTmp) local function VerifyRibsLink( nLinkId, nCurr, nNext, dStrand, nGrpTmp, bCheckLinked)
local dLen = EgtCurveLength( nLinkId)
if dLen < dStrand + GEO.EPS_SMALL then
return true
end
local nGrp = EgtGetParent( nCurr) -- regione occupata dal link
local nLinkLoc = EgtCopyGlob( nLinkId, nGrpTmp)
-- verifico se il link interseca le due curve nell'altro estremo local nOverlap = EgtGetInfo( nCurr, KEY_RIBS_OVERLAP, 'i')
local ptS = EgtSP( nCurr) local nSrfLink = EgtSurfFrFatCurve( nGrpTmp, nLinkId, dStrand * ( 1 - nOverlap / 100) - 100 * GEO.EPS_SMALL, false)
local ptE = EgtEP( nNext) if not nSrfLink then
local dParS = EgtCurveParamAtPoint( nLinkId, ptS)
local dParE = EgtCurveParamAtPoint( nLinkId, ptE)
if nCurr ~= nNext and ( dParS or dParE) then
return false return false
end end
-- verifico se si trova nella regione ammissibile -- verifico se interseca altri setti
local nSurfId = EgtGetInfo( nCurr, KEY_ASSOCIATED_SURF, 'i') local vRibsIds = EgtGetNameInGroup( EgtGetParent( nCurr), RIBS_CRV .. '*')
local nRes = EgtCurveWithRegionClassify( nLinkId, nSurfId)
local nType1 = EgtGetInfo( nCurr, KEY_RIBS_TYPE, 'i')
local nType2 = EgtGetInfo( nNext, KEY_RIBS_TYPE, 'i')
if ( nType1 == RIB_TYPE.INTERNAL or nType1 == RIB_TYPE.SUPPORT) and ( nType2 == RIB_TYPE.INTERNAL or nType2 == RIB_TYPE.SUPPORT) then
if nRes == GDB_CRC.OUT or nRes == GDB_CRC.INTERS then
return false
end
elseif nType1 == RIB_TYPE.EXTERNAL and nType2 == RIB_TYPE.EXTERNAL then
if nRes == GDB_CRC.IN or nRes == GDB_CRC.INTERS then
return false
end
end
-- verifico se il link interseca una delle altre costolature
local vRibsIds = EgtGetNameInGroup( nGrp, RIBS_CRV .. '*')
local nLinkSrf = EgtSurfFrFatCurve( nGrpTmp, nLinkId, 0.5 * dStrand, false) or GDB_ID.NULL
for i = 1, #vRibsIds do for i = 1, #vRibsIds do
if vRibsIds[i] ~= nCurr and vRibsIds[i] ~= nNext then if vRibsIds[i] ~= nCurr and vRibsIds[i] ~= nNext then
local nRes = EgtCurveWithRegionClassify( vRibsIds[i], nLinkSrf) local nRibsLoc = EgtCopyGlob( vRibsIds[i], nGrpTmp)
if nRes == GDB_CRC.INTERS then local nRes = EgtCurveWithRegionClassify( vRibsIds[i], nSrfLink)
if nRes ~= GDB_CRC.OUT then
return false return false
end end
end end
end end
-- eventuale verifica con setti coinvolti dal link ( da fare solo se collegamento fra passate di setti diversi)
if bCheckLinked and dLen > 3 * dStrand then
-- regione occupata dai setti
local nSrfRibs = EgtSurfFrFatCurve( nGrpTmp, nCurr, dStrand, false) or GDB_ID.NULL
local nSrfRibs2 = EgtSurfFrFatCurve( nGrpTmp, nNext, dStrand, false) or GDB_ID.NULL
EgtSurfFrAdd( nSrfRibs, nSrfRibs2)
-- verifico che i tratti fuori abbiano lunghezza maggiore di quelli dentro
local nRes, nCnt = EgtTrimCurveWithRegion( nLinkLoc, nSrfRibs, false, false)
if nCnt == 0 then return false end
local dResLen = EgtCurveLength( nRes)
if dResLen < ( dLen - dResLen) - GEO.EPS_SMALL then
return false
end
-- verifico non passi per estremo errato
local dParTest1 = EgtCurveParamAtPoint( nLinkId, EgtSP( nCurr, GDB_ID.ROOT), 100 * GEO.EPS_SMALL, GDB_RT.GLOB)
local dParTest2 = EgtCurveParamAtPoint( nLinkId, EgtEP( nNext, GDB_ID.ROOT), 100 * GEO.EPS_SMALL, GDB_RT.GLOB)
if dParTest1 or dParTest2 then
return false
end
end
-- verifico se si trova nella regione ammissibile ( per caso ForcedLink)
local nSurfId = EgtGetInfo( nCurr, KEY_ASSOCIATED_SURF, 'i')
if nSurfId then
local nSrfLoc = EgtCopyGlob( nSurfId, nGrpTmp)
local nRes = EgtCurveWithRegionClassify( nLinkId, nSurfId)
local nType = EgtGetInfo( nCurr, KEY_RIBS_TYPE, 'i')
if nRes == GDB_CRC.INTERS or ( ( nType == RIB_TYPE.INTERNAL or nType == RIB_TYPE.SUPPORT) and nRes == GDB_CRC.OUT) or ( nType == RIB_TYPE.EXTERNAL and nRes == GDB_CRC.IN) then
return false
end
end
return true return true
end end
-------------------------------------------------------------------- --------------------------------------------------------------------
local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink, vtSlicing, nGrpTmp) local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink, bCheckLinked, vtSlicing, nGrpTmp)
local ptS = EgtEP( nCurr) local ptS = EgtEP( nCurr)
local ptE = EgtSP( nNext) local ptE = EgtSP( nNext)
local nCrvId = EgtGetFirstNameInGroup( nLoopGrp, TRIM_SURF_LOOP) local nCrvId = EgtGetFirstInGroup( nLoopGrp)
-- recupero la curva di offset su cui calcolare link -- recupero la curva di offset su cui calcolare link
while nCrvId do while nCrvId do
local dParS = EgtCurveParamAtPoint( nCrvId, ptS, 10 * GEO.EPS_SMALL) local dParS = EgtCurveParamAtPoint( nCrvId, ptS, 10 * GEO.EPS_SMALL)
local dParE = EgtCurveParamAtPoint( nCrvId, ptE, 10 * GEO.EPS_SMALL) local dParE = EgtCurveParamAtPoint( nCrvId, ptE, 10 * GEO.EPS_SMALL)
if dParS and dParE then if dParS and dParE then
local bInvert = false
local bClosed = EgtCurveIsClosed( nCrvId) -- verifico i due percorsi possibili dParS->dParE e dParE->dParS
if bClosed then local nCopyId1 = EgtCopyGlob( nCrvId, nCurr, GDB_IN.AFTER)
-- se la curva è chiusa verifico i due percorsi possibili dParS->dParE e dParE->dParS local nCopyId2 = EgtCopyGlob( nCrvId, nCurr, GDB_IN.AFTER)
local nCopyId1 = EgtCopyGlob( nCrvId, nCurr, GDB_IN.AFTER) EgtTrimCurveStartEndAtParam( nCopyId1, dParS, dParE)
local nCopyId2 = EgtCopyGlob( nCrvId, nCurr, GDB_IN.AFTER) EgtTrimCurveStartEndAtParam( nCopyId2, dParE, dParS)
EgtTrimCurveStartEndAtParam( nCopyId1, dParS, dParE) EgtInvertCurve( nCopyId2)
EgtTrimCurveStartEndAtParam( nCopyId2, dParE, dParS)
EgtInvertCurve( nCopyId2) local nLinkId
local dLen1 = EgtCurveLength( nCopyId1)
local dLen1 = EgtCurveLength( nCopyId1) local dLen2 = EgtCurveLength( nCopyId2)
local dLen2 = EgtCurveLength( nCopyId2) if dLen1 > dLen2 then
if dLen1 > dLen2 then nLinkId = nCopyId2
bInvert = true
dParS, dParE = dParE, dParS
end
EgtErase( nCopyId1) EgtErase( nCopyId1)
else
nLinkId = nCopyId1
EgtErase( nCopyId2) EgtErase( nCopyId2)
end end
local nCopyId = EgtCopyGlob( nCrvId, nLoopGrp)
local nLinkId = EgtCopyGlob( nCrvId, nCurr, GDB_IN.AFTER)
if dParS > dParE and not bClosed then
bInvert = true
dParS, dParE = dParE, dParS
end
EgtTrimCurveStartEndAtParam( nLinkId, dParS, dParE)
EgtSetInfo( nLinkId, KEY_TYPE, TYPE.RIB) EgtSetInfo( nLinkId, KEY_TYPE, TYPE.RIB)
EgtSetName( nLinkId, LINK_CRV) EgtSetName( nLinkId, LINK_CRV)
EgtModifyCurveExtrusion( nLinkId, vtSlicing, GDB_RT.GLOB) EgtModifyCurveExtrusion( nLinkId, vtSlicing, GDB_RT.GLOB)
if bInvert then EgtInvertCurve( nLinkId) end
-- verifico se è valido -- verifico se è valido
local bValid = VerifyRibsLink( nLinkId, nCurr, nNext, dStrand, nGrpTmp) local bValid = VerifyRibsLink( nLinkId, nCurr, nNext, dStrand, nGrpTmp, bCheckLinked)
if not bValid then if bValid then
EgtErase( nLinkId) return nLinkId
EgtErase( nCopyId)
return
end
-- elimino dalle curve di contorno il link appena trovato
if bClosed then
EgtTrimCurveStartEndAtParam( nCrvId, dParE, dParS)
EgtErase( nCopyId)
else else
if dParS < GEO.EPS_SMALL then EgtErase( nLinkId)
-- forzare la fine della curva nel suo inizio significa cancellarla completamente
EgtErase( nCrvId)
else
EgtTrimCurveEndAtParam( nCrvId, dParS)
end
local _, dEnd = EgtCurveDomain( nCopyId)
if abs( dParE - dEnd) < GEO.EPS_SMALL then
-- forzare l'inizio della curva nella sua fine significa cancellarla completamente
EgtErase( nCopyId)
else
EgtTrimCurveStartAtParam( nCopyId, dParE)
end
end end
return nLinkId
end end
nCrvId = EgtGetNextName( nCrvId, TRIM_SURF_LOOP) nCrvId = EgtGetNext( nCrvId)
end end
-- se non ho trovato un collegamento sul bordo, creo una linea tra ptS e ptE -- se non ho trovato un collegamento lungo bordi ma link deve esserci creo una linea tra ptS e ptE
if bForceLink then if bForceLink then
local nLinkId = EgtCurveCompoFromPoints( EgtGetParent( nCurr), {ptS, ptE}) local nLinkId = EgtCurveCompoFromPoints( EgtGetParent( nCurr), {ptS, ptE})
local bValid = VerifyRibsLink( nLinkId, nCurr, nNext, dStrand, nGrpTmp) EgtSetInfo( nLinkId, KEY_TYPE, TYPE.RIB)
EgtSetName( nLinkId, LINK_CRV)
EgtModifyCurveExtrusion( nLinkId, vtSlicing, GDB_RT.GLOB)
EgtRelocateGlob( nLinkId, nCurr, GDB_IN.AFTER)
local bValid = VerifyRibsLink( nLinkId, nCurr, nNext, dStrand, nGrpTmp, bCheckLinked)
if bValid then if bValid then
EgtSetInfo( nLinkId, KEY_TYPE, TYPE.RIB) return nLinkId
EgtSetName( nLinkId, LINK_CRV)
EgtModifyCurveExtrusion( nLinkId, vtSlicing, GDB_RT.GLOB)
EgtRelocateGlob( nLinkId, nCurr, GDB_IN.AFTER)
else else
EgtErase( nLinkId) EgtErase( nLinkId)
return
end end
end end
return
end end
-------------------------------------------------------------------- --------------------------------------------------------------------
local function VerifyRibsLead( nId, nRibId, dStrand, bInVsOut, nGrpTmp) local function VerifyRibsLead( nId, nRibId, dStrand, bInVsOut, nGrpTmp)
local nGrp = EgtGetParent( nRibId)
local nLeadId = EgtCopyGlob( nId, nGrp)
if bInVsOut then
EgtExtendCurveStartByLen( nLeadId, dStrand * 0.5)
else
EgtExtendCurveEndByLen( nLeadId, dStrand * 0.5)
end
-- verifico che intersechi solo l'estremo corretto local dLen = EgtCurveLength( nId)
if not EgtCurveIsClosed( nRibId) then if dLen < dStrand + GEO.EPS_SMALL then
local pt = EgtIf( bInVsOut, EgtEP( nRibId), EgtSP( nRibId)) return true
local dPar = EgtCurveParamAtPoint( nLeadId, pt) end
if dPar then
EgtErase( nLeadId) -- regione occupata dal lead
return false local nLeadLoc = EgtCopyGlob( nId, nGrpTmp)
local nOverlap = EgtGetInfo( nRibId, KEY_RIBS_OVERLAP, 'i')
local nSrfLead = EgtSurfFrFatCurve( nGrpTmp, nId, dStrand * ( 1 - nOverlap / 100) - 100 * GEO.EPS_SMALL, false)
if not nSrfLead then
return false
end
-- individuo eventuale lead in o link relativo al setto corrente
local nCurrLI
local nCurrLink
if not bInVsOut then
local nPrev = EgtGetPrev( nRibId)
if nPrev and EgtGetName( nPrev) == LEAD_IN_CRV then
nCurrLI = nPrev
elseif nPrev and EgtGetName( nPrev) == LINK_CRV then
nCurrLink = nPrev
end end
end end
local pt1 = EgtIf( bInVsOut, EgtSP( nLeadId), EgtEP( nLeadId)) -- verifico se interseca altri setti, lead in, lead out o collegamenti
local pt2 = EgtIf( bInVsOut, EgtEP( nRibId), EgtSP( nRibId)) local nCurrId = EgtGetFirstNameInGroup( EgtGetParent( nRibId), RIBS_CRV .. '*')
if dist( pt1, pt2) < dStrand + GEO.EPS_SMALL then -- verifico se il primo setto ha lead in da controllare
EgtErase( nLeadId) local nPrevId = EgtGetPrev( nCurrId)
return false if nPrevId and EgtGetName( nPrevId) == LEAD_IN_CRV then nCurrId = nPrevId end
while nCurrId do
-- salto i i wipe ( non sono materiale depositato) e i tratti relativi al setto corrente
if not EgtStartsWith( EgtGetName( nCurrId), WIPE_CRV) and nCurrId ~= nCurrLI and nCurrId ~= nRibId and nCurrId ~= nId and nCurrId ~= nCurrLink then
local nRibLoc = EgtCopyGlob( nCurrId, nGrpTmp)
local nRes = EgtCurveWithRegionClassify( nRibLoc, nSrfLead)
if nRes ~= GDB_CRC.OUT then
return false
end
end
nCurrId = EgtGetNext( nCurrId)
end end
local _, dParE = EgtCurveDomain( nLeadId) -- verifiche con il setto corrente
local vtDir = EgtMV( nRibId) -- verifico non passi da altro estremo
local dParTest = EgtCurveParamAtPoint( nLeadLoc, EgtIf( bInVsOut, EgtEP( nRibId, GDB_ID.ROOT), EgtSP( nRibId, GDB_ID.ROOT)), 100 * GEO.EPS_SMALL, GDB_RT.GLOB)
if dParTest then
return false
end
-- verifico se tratti lineari paralleli al setto sono sufficientemente lontani
local _, dParE = EgtCurveDomain( nLeadLoc)
local nRibLoc = EgtCopyGlob( nRibId, nGrpTmp)
local vtDir = EgtMV( nRibLoc)
local dParCrv = 1 local dParCrv = 1
local dTol = 10 * GEO.EPS_SMALL local dTol = 10 * GEO.EPS_SMALL
for dParCrv = 1, dParE do for dParCrv = 1, dParE do
local vtS = EgtUV( nLeadId, dParCrv - 1, 1) local vtS = EgtUV( nLeadLoc, dParCrv - 1, 1)
local vtE = EgtUV( nLeadId, dParCrv, -1) local vtE = EgtUV( nLeadLoc, dParCrv, -1)
-- se tratto lineare allineato con la direzione del setto verifico sia sufficientemente lontano local dTol = 10 * GEO.EPS_SMALL
if AreSameVectorApprox( vtS, vtE) and ( (vtS - vtDir):sqlen() < dTol * dTol or (vtS + vtDir):sqlen() < dTol * dTol) then if AreSameVectorApprox( vtS, vtE) and ( (vtS - vtDir):sqlen() < dTol * dTol or ( vtS + vtDir):sqlen() < dTol * dTol) then
local dDist = EgtPointCurveDist( EgtUP( nLeadId, dParCrv - 0.5), nRibId) local dDist = EgtPointCurveDist( EgtUP( nLeadLoc, dParCrv - 0.5), nRibLoc)
EgtPoint( nGrpTmp, EgtUP( nLeadLoc, dParCrv - 0.5))
EgtCopyGlob( nLeadLoc, nGrpTmp)
if dDist < dStrand + GEO.EPS_SMALL then if dDist < dStrand + GEO.EPS_SMALL then
EgtErase( nLeadId)
return false return false
end end
end end
end end
-- verifico non intersechi altri setti -- verifiche con eventuale lead in
local vRibsIds = EgtGetNameInGroup( EgtGetParent( nRibId), RIBS_CRV .. '*') if nCurrLI then
local nLeadLoc = EgtCopyGlob( nLeadId, nGrpTmp) local nLeadInLoc = EgtCopyGlob( nCurrLI, nGrpTmp)
for i = 1, #vRibsIds do -- verifico se intersezione fra curve
if vRibsIds[i] ~= nRibId then local _, nPnt, nCrv = EgtCurveCurveInters( nLeadLoc, nLeadInLoc, nGrpTmp)
local nCrvLoc = EgtCopyGlob( vRibsIds[i], nGrpTmp) if nPnt ~= 0 or nCrv ~= 0 then
local ptInt = EgtIP( nLeadLoc, nCrvLoc, ORIG()) return false
if ptInt then
EgtErase( nLeadId)
return false
end
end end
end local dLeadInLen = EgtCurveLength( nLeadInLoc)
if dLeadInLen > dStrand + GEO.EPS_SMALL then
-- se lead out verifico non si sovrapponga al lead in -- verifico di avere un solo tratto esterno di lunghezza sufficiente
if not bInVsOut then local nRes, nCnt = EgtTrimCurveWithRegion( nLeadInLoc, nSrfLead, false, false)
-- recupero il lead in if nCnt ~= 1 then
local nPrev = EgtGetPrev( nRibId) return false
if nPrev and EgtGetName( nPrev) == LEAD_IN_CRV then else
local nSrfTot = EgtSurfFrFatCurve( EgtGetParent( nLeadId), nPrev, 0.5 * dStrand, false) local dLen = EgtCurveLength( nRes)
if nSrfTot then if dLen < dStrand / 2 + GEO.EPS_SMALL then
local nRes = EgtCurveWithRegionClassify( nLeadId, nSrfTot)
if nRes == GDB_CRC.IN or nRes == GDB_CRC.INTERS then
EgtErase( nSrfTot)
EgtErase( nLeadId)
return false return false
end end
else
nSrfTot = EgtSurfFrFatCurve( EgtGetParent( nLeadId), nLeadId, 0.5 * dStrand, false)
if nSrfTot then
local nRes = EgtCurveWithRegionClassify( nPrev, nSrfTot)
if nRes == GDB_CRC.IN or nRes == GDB_CRC.INTERS then
EgtErase( nSrfTot)
EgtErase( nLeadId)
return false
end
end
end end
EgtErase( nSrfTot)
end end
end end
EgtErase( nLeadId)
return true return true
end end
------------------------------------------------------------------- ---------------------------------------------------------------------------------
local function FindCorrectRibsLead( dPar, nCrv, nCrvOffs, bLeadInvert, dLeadLen, dStrand, bInVsOut, nGrpTmp) local function PrepareRibLead( nCrvOffs, nRib, bInvert, bInVsOut, dPar, dLeadLen)
local nLeadId = EgtCopyGlob( nCrvOffs, nRib, EgtIf( bInVsOut, GDB_IN.BEFORE, GDB_IN.AFTER))
EgtChangeClosedCurveStart( nLeadId, dPar)
-- oriento in modo che la curva parta da nRib
if bInvert then
EgtInvertCurve( nLeadId)
end
EgtTrimCurveEndAtLen( nLeadId, dLeadLen)
if bInVsOut then
-- se lead in la curva deve terminare in nRib
EgtInvertCurve( nLeadId)
end
return nLeadId
end
---------------------------------------------------------------------------------
local function FindCorrectRibLead( dPar, nRib, nCrvOffs, bLeadInvert, dLeadLen, dStrand, bInVsOut, nGrpTmp, bSpecialCase)
local nLeadId local nLeadId
local bInvert = bLeadInvert -- valore di default è quello settato nel file dei parametri local bInvert = bLeadInvert -- valore di default è quello dei parametri
local bOnlyOneSide = false
local dParE
local _, dParEnd = EgtCurveDomain( nCrvOffs) -- verifico se ho un solo lato possibile per la presenza di altre passate
local bClosed = EgtCurveIsClosed( nCrvOffs) local nOtherRib
local bOnlyOneCurve = not bClosed and ( dPar < GEO.EPS_SMALL or abs( dPar - dParEnd) < GEO.EPS_SMALL) if bSpecialCase then
local sName = EgtGetName( nRib)
local nMainCrv = nCrvOffs -- curva preferita da utilizzare per lead in local nFirst = EgtGetFirstNameInGroup( EgtGetParent( nRib), sName)
local nOtherCrv -- altra possibile curva da ultizzare nel caso nMainCrv non sia adatta local nLast = EgtGetLastNameInGroup( EgtGetParent( nRib), sName)
if bInVsOut and nRib == nFirst then
if bClosed then nOtherRib = nLast
EgtChangeClosedCurveStart( nCrvOffs, dPar) elseif not bInVsOut and nRib == nLast then
nOtherCrv = nCrvOffs nOtherRib = nFirst
elseif not bOnlyOneCurve then end
nOtherCrv = EgtSplitCurveAtParam( nCrvOffs, dPar) else
local nLinkId = EgtIf( bInVsOut, EgtGetNext( nRib), EgtGetPrev( nRib))
if nLinkId and EgtGetName( nLinkId) == LINK_CRV then
nOtherRib = EgtIf( bInVsOut, EgtGetNext( nLinkId), EgtGetPrev( nLinkId))
local nOrigRib1 = EgtGetInfo( nRib, KEY_ORIGINAL_RIB, 'i')
local nOrigRib2 = EgtGetInfo( nOtherRib, KEY_ORIGINAL_RIB, 'i')
if nOrigRib1 ~= nOrigRib2 then
nOtherRib = nil
end
end
end end
if nOtherRib then
-- calcolo del parametro bInvert local ptOther = EgtIf( bInVsOut, EgtEP( nOtherRib, GDB_ID.ROOT), EgtSP( nOtherRib, GDB_ID.ROOT))
if bOnlyOneCurve then dParE = EgtCurveParamAtPoint( nCrvOffs, ptOther, 100 * GEO.EPS_SMALL, GDB_RT.GLOB)
-- invert dipende dall'estremo da cui parte il setto if dParE then
bInvert = abs( dPar - dParEnd) < GEO.EPS_SMALL bOnlyOneSide = true
elseif not bClosed then
-- invert può essere legato anche alla lunghezza dei tratti possibili
local dLen1 = EgtCurveLength( nMainCrv)
local dLen2 = EgtCurveLength( nOtherCrv)
if dLen1 > dLeadLen - GEO.EPS_SMALL and dLen2 < dLeadLen - GEO.EPS_SMALL then
bInvert = true
elseif dLen1 < dLeadLen - GEO.EPS_SMALL and dLen2 > dLeadLen - GEO.EPS_SMALL then
bInvert = false
end
if not bInvert then
nMainCrv, nOtherCrv = nOtherCrv, nMainCrv
end end
end end
-- primo tentativo con la curva favorita -- se un solo lato possibile
nLeadId = EgtCopyGlob( nMainCrv, nCrv, EgtIf( bInVsOut, GDB_IN.BEFORE, GDB_IN.AFTER)) if bOnlyOneSide then
if bInvert then EgtInvertCurve( nLeadId) end
EgtTrimCurveEndAtLen( nLeadId, dLeadLen) -- verifico a quale valore di bInvert corrisponde l'unico lato possibile
if bInVsOut then EgtInvertCurve( nLeadId) end local nCopyId1 = EgtCopyGlob( nCrvOffs, nGrpTmp)
if VerifyRibsLead( nLeadId, nCrv, dStrand, bInVsOut, nGrpTmp) then local nCopyId2 = EgtCopyGlob( nCrvOffs, nGrpTmp)
-- se valido aggiorno le curve per prossimi lead in/out EgtTrimCurveStartEndAtParam( nCopyId1, dPar, dParE)
if bInvert then EgtTrimCurveStartEndAtParam( nCopyId2, dParE, dPar)
EgtTrimCurveEndAtLen( nMainCrv, EgtCurveLength( nCrvOffs) - dLeadLen) local dLen1 = EgtCurveLength( nCopyId1)
else local dLen2 = EgtCurveLength( nCopyId2)
EgtTrimCurveStartAtLen( nMainCrv, dLeadLen) bInvert = dLen1 < dLen2
end
elseif not nOtherCrv then nLeadId = PrepareRibLead( nCrvOffs, nRib, bInvert, bInVsOut, dPar, dLeadLen)
-- se non è valido e non ho altre curve possibili cancello -- verifico se lead sensato
EgtErase( nLeadId) if not VerifyRibsLead( nLeadId, nRib, dStrand, bInVsOut, nGrpTmp) then
return nil EgtErase( nLeadId)
return
end
-- se due lati possibili
else else
-- se non è valido ma ho altra curva possibile, tento con quella -- primo tentativo nella direzione individuata dal parametro bInvert
EgtErase( nLeadId) nLeadId = PrepareRibLead( nCrvOffs, nRib, bInvert, bInVsOut, dPar, dLeadLen)
nLeadId = EgtCopyGlob( nOtherCrv, nCrv, EgtIf( bInVsOut, GDB_IN.BEFORE, GDB_IN.AFTER)) if not VerifyRibsLead( nLeadId, nRib, dStrand, bInVsOut, nGrpTmp) then
if not bInvert then EgtInvertCurve( nLeadId) end -- secondo tentativo nell'altra direzione
EgtTrimCurveEndAtLen( nLeadId, dLeadLen)
if bInVsOut then EgtInvertCurve( nLeadId) end
if VerifyRibsLead( nLeadId, nCrv, dStrand, bInVsOut, nGrpTmp) then
if bInvert then
EgtTrimCurveStartAtLen( nOtherCrv, dLeadLen)
else
EgtTrimCurveEndAtLen( nOtherCrv, EgtCurveLength( nCrvOffs) - dLeadLen)
end
else
EgtErase( nLeadId) EgtErase( nLeadId)
bInvert = not bInvert bInvert = not bInvert
return nil nLeadId = PrepareRibLead( nCrvOffs, nRib, bInvert, bInVsOut, dPar, dLeadLen)
if not VerifyRibsLead( nLeadId, nRib, dStrand, bInVsOut, nGrpTmp) then
EgtErase( nLeadId)
return
end
end end
-- aggiorno parametro bInvert
bInvert = not bInvert
end end
return nLeadId, bInvert return nLeadId, bInvert
end end
-------------------------------------------------------------------- --------------------------------------------------------------------
local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand, vtSlicing, nGrpTmp) local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand, vtSlicing, nGrpTmp, bForceNoSolidBorder, bSpecialCase)
local dLILen = EgtGetInfo( nCrv, KEY_RIBS_LEAD_IN_LEN, 'd') local dLILen = EgtGetInfo( nCrv, KEY_RIBS_LEAD_IN_LEN, 'd')
local bLIInvert = EgtGetInfo( nCrv, KEY_RIBS_LEAD_IN_INVERT, 'b') local bLIInvert = EgtGetInfo( nCrv, KEY_RIBS_LEAD_IN_INVERT, 'b')
@@ -880,27 +898,30 @@ local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand, vtSlicing, nGrpTmp)
-- recupero la curva di offset su cui calcolare leadin -- recupero la curva di offset su cui calcolare leadin
local ptS = EgtSP( nCrv) local ptS = EgtSP( nCrv)
local nCrvOffs = EgtGetFirstInGroup( nLoopsGrp) local vCrvOffs = {}
while nCrvOffs do if bForceNoSolidBorder then
local dParS = EgtCurveParamAtPoint( nCrvOffs, ptS) vCrvOffs = EgtGetNameInGroup( nLoopsGrp, SURF_LOOP .. '*') or {}
else
vCrvOffs = EgtGetAllInGroup( nLoopsGrp) or {}
end
for i = 1, #vCrvOffs do
local dParS = EgtCurveParamAtPoint( vCrvOffs[i], ptS)
if dParS then if dParS then
local nLeadIn = FindCorrectRibLead( dParS, nCrv, vCrvOffs[i], bLIInvert, dLILen, dStrand, true, nGrpTmp, bSpecialCase)
local nLeadIn = FindCorrectRibsLead( dParS, nCrv, nCrvOffs, bLIInvert, dLILen, dStrand, true, nGrpTmp)
-- se lead in possibile -- se lead in possibile
if nLeadIn then if nLeadIn then
EgtModifyCurveExtrusion( nLeadIn, vtSlicing, GDB_RT.GLOB) EgtModifyCurveExtrusion( nLeadIn, vtSlicing, GDB_RT.GLOB)
EgtSetInfo( nLeadIn, KEY_TYPE, TYPE.RIB) EgtSetInfo( nLeadIn, KEY_TYPE, TYPE.RIB)
EgtSetName( nLeadIn, LEAD_IN_CRV) EgtSetName( nLeadIn, LEAD_IN_CRV)
return
end end
return
end end
nCrvOffs = EgtGetNext( nCrvOffs)
end end
end end
-------------------------------------------------------------------- --------------------------------------------------------------------
local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, nGrpTmp, bForceNoBorder) local function AddRibsLeadOut( nCrv, nLoopsGrp, dStrand, vtSlicing, nGrpTmp, bForceNoSolidBorder, bSpecialCase)
local dRibsLOLen = EgtGetInfo( nCrv, KEY_RIBS_LEAD_OUT_LEN, 'd') local dRibsLOLen = EgtGetInfo( nCrv, KEY_RIBS_LEAD_OUT_LEN, 'd')
local dRibsLOCoasting = EgtGetInfo( nCrv, KEY_RIBS_LEAD_OUT_COASTING, 'd') local dRibsLOCoasting = EgtGetInfo( nCrv, KEY_RIBS_LEAD_OUT_COASTING, 'd')
@@ -909,11 +930,11 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, n
local bRibsLOInvert = EgtGetInfo( nCrv, KEY_RIBS_LEAD_OUT_INVERT, 'b') local bRibsLOInvert = EgtGetInfo( nCrv, KEY_RIBS_LEAD_OUT_INVERT, 'b')
if abs( dRibsLOLen) < GEO.EPS_SMALL and if abs( dRibsLOLen) < GEO.EPS_SMALL and
abs( dRibsLOCoasting) < GEO.EPS_SMALL and abs( dRibsLOCoasting) < GEO.EPS_SMALL and
abs( dRibsLOWipe) < GEO.EPS_SMALL then return end abs( dRibsLOWipe) < GEO.EPS_SMALL then return end
-- se setto chiuso oppure non deve stare sul bordo (rib unbounded) applico la stessa uscita delle shell -- se setto chiuso applico la stessa uscita delle shell
if EgtCurveIsClosed( nCrv) or bForceNoBorder then if EgtCurveIsClosed( nCrv) then
return AddRetraction( nCrv, vtSlicing, dRibsLOCoasting, dRibsLOWipe, dRibsLOWipeAng) return AddRetraction( nCrv, vtSlicing, dRibsLOCoasting, dRibsLOWipe, dRibsLOWipeAng)
end end
@@ -921,9 +942,15 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, n
local vtE = EgtEV( nCrv, GDB_ID.ROOT) local vtE = EgtEV( nCrv, GDB_ID.ROOT)
-- recupero la curva di offset su cui calcolare lead out -- recupero la curva di offset su cui calcolare lead out
local nCrvOffs = EgtGetFirstInGroup( nLoopsGrp) local vCrvOffs = {}
while nCrvOffs do if bForceNoSolidBorder then
local dParE = EgtCurveParamAtPoint( nCrvOffs, ptE, GEO.EPS_SMALL, GDB_RT.GLOB) vCrvOffs = EgtGetNameInGroup( nLoopsGrp, SURF_LOOP .. '*') or {}
else
vCrvOffs = EgtGetAllInGroup( nLoopsGrp) or {}
end
for i = 1, #vCrvOffs do
local dParE = EgtCurveParamAtPoint( vCrvOffs[i], ptE, GEO.EPS_SMALL, GDB_RT.GLOB)
if dParE then if dParE then
local nCrvLO local nCrvLO
@@ -931,15 +958,12 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, n
local nWipe local nWipe
-- trovo curva opportuna per lead out -- trovo curva opportuna per lead out
local nCrvRef, bInvert = FindCorrectRibsLead( dParE, nCrv, nCrvOffs, bRibsLOInvert, dRibsLOLen + dRibsLOCoasting, dStrand, false, nGrpTmp) local nCrvRef, bInvert = FindCorrectRibLead( dParE, nCrv, vCrvOffs[i], bRibsLOInvert, dRibsLOLen + dRibsLOCoasting, dStrand, false, nGrpTmp, bSpecialCase)
if nCrvRef then if nCrvRef then
-- verifico se la curva ha lunghezza sufficiente
local dLen = EgtCurveLength( nCrvRef)
local bSkip = ( dLen - dRibsLOLen - dRibsLOCoasting < - GEO.EPS_SMALL)
-- primo tratto ( segue offset con flusso aperto) -- primo tratto ( segue offset con flusso aperto)
if dRibsLOLen > GEO.EPS_SMALL and not bSkip then if dRibsLOLen > GEO.EPS_SMALL then
nCrvLO = EgtCopyGlob( nCrvRef, nCrv, GDB_IN.AFTER) nCrvLO = EgtCopyGlob( nCrvRef, nCrv, GDB_IN.AFTER)
EgtTrimCurveEndAtLen( nCrvLO, dRibsLOLen) EgtTrimCurveEndAtLen( nCrvLO, dRibsLOLen)
EgtModifyCurveExtrusion( nCrvLO, vtSlicing, GDB_RT.GLOB) EgtModifyCurveExtrusion( nCrvLO, vtSlicing, GDB_RT.GLOB)
@@ -974,21 +998,17 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, n
if nType == RIB_TYPE.EXTERNAL then dAng = - dAng end if nType == RIB_TYPE.EXTERNAL then dAng = - dAng end
vtE:rotate( vtSlicing, EgtIf( bInvert, - dAng, dAng)) vtE:rotate( vtSlicing, EgtIf( bInvert, - dAng, dAng))
local ptFinal = FindWipeEndPoint( ptE, vtE, dRibsLOWipe, vtSlicing) local ptFinal = FindWipeEndPoint( ptE, vtE, dRibsLOWipe, vtSlicing)
nWipe = EgtCurveCompoFromPoints( nTPathGrp, { ptE, ptFinal}, GDB_RT.GLOB) nWipe = EgtCurveCompoFromPoints( EgtGetParent( nCrv), { ptE, ptFinal}, GDB_RT.GLOB)
EgtModifyCurveExtrusion( nWipe, vtSlicing, GDB_RT.GLOB) EgtModifyCurveExtrusion( nWipe, vtSlicing, GDB_RT.GLOB)
EgtRelocateGlob( nWipe, nCoasting or nCrvLO or nCrv, GDB_IN.AFTER) EgtRelocateGlob( nWipe, nCoasting or nCrvLO or nCrv, GDB_IN.AFTER)
EgtSetName( nWipe, WIPE_CRV) EgtSetName( nWipe, WIPE_CRV)
EgtSetInfo( nWipe, KEY_TYPE, TYPE.WIPE) EgtSetInfo( nWipe, KEY_TYPE, TYPE.WIPE)
EgtSetColor( nWipe, EgtStdColor('AQUA')) EgtSetColor( nWipe, EgtStdColor('AQUA'))
end end
else
-- aggiungo coasting e wipe come sulle shell normali return
AddRetraction( nCrv, vtSlicing, dRibsLOCoasting, dRibsLOWipe, dRibsLOWipeAng)
end end
return
end end
nCrvOffs = EgtGetNext( nCrvOffs)
end end
-- se non ho trovato curva sul bordo su cui fare il lead out aggiungo coasting e wipe come sulle shell normali -- se non ho trovato curva sul bordo su cui fare il lead out aggiungo coasting e wipe come sulle shell normali
@@ -1038,21 +1058,17 @@ local function CalcRibsToolPath( vEntIds, nRibsGrp, nTpathGrpId, LayerParams)
else else
local bLoopRib = EgtGetInfo( tabRibs[i][1], KEY_LOOP_RIB, 'b') or false local bLoopRib = EgtGetInfo( tabRibs[i][1], KEY_LOOP_RIB, 'b') or false
for j = 1, #tabRibs[i] - 1 do for j = 1, #tabRibs[i] - 1 do
local bUserLink = EgtGetInfo( tabRibs[i][j], KEY_RIBS_USER_LINK, 'b') or false local bUserLink = ( EgtGetInfo( tabRibs[i][j], KEY_RIBS_USER_LINK, 'b') or false) and ( EgtGetInfo( tabRibs[i][j+1], KEY_RIBS_USER_LINK, 'b') or false)
local nOrig1 = EgtGetInfo( tabRibs[i][j], KEY_ORIGINAL_RIB, 'i') or 0 local nOrig1 = EgtGetInfo( tabRibs[i][j], KEY_ORIGINAL_RIB, 'i') or 0
local nOrig2 = EgtGetInfo( tabRibs[i][j + 1], KEY_ORIGINAL_RIB, 'i') or 0 local nOrig2 = EgtGetInfo( tabRibs[i][j + 1], KEY_ORIGINAL_RIB, 'i') or 0
local nSplitId1 = EgtGetInfo( tabRibs[i][j], KEY_SPLIT_ID, 'i') or 0 local nSplitId1 = EgtGetInfo( tabRibs[i][j], KEY_SPLIT_ID, 'i') or 0
local nSplitId2 = EgtGetInfo( tabRibs[i][j + 1], KEY_SPLIT_ID, 'i') or 0 local nSplitId2 = EgtGetInfo( tabRibs[i][j + 1], KEY_SPLIT_ID, 'i') or 0
local bForceLink = ( nOrig1 == nOrig2) local bForceLink = ( nOrig1 == nOrig2 and nSplitId1 == nSplitId2)
local bCheckLinkedRibs = not bForceLink and not bUserLink
if ( nOrig1 ~= nOrig2 and bUserLink) or ( nSplitId1 == nSplitId2 and nOrig1 == nOrig2) then if ( nOrig1 ~= nOrig2 and bUserLink) or ( nSplitId1 == nSplitId2 and nOrig1 == nOrig2) then
local nLinkId = CalcRibsLink( tabRibs[i][j], tabRibs[i][j + 1], nLoopGrp, LayerParams.dStrand, bForceLink, LayerParams.vtSlicing, nGrpTmp) local nLinkId = CalcRibsLink( tabRibs[i][j], tabRibs[i][j + 1], nLoopGrp, LayerParams.dStrand, bForceLink, bCheckLinkedRibs, LayerParams.vtSlicing, nGrpTmp)
-- creo link fittizio per eliminare tratto corrispondente sulla curva di offset
if not bSpecialCase and bForceLink then
local nFakeLink = CalcRibsLink( tabRibs[i][j + 1], tabRibs[i][j], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp)
EgtErase( nFakeLink)
end
-- se LoopRib congiungo i setti in unico percorso -- se LoopRib congiungo i setti in unico percorso
if bLoopRib and nLinkId then if bLoopRib and nLinkId then
EgtAddCurveCompoCurve( tabRibs[i][j], nLinkId) EgtAddCurveCompoCurve( tabRibs[i][j], nLinkId)
@@ -1065,7 +1081,7 @@ local function CalcRibsToolPath( vEntIds, nRibsGrp, nTpathGrpId, LayerParams)
-- se LoopRib aggiungo collegamento tra primo e ultimo setto del gruppo -- se LoopRib aggiungo collegamento tra primo e ultimo setto del gruppo
if bLoopRib then if bLoopRib then
local nTotCrv = #tabRibs[i] local nTotCrv = #tabRibs[i]
local nLinkId = CalcRibsLink( tabRibs[i][nTotCrv], tabRibs[i][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) local nLinkId = CalcRibsLink( tabRibs[i][nTotCrv], tabRibs[i][1], nLoopGrp, LayerParams.dStrand, false, false, LayerParams.vtSlicing, nGrpTmp)
if nLinkId then if nLinkId then
-- se curva unica -- se curva unica
if tabRibs[i][nTotCrv] == tabRibs[i][1] then if tabRibs[i][nTotCrv] == tabRibs[i][1] then
@@ -1085,11 +1101,6 @@ local function CalcRibsToolPath( vEntIds, nRibsGrp, nTpathGrpId, LayerParams)
end end
end end
end end
if bSpecialCase then
local nFakeLink = CalcRibsLink( tabRibs[i][#tabRibs[i]], tabRibs[i][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp)
EgtErase( nFakeLink)
end
end end
end end
@@ -1099,36 +1110,35 @@ local function CalcRibsToolPath( vEntIds, nRibsGrp, nTpathGrpId, LayerParams)
local bLink2 = EgtGetInfo( tabRibs[i + 1][1], KEY_RIBS_LINK, 'b') local bLink2 = EgtGetInfo( tabRibs[i + 1][1], KEY_RIBS_LINK, 'b')
if bLink1 and bLink2 then if bLink1 and bLink2 then
local nCnt = #tabRibs[i] local nCnt = #tabRibs[i]
CalcRibsLink( tabRibs[i][nCnt], tabRibs[i + 1][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) CalcRibsLink( tabRibs[i][nCnt], tabRibs[i + 1][1], nLoopGrp, LayerParams.dStrand, false, true, LayerParams.vtSlicing, nGrpTmp)
end end
end end
-- leadin/leadout -- leadin/leadout
local bForceNoBorder = false local bForceNoSolidBorder = false
local nType = EgtGetInfo( vEntIds[1], KEY_RIBS_TYPE, 'i') local nType = EgtGetInfo( vEntIds[1], KEY_RIBS_TYPE, 'i')
if nType == RIB_TYPE.UNBOUNDED then if nType == RIB_TYPE.UNBOUNDED then
bForceNoBorder = true bForceNoSolidBorder = true
end end
local nCrvRib = nNewFirstEnt local nCrvRib = nNewFirstEnt
while nCrvRib do while nCrvRib do
-- verifico se necessario lead in -- verifico se necessario lead in
local nPrev = EgtGetPrev( nCrvRib) local nPrev = EgtGetPrev( nCrvRib)
if ( not nPrev or EgtGetName( nPrev) ~= LINK_CRV) and not bForceNoBorder then if not nPrev or EgtGetName( nPrev) ~= LINK_CRV then
AddRibsLeadIn( nCrvRib, nLoopGrp, LayerParams.dStrand, LayerParams.vtSlicing, nGrpTmp) AddRibsLeadIn( nCrvRib, nLoopGrp, LayerParams.dStrand, LayerParams.vtSlicing, nGrpTmp, bForceNoSolidBorder, bSpecialCase)
end end
-- verifico se necessario lead out -- verifico se necessario lead out
local nNext = EgtGetNext( nCrvRib) local nNext = EgtGetNext( nCrvRib)
if not nNext or EgtGetName( nNext) ~= LINK_CRV then if not nNext or EgtGetName( nNext) ~= LINK_CRV then
AddRibsLeadOut( nCrvRib, nTpathGrpId, nLoopGrp, LayerParams.vtSlicing, LayerParams.dStrand, nGrpTmp, bForceNoBorder) AddRibsLeadOut( nCrvRib, nLoopGrp, LayerParams.dStrand, LayerParams.vtSlicing, nGrpTmp, bForceNoSolidBorder, bSpecialCase)
end end
nCrvRib = EgtGetNextName( nCrvRib, RIBS_CRV .. '*') nCrvRib = EgtGetNextName( nCrvRib, RIBS_CRV .. '*')
end end
EgtErase( nGrpTmp) EgtErase( nGrpTmp)
end end
------------------------------------------------------------------- --------------------------------------------------------------------
------------------------- SPIRAL VASE ------------------------------ ------------------------- SPIRAL VASE ------------------------------
-------------------------------------------------------------------- --------------------------------------------------------------------
local function AddSpiralVaseLeadOut( nOldId, LayerParams) local function AddSpiralVaseLeadOut( nOldId, LayerParams)
+2 -2
View File
@@ -1,4 +1,4 @@
-- RunGcodeGenerate.lua by Egaltech s.r.l. 2023/02/02 -- RunGcodeGenerate.lua by Egaltech s.r.l. 2023/04/11
-- Calcoli prima fase per Stampa 3d -- Calcoli prima fase per Stampa 3d
-- Tabella per definizione modulo -- Tabella per definizione modulo
@@ -131,7 +131,7 @@ function RunGcodeGenerate.Exec()
-- Salvo il progetto -- Salvo il progetto
local sFilePath = EgtGetCurrFilePath() local sFilePath = EgtGetCurrFilePath()
sFilePath = EgtChangePathExtension( sFilePath, 'nge') sFilePath = EgtChangePathExtension( sFilePath, 'icrs')
EgtSetCurrFilePath( sFilePath) EgtSetCurrFilePath( sFilePath)
EgtSaveFile() EgtSaveFile()
+6
View File
@@ -66,6 +66,12 @@ local function RemoveOldSlices( nPartId)
EgtErase( vOldSliceId[i]) EgtErase( vOldSliceId[i])
end end
end end
-- rimuovo gruppo con i loop dei setti
local nRibsLoopsGrp = EgtGetFirstNameInGroup( nPartId, RIBS_LOOP_GRP)
if nRibsLoopsGrp then
EgtErase( nRibsLoopsGrp)
end
end end
--------------------------------------------------------------------- ---------------------------------------------------------------------
+1 -1
View File
@@ -1,4 +1,4 @@
-- Version.lua by Egaltech s.r.l. 2023/02/28 -- Version.lua by Egaltech s.r.l. 2023/02/28
-- Gestione della versione di 3dPrinting -- Gestione della versione di 3dPrinting
VERSION = '2.5c2' VERSION = '2.5e2'