//---------------------------------------------------------------------------
#include <vcl.h>
#include <math.h>
#include <stdio.h>

#pragma hdrstop

#include "Get_param_sect_prof.h"
//---------------------------------------------------------------------------

#pragma package(smart_init)

#include "Data_Gen.h"
#include "ListConst.h"
#include "ProcExt.h"
//#include "message.h"
#include "StandartProfil.h"
#include "Get_param_sect_gnu.h"
#include "Get_param_sect_func.h"


static TStandartProfil StandartProfil;
//-----------------------------------------------------------
// Вычислить геометрические параметры сечения для стержней фермы. Здесь тип для сечений труб, уголков и гнутого швеллера
// по классификации StandartProfil
void Get_param_sect_prof(COMMON_SECT* section, GEOM_PARAM_SECT *param_sect) {
   double h_i, b_i, t_i;
   double d_o, d_i;
   double c_kr, h_kr, b_kr, hs, bs, beta;
   COMMON_SECT section_tube;
   double stat_mom;
   double * ParamProfil;
   double Rad;
   double rad;
   double Yct;
     double Ar;
     double Hsect;
     double Bsect;
     double fG;
     double Ixx, Iyy, Ixy;
     double x0;
     double y0;
   bool flag_rad;

   param_sect->Iyz = 0.0;
   param_sect->Rad = 0;
   param_sect->Ye = param_sect->Ze = 0;
   param_sect->omega[0] = param_sect->omega[1] = param_sect->omega[2] = param_sect->omega[3] = 0;
   param_sect->Iw = 0;

   switch ((int)section->dvutavr.type_profil) {
   case DVUTAVR:  //
	  Get_param_sect(&(section->dvutavr), param_sect);
   break;
   case RECTANCULAR: // прямоугольник
     Get_param_sect_comm(RECTANCULAR, section, param_sect);
   break;
   case typeRECT:  // труба прямоуголного сечения
     Get_param_sect_comm(RECT_TUBE, section, param_sect);
   break;
   case typeSQUARE:  // труба прямоугольного сечения
     Get_param_sect_comm(SQUARE_TUBE, section, param_sect);
   break;
   case typeCIRC:  // труба круглого сечения
     Get_param_sect_comm(CIRCULAR_TUBE, section, param_sect);
   break;
   case TAVR:  // тавр
     Get_param_sect_comm(TAVR, section, param_sect);
   break;
   case CHANNEL:  // швеллер
   case typeCHANNEL_BEND:  // швеллер
     Get_param_sect_comm(CHANNEL, section, param_sect);
   break;
   case typeCORNER_EQU:  // уголок
   case typeCORNER_NOEQU:  // уголок
   case typeCORNER_EQU_B:  // уголок
   case typeCORNER_NOEQU_B:  // уголок
     StandartProfil.SetProfil_Tube(section->corner_two.type_profil);
     ParamProfil = StandartProfil.GetVectorParamProfil_Tube(section->corner_two.n_group, section->corner_two.n_profil);
     if (ParamProfil == NULL) {
	  #ifdef EMBRAC
	   int rc = Application->MessageBox(L"Get_param_sect_prof:Программная ошибка. Номер группы и/или номер профиля уголка неверны",
			   L"Вычисление геометрических параметров сечения ", MB_OK | MB_ICONERROR);
	  #else
	   int rc = Application->MessageBox("Get_param_sect_prof:Программная ошибка. Номер группы и/или номер профиля уголка неверны",
			   "Вычисление геометрических параметров сечения ", MB_OK | MB_ICONERROR);
	  #endif
	   return;
     }

     Hsect = section->corner_two.by;
     Bsect = section->corner_two.bx;
	 fG = section->corner_two.fG;
     x0 = section->corner_two.x0;
     y0 = section->corner_two.y0;
     switch (section->corner_two.type_profil) {
     case typeCORNER_EQU:
       Ar = ParamProfil[parAREA_COR];
       Iyy = ParamProfil[parIYY_COR];
       Ixx = Iyy;
       Ixy = ParamProfil[parIXY_COR];
     break;
     case typeCORNER_NOEQU:
       Ar = ParamProfil[parAREA_COR];
       Iyy = ParamProfil[parIYY_COR];
	   Ixx = ParamProfil[parIXX_COR];
       Ixy = ParamProfil[parIXY_CORN];
     break;
     case typeCORNER_EQU_B:
       Ar = ParamProfil[parAREA_COR];
       Iyy = ParamProfil[parIYY_COR];
       Ixx = Iyy;
       Ixy = (ParamProfil[parIX0_COR_B] - ParamProfil[parIY0_COR_B])/2;
     break;
     case typeCORNER_NOEQU_B:
       Ar = ParamProfil[parAREA_CORN_B];
       Iyy = ParamProfil[parIYY_CORN_B];
       Ixx = ParamProfil[parIXX_CORN_B];
       Ixy = (ParamProfil[parIX0_CORN_B] - ParamProfil[parIY0_CORN_B])/2;
     break;
	 }
	 param_sect->Rad = 0;
	 switch (section->corner_two.index_top)  {
	 case 0:  // T
		param_sect->Ar = 2*Ar;
		param_sect->Hsect = Hsect;
		param_sect->Wsect = Bsect*2 + fG;
		param_sect->Izz = 2*Ixx;
		param_sect->Iyy = 2*Iyy + 2*Ar*(x0 + fG/2)*(x0 + fG/2);
		param_sect->Iyz = 2*Ixy;
		param_sect->Zct = y0;
		param_sect->Yct = 0;
		param_sect->ky = param_sect->Hsect*section->corner_two.t*2/param_sect->Ar;
		param_sect->kz = param_sect->Wsect*section->corner_two.t*2/param_sect->Ar;
	 break;
	 case 1:   // X
		param_sect->Ar = 2*Ar;
		param_sect->Hsect = Hsect*2 + fG;
		param_sect->Wsect = Bsect*2 + fG;
		param_sect->Izz = 2*Ixx + 2*Ar*(y0 + fG/2)*(y0 + fG/2);
		param_sect->Iyy = 2*Iyy + 2*Ar*(x0 + fG/2)*(x0 + fG/2);
		param_sect->Iyz = 2*Ixy + 2*Ar*(x0 + fG/2)*(y0 + fG/2);
		param_sect->Zct = 0; //param_sect->Hsect/2;
		param_sect->Yct = 0;
		param_sect->ky = param_sect->Hsect*section->corner_two.t*2/param_sect->Ar;
		param_sect->kz = param_sect->Wsect*section->corner_two.t*2/param_sect->Ar;
	 break;
	 case 2:
		param_sect->Ar = Ar;
		param_sect->Hsect = Hsect;
		param_sect->Wsect = Bsect;
		param_sect->Izz = Ixx;
		param_sect->Iyy = Iyy;
		param_sect->Iyz = Ixy;
		param_sect->Zct = y0;
		param_sect->Yct = x0;
		param_sect->ky = param_sect->Hsect*section->corner_two.t/param_sect->Ar;
		param_sect->kz = param_sect->Wsect*section->corner_two.t/param_sect->Ar;
	 break;
	 }
	 param_sect->Hp = param_sect->Hsect;
	 param_sect->Zp = param_sect->Zct;

	 param_sect->Itor = 1;

     param_sect->point_stress[0][0] = param_sect->Zct - param_sect->Hsect;
     param_sect->point_stress[0][1] = param_sect->Wsect/2;
     param_sect->point_stress[1][0] = param_sect->point_stress[0][0];
     param_sect->point_stress[1][1] = -param_sect->point_stress[0][1];
     param_sect->point_stress[2][0] = param_sect->Zct;
     param_sect->point_stress[2][1] = -param_sect->Wsect/2;
	 param_sect->point_stress[3][0] = param_sect->point_stress[2][0];
     param_sect->point_stress[3][1] = -param_sect->point_stress[2][1];

     // координаты Z точек вычисчления касательных напряжений (относительно ц.т)
     param_sect->z_tau[2] = 0;
     param_sect->z_tau[0] = param_sect->Zct - section->corner_two.t;
     param_sect->z_tau[1] = param_sect->Zct - param_sect->Hsect;
     // Статические моменты для вычисления касательных в стенке
     param_sect->Sx[0] = Round(param_sect->Ar*param_sect->Zct, 0); // точка в ц.т.
     param_sect->Sx[1] = Round(param_sect->Ar*(param_sect->Zct - section->corner_two.t), 0); // точка на стенке в стыке с внешним поясом
     param_sect->Sx[2] = Round(param_sect->Ar*(param_sect->Zct - param_sect->Hsect), 0); // точка на стенке в стыке с внутренним поясом

     param_sect->Sy[0] = 0;
     param_sect->Sy[1] = 0;
     param_sect->Sy[2] = 0;

     param_sect->Ar = Round(param_sect->Ar, 0);
	 param_sect->Itor = Round(param_sect->Itor, 0);
	 param_sect->Izz = Round(param_sect->Izz, 0);
	 param_sect->Iyy = Round(param_sect->Iyy, 0);
	 param_sect->Itor = Round(param_sect->Itor, 0);
	 param_sect->index_orient = section->corner_two.index_orient;
   break;
   case typeGNU_CH:
   case typeGNU_C:
   case typeGNU_Z:
   case typeGNU_SIGMA:
     // Вычисление параметров сечения
     Get_param_sect_gnu(&section->gnutic, param_sect, &flag_rad);
     // Вычисление параметров эффективного сечения
     //Get_param_eff_bend(Ry, E_, &sect_gnu, &param_sect_eff);
   break;
   default:
	  #ifdef EMBRAC
	   int rc = Application->MessageBox(L"Get_param_sect_prof (1):Профиль не обрабатывается",
			   L"Вычисление геометрических параметров сечения ", MB_OK | MB_ICONERROR);
	  #else
	   int rc = Application->MessageBox("Get_param_sect_prof (1):Профиль не обрабатывается",
			   "Вычисление геометрических параметров сечения ", MB_OK | MB_ICONERROR);
	  #endif

	  param_sect->Ar = 0;
	  param_sect->Hsect = 0;
	  param_sect->Zct = 0;
	  param_sect->Iyy = 0;
	  param_sect->Izz = 0;
	  param_sect->Hp = param_sect->Hsect;
	  param_sect->Zp = param_sect->Zct;
	  param_sect->Itor = 0;
	  param_sect->ky = param_sect->kz = 0;
	  param_sect->point_stress[0][0] = 0;
	  param_sect->point_stress[0][1] = 0;
	  param_sect->point_stress[1][0] = 0;
	  param_sect->point_stress[1][1] = 0;
      param_sect->point_stress[2][0] = 0;
      param_sect->point_stress[2][1] = 0;
      param_sect->point_stress[3][0] = 0;
      param_sect->point_stress[3][1] = 0;
      //ErrorMessage("Для сечения типа " +IntToStr(type)+" геометрические характеристики не вычисляются");
   }
   param_sect->Ar = Round(param_sect->Ar, 0);
   param_sect->Itor = Round(param_sect->Itor, 0);
   param_sect->Izz = Round(param_sect->Izz, 0);
   param_sect->Iyy = Round(param_sect->Iyy, 0);
   param_sect->Itor = Round(param_sect->Itor, 0);

}

