From e9fbae9561efebfeb87b7f3291e54829d881b165 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Thu, 6 Mar 2025 14:56:26 +0100 Subject: [PATCH] =?UTF-8?q?-=20aggiornato=20elenco=20parametri=20per=20per?= =?UTF-8?q?mettere=20la=20creazione=20di=20due=20tipi=20diversi=20di=20for?= =?UTF-8?q?i=20nei=20fondi=20di=20lavandino=20-=20aggiunta=20la=20possibil?= =?UTF-8?q?it=C3=A0=20di=20scrivere=20pi=C3=B9=20info=20in=20un=20pezzo=20?= =?UTF-8?q?in=20creazione.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TemplateTool.lua | 149 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 117 insertions(+), 32 deletions(-) diff --git a/TemplateTool.lua b/TemplateTool.lua index a306839..6011342 100644 --- a/TemplateTool.lua +++ b/TemplateTool.lua @@ -42,15 +42,18 @@ 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 TOOL.UUID = nil -- output per la generazione di un nuovo UUID -TOOL.dBoreX = nil -- posizione X del foro rispetto al primo lato del loop -TOOL.dBoreY = nil -- posizione Y del foro rispetto al primo lato del loop - +TOOL.dHoleX = nil -- posizione X del foro rispetto al vertice del loop esterno che viene spostato nell'origine +TOOL.dHoleY = nil -- posizione Y del foro rispetto al vertice del loop esterno che viene spostato nell'origine +TOOL.dHoleDimY = nil -- dimensione in X del foro +TOOL.dHoleDimY = nil -- dimensione in Y del foro +TOOL.dDepth = nil -- profondità del fondo del lavandino +TOOL.dDiamBore = nil -- diametro del foro del fondo del lavandino -- 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.tbInfo.InfoKey = nil -- key dell'info da settare alla creazione del part -TOOL.tbInfo.InfoValue = nil -- valore della info da settare alla creazione del part +TOOL.tbInfo.InfoKey = nil -- key dell'info da settare alla creazione del part (una lista divisa da virgole) +TOOL.tbInfo.InfoValue = nil -- valore della info da settare alla creazione del part (una lista divisa da virgole) TOOL.tbIdLoop = {} -- tabella con gli id del loop su cui sta venendo costruita la paretina @@ -87,6 +90,12 @@ function TOOL.ClearVariables() TOOL.bPrev = nil TOOL.bNext = nil TOOL.UUID = nil + TOOL.dHoleX = nil + TOOL.dHoleY = nil + TOOL.dHoleDimX = nil + TOOL.dHoleDimY = nil + TOOL.dDepth = nil + TOOL.dDiamBore = nil end function TOOL.SaveMePlease() @@ -174,6 +183,13 @@ local function FillInfoTable() if TOOL.dPairAng then TOOL.tbInfo.dPairAng = TOOL.dPairAng end if TOOL.bOnLoop then TOOL.tbInfo.bOnLoop = TOOL.bOnLoop end if TOOL.sName then TOOL.tbInfo.sName = TOOL.sName end + if TOOL.dSlopeAng then TOOL.tbInfo.dSlopeAng = TOOL.dSlopeAng end + if TOOL.dHoleX then TOOL.tbInfo.dHoleX = TOOL.dHoleX end + if TOOL.dHoleY then TOOL.tbInfo.dHoleY = TOOL.dHoleY end + if TOOL.dHoleDimX then TOOL.tbInfo.dHoleDimX = TOOL.dHoleDimX end + if TOOL.dHoleDimY then TOOL.tbInfo.dHoleDimY = TOOL.dHoleDimY end + if TOOL.dDepth then TOOL.tbInfo.dDepth = TOOL.dDepth end + if TOOL.dDiamBore then TOOL.tbInfo.dDiamBore = TOOL.dDiamBore end end function TOOL.FillInfoTableFromPart(nPartId) @@ -196,6 +212,13 @@ function TOOL.FillInfoTableFromPart(nPartId) TOOL.tbInfo.nEdge = EgtGetInfo(nPartId, "ParentEdge", "i") TOOL.tbInfo.bOutLoop = EgtGetInfo(nPartId, "FromOutLoop", "b") TOOL.tbInfo.nParent = EgtGetInfo(nPartId, "Parent","i") + TOOL.tbInfo.dSlopeAng = EgtGetInfo(nPartId, "Slope","d") + TOOL.tbInfo.dHoleX = EgtGetInfo(nPartId, "HolePosX", "d") + TOOL.tbInfo.dHoleY = EgtGetInfo(nPartId, "HolePosY", "d") + TOOL.tbInfo.dHoleDimX = EgtGetInfo(nPartId, "HoleDimX", "d") + TOOL.tbInfo.dHoleDimY = EgtGetInfo(nPartId, "HoleDimY", "d") + TOOL.tbInfo.dDepth = EgtGetInfo(nPartId, "Depth", "d") + TOOL.tbInfo.dDiamBore = EgtGetInfo(nPartId, "Diam", "d") if TOOL.tbInfo.bOutLoop then TOOL.tbInfo.nLayLoopParent = EgtGetFirstNameInGroup(TOOL.tbInfo.nParent, "OutLoop") else @@ -233,6 +256,13 @@ function TOOL.WriteDataToChildPart(tbInfo) if tbInfo.nNextId then EgtSetInfo(tbInfo.nId, "Next", EgtGetName(tbInfo.nNextId)) end if tbInfo.dSideAngR then EgtSetInfo(tbInfo.nId, "SideAngR", tbInfo.dSideAngR) end if tbInfo.dSideAngL then EgtSetInfo(tbInfo.nId, "SideAngL", tbInfo.dSideAngL) end + if tbInfo.dSlopeAng then EgtSetInfo(tbInfo.nId, "Slope", tbInfo.dSlopeAng) end + if tbInfo.dHoleX then EgtSetInfo(tbInfo.nId, "HolePosX", tbInfo.dHoleX) end + if TOOL.dHoleY then EgtSetInfo(tbInfo.nId, "HolePosY", tbInfo.dHoleY) end + if TOOL.dHoleDimX then EgtSetInfo(tbInfo.nId, "HoleDimX", tbInfo.dHoleDimX) end + if TOOL.dHoleDimY then EgtSetInfo(tbInfo.nId, "HoleDimY", tbInfo.dHoleDimY) end + if TOOL.dDepth then EgtSetInfo(tbInfo.nId, "Depth", tbInfo.dDepth) end + if TOOL.dDiamBore then EgtSetInfo(tbInfo.nId, "Diam", tbInfo.dDiamBore) end end -- CREAZIONE dei Layer di un singolo Part @@ -445,7 +475,11 @@ function TOOL.CreatePart(nLayLoop, tbPart, bOnly2D) -- setto eventualmente l'info addizionale if tbPart.InfoKey and tbPart.InfoKey ~= "" then - EgtSetInfo(tbPart.nId, tbPart.InfoKey, tbPart.InfoValue) + local tbKeys = EgtSplitString(tbPart.InfoKey, ",") + local tbValues = EgtSplitString(tbPart.InfoValue, ",") + for i, key in pairs(tbKeys) do + EgtSetInfo(tbPart.nId, key, tbValues[i]) + end end -- recupero l'Id del part @@ -1177,7 +1211,7 @@ local function CreateSplitBottomPart(tbInfo, i, tbIdEdges, nPrev, nNext) tbInfo.nEdgeId = tbIdEdges[i] tbInfo.sDestRefOff = '0,0,-x' tbInfo.sRefOff = '0,0,0' - tbInfo.dPairAng = 90 - TOOL.dSlopeAng + tbInfo.dPairAng = 90 - tbInfo.dSlopeAng tbInfo.nPairSpin = -1 tbInfo.nJunctionType = 3 tbInfo.bOnLoop = true @@ -1188,7 +1222,7 @@ local function CreateSplitBottomPart(tbInfo, i, tbIdEdges, nPrev, nNext) tbInfo.nId = nChildPart tbInfo.nEdgeId = tbIdEdges[i] tbInfo.sName = EgtGetName(tbInfo.nId) - tbInfo.dPairAng = 90 - TOOL.dSlopeAng + tbInfo.dPairAng = 90 - tbInfo.dSlopeAng tbInfo.nPairSpin = -1 tbInfo.nJunctionType = 3 tbInfo.sDestRefOff = '0,0,-x' @@ -1211,8 +1245,6 @@ local function CreateSplitBottomPart(tbInfo, i, tbIdEdges, nPrev, nNext) local dThParent = EgtGetInfo(tbInfo.nParent, "Th", "d") tbInfo.dThParent = dThParent if not tbInfo.bInsideLoop then - --tbInfo.dSideAngL = - tbInfo.dSideAngL - --tbInfo.dSideAngR = - tbInfo.dSideAngR local nParentJunctionType = EgtGetInfo(tbInfo.nParent, "JunctionType","i") if nParentJunctionType == 3 then local dSideAngR = EgtGetInfo(tbInfo.nParent, "SideAngR", "d") @@ -1245,6 +1277,7 @@ local function CreateSplitBottomPart(tbInfo, i, tbIdEdges, nPrev, nNext) local nMyRef = TOOL.CreateReference( tbInfo.nId, 'OutLoop', 'A1', nil, 0, tbInfo.sRefOff) local sNamePartDest = EgtGetName(tbInfo.nParent) TOOL.SetPairInfo( tbInfo, nMyRef, sNamePartDest, nIdToRef, -1) + -- creo il solido e lo accoppio if SLD then SLD.CurrId = tbInfo.nId @@ -1274,16 +1307,15 @@ function TOOL.CreateSplitBottom( tbIdEdges, dOffset) local nAuxPart = EgtGroup(GDB_ID.ROOT) local nAuxLay = EgtGroup(nAuxPart) - - local nLoop = EgtCurveCompoByChain(nAuxLay, tbIdEdges, EgtSP(tbIdEdges[1], GDB_RT.GLOB), false) - EgtInvertCurve(nLoop) + local nLoop = EgtCurveCompoByChain(nAuxLay, tbIdEdges, EgtSP(tbIdEdges[1], GDB_RT.GLOB), false, GDB_RT.GLOB) + --EgtInvertCurve(nLoop) -- ora che ho gli edge nell'ordine giusto ricostruisco la tabella dei parent local tbIdEdgesOrd = {} for i = 1, #tbIdEdges do local ptStart = EgtUP(nLoop, i - 1, GDB_ID.ROOT) for j = 1, #tbIdEdges do - if dist(ptStart, EgtEP(tbIdEdges[j], GDB_ID.ROOT)) < GEO.EPS_SMALL then + if dist(ptStart, EgtSP(tbIdEdges[j], GDB_ID.ROOT)) < GEO.EPS_SMALL then table.insert(tbIdEdgesOrd, tbIdEdges[j]) break end @@ -1296,16 +1328,41 @@ function TOOL.CreateSplitBottom( tbIdEdges, dOffset) end --porto la curva nel piano XY - local vtN = EgtCurveArea(nLoop) - local frLoc = Frame3d(EgtSP(nLoop, GDB_RT.GLOB), vtN) + EgtModifyCurveExtrusion(nLoop, V_NULL()) + local nOffLoop = EgtOffsetCurveAdv(nLoop, dOffset, GDB_OT.EXTEND) -- N.B.: qui spero che si sia mantenuto il numero di curve e di poter ancora associare le curve di offset con quelle originali e con il relativo part di origine + local vtN = EgtCurveArea(nOffLoop) + local frLoc = Frame3d(EgtSP(nOffLoop, GDB_ID.GLOB), -vtN) frLoc:invert() - EgtTransform(nLoop, frLoc, GDB_RT.GLOB) - local ptMin = EgtGetBBox(nLoop, 0):getMin() - EgtMove(nLoop, ORIG() - ptMin) + EgtTransform(nOffLoop, frLoc, GDB_RT.GLOB) + local ptMin = EgtGetBBox(nOffLoop, 0):getMin() + EgtMove(nOffLoop, ORIG() - ptMin) + local ptStartBefore = EgtSP(nOffLoop, GDB_ID.GLOB) + local nShift = 0 + -- sposto lo start nell'origine e aggiusto la lista dei parent di conseguenza + if not AreSamePointApprox(ptStart, ORIG()) then + -- conto di quante posizioni devo shiftare la tabella degli edge e dei parent, a seguito del prossimo cambio di start + EgtChangeClosedCurveStartPoint(nOffLoop, ORIG()) + for i = 1, #tbIdEdges do + local ptNext = EgtUP(nOffLoop, i - 1, GDB_ID.ROOT) + if not AreSamePointApprox( ptNext, ptStartBefore) then + nShift = nShift + 1 + else + break + end + end + nShift = #tbIdEdges - nShift + for i = 1, nShift do + table.insert(tbParent, tbParent[1]) + table.remove(tbParent, 1) + table.insert(tbIdEdges, tbIdEdges[1]) + table.remove(tbIdEdges, 1) + end + end + + TOOL.SaveMePlease() - EgtOffsetCurve(nLoop, dOffset, GDB_OT.EXTEND) -- N.B.: qui spero che si sia mantenuto il numero di curve e di poter ancora associare le curve di offset con quelle originali e con il relativo part di origine - local dOffsetMax = EgtCurveMaxOffset(nLoop) - TOOL.tbIdLoop = TOOL.ExplodeAndNameEdges( nLoop, false) + -- i lati sono ordine a partire dall'origine + TOOL.tbIdLoop = TOOL.ExplodeAndNameEdges( nOffLoop, false) -- creo i part con tutte le info local nPrev = GDB_ID.NULL @@ -1315,20 +1372,44 @@ function TOOL.CreateSplitBottom( tbIdEdges, dOffset) -- da intefaccia devo settare:----------------------------------------------- -- - TOOL.tbIdEdges -- - dOffset - -- - dSlopeAng - -- - dDiamBore + -- - dHoleX + -- - dHoleY + -- - dHoleDimX + -- - dHoleDimY -- - dTh for i = 1, #TOOL.tbIdLoop do tbInfo.nPrevId = nPrev tbInfo.dTh = TOOL.dTh tbInfo.nParent = tbParent[i] local dThParent = EgtGetInfo(tbInfo.nParent, "Th", "d") or 0 - tbInfo.dH = ((dOffsetMax - TOOL.dDiamBore/2) + dThParent) / cos(TOOL.dSlopeAng) + local ptHole = Point3d(TOOL.dHoleX, TOOL.dHoleY, 0) + local dDist = 0 + -- do per scontato che il loop sia un rettangolo e che ora abbia i lati allineati con gli assi X e Y + if i == 1 then + local ptNear = ptHole - Vector3d(TOOL.dHoleDimX/2, 0, 0) + dDist = EgtPointCurveDist( ptNear, TOOL.tbIdLoop[i]) + elseif i == 2 then + local ptNear = ptHole + Vector3d(0, TOOL.dHoleDimY/2, 0) + dDist = EgtPointCurveDist( ptNear, TOOL.tbIdLoop[i]) + elseif i == 3 then + local ptNear = ptHole + Vector3d(TOOL.dHoleDimX/2, 0, 0) + dDist = EgtPointCurveDist( ptNear, TOOL.tbIdLoop[i]) + elseif i == 4 then + local ptNear = ptHole - Vector3d(0, TOOL.dHoleDimY/2, 0) + dDist = EgtPointCurveDist( ptNear, TOOL.tbIdLoop[i]) + end + dDist = dDist + dThParent + tbInfo.dH = sqrt(pow(dDist,2) + pow(TOOL.dDepth,2)) + tbInfo.dSlopeAng = acos(dDist/tbInfo.dH) tbInfo.nEdge = 3 -- so già che il pezzo che creo si attaccherà al lato A3 del loop della paretina del lavandino local nCurr = CreateSplitBottomPart(tbInfo, i, TOOL.tbIdLoop, nPrev, nFirst) -- aggiungo l'info addizionale, se presente if tbInfo.InfoKey then - EgtSetInfo(tbInfo.nId, tbInfo.InfoKey, tbInfo.InfoValue) + local tbKeys = EgtSplitString(tbPart.InfoKey, ",") + local tbValues = EgtSplitString(tbPart.InfoValue, ",") + for i, key in pairs(tbKeys) do + EgtSetInfo(tbPart.nId, key, tbValues[i]) + end end if i == 1 then nFirst = nCurr end if i == #TOOL.tbIdLoop then tbInfo.nNextId = nFirst end @@ -1420,12 +1501,16 @@ function TOOL.CreateBottom(tbIdEdges) tbInfo.nId = CreatePartFromLoop(tbInfo, TOOL.tbIdLoop) - local ptCenter = Point3d(TOOL.dBoreX, TOOL.dBoreY, 0) + local ptCenter = Point3d(TOOL.dHoleX, TOOL.dHoleY, 0) TOOL.CreateCircularHole(tbInfo.nId, ptCenter, TOOL.dDiamBore) -- aggiungo l'info addizionale, se presente if tbInfo.InfoKey then - EgtSetInfo(tbInfo.nId, tbInfo.InfoKey, tbInfo.InfoValue) + local tbKeys = EgtSplitString(tbPart.InfoKey, ",") + local tbValues = EgtSplitString(tbPart.InfoValue, ",") + for i, key in pairs(tbKeys) do + EgtSetInfo(tbPart.nId, key, tbValues[i]) + end end -- creo i riferimenti e salvo i parametri del part @@ -1482,11 +1567,11 @@ local function UpdateNeighInfo() -- 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) + local nEdgePrevId = EgtGetFirstNameInGroup(TOOL.nLayLoopParent, sNamePrev) -- 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 -- 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 + if nEdgePrevId and 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 @@ -1510,11 +1595,11 @@ local function UpdateNeighInfo() -- controllo il next local nNext = TOOL.tbInfo.nEdge == nEdges and 1 or (TOOL.tbInfo.nEdge + 1) local sNameNext = "A"..EgtNumToString(nNext) + local nEdgeNextId = EgtGetFirstNameInGroup(TOOL.nLayLoopParent, sNameNext) -- 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 -- 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 + if nEdgeNextId and 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