- corretta la funzione per la creazione di un fondo di lavandino come pezzo unico.

This commit is contained in:
Daniele Bariletti
2025-02-26 11:54:15 +01:00
parent ea1e4778bf
commit f8af3d612c
+142 -38
View File
@@ -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)