Files
trimming/TrimmingLib.lua
T
Riccardo Elitropi dfa187838b Trimming 3.1a4 :
- 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.
2026-01-22 19:21:28 +01:00

214 lines
8.3 KiB
Lua

-- TrimmingLib.lua by Egalware s.r.l. 2026/01/05
-- Modulo per Definizione di Costanti, Variabili e Funzioni di Trimming
local TrimmingVar = {
nCounter = 0
}
-- *** ============================== COSTANTI ============================== ***
-- Chiavi Info Part/Layers
KEY_LIN_TOL = 'LinTol'
KEY_LIN_TOL_EDGES = 'LinTolEdges' -- 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
-- Chive per Tipologia di Layer
KEY_LAYER_TYPE = 'Trimming_Layer_Type'
KEY_LAYER_SELECTION = 'Trimming_Selection_Layer'
KEY_LAYER_EDIT_CURVES = 'Trimming_EditCurves_Layer'
KEY_LAYER_SYNC_CURVES = 'Trimming_SyncCurves_Layer'
KEY_LAYER_SYNC_STORE_CURVES = 'Trimming_SyncStoredCurves_Layer'
-- Generali
PART_NAME = 'Trimming'
LAYER_NAME_SELECTION = 'Trimming'
LAYER_NAME_EDIT_CURVES = 'EditCurves'
LAYER_NAME_SYNC_CURVES = 'SyncCurves'
LAYER_NAME_SYNC_STORED_CURVES = 'SyncStoredCurves'
ANG_FACE_TOL = 30.
ANG_TOL = 15.
LIN_TOL = 0.2
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'
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)
-- Creazione della Superficie Ruled di Bezier
RULED_BZ_NAME = 'SurfBz'
RULED_BZ_COLOR = Color3d( 37, 37, 37)
-- ***============================== 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)
local nCurrLayerId = EgtGroup( nCurrPartId)
local bOk = ( nCurrLayerId ~= nil)
if bOk then
TrimmingVar.IncrementCounter()
local sName = LAYER_NAME_SELECTION .. ' ' .. TrimmingVar.nCounter
bOk = EgtSetName( nCurrLayerId, sName) and EgtSetInfo( nCurrLayerId, KEY_LAYER_TYPE, KEY_LAYER_SELECTION)
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)
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) 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 nEditSyncLayerId
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
--======================== Utility =======================
return TrimmingVar