Система проектирования расчета раскроя и укладки

0

 

 

Заключение

 

Данная работа актуальна, так как в данное время необходима автоматизация проектирования расчета раскроя листового материала.

Построение оптимальных карт раскроя материала является одной из самых трудоемких задач заготовительного производства. В тоже время это одна из самых важных задач в ресурсосберегающих технологиях, поскольку напрямую ведет к экономии материала и снижению отходов. В настоящее время для решения этой задачи активно используются все возрастающие возможности современных ЭВМ, что позволило значительно ускорить и упростить процесс генерации раскройных карт по сравнению с неавтоматизированными методами. Авторская программа, разработанная в рамках данной дипломной работы сокращает до минимума временные затраты, чем повышает производительность труда. Программа производит все нужные расчеты, соединяется с файлами баз данных, в которых хранится все справочная информация. В конечном итоге выдает пользователю файл с результатами расчета.

Также был расчитан экономический эффект и срок окупаемости проекта, проанализированы условия труда, произведен расчет категорий тяжести и напряженности труда, рассмотрены основные чрезвычайные ситуации.

 

 


Список использованных источников

1 Архангельский А.Я. Программирование в Borland C++. – М.: ООО «Бином-пресс», 2005 г. – 1152 с.: ил.

2 Хомоненко А.Д.  Borland C++ / под общ. ред. А.Д. Хомоненко. – Спб.: БХВ-Петербург, 2003. – 1216 с.: ил.

3 А. Хомоненко, С. Ададуров. Работа с базами данных в С++ Builder

Учебник для ВУЗов. – М.: Высш.шк., 2005. – 541 с.: ил.

3 Норенков, И. П. Основы автоматизированного проектирования / И.П. Норенков. - М: изд-во МГТУ им.Н.Э.Баумана, 2000. –360с.

 

 

 

 

 

 

 

 

 

 

 

 

 


Приложение А

Листинг программы

 

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

#include <vcl.h>

#pragma hdrstop

#include "Main.h"

#include <IniFiles.hpp>                 //модуль для работы с *.ini файлами

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

#pragma package(smart_init)

#pragma resource "*.dfm"

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

TMainForm *MainForm;                    //главное окно приложения

vector <SShape> CircleVect;                            //вектор форм плитки

vector <SShape> CircleVectS;                         //вектор форм участков укладки

int NumCircle=-1,NumCircleS=-1;         //номер формы плитки

int NumCircleMove=-1,NumCircleMoveS=-1; //номер узла

bool ChangeShp=false,ChangeShpS=false;  //флаг завершения рисования формы плитки

bool LRM=true,LRMS=true;                  //флаг кнопки мыши

vector<TPoint>UnionBrush;                                     //соединительная кисть

bool UB=false;                                        //флаг использования кисти выделения формы плитки

TPoint Erase;                                          //эталонная точка для стирания узла

#define AngleCount 50                                              //количество узлов в окружности

#define EllipsRadius 10                                    //радиус окружности

float Square=0;                         //площадь текущей формы плитки

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

//условие удаления окружности

bool DelCircle ( SShape & I )

{

   if(I.Poliline.size()==0)return true;

   else return false;

}

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

//условие удаления узла

bool DelPic ( TPoint & I )

{

   if(I.x==-1 && I.y==-1)return true;

   else return false;

}

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

//инициализация класса формы

__fastcall TMainForm::TMainForm(TComponent* Owner): TForm(Owner)

{

   //загрузить настройки

   LoadOpt();

   //получить список имён форм плитки

   GetListName(ListBoxM->Items,0);

   //получить список имён поверхностей укладки

   GetListName(ListBoxS->Items,1);

}

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

//при изменении размера формы

void __fastcall TMainForm::FormResize(TObject *Sender)

{

       //корректировать положение и размер ползунков

       SB_Hor->Top=PageControl1->Height-50;

       SB_Hor->Width=PageControl1->Width-225;

 

       SB_Vert->Left=PageControl1->Width-30;

       SB_Vert->Height=PageControl1->Height-60;

 

       SB_HorS->Top=PageControl1->Height-50;

       SB_HorS->Width=PageControl1->Width-225;

 

       SB_VertS->Left=PageControl1->Width-30;

       SB_VertS->Height=PageControl1->Height-60;

 

   //размер листа форм плитки в привязке к масштабу

       SB_Hor->Min=0;

       if(RNE_Length->Text.ToInt()>ImageM->Width/RNE_PixInMM->Text.ToInt())SB_Hor->Max=RNE_Length->Text.ToInt()-(ImageM->Width/RNE_PixInMM->Text.ToInt());

       else SB_Hor->Max=0;

       SB_Hor->Position=0;

       SB_Vert->Min=0;

       if(RNE_Length->Text.ToInt()>ImageM->Height/RNE_PixInMM->Text.ToInt())SB_Vert->Max=RNE_Length->Text.ToInt()-(ImageM->Height/RNE_PixInMM->Text.ToInt());

       else SB_Vert->Max=0;

       SB_Vert->Position=0;

       //корректировать размер BITMAP листа форм плитки

       ImageM->Picture->Bitmap->Width=ImageM->Width;

       ImageM->Picture->Bitmap->Height=ImageM->Height;

       //размер листа поверхности укладки в привязке к масштабу

       SB_HorS->Min=0;

       if(RNE_LengthS->Text.ToInt()>ImageS->Width/RNE_PixInMMS->Text.ToInt())SB_HorS->Max=RNE_LengthS->Text.ToInt()-(ImageS->Width/RNE_PixInMMS->Text.ToInt());

       else SB_HorS->Max=0;

       SB_HorS->Position=0;

       SB_VertS->Min=0;

       if(RNE_LengthS->Text.ToInt()>ImageS->Height/RNE_PixInMMS->Text.ToInt())SB_VertS->Max=RNE_LengthS->Text.ToInt()-(ImageS->Height/RNE_PixInMMS->Text.ToInt());

       else SB_VertS->Max=0;

       SB_VertS->Position=0;

       //корректировать размер BITMAP листа поверхности укладки

       ImageS->Picture->Bitmap->Width=ImageS->Width;

       ImageS->Picture->Bitmap->Height=ImageS->Height;

 

   //расчитать коэфициент масштабирования. Отрисовать сетку, формы плиток,поверхность укладки.

   RePaintForm(ImageM,RNE_PixInMM->Text.ToInt(),RNE_Length->Text.ToInt(),SB_Hor,SB_Vert,CircleVect);

   RePaintForm(ImageS,RNE_PixInMMS->Text.ToInt(),RNE_LengthS->Text.ToInt(),SB_HorS,SB_VertS,CircleVectS);

}

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

//при изменении размера масштабирования

void __fastcall TMainForm::RePaintForm(TImage * Image,int PixInMM,int LenInMM,TScrollBar *H,TScrollBar *V,vector<SShape> & Vect)

{

       //очистить канву, обновить значение миллиметрового масштаба

       Image->Canvas->Pen->Color=clBlack;

       Image->Canvas->Brush->Color=clWhite;

    Image->Canvas->Rectangle(0,0,Image->Width,Image->Height);

 

       //рисовать сетку

       int j=H->Position;

       for(int i=H->Position;i<H->Position+Image->Width;i++)

        {

                 //сантиметры

                 if(i>0 && i%10==0)

                          {

                                    Image->Canvas->Pen->Color=clBlack;

                                    if(j%20==0)Image->Canvas->TextOutA((i-2-H->Position)*PixInMM,2,j);

                                    if((i-H->Position)*PixInMM>35)

                                             {

                                                      Image->Canvas->MoveTo((i-H->Position)*PixInMM,15);

                                                      Image->Canvas->LineTo((i-H->Position)*PixInMM,25);

 

                                                      Image->Canvas->Pen->Color=clAqua;

                                                      Image->Canvas->MoveTo((i-H->Position)*PixInMM,25);

                                                      Image->Canvas->LineTo((i-H->Position)*PixInMM,Image->Height);

                                             }

                          }

                 //миллиметры

                 if((i-H->Position)*PixInMM>35)

                          {

                                    Image->Canvas->Pen->Color=clBlack;

                                    Image->Canvas->MoveTo((i-H->Position)*PixInMM,15);

                                    Image->Canvas->LineTo((i-H->Position)*PixInMM,20);

                          }

                 j++;

        }

 

       j=V->Position;

       for(int i=V->Position;i<V->Position+Image->Height;i++)

        {

                 //сантиметры

                 if(i>0 && i%10==0)

                          {

                                    Image->Canvas->Pen->Color=clBlack;

 

                                    if(j%20==0)Image->Canvas->TextOutA(2,(i-2-V->Position)*PixInMM,j);

                                    if((i-V->Position)*PixInMM>25)

                                             {

                                                       Image->Canvas->MoveTo(25,(i-V->Position)*PixInMM);

                                                       Image->Canvas->LineTo(35,(i-V->Position)*PixInMM);

 

                                                       Image->Canvas->Pen->Color=clAqua;

                                                       Image->Canvas->MoveTo(35,(i-V->Position)*PixInMM);

                                                       Image->Canvas->LineTo(Image->Width,(i-V->Position)*PixInMM);

                                             }

 

                          }

                 //миллиметры

                 if((i-V->Position)*PixInMM>25)

                          {

                                    Image->Canvas->Pen->Color=clBlack;

                                    Image->Canvas->MoveTo(25,(i-V->Position)*PixInMM);

                                   Image->Canvas->LineTo(30,(i-V->Position)*PixInMM);

                          }

                 j++;

        }

 

   for(int i=0;i<Vect.size();i++)

       {

                 //масштабировать координаты окружности

                 if(Vect[i].Radius>0)

                          {

                                    Vect[i].Radius=Vect[i].OldRadius*PixInMM;

                                    Vect[i].Centr.x=(Vect[i].OldCentr.x-H->Position) * PixInMM;

                                    Vect[i].Centr.y=(Vect[i].OldCentr.y-V->Position) * PixInMM;

                                    CalcCircle(&Vect[i]);

                          }

                 //масштабировать координаты полилинии

                 if(Vect[i].Radius==0)

                          {

                                    for(int j=0;j<Vect[i].Poliline.size();j++)

                                             {

                                                      Vect[i].Poliline[j].x=(Vect[i].OldPoliline[j].x-H->Position) * PixInMM;

                                                      Vect[i].Poliline[j].y=(Vect[i].OldPoliline[j].y-V->Position) * PixInMM;

                                             }

                          }

                 //рисовать форму плитки

                 PaintPoliline(Vect[i].Poliline,Image,Vect[i].Radius,Vect[i].Centr);

       }

}

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

//выбор элемента построения - полилиния

void __fastcall TMainForm::SB_PolilineClick(TObject *Sender)

{

       if(SB_Poliline->Down)

                 {

                          SB_Ellips->Down=false;

                          ChangeShp=true;

                 }

}

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

//выбор элемента построения - окружность

void __fastcall TMainForm::SB_EllipsClick(TObject *Sender)

{

       if(SB_Ellips->Down)

                 {

                          SB_Poliline->Down=false;

                          ChangeShp=false;

                 }

}

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

//рисовать форму,выделить форму плитки

void __fastcall TMainForm::ImageMMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,int X, int Y)

{

   //очистить значение выбранных форм плиток,узлов

   NumCircle=-1;

   NumCircleMove=-1;

   LRM=true;

   UB=false;

   //если нажата кнопка выделения красным маркером узлов из составной формы

   if(SB_UnionBrush->Down)

       {

                 UB=true;

                 UnionBrush.clear();

                 goto m1;

       }

 

   //действия с выбранными полилиниями

   for(int i=0;i<CircleVect.size();i++)

       {

                 //изменение размера окружности

                 if(X>=CircleVect[i].Centr.x-7 && X<=CircleVect[i].Centr.x+7

                 && Y>=CircleVect[i].Centr.y-CircleVect[i].Radius-7

                 && Y<=CircleVect[i].Centr.y-CircleVect[i].Radius+7)

                          {

                                    NumCircle=i;

                                    break;

                          }

                 //перемещение узла

                 if(X>=CircleVect[i].Centr.x-CircleVect[i].Radius

                 && X<=CircleVect[i].Centr.x+CircleVect[i].Radius

                 && Y>=CircleVect[i].Centr.y-CircleVect[i].Radius

                 && Y<=CircleVect[i].Centr.y+CircleVect[i].Radius)

                          {

                                    NumCircleMove=i;

                          }

                 //перемещение полилинии

                 for(int j=0;j<CircleVect[i].Poliline.size();j++)

                          {

                                    //определить принадлежность узла полилинии

                                    if(X>=CircleVect[i].Poliline[j].x-4

                                    && X<=CircleVect[i].Poliline[j].x+4

                                    && Y>=CircleVect[i].Poliline[j].y-4

                                    && Y<=CircleVect[i].Poliline[j].y+4)

                                             {

                                                      //номер полилинии

                                                      NumCircleMove=j;

                                                      //номер узла

                                                      NumCircle=i;

                                                      if(Button==mbRight)

                                                                {

                                                                         //установить флаг нажатия правой кнопки мыши

                                                                         //для перемещения полилиний

                                                                         LRM=false;

                                                                }

                                                      goto m2;

                                             }

                          }

       }

m2:

   //нажата кнопка удалить

   if(SB_Delete->Down)

       {

                 //удалить окружность

                 if(NumCircle>-1 && NumCircleMove==-1)

                          {

                                    //промаркировали контейнер (очисткой - длина=0)

                                    CircleVect[NumCircle].Poliline.clear();

                                    //указатель на элемент контейнера

                                    vector <SShape>::iterator new_end;

                                    //переместить элемент в конец контейнера если он соответствует условию

                                    //получить указатель этот элемент

                                    new_end = remove_if (CircleVect.begin( ), CircleVect.end( ), DelCircle );

                                    //удалить элементы от указателя до конца контейнера

                                    CircleVect.erase (new_end, CircleVect.end( ) );

                          }

 

                 //удалить узел

                 if(NumCircle>-1 && NumCircleMove>-1)

                          {

                                    //промаркировать узел полилинии

                                    CircleVect[NumCircle].Poliline[NumCircleMove].x=-1;

                                    CircleVect[NumCircle].Poliline[NumCircleMove].y=-1;

 

                                    CircleVect[NumCircle].OldPoliline[NumCircleMove].x=-1;

                                    CircleVect[NumCircle].OldPoliline[NumCircleMove].y=-1;

                                    //указатель на элемент контейнера

                                    vector <TPoint>::iterator new_end;

                                    //удалить промаркированные узлы

                                    new_end = remove_if (CircleVect[NumCircle].Poliline.begin( ), CircleVect[NumCircle].Poliline.end( ), DelPic );

                                   CircleVect[NumCircle].Poliline.erase (new_end, CircleVect[NumCircle].Poliline.end( ) );

 

                                    new_end = remove_if (CircleVect[NumCircle].OldPoliline.begin( ), CircleVect[NumCircle].OldPoliline.end( ), DelPic );

                                    CircleVect[NumCircle].OldPoliline.erase (new_end, CircleVect[NumCircle].OldPoliline.end( ) );

 

                                    //если длина полилинии =1 удалить запись о полилинии

                                    if(CircleVect[NumCircle].Poliline.size()==1)

                                             {

                                                      CircleVect[NumCircle].Poliline.clear();

                                                      vector <SShape>::iterator new_end;

                                                      new_end = remove_if (CircleVect.begin( ), CircleVect.end( ), DelCircle );

                                                      CircleVect.erase (new_end, CircleVect.end( ) );

                    }

                          }

       }

   //если действие удаление - переход к перерисовке

   if(NumCircle>-1 || NumCircleMove>-1)goto m1;

   //выбрано рисование окружности

   if(SB_Ellips->Down)

       {

                 //добавить элемент контейнера полилиний форм плитки

                 CircleVect.resize(CircleVect.size()+1);

                 //получить центр окружности исходный

                 CircleVect.back().OldCentr.x=X/RNE_PixInMM->Text.ToInt()+SB_Hor->Position;

                 CircleVect.back().OldCentr.y=Y/RNE_PixInMM->Text.ToInt()+SB_Vert->Position;

                 //получить центр окружности отображаемый

                 CircleVect.back().Centr.x=CircleVect.back().OldCentr.x * RNE_PixInMM->Text.ToInt();

                 CircleVect.back().Centr.y=CircleVect.back().OldCentr.y * RNE_PixInMM->Text.ToInt();

                 //исходный радиус окружности

                 CircleVect.back().OldRadius=EllipsRadius;

                 //отображаемый радиус окружности

                 CircleVect.back().Radius=CircleVect.back().OldRadius * RNE_PixInMM->Text.ToInt();

                //расчитать координаты узлов для окружности

                 CalcCircle(&CircleVect.back());

       }

   //выбрано рисование полилинии

   if(SB_Poliline->Down)

       {

                 //флаг добавления новой полилинии

                 if(ChangeShp)

                          {

                                    //добавить в контейнер новый элемент полилинии

                                    CircleVect.resize(CircleVect.size()+1);

                                    CircleVect.back().Radius=0;

                                    //снять флаг

                                    ChangeShp=false;

                          }

                 //добавлять узлы в полилинию

                 CircleVect.back().Poliline.resize(CircleVect.back().Poliline.size()+1);

                 CircleVect.back().OldPoliline.resize(CircleVect.back().OldPoliline.size()+1);

 

                 CircleVect.back().OldPoliline.back().x=X/RNE_PixInMM->Text.ToInt()+SB_Hor->Position;

                 CircleVect.back().OldPoliline.back().y=Y/RNE_PixInMM->Text.ToInt()+SB_Vert->Position;

 

                 CircleVect.back().Poliline.back().x=CircleVect.back().OldPoliline.back().x * RNE_PixInMM->Text.ToInt();

                 CircleVect.back().Poliline.back().y=CircleVect.back().OldPoliline.back().y * RNE_PixInMM->Text.ToInt();

       }

 

 m1:

   //перерисовать все формы плиток на листе

   RePaintForm(ImageM,RNE_PixInMM->Text.ToInt(),RNE_Length->Text.ToInt(),SB_Hor,SB_Vert,CircleVect);

}

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

//расчитать окружность

void __fastcall TMainForm::CalcCircle(SShape * PoliCircle)

{

   //очистить контейнеры

   PoliCircle->Poliline.clear();

   PoliCircle->OldPoliline.clear();

 

   int Sch=0;

   //расчёт координат окружности со смещение на угол...

   for (float alfa=1;alfa<=360;alfa+=(360.0/AngleCount))

       {

          //не более заданного количества узлов

          if(Sch>AngleCount)break;

          Sch++;

 

          PoliCircle->Poliline.resize(PoliCircle->Poliline.size()+1);

          PoliCircle->OldPoliline.resize(PoliCircle->Poliline.size());

          //координаты узла (миллиметровые)

          PoliCircle->OldPoliline.back().x=(PoliCircle->Centr.x+PoliCircle->Radius*cos(alfa*3.14/180.0))/RNE_PixInMM->Text.ToInt();

          PoliCircle->OldPoliline.back().y=(PoliCircle->Centr.y+PoliCircle->Radius*sin(alfa*3.14/180.0))/RNE_PixInMM->Text.ToInt();

 

          //координаты узла экранные

          PoliCircle->Poliline.back().x=PoliCircle->OldPoliline.back().x * RNE_PixInMM->Text.ToInt();

          PoliCircle->Poliline.back().y=PoliCircle->OldPoliline.back().y * RNE_PixInMM->Text.ToInt();

       }

  //добавить последний замыкающий элемент контейнера

  PoliCircle->Poliline.resize(PoliCircle->Poliline.size()+1);

  PoliCircle->OldPoliline.resize(PoliCircle->Poliline.size());

 

  PoliCircle->OldPoliline.back().x=PoliCircle->OldPoliline.front().x;

  PoliCircle->OldPoliline.back().y=PoliCircle->OldPoliline.front().y;

 

  PoliCircle->Poliline.back().x=PoliCircle->Poliline.front().x;

  PoliCircle->Poliline.back().y=PoliCircle->Poliline.front().y;

}

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

//нарисовать полилинию

void __fastcall  TMainForm::PaintPoliline(vector<TPoint> PoliVect,TImage * Image,float Rad,TPoint MoveRect)

{

       //цвет линии

       Image->Canvas->Pen->Color=clBlue;

       //контейнер полилинии для отрисовки на экране

       vector<TPoint> TempPoli;

       //скопировать переданный контейнер

       TempPoli=PoliVect;

       //если полилиния окружность

       if(Rad>0)

                 {

                          TempPoli.resize(TempPoli.size()+1);

                          TempPoli.back().x=TempPoli.front().x;

                          TempPoli.back().y=TempPoli.front().y;

                 }

       //если полилиния не окружность

       else

                 {

                          TPoint temp;

                          temp.x=TempPoli.back().x;

                          temp.y=TempPoli.back().y;

 

                          TempPoli.resize(TempPoli.size()+1);

 

                          TempPoli.back().x=temp.x;

                          TempPoli.back().y=temp.y;

                 }

 

       //отрисовать полилинию на листе

       Image->Canvas->Polyline(&TempPoli[0],TempPoli.size()-1);

       //отрисовать чётные маркеры узлов

       Image->Canvas->Pen->Color=clBlack;

       for(int i=0;i<TempPoli.size()-1;i++)

                 {

                          Image->Canvas->Rectangle(TempPoli[i].x+4,TempPoli[i].y+4,

                          TempPoli[i].x-4,TempPoli[i].y-4);

                 }

       //для окружности отрисовать зелёный маркер изменения радиуса

       if(Rad>0)

                 {

                          Image->Canvas->Pen->Color=clLime;

                          Image->Canvas->Rectangle(MoveRect.x+7,MoveRect.y-Rad+7,MoveRect.x-7,MoveRect.y-Rad-7);

                 }

}

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

//Отжать кнопку мыши над листом форм плиток

void __fastcall TMainForm::ImageMMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,int X, int Y)

{

       //снять флаги выбора полилинии

       NumCircle=-1;

       NumCircleMove=-1;

       LRM=true;

       UB=false;

}

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

//движение над поверхностью листа форм плиток

void __fastcall TMainForm::ImageMMouseMove(TObject *Sender, TShiftState Shift, int X,int Y)

{

       //красным маркером закрашивать узлы составной формы

       if(SB_UnionBrush->Down && UB)

                 {

                          //цвет кисти и линии - красный

                          ImageM->Canvas->Brush->Color=clRed;

                          ImageM->Canvas->Pen->Color=clRed;

                          //добавить элемент в контейнер маркеров

                          UnionBrush.resize(UnionBrush.size()+1);

                          UnionBrush.back().x=X;

                          UnionBrush.back().y=Y;

                          //отобразить маркер на листе

                          ImageM->Canvas->Rectangle(X+7,Y+7,X-7,Y-7);

                          //исходные цвета кисти и линий

                          ImageM->Canvas->Pen->Color=clBlack;

                          ImageM->Canvas->Brush->Color=clWhite;

                          return;

                 }

       //изменение радиуса окружности

       if(NumCircle>-1 && CircleVect[NumCircle].Radius>0)

                 {

                          if(Y>=CircleVect[NumCircle].Centr.y)return;

                          //коррекция изменения радиуса

                          CircleVect[NumCircle].OldRadius=(CircleVect[NumCircle].Centr.y-Y)/RNE_PixInMM->Text.ToInt();

                         CircleVect[NumCircle].Radius=CircleVect[NumCircle].OldRadius*RNE_PixInMM->Text.ToInt();

                          RePaintForm(ImageM,RNE_PixInMM->Text.ToInt(),RNE_Length->Text.ToInt(),SB_Hor,SB_Vert,CircleVect);

                 }

 

       if(NumCircleMove>-1)

                 {

                          //переместить окружность

                          if(CircleVect[NumCircleMove].Radius>0 && NumCircle==-1)

                                    {

                                             //коррекция смещения координат

                                            CircleVect[NumCircleMove].OldCentr.x=X/RNE_PixInMM->Text.ToInt();

                                            CircleVect[NumCircleMove].OldCentr.y=Y/RNE_PixInMM->Text.ToInt();

 

                                            CircleVect[NumCircleMove].Centr.x=CircleVect[NumCircleMove].OldCentr.x * RNE_PixInMM->Text.ToInt();

                                            CircleVect[NumCircleMove].Centr.y=CircleVect[NumCircleMove].OldCentr.y * RNE_PixInMM->Text.ToInt();

                                    }

                          //переместить

                          if(CircleVect[NumCircle].Radius==0 && NumCircle>-1)

                                    {

                                             //узел

                                             if(LRM)

                                                      {

                                                                //коррекция смещения координат

                                                              CircleVect[NumCircle].OldPoliline[NumCircleMove].x=X/RNE_PixInMM->Text.ToInt();

                                                              CircleVect[NumCircle].OldPoliline[NumCircleMove].y=Y/RNE_PixInMM->Text.ToInt();

 

                                                      CircleVect[NumCircle].Poliline[NumCircleMove].x=CircleVect[NumCircle].OldPoliline[NumCircleMove].x * RNE_PixInMM->Text.ToInt();

                                                      CircleVect[NumCircle].Poliline[NumCircleMove].y=CircleVect[NumCircle].OldPoliline[NumCircleMove].y * RNE_PixInMM->Text.ToInt();

                                                      }

                                             //полилинию

                                             else

                                                      {

                                                                //коррекция смещения координат

                                                                float x,y;

                                                                x=(float)(X-CircleVect[NumCircle].Poliline[NumCircleMove].x)/RNE_PixInMM->Text.ToInt();

                                                                y=(float)(Y-CircleVect[NumCircle].Poliline[NumCircleMove].y)/RNE_PixInMM->Text.ToInt();

 

                                                               for(int i=0;i<CircleVect[NumCircle].OldPoliline.size();i++)

                                                                         {

                                                                                 CircleVect[NumCircle].OldPoliline[i].x+=x;

                                                                                 CircleVect[NumCircle].OldPoliline[i].y+=y;

 

                                                                                 CircleVect[NumCircle].Poliline[i].x=CircleVect[NumCircle].OldPoliline[i].x * RNE_PixInMM->Text.ToInt();

                                                                                 CircleVect[NumCircle].Poliline[i].y=CircleVect[NumCircle].OldPoliline[i].y * RNE_PixInMM->Text.ToInt();

                                }

                                                      }

                                    }

                          //перерисовать формы плитки листа

                          RePaintForm(ImageM,RNE_PixInMM->Text.ToInt(),RNE_Length->Text.ToInt(),SB_Hor,SB_Vert,CircleVect);

                 }

}

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

//условие удаления красного маркера из контейнера

bool DelUnion(TPoint & I)

{

       if(abs(Erase.x - I.x)<14 && abs(Erase.y - I.y)<14)return true;

       else

                 {

                    Erase=I;

                    return false;

                 }

}

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

//завершить полилинию

void __fastcall TMainForm::SB_ArrowClick(TObject *Sender)

{

       ChangeShp=false;

       //большая полилиния

       vector<TPoint> MainPoliLine;

       vector<TPoint> MainOldPoliLine;

       //если есть выделение узлов составной формы

       if(UnionBrush.size()>0 && CircleVect.size()>0)

                 {

                          //запомнить первый маркер

                          Erase=UnionBrush.front();

 

                          //удалить лишние маркеры (наложенные друг на друга)

                          vector <TPoint>::iterator new_end;

                          for(int i=0;i<UnionBrush.size();i++)

                                    {

                                             new_end = remove_if(UnionBrush.begin()+1, UnionBrush.end(),DelUnion);

                                             UnionBrush.erase(new_end,UnionBrush.end());

                                    }

                          //выбрать все узлы отмеченные красным маркером

                          for(int i=0;i<UnionBrush.size();i++)

                          for(int j=0;j<CircleVect.size();j++)

                          for(int k=0;k<CircleVect[j].Poliline.size();k++)

                                    {

                                             if(abs(UnionBrush[i].x - CircleVect[j].Poliline[k].x)<11

                                             && abs(UnionBrush[i].y - CircleVect[j].Poliline[k].y)<11)

                                                      {

                                                                bool b=false;

                                                                for(int m=0;m<MainPoliLine.size();m++)

                                                              if(MainPoliLine[m]==CircleVect[j].Poliline[k])b=true;

 

                                                                if(!b)

                                                                         {

                                                                                   //записать узел в результирующий контейнер

                                                                                 MainPoliLine.push_back(CircleVect[j].Poliline[k]);

                                                                                 MainOldPoliLine.push_back(CircleVect[j].OldPoliline[k]);

                                                                         }

                                                      }

                                    }

                          //очистить контейнер форм плиток

                          CircleVect.clear();

                          CircleVect.resize(1);

                          //записать в контейнер форм результирующий контейнер составной формы

                          CircleVect.back().OldPoliline=MainOldPoliLine;

                          CircleVect.back().Poliline=MainPoliLine;

                          //перерисовать контейнер форм плиток

                          RePaintForm(ImageM,RNE_PixInMM->Text.ToInt(),RNE_Length->Text.ToInt(),SB_Hor,SB_Vert,CircleVect);

        }

}

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

//загрузить настройки

void __fastcall TMainForm::LoadOpt()

{

    //если файл с настройками не существует

       if(!FileExists(ExtractFileDir(Application->ExeName)+"\\Options.ini"))return;

       //открыть файл с настройками

       TIniFile * file=new TIniFile(ExtractFileDir(Application->ExeName)+"\\Options.ini");

 

       //загрузить параметры

       if(file->SectionExists("Size"))

                 {

                          RNE_PixInMM->Text = file->ReadInteger("Size","RNE_PixInMM",1);

                          RNE_Length->Text = file->ReadInteger("Size","RNE_Length",100);

 

                          RNE_PixInMMS->Text = file->ReadInteger("Size","RNE_PixInMMS",1);

                          RNE_LengthS->Text = file->ReadInteger("Size","RNE_LengthS",100);

                 }

       delete file;

}

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

//сохранить настройки

void __fastcall TMainForm::SaveOpt()

{

    //открыть файл настроек

   TIniFile* file=new TIniFile(ExtractFileDir(Application->ExeName)+"\\Options.ini");

 

   //сохранить значение параметров

   file->WriteInteger("Size","RNE_PixInMM",RNE_PixInMM->Text.ToInt());

   file->WriteInteger("Size","RNE_Length",RNE_Length->Text.ToInt());

   file->WriteInteger("Size","RNE_PixInMMS",RNE_PixInMMS->Text.ToInt());

   file->WriteInteger("Size","RNE_LengthS",RNE_LengthS->Text.ToInt());

 

   delete file;

}

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

//закрыть приложение

void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)

{

        SaveOpt();

}

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

//прокрутить вертикально

void __fastcall TMainForm::SB_VertScroll(TObject *Sender, TScrollCode ScrollCode,int &ScrollPos)

{

       RePaintForm(ImageM,RNE_PixInMM->Text.ToInt(),RNE_Length->Text.ToInt(),SB_Hor,SB_Vert,CircleVect);

}

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

//прокрутить горизонтально

void __fastcall TMainForm::SB_HorScroll(TObject *Sender, TScrollCode ScrollCode, int &ScrollPos)

{

       RePaintForm(ImageM,RNE_PixInMM->Text.ToInt(),RNE_Length->Text.ToInt(),SB_Hor,SB_Vert,CircleVect);

}

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

//изменить значение пикселей в миллиметре(разрешение)

void __fastcall TMainForm::RNE_PixInMMChange(TObject *Sender)

{

       FormResize(this);

}

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

//изменить размер полотна

void __fastcall TMainForm::RNE_LengthChange(TObject *Sender)

{

       if(RNE_Length->Text.ToInt()>=100)FormResize(this);

}

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

//сохранить форму

void __fastcall TMainForm::SB_SaveClick(TObject *Sender)

{

       //форма на листе не одна

       if(CircleVect.size()!=1)

                 {

                          MessageBox(0, "Невозможно сохранить форму. Удалите все формы кроме главной и попытайтесь сохранить снова.", "Внимание!", MB_ICONWARNING|MB_OK);

                          return;

                 }

       //если строка с именем не пуста

       if(!E_SaveM->Text.IsEmpty())

                 {

                          //нажать конпку отмены выбора рисования

                          SB_Arrow->Down=true;

                          SB_ArrowClick(this);

                          //проверить имя формы на дублирование

                          for(int i=0;i<ListBoxM->Items->Count;i++)

                          if(E_SaveM->Text==ListBoxM->Items->Strings[i])

                                    {

                                             MessageBox(0, "Невозможно сохранить форму. Это имя уже было использовано ранее.", "Внимание!", MB_ICONWARNING|MB_OK);

                                             return;

                }

                          //получить координату центра формы

                          float MinX=0xFFFFFF,MaxX=0,MinY=0xFFFFFF,MaxY=0;

                          Square=0;

                          for(int i=0;i<CircleVect.back().OldPoliline.size();i++)

                                    {

                                       if(CircleVect.back().OldPoliline[i].x>MaxX)MaxX=CircleVect.back().OldPoliline[i].x;

                                       if(CircleVect.back().OldPoliline[i].x<MinX)MinX=CircleVect.back().OldPoliline[i].x;

 

                                       if(CircleVect.back().OldPoliline[i].y>MaxY)MaxY=CircleVect.back().OldPoliline[i].y;

                                       if(CircleVect.back().OldPoliline[i].y<MinY)MinY=CircleVect.back().OldPoliline[i].y;

                                    }

                          MinX=MinX+(MaxX-MinX)/2;

                          MinY=MinY+(MaxY-MinY)/2;

 

                          //посчитать площать формы

                          for(int i=0;i<CircleVect.back().OldPoliline.size()-1;i++)

                 Square+=TriangleSquare(MinX,MinY,CircleVect.back().OldPoliline[i].x,CircleVect.back().OldPoliline[i].y,

                         CircleVect.back().OldPoliline[i+1].x,CircleVect.back().OldPoliline[i+1].y);

 

                          Label3->Caption="Площадь формы "+FormatFloat("0.0000",Square/1000000)+" м2";

 

                          //записать данные из контейнера в файл базы данных на диске

                          AnsiString S=ExtractFilePath(Application->ExeName)+"Square.db";

                          //открыть для дописывания

                          FILE * F=fopen(S.c_str(),"ab");

                          if(F==NULL)

                                    {

                                             MessageBox(0, "Невозможно открыть файл БД.", "Ошибка!", MB_IConerror|MB_OK);

                                             return;

                                    }

 

                          WORD Len;

                          S=E_SaveM->Text;

                          //имя

                          fwrite(S.c_str(),sizeof(char),20,F);

                          //площадь

                          fwrite(&Square,sizeof(float),1,F);

 

                          Len=CircleVect.back().OldPoliline.size();

                          //длина контейнера

                          fwrite(&Len,sizeof(WORD),1,F);

 

                          //координаты узлов

                          fwrite(&CircleVect.back().OldPoliline[0],sizeof(TPoint),Len,F);

 

                          fclose(F);

                 }

       else  MessageBox(0, "Невозможно сохранить форму. Укажите имя.", "Внимание!", MB_ICONWARNING|MB_OK);

       //прочитать список форм для листа форм плиток

       GetListName(ListBoxM->Items,0);

}

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

//расчёт площади треугольника

double __fastcall TMainForm::TriangleSquare(double x1, double y1, double x2, double y2, double x3, double y3)

{

  double a=sqrt( pow((x1-x2),2)+pow((y1-y2),2) );

  double b=sqrt( pow((x2-x3),2)+pow((y2-y3),2) );

  double c=sqrt( pow((x1-x3),2)+pow((y1-y3),2) );

 

  double p=(a+b+c)/2;

 

  return sqrt(p*(p-a)*(p-b)*(p-c));

}

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

//ввод данных масштабирования поверхности укладки

void __fastcall TMainForm::RNE_PixInMMSChange(TObject *Sender)

{

       FormResize(this);

}

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

//ввод данных длины листа поверхности укладки

void __fastcall TMainForm::RNE_LengthSChange(TObject *Sender)

{

       if(RNE_Length->Text.ToInt()>=1000)FormResize(this);

}

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

//скроллирование горизонтального ползунка листа поверхности укладки

void __fastcall TMainForm::SB_HorSScroll(TObject *Sender, TScrollCode ScrollCode,int &ScrollPos)

{

       RePaintForm(ImageS,RNE_PixInMMS->Text.ToInt(),RNE_LengthS->Text.ToInt(),SB_HorS,SB_VertS,CircleVectS);

}

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

//скроллирование вертикально ползунка листа поверхности укладки

void __fastcall TMainForm::SB_VertSScroll(TObject *Sender, TScrollCode ScrollCode, int &ScrollPos)

{

       RePaintForm(ImageS,RNE_PixInMMS->Text.ToInt(),RNE_LengthS->Text.ToInt(),SB_HorS,SB_VertS,CircleVectS);

}

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

//сохранить поверхности укладки

void __fastcall TMainForm::SB_SaveSClick(TObject *Sender)

{

       //снять флаг выбора рисования

       ChangeShpS=false;

       //имя не пусто и контейнер не пуст

       if(!E_SaveS->Text.IsEmpty() && CircleVectS.size()>0)

                 {

                          //нажать кнопку отмены выбора рисования

                          SB_ArrowS->Down=true;

                          SB_ArrowSClick(this);

                          //проверка имени на дублирование

                          for(int i=0;i<ListBoxS->Items->Count;i++)

                          if(E_SaveS->Text==ListBoxS->Items->Strings[i])

                                    {

                                             MessageBox(0, "Невозможно сохранить область. Это имя уже было использовано ранее.", "Внимание!", MB_ICONWARNING|MB_OK);

                                             return;

                                    }

                          //открыть файл БД на дописывание

                          AnsiString S=ExtractFilePath(Application->ExeName)+"Square.db";

                          FILE * F=fopen(S.c_str(),"ab");

                          if(F==NULL)

                                    {

                                             MessageBox(0, "Невозможно открыть файл БД.", "Ошибка!", MB_IConerror|MB_OK);

                                             return;

                                    }

 

                          float Square;

                          WORD Len;

                          //записать все контейнеры полилиний

                          for(int i=0;i<CircleVectS.size();i++)

                                    {

                                             S=E_SaveS->Text;

                                             //имя

                                             fwrite(S.c_str(),sizeof(char),20,F);

                                             if(i==0)Square=0;

                                             else Square=-1;

                                             //площадь

                                             fwrite(&Square,sizeof(float),1,F);

 

                                             Len=CircleVectS[i].OldPoliline.size();

                                             //длина контейнера

                                             fwrite(&Len,sizeof(WORD),1,F);

                                             //координаты узлов

                                             fwrite(&CircleVectS[i].OldPoliline[0],sizeof(TPoint),Len,F);

                                    }

 

                          fclose(F);

                 }

       else  MessageBox(0, "Невозможно сохранить область. Укажите имя.", "Внимание!", MB_ICONWARNING|MB_OK);

       GetListName(ListBoxS->Items,1);

}

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

//кнопка мыши нажата на листе поверхности укладки

void __fastcall TMainForm::ImageSMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,int X, int Y)

{

       //очистить значение выбранных форм,узлов

   NumCircleS=-1;

   NumCircleMoveS=-1;

   LRMS=true;

 

   //определить выбранные полилинии и узлы

   for(int i=0;i<CircleVectS.size();i++)

       {

                 for(int j=0;j<CircleVectS[i].Poliline.size();j++)

                          {

                                    if(X>=CircleVectS[i].Poliline[j].x-4

                                    && X<=CircleVectS[i].Poliline[j].x+4

                                    && Y>=CircleVectS[i].Poliline[j].y-4

                                    && Y<=CircleVectS[i].Poliline[j].y+4)

                                             {

                                                      //номер узла

                                                      NumCircleMoveS=j;

                                                      //номер полилинии

                                                      NumCircleS=i;

                                                      if(Button==mbRight)

                                                                {

                                                                         //флаг нажатия правой кнопки мыши (перемещение объекта)

                                                                         LRMS=false;

                                                                }

                                                      goto m3;

                                             }

                          }

       }

m3:

   //нажата кнопка удаления узла

   if(SB_DeleteS->Down)

       {

                 //удалить узел

                 if(NumCircleS>-1 && NumCircleMoveS>-1)

                          {

                                    CircleVectS[NumCircleS].Poliline[NumCircleMoveS].x=-1;

                                    CircleVectS[NumCircleS].Poliline[NumCircleMoveS].y=-1;

 

                                    CircleVectS[NumCircleS].OldPoliline[NumCircleMoveS].x=-1;

                                    CircleVectS[NumCircleS].OldPoliline[NumCircleMoveS].y=-1;

 

                                    vector <TPoint>::iterator new_end;

 

                                    new_end = remove_if (CircleVectS[NumCircleS].Poliline.begin( ), CircleVectS[NumCircleS].Poliline.end( ), DelPic );

                                    CircleVectS[NumCircleS].Poliline.erase (new_end, CircleVectS[NumCircleS].Poliline.end( ) );

 

                                    new_end = remove_if (CircleVectS[NumCircleS].OldPoliline.begin( ), CircleVectS[NumCircleS].OldPoliline.end( ), DelPic );

                                    CircleVectS[NumCircleS].OldPoliline.erase (new_end, CircleVectS[NumCircleS].OldPoliline.end( ) );

 

                                    //если длина полилинии =1 удалить запись о полилинии

                                    if(CircleVectS[NumCircleS].Poliline.size()==1)

                                             {

                                                      CircleVectS[NumCircleS].Poliline.clear();

                                                      vector <SShape>::iterator new_end;

                                                      new_end = remove_if (CircleVectS.begin( ), CircleVectS.end( ), DelCircle );

                                                      CircleVectS.erase (new_end, CircleVectS.end( ) );

                    }

                          }

       }

   //после удаления

   if(NumCircleS>-1 || NumCircleMoveS>-1)goto m4;

   //выбрано рисование полилинии

   if(SB_PolilineS->Down)

       {

                 if(ChangeShpS)

                          {

                                    CircleVectS.resize(CircleVectS.size()+1);

                                    CircleVectS.back().Radius=0;

                                    ChangeShpS=false;

                          }

                 //добавить координаты узла в контейнер

                 CircleVectS.back().Poliline.resize(CircleVectS.back().Poliline.size()+1);

                 CircleVectS.back().OldPoliline.resize(CircleVectS.back().OldPoliline.size()+1);

 

                 CircleVectS.back().OldPoliline.back().x=X/RNE_PixInMMS->Text.ToInt()+SB_HorS->Position;

                 CircleVectS.back().OldPoliline.back().y=Y/RNE_PixInMMS->Text.ToInt()+SB_VertS->Position;

 

                 CircleVectS.back().Poliline.back().x=CircleVectS.back().OldPoliline.back().x * RNE_PixInMMS->Text.ToInt();

                 CircleVectS.back().Poliline.back().y=CircleVectS.back().OldPoliline.back().y * RNE_PixInMMS->Text.ToInt();

       }

 

 m4:

   RePaintForm(ImageS,RNE_PixInMMS->Text.ToInt(),RNE_LengthS->Text.ToInt(),SB_HorS,SB_VertS,CircleVectS);

}

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

//движение указателя мыши над листом поверхности укладки

void __fastcall TMainForm::ImageSMouseMove(TObject *Sender, TShiftState Shift, int X,int Y)

{

 

       if(NumCircleMoveS>-1)

                 {

                          if(CircleVectS[NumCircleS].Radius==0 && NumCircleS>-1)

                                    {

                                             //переместить узел

                                             if(LRMS)

                                                      {

                                                              CircleVectS[NumCircleS].OldPoliline[NumCircleMoveS].x=X/RNE_PixInMMS->Text.ToInt();

                                                              CircleVectS[NumCircleS].OldPoliline[NumCircleMoveS].y=Y/RNE_PixInMMS->Text.ToInt();

 

                                                      CircleVectS[NumCircleS].Poliline[NumCircleMoveS].x=CircleVectS[NumCircleS].OldPoliline[NumCircleMoveS].x * RNE_PixInMMS->Text.ToInt();

                                                      CircleVectS[NumCircleS].Poliline[NumCircleMoveS].y=CircleVectS[NumCircleS].OldPoliline[NumCircleMoveS].y * RNE_PixInMMS->Text.ToInt();

                                                      }

                                             //переместить полилинию

                                             else

                                                      {

                                                                float x,y;

                                                                x=(float)(X-CircleVectS[NumCircleS].Poliline[NumCircleMoveS].x)/RNE_PixInMMS->Text.ToInt();

                                                                y=(float)(Y-CircleVectS[NumCircleS].Poliline[NumCircleMoveS].y)/RNE_PixInMMS->Text.ToInt();

 

                                                                for(int i=0;i<CircleVectS[NumCircleS].OldPoliline.size();i++)

                                                                         {

                                                                                 CircleVectS[NumCircleS].OldPoliline[i].x+=x;

                                                                                 CircleVectS[NumCircleS].OldPoliline[i].y+=y;

 

                                                                                 CircleVectS[NumCircleS].Poliline[i].x=CircleVectS[NumCircleS].OldPoliline[i].x * RNE_PixInMMS->Text.ToInt();

                                                                                 CircleVectS[NumCircleS].Poliline[i].y=CircleVectS[NumCircleS].OldPoliline[i].y * RNE_PixInMMS->Text.ToInt();

                                }

                                                      }

                                    }

 

                          RePaintForm(ImageS,RNE_PixInMMS->Text.ToInt(),RNE_LengthS->Text.ToInt(),SB_HorS,SB_VertS,CircleVectS);

                 }

}

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

//кнопка мыши отпущена над листом  поверхности укладки

void __fastcall TMainForm::ImageSMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,int X, int Y)

{

       NumCircleS=-1;

       NumCircleMoveS=-1;

       LRMS=true;

}

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

//выбор рисования полилинии поверхности укладки

void __fastcall TMainForm::SB_PolilineSClick(TObject *Sender)

{

       ChangeShpS=true;

}

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

//удаление узлов поверхности укладки

void __fastcall TMainForm::SB_DeleteSClick(TObject *Sender)

{

       ChangeShpS=false;

}

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

//отмена выбора рисования поверхности укладки

void __fastcall TMainForm::SB_ArrowSClick(TObject *Sender)

{

       ChangeShpS=false;

}

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

//очистить поверхности укладки

void __fastcall TMainForm::SB_ClearListSClick(TObject *Sender)

{

       CircleVectS.clear();

       SB_ArrowS->Down=true;

       SB_ArrowSClick(this);

       FormResize(this);

}

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

//очистить формы плиток

void __fastcall TMainForm::SB_ClearListClick(TObject *Sender)

{

       CircleVect.clear();

       Label3->Caption="";

       SB_Arrow->Down=true;

       SB_ArrowClick(this);

       FormResize(this);

}

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

//расчёт площадей и количества плиток

void __fastcall TMainForm::B_ProcSqClick(TObject *Sender)

{

       //на листе форм плиток более одной формы

       if(CircleVect.size()>1)

                 {

                    MessageBox(0, "Расчёт невозможен, очистите лист и выберите одну форму плитки.", "Ошибка!", MB_IConerror|MB_OK);

                    return;

                 }

       //на листе форм плиток нет выбранных форм плиток

       if(CircleVect.size()==0)

                 {

                    MessageBox(0, "Расчёт невозможен, выберите одну форму плитки.", "Ошибка!", MB_IConerror|MB_OK);

                    return;

                 }

       //есть значение площали плитки и контейнеры поверхности не пусты

       if(Square>0 && CircleVectS.size()>0 && CircleVectS[0].OldPoliline.size()>2)

                 {

                          vector<float> SQ;

                          //расчёт площадей форм поверхности укладки

                          for(int i=0;i<CircleVectS.size();i++)

                                    {

                                             float SquarePL=0;

                                             float MinX=0xFFFFFF,MaxX=0,MinY=0xFFFFFF,MaxY=0;

                                             for(int j=0;j<CircleVectS[i].OldPoliline.size();j++)

                                                      {

                                                              if(CircleVectS[i].OldPoliline[j].x>MaxX)MaxX=CircleVectS[i].OldPoliline[j].x;

                                                              if(CircleVectS[i].OldPoliline[j].x<MinX)MinX=CircleVectS[i].OldPoliline[j].x;

 

                                                              if(CircleVectS[i].OldPoliline[j].y>MaxY)MaxY=CircleVectS[i].OldPoliline[j].y;

                                                              if(CircleVectS[i].OldPoliline[j].y<MinY)MinY=CircleVectS[i].OldPoliline[j].y;

                                                      }

                                             MinX=MinX+(MaxX-MinX)/2;

                                             MinY=MinY+(MaxY-MinY)/2;

 

                                             for(int j=0;j<CircleVectS[i].OldPoliline.size()-1;j++)

                                    SquarePL+=TriangleSquare(MinX,MinY,CircleVectS[i].OldPoliline[j].x,CircleVectS[i].OldPoliline[j].y,

                                            CircleVectS[i].OldPoliline[j+1].x,CircleVectS[i].OldPoliline[j+1].y);

 

                                             SQ.push_back(SquarePL);

                                    }

                          L_SP->Caption=FormatFloat("0.0000",Square/1000000)+" м2";

                          float temp=0;

                          //из основной поверхности отнимаем участки где укладка не производится

                          for(int i=0;i<SQ.size();i++)

                                    {

                                       if(i==0)

                                             {

                                                temp=SQ[i];

                                                continue;

                                             }

                                       temp-=SQ[i];

                                    }

                          //расчёт количества плитки на поверхность укладки

                          L_SU->Caption=FormatFloat("0.0000",temp/1000000)+" м2";

                          L_CP->Caption=FormatFloat("0",temp/Square)+" шт";

                 }

}

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

//получить список сохранённых форм из БД

void TMainForm::GetListName(TStrings * List,byte ID)

{

        //если БД существует

        AnsiString S;

        S="Square.db";

        if(FileExists(ExtractFilePath(Application->ExeName)+S))

                 {

                          //открыть на чтение как бинарный

                          S=ExtractFilePath(Application->ExeName)+"Square.db";

                          FILE * F=fopen(S.c_str(),"rb");

                          //открыть файл не удалось

                          if(F==NULL)

                                    {

                                             MessageBox(0, "Невозможно открыть файл БД.", "Ошибка!", MB_IConerror|MB_OK);

                                             return;

                                    }

 

                          WORD Len;

                          //размер файла БД

                          fseek(F,0,SEEK_END);

                          int FSize=ftell(F),Count=0;

                          fseek(F,0,SEEK_SET);

 

                          float TempS;

                          char ch[20];

                          //очистить старый список

                          List->Clear();

                          //пока не конец файла

                          while(FSize>Count)

                                    {

                                             //читать имя

                                             fread(ch,sizeof(char),20,F);

                                             //читать площадь

                                             fread(&TempS,sizeof(float),1,F);

                                             //записать имя в список

                                             if(ID==0 && TempS>0)List->Add(String(ch));

                                             if(ID==1 && TempS==0)List->Add(String(ch));

                                             //читать длину контейнера координат узлов

                                             fread(&Len,sizeof(WORD),1,F);

                                             fseek(F,sizeof(TPoint)*Len,SEEK_CUR);

                                             Count=ftell(F);

                                    }

 

                          fclose(F);

                 }

}

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

//загрузить форму плитки из БД

void __fastcall TMainForm::ListBoxMClick(TObject *Sender)

{

        //если БД существует

        if(FileExists(ExtractFilePath(Application->ExeName)+"Square.db"))

                 {

                          //открыть на чтение как бинарный

                          AnsiString S=ExtractFilePath(Application->ExeName)+"Square.db";

                          FILE * F=fopen(S.c_str(),"rb");

                          //открыть файл не удалось

                          if(F==NULL)

                                    {

                                             MessageBox(0, "Невозможно открыть файл БД.", "Ошибка!", MB_IConerror|MB_OK);

                                             return;

                                    }

 

                          WORD Len;

                          //длина файла БД

                          fseek(F,0,SEEK_END);

                          int FSize=ftell(F),Count=0;

                          fseek(F,0,SEEK_SET);

 

                          float TempS;

                          char ch[20];

                         

                          //пока не конец файла

                          while(FSize>Count)

                                    {

                                             //читать имя

                                             fread(ch,sizeof(char),20,F);

                                             //читать площадь

                                             fread(&TempS,sizeof(float),1,F);

                                             //читать длину вектора

                                             fread(&Len,sizeof(WORD),1,F);

                                             //если запись соответствует условиям

                                             if((String)ch==ListBoxM->Items->Strings[ListBoxM->ItemIndex] && TempS>0)

                                                      {

                                                                //записать в контейнер форм плиток

                                                                CircleVect.resize(CircleVect.size()+1);

                                                                CircleVect.back().Radius=0;

                                                                CircleVect.back().OldPoliline.resize(Len);

                                                                CircleVect.back().Poliline.resize(Len);

                                                              fread(&CircleVect.back().OldPoliline[0],sizeof(TPoint),Len,F);

                                                                fclose(F);

                                                                Label3->Caption="Площадь формы "+FormatFloat("0.0000",TempS/1000000)+" м2";

                                                                Square=TempS;

                                                                FormResize(this);

                                                                return;

                                                      }

                                             fseek(F,sizeof(TPoint)*Len,SEEK_CUR);

                                             Count=ftell(F);

                                    }

 

                          fclose(F);

                 }

}

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

//выбор поверхности укладки для отрисовки на листе

void __fastcall TMainForm::ListBoxSClick(TObject *Sender)

{

       //если БД существует

        if(FileExists(ExtractFilePath(Application->ExeName)+"Square.db"))

                 {

                          //открыть на чтение как бинарный

                          AnsiString S=ExtractFilePath(Application->ExeName)+"Square.db";

                          FILE * F=fopen(S.c_str(),"rb");

                          //открыть файл не удалось

                          if(F==NULL)

                                    {

                                             MessageBox(0, "Невозможно открыть файл БД.", "Ошибка!", MB_IConerror|MB_OK);

                                             return;

                                    }

 

                          WORD Len;

                          //размер файла БД

                          fseek(F,0,SEEK_END);

                          int FSize=ftell(F),Count=0;

                          fseek(F,0,SEEK_SET);

 

                          float TempS;

                          char ch[20];

                          //очистить контейнер поверхности укладки

                          CircleVectS.clear();

                          CircleVectS.resize(CircleVectS.size()+1);

                          //пока не конец файла

                          while(FSize>Count)

                                    {

                                             //читать имя

                                             fread(ch,sizeof(char),20,F);

                                             //читать площадь

                                             fread(&TempS,sizeof(float),1,F);

                                             //читать длину вектора

                                             fread(&Len,sizeof(WORD),1,F);

                                             //основная поверхность (признак - ПЛОЩАДЬ равна 0)

                                             if((String)ch==ListBoxS->Items->Strings[ListBoxS->ItemIndex] && TempS==0)

                                                      {

                                                                CircleVectS[0].Radius=0;

                                                                CircleVectS[0].OldPoliline.resize(Len);

                                                                CircleVectS[0].Poliline.resize(Len);

                                                              fread(&CircleVectS[0].OldPoliline[0],sizeof(TPoint),Len,F);

                                                                Count=ftell(F);

                                                                continue;

                                                      }

                                             //поверхности где укладка не требуется (признак - ПЛОЩАДЬ равна -1)

                                             if((String)ch==ListBoxS->Items->Strings[ListBoxS->ItemIndex] && TempS==-1)

                                                      {

                                                                CircleVectS.resize(CircleVectS.size()+1);

                                                                CircleVectS.back().Radius=0;

                                                                CircleVectS.back().OldPoliline.resize(Len);

                                                                CircleVectS.back().Poliline.resize(Len);

                                                              fread(&CircleVectS.back().OldPoliline[0],sizeof(TPoint),Len,F);

                                                                Count=ftell(F);

                                                                continue;

                                                      }

                                             fseek(F,sizeof(TPoint)*Len,SEEK_CUR);

                                             Count=ftell(F);

                                    }

 

                          fclose(F);

                          FormResize(this);

Приложение Б

Категория: Дипломные работы / Дипломные работы САПР

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.