-- 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 la Tolleranza Lineare ed Angolare con cui sono stati approssimati gli Edges local dEdgeLinTol = EgtGetInfo( nCurrLayerId, KEY_LIN_TOL_EDGES, 'd') local dEdgeAngTol = EgtGetInfo( nCurrLayerId, KEY_ANG_TOL_EDGES, 'd') if dEdgeLinTol == nil or dEdgeAngTol == nil then EgtOutBox( ERROR_BEZIER_CREATION .. 'Edge Approx tollerance not found', 'Error', 'ERROR', 'OK') return end dLinTol = dEdgeLinTol dAngTol = dEdgeAngTol -- 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()