- 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:
+117
-32
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user