aggiunta delle funzioni per il calcolo automatico delle dimensioni dei pezzi per il template piano cucina
This commit is contained in:
+186
-29
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user