- corretta la funzione per la creazione di un fondo di lavandino come pezzo unico.
This commit is contained in:
+142
-38
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user