aggiunta delle funzioni per il calcolo automatico delle dimensioni dei pezzi per il template piano cucina

This commit is contained in:
Daniele Bariletti
2024-12-12 11:57:35 +01:00
parent 5ce9e807f2
commit 5b7678e5d3
+186 -29
View File
@@ -78,7 +78,7 @@ local sUNICode = os.date( '%y%m%d%H%M%S', os.time()).."_"
-------------------------------------------------------------------------------------------------------------------------
local function SaveMEPlease()
EgtSaveFile('c:\\EgtData\\OmagOFFICE\\Vein3D\\FUCK.nge')
EgtSaveFile('D:\\Temp\\marmo\\Vein3D\\FUCK.nge')
end
-- CREAZIONE dei Layer di un singolo Part
@@ -289,7 +289,7 @@ end
-- dTh : spessore pezzo
-- dOffset : per messa in piano dei pezzi (0 se non si usa)
-- bInLoop : tipo di contorno
local function CreatePart(tbLayer, sName, tbIdEntCrv, dTh, dOffset, bInLoop)
local function CreatePart(tbLayer, sName, tbIdEntCrv, dTh, bInLoop)
-- recupero il layer del contorno
local IdCurrLayer = EgtGetParent( tbIdEntCrv[1])
-- recupero l'Id del part
@@ -328,9 +328,9 @@ local function CreatePart(tbLayer, sName, tbIdEntCrv, dTh, dOffset, bInLoop)
EgtSetGridFrame(Frame3d(ORIG(),GDB_FR.TOP))
end
-- dispongo il pezzo in piano
local vtMove = Vector3d({dOffset,0,0})
local vtMove = Vector3d({HorizontalOffset,0,0})
--EgtMove(IdPart,vtMove, GDB_RT.GLOB)
HorizontalOffset = HorizontalOffset + ptTop:getX()*2
HorizontalOffset = HorizontalOffset + ptTop:getX() + 10
end
--
@@ -495,13 +495,13 @@ function ImportOutLoop( tbLayer, sNameFileNGE)
EgtErase(LastPart)
local tbIdLoop = ExplodeAndNameEdges( IdLoop)
EgtSetInfo(tbIdLoop[1],'AF',1)
EgtSetInfo(tbIdLoop[1],'AF',2)
EgtSetInfo(tbIdLoop[2],'AF',2)
EgtSetInfo(tbIdLoop[3],'AF',2)
EgtSetInfo(tbIdLoop[4],'AF',2)
EgtSetInfo(tbIdLoop[5],'AF',2)
EgtSetInfo(tbIdLoop[6],'AF',2)
EgtSetInfo(tbIdLoop[7],'AF',1)
EgtSetInfo(tbIdLoop[7],'AF',2)
SaveMEPlease()
-- definizione SideAng
-- EgtSetInfo( tbIdLoop[1], 'OrigSideAng', 45)
@@ -641,7 +641,7 @@ end
-- METODI AUSILIARI LOCALI FINE
-------------------------------------------------------------------------------------------------------------------------
-- Confronto i dati del fiel .dat con quelli letti da programma
-- Confronto i dati del file.dat con quelli letti da programma
local function IsDataChanged()
local bOk = false
if not tbOrigVal.v1 then return true end
@@ -656,6 +656,96 @@ local function IsDataChanged()
return bOk
end
local function CalcDraftAngle( vtDir1, vtDir2, dPairAng1, dPairAng2, dAngBetween)
-- vengono restituiti l'angolo in 3d, i due nuovi angoli di forma per i due pezzi
-- dBeta1 è riferito al pezzo 1 e dBeta2 è riferito al pezzo 2
local dAngTilt1 = dPairAng1 - 90
local dAngTilt2 = dPairAng2 - 90
local vtN1 = Vector3d({0,100,0})
local vtN2 = Vector3d({0,100,0})
vtN1:rotate(X_AX(),dAngTilt1)
vtN2:rotate(X_AX(), dAngBetween)
vtN2:rotate(Z_AX(), dPAng)
local vtPerp = vtN1 ^ vtN2
local vtInters1 = vtN1 ^ vtPerp
local vtInters2 = vtN2 ^ vtPerp
local dAng3d = GetRotation(vtInters1, vtInters2, vtPerp)
local dBeta1 = GetAngle( vtDir1 ^ vtPerp)
local dBeta2 = GetAngle( vtDir2 ^ vtPerp)
return dAng3d, dBeta1, dBeta2
end
local function TJunction(dAngBetween, dTh1, dTh2, nType, dLen1, dLen2)
-- restituisce le lunghezze L1 e L2 adattate in base al tipo di giunzione
-- nType == 1 -> TrimStart ( del Part2)
-- nType == 2 -> TrimEnd ( del Part1)
if dAngBetween > 0 then
if nType == 1 then
dLen2 = dLne2 - dTh1 / sin(dAngBetween)
elseif nType == 2 then
dLen1 = dLne1 - dTh2 / sin(dAngBetween)
end
else
if nType == 1 then
dLen1 = dLne1 - dTh2 / sin(dAngBetween)
elseif nType == 2 then
dLen2 = dLne2 - dTh1 / sin(dAngBetween)
end
end
return dLen1, dLen2
end
local function AngleJunction(dAngBetween, dTh1, dTh2, dLen1, dLen2)
-- modifico la lughezza dei lati solo se ho un angolo convesso
if dAngBetween > 0 then
dLen1 = dLen1 - dTh2 / sin( dAngBetween)
dLen2 = dLen2 - dTh1 / sin( dAngBetween)
end
return dLen1, dLen2
end
local function ManageJunction(dAngBetween, dTh1, dTh2, nType, dLen1, dLen2)
--nJunctionType -- 1 TrimStart, 2 TrimEnd, 3Ang
if nType == 1 or nType == 2 then
return TJunction(dAngBetween, dTh1, dTh2, nType, dLen1, dLen2)
elseif nType == 3 then
return AngleJunction(dAngBetween, dTh1, dTh2, dLen1, dLen2)
end
end
local function CreateAdjustedPart( nLayOutloop, dLen, dH, dTh, dBeta1, dBeta2)
-- genero la regione piana del rettangolo deformato :
-- dLen è la lunghezza del lato su cui si va ad agganciare il pezzo che sto creando, quindi è un dato fisso
-- bisogna calcolare gli altri tre lati del quadrilatero
-- dProj1 dProj2
-- __|_____________________________|__
-- \ | | / |
-- \ | beta1 beta2 | / |dH
-- \ |/___________dLen________\| / |
-- beta 1 e beta 2 sono gli angoli alla base
-- dLen1 e dLen2 sono le proiezioni delle diagonali sulla base maggiore
-- beta 1 e beta 2 possono essere < 90 e quindi potrei avere anche un trapezio ribaltato, oppure un quasi parallelogramma
local dProj1 = dH * tan( dBeta1 - 90)
local dProj2 = dH * tan( dBeta2 - 90)
local pt1 = ORIG()
local pt2 = Point3d(dLen,0,0)
local nLine1 = EgtLine( nLayOutloop, pt2, pt2)
local pt3 = Point3d(dLen + dProj2,dH,0)
local nLine2 = EgtLine( nLayOutloop, pt2, pt3)
local pt4 = Point3d( dPorj1,dH,0)
local nLine3 = EgtLine( nLayOutloop, pt3, pt4)
local nLine4 = EgtLine( nLayOutloop, pt4, pt1)
return {nLine1, nLine2, nLine3, nLine4}
end
local function SetSideAng(nLay, sEdgeName, dAng)
local nEdge = EgtGetFirstNameInGroup( nLay, sEdgeName)
EgtSetInfo( nEdge, 'SideAng', dAng)
EgtSetInfo( nEdge, 'OrigSideAng', dAng)
end
function CMP_Draw(bPreview)
local bRedraw = IsDataChanged()
if bRedraw or not CMP.DrawSolid then
@@ -674,38 +764,104 @@ function CMP_Draw(bPreview)
-- PIANO POLLO
local Pz_Top = CreatePartLayer( 'TopChicken')
-- Creo il contorno esterno
local tbIdLoop = ImportOutLoop( FindLayers( Pz_Top), sPath ..'\\'.. 'TopChicken.nge')
local tbIdLoop = ImportOutLoop( FindLayers( Pz_Top), sPath .. 'TopChicken.nge')
-- Creo il pezzo dato il contorno
CreatePart( FindLayers( Pz_Top), 'TopChicken', tbIdLoop, CMP.ST, 0)
for i=1, #tbIdLoop do
local nVal = EgtGetInfo(tbIdLoop[i], 'AF', 'i') or 0
if nVal == 2 then
CreatePart( FindLayers( Pz_Top), 'TopChicken', tbIdLoop, CMP.ST, false)
--local nJunctionType -- 1 TrimStart, 2 TrimEnd, 3Ang
local vtDirCurr = EgtSV( tbIdLoop[1], GDB_RT.GLOB)
local nPrev = #tbIdLoop
local vtDirPrev = EgtEV( tbIdLoop[nPrev], GDB_RT.GLOB)
local nNext = 2
local vtDirNext = EgtSV( tbIdLoop[nNext], GDB_RT.GLOB)
local nTypePrev = EgtGetInfo(tbIdLoop[nPrev], 'AF', 'i') or 0
local nTypeNext = EgtGetInfo(tbIdLoop[nNext], 'AF', 'i') or 0
local dPairAngPrev = 0
local dPairAngNext = 0
local dPairAng = 0
local dLen = EgtCurveLength(tbIdLoopTC[1])
local dLenPrev = EgtCurveLength(tbIdLoopTC[#tbIdLoopTC])
local dLenNext = EgtCurveLength(tbIdLoopTC[nNext])
local tbPartsInfo = {}
for i=1, #tbIdLoopTC do
local tbInfo = {}
local nType = EgtGetInfo(tbIdLoopTC[i], 'AF', 'i') or 0
vtDirNext = EgtSV( tbIdLoopTC[nNext])
if nTypePrev == 2 then
dPairAngPrev = -90
elseif nTypePrev == 1 then
dPairAngPrev = 90
end
if nTypeNext == 2 then
dPairAngNext = -90
elseif nTypeNext == 1 then
dPairAngNext = 90
end
if nType == 2 then
-- WATERFALL
local sNamePz = 'PartA'.. tostring(i)
local Pz_A = CreatePartLayer(sNamePz)
tbInfo.sName = sNamePz
local dH = 100
local sNamePz = 'A'.. tostring(i)..'Waterfall'
local Pz_A = CreatePartLayer(sNamePz)
local dLen = EgtCurveLength(tbIdLoop[i])
local PAng, NAng = GetPrevNextAng(tbIdLoop[i])
local tbIdLoopWF = CreateWaterfall( FindLayers(Pz_A), 'OutLoop', {dLen, dH,0}, PAng, NAng, IsPrevWaterfall(tbIdLoop, i), IsNextWaterfall(tbIdLoop, i))
CreatePart( FindLayers(Pz_A), sNamePz, tbIdLoopWF, CMP.ST, 0)
CreateReference( 'TopChicken', 'OutLoop', 'A'..tostring(i), 'R'..tostring(i), CMP.ST, '0,0,-x')
CreateReference(sNamePz, 'OutLoop', 'A3', 'R3', CMP.ST, '0,0,0')
SetPairInfo(sNamePz, 'R3', 'TopChicken', 'R'..tostring(i), -1, -90, 1)
elseif nVal == 1 then
tbInfo.dH = dH
dPairAng = -90
tbInfo.dPairAng = dPairAng
local nJunctionType = 3
dLenNext = EgtCurveLength(tbIdLoopTC[nNext])
local PAng, NAng = GetPrevNextAng(tbIdLoopTC[i])
local tbLayer = FindLayers(pz_A)
-- calcolo l'angolo di sformo con il pezzo precedente
local dAng3d_2, _, dBeta_DX = CalcDraftAngle( vtDirPrev, vtDirCurr, dPairAngPrev, dPairAng, PAng)
tbInfo.AngBR = dBeta_DX
tbInfo.SideAngR = dAng3d_2
dLenPrev, dLen = ManageJunction(PAng,CMP.ST, CMP.ST,nJunctionType, dLenPrev, dLen)
-- calcolo l'angolo di sformo con il pezzo successivo
local dAng3d_4, dBeta_SX, __ = CalcDraftAngle( vtDirCurr, vtDirNext, dPairAng, dPairAngNext, NAng)
tbInfo.AngBL = dBeta_SX
tbInfo.SideAngL = dAng3d_4
dLen, dLenNext = ManageJunction(NAng, CMP.ST, CMP.ST, nJunctionType, dLen, dLenNext)
tbInfo.dLen = dLen
tbInfo.sDestRefOff = '0,0,-x'
elseif nType == 1 then
-- SPLASHTOP
local dH = 200
dPairAng = 90
local sNamePz = 'A'.. tostring(i)..'Splahtop'
local Pz_A = CreatePartLayer(sNamePz)
local dLen = EgtCurveLength(tbIdLoop[i])
local PAng, NAng = GetPrevNextAng(tbIdLoop[i])
local tbIdLoopWF, PAng = CreateSplashtop( FindLayers(Pz_A), 'OutLoop', {dLen, dH,0}, PAng, NAng, IsPrevSplashtop(tbIdLoop, i), IsNextSplashtop(tbIdLoop, i))
CreatePart( FindLayers(Pz_A), sNamePz, tbIdLoopWF, CMP.ST, 0)
local dLen = EgtCurveLength(tbIdLoopTC[i])
local PAng, NAng = GetPrevNextAng(tbIdLoopTC[i])
-- local tbIdLoopTC, PAng = CreateSplashtop( FindLayers(Pz_A), 'OutLoop', {dLen, dH,0}, PAng, NAng, IsPrevSplashtop(tbIdLoop, i), IsNextSplashtop(tbIdLoop, i))
-- CreatePart( FindLayers(Pz_A), sNamePz, tbIdLoopWF, CMP.ST, 0)
CreateReference( 'TopChicken', 'OutLoop', 'A'..tostring(i), 'R'..tostring(i), CMP.ST, '0,0,0')
CreateReference(sNamePz, 'OutLoop', 'A3', 'R3', CMP.ST, tostring(sin(PAng)*CMP.ST)..',0,-x')
SetPairInfo(sNamePz, 'R3', 'TopChicken', 'R'..tostring(i), -1, 90, 1)
end
tbPartsInfo[tbInfo.sName] = tbInfo
nPrev = i
nNext = i == #tbIdLoopTC and 1 or i + 1
vtDirPrev = vtDirCurr
vtDirCurr = vtDirNext
vtDirNext = EgtSV(nNext, GDB_RT.GLOB)
dLenPrev = dLen
dLen = dLenNext
dLenNext = EgtCurveLength(tbIdLoopTC[nNext])
nTypePrev = nType
nType = nTypeNext
nTypeNext = EgtGetInfo(tbIdLoopTC[nNext], 'AF', 'i') or 0
end
for sNamePz, tbPart in pairs( tbPartsInfo) do
local nPart = EgtGetFirstNameInGroup(GDB_ID.ROOT, sNamePz)
if nPart then
local nEdge = string.sub(sNamePz, 6)
local tbLayer = FindLayers(nPart)
local tbIdLoop = CreateAdjustedPart( tbLayer['OutLoop'],tbPart.dLen, tbPart.dH, CMP.ST, tbPart.dAngBL, tbPart.dAngBR)
CreatePart(tbLayer,sNamePz,tbIdLoop,CMP.ST,false)
CreateReference( 'TopChicken', 'OutLoop', 'A'..tostring(nEdge), 'R'..tostring(nEdge), CMP.ST, tbPart.sDestRefOff)
CreateReference(sNamePz, 'OutLoop', 'A3', 'R3', CMP.ST, '0,0,0')
SetPairInfo(sNamePz, 'R3', 'TopChicken', 'R'..tostring(nEdge), -1, tbPart.dPairAng, 1)
SetSideAng(nPart, 'A2', tbPart.dSideAngR)
SetSideAng(nPart, 'A4', tbPart.dSideAngL)
end
end
CreateLayerDimension()
@@ -725,7 +881,8 @@ function CMP_Draw(bPreview)
SaveCompoData(CMP.Npar)
OrigData()
end
EgtSaveFile(EgtGetStringFromIni( "Vein3D", "Vein3D_Dir", "", EgtGetIniFile()) ..'\\'.. "FOO.nge")
--EgtSaveFile(EgtGetStringFromIni( "Vein3D", "Vein3D_Dir", "", EgtGetIniFile()) ..'\\'.. "FOO.nge")
EgtSaveFile("D:\\Temp\\marmo\\Vein3D\\creazione_generica.nge")
end
end