From 89b6b80260101da8cd8971a6ab60cd38c3e941fe Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Thu, 27 Feb 2025 12:18:31 +0100 Subject: [PATCH] - aggiunta controlli per la gestione degli edge di un part. --- TemplateTool.lua | 129 +++++++++++++++++++++++++++++------------------ 1 file changed, 81 insertions(+), 48 deletions(-) diff --git a/TemplateTool.lua b/TemplateTool.lua index e4d1c83..3883a29 100644 --- a/TemplateTool.lua +++ b/TemplateTool.lua @@ -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