diff --git a/TopChicken.lua b/TopChicken.lua index 5adde93..6f9e2fe 100644 --- a/TopChicken.lua +++ b/TopChicken.lua @@ -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