Разработка программного обеспечения - таймера

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

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 03.10.2017
Размер файла 277,4 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

default: PROG_LOV;

}

}

} else RabStack.Push(Obj);

}

}

BOOL ok = TRUE;

if (kolPrivNeobhod > kolPrivSvob) {

ok = FALSE;

char msg[512];

wsprintf(msg, GetModule()->LoadString(IDS_UNDER_FR_SMALL_PRIV).c_str(),PtrTekFr->Name,

kolPrivNeobhod - kolPrivSvob, toupper(typePriv));

MessageBox(msg, GetModule()->GetName(), MB_OK | MB_ICONSTOP);

}

return ok;

}

// Расчет силы связности с областью А для всех элементов списка.

int

ZRazmWindow::MSilaF(TIArrayAsVector<ZPsh> *ASp)

{

int A,kol=0;

ZPsh *obj,*obj2;

float SilaF;

int xxx=0;

TIArrayAsVectorIterator<ZPsh> iter(*ASp);

while (iter!=0) {

obj=iter++;

if (!obj->NomMassiv) {

kol;

SilaF=0;

xxx++;

for (int kont=0; kont < obj->KolKontPsh; kont++) {

A=0;

TIListIteratorImp<ZPsh> iter2(*(obj->SpIncidYach[kont]));

iter2.Restart();

kol=obj->SpIncidYach[kont]->GetItemsInContainer();

for (int daff=0; daff< kol; daff++) {

obj2=iter2++;

if (obj2->NomMassiv==1 || obj2->PrivYach!=0) A++;

}

if (A>0) {

if (kol-A) SilaF+= 1/(kol-A)*(obj->KolVFakt);

else SilaF+= 2* obj->KolVFakt;

}

}

obj->SilaF=SilaF;

}

}

return xxx;

}

// Возвращает элемент с максимальной связностью с областью А.

ZPsh*

ZRazmWindow::MaxSila(TIArrayAsVector<ZPsh> *ASp,ZPsh *RodPshPred)

{

ZPsh *RabFr,*obj;

RabFr=NULL;

float MSila=-1000;

TIArrayAsVectorIterator<ZPsh> iter(*ASp);

iter.Restart();

while (iter!=0) {

obj=iter++;

if (!obj->NomMassiv) {

if ((MSila < obj->SilaF) || (MSila==obj->SilaF && obj->PtrRoditPsh==RodPshPred)) {

RabFr=obj;

MSila=obj->SilaF;

}

}

}

return RabFr;

}

// Устанавливает порядок размещения ячеек.

void

ZRazmWindow::SortirSpiska(TIArrayAsVector<ZPsh> *BazArray)

{

ZPsh *Obj1,*RodPsh;

TIArrayAsVector<ZPsh> *RabAr;

RabAr = new TIArrayAsVector<ZPsh>(20,0,5);

Obj1=(*BazArray)[0];

RodPsh = PtrTekFr;

while (Obj1!=NULL) {

MSilaF(BazArray);

Obj1=MaxSila(BazArray,RodPsh);

if (Obj1!=NULL){

Obj1->NomMassiv=1;

RabAr->Add(Obj1);

RodPsh=Obj1->PtrRoditPsh;

}

}

BazArray->Flush(TShouldDelete::NoDelete);

TIArrayAsVectorIterator<ZPsh> iter(*RabAr);

while (iter!=0) {

Obj1=iter++;

Obj1->NomMassiv=0;

BazArray->Add(Obj1);

}

RabAr->Flush(TShouldDelete::NoDelete);

delete RabAr;

}

// Выполняет привязку одной ячейки.

void

ZRazmWindow::PrivOdnojYach(TIListImp<ZPriv> *BazList, ZPsh *Yach, BOOL Zamesch, ZPriv *OldPriv,

TIArrayAsVector<ZPriv> *RabListXY, TIArrayAsVector<ZPriv> *RabListYX)

{

if (Yach->PrivYach) return;

ZPriv *RPr2,*RPr3,*RPr;

int minsum = 30000;

int SummaDl,Ogran;

int NomInArr;

BOOL FlagModified,FlModBlok;

if (Zamesch) Ogran=2;

else Ogran=1;

if (OldPriv!=NULL) RPr = OldPriv;

else {

RPr = (*RabListXY)[0];

OldPriv=RPr;

}

FlagModified=TRUE;

while (FlagModified) {

FlagModified=FALSE;

RPr2=RPr;

FlModBlok=TRUE;

while (FlModBlok){ // X++ Y++

FlModBlok = FALSE;

NomInArr=RabListXY->Find(RPr2);

if (NomInArr< RabListXY->GetItemsInContainer()-1) {

RPr3=(*RabListXY)[NomInArr+1];

if (RPr2->XPriv != RPr3->XPriv) {

NomInArr=RabListYX->Find(RPr2);

if (NomInArr< RabListYX->GetItemsInContainer()-1)

RPr3=(*RabListYX)[NomInArr+1];

else RPr3=NULL;

}

if (RPr3!=NULL){

SummaDl=SummaDln(Yach,RPr3,FALSE);

if (SummaDl<minsum) {

FlModBlok = TRUE;

if (!PoleRazm->ErrorAvtPrivYach(Yach, RPr3->XPriv,RPr3->YPriv, RPr3, BazList)){

minsum=SummaDl;

RPr=RPr3;

FlagModified=TRUE;

}

RPr2=RPr3;

}

}

}

}

RPr2=RPr;

FlModBlok=TRUE;

while (FlModBlok){ // Y++ X--

FlModBlok = FALSE;

NomInArr=RabListYX->Find(RPr2);

if (NomInArr< RabListYX->GetItemsInContainer()-1) {

RPr3=(*RabListYX)[NomInArr+1];

if (RPr2->YPriv != RPr3->YPriv) {

NomInArr=RabListXY->Find(RPr2);

if (NomInArr>0) RPr3=(*RabListXY)[NomInArr-1];

else RPr3=NULL;

}

if (RPr3!=NULL){

SummaDl=SummaDln(Yach,RPr3,FALSE);

if (SummaDl<minsum) {

FlModBlok = TRUE;

if (!PoleRazm->ErrorAvtPrivYach(Yach, RPr3->XPriv,RPr3->YPriv, RPr3, BazList)){

minsum=SummaDl;

RPr=RPr3;

FlagModified=TRUE;

}

RPr2=RPr3;

}

}

}

}

RPr2=RPr;

FlModBlok=TRUE;

while (FlModBlok){ // X-- Y--

FlModBlok = FALSE;

NomInArr=RabListXY->Find(RPr2);

if (NomInArr>0) {

RPr3=(*RabListXY)[NomInArr-1];

if (RPr2->XPriv != RPr3->XPriv) {

NomInArr=RabListYX->Find(RPr2);

if (NomInArr>0) RPr3=(*RabListYX)[NomInArr-1];

else RPr3=NULL;

}

if (RPr3!=NULL){

SummaDl=SummaDln(Yach,RPr3,FALSE);

if (SummaDl<minsum) {

FlModBlok = TRUE;

if (!PoleRazm->ErrorAvtPrivYach(Yach, RPr3->XPriv,RPr3->YPriv, RPr3, BazList)){

minsum=SummaDl;

RPr=RPr3;

FlagModified=TRUE;

}

RPr2=RPr3;

}

}

}

}

RPr2=RPr;

FlModBlok=TRUE;

while (FlModBlok){ // Y-- X++

FlModBlok = FALSE;

NomInArr=RabListYX->Find(RPr2);

if (NomInArr>0) {

RPr3=(*RabListYX)[NomInArr-1];

if (RPr2->YPriv != RPr3->YPriv) {

NomInArr=RabListXY->Find(RPr2);

if (NomInArr< RabListXY->GetItemsInContainer()-1)

RPr3=(*RabListXY)[NomInArr+1];

else RPr3=NULL;

}

if (RPr3!=NULL){

SummaDl=SummaDln(Yach,RPr3,FALSE);

if (SummaDl<minsum) {

FlModBlok = TRUE;

if (!PoleRazm->ErrorAvtPrivYach(Yach, RPr3->XPriv,RPr3->YPriv, RPr3, BazList)){

minsum=SummaDl;

RPr=RPr3;

FlagModified=TRUE;

}

RPr2=RPr3;

}

}

}

}

} // FlagModified

int x, y;

int dx, dy;

GetDxDyPriv(dx, dy);

int Delta=1, maxDelta=3;

RPr3=NULL;

if (ProvNalosh(Yach,RPr)>=Ogran) {

minsum=30000;

BOOL FlEnd = FALSE;

while ((RPr3==NULL && !FlEnd) || Delta <= maxDelta){

for (x= RPr->XPriv - Delta*dx; x<= RPr->XPriv + Delta*dx; x+=dx){

RPr2=PoleRazm->FindPrivKoord(x, RPr->YPriv - Delta*dy);

if (RPr2!=NULL){

if (!PoleRazm->ErrorAvtPrivYach(Yach, RPr2->XPriv,RPr2->YPriv, Rpr2,BazList)){

if (ProvNalosh(Yach,RPr2)<Ogran) {

SummaDl=SummaDln(Yach,RPr2,FALSE);

if (SummaDl<minsum) {

minsum=SummaDl;

RPr3=RPr2;

}

}

}

}

}

for (x= RPr->XPriv - Delta*dx; x<= RPr->XPriv + Delta*dx; x+=dx){

RPr2=PoleRazm->FindPrivKoord(x, RPr->YPriv + Delta*dy);

if (RPr2!=NULL){

if (!PoleRazm->ErrorAvtPrivYach(Yach, RPr2->XPriv,RPr2->YPriv, RPr2, BazList)){

if (ProvNalosh(Yach,RPr2)<Ogran) {

SummaDl=SummaDln(Yach,RPr2,FALSE);

if (SummaDl<minsum) {

minsum=SummaDl;

RPr3=RPr2;

}

}

}

}

}

for (y= RPr->YPriv - (Delta-1)*dy; y<= RPr->YPriv + (Delta-1)*dy; y+=dy){

RPr2=PoleRazm->FindPrivKoord(RPr->XPriv - Delta*dx, y);

if (RPr2!=NULL){

if (!PoleRazm->ErrorAvtPrivYach(Yach, RPr2->XPriv, RPr2->YPriv, RPr2, BazList)){

if (ProvNalosh(Yach,RPr2)<Ogran) {

SummaDl=SummaDln(Yach,RPr2,FALSE);

if (SummaDl<minsum) {

minsum=SummaDl;

RPr3=RPr2;

}

}

}

}

}

for (y= RPr->YPriv - (Delta-1)*dy; y<= RPr->YPriv + (Delta-1)*dy; y+=dy){

RPr2=PoleRazm->FindPrivKoord(RPr->XPriv + Delta*dx, y);

if (RPr2!=NULL){

if (!PoleRazm->ErrorAvtPrivYach(Yach, RPr2->XPriv,RPr2->YPriv, RPr2, BazList)){

if (ProvNalosh(Yach,RPr2)<Ogran) {

SummaDl=SummaDln(Yach,RPr2,FALSE);

if (SummaDl<minsum) {

minsum=SummaDl;

RPr3=RPr2;

}

}

}

}

}

Delta++;

if (RPr->XPriv - Delta*dx < MinX && RPr->XPriv + Delta*dx > MaxX &&

RPr->YPriv - Delta*dy < MinY && RPr->YPriv + Delta*dy > MaxY)

FlEnd = TRUE;

} // while

if (RPr3!=NULL) RPr=RPr3;

else RPr=NULL;

} // ProvNalosh

if (RPr!=NULL) {

TDC& DC = PoleRazm->SetDC(TClientDC(*PoleRazm));

PoleRazm->RazmYach(DC, Yach, RPr, ZPsh::NoFixed);

Yach->OldPrivYach=NULL;

}

}

// Проверка наложения ячеек.

int

ZRazmWindow::ProvNalosh(ZPsh *PrPsh,ZPriv *PrPriv)

{

int situation=0;

ZPriv *RabPriv;

ZNstYach nstYach(PrPsh->Name, &TPoint(PrPriv->XPriv, PrPriv->YPriv));

for (int i=0; i< nstYach.kol_pokr_toch_priv; i++) {

RabPriv = PoleRazm->FindPrivKoord(nstYach.pokr_toch_priv[i].x, nstYach.pokr_toch_priv[i].y);

if (RabPriv!=NULL) {

if (RabPriv->Yach!=NULL) situation=2;

}

else situation=3;

}

return situation;

}

ZPriv*

ZRazmWindow::Mediana(ZPsh *Obj)

{

struct RectObl {

int XMin;

int YMin;

int XMax;

int YMax;

};

int kol,Xcp,Ycp,N;

ZPriv *RPr,*RabPriv;

ZPsh *PromObj;

RectObl Oblast;

RPr=NULL;

kol=Obj->KolKontPsh;

Xcp=0;

Ycp=0;

N=0;

for (int i=0;i<kol;i++){

Oblast.XMax= 0;

Oblast.YMax= 0;

Oblast.XMin= GlobalData->GetNstBMK()->gabarit_x_bmk;

Oblast.YMin= GlobalData->GetNstBMK()->gabarit_y_bmk;

TIListIteratorImp<ZPsh> irr(*(Obj->SpIncidYach[i]));

while (irr!=0){

PromObj=irr++;

if (PromObj->PrivYach!=NULL) RabPriv=PromObj->PrivYach;

else RabPriv=PromObj->OldPrivYach;

if (RabPriv!=NULL){

if (Oblast.XMax< RabPriv->XPriv) Oblast.XMax= RabPriv->XPriv;

if (Oblast.YMax< RabPriv->YPriv) Oblast.YMax= RabPriv->YPriv;

if (Oblast.XMin> RabPriv->XPriv) Oblast.XMin= RabPriv->XPriv;

if (Oblast.YMin> RabPriv->YPriv) Oblast.YMin= RabPriv->YPriv;

}

}

if (Oblast.XMax>=Oblast.XMin) {

Xcp+=Oblast.XMax+Oblast.XMin;

Ycp+=Oblast.YMax+Oblast.YMin;

N+=2;

}

}

if (N!=0){

Xcp= ceil(Xcp/N);

Ycp= ceil(Ycp/N);

RPr= PoleRazm->FindNearPriv(Xcp, Ycp);

}

return RPr;

}

// Оптимизация N3.

void

ZRazmWindow::Optimize3(TIArrayAsVector<ZPsh> *RabAr, TIListImp<ZPriv> *RabList)

{

ZPsh *Obj,*OkPsh;

int iii,InCont;

float procent;

ZPriv *HranPriv,*OkPriv;

TIArrayAsVectorIterator<ZPsh> itr(*RabAr);

iii=0;

InCont=RabAr->GetItemsInContainer();

while (itr!=0){

Obj=itr++;

iii++;

OkPsh=Obmen(Obj,RabList);

if (OkPsh!=NULL) {

if (OkPsh==Obj) OkPriv=OkPsh->OldPrivYach;

else OkPriv=OkPsh->OldPrivYach;

}

else OkPriv=NULL;

if (OkPriv!=NULL){

TDC& DC = PoleRazm->SetDC(TClientDC(*PoleRazm));

HranPriv=Obj->PrivYach;

PoleRazm->DeleteRazmYach(DC,Obj->PrivYach,FALSE);

if (OkPsh!=NULL && OkPsh!=Obj){

PoleRazm->DeleteRazmYach(DC,OkPsh->PrivYach,FALSE);

PoleRazm->RazmYach(DC, OkPsh, HranPriv, ZPsh::NoFixed);

}

PoleRazm->RazmYach(DC, Obj, OkPriv, ZPsh::NoFixed);

}

procent=100.0*iii/InCont;

SetTextState(StateOptim->ProcentOptim, procent);

}

}

ZPsh*

ZRazmWindow::Obmen(ZPsh *First,TIListImp<ZPriv> *RabList)

{

ZPsh *HranPsh,*OkPsh;

int Nalosh,OldSum,NewSum,DopSum,MinSum;

ZPriv *RPr,*RPriv,*NachPriv,*OkPriv,*FirstPriv;

OkPriv=NULL;

OkPsh=NULL;

MinSum=30000;

int dx, dy;

GetDxDyPriv(dx, dy);

if (First->PrivYach!=NULL){

RPriv=Mediana(First);

FirstPriv=First->PrivYach;

OldSum=SummaDln(First,FirstPriv,FALSE);

if (RPriv!=NULL){

for (int i=RPriv->XPriv - dx; i<= RPriv->XPriv + dx; i+=dx){

for (int j=RPriv->YPriv - dy; j<= RPriv->YPriv + dy; j+=dy){

RPr=PoleRazm->FindPrivKoord(i,j);

if (RPr!=NULL){

// Поднимаем 1 ячейку с 1 привязки

RazmOrDelPsh(First,FirstPriv,FALSE);

Nalosh=ProvNalosh(First,RPr);

if (Nalosh==2){

if (RPr->Yach!=NULL){

NachPriv= PoleRazm->GetNachPriv(RPr);

HranPsh=NachPriv->Yach;

DopSum=SummaDln(HranPsh,NachPriv,FALSE);

// Поднимаем 2 ячейку со 2 привязки

RazmOrDelPsh(HranPsh,NachPriv,FALSE);

if (ProvNalosh(First,RPr)==0 && !PoleRazm->ErrorAvtPrivYach(First,RPr->XPriv, RPr->YPriv, RPr, RabList)){

//Опускаем 1 на 2

RazmOrDelPsh(First,RPr,TRUE);

if (ProvNalosh(HranPsh,FirstPriv)==0 && !PoleRazm->ErrorAvtPrivYach(HranPsh, FirstPriv->XPriv,

FirstPriv->YPriv, FirstPriv, RabList)){

NewSum= SummaDln(HranPsh,FirstPriv,FALSE)+SummaDln(First,RPr,FALSE);

if (OldSum+DopSum>NewSum && MinSum>NewSum) {

MinSum=NewSum;

OkPriv=RPr;

OkPsh=HranPsh;

}

}

//Поднимаем 1 с 2

RazmOrDelPsh(First,RPr,FALSE);

}

//Опускаем 2 на 2

RazmOrDelPsh(HranPsh,NachPriv,TRUE);

}

}

else {

if (!(PoleRazm->ErrorAvtPrivYach(First, RPr->XPriv,RPr->YPriv, RPr, RabList)) &&

SummaDln(First,RPr,FALSE)< OldSum) {

OkPriv=RPr;

OkPsh=NULL;

MinSum=0;

}

}

//Опускаем 1 на 1

RazmOrDelPsh(First,FirstPriv,TRUE);

}

} // for j

} // for i

}

}

if (OkPriv!=NULL){

if (OkPsh==NULL) OkPsh=First;

OkPsh->OldPrivYach=OkPriv;

}

return OkPsh;

}

void

ZRazmWindow::RazmOrDelPsh(ZPsh *RabPsh,ZPriv *RabPriv,BOOL FlRazm)

{

ZPriv *tmpPriv;

if (FlRazm==TRUE){

RabPriv->Yach=RabPsh;

RabPsh->PrivYach=RabPriv;

RabPriv->FlagNachYach=TRUE;

ZNstYach nstYach(RabPsh->Name, &TPoint(RabPriv->XPriv, RabPriv->YPriv));

for (int i=1; i< nstYach.kol_pokr_toch_priv; i++) {

tmpPriv = PoleRazm->FindPrivKoord(nstYach.pokr_toch_priv[i].x,nstYach.pokr_toch_priv[i].y);

if (!tmpPriv) PROG_LOV;

tmpPriv->Yach=RabPsh;

}

}

else {

RabPriv->Yach=NULL;

RabPsh->PrivYach=NULL;

RabPriv->FlagNachYach=FALSE;

ZNstYach nstYach(RabPsh->Name, &TPoint(RabPriv->XPriv, RabPriv->YPriv));

for (int i=1; i< nstYach.kol_pokr_toch_priv; i++) {

tmpPriv = PoleRazm->FindPrivKoord(nstYach.pokr_toch_priv[i].x, nstYach.pokr_toch_priv[i].y);

if (!tmpPriv) PROG_LOV;

tmpPriv->Yach=NULL;

}

}

}

void

ZRazmWindow::OptimizePerif(TIArrayAsVector<ZPsh>& SpHranPsh, TIListImp<ZPriv>& SpHranPriv)

{

ZPsh *Obj,*Obj2;

ZPriv *HranPriv1,*RabPriv;

int Sum1_1,Sum2_2,Sum1_2,Sum2_1,Delta,DeltaOld;

TIArrayAsVectorIterator<ZPsh> it1(SpHranPsh);

TIListIteratorImp<ZPriv> it2(SpHranPriv);

StateOptim->State->SetText("Оптимизация Z-яч.");

for (int i=0;i<3;i++){

it1.Restart();

while (it1!=0){

Obj=it1++;

DeltaOld=0;

Sum1_1=SummaDln(Obj,Obj->PrivYach,FALSE);

it2.Restart();

while (it2!=0){

RabPriv=it2++;

if (RabPriv->Yach==NULL){

Sum1_2=SummaDln(Obj,RabPriv,FALSE);

Delta=Sum1_1-Sum1_2;

if (Delta > DeltaOld){

TDC& DC = PoleRazm->SetDC(TClientDC(*PoleRazm));

PoleRazm->DeleteRazmYach(DC,Obj->PrivYach,FALSE);

PoleRazm->RazmYach(DC,Obj, RabPriv, ZPsh::NoFixed);

DeltaOld=Delta;

}

}

else {

if (RabPriv!=Obj->PrivYach){

Obj2=RabPriv->Yach;

Sum2_2=SummaDln(Obj2,RabPriv,FALSE);

Sum1_2=SummaDln(Obj,RabPriv,FALSE);

Sum2_1=SummaDln(Obj2,Obj->PrivYach,FALSE);

Delta=Sum1_1+Sum2_2-Sum1_2-Sum2_1;

if (Delta > DeltaOld){

TDC& DC = PoleRazm->SetDC(TClientDC(*PoleRazm));

HranPriv1=Obj->PrivYach;

PoleRazm->DeleteRazmYach(DC,HranPriv1,FALSE);

PoleRazm->DeleteRazmYach(DC,RabPriv,FALSE);

PoleRazm->RazmYach(DC, Obj, RabPriv, ZPsh::NoFixed);

PoleRazm->RazmYach(DC, Obj2, HranPriv1, ZPsh::NoFixed);

DeltaOld=Delta;

}

}

}

}

}

}

it1.Restart();

while (it1){

Obj=it1++;

Obj->InMassiv=FALSE;

}

}

void

ZRazmWindow::CmColorRaskras()

{

if (MessageBox(GetModule()->LoadString(IDS_SETUP_COLOR_PSH).c_str(),

GetModule()->GetName(), MB_YESNO | MB_ICONQUESTION) != IDYES)

return;

const kolColors = 36;

const COLORREF colors[] = {

RGB( 0, 255, 0), // LtGreen

RGB( 0, 0, 255), // LtBlue

RGB(255, 0, 0), // LtRed

RGB(255, 0, 255), // LtMagenta

RGB( 0, 255, 255), // LtCyan

RGB(192, 192, 192), // LtGray

RGB(128, 128, 128), // Gray

RGB(255, 128, 128),

RGB(255, 128, 0),

RGB(128, 64, 0),

RGB(128, 128, 0),

RGB(128, 255, 0),

RGB( 0, 128, 0),

RGB(128, 128, 64),

RGB( 0, 255, 128),

RGB(192, 220, 192),

RGB( 0, 128, 128),

RGB( 0, 128, 64),

RGB(128, 255, 255),

RGB( 64, 128, 128),

RGB( 0, 128, 255),

RGB(164, 200, 240),

RGB(128, 128, 255),

RGB(255, 128, 192),

RGB(128, 0, 128),

RGB(255, 128, 255),

RGB(255, 0, 128),

RGB(128, 0, 255),

RGB(128, 0, 0),

RGB(128, 64, 64),

RGB( 0, 64, 64),

RGB( 0, 64, 128),

RGB( 0, 0, 128),

RGB(128, 0, 64),

RGB( 64, 0, 64),

RGB( 64, 0, 128)

};

int indexColor=0;

for (int i=0; i < PtrTekFr->SostavPsh->GetItemsInContainer(); i++) {

ZPsh* Obj = (*PtrTekFr->SostavPsh)[i];

if (!Obj->IsYach()) {

SetColorPsh(Obj, colors[indexColor], "Bk");

indexColor++;

if (indexColor==kolColors) indexColor=0;

}

}

}

unsigned long

ZRazmWindow::ShowSummaSv(TIArrayAsVector<ZPsh> *SpHranPsh)

{

unsigned longObschDl = GetSummaSv(SpHranPsh);

SetTextState(StateOptim->KriterOptim, ObschDl);

return ObschDl;

}

unsigned long

ZRazmWindow::GetSummaSv(TIArrayAsVector<ZPsh> *SpHranPsh)

{

ZPsh *Obj;

unsigned longObschDl;

ObschDl=0;

TIArrayAsVectorIterator<ZPsh> iir(*SpHranPsh);

while (iir!=0) {

Obj=iir++;

if (Obj->PrivYach!=NULL) {

ObschDl+=SummaDln(Obj, Obj->PrivYach, TRUE);

}

}

return ObschDl;

}

void

ZRazmWindow::SetTextState(TStatic* item, unsigned long value)

{

char buf[20];

item->SetText(ultoa(value, buf, 10));

}

void

ZRazmWindow::SetTextState(TStatic* item, float value)

{

char buf[20];

sprintf(buf, "%.1f %%", value);

item->SetText(buf);

}

// Определяет расстояние между соседними точками привязки внутри поля БМК.

void

ZRazmWindow::GetDxDyPriv(int& dx, int& dy)

{

const ZNstBMK& bmk = *GlobalData->GetNstBMK();

DOP_PRIV_YACH *priv1, *priv2;

dx =0;

dy =0;

for (int i=0; i< bmk.dop_priv_yach->GetItemsInContainer()-1 && (!dx || !dy); i++) {

priv1 = (*bmk.dop_priv_yach)[i];

priv2 = (*bmk.dop_priv_yach)[i+1];

if (!priv1->perif && !priv2->perif) {

if (!dx) dx = abs(priv1->x - priv2->x);

if (!dy) dy = abs(priv1->y - priv2->y);

}

}

if (!dx || !dy) PROG_LOV;

}

void

ZRazmWindow::CmFixYach()

{

FixYach(TRUE);

}

void

ZRazmWindow::CmUnfixYach()

{

FixYach(FALSE);

}

void

ZRazmWindow::CmFixFr()

{

FixFr(TRUE);

}

void

ZRazmWindow::CmUnfixFr()

{

FixFr(FALSE);

}

void

ZRazmWindow::CmSelFixYach()

{

SelFixYach(TRUE);

}

void

ZRazmWindow::CmSelNofixYach()

{

SelFixYach(FALSE);

}

// Закрепляет или открепляет размещение выделенных ячеек.

void

ZRazmWindow::FixYach(BOOL fix)

{

char msg[512]; ZPsh *obj;

TIListIteratorImp<ZPsh> iter(*PoleRazm->SpSelYach);

while (iter!=0) {

obj=iter++;

obj->IsFixed = fix;

}

ZFrameMonitor* frame = TYPESAFE_DOWNCAST(GetApplication()->GetMainWindow(), ZFrameMonitor);

if (!frame) PROG_LOV;

wsprintf(msg, GetModule()->LoadString((fix) ? IDS_FIX_YACH : IDS_UNFIX_YACH).c_str(),

PoleRazm->SpSelYach->GetItemsInContainer());

frame->SetTextSLine(msg);

if (PoleRazm->SpSelYach->GetItemsInContainer()) Modif = TRUE;

}

// Закрепляет или открепляет выделенный фрагмент.

// Статус ячеек фрагмента при этом не изменяется!

void

ZRazmWindow::FixFr(BOOL fix)

{

TIStackAsList<ZPsh> StackFr;

ZPsh *RodObj, *Obj;

ZPsh* PtrSelFr = GetPtrSelFr();

if (!PtrSelFr) return;

StackFr.OwnsElements(0);

StackFr.Push(PtrSelFr);

while (!StackFr.IsEmpty()) {

RodObj = StackFr.Pop();

RodObj->IsFixed = fix;

for (int i=0; i<RodObj->SostavPsh->GetItemsInContainer(); i++) {

Obj = (*(RodObj->SostavPsh))[i];

if (!Obj->IsYach()) StackFr.Push(Obj);

}

}

PoleUpr->PaintSpFr();

Modif = TRUE;

char msg[512];

int ids = (fix) ? IDS_FIX_FR : IDS_UNFIX_FR;

wsprintf(msg, GetModule()->LoadString(ids).c_str(), PtrSelFr->Name);

MessageBox(msg, GetModule()->GetName(), MB_OK | MB_ICONINFORMATION);

}

// Выделяет все фиксированные или нефиксированные ячейки текущего фрагмента.

// Текущий режим выбора ячеек (YACH, FR или RECT) не изменяется!

void

ZRazmWindow::SelFixYach(BOOL fixYach)

{

// Для блокировки возможности перемещения и удаления отдельных ячеек.

TypOper = OPR_SELECT;

TIStackAsList<ZPsh> StackFr;

ZPsh *RodObj, *Obj;

StackFr.OwnsElements(0);

StackFr.Push(PtrTekFr);

int kolSel = 0;

while (!StackFr.IsEmpty()) {

RodObj = StackFr.Pop();

for (int i=0; i<RodObj->SostavPsh->GetItemsInContainer(); i++) {

Obj=(*(RodObj->SostavPsh))[i];

if (Obj->IsYach()) {

if (Obj->PrivYach && Obj->IsFixed == fixYach) {

if (Obj->PrivYach->Select || PoleRazm->SelectYach(Obj->PrivYach, TRUE, TRUE)) kolSel++;

}

} else StackFr.Push(Obj);

}

}

char msg[512];

int ids = (fixYach) ? IDS_KOL_SEL_FIX_YACH : IDS_KOL_SEL_NOFIX_YACH;

wsprintf(msg, GetModule()->LoadString(ids).c_str(), PtrTekFr->Name, kolSel);

ZFrameMonitor* frame = TYPESAFE_DOWNCAST(GetApplication()->GetMainWindow(), ZFrameMonitor);

if (!frame) PROG_LOV;

frame->SetTextSLine(msg);

}

Схема TIMER

????????? ?? Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.