Trimming 3.1d1 :

- aggiunte le funzioni per la regolarizzazione locale della superficie.
This commit is contained in:
Daniele Bariletti
2026-04-22 15:29:43 +02:00
parent e5b1b4457f
commit b910397ebc
4 changed files with 425 additions and 2 deletions
+156
View File
@@ -0,0 +1,156 @@
-- ConfirmSurfChange.lua by Egalware s.r.l. 2026/04/22
require( 'EgtBase')
_ENV = EgtProtectGlobal()
EgtEnableDebug( false)
-- Carico le costanti di Trimming
EgtAddToPackagePath( EgtGetSourceDir() .. '?.lua')
local GlobVar = require( 'TrimmingLib')
-- Costante di Errore
local ERROR_CONFIRM_SURF_CHANGE = 'Error in Confirm Surf Change : '
-- Recupero il Part e Layer di Trimming corrente ( o di riferimento)
local nCurrPartId = EgtGetCurrPart()
local nCurrLayerId = GlobVar.GetTrimmingLayerRefId( EgtGetCurrLayer())
if not GlobVar.IsTrimmingLayer( nCurrLayerId) then
EgtOutBox( ERROR_CONFIRM_SURF_CHANGE .. 'Not a valid Trimming Layer', 'Error', 'ERROR', 'OK')
return
end
-- Recupero le Info
local dLinTol = EgtGetInfo( nCurrLayerId, KEY_LIN_TOL, 'd')
-- verifico che esista il layer temporaneo con la nuova superficie e i nuovi bordi
local nEditSurfLayer = GlobVar.GetCurrentEditSurfLayer( nCurrPartId, nCurrLayerId)
if nEditSurfLayer == nil or nEditSurfLayer == GDB_ID.NULL then
EgtOutBox( ERROR_CONFIRM_SURF_CHANGE .. 'No Temp Surface Regolarized to confirm', 'Error', 'ERROR', 'OK')
return
end
-- cerco i nuovi bordi e la nuova superficie
-- verifico ci sia la superficie
local nNewSurf = GDB_ID.NULL
local nId = EgtGetFirstInGroup(nEditSurfLayer)
while nId do
if EgtGetName(nId) == EDIT_SURF_NEWSURF_NAME then nNewSurf = nId end
nId = EgtGetNext( nId)
end
if nNewSurf == GDB_ID.NULL then
EgtOutBox( ERROR_CONFIRM_SURF_CHANGE .. 'No Temp Surface Regolarized to confirm', 'Error', 'ERROR', 'OK')
return
end
-- cerco i nuovi bordi
local vNewBorder = {}
nId = EgtGetFirstInGroup(nEditSurfLayer)
while nId do
if EgtGetName(nId) == EDIT_SURF_NEWBORDER_NAME then
table.insert(vNewBorder, nId)
end
nId = EgtGetNext( nId)
end
if #vNewBorder ~= 2 then
EgtOutBox( ERROR_CONFIRM_SURF_CHANGE .. 'No New Borders to confirm', 'Error', 'ERROR', 'OK')
return
-- li ricavo dalla superficie
end
EgtDeselectAll()
local vIdEdges = {}
nId = EgtGetFirstInGroup( nCurrLayerId)
while nId do
-- verifico che sia una Curva e che sia di Bordo
if EgtGetName( nId) == EDGES_NAME then
table.insert( vIdEdges, nId)
end
nId = EgtGetNext( nId)
end
-- Se nel gruppo di trim ho due curve di bordo le cancello
if #vIdEdges == 2 then
EgtErase( vIdEdges)
end
-- verifico ci sia la superficie
local nSurf = GDB_ID.NULL
nId = EgtGetFirstInGroup(nCurrLayerId)
while nId do
if EgtGetType(nId) == GDB_TY.SRF_BEZ then nSurf = nId end
nId = EgtGetNext( nId)
end
if nSurf ~= GDB_ID.NULL then
EgtErase( nSurf)
end
-- Verifico che esista il Layer di Edit per le curve di Sincronizzazione
local nLayerEditSyncId = GlobVar.GetCurrentEditSyncCurvesLayer( nCurrPartId, nCurrLayerId)
if nLayerEditSyncId == nil or nLayerEditSyncId == GDB_ID.NULL then
-- EgtOutBox( ERROR_CONFIRM_SURF_CHANGE .. 'Click Edit SyncLines before trying to reduce twist', 'Error', 'ERROR', 'OK')
-- return
end
-- recupero le linee di Sync selezionate e le riporto al colore standard
local vSyncSel = EgtGetInfo(nCurrLayerId, KEY_SYNC_LINES_REGOLARIZATION, "vs")
-- verifico che siano selezionate due curve nel layer delle Sync Lines
if #vSyncSel == 2 then
for i,nId in pairs( vSyncSel) do
if EgtGetName(nId) == SYNC_LINE_NAME then
EgtSetColor(nId, SYNC_LINE_COLOR)
end
end
end
-- cancello l'info nel layer di trimming
EgtRemoveInfo(nCurrLayerId, KEY_SYNC_LINES_REGOLARIZATION)
-- sposto i nuovi bordi e superficie e cambio colori e nomi
EgtRelocate(nNewSurf, nCurrLayerId)
EgtRelocate(vNewBorder[1], nCurrLayerId)
EgtRelocate(vNewBorder[2], nCurrLayerId)
EgtSetColor( nNewSurf, RULED_BZ_COLOR)
EgtSetColor(vNewBorder[1],EDGES_COLOR)
EgtSetColor(vNewBorder[2],EDGES_COLOR)
EgtSetName(nNewSurf, RULED_BZ_NAME)
EgtSetName(vNewBorder[1],EDGES_NAME)
EgtSetName(vNewBorder[2],EDGES_NAME)
-- scorro le curve di edit e guardo a che parametro corrispondono
-- richiedo a quel parametro l'isocurva sulla superficie nuova
if nLayerEditSyncId ~= nil and nLayerEditSyncId ~= GDB_ID.NULL then
nId = EgtGetFirstInGroup(nLayerEditSyncId)
while nId do
local ptStart = EgtSP(nId)
local dU = EgtCurveParamAtPoint( vNewBorder[1], ptStart, dLinTol)
if dU == nil or dU < 0 then
EgtOutBox( ERROR_CONFIRM_SURF_CHANGE .. 'Error creating the new sync lines', 'Error', 'ERROR', 'OK')
return
end
local ptStart = EgtSurfBezierGetPoint(nNewSurf, dU, 0.)
local ptEnd = EgtSurfBezierGetPoint(nNewSurf, dU, 1.)
local nNewIso = EgtLine( nEditSurfLayer, ptStart, ptEnd)
EgtSetName(nNewIso, SYNC_LINE_NAME)
nId = EgtGetNext(nId)
end
EgtEmptyGroup( nLayerEditSyncId)
end
-- sostituisco le vecchie con le nuove
nId = EgtGetFirstInGroup(nEditSurfLayer)
while nId do
local nNext = EgtGetNext(nId)
EgtRelocate(nId, nLayerEditSyncId)
nId = nNext
end
EgtErase(nEditSurfLayer)
EgtDraw()
+126
View File
@@ -0,0 +1,126 @@
-- ReduceTwist.lua by Egalware s.r.l. 2026/04/21
require( 'EgtBase')
_ENV = EgtProtectGlobal()
EgtEnableDebug( false)
-- Carico le costanti di Trimming
EgtAddToPackagePath( EgtGetSourceDir() .. '?.lua')
local GlobVar = require( 'TrimmingLib')
-- Costante di Errore
local ERROR_REDUCE_TWIST = 'Error in Reduce Surf Twist : '
-- Recupero il Part e Layer di Trimming corrente ( o di riferimento)
local nCurrPartId = EgtGetCurrPart()
local nCurrLayerId = GlobVar.GetTrimmingLayerRefId( EgtGetCurrLayer())
if not GlobVar.IsTrimmingLayer( nCurrLayerId) then
EgtOutBox( ERROR_EDIT_SYNC_CURVES .. 'Not a valid Trimming Layer', 'Error', 'ERROR', 'OK')
return
end
-- Recupero le Info
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_REDUCE_TWIST .. 'No Trimming Machining created', 'Error', 'ERROR', 'OK')
return
end
local vIdEdges = {}
local nId = EgtGetFirstInGroup( nCurrLayerId)
while nId do
-- verifico che sia una Curva e che sia di Bordo
if EgtGetName( nId) == EDGES_NAME then
-- Verifico che sia una Curva
local nType = EgtGetType( nId)
if nType ~= GDB_TY.CRV_LINE and nType ~= GDB_TY.CRV_ARC and nType ~= GDB_TY.CRV_BEZ and nType ~= GDB_TY.CRV_COMPO then
EgtOutBox( ERROR_REDUCE_TWIST .. 'Invalid Border', 'Error', 'ERROR', 'OK')
return
end
table.insert( vIdEdges, nId)
end
nId = EgtGetNext( nId)
end
-- Se nel gruppo di Edit delle curve non ne ho esattamente 2 di bordo, errore
if #vIdEdges ~= 2 then
EgtOutBox( ERROR_REDUCE_TWIST .. 'Not 2 Border Curves', 'Error', 'ERROR', 'OK')
EgtSetStatus( nCurrLayerId, GDB_ST.ON)
EgtErase( nLayerEditSyncId)
return
end
-- verifico ci sia la superficie
local nSurf = GDB_ID.NULL
nId = EgtGetFirstInGroup(nCurrLayerId)
while nId do
if EgtGetType(nId) == GDB_TY.SRF_BEZ then nSurf = nId end
nId = EgtGetNext( nId)
end
if nSurf == GDB_ID.NULL then
EgtOutBox( ERROR_REDUCE_TWIST .. 'No surface to regolarize', 'Error', 'ERROR', 'OK')
return
end
-- Verifico che esista il Layer di Edit per le curve di Sincronizzazione
local nLayerEditSyncId = GlobVar.GetCurrentEditSyncCurvesLayer( nCurrPartId, nCurrLayerId)
if nLayerEditSyncId == nil or nLayerEditSyncId == GDB_ID.NULL then
EgtOutBox( ERROR_REDUCE_TWIST .. 'Click Edit SyncLines before trying to reduce twist', 'Error', 'ERROR', 'OK')
return
end
-- verifico che siano selezionate due curve nel layer delle SynLines
local nSel = EgtGetFirstSelectedObj()
local vSyncSel = {}
while nSel do
-- verifico che sia una curva e che sia nel layer delle SyncLines
if EgtGetName( nSel) == SYNC_LINE_NAME then
table.insert(vSyncSel, nSel)
else
EgtOutBox( ERROR_REDUCE_TWIST .. 'Invalid Curve Selected', 'Error', 'ERROR', 'OK')
return
end
nSel = EgtGetNextSelectedObj()
end
-- verifico che siano selezionate solo due curve
if #vSyncSel ~= 2 then
EgtOutBox( ERROR_REDUCE_TWIST .. 'Two SyncLines selected needed', 'Error', 'ERROR', 'OK')
EgtSetStatus( nCurrLayerId, GDB_ST.ON)
return
end
-- creo il layer e setto le info e colori
local nEditSurfLayer = GlobVar.CreateEditSurfLayer( nCurrPartId, nCurrLayerId)
local sInfoVal = EgtNumToString(vSyncSel[1])..","..EgtNumToString(vSyncSel[2])
EgtSetInfo(nCurrLayerId, KEY_SYNC_LINES_REGOLARIZATION, sInfoVal)
EgtSetColor(vSyncSel[1], EDIT_SURF_SYNC_COLOR)
EgtSetColor(vSyncSel[2], EDIT_SURF_SYNC_COLOR)
local nNewSurfId = EgtRegolarizeSurfaceLocally( nEditSurfLayer, nSurf,vSyncSel[1],vSyncSel[2],dLinTol)
if nNewSurfId == nil or nNewSurfId == GDB_ID.NULL then
EgtOutBox( ERROR_REDUCE_TWIST .. 'Failed Reduction of twist', 'Error', 'ERROR', 'OK')
return
end
EgtSetName(nNewSurfId,EDIT_SURF_NEWSURF_NAME)
---- richiedo i bordi alla nuova superficie e li metto nel layer temporaneo della modifica alla superficie
local nCrv1 = EgtSurfBezierGetCurveU( nNewSurfId, 0., nEditSurfLayer)
local nCrv2 = EgtSurfBezierGetCurveU( nNewSurfId, 1., nEditSurfLayer)
local vIdNewEdges = {nCrv1, nCrv2}
EgtSetColor( vIdNewEdges[1], EDIT_SURF_BORDER_COLOR)
EgtSetColor( vIdNewEdges[2], EDIT_SURF_BORDER_COLOR)
EgtSetName( vIdNewEdges[1], EDIT_SURF_NEWBORDER_NAME)
EgtSetName( vIdNewEdges[2], EDIT_SURF_NEWBORDER_NAME)
-- nascondo i bordi e la superficie originale
EgtSetStatus( nSurf, GDB_ST.OFF)
EgtSetStatus( vIdEdges[1], GDB_ST.OFF)
EgtSetStatus( vIdEdges[2], GDB_ST.OFF)
EgtDraw()
+84
View File
@@ -0,0 +1,84 @@
-- ResetSurfChange.lua by Egalware s.r.l. 2026/04/22
require( 'EgtBase')
_ENV = EgtProtectGlobal()
EgtEnableDebug( false)
-- Carico le costanti di Trimming
EgtAddToPackagePath( EgtGetSourceDir() .. '?.lua')
local GlobVar = require( 'TrimmingLib')
-- Costante di Errore
local ERROR_REST_SURF_CHANGE = 'Error in Reset Surf Change : '
-- Recupero il Part e Layer di Trimming corrente ( o di riferimento)
local nCurrPartId = EgtGetCurrPart()
local nCurrLayerId = GlobVar.GetTrimmingLayerRefId( EgtGetCurrLayer())
if not GlobVar.IsTrimmingLayer( nCurrLayerId) then
EgtOutBox( ERROR_REST_SURF_CHANGE .. 'Not a valid Trimming Layer', 'Error', 'ERROR', 'OK')
return
end
-- verifico che esista il layer temporaneo con la nuova superficie e i nuovi bordi
local nEditSurfLayer = GlobVar.GetCurrentEditSurfLayer( nCurrPartId, nCurrLayerId)
if nEditSurfLayer == nil or nEditSurfLayer == GDB_ID.NULL then
EgtOutBox( ERROR_REST_SURF_CHANGE .. 'No Temp Surface Regolarized to delete', 'Error', 'ERROR', 'OK')
return
end
EgtDeselectAll()
-- cancello tutto quello che c'è in quel layer e ripristino la visibilità dei bordi e della superficie originale
EgtErase(nEditSurfLayer)
local vIdEdges = {}
local nId = EgtGetFirstInGroup( nCurrLayerId)
while nId do
-- verifico che sia una Curva e che sia di Bordo
if EgtGetName( nId) == EDGES_NAME then
table.insert( vIdEdges, nId)
end
nId = EgtGetNext( nId)
end
-- Se nel gruppo di trim ho esattamente 2 curve di bordo le rendo visibili
if #vIdEdges == 2 then
EgtSetStatus( vIdEdges[1], GDB_ST.ON)
EgtSetStatus( vIdEdges[2], GDB_ST.ON)
end
-- verifico ci sia la superficie
local nSurf = GDB_ID.NULL
nId = EgtGetFirstInGroup(nCurrLayerId)
while nId do
if EgtGetType(nId) == GDB_TY.SRF_BEZ then nSurf = nId end
nId = EgtGetNext( nId)
end
if nSurf ~= GDB_ID.NULL then
EgtSetStatus( nSurf, GDB_ST.ON)
end
-- Verifico che esista il Layer di Edit per le curve di Sincronizzazione
local nLayerEditSyncId = GlobVar.GetCurrentEditSyncCurvesLayer( nCurrPartId, nCurrLayerId)
if nLayerEditSyncId == nil or nLayerEditSyncId == GDB_ID.NULL then
-- EgtOutBox( ERROR_REST_SURF_CHANGE .. 'Click Edit SyncLines before trying to reduce twist', 'Error', 'ERROR', 'OK')
-- return
end
-- recupero le linee di Sync selezionate e le riporto al colore standard
local vSyncSel = EgtGetInfo(nCurrLayerId, KEY_SYNC_LINES_REGOLARIZATION, "vs")
-- verifico che siano selezionate due curve nel layer delle Sync Lines
if #vSyncSel == 2 then
for i,nId in pairs( vSyncSel) do
if EgtGetName(nId) == SYNC_LINE_NAME then
EgtSetColor(nId, SYNC_LINE_COLOR)
end
end
end
-- cancello l'info nel layer di trimming
EgtRemoveInfo(nCurrLayerId, KEY_SYNC_LINES_REGOLARIZATION)
EgtDraw()
+59 -2
View File
@@ -26,6 +26,7 @@ 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'
@@ -34,6 +35,7 @@ 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'
@@ -42,6 +44,7 @@ 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
@@ -81,6 +84,14 @@ SYNC_LINE_INTERP_COLOR = Color3d( 255, 165, 0)
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"
@@ -171,7 +182,7 @@ 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
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
@@ -252,7 +263,6 @@ 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
@@ -266,6 +276,53 @@ function TrimmingVar.GetCurrentEditSyncCurvesLayer( nPartId, nTrimmingLayerId)
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]