e5b1b4457f
- migliorata la gestione dei colori ( rimozione passaggi con esadecimali) - aggiunta la funzione di Undo per le curve di sincronizzazione per interpolazione.
358 lines
14 KiB
Lua
358 lines
14 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,
|
|
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
|
|
|
|
-- 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'
|
|
|
|
-- 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'
|
|
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)
|
|
|
|
-- ***========================== 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) 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
|
|
|
|
--======================== 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 |