- aggiornato elenco parametri per permettere la creazione di due tipi diversi di fori nei fondi di lavandino

- aggiunta la possibilità di scrivere più info in un pezzo in creazione.
This commit is contained in:
Daniele Bariletti
2025-03-06 14:56:26 +01:00
parent ebe2f0dd22
commit e9fbae9561
+117 -32
View File
@@ -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