dfa187838b
- aggiunta memorizzazione dell'ulltimo tipo selezionato nella modalità selezione - se le superfici di selezione generano più di 2 curve di bordo allora vengono definiti degli altri layer di trimming - semplificazione gestione dei layer di sincronizzazione delle curve - aggiunta funzionalità di rimozione delle superfici di Bezier in un layer di trimmatura - miglioramento nella selezione delle curve di sincronizzazione nel caso di curve di bordo chiuse o aperte.
112 lines
4.1 KiB
Lua
112 lines
4.1 KiB
Lua
-- CalcBezier.lua by Egalware s.r.l. 2026/01/05
|
|
|
|
require( 'EgtBase')
|
|
_ENV = EgtProtectGlobal()
|
|
EgtEnableDebug( false)
|
|
|
|
-- Carico le costanti di Trimming
|
|
EgtAddToPackagePath( EgtGetSourceDir() .. '?.lua')
|
|
local GlobVar = require( 'TrimmingLib')
|
|
-- Costante di Errore
|
|
local ERROR_BEZIER_CREATION = 'Error in Ruled Bezier Creation : '
|
|
|
|
-- Recupero il Part e il Layer di Trimming con le relative Info
|
|
local nCurrPartId = EgtGetCurrPart()
|
|
local nCurrLayerId = GlobVar.GetTrimmingLayerRefId( EgtGetCurrLayer())
|
|
if not GlobVar.IsTrimmingLayer( nCurrLayerId) then
|
|
EgtOutBox( ERROR_BEZIER_CREATION .. 'Not a valid Trimming Layer', 'Error', 'ERROR', 'OK')
|
|
return
|
|
end
|
|
local dLinTol = EgtGetInfo( nCurrLayerId, KEY_LIN_TOL, 'd')
|
|
local dAngTol = EgtGetInfo( nCurrLayerId, KEY_ANG_TOL, 'd')
|
|
local dAngFaceTol = EgtGetInfo( nCurrLayerId, KEY_SURF_ANG_TOL, 'd')
|
|
local bOk = ( dLinTol ~= nil and dAngTol ~= nil and dAngFaceTol ~= nil)
|
|
if not bOk then
|
|
EgtOutBox( ERROR_BEZIER_CREATION .. 'No Trimming Machining created', 'Error', 'ERROR', 'OK')
|
|
return
|
|
end
|
|
|
|
-- Rimuovo tutte le entità che sono Superfici di Bezier Ruled
|
|
local vIdToErase = {}
|
|
local nId = EgtGetFirstInGroup( nCurrLayerId)
|
|
while nId do
|
|
local sName = EgtGetName( nId)
|
|
if sName == RULED_BZ_NAME then table.insert( vIdToErase, nId) end
|
|
nId = EgtGetNext( nId)
|
|
end
|
|
EgtErase( vIdToErase)
|
|
|
|
-- Recupero gli Edges per la creazione della Superficie di Bezier Ruled
|
|
-- ( ed eventuali Punti di Sincronizzazione se presenti nel Layer di Salvataggio )
|
|
local vIdEdges = {}
|
|
local vIdSyncLines = {}
|
|
local nLayerStoredSyncId = GlobVar.GetCurrentEditSyncCurvesLayer( nCurrPartId, nCurrLayerId)
|
|
if nLayerStoredSyncId and nLayerStoredSyncId ~= GDB_ID.NULL then
|
|
-- Recupero gli Id delle Linee di sincronizzazione
|
|
nId = EgtGetFirstInGroup( nLayerStoredSyncId)
|
|
while nId do
|
|
local sName = EgtGetName( nId)
|
|
local nType = EgtGetType( nId)
|
|
if sName ~= EDGES_NAME and ( nType == GDB_TY.CRV_COMPO or nType == GDB_TY.CRV_BEZ or nType == GDB_TY.CRV_LINE or nType == GDB_TY.CRV_ARC) then
|
|
EgtSetName( nId, SYNC_LINE_NAME)
|
|
table.insert( vIdSyncLines, nId)
|
|
end
|
|
nId = EgtGetNext( nId)
|
|
end
|
|
-- Rendo Visibile il Layer di Trimming corrente
|
|
bOk = bOk and EgtSetStatus( nCurrLayerId, GDB_ST.ON)
|
|
end
|
|
if not bOk then
|
|
EgtOutBox( ERROR_BEZIER_CREATION .. 'Borders Curves not found', 'Error', 'ERROR', 'OK')
|
|
EgtErase( nLayerSyncId)
|
|
return
|
|
end
|
|
|
|
-- Recupero le Curve di Bordo dal Layer di Trimming corrente
|
|
nId = EgtGetFirstInGroup( nCurrLayerId)
|
|
while nId do
|
|
if EgtGetName( nId) == EDGES_NAME then table.insert( vIdEdges, nId) end
|
|
nId = EgtGetNext( nId)
|
|
end
|
|
|
|
-- Scorro a Coppie le curve di bordo presenti nel gruppo
|
|
for i = 1, #vIdEdges, 2 do
|
|
-- Recupero l'Indice dei Due Edges
|
|
local nEdge1Id = vIdEdges[i]
|
|
local nEdge2Id = vIdEdges[i+1]
|
|
-- Se non ho esattamente un due Edges, allora non è possibile definire la Bezier Ruled
|
|
if not nEdge1Id or not nEdge2Id then
|
|
EgtOutBox( ERROR_BEZIER_CREATION .. 'Not 2 Curves detected', 'Error', 'ERROR', 'OK')
|
|
EgtErase( nLayerSyncId)
|
|
return
|
|
end
|
|
|
|
-- Calcolo la Superficie di Bezier Ruled
|
|
-- [ Per ora non passo superfici di riferimento per eventuale Invert()]
|
|
local nSurfBzId = EgtTrimmingGetRuledBezier( nCurrLayerId, {}, nEdge1Id, nEdge2Id, dLinTol, vIdSyncLines)
|
|
if nSurfBzId == GDB_ID.NULL then
|
|
EgtOutBox( ERROR_BEZIER_CREATION .. 'Creating Bezier Surf failed', 'Error', 'ERROR', 'OK')
|
|
EgtErase( nSyncLayerId)
|
|
return
|
|
end
|
|
|
|
-- Assegno Colore e Name
|
|
bOk = EgtSetColor( nSurfBzId, RULED_BZ_COLOR) and EgtSetName( nSurfBzId, RULED_BZ_NAME)
|
|
if not bOk then
|
|
EgtOutBox( ERROR_BEZIER_CREATION .. 'Assign Surf Bezier Properties failed', 'Error', 'ERROR', 'OK')
|
|
return
|
|
end
|
|
end
|
|
|
|
-- Nascondo le superfici di Selezione e metto il Focus sul Layer di Selezione
|
|
nId = EgtGetFirstInGroup( nCurrLayerId)
|
|
while nId do
|
|
if EgtGetName( nId) == SELECTION_SURF_NAME then EgtSetStatus( nId, GDB_ST.OFF) end
|
|
nId = EgtGetNext( nId)
|
|
end
|
|
EgtSetCurrPartLayer( nCurrPartId, nCurrLayerId)
|
|
EgtSetStatus( nCurrLayerId, GDB_ST.ON)
|
|
|
|
-- Aggiorno la Grafica
|
|
EgtDraw()
|