-- TrimmingLib.lua by Egalware s.r.l. 2026/01/05 -- Modulo per Definizione di Costanti, Variabili e Funzioni di Trimming local TrimmingVar = { nCounter = 0, bInit = false } -- *** ============================== COSTANTI ============================== *** -- Chiavi Info Part/Layers KEY_LIN_TOL = 'LinTol' KEY_LIN_TOL_EDGES = 'LinTolEdges' -- Edges Extraction (modify) KEY_ANG_TOL_EDGES = 'AngTolEdges' -- Edges Extraction (modify) KEY_THICK_EDGES = 'ThickEdges' -- Edges Extraction (modify) KEY_ANG_TOL = 'AngTol' KEY_SURF_ANG_TOL = 'SurfAngTol' KEY_SURF_BORDER_SIZE = 'BorderSize' -- Selection KEY_SURF_BORDER_SIZE_TOL = 'BorderSizeTol' -- Selection KEY_SELECTION_REF_SURF = 'nRefSurf' -- Selection KEY_SELECTION_LAST_SELECTION_TYPE = 'LastSelType' -- Selection (type) KEY_SELECTION_LAST_IDS = 'vSelLastIds' -- Undo Selection KEY_REF_TRIMMING_LAYER = 'nRefTrimmingLayer' -- Trimming Layer Ref KEY_AUTO_TRIMMING = 'AutoTrim' -- AutoTrimming KEY_SYNC_LINES_NUMBER = 'SkimmingFactor' -- Skimming Sync Lines KEY_SYNC_LINES_SHOW_ON_CORNERS = 'SyncLineShowOnCorners' -- Skimming Sync Lines Show on Corners KEY_SYNC_LINES_NUMBER_ANG_TOL = 'SkimmingFactorAngTol' -- Skimming Sync Lines Tol KEY_SYNC_LINES_INTERPOLATION_IDS = 'SyncLineInterIds' -- Skinning Sync Lines Interpolation Ids KEY_SYNC_LINES_REGOLARIZATION = "SyncCuvesRef" -- curve di inizio e fine della zona da regolarizzare -- Chive per Tipologia di Layer KEY_LAYER_TYPE = 'Trimming_Layer_Type' KEY_LAYER_SELECTION = 'Trimming_Selection_Layer' KEY_LAYER_SELECTION_HOLES = 'Trimming_Selection_Holes_Layer' KEY_LAYER_EDIT_CURVES = 'Trimming_EditCurves_Layer' KEY_LAYER_SYNC_CURVES = 'Trimming_SyncCurves_Layer' KEY_LAYER_SYNC_STORE_CURVES = 'Trimming_SyncStoredCurves_Layer' KEY_LAYER_EDIT_SURF = "Trimming_EditSurf_Layer" -- Generali PART_NAME = 'Trimming' LAYER_NAME_SELECTION = 'Trimming' LAYER_NAME_SELECTION_HOLES = 'TrimmingHoles' LAYER_NAME_EDIT_CURVES = 'EditCurves' LAYER_NAME_SYNC_CURVES = 'SyncCurves' LAYER_NAME_SYNC_STORED_CURVES = 'SyncStoredCurves' LAYER_NAME_EDIT_SURF = "EditSurf" ANG_FACE_TOL = 30. ANG_TOL = 15. LIN_TOL = 0.2 STRIP_SIZE = 5.0 STRIP_SIZE_TOL = 0.75 EDGE_THICK = 5.0 SYNC_LINES_NUMBER = 0 SYNC_LINES_ANG_TOL = 15.0 -- Selezione delle superfici -- SELECTION_SURF_NAME = 'Selected_Surf' SELECTION_TYPE = { INSERT = 'Insert', FACE_SEARCH = 'Search Faces', SURF_SEARCH = 'Search Surfaces' } SELECTION_NO_FACE = -1 SELECTION_SURF_COLOR = Color3d( 255, 255, 185) -- Creazione dei bordi Bezier -- EDGES_NAME = 'Border' EDGE_HOLE_NAME = 'ButtonHole' EDGES_COLOR = Color3d( 0, 128, 255) -- Edit dei bordi di Bezier -- EDGES_EDIT_TYPE = { AUTOMATIC = 'Automatic', THICKNESS = 'Thickness' } -- Creazione dei tratti di sincronizzazione SYNC_LINE_NAME = 'SyncLines' SYNC_LINE_COLOR = Color3d( 0, 255, 0) SYNC_LINE_INTERP_COLOR = Color3d( 255, 165, 0) -- Creazione della Superficie Ruled di Bezier RULED_BZ_NAME = 'SurfBz' RULED_BZ_COLOR = Color3d( 37, 37, 37) -- Edit della superficie di Bezier EDIT_SURF_NEWSURF_NAME = 'NewSurf' EDIT_SURF_NEWBORDER_NAME = 'NewBorder' EDIT_SURF_COLOR = Color3d( 0,128,0) EDIT_SURF_SYNC_COLOR = Color3d(255,0,128) EDIT_SURF_BORDER_COLOR = Color3d(128,128,255) -- ***========================== FILE INI ==================================*** KEY_SECTION_NAME = "Trimming" KEY_INI_SELECTION_SURF_COLOR = "SurfSelectionColor" function TrimmingVar.SetColorSurfSelection( myColor) if not myColor then return end SELECTION_SURF_COLOR = myColor end KEY_INI_EDGES_COLOR = "EdgesColor" function TrimmingVar.SetColorEdges( myColor) if not myColor then return end EDGES_COLOR = myColor end KEY_INI_SYNC_LINE_COLOR = "SyncLineColor" function TrimmingVar.SetColorSyncLines( myColor) if not myColor then return end SYNC_LINE_COLOR = myColor end KEY_INI_SYNC_INTERP_COLOR = "SyncLineInterpColor" function TrimmingVar.SetColorSyncInterpLines( myColor) if not myColor then return end SYNC_LINE_INTERP_COLOR = myColor end KEY_INI_RULED_BZ_COLOR = "RuledBzColor" function TrimmingVar.SetColorRuledBz( myColor) if not myColor then return end RULED_BZ_COLOR = myColor end -- ***============================== FUNZIONI ==============================*** --======================== Contatore Incrementale ======================= function TrimmingVar.IncrementCounter() TrimmingVar.nCounter = TrimmingVar.nCounter + 1 end function TrimmingVar.ResetCounter() TrimmingVar.nCounter = 0 end --========================== Layer di Trimmatura ========================== --------------------------------------------------------------------------- -- Funzione per creare un Layer di Trimmatura function TrimmingVar.CreateTrimmingLayer( nCurrPartId, bForHoles) local nCurrLayerId = EgtGroup( nCurrPartId) local bOk = ( nCurrLayerId ~= nil) if bOk then TrimmingVar.IncrementCounter() if not bForHoles then local sName = LAYER_NAME_SELECTION .. ' ' .. TrimmingVar.nCounter bOk = EgtSetName( nCurrLayerId, sName) and EgtSetInfo( nCurrLayerId, KEY_LAYER_TYPE, KEY_LAYER_SELECTION) else local sName = LAYER_NAME_SELECTION_HOLES .. ' ' .. TrimmingVar.nCounter bOk = EgtSetName( nCurrLayerId, sName) and EgtSetInfo( nCurrLayerId, KEY_LAYER_TYPE, KEY_LAYER_SELECTION_HOLES) end end if not bOk then EgtErase( nCurrLayerId) return GDB_ID.NULL end return nCurrLayerId end --------------------------------------------------------------------------- -- Funzione per verificare se un Layer è un Layer di Trimmatura function TrimmingVar.IsTrimmingLayer( nId) -- Verifico che la chiave del gruppo sia coerente local sLayerType = EgtGetInfo( nId, KEY_LAYER_TYPE, 's') return ( sLayerType ~= nil and ( sLayerType == KEY_LAYER_SELECTION or sLayerType == KEY_LAYER_SELECTION_HOLES)) end --------------------------------------------------------------------------- -- Funzione per verificare se un Layer è un Layer di Trimmatura per Fori/Asole function TrimmingVar.IsTrimmingHoleLayer( nId) -- Verifico che sia un Layer di Trimmatura if not TrimmingVar.IsTrimmingLayer( nId) then return false end local sLayerType = EgtGetInfo( nId, KEY_LAYER_TYPE, 's') return ( sLayerType ~= nil and sLayerType == KEY_LAYER_SELECTION_HOLES) end --------------------------------------------------------------------------- -- Funzione per ottenere il Layer di Trimmatura di riferimento dato un generico Layer function TrimmingVar.GetTrimmingLayerRefId( nId) if nId == nil or nId == GDB_ID.NULL then return GDB_ID.NULL end -- Se Layer di Trimmatura allora è lui stesso if TrimmingVar.IsTrimmingLayer( nId) then return nId end if TrimmingVar.IsEditCurvesLayer( nId) or TrimmingVar.IsEditSyncCurvesLayer( nId) or TrimmingVar.IsEditSurfLayer( nId)then local nTrimmingLayerRef = EgtGetInfo( nId, KEY_REF_TRIMMING_LAYER, 'i') if nTrimmingLayerRef ~= nil and TrimmingVar.IsTrimmingLayer( nTrimmingLayerRef) then return nTrimmingLayerRef end end return GDB_ID.NULL end --============================ Layer Edit Bordi =========================== --------------------------------------------------------------------------- -- Funzione per creare un Layer di Edit dei bordi function TrimmingVar.CreateEditCurvesLayer( nCurrPartId, nCurrLayerId) local nEditLayerId = EgtGroup( nCurrPartId) local bOk = ( nEditLayerId ~= nil) if bOk then bOk = ( EgtSetName( nEditLayerId, LAYER_NAME_EDIT_CURVES) and EgtSetInfo( nEditLayerId, KEY_LAYER_TYPE, KEY_LAYER_EDIT_CURVES) and EgtSetInfo( nEditLayerId, KEY_REF_TRIMMING_LAYER, nCurrLayerId)) end if not bOk then EgtErase( nEditLayerId) return GDB_ID.NULL end return nEditLayerId end --------------------------------------------------------------------------- -- Funzione per verificare se un Layer è un Layer di Edit dei bordi function TrimmingVar.IsEditCurvesLayer( nId) if nId == nil or nId == GDB_ID.NULL then return false end -- Verifico che la chiave del gruppo sia coerente local sLayerType = EgtGetInfo( nId, KEY_LAYER_TYPE, 's') return ( sLayerType ~= nil and sLayerType == KEY_LAYER_EDIT_CURVES) end --------------------------------------------------------------------------- -- Funzione per ottenere il Layer di Edit dei bordi corrente function TrimmingVar.GetCurrentEditLayer( nPartId) if nPartId == nil or nPartId == GDB_ID.NULL then return false end local nEditLayerId local nLayerId = EgtGetFirstInGroup( nPartId) while nLayerId do if TrimmingVar.IsEditCurvesLayer( nLayerId) then return nLayerId end nLayerId = EgtGetNext( nLayerId) end return GDB_ID.NULL end --======================== Layer Edit Sync Curve ======================= --------------------------------------------------------------------------- -- Funzione per creare un Layer di Edit delle curve di Sincornizzazione function TrimmingVar.CreateEditSyncCurvesLayer( nCurrPartId, nCurrLayerId) local nEditSyncLayerId = EgtGroup( nCurrPartId) local bOk = ( nEditSyncLayerId ~= nil) if bOk then bOk = ( EgtSetName( nEditSyncLayerId, LAYER_NAME_SYNC_CURVES) and EgtSetInfo( nEditSyncLayerId, KEY_LAYER_TYPE, KEY_LAYER_SYNC_CURVES) and EgtSetInfo( nEditSyncLayerId, KEY_REF_TRIMMING_LAYER, nCurrLayerId) and EgtSetColor( nEditSyncLayerId, SYNC_LINE_COLOR)) end if not bOk then EgtErase( nEditSyncLayerId) return GDB_ID.NULL end return nEditSyncLayerId end --------------------------------------------------------------------------- -- Funzione per verificare se un Layer è un Layer di Edit delle curve di Sincronizzazione function TrimmingVar.IsEditSyncCurvesLayer( nId) if nId == nil or nId == GDB_ID.NULL then return false end -- Verifico che la chiave del gruppo sia coerente local sLayerType = EgtGetInfo( nId, KEY_LAYER_TYPE, 's') return ( sLayerType ~= nil and sLayerType == KEY_LAYER_SYNC_CURVES) end --------------------------------------------------------------------------- -- Funzione che ritorna il Layer di Edit delle curve di sincronizzazione riferito al Layer di Trimming function TrimmingVar.GetCurrentEditSyncCurvesLayer( nPartId, nTrimmingLayerId) if nPartId == nil or nPartId == GDB_ID.NULL then return false end local nLayerId = EgtGetFirstInGroup( nPartId) while nLayerId do if TrimmingVar.IsEditSyncCurvesLayer( nLayerId) then local nRefTrimmingLayer = TrimmingVar.GetTrimmingLayerRefId( nLayerId) if nRefTrimmingLayer ~= nil and nRefTrimmingLayer ~= GDB_ID.NULL and nRefTrimmingLayer == nTrimmingLayerId then return nLayerId end end nLayerId = EgtGetNext( nLayerId) end return GDB_ID.NULL end --======================== Layer Edit Surf ======================= --------------------------------------------------------------------------- -- Funzione per creare un Layer di Edit delle curve di Sincornizzazione function TrimmingVar.CreateEditSurfLayer( nCurrPartId, nCurrLayerId) local nEditSurfLayerId = EgtGroup( nCurrPartId) local bOk = ( nEditSurfLayerId ~= nil) if bOk then bOk = ( EgtSetName( nEditSurfLayerId, LAYER_NAME_EDIT_SURF) and EgtSetInfo( nEditSurfLayerId, KEY_LAYER_TYPE, KEY_LAYER_EDIT_SURF) and EgtSetInfo( nEditSurfLayerId, KEY_REF_TRIMMING_LAYER, nCurrLayerId) and EgtSetColor( nEditSurfLayerId, EDIT_SURF_COLOR)) end if not bOk then EgtErase( nEditSurfLayerId) return GDB_ID.NULL end return nEditSurfLayerId end --------------------------------------------------------------------------- -- Funzione per verificare se un Layer è un Layer di Edit delle curve di Sincronizzazione function TrimmingVar.IsEditSurfLayer( nId) if nId == nil or nId == GDB_ID.NULL then return false end -- Verifico che la chiave del gruppo sia coerente local sLayerType = EgtGetInfo( nId, KEY_LAYER_TYPE, 's') return ( sLayerType ~= nil and sLayerType == KEY_LAYER_EDIT_SURF) end --------------------------------------------------------------------------- -- Funzione che ritorna il Layer di Edit della superficie riferito al Layer di Trimming function TrimmingVar.GetCurrentEditSurfLayer( nPartId, nTrimmingLayerId) if nPartId == nil or nPartId == GDB_ID.NULL then return GDB_ID.NULL end local nLayerId = EgtGetFirstInGroup( nPartId) while nLayerId do if TrimmingVar.IsEditSurfLayer( nLayerId) then local nRefTrimmingLayer = TrimmingVar.GetTrimmingLayerRefId( nLayerId) if nRefTrimmingLayer ~= nil and nRefTrimmingLayer ~= GDB_ID.NULL and nRefTrimmingLayer == nTrimmingLayerId then return nLayerId end end nLayerId = EgtGetNext( nLayerId) end return GDB_ID.NULL end --======================== Colori ======================== -- Funzione che recupera il colore da una stringa "nR,nG,nB" [0-255],[0-255],[0-255] function TrimmingVar.GetColorFromString( sColor) local sVal = EgtSplitString( sColor) if not sVal then return nil end if #sVal ~= 3 then return nil end local nRed = tonumber( sVal[1]) local nGreen = tonumber( sVal[2]) local nBlue = tonumber( sVal[3]) if not nRed or not nGreen or not nBlue then return nil end if 0 <= nRed and nRed <= 255 and 0 <= nGreen and nGreen <= 255 and 0 <= nBlue and nBlue <= 255 then return Color3d( nRed, nGreen, nBlue) end return nil end ----------------------------------------------------------------------------- -- Funzione per convertire un Color3d ad una stringa "nR,nG,nB" [0-255],[0-255],[0-255] function TrimmingVar.GetStringFromColor( myColor) if not myColor then return nil end return ( "".. myColor:getRed().. ",".. myColor:getGreen().. ",".. myColor:getBlue()) end ----------------------------------------------------------------------------- -- Funzione per convertire Colori da Classe3d a stringa per File.ini function TrimmingVar.GetColorForIniFile( myColor) if not myColor then return nil end return ( myColor:getRed().. ",".. myColor:getGreen().. ",".. myColor:getBlue()) end --======================== Utility ======================= ----------------------------------------------------------------------------- -- Funzione che ritorna tutte le Superici Visibili presenti e visibili nel Layer dell'Entità nId -- Ritorna un vettore di Id = {} o nil in caso di errore function TrimmingVar.GetAllOtherVisibileSurfsInSameLayer( nId) local nSurfGrp = EgtGetParent( nId) if not nSurfGrp or nSurfGrp == GDB_ID.NULL then return nil end local vAllSurfIds = { } local nOtherId = EgtGetFirstInGroup( nSurfGrp) while nOtherId do if EgtGetStatus( nOtherId) == GDB_ST.ON and nOtherId ~= nId then local nType = EgtGetType( nOtherId) if nType == GDB_TY.SRF_BEZ or nType == GDB_TY.SRF_MESH then table.insert( vAllSurfIds, nOtherId) end end nOtherId = EgtGetNext( nOtherId) end return vAllSurfIds end ----------------------------------------------------------------------------- -- Funzione che ritorna il Box Complessivo delle Entità desiderate function TrimmingVar.GetGlobBox( vIds) local BBox3dGlob = BBox3d() for i = 1, #vIds do local nId = vIds[i] if nId then local currBBox3d = EgtGetBBoxGlob( nId, GDB_BB.STANDARD) if i == 1 then BBox3dGlob = currBBox3d else BBox3dGlob = BBox3dGlob + currBBox3d end end end return BBox3dGlob end -- Inizializzazione per lettura delle variabili if not TrimmingVar.bInit then local sFileIni = EgtGetIniFile() if sFileIni then -- Colore Selezione della Superficie local sColorSurfSelection = EgtGetStringFromIni( KEY_SECTION_NAME, KEY_INI_SELECTION_SURF_COLOR, "", sFileIni) if sColorSurfSelection then TrimmingVar.SetColorSurfSelection( TrimmingVar.GetColorFromString( sColorSurfSelection)) end -- Colore Edges local sColorEdges = EgtGetStringFromIni( KEY_SECTION_NAME, KEY_INI_EDGES_COLOR, "", sFileIni) if sColorEdges then TrimmingVar.SetColorEdges( TrimmingVar.GetColorFromString( sColorEdges)) end -- Colore Linee di Sincronizzazione local sSyncLineColor = EgtGetStringFromIni( KEY_SECTION_NAME, KEY_INI_SYNC_LINE_COLOR, "", sFileIni) if sSyncLineColor then TrimmingVar.SetColorSyncLines( TrimmingVar.GetColorFromString( sSyncLineColor)) end -- Colore Linee di Sincronizzazione mediante Interpolazione local sSyncInterpLineColor = EgtGetStringFromIni( KEY_SECTION_NAME, KEY_INI_SYNC_INTERP_COLOR, "", sFileIni) if sSyncInterpLineColor then TrimmingVar.SetColorSyncInterpLines( TrimmingVar.GetColorFromString( sSyncInterpLineColor)) end -- Colore Superficie Ruled di Bezier local sRuledBzColor = EgtGetStringFromIni( KEY_SECTION_NAME, KEY_INI_RULED_BZ_COLOR, "", sFileIni) if sRuledBzColor then TrimmingVar.SetColorRuledBz( TrimmingVar.GetColorFromString( sRuledBzColor)) end end TrimmingVar.bInit = false end return TrimmingVar