//---------------------------------------------------------------------------


#ifndef RackLoadH
#define RackLoadH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Buttons.hpp>
#include <Vcl.ComCtrls.hpp>
#include <Vcl.Grids.hpp>
#include <VCLTee.Chart.hpp>
#include <VCLTee.Series.hpp>
#include <VCLTee.TeeFunci.hpp>
#include <VclTee.TeeGDIPlus.hpp>
#include <VCLTee.TeEngine.hpp>
#include <VCLTee.TeeProcs.hpp>

#include "CSPIN.h"
#include <ComCtrls.hpp>
#include "MultiSupportBeam.h"
#include "SelectMod_Param.h"
#include "GArrow.h"
#include "Data_Gen.h"

#include <Vcl.Dialogs.hpp>
#include <System.ImageList.hpp>
#include <Vcl.ImgList.hpp>

#define PORTION_REGION 100  // начальный размер массива регионов
#define MAX_BEAM_DATA  100  // Максимальное количество моделей балок в депозитарии

#define zagrCONSTANT  0   // Постоянная
#define zagrTEMPORAR  1   // Временная
#define zagrTRANSIST  2   // Кратковременная

#define typeEI             0
#define typeLinearLoad     2
#define typeDistrN          4
#define typeConcentrLoad   5
#define typeConstraint     6

#define placeALL             0
#define placeUP              1
#define placeDOWN            2
#define placeDOWN_LEFT_RIGHT 3
#define placeDOWN_LEFT       4
#define placeDOWN_RIGHT      5

class TData3R
{
   public:
	 AnsiString Variant;
     AnsiString Function[100];
     AnsiString Koeff;
     TColor Color;
     AnsiString ItemSign;
     int Nfun;
};

//---------------------------------------------------------------------------
class TRackLoadFrame : public TFrame
{
__published:	// IDE-managed Components
	TPageControl *PageControl1;
	TTabSheet *TabSheetSourse;
	TGroupBox *GroupBox_Source;
	TLabel *Label_Length;
	TEdit *Edit_Length;
	TTabSheet *TabSheetResult;
	TChart *Chart1;
	TLineSeries *Series1;
	TAverageTeeFunction *TeeFunction1;
	TLineSeries *Series2;
	TLineSeries *Series3;
	TLineSeries *Series4;
	TLineSeries *Series5;
	TLineSeries *Series6;
	TLineSeries *Series7;
	TLineSeries *Series8;
	TPanel *Panel2;
	TListBox *ListBox1;
	TColorDialog *ColorDialog1;
	TBitBtn *BitBtnOutEMF;
	TLabel *Label1;
	TCSpinEdit *CSpinEditLineWidth;
	TPageControl *PageControl_BoundCond;
	TTabSheet *TabSheet_Load0;
	TTabSheet *TabSheet_dummy;
	TPageControl *PageControl_Load;
	TTabSheet *TabSheet_ConcentrLoad;
	TLabel *Label_X0Load;
	TLabel *Label_Fx;
	TLabel *Label_My;
	TLabel *Label_Fz;
	TEdit *Edit_X0Load;
	TEdit *Edit_Fx;
	TEdit *Edit_My;
	TEdit *Edit_Fz;
	TTabSheet *TabSheet_LinearLoad;
	TLabel *Label_x0;
	TLabel *Label_x1;
	TLabel *Label_p1;
	TLabel *Label_p2;
	TEdit *Edit_x0;
	TEdit *Edit_Len;
	TCheckBox *CheckBox_Linear;
	TEdit *Edit_p1;
	TEdit *Edit_p2;
	TTabSheet *TabSheet_DistrN;
	TLabel *Label_x0n;
	TLabel *Label_x1n;
	TLabel *Label_n1;
	TLabel *Label_n2;
	TEdit *Edit_x0n;
	TEdit *Edit_Len_n;
	TCheckBox *CheckBox_Linear_n;
	TEdit *Edit_n1;
	TEdit *Edit_n2;
	TComboBox *ComboBox_num_zagr;
	TLabel *Label3;
	TSpeedButton *SpeedButton_Add;
	TSpeedButton *SpeedButtonDelete;
	TComboBox *ComboBox_type_zagr;
	TLabel *Label_gamma_f;
	TBitBtn *BitBtn_Calculate;
	TEdit *Edit_gamma_f;
	TLabel *Label_koef_low;
	TEdit *Edit_koef_low;
	TSpeedButton *SpeedButtonTabl;
	TSpeedButton *SpeedButton_Apply;
	TLabel *Label_num_zagr;
	TComboBox *ComboBox_num_zagr_rez;
	TBitBtn *BitBtn_DeleteZagr;
	TPageControl *PageControl_TabLoads;
	TTabSheet *TabSheet_ConcLoads;
	TStringGrid *StringGrid_Loads;
	TTabSheet *TabSheet_LinLoads;
	TTabSheet *TabSheet_N_Loads;
	TTabSheet *TabSheet_Constraints;
	TStringGrid *StringGrid_Constr;
	TStringGrid *StringGrid_N;
	TStringGrid *StringGrid_q;
	TBitBtn *BitBtn_Add;
	TBitBtn *BitBtnDelete;
	TBitBtn *BitBtn_Replace;
	TLabel *Label5;
	TTabSheet *TabSheet_Combin;
	TLabel *Label4;
	TStringGrid *StringGrid_Combin;
	TListBox *ListBox2;
	TTabSheet *TabSheet_Constr_Raskrep;
	TLabel *Label2;
	TSpeedButton *SpeedButtonApp_Constr;
	TImageList *ImageList1;
	TBitBtn *BitBtn_CreateRSU;
	TSpeedButton *SpeedButton_CallCombin;
	TImage *Image1;
	TLabel *Label_Weight;
	TLabel *Label_step_down;
	TEdit *Edit_step_down;
	TLabel *Label6;
	TEdit *Edit_num_zagr;
	TBitBtn *BitBtn_ApplyConstr;
	TLabel *Label_excentr_Load;
	TEdit *Edit_excentr_Load;
	TLabel *Label_excentr_N;
	TEdit *Edit_excentr_N;
	TGroupBox *GroupBox_DOF;
	TCheckBox *CheckBox_Tx;
	TCheckBox *CheckBox_Ry;
	TCheckBox *CheckBox_Tz;
	TLabel *Label_X0Constr;
	TEdit *Edit_X0Constr;
	TStringGrid *StringGrid_koeff;
	TSpeedButton *SpeedButtonPaste_Length;
	TBitBtn *BitBtn_AddElem;
	TBitBtn *BitBtn_DelElem;
	TCSpinEdit *CSpinEdit_Etagh;
	TGroupBox *GroupBox_Constr0;
	TPageControl *PageControl2;
	TTabSheet *TabSheet_XZ;
	TSpeedButton *SpeedButtonFix_Free;
	TSpeedButton *SpeedButtonFix_Pin;
	TSpeedButton *SpeedButtonFix_Fix;
	TSpeedButton *SpeedButtonPin_Pin;
	TSpeedButton *SpeedButtonPin_Fix;
	TTabSheet *TabSheet_XY;
	TSpeedButton *SpeedButton_XY_fix;
	TSpeedButton *SpeedButton_XY_fix_pin;
	TSpeedButton *SpeedButton_XY_fix_fix;
	TSpeedButton *SpeedButton_XY_pin_pin;
	TSpeedButton *SpeedButton_XY_pin_fix;
	TLabel *Label_etagh;
	TEdit *Edit_level;
    void __fastcall ComboBoxKoeffChange(TObject *Sender);
        void __fastcall CSpinEditLineWidthChange(TObject *Sender);
        void __fastcall BitBtn_AddClick(TObject *Sender);
		void __fastcall InitRack(TObject *Sender);
        void __fastcall CheckBox_LinearClick(TObject *Sender);
        void __fastcall Edit_p1Change(TObject *Sender);
		void __fastcall BitBtn_CalculateClick(TObject *Sender);
		void __fastcall NewBalka(TObject *Sender);
        void __fastcall printExtremum (MultiSupportBeam oneFE);
        void __fastcall Alloc_region(int n_reg);
        void __fastcall ReAlloc_region(int n_reg);
		void __fastcall Free_region();
		int __fastcall Put_beam_data();
		int __fastcall Get_beam_data(int k);
        void __fastcall LoadDataToGrid_param(int type_param);
		void __fastcall BitBtnDeleteClick(TObject *Sender);
        double __fastcall CalcLengthBeam();
        void __fastcall BeamRegionToGrid_param(int type_region, BeamRegion br, int index_row, double b_e);
        void __fastcall LoadToGrid_param(Load ld, int index_row, double exc);
        void __fastcall ConstraintToGrid_param(Constraint cn, int index_row);
        void __fastcall StringGrid_LoadsSelectCell(TObject *Sender,
		  int ACol, int ARow, bool &CanSelect);
        void __fastcall  CheckRegion_at_Put(BeamRegion *P_v, int iP, int P_length, int k, int nP, double *e_v);
        void __fastcall  CheckLoad_at_Put(Load *P_v, int iP, int P_length, int k, int nP, double *e_v);
        void __fastcall  CheckConstraint_at_Put(Constraint *P_v, int iP, int P_length, int k, int nP);
        void __fastcall Draw_beam();
		void __fastcall Draw_opora(double zero_px, double zero_py, int i, float scale );
		void __fastcall Shtrih(TPoint *points, float s_s, float mx, float my);
        int __fastcall LoadDataFromGrid_param();
        void __fastcall BitBtn_InsertClick(TObject *Sender);
		void __fastcall Draw_load(double zero_px, double zero_py, int i, float scale, float scale_load);
		void __fastcall Draw_q_or_kp(AnsiString Name, TColor color, float mult, BeamRegion* Ar, double zero_px, double zero_py, int i, float scale, float scale_load, float step);
		void __fastcall printResult(double X);
        void __fastcall GetResult(int n_break);
        void __fastcall DrawOut(int nfun, int n_result, int *index);
		void __fastcall ListBox1Click(TObject *Sender);
        void __fastcall BitBtnOutEMFClick(TObject *Sender);
        void __fastcall Draw_N(TColor colorPen, TColor colorBrush, BeamRegion* Ar, double zero_px, double zero_py, int i, float scale, float scale_load, float step);
		int __fastcall  LoadDataFromGrid_ToText();
		void __fastcall BitBtn_ReplaceClick(TObject *Sender);
        void __fastcall InsertToGridFromText(int index_row);
	void __fastcall Edit_n1Change(TObject *Sender);
	void __fastcall CheckBox_Linear_nClick(TObject *Sender);
	void __fastcall SpeedButtonFix_FixClick(TObject *Sender);
	void __fastcall SpeedButtonPin_PinClick(TObject *Sender);
	void __fastcall CheckBox_TyClick(TObject *Sender);
	void __fastcall PageControl_BoundCondChange(TObject *Sender);
	void __fastcall PageControl_LoadChange(TObject *Sender);
	void __fastcall ChangeRegion(int type_region, TObject *Sender);
	void __fastcall ComboBox_num_zagrChange(TObject *Sender);
	void __fastcall SpeedButtonDeleteClick(TObject *Sender);
	void __fastcall ComboBox_type_zagrChange(TObject *Sender);
	void __fastcall PutZagrToDepo();
	void __fastcall SpeedButtonTablClick(TObject *Sender);
	void __fastcall Set_type_zagr(int num);
	void __fastcall SpeedButton_ApplyClick(TObject *Sender);
	void __fastcall GetRegion(int *k_zagr, int *length_q, BeamRegion **Aq, int *length_N, BeamRegion **AN,
										 int *length_loads, Load** Aloads, int *length_constr, Constraint** Aconstrint,
										 double **exc_N, double **exc_L);
	void __fastcall SpeedButton_AddClick(TObject *Sender);
	void __fastcall CalculateExecute(int k_beam, bool flag_out, double *q_down, double *q_down_LR, double *M_down_LR, TObject *Sender);
	void __fastcall ComboBox_num_zagr_rezChange(TObject *Sender);
	void __fastcall BitBtn_DeleteZagrClick(TObject *Sender);
	void __fastcall DeleteZagr(TObject *Sender);
	void __fastcall DeleteLoad(TObject *Sender);
	void __fastcall StringGrid_CombinSelectCell(TObject *Sender, int ACol, int ARow,
          bool &CanSelect);
//---------------------------------------------------------------------------
	void __fastcall DeleteSupp(TObject *Sender);
	void __fastcall SpeedButtonApp_ConstrClick(TObject *Sender);
	void __fastcall BitBtn_CreateRSUClick(TObject *Sender);
	void __fastcall SpeedButton_CallCombinClick(TObject *Sender);
	// Заполнение данных о стойке после чтения из архива
	void __fastcall Fill_field(TObject *Sender);
	void __fastcall Correct_Weight();
	void __fastcall PutParamSect(GEOM_PARAM_SECT *param_sect);
    // Получить индекс по имени поля
	int __fastcall GetIndexPlace(AnsiString place);
	void __fastcall SpeedButtonFix_FreeClick(TObject *Sender);
	void __fastcall SpeedButtonFix_PinClick(TObject *Sender);
	void __fastcall SpeedButtonPin_FixClick(TObject *Sender);
	void __fastcall CSpinEdit_EtaghChange(TObject *Sender);
	void __fastcall SpeedButton_XY_fixClick(TObject *Sender);
	void __fastcall SpeedButton_XY_fix_pinClick(TObject *Sender);
	void __fastcall SpeedButton_XY_fix_fixClick(TObject *Sender);
	void __fastcall SpeedButton_XY_pin_pinClick(TObject *Sender);
	void __fastcall SpeedButton_XY_pin_fixClick(TObject *Sender);
	void __fastcall BitBtn_ApplyConstrClick(TObject *Sender);
	void __fastcall ConfigForm_profil(int form_profil, TObject *Sender);
	void __fastcall ConfigPageControl_Load(int k, TObject *Sender);
	void __fastcall BitBtn_AddElemClick(TObject *Sender);
	void __fastcall BitBtn_DelElemClick(TObject *Sender);




private:	// User declarations
	 TArrow CoorAx;
	 float **matr_result;
	 float *x_result;
	 int n_result;
	 int n_fun;
	 int index_fun[10];
	 float Max_Value[10];
	 float Min_Value[10];
	 float Max_X[10];
	 float Min_X[10];
     int Margins;
	 int HText;
	 int StepGrid;
	 int k_result;    // Число точек в матрицах результатов
	 //AnsiString Place[10];

public:		// User declarations
		__fastcall TRackLoadFrame(TComponent* Owner);
			TData3R *Data;
	int Form_profil;
	int index_portion;
	BeamRegion* EI;  // Регионы поперечной жесткости
	BeamRegion* q_;  // Регионы погонной поперечной нагрузки
	BeamRegion* N_;  // Регионы эпюры продольных сил
	BeamRegion* Arbit;  // Обобщенные регионы
	double  *dist_eN;     // дистанция приложения распределенной нагрузки (от оси)
	double  *dist_eL;     // дистанция приложения сосредоточенной нагрузки (от оси)
	int       *A_length;
	Load*    loads;         // Точки задания сосредоточенных нагрузок
	Constraint* constr;     // Точки задания связей (опор)
	MultiSupportBeam beam_mod;
	int type_region;
	bool flag_rigid;   // true - если закреплений НЕ хватает для исключения перемещений ТТ
	int n_beam;        // число балок в депозитарии
	int k_beam;        // номер текущей балки
	double Length_rack;
	// Депозитарий
	BeamRegion* EI_v;  // Регионы поперечной жесткости
	BeamRegion* q_v;  // Регионы погонной поперечной нагрузки
	BeamRegion* N_v;  // Регионы эпюры продольных сил
	Load*    loads_v;         // Точки задания сосредоточенных нагрузок
	double  *dist_eNv;     // дистанция (эксцентриситет) приложения распределенной нагрузки (от оси)
	double  *dist_eLv;     // дистанция (эксцентриситет) приложения сосредоточенной нагрузки (от оси)
	//Constraint* constr_v;     // Точки задания связей (опор)
	int type_zagr[MAX_BEAM_DATA];  // тип загружения
	bool flag_weight[MAX_BEAM_DATA];  //флаг загружения Собственный вес
	double Koeff_gamma_f[MAX_BEAM_DATA];  // Коэффициенты надежности
	double Koeff_low[MAX_BEAM_DATA];  // Понижающий коэффициент
	int  index_beam[MAX_BEAM_DATA][7]; // начало регионов загружения в депозитарии

	double  Length_part[MAX_BEAM_DATA]; // Длины участков
	double  Koeff_length_XZ[MAX_BEAM_DATA]; // Коэффициенты расчетной длины участков
	double  Koeff_length_XY[MAX_BEAM_DATA]; // Коэффициенты расчетной длины участков
	int   N_part;    // Количество участков

	//int  length_beam[MAX_BEAM_DATA][7]; // длина регионов загружения
	int Len_v;               // текущай размер депозитария
	int SelectRow;
	int CombRow;
	bool flag_comb;  // Наличие заданных комбинаций
	int n_comb;
	double **Combin_zagr;
	double q_down_max;    // максимальная распределенная нагрузка в комбинации, приложенная к нижнему поясу балки
	double q_down_LR_max;   // максимальная распределенная нагрузка в комбинации от сил с плечом, приложенная к нижнему поясу балки
	double M_down_LR_max;   // максимальный момент от распределенной нагрузки LR
	double Len_XY;
	int    index_TY_up;    // флаг раскрепления вверху стойки
	double  Step_up;
	double  Step_comp_rack;  // = Step_comp
    int    index_raskr;   // индекс задания раскреплений сжатого пояса: 0 - не заданы; 1 - заданы

	double H_beam;   // Высота сечения
	double Width_down;   // ширина пластины или нижнего пояса балки
	double Zct_beam;  // координта ц.т. сечения относительно внешней грани
	double IE_beam;  // момент инерции сечения*модуль упругости
	double FE_beam;  // площадь сечения*модуль упругости
	double I_beam;  // момент инерции сечения*модуль упругости
	double F_beam;  // площадь сечения*модуль упругости
	double FRo_beam; // погонная масса балки, назначенная в SelectProfil
	double FRo_RSU; // погонная масса балки при которой были получены РСУ
	double Izz_RSU; // Момент инерции при котором были получены прогибы

	double MaxQ[MAX_BEAM_DATA][6]; // N, Q, M 0  0  X_sect
	double MaxR[MAX_BEAM_DATA][6]; // N, Q, M
	double MaxM[MAX_BEAM_DATA][6]; // N, Q, M
	double MinM[MAX_BEAM_DATA][6]; // N, Q, M
	double MaxSigma[MAX_BEAM_DATA][6];
	double MinSigma[MAX_BEAM_DATA][6];
	double MaxN[MAX_BEAM_DATA][6];
	double MinN[MAX_BEAM_DATA][6];
	double MaxV;  // Максимальный прогиб
	double Span;  // Размер пролета
	// РСУ от веса в сечении
	double MaxQ_W[MAX_BEAM_DATA][6]; // N, Q, M 0  0  0
	double MaxR_W[MAX_BEAM_DATA][6]; // N, Q, M
	double MaxM_W[MAX_BEAM_DATA][6]; // N, Q, M
	double MinM_W[MAX_BEAM_DATA][6]; // N, Q, M
	double MaxSigma_W[MAX_BEAM_DATA][6];
	double MinSigma_W[MAX_BEAM_DATA][6];
	double MaxN_W[MAX_BEAM_DATA][6];
	double MinN_W[MAX_BEAM_DATA][6];
	double MaxV_W;  // Максимальный прогиб от веса
	double FRo_W;    // Масса погонного метра, при которой были получены РСУ от веса
    double MaxMy_R;  // Максимальный момент на опоре (относительный)
};
//---------------------------------------------------------------------------
extern PACKAGE TRackLoadFrame *RackLoadFrame;
//---------------------------------------------------------------------------
#endif
