Заключение
Данная работа актуальна, так как в данное время необходима автоматизация проектирования расчета раскроя листового материала.
Построение оптимальных карт раскроя материала является одной из самых трудоемких задач заготовительного производства. В тоже время это одна из самых важных задач в ресурсосберегающих технологиях, поскольку напрямую ведет к экономии материала и снижению отходов. В настоящее время для решения этой задачи активно используются все возрастающие возможности современных ЭВМ, что позволило значительно ускорить и упростить процесс генерации раскройных карт по сравнению с неавтоматизированными методами. Авторская программа, разработанная в рамках данной дипломной работы сокращает до минимума временные затраты, чем повышает производительность труда. Программа производит все нужные расчеты, соединяется с файлами баз данных, в которых хранится все справочная информация. В конечном итоге выдает пользователю файл с результатами расчета.
Также был расчитан экономический эффект и срок окупаемости проекта, проанализированы условия труда, произведен расчет категорий тяжести и напряженности труда, рассмотрены основные чрезвычайные ситуации.
Список использованных источников
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);
Приложение Б