From f8af3d612c0df15c6fef86fdf5f65c68056042b7 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Wed, 26 Feb 2025 11:54:15 +0100 Subject: [PATCH] - corretta la funzione per la creazione di un fondo di lavandino come pezzo unico. --- TemplateTool.lua | 180 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 142 insertions(+), 38 deletions(-) diff --git a/TemplateTool.lua b/TemplateTool.lua index 9dc1a33..e4d1c83 100644 --- a/TemplateTool.lua +++ b/TemplateTool.lua @@ -4,7 +4,7 @@ -- Intestazioni require( 'EgtBase') _ENV = EgtProtectGlobal() -EgtEnableDebug( true) +EgtEnableDebug( false) ------------------------------------------------------------------------------------------------------------------------- -- FUNZIONI BASE PER GENERARE I COMPO SOLID INIZIO @@ -42,6 +42,8 @@ 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 -- info addizionali che potrebbero esserci nella tbInfo @@ -216,7 +218,7 @@ function TOOL.CreatePartLayer(PartName) 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 - EgtSetName(LOut,'OutLoop') + EgtSetName(LOut,'OutLoop') local LReg = EgtGroup(Pz,GDB_RT.LOC) -- layer regione EgtSetName(LReg,'Region') local LRef = EgtGroup(Pz,GDB_RT.LOC) -- layer riferimenti @@ -227,7 +229,6 @@ function TOOL.CreatePartLayer(PartName) local LAux= EgtGroup(Pz,GDB_RT.LOC) -- layer etichette EgtSetName(LAux,'Aux') EgtOutLog(' Creo Part: '..sUNICode..PartName) - --SaveMePlease() return Pz end -- @@ -380,21 +381,19 @@ function TOOL.AddInLoopToPart(nLayLoop) local IdLoop = EgtCurveCompoByChain( nLayLoop, tbIdEntCrv, EgtSP(tbIdEntCrv[1],GDB_RT.GLOB), false, GDB_RT.GLOB) -- Nel Layer Region definisco la regione piana local IdReg = EgtSurfFlatRegion(tbLayer['Region'],IdLoop) - -- Se InLoop allora faccio la sottrazione con la regione OutRegion - if bInLoop then - local IdOutRegion = EgtGetPrev(IdReg) - local vtNorm1 = EgtSurfFrNormVersor(IdOutRegion) - local vtNorm2 = EgtSurfFrNormVersor(IdReg) - if AreOppositeVectorApprox( vtNorm1, vtNorm2) then - EgtInvertSurf(IdReg) - end - if not EgtSurfFrSubtract( IdOutRegion,IdReg) then - CMP.ERR = 5 - CMP.MSG = CMP.MSG.." Sottrazione tra superficie 'OutLoop' "..EgtNumToString(IdOutRegion).." e 'InLoop' "..EgtNumToString(IdReg).." non riuscita." - end - EgtErase(IdReg) + -- faccio la sottrazione con la regione OutRegion + local IdOutRegion = EgtGetPrev(IdReg) + local vtNorm1 = EgtSurfFrNormVersor(IdOutRegion) + local vtNorm2 = EgtSurfFrNormVersor(IdReg) + if AreOppositeVectorApprox( vtNorm1, vtNorm2) then + EgtInvertSurf(IdReg) end + if not EgtSurfFrSubtract( IdOutRegion,IdReg) then + CMP.ERR = 5 + CMP.MSG = CMP.MSG.." Sottrazione tra superficie 'OutLoop' "..EgtNumToString(IdOutRegion).." e 'InLoop' "..EgtNumToString(IdReg).." non riuscita." + end + EgtErase(IdReg) -- elimino il contorno chiuso EgtErase(IdLoop) @@ -410,8 +409,8 @@ local HorizontalOffset = 0 -- dTh : spessore pezzo -- dOffset : per messa in piano dei pezzi (0 se non si usa) -- bInLoop : tipo di contorno -function TOOL.CreatePart(nLayLoop, tbPart, bIsPlanar) - if bIsPlanar == nil then bIsPlanar = false end +function TOOL.CreatePart(nLayLoop, tbPart, bOnly2D) + if bOnly2D == nil then bOnly2D = false end -- se mancano le variabili di input le recupero dalla tabella generale if not nLayLoop then if TOOL.nLayLoopParent then nLayLoop = TOOL.nLayLoopParent end @@ -444,14 +443,19 @@ function TOOL.CreatePart(nLayLoop, tbPart, bIsPlanar) -- INFO NECESSARIA EgtSetInfo(IdPart, 'Paired',EgtNumToString(IdPart)) - -- inserisco le etichette del pezzo nel centro della superofocie + -- inserisco le etichette del pezzo nel centro della superficie local ptTop = EgtCP( IdReg, GDB_RT.GLOB) local ptBottom = Point3d( ptTop:getX(), -ptTop:getY(), tbPart.dTh) + if not tbPart.sName then tbPart.sName = EgtGetName(tbPart.nId) end + if not tbPart.sName then + TOOL.nId = tbPart.nId + TOOL.RenameNewPart() + end local tbNamePart = EgtSplitString(tbPart.sName, "_") -- al nome del part tolgo il codice univoco local sNamePart = tbNamePart[2] EgtTextAdv(tbLayer['Labels'], ptTop,0,sNamePart, '', 10, '', 15,1.5,0,GDB_TI.MC) - if not bIsPlanar then + if not bOnly2D then EgtSetGridFrame(Frame3d(ORIG(),GDB_FR.BOTTOM)) EgtTextAdv(tbLayer['Labels'], ptBottom,0,sNamePart, '', 10, '', 15,1.5,0,GDB_TI.MC, GDB_RT.GRID) EgtSetGridFrame(Frame3d(ORIG(),GDB_FR.TOP)) @@ -1169,6 +1173,7 @@ local function CreateSplitBottomPart(tbInfo, i, tbIdEdges, nPrev, nNext) tbInfo.nEdge = 3 local dLenCorr = 0 local dThParent = EgtGetInfo(tbInfo.nParent, "Th", "d") + tbInfo.dThParent = dThParent if not tbInfo.bInsideLoop then --tbInfo.dSideAngL = - tbInfo.dSideAngL --tbInfo.dSideAngR = - tbInfo.dSideAngR @@ -1200,7 +1205,7 @@ local function CreateSplitBottomPart(tbInfo, i, tbIdEdges, nPrev, nNext) TOOL.CreatePart(tbLayerBottom['OutLoop'],tbInfo) -- creo i riferimenti e salvo i parametri del part - local nIdToRef = TOOL.CreateReference( tbInfo.nParent, 'OutLoop', 'A3', nil, tbInfo.dTh, tbInfo.sDestRefOff, tbInfo.sName) + local nIdToRef = TOOL.CreateReference( tbInfo.nParent, 'OutLoop', 'A3', nil, tbInfo.dThParent, tbInfo.sDestRefOff, tbInfo.sName) local nMyRef = TOOL.CreateReference( tbInfo.nId, 'OutLoop', 'A1', nil, 0, tbInfo.sRefOff) local sNamePartDest = EgtGetName(tbInfo.nParent) TOOL.SetPairInfo( tbInfo, nMyRef, sNamePartDest, nIdToRef, -1) @@ -1222,14 +1227,6 @@ end function TOOL.CreateSplitBottom( tbIdEdges, dOffset) -- raccolgo e/o ricostruisco i dati in input if not tbIdEdges then tbIdEdges = TOOL.tbIdEdges end -- tabella che contiene gli edge da cui voglio creare il fondello - -- riordino gli edge in modo che il primo lato sia il lato lungo del rettangolo - local dLen1 = EgtCurveLength(tbIdEdges[1]) - local dLen2 = EgtCurveLength(tbIdEdges[2]) - if dLen1 < dLen2 + GEO.EPS_SMALL then - -- sposto il primo elemento in fondo alla tabella - table.insert(tbIdEdges, tbIdEdges[1]) - table.remove(tbIdEdges, 1) - end if not dOffset then if TOOL.dOffset then @@ -1241,14 +1238,16 @@ 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) -- 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, EgtSP(tbIdEdges[j], GDB_ID.ROOT)) < GEO.EPS_SMALL then + if dist(ptStart, EgtEP(tbIdEdges[j], GDB_ID.ROOT)) < GEO.EPS_SMALL then table.insert(tbIdEdgesOrd, tbIdEdges[j]) break end @@ -1259,8 +1258,16 @@ function TOOL.CreateSplitBottom( tbIdEdges, dOffset) for _, nEdgeId in pairs(tbIdEdges) do table.insert(tbParent, EgtGetParent(EgtGetParent(nEdgeId))) end + + --porto la curva nel piano XY + local vtN = EgtCurveArea(nLoop) + local frLoc = Frame3d(EgtSP(nLoop, GDB_RT.GLOB), vtN) + frLoc:invert() + EgtTransform(nLoop, frLoc, GDB_RT.GLOB) + local ptMin = EgtGetBBox(nLoop, 0):getMin() + EgtMove(nLoop, ORIG() - ptMin) - 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 + 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) @@ -1275,33 +1282,33 @@ function TOOL.CreateSplitBottom( tbIdEdges, dOffset) -- - dSlopeAng -- - dDiamBore -- - dTh - for i = 1, #tbIdEdges do + 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) 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, tbIdEdges, nPrev, nFirst) + 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) end if i == 1 then nFirst = nCurr end - if i == #tbIdEdges then tbInfo.nNextId = nFirst end + if i == #TOOL.tbIdLoop then tbInfo.nNextId = nFirst end -- modifico le paretine vicine se serve local nNextId = TOOL.tbInfo.nNextId - local Prev_i = i == 1 and #tbIdEdges or (i - 1) - local Next_i = i == #tbIdEdges and 1 or (i + 1) + local Prev_i = i == 1 and #TOOL.tbIdLoop or (i - 1) + local Next_i = i == #TOOL.tbIdLoop and 1 or (i + 1) if tbInfo.nPrevId and tbInfo.nPrevId ~= GDB_ID.NULL then TOOL.FillInfoTableFromPart(tbInfo.nPrevId) - CreateSplitBottomPart(tbInfo, Prev_i, tbIdEdges, nil, nCurr) -- da modificare gli input per il prev + CreateSplitBottomPart(tbInfo, Prev_i, TOOL.tbIdLoop, nil, nCurr) -- da modificare gli input per il prev end if nNextId and nNextId ~= GDB_ID.NULL then TOOL.FillInfoTableFromPart(nNextId) - CreateSplitBottomPart(tbInfo, Next_i, tbIdEdges, nCurr, nil) -- da modificare gli input per il next + CreateSplitBottomPart(tbInfo, Next_i, TOOL.tbIdLoop, nCurr, nil) -- da modificare gli input per il next end -- pulisco la tabella con i dati @@ -1313,6 +1320,103 @@ function TOOL.CreateSplitBottom( tbIdEdges, dOffset) TOOL.ClearVariables() end +local function CreatePartFromLoop(tbInfo, tbIdEdges) + local Pz_Bottom = TOOL.CreatePartLayer('Bottom') + tbInfo.nId = Pz_Bottom + tbInfo.sName = EgtGetName(tbInfo.nId) + local tbLayers = TOOL.FindLayers(Pz_Bottom) + for i = 1, #tbIdEdges do + local nNewId = EgtCopyGlob(tbIdEdges[i], tbLayers['OutLoop']) + EgtSetName(nNewId, "A"..tostring(i)) + end + TOOL.CreatePart(tbLayers['OutLoop'], tbInfo) + return Pz_Bottom +end + +function TOOL.CreateBottom(tbIdEdges) + -- raccolgo e/o ricostruisco i dati in input + if not tbIdEdges then tbIdEdges = TOOL.tbIdEdges end -- tabella che contiene gli edge da cui voglio creare il fondello + + local nAuxPart = EgtGroup(GDB_ID.ROOT) + local nAuxLay = EgtGroup(nAuxPart) + local nLoop = EgtCurveCompoByChain(nAuxLay, tbIdEdges, EgtSP(tbIdEdges[1], GDB_RT.GLOB), false) + EgtInvertCurve(nLoop) + -- riordino gli edge partendo da un lato lungo + 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 + table.insert(tbIdEdgesOrd, tbIdEdges[j]) + break + end + end + end + tbIdEdges = tbIdEdgesOrd + -- come parent prendo il proprietario del primo lato + TOOL.tbInfo.nParent = EgtGetParent(EgtGetParent(tbIdEdges[1])) + + local dThParent = EgtGetInfo(TOOL.tbInfo.nParent, "Th", "d") or 0 + EgtModifyCurveExtrusion(nLoop, V_NULL()) + local nOffLoop = EgtOffsetCurveAdv(nLoop, dThParent, GDB_OT.EXTEND) + + --porto la curva nel piano XY + local vtN = EgtCurveArea(nOffLoop) + local frLoc = Frame3d(EgtSP(nOffLoop, GDB_RT.GLOB), vtN) + frLoc:invert() + EgtTransform(nOffLoop, frLoc, GDB_RT.GLOB) + local ptMin = EgtGetBBox(nOffLoop, 0):getMin() + EgtMove(nOffLoop, ORIG() - ptMin) + -- splitto la curva + TOOL.tbIdLoop = TOOL.ExplodeAndNameEdges( nOffLoop, false) + + -- creo il part con tutte le info + FillInfoTable() + local tbInfo = TOOL.tbInfo + -- da intefaccia devo settare:----------------------------------------------- + -- - dDiamBore + -- - dTh + -- - posizione X del foro, rispetto allo start del primo lato + -- - posizione Y del foro, rispetto allo start del primo lato + tbInfo.nPrevId = nPrev + tbInfo.dTh = TOOL.dTh + tbInfo.nEdge = 3 -- so già che il pezzo che creo si attaccherà al lato A3 del loop della paretina del lavandino + tbInfo.nId = CreatePartFromLoop(tbInfo, TOOL.tbIdLoop) + + + local ptCenter = Point3d(TOOL.dBoreX, TOOL.dBoreY, 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) + end + + -- creo i riferimenti e salvo i parametri del part + tbInfo.sDestRefOff = "0,0,-x" + tbInfo.nPairMode = 4 + tbInfo.dPairAng = 90 + tbInfo.nPairSpin = -1 + local nIdToRef = TOOL.CreateReference( tbInfo.nParent, 'OutLoop', 'A3', nil, tbInfo.dTh, tbInfo.sDestRefOff, tbInfo.sName) + 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 + SLD.Main() + end + + if ASS then + ASS.nVeinCtx = EgtGetContext() + ASS.nPartId = tbInfo.nId + ASS.PairSingle() + end + + EgtErase(nAuxPart) + TOOL.ClearVariables() +end + local function CountInLoops(nEdgeId) local nLay = EgtGetParent(nEdgeId) local nParent = EgtGetParent(nLay)