- aggiunta controlli per la gestione degli edge di un part.

This commit is contained in:
Daniele Bariletti
2025-02-27 12:18:31 +01:00
parent f8af3d612c
commit 89b6b80260
+81 -48
View File
@@ -108,6 +108,10 @@ function TOOL.RenameNewPart()
sNewName = sNewName..sCurrName
end
EgtSetName(TOOL.nId,sNewName)
-- aggiungo anche l'info Paired
local sPaired = EgtGetInfo(TOOL.nId, "Paired")
if not sPaired then EgtSetInfo(TOOL.nId, "Paired", EgtNumToString(TOOL.nId)) end
end
local function FindEdges(nLay, tbInfo)
@@ -115,14 +119,13 @@ local function FindEdges(nLay, tbInfo)
-- trova l'indice del lato tbInfo.nEdgeId, 1 based, restituito in tbInfo.nEdge
local tbId = {}
local nId = EgtGetFirstInGroup(nLay)
local c = 1
while nId do
if tbInfo and tbInfo.nEdgeId ~= GDB_ID.NULL and tbInfo.nEdgeId then
if nId == tbInfo.nEdgeId then tbInfo.nEdge = c end
if nId == tbInfo.nEdgeId then tbInfo.nEdge = EgtEvalNumExpr(string.sub(EgtGetName(tbInfo.nEdgeId), 2)) end
end
table.insert(tbId, nId)
local sName = EgtGetName(nId) or ""
if string.sub(sName,1,1) == "A" then table.insert(tbId, nId) end
nId = EgtGetNext(nId)
c = c + 1
end
return tbId
end
@@ -982,24 +985,35 @@ function TOOL.CreateParetina(nEdgeId, tbInfo, dPairAngCorr)
if #tbIdLoopTC == 0 and tbInfo then
tbIdLoopTC = TOOL.tbIdLoop
end
if not nEdgeId then
if tbInfo.nEdgeId then
nEdgeId = tbInfo.nEdgeId
elseif tbInfo.nLayLoopParent and tbInfo.nEdge then
nEdgeId = EgtGetFirstNameInGroup(tbInfo.nLayLoopParent, "A"..tostring(tbInfo.nEdge))
end
end
if #tbIdLoopTC == 0 then return end
local i = tbInfo.nEdge -- posizione del lato nel layer del loop
if dPairAngCorr == nil then dPairAngCorr = 0 end
local nPrev = i > 1 and i - 1 or #tbIdLoopTC
local nNext = i < #tbIdLoopTC and i + 1 or 1
local nLay = EgtGetParent(nEdgeId)
local nPrevEdgeId = EgtGetFirstNameInGroup(nLay, "A"..EgtNumToString(i > 1 and (i - 1) or #tbIdLoopTC)) or GDB_ID.NULL
if nPrevEdgeId ~= GDB_ID.NULL and not AreSamePointApprox( EgtEP(nPrevEdgeId, GDB_RT.GLOB), EgtSP(nEdgeId, GDB_RT.GLOB)) then nPrevEdgeId = GDB_ID.NULL end
local nNextEdgeId = EgtGetFirstNameInGroup(nLay, "A"..EgtNumToString(i < #tbIdLoopTC and (i + 1) or 1)) or GDB_ID.NULL
if nNextEdgeId ~= GDB_ID.NULL and not AreSamePointApprox( EgtSP(nNextEdgeId, GDB_RT.GLOB), EgtEP(nEdgeId, GDB_RT.GLOB)) then nNextEdgeId = GDB_ID.NULL end
if not tbInfo.nPrevId then tbInfo.nPrevId = GDB_ID.NULL end
local dPairAng = (tbInfo.dPairAng or 0)
dPairAng = dPairAng + dPairAngCorr
local dPairAngPrev = (EgtGetInfo(tbInfo.nPrevId, 'PairAng', 'd') or 0) + dPairAngCorr
if not tbInfo.nNextId then tbInfo.nNextId = GDB_ID.NULL end
local dPairAngNext = (EgtGetInfo(tbInfo.nNextId, 'PairAng', 'd') or 0) + dPairAngCorr
local vtDirCurr = EgtSV( tbIdLoopTC[i], GDB_RT.GLOB)
local vtDirNext = EgtSV( tbIdLoopTC[nNext], GDB_RT.GLOB)
local vtDirPrev = EgtEV( tbIdLoopTC[nPrev], GDB_RT.GLOB)
local dLen = EgtCurveLength(tbIdLoopTC[i])
local dLenPrev = EgtCurveLength(tbIdLoopTC[nPrev])
local dLenNext = EgtCurveLength(tbIdLoopTC[nNext])
local PrevAng, NextAng = GetPrevNextAng(tbIdLoopTC[i])
local vtDirCurr = EgtSV( nEdgeId, GDB_RT.GLOB)
local vtDirNext = EgtSV( nNextEdgeId, GDB_RT.GLOB)
local vtDirPrev = EgtEV( nPrevEdgeId, GDB_RT.GLOB)
local dLen = EgtCurveLength(nEdgeId)
local dLenPrev = EgtCurveLength(nPrevEdgeId)
local dLenNext = EgtCurveLength(nNextEdgeId)
local PrevAng, NextAng = GetPrevNextAng(nEdgeId)
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
@@ -1429,56 +1443,75 @@ local function CountInLoops(nEdgeId)
return c
end
local function GetActualEdgeNum( nLay)
local nId = EgtGetFirstInGroup(nLay)
local nCount = 0
while nId ~= nil and nId ~=GDB_ID.NULL do
local sName = EgtGetName(nId) or ""
if string.sub(sName,1,1) == "A" then nCount = nCount + 1 end
nId = EgtGetNext(nId)
end
return nCount
end
local function UpdateNeighInfo()
if not TOOL.nLayLoopParent or TOOL.nLayLoopParent == GDB_ID.NULL then TOOL.nLayLoopParent = EgtGetParent(TOOL.nEdgeId) end
local nEdges = EgtGetGroupObjs(TOOL.nLayLoopParent)
local nEdges = GetActualEdgeNum(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"..EgtNumToString(nPrev)
-- correggo il nome in caso l'edge appartenga ad un inloop
if not TOOL.tbInfo.bOutLoop then sNamePrev = sNamePrev.."_I"..EgtNumToString(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
-- controllo che l'edge col nome precedente sia effettivamente il segmento precedente al corrente
local nEdgePrevId = EgtGetFirstNameInGroup(TOOL.nLayLoopParent, sNamePrev)
if AreSamePointApprox(EgtSP(TOOL.nEdgeId, GDB_ID.ROOT), EgtEP(nEdgePrevId, GDB_ID.ROOT)) then
-- 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
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
end
if not bSameSide then TOOL.tbInfo.nPrevId = GDB_ID.NULL end
-- al precedente setto il curr come Next
-- al corrente setto il prev
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"..EgtNumToString(nNext)
-- correggo il nome in caso l'edge appartenga ad un inloop
if not TOOL.tbInfo.bOutLoop then sNameNext = sNameNext.."_I"..EgtNumToString(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
-- controllo che l'edge col nome successivo sia effettivamente il segmento precedente al corrente
local nEdgeNextId = EgtGetFirstNameInGroup(TOOL.nLayLoopParent, sNameNext)
if AreSamePointApprox(EgtEP(TOOL.nEdgeId, GDB_ID.ROOT), EgtSP(nEdgeNextId, GDB_ID.ROOT)) then
-- in nNextId salvo già la paretina dello stesso tipo della corrente(alzatina o frontalino)
local tbNext = EgtGetInfo(TOOL.tbInfo.nParent, sNameNext, "vs")
local 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
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
if not bSameSide then TOOL.tbInfo.nNextId = GDB_ID.NULL end
-- al successivo setto il curr come Prev
-- al corrente setto il next
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