- rinominate le variabili per i layer

- utilizzati solo nomi per salvare le info
- aggiunta la possibilità di avere fino a due paretine sullo stesso lato
- possibilità fare paretine sui loop interni
- correzione nella gestione degli offset
- possiiblità di avere più loop interni.
This commit is contained in:
Daniele Bariletti
2025-01-30 15:06:34 +01:00
parent cd61014fc2
commit cb1f1ab08b
+244 -103
View File
@@ -15,8 +15,8 @@ local TOOL = {}
_G.TOOL = TOOL
TOOL.nId = nil -- id del part della paretina che si sta costruendo
TOOL.nOutLayParent = nil -- layer contenente il loop da cui si sta creando la paretina (appartenente al parent)
TOOL.nOutLay = nil -- layer dell'outloop del nuovo part in creazione
TOOL.nLayLoopParent = nil -- layer contenente il loop da cui si sta creando la paretina (appartenente al parent)
TOOL.nLayLoop = nil -- layer dell'outloop del nuovo part in creazione
TOOL.nEdgeId = nil -- indice dell'edge che si sta usando per creare la paretina
TOOL.nEdge = nil -- numero ordinale (1-based, per poterlo usare direttamente per trovare il lato "A1") per l'edge nel layer del loop
TOOL.tbInfo = {} -- tabella contenente tutte le informazioni del part corrente
@@ -43,11 +43,17 @@ TOOL.sName = nil -- nome del part corrente, incluso il codice univoco(
TOOL.bPrev = nil -- booleano che indica se modificare anche la paretina successiva, in conseguenza delle modifica a quella corrente
TOOL.bNext = nil -- booleano che indica se modificare anche la paretina precedente, in conseguenza delle modifica a quella corrente
-- info addizionali che potrebbero esserci nella tbInfo
TOOL.tbInfo.nIn = nil -- intero che esiste solo se il part è stato costruito a partire da un edge di un InLoop e indica a quale degli InLoop(da contare in ordine all'interno del Parent, 1-based)
TOOL.tbInfo.bOutLoop = nil -- booleano che indica se l'edge su cui è stato costruito il part appartiene all'outloop o ad un inloop del Parent
TOOL.tbIdLoop = {} -- tabella con gli id del loop su cui sta venendo costruita la paretina
-- creo il codice univoco per l'identificazione dei part
TOOL.sUNICode = os.date( '%y%m%d%H%M%S', os.time()).."_"
local sUNICode = TOOL.sUNICode
---- creo il codice univoco per l'identificazione dei part
--TOOL.sUNICode = os.date( '%y%m%d%H%M%S', os.time()).."_"
--local sUNICode = TOOL.sUNICode
function TOOL.SaveMePlease()
EgtSaveFile('D:\\Temp\\marmo\\Vein3D\\FOO.nge')
@@ -73,8 +79,8 @@ end
local function FillInfoTable()
if TOOL.nId then TOOL.tbInfo.nId = TOOL.nId end
if TOOL.nEdgeId then TOOL.tbInfo.nEdgeId = TOOL.nEdgeId end
if TOOL.nOutLayParent and TOOL.nOutLayParent ~= GDB_ID.NULL then TOOL.tbInfo.nOutLayParent = TOOL.nOutLayParent end
if (not TOOL.tbInfo.nOutLayParent or TOOL.tbInfo.nOutLayParent == GDB_ID.NULL) and TOOL.nEdgeId and TOOL.nEdgeId ~= GDB_ID.NULL then EgtGetParent( TOOL.nEdgeId) end
if TOOL.nLayLoopParent and TOOL.nLayLoopParent ~= GDB_ID.NULL then TOOL.tbInfo.nLayLoopParent = TOOL.nLayLoopParent end
if (not TOOL.tbInfo.nLayLoopParent or TOOL.tbInfo.nLayLoopParent == GDB_ID.NULL) and TOOL.nEdgeId and TOOL.nEdgeId ~= GDB_ID.NULL then EgtGetParent( TOOL.nEdgeId) end
if TOOL.nParent then TOOL.tbInfo.nParent = TOOL.nParent end
if (not TOOL.tbInfo.nParent or TOOL.tbInfo.nParent == GDB_ID.NULL) and TOOL.nEdgeId and TOOL.nEdgeId ~= GDB_ID.NULL then EgtGetParent(EgtGetParent( TOOL.nEdgeId)) end
if TOOL.nPrevId then TOOL.tbInfo.nPrevId = TOOL.nPrevId end
@@ -90,8 +96,6 @@ local function FillInfoTable()
if TOOL.dH then TOOL.tbInfo.dH = TOOL.dH end
if TOOL.dPairAng then TOOL.tbInfo.dPairAng = TOOL.dPairAng end
if TOOL.bOnLoop then TOOL.tbInfo.bOnLoop = TOOL.bOnLoop end
-- if TOOL.dBeta1 then TOOL.tbInfo.dBeta1 = TOOL.dBeta1 end
-- if TOOL.dBeta2 then TOOL.tbInfo.dBeta2 = TOOL.dBeta2 end
if TOOL.sName then TOOL.tbInfo.sName = TOOL.sName end
end
@@ -101,6 +105,7 @@ local function FillInfoTableFromPart(nPartId)
TOOL.tbInfo.nPrevId = EgtGetInfo(nPartId,"Prev", "i")
TOOL.tbInfo.nNextId = EgtGetInfo(nPartId,"Next", "i")
TOOL.tbInfo.nJunctionType = EgtGetInfo(nPartId,"JunctionType", "i")
TOOL.tbInfo.dPairAng = EgtGetInfo(nPartId, "PairAng", "d")
TOOL.tbInfo.bOnLoop = EgtGetInfo(nPartId,"OnLoop", "b")
TOOL.tbInfo.dAngBR = EgtGetInfo(nPartId,"AngBR", "d")
TOOL.tbInfo.dSideAngR = EgtGetInfo(nPartId,"SideAngR", "d")
@@ -108,18 +113,35 @@ local function FillInfoTableFromPart(nPartId)
TOOL.tbInfo.dSideAngL = EgtGetInfo(nPartId,"SideAngL", "d")
TOOL.tbInfo.dLen = EgtGetInfo(nPartId,"Len", "d")
TOOL.tbInfo.dH = EgtGetInfo(nPartId,"H", "d")
TOOL.tbInfo.dTh = EgtGetInfo(nPartId,"Th", "d")
TOOL.tbInfo.nEdge = EgtGetInfo(nPartId, "ParentEdge", "i")
TOOL.tbInfo.bOutLoop = EgtGetInfo(nPartId, "FromOutLoop", "b")
TOOL.tbInfo.nParent = EgtGetInfo(nPartId, "Parent","i")
TOOL.nOutLayParent = EgtGetFirstNameInGroup(TOOL.tbInfo.nParent, "OutLoop")
if TOOL.nOutLayParent then TOOL.tbInfo.nOutLayParent = TOOL.nOutLayParent end
TOOL.tbInfo.nEdgeId = EgtGetFirstNameInGroup(TOOL.tbInfo.nOutLayParent, "A"..TOOL.tbInfo.nEdge)
-- TOOL.tbInfo.dBeta1 = EgtGetInfo(nPartId,"Beta1", "d")
-- TOOL.tbInfo.dBeta2 = EgtGetInfo(nPartId,"Beta2", "d")
if TOOL.nLayLoopParent then
TOOL.tbInfo.nLayLoopParent = TOOL.nLayLoopParent
else
if TOOL.tbInfo.bOutLoop then
TOOL.tbInfo.nLayLoopParent = EgtGetFirstNameInGroup(TOOL.tbInfo.nParent, "OutLoop")
else
TOOL.tbInfo.nIn = EgtGetInfo(nPartId,"nInLoop", "i")
local nLay = EgtGetFirstNameInGroup(nPartId, "InLoop")
if TOOL.tbInfo.nIn then
local c = 1
if TOOL.tbInfo.nIn ~=1 then
while c ~= TOOL.tbInfo.nIn do
nLay = EgtGetNextName(nLay)
c = c + 1
end
end
end
TOOL.tbInfo.nLayLoopParent = nLay
end
end
TOOL.tbInfo.nEdgeId = EgtGetFirstNameInGroup(TOOL.tbInfo.nLayLoopParent, "A"..TOOL.tbInfo.nEdge)
end
function TOOL.WriteDataToChildPart(tbInfo)
if not tbInfo or not tbInfo.nId then do return end end
if tbInfo.nParent then EgtSetInfo(tbInfo.nParent,"A"..tostring(tbInfo.nEdge), tbInfo.nId) end
if tbInfo.nParent then EgtSetInfo(tbInfo.nId, 'Parent', tbInfo.nParent) end
if tbInfo.nEdge then EgtSetInfo(tbInfo.nId, 'ParentEdge', tbInfo.nEdge) end
if tbInfo.dLen then EgtSetInfo(tbInfo.nId, 'Len', tbInfo.dLen) end
@@ -128,15 +150,16 @@ function TOOL.WriteDataToChildPart(tbInfo)
if tbInfo.bOnLoop ~= nil then EgtSetInfo(tbInfo.nId, "OnLoop", tbInfo.bOnLoop) end
if tbInfo.dH then EgtSetInfo(tbInfo.nId, 'H', tbInfo.dH) end
if tbInfo.dTh then EgtSetInfo(tbInfo.nId, 'Th', tbInfo.dTh) end
-- if tbInfo.dBeta1 then EgtSetInfo(tbInfo.nId, 'Beta1', tbInfo.dBeta1) end
-- if tbInfo.dBeta2 then EgtSetInfo(tbInfo.nId, 'Beta2', tbInfo.dBeta2) end
if tbInfo.nJunctionType then EgtSetInfo(tbInfo.nId, 'JunctionType', tbInfo.nJunctionType) end
if tbInfo.bOutLoop ~= nil then EgtSetInfo(tbInfo.nId, "FromOutLoop", tbInfo.bOutLoop) end
if tbInfo.nIn then EgtSetInfo(tbInfo.nId, "nInLoop", tbInfo.nIn) end
end
-- CREAZIONE dei Layer di un singolo Part
-- I nomi dei layer sono: OutLoop, Region, Ref, Labels, Aux
function TOOL.CreatePartLayer(PartName)
-- Pezzo e Layer
local sUNICode = EgtGetUUID().."_"
local Pz = EgtGroup(GDB_ID.ROOT,GDB_RT.LOC) -- pezzo
EgtSetName( Pz, sUNICode..PartName)
local LOut = EgtGroup(Pz,GDB_RT.LOC) -- layer della figura principale
@@ -317,8 +340,8 @@ function TOOL.CreatePart(nLayLoop, tbPart, bIsPlanar)
if bIsPlanar == nil then bIsPlanar = false end
-- se mancano le variabili di input le recupero dalla tabella generale
if not nLayLoop then
if TOOL.nLay then nLayLoop = TOOL.nLay end
if TOOL.tbInfo.nOutLay then nLayLoop = TOOL.tbInfo.nOutLay end
if TOOL.nLayLoopParent then nLayLoop = TOOL.nLayLoopParent end
if TOOL.tbInfo.nLayLoop then nLayLoop = TOOL.tbInfo.nLayLoop end
end
if not tbPart then tbPart = TOOL.tbInfo end
@@ -380,25 +403,53 @@ end
-- Nome dello spigolo,
-- Nome della copia riferimento
-- Info per spostamento Ref in funzione di una variabile
function TOOL.CreateReference( IdPart, sNameLayer,sNameEdge, dVar, sDir)
function TOOL.CreateReference( IdPart, sNameLayer,sNameEdge, nIn, dVar, sDir, sPartPairingName)
local tbLayer = TOOL.FindLayers( IdPart)
--accoppiamento di left su bottom
local IdEnt = EgtGetFirstNameInGroup(tbLayer[sNameLayer], sNameEdge)
if not IdEnt then
-- se l'edge è in un Inloop e sono presenti più inloop nel Parent allora uso l'indice nIn per scorrere fino all'Inloop giusto
if nIn and nIn ~= 1 then
local nLay = EgtGetFirstNameInGroup(IdPart, sNameLayer)
for i = 1, nIn do
nLay = EgtGetNextName(nLay)
end
IdEnt = EgtGetFirstNameInGroup(nLay, sNameEdge)
end
if not IdEnt then
CMP.ERR=6
CMP.MSG= CMP.MSG..' Non esiste il lato '..sNameEdge..' nel layer '..sNameLayer..' del part '..sNamePart
return
return
end
-- creo la copia dello spigolo come riferimento
local IdRef = EgtCopy( IdEnt, tbLayer['Ref'])
EgtSetInfo(IdRef, "OrigEdge", IdEnt)
local nNumRef = EgtGetGroupObjs(tbLayer['Ref'])
local sNameRef = "R"..tostring(nNumRef+ 1)
local nNumRef = EgtGetGroupObjs(tbLayer['Ref']) + 1
local sNameRef = "R"..tostring(nNumRef)
-- verifico che non esista già un altro ref con questo nome
local nIdRefDb= EgtGetFirstNameInGroup( tbLayer['Ref'], sNameRef)
while nIdRefDb do
nNumRef = nNumRef + 1
sNameRef = "R"..tostring(nNumRef)
nIdRefDb= EgtGetFirstNameInGroup( tbLayer['Ref'], sNameRef)
end
EgtSetName( IdRef, sNameRef)
if dVar and sDir then
EgtSetInfo(IdRef, 'Var', dVar)
EgtSetInfo(IdRef, 'Dir', sDir)
end
-- salvo nel riferimento il nome dell'edge da cui discende: A1 se da un outloop, A1_I1 se dal primo Inloop
if nIn then sNameEdge = sNameEdge.."_"..tostring(nIn) end
EgtSetInfo(IdRef, "Orig", sNameEdge)
-- salvo nel riferimento il nome del part che lo userà per associarsi ad IdPart (questa operazione la faccio solo per il riferimento del part destinatario)
if sPartPairingName then EgtSetInfo(IdRef,"PartPairing", sPartPairingName) end
-- devo controllare se il part a cui sto aggiungendo il riferimento ha già il solido allora devo applicare l'offset al riferimento!
-- (che altrimenti verrebbe fatto alla creazione del solido)
local nChild = EgtGetInfo(IdPart, "Child", "i")
if nChild then
SLD.CurrId = IdPart
SLD.CorrectReference()
end
return IdRef
end
--
@@ -448,13 +499,7 @@ function TOOL.SetPairInfo( tbInfo, nIdMyRef, sToNamePart, nIdRefDest, nPairSpin)
EgtSetInfo(nPart, "PairToRef", sToNamePart.."_"..sNameRefDest)
EgtSetInfo(nPart, "PairSpin", nPairSpin)
EgtSetInfo(nPart, "PairAng", tbInfo.dPairAng)
local nPairMode = 4
if tbInfo.nJunctionType == 1 then
nPairMode = 1
elseif tbInfo.nJunctionType == 2 then
nPairMode = 2
end
EgtSetInfo(nPart, "PairMode", nPairMode)
EgtSetInfo(nPart, "PairMode", tbInfo.nPairMode)
end
-- Disegna la quota lineare
@@ -595,23 +640,28 @@ function TJunction(dAngBetween, dTh1, dTh2, nType, dLen1, dLen2, bOnLoop)
-- restituisce le lunghezze L1 e L2 adattate in base al tipo di giunzione
-- nType == 1 -> TrimStart ( del Part2)
-- nType == 2 -> TrimEnd ( del Part1)
local dXOffset = 0
local dXOffset1 = 0
local dXOffset2 = 0
if not bOnLoop then bOnLoop = false end
if dAngBetween > 0 then
if nType == 1 then
-- trim start
local dDeltaStart = - dTh1 / sin(dAngBetween)
dLen2 = dLen2 + dDeltaStart
dXOffset = dDeltaStart
dXOffset2 = dDeltaStart
-- extend end
dLen1 = dLen1 + dTh1 * tan(90- math.abs(dAngBetween))
local dDeltaEnd = dTh1 * tan(90- math.abs(dAngBetween))
dLen1 = dLen1 + dDeltaEnd
dXOffset1 = dDeltaEnd
elseif nType == 2 then
-- trim end
dLen1 = dLen1 - dTh2 / sin(dAngBetween)
local dDeltaEnd = - dTh2 / sin(dAngBetween)
dLen1 = dLen1 + dDeltaEnd
dXOffset1 = dDeltaEnd
-- extend start
local dDeltaStart = dTh2 * tan(90- math.abs(dAngBetween))
dLen2 = dLen2 + dDeltaStart
dXOffset = dDeltaStart
dXOffset2 = dDeltaStart
end
else
-- qui sto estendendo le lunghezze, infatti gli angoli sono nergativi e quindi anche il loro seno
@@ -620,26 +670,29 @@ function TJunction(dAngBetween, dTh1, dTh2, nType, dLen1, dLen2, bOnLoop)
local dDelta = - dTh2 / sin(dAngBetween)
if not bOnLoop then dDelta = dDelta - dTh1 * tan(90 - math.abs(dAngBetween)) end
dLen1 = dLen1 + dDelta
dXOffset1 = dDelta
-- accorcio lo start
local dDeltaStart = - dTh2 * tan(90- math.abs(dAngBetween))
dLen2 = dLen2 + dDeltaStart
dXOffset = dDeltaStart
dXOffset2 = dDeltaStart
elseif nType == 2 then
-- il trim end diventa un extend start
local dDeltaStart = dTh1 / sin(dAngBetween)
if not bOnLoop then dDeltaStart = dDeltaStart + dTh2 * tan(90 - math.abs(dAngBetween)) end
dLen2 = dLen2 - dDeltaStart
dXOffset = dDeltaStart
dXOffset2 = dDeltaStart
-- accorcio l'end
dLen1 = dLen1 - dTh1 * tan(90- math.abs(dAngBetween))
local dDeltaEnd = - dTh1 * tan(90- math.abs(dAngBetween))
dLen1 = dLen1 + dDeltaEnd
dXOffset1 = dDeltaEnd
end
end
return dLen1, dLen2, dXOffset
return dLen1, dLen2, dXOffset1, dXOffset2
end
function AngleJunction(dAngBetween, dTh1, dTh2, dLen1, dLen2, bOnLoop)
-- modifico la lughezza dei lati solo se ho un angolo convesso
local dXOffest = 0
local dXOffset = 0
if not bOnLoop then
local dDelta1 = dTh2 / sin( dAngBetween)
local dDelta2 = dTh1 / sin( dAngBetween)
@@ -651,7 +704,7 @@ function AngleJunction(dAngBetween, dTh1, dTh2, dLen1, dLen2, bOnLoop)
dLen2 = dLen2 + dDelta2
end
end
return dLen1, dLen2, dXOffest
return dLen1, dLen2, dXOffset, dXOffset
end
function ManageJunction(dAngBetween, dTh1, dTh2, nType, dLen1, dLen2, bOnLoop)
@@ -681,7 +734,7 @@ function TOOL.CreateAdjustedPart( nLayOutloop, dLen, dH, dBeta1, dBeta2)
if not dH then dH = TOOL.tbInfo.dH end
if not dBeta1 then dBeta1 = TOOL.tbInfo.dAngBL end
if not dBeta2 then dBeta2 = TOOL.tbInfo.dAngBR end
if not nLayOutloop then nLayOutloop = TOOL.tbInfo.nOutLay end
if not nLayOutloop then nLayOutloop = TOOL.tbInfo.nLayLoop end
-- creo i lati del pezzo
local dProj1 = dH * tan( dBeta1 - 90)
@@ -746,13 +799,17 @@ function TOOL.CreateParetina(nEdgeId, tbInfo, dPairAngCorr)
local dLenPrev = EgtCurveLength(tbIdLoopTC[nPrev])
local dLenNext = EgtCurveLength(tbIdLoopTC[nNext])
local PrevAng, NextAng = GetPrevNextAng(tbIdLoopTC[i])
local dTh = tbInfo.dTh and tbInfo.dTh or EgtGetInfo(tbInfo.nId, 'dTh','d')
local dTh = tbInfo.dTh and tbInfo.dTh or EgtGetInfo(tbInfo.nId, 'Th','d')
local dThPrev = EgtGetInfo(tbInfo.nPrevId, 'Th','d') or 0
local dThNext = EgtGetInfo(tbInfo.nNextId, 'Th','d') or 0
-- calcolo l'angolo di sformo con il pezzo precedente
local dXOffset = 0
-- se i due pezzi hanno angoli di accoppiamento discordi allora uno sta sotto e uno sta sopra
local bSameSide = dPairAng * dPairAngPrev > 0
if bSameSide then
local dOffset = 0
if tbInfo.nJunctionType == 3 then
local dSideAngDx, _, dBeta_DX = CalcDraftAngle( vtDirPrev, vtDirCurr, dPairAngPrev, dPairAng, PrevAng)
--tbInfo.dAngBR = 180 - dBeta_DX
@@ -761,16 +818,18 @@ function TOOL.CreateParetina(nEdgeId, tbInfo, dPairAngCorr)
if PrevAng < 0 then dSideAngDx = dSideAngDx * (-1) end
tbInfo.dSideAngR = dSideAngDx
if not tbInfo.bOnLoop then
dLenPrev, dLen, _ = ManageJunction(PrevAng,dTh, dTh,tbInfo.nJunctionType, dLenPrev, dLen)
dLenPrev, dLen, _, dOffset = ManageJunction(PrevAng,dThPrev, dTh,tbInfo.nJunctionType, dLenPrev, dLen)
if tbInfo.nPairMode == 2 then dXOffset = dXOffset + dOffset end
end
else
-- se ho una giunzione a T allora devo aggiustare la lunghezza dei pezzi sia che la faccia sia On, sia che sia Off
dLenPrev, dLen, _ = ManageJunction(PrevAng,dTh, dTh,tbInfo.nJunctionType, dLenPrev, dLen)
dLenPrev, dLen, _, dOffset = ManageJunction(PrevAng,dThPrev, dTh,tbInfo.nJunctionType, dLenPrev, dLen)
-- setto il sideang da giunzione a T
local dSideAngDx = 90 - math.abs(PrevAng)
if tbInfo.bOnLoop then dSideAngDx = dSideAngDx * (-1) end
tbInfo.dSideAngR = dSideAngDx
tbInfo.dAngBR = 90
if tbInfo.nPairMode == 2 then dXOffset = dXOffset + dOffset end
end
else
-- setto il sideAng da giunzione a T (che va bene anche se la giunzione è angolata ma senza pezzo precedente)
@@ -782,30 +841,34 @@ function TOOL.CreateParetina(nEdgeId, tbInfo, dPairAngCorr)
if not tbInfo.bOnLoop then
local dOffset = dTh * tan( 90 - PrevAng)
dLen = dLen + dOffset
if tbInfo.nJunctionType == 2 then dXOffset = dXOffset + dOffset end
--if tbInfo.nJunctionType == 2 then dXOffset = dXOffset + dOffset end
if tbInfo.nPairMode == 2 then dXOffset = dXOffset + dOffset end
end
end
-- -- calcolo l'angolo di sformo con il pezzo successivo
bSameSide = dPairAng * dPairAngNext > 0
if bSameSide then
local dOffset = 0
if tbInfo.nJunctionType == 3 then
local dSideAngSx, dBeta_SX, __ = CalcDraftAngle( vtDirCurr, vtDirNext, dPairAng, dPairAngNext, NextAng)
local dSideAngSx, dBeta_SX, _ = CalcDraftAngle( vtDirCurr, vtDirNext, dPairAng, dPairAngNext, NextAng)
-- tbInfo.dAngBL = 180 - dBeta_SX
tbInfo.dAngBL = dBeta_SX
if tbInfo.bOnLoop then dSideAngSx = dSideAngSx * (-1) end
if NextAng < 0 then dSideAngSx = dSideAngSx * (-1) end
tbInfo.dSideAngL = dSideAngSx
if not tbInfo.bOnLoop then
dLen, dLenNext, _ = ManageJunction(NextAng, dTh, dTh, tbInfo.nJunctionType, dLen, dLenNext)
dLen, dLenNext, dXOffset, _ = ManageJunction(NextAng, dTh, dThNext, tbInfo.nJunctionType, dLen, dLenNext)
if tbInfo.nPairMode == 1 then dXOffset = dXOffset + dOffset end
end
else
-- se ho una giunzione a T allora devo aggiustare la lunghezza dei pezzi sia che la faccia sia On, sia che sia Off
dLen, dLenNext, _ = ManageJunction(NextAng, dTh, dTh, tbInfo.nJunctionType, dLen, dLenNext)
dLen, dLenNext, dXOffset, _ = ManageJunction(NextAng, dTh, dThNext, tbInfo.nJunctionType, dLen, dLenNext)
-- setto il sideang da giunzione a T
local dSideAngSx = 90 - math.abs(NextAng)
if tbInfo.bOnLoop then dSideAngSx = dSideAngSx * (-1) end
tbInfo.dSideAngL = dSideAngSx
tbInfo.dAngBL = 90
if tbInfo.nPairMode == 1 then dXOffset = dXOffset + dOffset end
end
else
-- setto il sideAng da giunzione a T (che va bene anche se la giunzione è angolata ma senza pezzo successivo)
@@ -817,7 +880,8 @@ function TOOL.CreateParetina(nEdgeId, tbInfo, dPairAngCorr)
if not tbInfo.bOnLoop then
local dOffset = dTh * tan( 90 - NextAng)
dLen = dLen + dOffset
if tbInfo.nJunctionType == 1 then dXOffset = dXOffset + dOffset end
--if tbInfo.nJunctionType == 1 then dXOffset = dXOffset + dOffset end
if tbInfo.nPairMode == 1 then dXOffset = dXOffset + dOffset end
end
end
tbInfo.dLen = dLen
@@ -829,6 +893,8 @@ local function ClearPart(nPartId)
-- svuoto i layer con gli elementi principali
EgtEmptyGroup(tbLayer["OutLoop"])
EgtEmptyGroup(tbLayer["Region"])
EgtEmptyGroup(tbLayer["Ref"])
EgtEmptyGroup(tbLayer["Labels"])
-- rimetto il frame del part nell'origine
EgtChangeGroupFrame(nPartId, GLOB_FRM())
-- resetto il gruppo di accoppiati
@@ -843,72 +909,149 @@ local function ClearPart(nPartId)
EgtSetInfo(nPartId, "Child", "")
end
-- local function AdaptNeighbour(nPartNeigh)
-- TOOL.tbInfo = {}
-- FillInfoTableFromPart(nPartNeigh)
-- end
local function CountInLoops(nEdgeId)
local nLay = EgtGetParent(nEdgeId)
local nParent = EgtGetParent(nLay)
local nNextLay = EgtGetFirstNameInGroup(nParent, "InLoop")
local c = 1
while nNextLay ~= nLay do
nNextLay = EgtGetNextName(nNextLay)
c = c + 1
end
return c
end
local function UpdateNeighInfo()
if not TOOL.nLay or TOOL.nLay == GDB_ID.NULL then TOOL.nLay = EgtGetParent(TOOL.nEdgeId) end
local nEdges = EgtGetGroupObjs(TOOL.nLay)
if not TOOL.nLayLoopParent or TOOL.nLayLoopParent == GDB_ID.NULL then TOOL.nLayLoopParent = EgtGetParent(TOOL.nEdgeId) end
local nEdges = EgtGetGroupObjs(TOOL.nLayLoopParent)
-- controllo il prev
local nPrev = TOOL.tbInfo.nEdge > 1 and TOOL.tbInfo.nEdge - 1 or nEdges -- numero ordinale della paretina precedente alla corrente
local sNamePrev = "A"..tostring(nPrev)
-- correggo il nome in caso l'edge appartenga ad un inloop
if not TOOL.tbInfo.bOutLoop then sNamePrev = sNamePrev.."_I"..tostring(TOOL.tbInfo.nIn) end
-- in nPrevId salvo già la paretina dello stesso tipo della corrente(alzatina o frontalino)
local tbPrev = EgtGetInfo(TOOL.tbInfo.nParent, sNamePrev, "vs")
local bSameSide = false
if tbPrev then
for _, NamePrev in pairs(tbPrev) do
sNamePrev = NamePrev
TOOL.tbInfo.nPrevId = EgtGetFirstNameInGroup( GDB_ID.ROOT, NamePrev)
local dPairAngPrev = EgtGetInfo(TOOL.tbInfo.nPrevId, "PairAng", "d")
if dPairAngPrev then bSameSide = TOOL.tbInfo.dPairAng * dPairAngPrev > 0 end
if bSameSide then break end
end
end
if not bSameSide then TOOL.tbInfo.nPrevId = GDB_ID.NULL end
-- al precedente setto il curr come Next
-- al corrente setto il prev
local sNamePrev = "A"..tostring(nPrev)
TOOL.tbInfo.nPrevId = EgtGetInfo(TOOL.tbInfo.nParent, sNamePrev, "i")
if TOOL.tbInfo.nPrevId then
EgtSetInfo(TOOL.tbInfo.nPrevId, "Next", TOOL.tbInfo.nId)
EgtSetInfo(TOOL.tbInfo.nId, "Prev", TOOL.tbInfo.nPrevId)
if TOOL.tbInfo.nPrevId and TOOL.tbInfo.nPrevId ~= GDB_ID.NULL then
EgtSetInfo(TOOL.tbInfo.nPrevId, "Next", TOOL.tbInfo.sName)
EgtSetInfo(TOOL.tbInfo.nId, "Prev", sNamePrev)
end
-- controllo il next
local nNext = TOOL.tbInfo.nEdge == nEdges and 1 or (TOOL.tbInfo.nEdge + 1)
local sNameNext = "A"..tostring(nNext)
-- correggo il nome in caso l'edge appartenga ad un inloop
if not TOOL.tbInfo.bOutLoop then sNameNext = sNameNext.."_I"..tostring(TOOL.tbInfo.nIn) end
-- in nNextId salvo già la paretina dello stesso tipo della corrente(alzatina o frontalino)
local tbNext = EgtGetInfo(TOOL.tbInfo.nParent, sNameNext, "vs")
bSameSide = false
if tbNext then
for _, NameNext in pairs(tbNext) do
sNameNext = NameNext
TOOL.tbInfo.nNextId = EgtGetFirstNameInGroup( GDB_ID.ROOT, NameNext)
local dPairAngNext = EgtGetInfo(TOOL.tbInfo.nNextId, "PairAng", "d")
if dPairAngNext then bSameSide = TOOL.tbInfo.dPairAng * dPairAngNext > 0 end
if bSameSide then break end
end
end
if not bSameSide then TOOL.tbInfo.nNextId = GDB_ID.NULL end
-- al successivo setto il curr come Prev
-- al corrente setto il next
local nNext = TOOL.tbInfo.nEdge == nEdges and 1 or TOOL.tbInfo.nEdge + 1
local sNameNext = "A"..tostring(nNext)
TOOL.tbInfo.nNextId = EgtGetInfo(TOOL.tbInfo.nParent, sNameNext, "i")
if TOOL.tbInfo.nNextId then
EgtSetInfo(TOOL.tbInfo.nNextId, "Prev", TOOL.tbInfo.nId)
EgtSetInfo(TOOL.tbInfo.nId, "Next", TOOL.tbInfo.nNextId)
if TOOL.tbInfo.nNextId and TOOL.tbInfo.nNextId ~= GDB_ID.NULL then
EgtSetInfo(TOOL.tbInfo.nNextId, "Prev", TOOL.tbInfo.sName)
EgtSetInfo(TOOL.tbInfo.nId, "Next", sNameNext)
end
end
function TOOL.CreateParetinaFull(bPrev, bNext)
function TOOL.CreateParetinaFull(bPrev, bNext, bRecurs)
if bPrev == nil then bPrev = TOOL.bPrev end
if bNext == nil then bNext = TOOL.bNext end
if bRecurs == nil then bRecurs = false end
-- se non ho ricevuto input li recupero dalla tabella generale
if not TOOL.nEdgeId then return end
if not TOOL.tbInfo.nId then
if not TOOL.tbInfo.nId or not bRecurs then
-- recupero tutte le info che mi servono (che vengono messe in TOOL.tbInfo)
FillInfoTable()
local nPairMode = 4
if TOOL.tbInfo.nJunctionType == 1 then
nPairMode = 1
elseif TOOL.tbInfo.nJunctionType == 2 then
nPairMode = 2
end
TOOL.tbInfo.nPairMode = nPairMode
end
TOOL.tbInfo.nLay = EgtGetParent(TOOL.tbInfo.nEdgeId)
TOOL.tbIdLoop = FindEdges(TOOL.tbInfo.nLay, TOOL.tbInfo) -- tabella che contiene gli id degli Edge del loop
TOOL.tbInfo.nLayLoopParent= EgtGetParent(TOOL.tbInfo.nEdgeId)
TOOL.tbIdLoop = FindEdges(TOOL.tbInfo.nLayLoopParent, TOOL.tbInfo) -- tabella che contiene gli id degli Edge del loop
-- determino se il l'edge è di un inloop o di un outloop
TOOL.tbInfo.bOutLoop = EgtGetName(EgtGetParent(TOOL.tbInfo.nEdgeId)) == "OutLoop"
if not TOOL.tbInfo.bOutLoop then TOOL.tbInfo.nIn = CountInLoops(TOOL.tbInfo.nEdgeId) end
-- controllo se nelle info del parent se era già stato creato il part associato a quel lato
-- controllo nelle info del parent se era già stato creato il part associato a quel lato
local sEdgeName = EgtGetName(TOOL.tbInfo.nEdgeId)
local nEdge = tonumber(string.sub(sEdgeName, 2))
-- se inloop correggo il nome dell'info da A1 a A1_I1, dove I1 indica il primo Inloop
if not TOOL.tbInfo.bOutLoop then sEdgeName = sEdgeName.."_I"..tostring(TOOL.tbInfo.nIn) end
if not TOOL.tbInfo.nParent or TOOL.tbInfo.nParent == GDB_ID.NULL then TOOL.tbInfo.nParent = EgtGetParent(EgtGetParent(TOOL.tbInfo.nEdgeId))end
local nChildPart = EgtGetInfo(TOOL.tbInfo.nParent, sEdgeName, "i")
local tbChildName = EgtGetInfo(TOOL.tbInfo.nParent, sEdgeName, "vs")
local nChildPart = nil
local dPairAng = 0
if not nChildPart then
local bFound = false
if tbChildName then
for _, sChildName in pairs(tbChildName) do
nChildPart = EgtGetFirstNameInGroup(GDB_ID.ROOT, sChildName)
if nChildPart then dPairAng = EgtGetInfo(nChildPart, "PairAng", "d") or 0 end
if math.abs(dPairAng - TOOL.tbInfo.dPairAng) < 0.001 then
bFound = true
break
end
end
end
if not bFound then
nChildPart = nil
dPairAng = 0
end
if not nChildPart or math.abs(dPairAng - TOOL.tbInfo.dPairAng) > 0.001 then
-- se il part non esiste, lo creo
local sPrefix = EgtGetName(EgtGetParent(TOOL.tbInfo.nEdgeId)) == "OutLoop" and "Part" or "InPart"
local sPrefix = "Part"
local sPartname = sPrefix..sEdgeName
TOOL.tbInfo.nId = TOOL.CreatePartLayer(sPartname)
sPartname = EgtGetName(TOOL.tbInfo.nId)
TOOL.tbInfo.sName = sPartname
UpdateNeighInfo()
--aggiorno le info dei child nel part parent
-- cerco se esiste già un altro part creato su quel lato (CONSIDERO CHE AL PIù SU UN LATO POSSANO COESISTERE UN'ALZATINA E UN FRONTALINO)
local sChildFromEdge = EgtGetInfo(TOOL.tbInfo.nParent, sEdgeName)
if sChildFromEdge then
sChildFromEdge = sChildFromEdge..","..sPartname
else
sChildFromEdge = sPartname
end
if TOOL.tbInfo.nParent then EgtSetInfo(TOOL.tbInfo.nParent, sEdgeName, sChildFromEdge) end
else
-- se esisteva già ripulisco i layer della regione e del loop ed elimino il solido
ClearPart(nChildPart)
TOOL.tbInfo.nId = nChildPart
TOOL.tbInfo.sName = EgtGetName(TOOL.tbInfo.nId)
-- recupero l'id di eventuali vicini
TOOL.tbInfo.nPrevId = EgtGetInfo(TOOL.tbInfo.nId, "Prev", "i") or GDB_ID.NULL
TOOL.tbInfo.nNextId = EgtGetInfo(TOOL.tbInfo.nId, "Next", "i") or GDB_ID.NULL
TOOL.tbInfo.nPrevId = EgtGetFirstNameInGroup(GDB_ID.ROOT, EgtGetInfo(TOOL.tbInfo.nId, "Prev")) or GDB_ID.NULL
TOOL.tbInfo.nNextId = EgtGetFirstNameInGroup(GDB_ID.ROOT, EgtGetInfo(TOOL.tbInfo.nId, "Next")) or GDB_ID.NULL
end
TOOL.tbInfo.sName = EgtGetName(TOOL.tbInfo.nId)
local tbLayers = TOOL.FindLayers(TOOL.tbInfo.nId)
TOOL.tbInfo.nOutLay = tbLayers["OutLoop"]
TOOL.tbInfo.nLayLoop = tbLayers["OutLoop"]
TOOL.CreateParetina()
TOOL.CreateAdjustedPart()
@@ -919,7 +1062,6 @@ function TOOL.CreateParetinaFull(bPrev, bNext)
-- creo i riferimenti e salvo i parametri del part
local sNamePartDest = EgtGetName(TOOL.tbInfo.nParent)
local sEdgeDest = EgtGetName(TOOL.tbInfo.nEdgeId)
local sRefDest = "R"..string.sub(sEdgeDest, 2)
local sLayEdgeDest = EgtGetName(EgtGetParent(TOOL.tbInfo.nEdgeId))
if TOOL.tbInfo.bOnLoop then
-- waterfall
@@ -935,36 +1077,35 @@ function TOOL.CreateParetinaFull(bPrev, bNext)
TOOL.tbInfo.sRefOff = tostring(TOOL.tbInfo.dXOffset)..','..tostring(TOOL.tbInfo.dYOffset)..',-x'
end
TOOL.tbInfo.dThParent = EgtGetInfo(TOOL.tbInfo.nParent, "Th", "d")
local nIdRefDest = TOOL.CreateReference( TOOL.tbInfo.nParent, sLayEdgeDest, sEdgeDest, TOOL.tbInfo.dThParent, TOOL.tbInfo.sDestRefOff)
local nIdMyRef = TOOL.CreateReference( TOOL.tbInfo.nId, 'OutLoop', 'A1', TOOL.tbInfo.dTh, TOOL.tbInfo.sRefOff)
local nIdRefDest = TOOL.CreateReference( TOOL.tbInfo.nParent, sLayEdgeDest, sEdgeDest, TOOL.tbInfo.nIn, TOOL.tbInfo.dThParent, TOOL.tbInfo.sDestRefOff, TOOL.tbInfo.sName)
local nIdMyRef = TOOL.CreateReference( TOOL.tbInfo.nId, 'OutLoop', 'A1', nil,TOOL.tbInfo.dTh, TOOL.tbInfo.sRefOff)
TOOL.SetPairInfo( TOOL.tbInfo, nIdMyRef, sNamePartDest, nIdRefDest, -1)
-- -- devo modificare anche la paretina precedente e la successiva
-- -- modifico anche la paretina precedente(se esiste)
-- local nNextId = TOOL.tbInfo.nNextId
-- local nCurr = TOOL.tbInfo.nId
-- if bPrev and TOOL.tbInfo.nPrevId and TOOL.tbInfo.nPrevId ~= GDB_ID.NULL then
-- FillInfoTableFromPart(TOOL.tbInfo.nPrevId)
-- TOOL.CreateParetinaFull(false, false)
-- end
-- -- modifico anche la paretina successiva(se esiste)
-- if bNext and nNextId and nNextId ~= GDB_ID.NULL then
-- FillInfoTableFromPart(nNextId)
-- TOOL.CreateParetinaFull(false, false)
-- end
-- devo modificare anche la paretina precedente e la successiva
-- modifico anche la paretina precedente(se esiste)
-- creo il solido e lo accoppio
--local nCurr = TOOL.tbInfo.nId -- debug -- SARà DA TOGLIERE quando scommento la parte di aggiornamento prev e next
if SLD then
SLD.CurrId = nCurr
SLD.CurrId = TOOL.tbInfo.nId
SLD.Main()
end
if ASS then
ASS.nVeinCtx = EgtGetContext()
ASS.nPartId = nCurr
ASS.nPartId = TOOL.tbInfo.nId
ASS.PairSingle()
end
local nNextId = TOOL.tbInfo.nNextId
if bPrev and TOOL.tbInfo.nPrevId and TOOL.tbInfo.nPrevId ~= GDB_ID.NULL then
FillInfoTableFromPart(TOOL.tbInfo.nPrevId)
TOOL.CreateParetinaFull(false, false, true)
end
-- modifico anche la paretina successiva(se esiste)
if bNext and nNextId and nNextId ~= GDB_ID.NULL then
FillInfoTableFromPart(nNextId)
TOOL.CreateParetinaFull(false, false, true)
end
TOOL.SaveMePlease()
-- pulisco la tabella con i dati
TOOL.tbInfo = {}