diff --git a/Components/Base/PBase.cpp b/Components/Base/PBase.cpp new file mode 100644 index 0000000..e33a8e5 --- /dev/null +++ b/Components/Base/PBase.cpp @@ -0,0 +1,761 @@ +//--------------------------------------------------------------------------- + +#include + +#pragma hdrstop + +#include +#include "PBase.h" +#pragma package(smart_init) +//--------------------------------------------------------------------------- +// настройки компонента +#include "frmProp.h" +typedef TfrmProperty HelpForm; // класс формы которая будет вызвана в качестве формы свойств +//--------------------------------------------------------------------------- +// ValidCtrCheck is used to assure that the components created do not have +// any pure virtual functions. +// +//--------------------------------------------------------------------------- +/*namespace Pbase +{ + void __fastcall PACKAGE Register() + { + TComponentClass classes[1] = {__classid(PBase)}; + RegisterComponents("Samples", classes, 0); + } +} */ +//--------------------------------------------------------------------------- +static inline void ValidCtrCheck(PBase *) +{ + new PBase(NULL); +} +//--------------------------------------------------------------------------- +__fastcall PBase::PBase(TComponent* Owner) + : TGraphicControl(Owner) +{ + //ControlAtPos Определить элемент управления, содержащийся в указанной позиции. TWinControl + Parent = dynamic_cast(Owner); + Width=70; + Height=70; + // параметры холста + Canvas->Brush->Color = clWhite; // Brush - заливка + Canvas->Pen->Color = clGray; // Pen - рисование линий + Canvas->Font->Size = 8; + Canvas->Font->Color = clGray; + Canvas->Font->Name="Times New Roman"; + // задаем уникальное имя компоненту + int PBaseNameId = 0; + String name = (String)ClassName() + IntToStr( ++PBaseNameId ); + while( Owner->FindComponent( name ) ) + name = (String)ClassName() + IntToStr( ++PBaseNameId ); + Name = name; + // прорисовка компонента + //Paint(); + // способ перетаскивания + DragKind = dkDrag; + DragMode = dmManual; + // в момент перетаскивания устанавливается в true + _Drag = false; + // контексттное меню + Menu = new TPopupMenu(this); + // поворот + TMenuItem *miRotate = new TMenuItem(Menu); + miRotate->Name = "Rotate"; + miRotate->Caption = "Повернуть"; + miRotate->OnClick = MenuItemClick; + Menu->Items->Add(miRotate); + // удалить + TMenuItem *miDel = new TMenuItem(Menu); + miDel->Name = "Delete"; + miDel->Caption = "Удалить"; + miDel->OnClick = MenuItemClick; + Menu->Items->Add(miDel); + // свойства + TMenuItem *miProp = new TMenuItem(Menu); + miProp->Name = "Properties"; + miProp->Caption = "Свойства"; + miProp->OnClick = MenuItemClick; + Menu->Items->Add(miProp); + // силовой объект ассоциированный с компонентом + _Obj = NULL; + // определяем где какая группа выводов отображается + _LEFT_ = 0; + _RIGHT_= 1; + _BOTTOM_=2; + _TOP_ = 3; + // событие об изменении элемеента + OnChange = NULL; + // событие возникает при клике по выводу + OnPinMouseDown = NULL; + // возникает в конце перетаскивания на объект + OnPinDragDrop = NULL; + OnPinDragOver = NULL; + // Вызывается при удалении + OnDelete = NULL; + // прозрачная кисть - замкнутые участки делаются прозрачными + //Canvas->Brush->Style = bsClear; +} +//--------------------------------------------------------------------------- +__fastcall PBase::~PBase(){ + //delete Menu; удаляется по владельцу + pList.clear(); // иначе при удалении происходит вызов SetParent + // удалим саму модель + if( _Obj->Owner == this ){ + delete _Obj; _Obj = NULL; + } +} +//--------------------------------------------------------------------------- +void __fastcall PBase::Paint(void){ + //SetBkMode(Canvas->Handle, TRANSPARENT ); // Handle - это описательокна в windows + //Canvas.Handle == контекст отображения + //BitBlt(((TForm*)Parent)->Canvas->Handle, 200, 200, Width, Height, ((TForm*)Parent)->Canvas->Handle, Left, Top, SRCCOPY); + if(Parent == NULL) return; + // рисуем тело + Canvas->Rectangle(10,10,Width-10,Height-10); + // имя + String name; + if(_Obj) + name = _Obj->Name; + else + name = Name; + Canvas->TextOutA(Width/2 - 3.0*name.Length(), (Height-20)/2+4,name); + // прорисовываем выводы + int outWidth; + int outStep; + int pins_cnt; + if(_Obj){ + int n = _Obj->Out.Count(); // число групп выводов + int fontSize = Canvas->Font->Size; + Canvas->Font->Size = 6; + if(n > _TOP_){ + // выводы сверху + outWidth = Width - 24; + pins_cnt = _Obj->Out[_TOP_].Count; + outStep = (float)outWidth/(pins_cnt-1); + for(int i=0; iMoveTo(12+i*outStep, 2); + Canvas->LineTo(12+i*outStep, 10); + // располагаем вывод + PPinControl *pc = PinControl(&_Obj->Out[_TOP_][i]); + if( pc){ + pc->Left = XtoParent(12+i*outStep - pc->Width/2); + pc->Top = YtoParent(0 - pc->Height/2); + } + } + Canvas->TextOutA(Width/2,11,_Obj->Out[_TOP_].Name); + } + if(n > _BOTTOM_){ + // выводы снизу + outWidth = Width - 24; + pins_cnt = _Obj->Out[_BOTTOM_].Count; + outStep = (float)outWidth/(pins_cnt-1); + for(int i=0; iMoveTo(12+i*outStep, Height-10); + Canvas->LineTo(12+i*outStep, Height-2); + // располагаем вывод + PPinControl *pc = PinControl(&_Obj->Out[_BOTTOM_][i]); + if( pc){ + pc->Left = XtoParent(12+i*outStep - pc->Width/2); + pc->Top = YtoParent(Height - pc->Height/2); + } + } + Canvas->TextOutA(Width/2,Height-22,_Obj->Out[_BOTTOM_].Name); + } + if(n > _RIGHT_){ + // выводы справа + outWidth = Height - 24; + pins_cnt = _Obj->Out[_RIGHT_].Count; + outStep = (float)outWidth/(pins_cnt-1); + for(int i=0; iMoveTo(Width-10, 12+i*outStep); + Canvas->LineTo(Width-2, 12+i*outStep); + // располагаем вывод + PPinControl *pc = PinControl(&_Obj->Out[_RIGHT_][i]); + if( pc){ + pc->Left = XtoParent(Width - pc->Width/2); + pc->Top = YtoParent(12+i*outStep - pc->Height/2); + } + } + Canvas->TextOutA(Width-12-6*_Obj->Out[_RIGHT_].Name.Length(),20,_Obj->Out[_RIGHT_].Name); + } + if(n > _LEFT_){ + // выводы слева + outWidth = Height - 24; + pins_cnt = _Obj->Out[_LEFT_].Count; + outStep = (float)outWidth/(pins_cnt-1); + for(int i=0; iMoveTo(2, 12+i*outStep); + Canvas->LineTo(10,12+i*outStep); + // располагаем вывод + PPinControl *pc = PinControl(&_Obj->Out[_LEFT_][i]); + if( pc){ + pc->Left = XtoParent(0 - pc->Width/2); + pc->Top = YtoParent(12+i*outStep - pc->Height/2); + } + } + Canvas->TextOutA(12,20,_Obj->Out[_LEFT_].Name); + } + Canvas->Font->Size = fontSize; + } +} +//--------------------------------------------------------------------------- +int __fastcall PBase::XtoParent(int x){return x+Left;} +int __fastcall PBase::YtoParent(int y){return y+Top;} +//--------------------------------------------------------------------------- +void __fastcall PBase::MouseMove(Classes::TShiftState Shift, int X, int Y){ + // осуществляем перетаскивание + if(_Drag){ + Left += X-MouseDownPos_X; + Top += Y-MouseDownPos_Y; + } + if(OnMouseMove) OnMouseMove(this, Shift, X, Y); +} +//--------------------------------------------------------------------------- +void __fastcall PBase::MouseDown(TMouseButton Button, Classes::TShiftState Shift, int X, int Y){ + if(Button==mbLeft){ + // перетаскиваем элемент + _Drag = true; + MouseDownPos_X = X; + MouseDownPos_Y = Y; + } + else if (Button==mbRight){ + // определим координаты относительно окна + TPoint p, sp; + p.x = X; p.y = Y; + sp = ClientToScreen(p); + /*/ если это сеть + if(dynamic_cast(_Obj)) + Menu->Items->Find("Редактировать сеть")->Visible = true; + else + Menu->Items->Find("Редактировать сеть")->Visible = false;*/ + // выводим меню + Menu->Popup(sp.x,sp.y); + } + // вызываем дополнительный внешний обработчик + if(OnMouseDown) OnMouseDown(this, Button, Shift, X, Y); +} +//--------------------------------------------------------------------------- +void __fastcall PBase::MouseUp(TMouseButton Button, Classes::TShiftState Shift, int X, int Y){ + _Drag = false; + if(OnMouseUp) OnMouseUp(this, Button, Shift, X, Y); +} +//--------------------------------------------------------------------------- +void PBase::createPins(){ + // удаляем раннее созданные объекты + for(int i=0, n=pList.size(); iOut.Count(); iOut[i].Count; jName = Name + "_" +IntToStr(i) + "_" +IntToStr(j); // имя компонента вывода + pList.back()->Parent = Parent; // а родителем тот на ком рисуем + pList.back()->Pin( &_Obj->Out[i][j]); + pList.back()->OnMouseDown = PinMouseDown; + pList.back()->OnDragDrop = PinDragDrop; + pList.back()->OnDragOver = PinDragOver; + pList.back()->OnMouseDown = PinMouseDown; + } +} +//--------------------------------------------------------------------------- +void __fastcall PBase::SetParent(TWinControl* AParent){ + inherited::SetParent(AParent); + for(int i=0, n=pList.size(); iParent = AParent; +} +//--------------------------------------------------------------------------- +void __fastcall PBase::MenuItemClick(TObject *Sender){ + String itemName = ((TMenuItem*)Sender)->Name; + if(itemName == "Properties"){ + // меню свойства + HelpForm *frmP = new HelpForm(this); + frmP->Obj = this; + frmP->ShowModal(); + delete frmP; + Repaint(); // если произошли изменения внешнего вида, то отобразим + // событие-уведомление об изменении элемента + if(OnChange) OnChange(this); + } + else if(itemName == "Rotate"){ + // поворот + int tmp = _LEFT_; + _LEFT_=_BOTTOM_; + _BOTTOM_=_RIGHT_; + _RIGHT_=_TOP_; + _TOP_=tmp; + Repaint(); + } + else if(itemName == "Delete"){ + // удаление + if(OnDelete) OnDelete(this); + // удалим объект и модель + delete this; + } +} +//--------------------------------------------------------------------------- +void PBase::Obj(PElement *obj){ + if(_Obj!=NULL){ + err(0, "PBase: компонент уже асоциирован с моделю " + _Obj->ClassName() + ". Новая ассоциация не выполнена."); + return; + } + if(obj){ + _Obj = obj; + if(obj->Owner==NULL) _Obj->Owner = this; // если у объекта нет родителя + createPins(); // создаем графическое представление выводов + } +} +//--------------------------------------------------------------------------- +PElement * PBase::Obj(){ + return _Obj; +} +//--------------------------------------------------------------------------- + // создаем объект и ассоциируем его с компонентом +PElement* PBase::ObjType(String ClassName){ + Visible = false; + vector Params; + if(ClassName == "PLine"){ + int cells = 1; + TryStrToInt(InputBox("Параметры ЛЭП", "Введите число звеньев", "1"), cells); + if( cells < 1 ) cells = 1; + Params.push_back((void*)(&cells)); + } + Obj( CreateObj(ClassName, Params) ); + Visible = true; + return _Obj; +} +//--------------------------------------------------------------------------- +PPinControl* PBase::PinControl (PPin *pin){ + for(int k=0, m=pList.size(); kPin() == pin) + return pList[k]; + return NULL; +} +void __fastcall PBase::PinMouseDown(TObject* Sender, TMouseButton Button, Classes::TShiftState Shift, int X, int Y){ + // вызываем внешний обработчик события + if(OnPinMouseDown)OnPinMouseDown(Sender, Button, Shift, X, Y); +} +//--------------------------------------------------------------------------- +void __fastcall PBase::PinDragDrop (System::TObject* Sender, System::TObject* Source, int X, int Y){ + // вызываем внешний обработчик события + if(OnPinDragDrop) OnPinDragDrop(Sender, Source, X, Y); +} +//--------------------------------------------------------------------------- +void __fastcall PBase::PinDragOver(System::TObject* Sender, System::TObject* Source, int X, int Y, TDragState State, bool &Accept){ + // вызываем внешний обработчик события + if(OnPinDragOver) OnPinDragOver(Sender, Source, X, Y, State, Accept); +} +//--------------------------------------------------------------------------- +void PBase::Save(ostream &stream){ // сохранение параметров объекта в поток + if(Name==""){ + err(0, "PBase: компонент имеет нулевое имя. Возможно файл будет неоткрываем."); + } + stream << StringForSave( &Name ) << " "; + stream << Left << " "; + stream << Top << " "; + stream << Width << " "; + stream << Height << " "; + stream << _LEFT_ << " "; + stream << _RIGHT_ << " "; + stream << _TOP_ << " "; + stream << _BOTTOM_ << " "; + stream << true << " "; + // сохранить сам объект + SaveObj( _Obj, stream ); +} +//--------------------------------------------------------------------------- +/*void PBase::SaveComponentOnly(ostream &stream){ // сохранение параметров объекта в поток + if(Name==""){ + err(0, "PBase: компонент имеет нулевое имя. Возможно файл будет неоткрываем."); + } + stream << StringForSave( &Name ) << " "; + stream << Left << " "; + stream << Top << " "; + stream << Width << " "; + stream << Height << " "; + stream << _LEFT_ << " "; + stream << _RIGHT_ << " "; + stream << _TOP_ << " "; + stream << _BOTTOM_ << " "; + stream << false << " "; +}*/ +//--------------------------------------------------------------------------- +void PBase::Read(istream &stream){ // загрузка параметров объекта из потока + char name[1024]; + stream >> name; + Name = name; + int left, top, width, height; + stream >> left; Left = left; + stream >> top; Top = top; + stream >> width; Width = width; + stream >> height; Height = height; + stream >> _LEFT_; + stream >> _RIGHT_; + stream >> _TOP_; + stream >> _BOTTOM_; + // была ли сохранена модель + bool saveModel = true; + stream >> saveModel; + // создадим объект + if(saveModel) Obj( CreateObj(stream) ); +} +//--------------------------------------------------------------------------- +/*void PBase::ReadComponentOnly(istream &stream){ // загрузка параметров объекта из потока + char name[1024]; + stream >> name; + Name = name; + int left, top, width, height; + stream >> left; Left = left; + stream >> top; Top = top; + stream >> width; Width = width; + stream >> height; Height = height; + stream >> _LEFT_; + stream >> _RIGHT_; + stream >> _TOP_; + stream >> _BOTTOM_; + // была ли сохранена модель + bool saveModel = true; + stream >> saveModel; // должно быть false +} */ +//--------------------------------------------------------------------------- +/* +void __fastcall PBase::CreateParams(TCreateParams &Params) +{ + inherited::CreateParams( Params); + Params.Style |= WS_CLIPCHILDREN; + //Params.ExStyle |= WS_EX_TRANSPARENT; +} +/*void __fastcall PBase::WndProc( Messages::TMessage &message) +{ + if( message.Msg == WM_ERASEBKGND) + { + DefaultHandler( &message); + return; + } + inherited::WndProc( message); +}* +void __fastcall PBase::SetBounds( int left, int top, int width, int height) +{ + if( left == this->Left && top == this->Top && + width == this->Width && height == this->Height) + return; + if( this->HandleAllocated()){ + SetWindowPos( this->Handle, 0, left, top, width, height, + SWP_NOZORDER + SWP_NOACTIVATE);// + SWP_NOREDRAW); + } + else + this->UpdateBoundsRect( TRect( left, top, left + width, top + height)); +} */ + +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +__fastcall PPinControl::PPinControl(TComponent* Owner) + : TShape(Owner){ + _Pin = NULL; // нет ассоциированного вывода для компонента + // графические параметры вывода + Shape = stCircle; + Width = 4; + Height = 4; + Pen->Color = clGray; + // на какой компонент рисуем + //Parent = (TWinControl*)Owner; не всегда владелец == родитель + // всплывающая подсказка + ShowHint = false; + // обработка Drag & Drop + DragMode = dmManual; + // событие возникает при клике + OnMouseDown = NULL; + // возникает в конце перетаскивания на объект + OnDragDrop = NULL; + OnDragOver = NULL; +} +//--------------------------------------------------------------------------- +__fastcall PPinControl::~PPinControl(){ + //5 == 5; + if(OnDelete) OnDelete(this); // оповещаем об удалении +} +//--------------------------------------------------------------------------- +void PPinControl::Pin(PPin* pin){ + _Pin = pin; + PElement* obj = pin->Obj(); + // определяем фазу и сохраняем ее во всплывающей подсказке + Hint = pin->Node(); + for(int i=0, n=obj->Out.Count(); iOut[i].Count; jOut[i][j].Node() == pin->Node()){ + switch(j){ + case _N_: Hint = "N"; break; // break; - это специально, т.к. вывод + case _A_: Hint = "A"; break; + case _B_: Hint = "B"; break; + case _C_: Hint = "C"; break; + } + i=n;j=m; // завершаем циклы + } + ShowHint = true; +} +//--------------------------------------------------------------------------- +PPin* PPinControl::Pin(){ + return _Pin; +} +//--------------------------------------------------------------------------- +void __fastcall PPinControl::DragOver(System::TObject* Source, int X, int Y, TDragState State, bool &Accept){ + // если перетаскиваем вывод + if(dynamic_cast(Source)) + Accept = true; // разрешаем принять объект + // внешний обработчик + if(OnDragOver) OnDragOver(this, Source, X, Y, State, Accept); +} +//--------------------------------------------------------------------------- +void __fastcall PPinControl::DragDrop (System::TObject* Source, int X, int Y){ + // внешний обработчик + if(OnDragDrop) OnDragDrop(this, Source, X, Y); +} +//--------------------------------------------------------------------------- +void __fastcall PPinControl::MouseDown(TMouseButton Button, Classes::TShiftState Shift, int X, int Y){ + BeginDrag(true, -1); // начинаем перетаскивание объекта + // внешний обработчик + if(OnMouseDown) OnMouseDown(this, Button, Shift, X, Y); +} +//--------------------------------------------------------------------------- +void __fastcall PPinControl::MouseEnter(TMessage& Msg){ + savedWidth = Width; savedHeight = Height; // запоминаем размеры + savedColor = Pen->Color; // цвет карандаша + // делаем вывод больше по размеру и изменяем положение + Pen->Color = clRed; + Width = 2*savedWidth; + Height= 2*savedHeight; +} +//--------------------------------------------------------------------------- +void __fastcall PPinControl::MouseLeave(TMessage& Msg){ + // возвращаем размеры и положение + Width = savedWidth; + Height= savedHeight; + Pen->Color = savedColor; + Repaint(); +} +//--------------------------------------------------------------------------- +PLinkComponent::PLinkComponent(TComponent *owner){ + Owner = owner; + Menu = new TPopupMenu(NULL); + // удалить + TMenuItem *miDel = new TMenuItem(Menu); + miDel->Name = "Delete"; + miDel->Caption = "Удалить связь"; + miDel->OnClick = MenuItemClick; + Menu->Items->Add(miDel); + // установим при отображении меню + menuFor = -1; + // на ком рисуем + Parent = (TForm*)owner; +} +/*/--------------------------------------------------------------------------- +PLinkComponent::~PLinkComponent(){ + delete Menu; Menu = NULL; +} */ +//--------------------------------------------------------------------------- +PLinkComponent PLinkComponent::operator=(const PLinkComponent &Obj){ + Owner = Obj.Owner; + Menu = new TPopupMenu(NULL); + // удалить + TMenuItem *miDel = new TMenuItem(Menu); + miDel->Name = "Delete"; + miDel->Caption = "Удалить связь"; + miDel->OnClick = MenuItemClick; // адрес функции другой + Menu->Items->Add(miDel); + // установим при отображении меню + menuFor = Obj.menuFor; + // на ком рисуем + Parent = Obj.Parent; + // копируем связи + Links = Obj.Links; + // перенаправим оповещалки + for(int i=0, n=Count(); iOnDelete = PinDelete; // оповещать функцию PinDelete при удалении вывода + Links[i].Second->OnDelete = PinDelete; + } + return *this; +} +//--------------------------------------------------------------------------- +PLinkComponent::~PLinkComponent(){ + // перенаправим оповещалки + for(int i=0, n=Count(); iOnDelete = NULL; // не оповещать функцию PinDelete при удалении вывода + Links[i].Second->OnDelete = NULL; + } +} +//--------------------------------------------------------------------------- +void __fastcall PLinkComponent::MenuItemClick(TObject *Sender){ + // menuFor - содержит номер связи для которой происходил вывод меню + String itemName = ((TMenuItem*)Sender)->Name; + if(itemName == "Delete"){ + // удаление + if( menuFor>=0 || menuFor<(int)Links.size() ){ + Links.erase(Links.begin() + menuFor); + if(OnDelete) OnDelete(this); + Paint(); + } + } +} +//--------------------------------------------------------------------------- +void PLinkComponent::ShowMenuFor(int LinkNumber){ // показать меню для заданной связи + if( LinkNumber<0 || LinkNumber>=(int)Links.size() ){ + err(3, "PLinkComponent: отображение меню. Компонента с таким номером не существует."); + return; + } + // определим координаты относительно окна + TPoint sp; + GetCursorPos(&sp); + // выводим меню + menuFor = LinkNumber; + Menu->Popup(sp.x,sp.y); +} +//--------------------------------------------------------------------------- +void PLinkComponent::ShowMenuFor(int X, int Y){ // показать меню для связи c заданными координатами + int n = FindAtPos(X,Y); + if( n != -1 ) + ShowMenuFor( n ); +} +//--------------------------------------------------------------------------- +void PLinkComponent::Add (Pair_PinConrtol link){ // добавить новую пару + Links.push_back(link); + link.First->OnDelete = PinDelete; // оповещать функцию PinDelete при удалении + link.Second->OnDelete = PinDelete; + // сообщаем об изменении + if(OnAdd) OnAdd(this); +} +//--------------------------------------------------------------------------- +void __fastcall PLinkComponent::PinDelete(PPinControl *pc){ + // оповестили об удалении компонента, удалим связи с ним + Delete( pc ); +} +//--------------------------------------------------------------------------- +void PLinkComponent::Delete(PPinControl* pc){ // удалить связи, где присутствует указанный объект + if(Links.size()==0)return; + vector::iterator iter = Links.begin(); + while( iter != Links.end() ) + { + if(iter->First == pc || iter->Second == pc) + iter = Links.erase( iter ); + else + ++iter; + } +} +//--------------------------------------------------------------------------- +void PLinkComponent::Delete(PPin* pin){ // удалить связи, где присутствует указанный объект + vector::iterator iter = Links.begin(); + while( iter != Links.end() ) + { + if(iter->First->Pin() == pin || iter->Second->Pin() == pin) + iter = Links.erase( iter ); + else + ++iter; + } +} +//--------------------------------------------------------------------------- +Pair_PinConrtol& PLinkComponent::operator[](int i){ + return Links.at(i); +} +//--------------------------------------------------------------------------- +int PLinkComponent::Count(){ + return Links.size(); +} +//--------------------------------------------------------------------------- +// линию проходящую через заданную точку +int PLinkComponent::FindAtPos(int X, int Y){ + for(int i=0, n = Links.size(); iLeft+ 1; + int Y1 = Links[i].First->Top + 1; + int X2 = Links[i].Second->Left+ 1; + int Y2 = Links[i].Second->Top + 1; + // находимся внутри отрезка ? + if( ((X>(X1-3) && X<(X2+3))||(X>(X2-3) && X<(X1+3))) && + ((Y>(Y1-3) && Y<(Y2+3))||(Y>(Y2-3) && Y<(Y1+3))) ){ + // tсли вертикальная или горизонтальная линия, то достаточно условия вхождения в прямоуг + if( X1==X2 || Y1==Y2 ) + return i; + // удовлетворяем ли уравнению линии + float k = 1.0*(Y1-Y2)/(X1-X2); + float c = Y1 - k*X1; + if(fabs(Y- k*X-c)<=4) // промахнулись на 4 пиксел + return i; // возвращаем связь + } + } + return -1; +} +//--------------------------------------------------------------------------- +void __fastcall PLinkComponent::Paint(){ + if(Parent==NULL) return; + static bool Painting = false; + if(Painting) return; + Painting = true; + Parent->Repaint(); // очищаем все временные линии + // рисуем линии связи + TColor color = Parent->Canvas->Pen->Color; + TBrushStyle bStyle= Parent->Canvas->Brush->Style; + Parent->Canvas->Pen->Color = clGray; + Parent->Canvas->Brush->Style = bsClear; + for(int i=0, n=Count(); iLeft+ 1; + int from_Y = Links[i].First->Top + 1; + int to_X = Links[i].Second->Left+ 1; + int to_Y = Links[i].Second->Top + 1; + Parent->Canvas->MoveTo(from_X, from_Y); + Parent->Canvas->LineTo(to_X, to_Y); + } + Parent->Canvas->Pen->Color = color; + Parent->Canvas->Brush->Style = bStyle; + // закончили рисовать + Painting = false; +} +//---------------------------------------------------------------------------- +void PLinkComponent::Save(ostream &stream){ // сохранить контрол + int n = Links.size(); + stream << n << " "; + for(int i=0; iName) ) << " "; + stream << StringForSave( &(Links[i].Second->Name) ) << " "; + } +} +//--------------------------------------------------------------------------- +void PLinkComponent::Read(istream &stream){ // загрузить контрол + int n; // число связей + stream >> n; + for(int i=0; i> tmp; X = tmp; + stream >> tmp; Y = tmp; + // найдем эти компоненты (родителем компонентов д.б. PBase) и добавим их в список связанных + for(int i = 0;i < Owner->ComponentCount; i++){ + PBase *pb = dynamic_cast( Owner->Components[i] ); + if( pb ){ + for(int j = 0;j < pb->ComponentCount; j++) + if(pb->Components[j]->ClassNameIs("PPinControl")){ + if ( pb->Components[j]->Name == X ) + pc.First = (PPinControl*)pb->Components[j]; + else if( pb->Components[j]->Name == Y ) + pc.Second= (PPinControl*)pb->Components[j]; + } + } + } + if( pc.First==NULL) + err(0, "PLinkComponent: не найден вывод с заданным именем (" +X+ ") на указанной форме"); + else if(pc.Second==NULL ) + err(0, "PLinkComponent: не найден вывод с заданным именем (" +Y+ ") на указанной форме"); + else + Add( pc ); + } +} +//--------------------------------------------------------------------------- +void PLinkComponent::Clear(){ + Links.clear(); +} +//--------------------------------------------------------------------------- + diff --git a/Components/Base/PBase.h b/Components/Base/PBase.h new file mode 100644 index 0000000..e7c0c3f --- /dev/null +++ b/Components/Base/PBase.h @@ -0,0 +1,142 @@ +//--------------------------------------------------------------------------- +#ifndef PBaseH +#define PBaseH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include "model.h" +//--------------------------------------------------------------------------- +// формулы рассчета ЭДС источников +PType Ef(PElement* obj, double &time); +PType Eb(PElement* obj, double &time); +PType Ec(PElement* obj, double &time); +//--------------------------------------------------------------------------- +//typedef void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender); +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +class PPinControl; +class PACKAGE PBase : public TGraphicControl // TGraphicControl позволяет сделать компонент прозрачным +{ +private: + typedef TGraphicControl inherited; + DYNAMIC void __fastcall MouseDown(TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseMove(Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + std::vector _Pins_Cnt; + int MouseDownPos_X, MouseDownPos_Y; // где была нажата кнопка мыши + bool _Drag; // флаг нереноса + int _LEFT_, _RIGHT_, _TOP_,_BOTTOM_; // номер какой группы выводов с какой + // стороны должен быть отображен + // (необходим для поворота компонента) + PPinControl* PinControl (PPin *pin); // возвращает граф.объект ассоциированный с выводом + void __fastcall PinMouseDown(TObject* Sender, TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + void __fastcall PinDragDrop (System::TObject* Sender, System::TObject* Source, int X, int Y); + void __fastcall PinDragOver(System::TObject* Sender, System::TObject* Source, int X, int Y, TDragState State, bool &Accept); + int __fastcall XtoParent(int x); + int __fastcall YtoParent(int y); +protected: + TPopupMenu *Menu; // контектное меню + virtual void __fastcall MenuItemClick(TObject *Sender); // вызывается при клике на элемент меню + PElement *_Obj; + virtual void __fastcall SetParent(TWinControl* AParent); + void createPins(); // создать объекты граф.представления выводов + vector pList; // список графических объектов выводов +public: + //typedef TCustomControl inherited; + //void __fastcall CreateParams(TCreateParams &Params); // overriding TWinControl::CreateParams + //void __fastcall SetBounds( int left, int top, int width, int height); // overriding TWinControl::SetBounds + //void __fastcall WndProc( Messages::TMessage &message); + __fastcall PBase(TComponent* Owner); + __fastcall ~PBase(); + virtual void __fastcall Paint(void); // вызывается родителем при просисовке компонента + __property DragKind = {default=0}; + __property DragMode = {default=0}; + __property OnMouseDown ; + __property OnMouseMove ; + __property OnMouseUp ; + __property OnEndDrag = {default=0}; + __property OnStartDrag = {default=0}; + TNotifyEvent OnChange; + TMouseEvent OnPinMouseDown; // событие возникает при клике по выводу + TDragDropEvent OnPinDragDrop; // возникает в конце перетаскивания на объект + TDragOverEvent OnPinDragOver; // возникает в конце перетаскивания на объект + void Obj(PElement *obj); // ассоцииируем силовой объект с компонентом + PElement * Obj(); // ассоцииируем силовой объект с компонентом + PElement* ObjType(String ClassName); // создаем объект и ассоциируем его с компонентом + TNotifyEvent OnDelete; // Вызывается при удалении + //virtual void SaveComponentOnly(ostream &stream); // сохраняется только компонент без модели + //virtual void ReadComponentOnly(istream &stream); // читаем только компонент без модели + virtual void Save(ostream &stream); // сохранить контрол и объект (saveModel=false сохраняется только компонент без модели ) + virtual void Read(istream &stream); // загрузить контрол и объект +__published: +}; +//--------------------------------------------------------------------------- +// Power Pin Control - Графическое представление вывода от устройства +class PPinControl : public TShape{ +private: + PPin* _Pin; + DYNAMIC void __fastcall MouseDown(TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall DragOver(System::TObject* Source, int X, int Y, TDragState State, bool &Accept); + DYNAMIC void __fastcall DragDrop (System::TObject* Source, int X, int Y); + int savedWidth, savedHeight; // для запоминания размеров + TColor savedColor; +protected: + void __fastcall MouseEnter(TMessage& Msg); + void __fastcall MouseLeave(TMessage& Msg); + #pragma warn -8027 + BEGIN_MESSAGE_MAP + VCL_MESSAGE_HANDLER(CM_MOUSEENTER,TMessage,MouseEnter); + VCL_MESSAGE_HANDLER(CM_MOUSELEAVE,TMessage,MouseLeave); + END_MESSAGE_MAP(TShape); + #pragma warn -8027 +public: + __fastcall PPinControl(TComponent* Owner); + __fastcall ~PPinControl(); + PPin* Pin(); // возвращаем вывод + void Pin(PPin* pin); // установим вывод + TMouseEvent OnMouseDown; // событие возникает при клике по выводу + TDragOverEvent OnDragOver; // возникает в конце перетаскивания на объект + TDragDropEvent OnDragDrop; // возникает в конце перетаскивания на объект + typedef void __fastcall (__closure *PinNotifyEvent)(PPinControl* Sender); + PinNotifyEvent OnDelete; // Вызывается при удалении +}; +//--------------------------------------------------------------------------- +class Pair_PinConrtol{ + public: + PPinControl* First; + PPinControl* Second; +}; +//--------------------------------------------------------------------------- +class PLinkComponent{ + vector Links; + void __fastcall MenuItemClick(TObject *Sender); + TPopupMenu* Menu; // меню данной связи + int menuFor; // для какого элемента обображено меню + void __fastcall PinDelete(PPinControl *pc); // вызывается при удалении компонента вывода + void Change(); // вызывается при изменении компонентов связи + public: + void Add (Pair_PinConrtol link); // добавить новую пару + void Delete(PPinControl* pc); // удалить связи, где присутствует указанный вывод + void Delete(PPin* pin); // удалить связи, где присутствует указанный вывод + Pair_PinConrtol& operator[](int i); + int Count(); + int FindAtPos(int X, int Y); // поиск линии по координатам + PLinkComponent(TComponent *owner); + PLinkComponent operator=(const PLinkComponent &Obj);// присваивание + ~PLinkComponent(); + void ShowMenuFor(int LinkNumber); // показать меню для заданной связи + void ShowMenuFor(int X, int Y); // показать меню для связи с заданными координатами + void __fastcall Paint(); // прорисовывает связи + TForm* Parent; // компонент на котором рисуем + TComponent* Owner; // компонент-владелец + void Save(ostream &stream); // сохранить контрол и связи + void Read(istream &stream); // загрузить контрол и связи + void __fastcall (__closure *OnDelete)(PLinkComponent* Sender); // Вызывается при удалении связи + void __fastcall (__closure *OnAdd)(PLinkComponent* Sender); // вызывается при изменении связей + void Clear(); +}; +//--------------------------------------------------------------------------- +#endif diff --git a/Components/Base/PBase.obj b/Components/Base/PBase.obj new file mode 100644 index 0000000..20b78af Binary files /dev/null and b/Components/Base/PBase.obj differ diff --git a/Components/Forms/EditGrid.cpp b/Components/Forms/EditGrid.cpp new file mode 100644 index 0000000..bcd59c4 --- /dev/null +++ b/Components/Forms/EditGrid.cpp @@ -0,0 +1,320 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "EditGrid.h" +#include "Scope.h" +#include "ObectsLibrary.h" +//#include "kernel.h" // хидер для работы с моделями +#include +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma resource "*.dfm" +//--------------------------------------------------------------------------- +void err(unsigned num, String text){ + static unsigned cnt=0; + cnt++; + ShowMessage(text); +} +//--------------------------------------------------------------------------- +__fastcall TfrmEditGrid::TfrmEditGrid(TComponent* Owner) + : TForm(Owner), LinkLines(this) +{ + // инициализируем объекта + LinkLines.Clear(); + Objects.clear(); + // компонент отображения связей + LinkLines.Parent = this; + //LinkLines.OnDelete = LinkDelete; + // владелец создаваемых компонентов (может быть переопределен из-вне) + ComponentOwner = this; + // исключим мерцание + //DoubleBuffered = true; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmEditGrid::UnitDelete(TObject *Sender){ + vector::iterator iter = Objects.begin(); + while( iter != Objects.end() ) + { + if( *iter == (PBase*)Sender){ + Objects.erase( iter ); + break;} + else + ++iter; + } + // удаляем все связи с этим объектом + PElement* obj = ((PBase*)Sender)->Obj(); + for(int i=0, n=obj->Out.Count(); iOut[i].Count; jOut[i][j] ); // удалим все связи, связанные с выводом + // перерисуем связи + LinkLines.Paint(); +} +//--------------------------------------------------------------------------- +void __fastcall TfrmEditGrid::PinDragDrop (System::TObject* Sender, System::TObject* Source, int X, int Y){ + // если перетащили на самого себя, то не добавляем + if( Sender == Source ) return; + // сохраняем информацию графической о связи + Pair_PinConrtol pcon; + pcon.First = (PPinControl*)Source; + pcon.Second= (PPinControl*)Sender; + LinkLines.Add(pcon); + // отобразим связь + LinkLines.Paint(); +} +//--------------------------------------------------------------------------- +void __fastcall TfrmEditGrid::FormDragOver(TObject *Sender, TObject *Source, + int X, int Y, TDragState State, bool &Accept) +{ + Accept = false; + // если в процессе соединения выводов + if(PPinControl *pc = dynamic_cast(Source)){ + int from_X = pc->Left + pc->Width/2; + int from_Y = pc->Top + pc->Height/2; + TColor color = Canvas->Pen->Color; + Canvas->Pen->Color = clBlack; + Repaint(); // очищаем все временные линии + Canvas->MoveTo(from_X, from_Y); + Canvas->LineTo(X, Y); + Canvas->Pen->Color = color; + Accept = true; + } + // перетащили новый объект из библиоьеки компонентов + else if(Source->ClassNameIs("TTreeView")){ + Accept = true; + } +} +//--------------------------------------------------------------------------- +void __fastcall TfrmEditGrid::FormPaint(TObject *Sender) +{ + // рисуем линии PaintLines() + LinkLines.Paint(); +} +//--------------------------------------------------------------------------- +void __fastcall TfrmEditGrid::FormDragDrop(TObject *Sender, TObject *Source, + int X, int Y) +{ + // очищаем все временные линии созданные при соединении выводов + if(Source->ClassNameIs("PPinControl")) + Repaint(); + // перетащили новый объект из библиоьеки компонентов + else if(Source->ClassNameIs("TTreeView")){ + TTreeView *obj = (TTreeView*)Source; + int n = obj->Selected->AbsoluteIndex; + if ( n != -1){ + TTreeNode *Node = obj->Items->Item[n]; + if(Node != NULL){// && !Node->HasChildren){ + // создаем элемент + // сохраняем его в списке и применяем параметры по умолчанию + TTreeNode *Prev = obj->Selected; + String Adress = Prev->Text; + while ( Prev ){ + if ( Prev->HasChildren ) Adress = Prev -> Text + "\\" + Adress; + Prev = Prev->Parent; + } + AddObject( Adress, X, Y); + } + } + } +} +//--------------------------------------------------------------------------- +void TfrmEditGrid::AddObject(String TypeName, int X, int Y){ // список TypeName - передается из frmObjLib->tvList + String cName = ""; + String ClassName = "PBase"; + if(TypeName == "Источники\\Генератор трехфазный") cName = "PSource"; + else if(TypeName == "Трансформаторы\\Силовые\\Трехфазный") cName = "PTransformer_3"; + else if(TypeName == "Трансформаторы\\Силовые\\Однофазный") cName = "PTransformer_1"; + else if(TypeName == "Трансформаторы\\Тока\\Однофазный") cName = "PCurrent_Transformer_1"; + else if(TypeName == "Линии\\Одноцепная без ГТ") cName = "PLine"; + else if(TypeName == "Потребители\\Трехфазный") cName = "PConsumer"; + else if(TypeName == "Коммутационная аппаратура\\Выключатель")cName = "PBreaker"; + else if(TypeName == "Подсеть") {cName = "PSubGrid"; ClassName = "PGridComponent"; } + // сохраняем его в списке и применяем параметры по умолчанию + if(cName!=""){ + // добавить компонент-модель + CreateControl(ClassName, cName); + PBase *control = Objects.back(); + control->Left = X - control->Width/2; + control->Top = Y - control->Height/2; + } + else{ + err(3, "PowerSystem: не определено действие для создания указанного компонента из Библиотеки объектов"); + } +} +//--------------------------------------------------------------------------- +void TfrmEditGrid::CreateControl(String Class, String ModelClass){ + // добавить компонент-модель + PBase *control; + TComponent *owner; + if(ComponentOwner) owner = ComponentOwner; + else owner = this; + if(Class == "PGridComponent") control = new PGridComponent( owner ); + else control = new PBase( owner ); + AddControl( control ); // добавить компонент в список отображаемых и установить параметры + control->ObjType( ModelClass ); // ассоциируем компонент с моделью типа +} +//--------------------------------------------------------------------------- +// добавить компонент в список отображаемых и установить параметры +void TfrmEditGrid::AddControl(PBase *control){ + control->Parent = this; + //control->OnChange = UnitChange; + //control->OnPinMouseDown = PinMouseDown; + control->OnPinDragDrop = PinDragDrop; + control->OnDelete = UnitDelete; + Objects.push_back( control ); // сохраняем в список компонентов +} +//--------------------------------------------------------------------------- +void __fastcall TfrmEditGrid::mnuObjLibClick(TObject *Sender) +{ + // вызов библиотеки объектов + TfrmObjLib *frmOL = new TfrmObjLib(this); + frmOL->Show(); +} +//--------------------------------------------------------------------------- +void __fastcall TfrmEditGrid::FormMouseDown(TObject *Sender, + TMouseButton Button, TShiftState Shift, int X, int Y) +{ + // щелкнули правую кнопку + if(Button == mbRight){ + // может мы указываем на линию связи? + LinkLines.ShowMenuFor( X, Y ); + } +} +//--------------------------------------------------------------------------- +void __fastcall TfrmEditGrid::mnuSaveClick(TObject *Sender) +{ + // выводим диалог и сохраняем + saveDlg->Filter = ".psf|*.psf|любой файл|*.*"; + if( saveDlg->Execute() ){ + AnsiString Name = saveDlg->FileName; + ofstream out(Name.c_str()); + if(out){ + // сохраняем объекты + int n = Objects.size(); + out << n << " "; + for(int i=0; iClassName() ) << " "; + Objects[i]->Save( out ); + } + // сохраним информацию о связях + LinkLines.Save( out ); + } + } +} +//--------------------------------------------------------------------------- +PElement* TfrmEditGrid::FindObj(String Name){ + for(int i=0, n=Objects.size(); iObj()->Name ) + return Objects[i]->Obj(); + return NULL; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmEditGrid::mnuOpenClick(TObject *Sender) +{ + // выводим диалог и открываем + openDlg->Filter = ".psf|*.psf|любой файл|*.*"; + if( openDlg->Execute() ){ + OpenFile(openDlg->FileName); + } +} +//--------------------------------------------------------------------------- +void TfrmEditGrid::OpenFile(String name){ + ifstream in(name.c_str()); + if(in){ + // очищаем существующую сеть + mnuNewClick(NULL); + // сохраняем объекты + int n; + in >> n; + for(int i=0; i> cname; String cName = cname; + // добавляем компонент, указывающий на нулевую модель + CreateControl( cName, "" ); + // загружаем параметры компонента + Objects.back()->Read( in ); + } + // загружаем информацию о связях + LinkLines.Read( in ); + // Изменяем заголовок окна + if( Name.Length() < 32 ) + Caption = name; + else + Caption = name.SubString(Name.Length()-32, 32); + } +} +//--------------------------------------------------------------------------- +void __fastcall TfrmEditGrid::mnuNewClick(TObject *Sender) +{ + // очищаем существующую сеть + for(int i=0, n=Objects.size(); iObj()->Name; + for(int j=i+1; jObj()->Name == name){ + err(0, "EditGrid: внутри сети объекты должны иметь уникальные имена"); + Action = caNone; + } + } +} +//--------------------------------------------------------------------------- +void __fastcall TfrmEditGrid::FormShow(TObject *Sender) +{ + if(GridCtrl){ + // изначально окрасим все выводы в серый + for(int k=0, o=Objects.size(); k( Objects[k] ); + if( pb ){ + for(int h = 0;h < pb->ComponentCount; h++) + if(pb->Components[h]->ClassNameIs("PPinControl")){ + // если компонент-вывод указывает на нужный нам вывод, то изменяем + // графические характеристики этого компонента + ((PPinControl*)pb->Components[h])->Pen->Color = clGray; + } + } + } + // выдели текущие выводы от сети + for(int i=0, n=GridCtrl->Obj()->Out.Count(); iObj()->Out[i].Count; jObj()->Out[i][j]; + for(int k=0, o=Objects.size(); k( Objects[k] ); + if( pb ){ + for(int h = 0;h < pb->ComponentCount; h++) + if(pb->Components[h]->ClassNameIs("PPinControl")){ + // если компонент-вывод указывает на нужный нам вывод, то изменяем + // графические характеристики этого компонента + PPinControl *pctrl = (PPinControl*)pb->Components[h]; + if (pctrl->Pin() == pin ) + pctrl->Pen->Color = clRed; + } + } + } + } + } +} +//--------------------------------------------------------------------------- diff --git a/Components/Forms/EditGrid.ddp b/Components/Forms/EditGrid.ddp new file mode 100644 index 0000000..cdc0ee8 Binary files /dev/null and b/Components/Forms/EditGrid.ddp differ diff --git a/Components/Forms/EditGrid.dfm b/Components/Forms/EditGrid.dfm new file mode 100644 index 0000000..45a2f58 --- /dev/null +++ b/Components/Forms/EditGrid.dfm @@ -0,0 +1,60 @@ +object frmEditGrid: TfrmEditGrid + Left = 239 + Top = 162 + Width = 860 + Height = 445 + Caption = #1056#1077#1076#1072#1082#1090#1080#1088#1086#1074#1072#1090#1100' '#1089#1077#1090#1100 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Menu = MainMenu1 + OldCreateOrder = False + Position = poDesktopCenter + OnClose = FormClose + OnDragDrop = FormDragDrop + OnDragOver = FormDragOver + OnMouseDown = FormMouseDown + OnPaint = FormPaint + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object saveDlg: TSaveDialog + DefaultExt = '.png' + Left = 40 + end + object openDlg: TOpenDialog + Left = 72 + end + object MainMenu1: TMainMenu + Left = 8 + object mnuFile: TMenuItem + Caption = #1060#1072#1081#1083 + object mnuNew: TMenuItem + Caption = #1057#1086#1079#1076#1072#1090#1100' '#1087#1088#1086#1077#1082#1090 + OnClick = mnuNewClick + end + object mnuSave: TMenuItem + Caption = #1057#1086#1093#1088#1072#1085#1080#1090#1100 + OnClick = mnuSaveClick + end + object mnuOpen: TMenuItem + Caption = #1054#1090#1082#1088#1099#1090#1100 + OnClick = mnuOpenClick + end + end + object mnuTools: TMenuItem + Caption = #1048#1085#1089#1090#1088#1091#1084#1077#1085#1090#1099 + object BuildGrid: TMenuItem + Caption = #1057#1073#1086#1088#1082#1072' '#1089#1077#1090#1080 + Visible = False + end + object mnuObjLib: TMenuItem + Caption = #1041#1080#1073#1083#1080#1086#1090#1077#1082#1072' '#1086#1073#1098#1077#1082#1090#1086#1074 + OnClick = mnuObjLibClick + end + end + end +end diff --git a/Components/Forms/EditGrid.h b/Components/Forms/EditGrid.h new file mode 100644 index 0000000..3f90a4b --- /dev/null +++ b/Components/Forms/EditGrid.h @@ -0,0 +1,74 @@ +//--------------------------------------------------------------------------- + +#ifndef EditGridH +#define EditGridH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include +#include +#include "PBase.h" // хидер базового графического-компонента для модели +#include "PGridComponent.h" // хидер графического-компонента "Сеть" +#include +//--------------------------------------------------------------------------- +class TfrmEditGrid : public TForm +{ +__published: // IDE-managed Components + TSaveDialog *saveDlg; + TOpenDialog *openDlg; + TMainMenu *MainMenu1; + TMenuItem *mnuFile; + TMenuItem *mnuNew; + TMenuItem *mnuSave; + TMenuItem *mnuOpen; + TMenuItem *mnuTools; + TMenuItem *BuildGrid; + TMenuItem *mnuObjLib; + //void __fastcall mnuScopeClick(TObject *Sender); + //void __fastcall btnStartClick(TObject *Sender); + //void __fastcall btnPauseClick(TObject *Sender); + //void __fastcall TimerTimer(TObject *Sender); + //void __fastcall FormDestroy(TObject *Sender); + //void __fastcall btnStopClick(TObject *Sender); + //void __fastcall BuildGridClick(TObject *Sender); + void __fastcall FormDragOver(TObject *Sender, TObject *Source, int X, + int Y, TDragState State, bool &Accept); + void __fastcall FormPaint(TObject *Sender); + void __fastcall FormDragDrop(TObject *Sender, TObject *Source, int X, + int Y); + void __fastcall mnuObjLibClick(TObject *Sender); + void __fastcall FormMouseDown(TObject *Sender, TMouseButton Button, + TShiftState Shift, int X, int Y); + void __fastcall mnuSaveClick(TObject *Sender); + void __fastcall mnuOpenClick(TObject *Sender); + void __fastcall mnuNewClick(TObject *Sender); + void __fastcall FormClose(TObject *Sender, TCloseAction &Action); + void __fastcall FormShow(TObject *Sender); + //void __fastcall mnuAboutClick(TObject *Sender); + //void __fastcall FormResize(TObject *Sender); +private: // User declarations + void AddObject(String TypeName, int X, int Y); + void CreateControl(String Class, String ModelClass); // создать новый компонент + void __fastcall PaintLines(); // прорисовывает необходимые линии + //void __fastcall UnitChange(TObject *Sender); + void __fastcall UnitDelete(TObject *Sender); + //void __fastcall LinkDelete(PLinkComponent *Sender); + void OpenFile(String name); // открыть указанный файл + //void __fastcall PinMouseDown(TObject* Sender, TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + void __fastcall PinDragDrop (System::TObject* Sender, System::TObject* Source, int X, int Y); + PElement* FindObj(String Name); +public: // User declarations + __fastcall TfrmEditGrid(TComponent* Owner); + vector Objects; // список всех объектов на форме + PLinkComponent LinkLines; // связи между выводами + PGridComponent *GridCtrl; // это графический-компонент для для, которую строим + TComponent* ComponentOwner; // если указан, владельцем всех созданных компонентов становится он + void AddControl(PBase *control); // добавить компонент в список отображаемых и установить параметры + }; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +#endif diff --git a/Components/Forms/EditGrid.obj b/Components/Forms/EditGrid.obj new file mode 100644 index 0000000..55c8a89 Binary files /dev/null and b/Components/Forms/EditGrid.obj differ diff --git a/Components/Forms/frmProp.cpp b/Components/Forms/frmProp.cpp new file mode 100644 index 0000000..a02c0da --- /dev/null +++ b/Components/Forms/frmProp.cpp @@ -0,0 +1,70 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "frmProp.h" +#include "main.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma resource "*.dfm" +TfrmProperty *frmProperty; +//--------------------------------------------------------------------------- +__fastcall TfrmProperty::TfrmProperty(TComponent* Owner) + : TForm(Owner) +{ + +} +//--------------------------------------------------------------------------- +void __fastcall TfrmProperty::FormClose(TObject *Sender, + TCloseAction &Action) +{ + PElement* model = Obj->Obj(); + // сохраняем изменения перед закрытием + if(model){ + for(int i=0, n=model->Fields.size(); iFields[i].Value( Fields->Values[ model->Fields[i].Name ] ); + } + model->accept(); // применяем изменения + // сохраняем способ рассчета ЭДС - грязный хук + if(PSource *src = dynamic_cast(model)) + src->sourceParams.Change(Fields->Values[ "ЭДС" ]); + } +} +//--------------------------------------------------------------------------- +void __fastcall TfrmProperty::FormShow(TObject *Sender) +{ + PElement* model = Obj->Obj(); + // перебираем поля которые надо вывести + if(Obj){ + for(int i=0, n=model->Fields.size(); iValues[ model->Fields[i].Name ] = model->Fields[i].Value(); + bool _ro = false; + if(model->Fields[i].Mode == ro) _ro = true; + Fields->ItemProps[model->Fields[i].Name]->ReadOnly = _ro; + } + // сохраняем способ рассчета ЭДС - грязный хук + if(PSource *src = dynamic_cast(model)){ + String p = src->sourceParams.Get(); + Fields->Values["ЭДС"] = p; + Valedit::TItemProp *ip = Fields->ItemProps["ЭДС"]; + ip->EditStyle = esPickList; + ip->ReadOnly = false; + if(p!="") ip->PickList->Add( p ); + ip->PickList->Add("неизменно:Значение"); + ip->PickList->Add("sin:Частота:Значение"); + ip->PickList->Add("нессиметрия:Частота:ПП:ОП:НП"); + } + // подгоняем размер + Fields->Height = (Fields->DefaultRowHeight+2)*Fields->RowCount; + if( Fields->Height > Screen->Height-50) Fields->Height = Screen->Height-50; + } +} + +void __fastcall TfrmProperty::FormResize(TObject *Sender) +{ + Fields->Width = Width - 16; + Height = Fields->Height + 40; +} +//--------------------------------------------------------------------------- + diff --git a/Components/Forms/frmProp.ddp b/Components/Forms/frmProp.ddp new file mode 100644 index 0000000..cdc0ee8 Binary files /dev/null and b/Components/Forms/frmProp.ddp differ diff --git a/Components/Forms/frmProp.dfm b/Components/Forms/frmProp.dfm new file mode 100644 index 0000000..fd1f12a --- /dev/null +++ b/Components/Forms/frmProp.dfm @@ -0,0 +1,30 @@ +object frmProperty: TfrmProperty + Left = 92 + Top = 43 + Width = 206 + Height = 300 + BorderStyle = bsSizeToolWin + Caption = #1057#1074#1086#1081#1089#1090#1074#1072 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + OnClose = FormClose + OnResize = FormResize + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object Fields: TValueListEditor + Left = 0 + Top = 0 + Width = 169 + Height = 257 + TabOrder = 0 + ColWidths = ( + 74 + 89) + end +end diff --git a/Components/Forms/frmProp.h b/Components/Forms/frmProp.h new file mode 100644 index 0000000..7ad74ea --- /dev/null +++ b/Components/Forms/frmProp.h @@ -0,0 +1,31 @@ +//--------------------------------------------------------------------------- + +#ifndef frmPropH +#define frmPropH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include +#include +#include +//--------------------------------------------------------------------------- +class TfrmProperty : public TForm +{ +__published: // IDE-managed Components + TValueListEditor *Fields; + void __fastcall FormClose(TObject *Sender, TCloseAction &Action); + void __fastcall FormShow(TObject *Sender); + void __fastcall FormResize(TObject *Sender); +private: // User declarations +public: // User declarations + __fastcall TfrmProperty(TComponent* Owner); + PBase *Obj; +}; +//--------------------------------------------------------------------------- +extern PACKAGE TfrmProperty *frmProperty; +//--------------------------------------------------------------------------- +#endif diff --git a/Components/Forms/frmProp.obj b/Components/Forms/frmProp.obj new file mode 100644 index 0000000..b988df4 Binary files /dev/null and b/Components/Forms/frmProp.obj differ diff --git a/Components/PGridComponent.cpp b/Components/PGridComponent.cpp new file mode 100644 index 0000000..750f3e3 --- /dev/null +++ b/Components/PGridComponent.cpp @@ -0,0 +1,162 @@ +//--------------------------------------------------------------------------- +#pragma hdrstop + +#include "PGridComponent.h" +//--------------------------------------------------------------------------- +#include "EditGrid.h" +typedef TfrmEditGrid GridEditForm; // класс формы которая будет вызвана в качестве формы свойств +//--------------------------------------------------------------------------- +__fastcall PGridComponent::PGridComponent(TComponent* Owner) : + PBase(Owner), + LinkLines(this){ + LinkLines.Parent = NULL; + // редактировать сеть + TMenuItem *miGrid = new TMenuItem(Menu); + miGrid->Name = "EditGrid"; + miGrid->Caption = "Редактировать сеть"; + miGrid->OnClick = MenuItemClick; + Menu->Items->Add(miGrid); +} +//--------------------------------------------------------------------------- +void PGridComponent::Save(ostream &stream){ // сохранить контрол и объект + // сохраним базовый компонент + sire::Save(stream); + // сохраняем компоненты + int n=Objects.size(); + stream << n << " "; + for(int i=0; iClassName() ) << " "; + Objects[i]->Save(stream); + } + // сохраним информацию о связях + LinkLines.Save( stream ); + // сохраним группы выводов + String Outs = ((PSubGrid*)_Obj)->getOuts(); + stream << StringForSave( &Outs ) << " "; +} +//--------------------------------------------------------------------------- +void PGridComponent::Read(istream &stream){ // загрузить контрол и объект + // очищаем существующую сеть + Objects.clear(); + LinkLines.Clear(); + // читаем базовый компонент + sire::Read(stream); + PSubGrid *grid = dynamic_cast(_Obj); + if(!grid){err(0, "PGridComponent: при загрузке не создан компонент");} + // читаем компоненты + int n=0; + stream >> n; + for(int i=0; i> cname; String cName = cname; + PBase *ctrl = AddControl(cName, "");// добавляем компонент, указывающий на нулевую модель + ctrl->Read(stream); // прочитаем настройки этого компонента + } + // читаем информацию о связях + LinkLines.Read( stream ); + + // настроим компонент и модель в соответствии со связями + // информация о связях для передачи в модель + Pins_Link Link; + for(int i=0, n=LinkLines.Count(); iPin(), *LinkLines[i].Second->Pin()); + // найдем все подсети внутри этой сети + vector sgList; + PSubGrid *sg; + for(int i=0, n=Objects.size(); iObj()->ClassName() == "PSubGrid") + sgList.push_back( (PSubGrid*)Objects[i]->Obj() ); + grid->Change( Link, sgList ); + // создадим группы выводов + char outs[1024]; + stream >> outs; String Outs = outs; + grid->setOuts( Outs ); + // создадим компоненты-выводы + createPins(); +} +//--------------------------------------------------------------------------- +PBase* PGridComponent::AddControl(String Class, String ModelClass){ + // добавить компонент-модель + PBase *control = NULL; + if(Class == "PGridComponent") control = new PGridComponent( this ); + else control = new PBase( this ); + control->ObjType( ModelClass ); // ассоциируем компонент с моделью типа + Objects.push_back( control ); // сохраняем в список компонентов + return control; +} +//--------------------------------------------------------------------------- +void __fastcall PGridComponent::MenuItemClick(TObject *Sender){ // вызывается при клике на элемент меню + // обрабатываем базовые операции определенные в базовом классе + sire::MenuItemClick( Sender ); + // операции специфичные для компонента-сети + String itemName = ((TMenuItem*)Sender)->Name; + if(itemName == "EditGrid"){ + PSubGrid *grid = dynamic_cast(_Obj); + if(!grid) return; + // вызываем модальное окно редактирования + GridEditForm *frmGE = new GridEditForm(this); + // владельцем всех компонентов, созданных на форме, будет этот компонент + frmGE->ComponentOwner = this; + // указываеем графический компонент сети + frmGE->GridCtrl = this; + // забрасываем на нее компоненты + frmGE->LinkLines.Clear(); + for(int i=0, n=Objects.size(); iAddControl( Objects[i] ); // компоненты должны быть отображены на форме + // связи между выводами + frmGE->LinkLines = LinkLines; + frmGE->LinkLines.Parent = frmGE; // клмпонент должен быть отображен на форме + // показываем форму + frmGE->Caption = _Obj->Name; + frmGE->ShowModal(); + // сохраним изменения в компонентах и связях + Objects = frmGE->Objects; + LinkLines = frmGE->LinkLines; + // запомним какие выводы были до изменении подсети + String oldOuts = grid->getOuts(); + // применим изменения в модели + if(LinkLines.Count()==0 && Objects.size()==1) + err(0, "PGridComponent: подсеть должна содержать более 1 компонента"); + else if( Objects.size() != 0 && LinkLines.Count()!=0){ + // соединяем выводы + Pins_Link Link; + Link.clear(); + for(int i=0, n=LinkLines.Count(); iPin(), *LinkLines[i].Second->Pin()); + // найдем все подсети внутри этой сети + vector sgList; + PSubGrid *sg; + for(int i=0, n=Objects.size(); iObj()->ClassName() == "PSubGrid") + sgList.push_back( (PSubGrid*)Objects[i]->Obj() ); + // опишем сеть + grid->Change( Link, sgList ); + } + else if( Objects.size() == 0 ){ + // создаем пустую сеть + Pins_Link Link; + vector sgList; + grid->Change( Link, sgList ); + } + else + err(0, "PGridComponent: не возможно собрать подсеть, т.к. не указано ни одной связи между элементами"); + // какие выводы необходимы от сети + String Outs = InputBox("Выводы от сети", "В формате \"Объект1.X; Объект2.X1; [...]\"", grid->getOuts() ); + grid->setOuts( Outs ); + // при изменении сети выводы могли уничтожиться - тогда надо пересобрать компоненты-выводы + if( grid->getOuts() != oldOuts ){ + // пересоздаем выводы + createPins(); + } + // чтобы компоненты не удалились + for(int i=0, n=Objects.size(); iParent = NULL; + LinkLines.Parent = NULL; + // Owner компонентов сзданных на форме является этот компонент, а Parent==NULL, поэтому удаление формы не приведет к удалению созданных компонентов + delete frmGE; + Repaint(); // если произошли изменения внешнего вида, то отобразим + // событие-уведомление об изменении элемента + if(OnChange) OnChange(this); + } +} +#pragma package(smart_init) diff --git a/Components/PGridComponent.h b/Components/PGridComponent.h new file mode 100644 index 0000000..71957b0 --- /dev/null +++ b/Components/PGridComponent.h @@ -0,0 +1,22 @@ +//--------------------------------------------------------------------------- + +#ifndef PGridComponentH +#define PGridComponentH +//--------------------------------------------------------------------------- +#include "PBase.h" +//--------------------------------------------------------------------------- +class PGridComponent : public PBase{ + private: + typedef PBase sire; // родительский компонент + virtual void __fastcall MenuItemClick(TObject *Sender); // вызывается при клике на элемент меню + protected: + PBase* AddControl(String Class, String ModelClass); // создадим компонент, владельцем которого станем ModelClass - класс модели + public: + __fastcall PGridComponent(TComponent* Owner); + virtual void Save(ostream &stream); // сохранить контрол и объект + virtual void Read(istream &stream); // загрузить контрол и объект + vector Objects; // список всех объектов подсети + PLinkComponent LinkLines; // связи между выводами +}; +//--------------------------------------------------------------------------- +#endif diff --git a/Components/PGridComponent.obj b/Components/PGridComponent.obj new file mode 100644 index 0000000..447f90a Binary files /dev/null and b/Components/PGridComponent.obj differ diff --git "a/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\320\242\321\200\320\265\321\205\321\204\320\260\320\267\320\275\321\213\320\271 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200.bak" "b/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\320\242\321\200\320\265\321\205\321\204\320\260\320\267\320\275\321\213\320\271 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200.bak" new file mode 100644 index 0000000..48807e9 Binary files /dev/null and "b/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\320\242\321\200\320\265\321\205\321\204\320\260\320\267\320\275\321\213\320\271 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200.bak" differ diff --git "a/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\320\242\321\200\320\265\321\205\321\204\320\260\320\267\320\275\321\213\320\271 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200.spl" "b/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\320\242\321\200\320\265\321\205\321\204\320\260\320\267\320\275\321\213\320\271 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200.spl" new file mode 100644 index 0000000..414255d Binary files /dev/null and "b/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\320\242\321\200\320\265\321\205\321\204\320\260\320\267\320\275\321\213\320\271 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200.spl" differ diff --git "a/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\320\243\321\201\320\273\320\276\320\262\320\270\321\217 \321\205.\321\205.txt" "b/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\320\243\321\201\320\273\320\276\320\262\320\270\321\217 \321\205.\321\205.txt" new file mode 100644 index 0000000..7b13b32 --- /dev/null +++ "b/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\320\243\321\201\320\273\320\276\320\262\320\270\321\217 \321\205.\321\205.txt" @@ -0,0 +1,4 @@ +PType fa(double &time){ return 93897*sin(w*time+M_PI/2);} //93897 //8573 +PType fb(double &time){ return 93897*sin(w*time-2*M_PI/3+M_PI/2);} +PType fc(double &time){ return 93897*sin(w*time+2*M_PI/3+M_PI/2);} //9859 //900 +PType I_F(PType &F){ return 1e7*pow(F,7)+2*F;} // 3e18*pow(F,9)+10*F \ No newline at end of file diff --git "a/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\320\277\320\276\321\202\320\276\320\272_\320\220.png" "b/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\320\277\320\276\321\202\320\276\320\272_\320\220.png" new file mode 100644 index 0000000..b7119b5 Binary files /dev/null and "b/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\320\277\320\276\321\202\320\276\320\272_\320\220.png" differ diff --git "a/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\320\277\320\276\321\202\320\276\320\272_\320\222.png" "b/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\320\277\320\276\321\202\320\276\320\272_\320\222.png" new file mode 100644 index 0000000..377c320 Binary files /dev/null and "b/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\320\277\320\276\321\202\320\276\320\272_\320\222.png" differ diff --git "a/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\320\277\320\276\321\202\320\276\320\272_\320\241.png" "b/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\320\277\320\276\321\202\320\276\320\272_\320\241.png" new file mode 100644 index 0000000..e392975 Binary files /dev/null and "b/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\320\277\320\276\321\202\320\276\320\272_\320\241.png" differ diff --git "a/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\321\202\320\276\320\272_A.png" "b/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\321\202\320\276\320\272_A.png" new file mode 100644 index 0000000..3bbaf3b Binary files /dev/null and "b/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\321\202\320\276\320\272_A.png" differ diff --git "a/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\321\202\320\276\320\272_B.png" "b/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\321\202\320\276\320\272_B.png" new file mode 100644 index 0000000..e88177b Binary files /dev/null and "b/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\321\202\320\276\320\272_B.png" differ diff --git "a/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\321\202\320\276\320\272_C.png" "b/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\321\202\320\276\320\272_C.png" new file mode 100644 index 0000000..5f1965c Binary files /dev/null and "b/Docs/3-\321\204 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200/\321\202\320\276\320\272_C.png" differ diff --git "a/Docs/\320\222\321\213\320\272\320\273\321\216\321\207\320\260\321\202\320\265\320\273\321\214/B.png" "b/Docs/\320\222\321\213\320\272\320\273\321\216\321\207\320\260\321\202\320\265\320\273\321\214/B.png" new file mode 100644 index 0000000..ff7f5ac Binary files /dev/null and "b/Docs/\320\222\321\213\320\272\320\273\321\216\321\207\320\260\321\202\320\265\320\273\321\214/B.png" differ diff --git "a/Docs/\320\222\321\213\320\272\320\273\321\216\321\207\320\260\321\202\320\265\320\273\321\214/C.png" "b/Docs/\320\222\321\213\320\272\320\273\321\216\321\207\320\260\321\202\320\265\320\273\321\214/C.png" new file mode 100644 index 0000000..e7cc35c Binary files /dev/null and "b/Docs/\320\222\321\213\320\272\320\273\321\216\321\207\320\260\321\202\320\265\320\273\321\214/C.png" differ diff --git "a/Docs/\320\222\321\213\320\272\320\273\321\216\321\207\320\260\321\202\320\265\320\273\321\214/\320\220.png" "b/Docs/\320\222\321\213\320\272\320\273\321\216\321\207\320\260\321\202\320\265\320\273\321\214/\320\220.png" new file mode 100644 index 0000000..ab1aec7 Binary files /dev/null and "b/Docs/\320\222\321\213\320\272\320\273\321\216\321\207\320\260\321\202\320\265\320\273\321\214/\320\220.png" differ diff --git "a/Docs/\320\222\321\213\320\272\320\273\321\216\321\207\320\260\321\202\320\265\320\273\321\214/\320\241\321\205\320\265\320\274\320\260 \320\267\320\260\320\274\320\265\321\211\320\265\320\275\320\270\321\217.bak" "b/Docs/\320\222\321\213\320\272\320\273\321\216\321\207\320\260\321\202\320\265\320\273\321\214/\320\241\321\205\320\265\320\274\320\260 \320\267\320\260\320\274\320\265\321\211\320\265\320\275\320\270\321\217.bak" new file mode 100644 index 0000000..0458831 Binary files /dev/null and "b/Docs/\320\222\321\213\320\272\320\273\321\216\321\207\320\260\321\202\320\265\320\273\321\214/\320\241\321\205\320\265\320\274\320\260 \320\267\320\260\320\274\320\265\321\211\320\265\320\275\320\270\321\217.bak" differ diff --git "a/Docs/\320\222\321\213\320\272\320\273\321\216\321\207\320\260\321\202\320\265\320\273\321\214/\320\241\321\205\320\265\320\274\320\260 \320\267\320\260\320\274\320\265\321\211\320\265\320\275\320\270\321\217.spl" "b/Docs/\320\222\321\213\320\272\320\273\321\216\321\207\320\260\321\202\320\265\320\273\321\214/\320\241\321\205\320\265\320\274\320\260 \320\267\320\260\320\274\320\265\321\211\320\265\320\275\320\270\321\217.spl" new file mode 100644 index 0000000..a2f06f4 Binary files /dev/null and "b/Docs/\320\222\321\213\320\272\320\273\321\216\321\207\320\260\321\202\320\265\320\273\321\214/\320\241\321\205\320\265\320\274\320\260 \320\267\320\260\320\274\320\265\321\211\320\265\320\275\320\270\321\217.spl" differ diff --git "a/Docs/\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\260\321\206\320\270\321\217.pdf" "b/Docs/\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\260\321\206\320\270\321\217.pdf" new file mode 100644 index 0000000..2bfcbb2 Binary files /dev/null and "b/Docs/\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\260\321\206\320\270\321\217.pdf" differ diff --git "a/Docs/\320\224\321\200\320\276\321\201\321\201\320\265\320\273\320\270.spl" "b/Docs/\320\224\321\200\320\276\321\201\321\201\320\265\320\273\320\270.spl" new file mode 100644 index 0000000..1de3a9f Binary files /dev/null and "b/Docs/\320\224\321\200\320\276\321\201\321\201\320\265\320\273\320\270.spl" differ diff --git "a/Docs/\320\233\320\270\320\275\320\270\321\217/K1.png" "b/Docs/\320\233\320\270\320\275\320\270\321\217/K1.png" new file mode 100644 index 0000000..e12bf0d Binary files /dev/null and "b/Docs/\320\233\320\270\320\275\320\270\321\217/K1.png" differ diff --git "a/Docs/\320\233\320\270\320\275\320\270\321\217/K2.png" "b/Docs/\320\233\320\270\320\275\320\270\321\217/K2.png" new file mode 100644 index 0000000..2d1b9c9 Binary files /dev/null and "b/Docs/\320\233\320\270\320\275\320\270\321\217/K2.png" differ diff --git "a/Docs/\320\233\320\270\320\275\320\270\321\217/K3.png" "b/Docs/\320\233\320\270\320\275\320\270\321\217/K3.png" new file mode 100644 index 0000000..a2a68fb Binary files /dev/null and "b/Docs/\320\233\320\270\320\275\320\270\321\217/K3.png" differ diff --git "a/Docs/\320\233\320\270\320\275\320\270\321\217/\320\232 \320\276\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\321\216 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262 \320\233\320\255\320\237.spl" "b/Docs/\320\233\320\270\320\275\320\270\321\217/\320\232 \320\276\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\321\216 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262 \320\233\320\255\320\237.spl" new file mode 100644 index 0000000..1ae477e Binary files /dev/null and "b/Docs/\320\233\320\270\320\275\320\270\321\217/\320\232 \320\276\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\321\216 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262 \320\233\320\255\320\237.spl" differ diff --git "a/Docs/\320\233\320\270\320\275\320\270\321\217/\320\232 \320\276\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\321\216 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262 \320\233\320\255\320\237_2.spl" "b/Docs/\320\233\320\270\320\275\320\270\321\217/\320\232 \320\276\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\321\216 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262 \320\233\320\255\320\237_2.spl" new file mode 100644 index 0000000..aefd9aa Binary files /dev/null and "b/Docs/\320\233\320\270\320\275\320\270\321\217/\320\232 \320\276\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\321\216 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262 \320\233\320\255\320\237_2.spl" differ diff --git "a/Docs/\320\233\320\270\320\275\320\270\321\217/\320\241\321\205\320\265\320\274\320\260 \320\267\320\260\320\274\320\265\321\211\320\265\320\275\320\270\321\217 \320\233\320\255\320\237.spl" "b/Docs/\320\233\320\270\320\275\320\270\321\217/\320\241\321\205\320\265\320\274\320\260 \320\267\320\260\320\274\320\265\321\211\320\265\320\275\320\270\321\217 \320\233\320\255\320\237.spl" new file mode 100644 index 0000000..106b2ca Binary files /dev/null and "b/Docs/\320\233\320\270\320\275\320\270\321\217/\320\241\321\205\320\265\320\274\320\260 \320\267\320\260\320\274\320\265\321\211\320\265\320\275\320\270\321\217 \320\233\320\255\320\237.spl" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/images.jpeg" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/images.jpeg" new file mode 100644 index 0000000..422c4e2 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/images.jpeg" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33.html" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33.html" new file mode 100644 index 0000000..11b2c1a --- /dev/null +++ "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33.html" @@ -0,0 +1,418 @@ + + + + + + + +Общая характеристика задач и методов расчета магнитных цепей. (Лекция N 33) + + + + + + + + + +
+

Решение задач по ТОЭ, ОТЦ, Высшей математике, Физике, Программированию...

+ +Решение задач по ТОЭ, ОТЦ, ТЭЦ, Высшей математике www.toehelp.ru + +
+ + +
+ + +
+ + + + + + + + + + + +
ГлавнаяЦеныОплатаПримеры решенийОтзывыCcылкиТеорияКнигиСотрудничествоФорум
+ + + + +
   Теория / ТОЭ / Лекция N 33. Общая характеристика задач и методов расчета магнитных цепей.
+ + + + +
+

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

+

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

+

При расчете магнитных цепей на практике встречаются две типичные задачи:

+

-задача определения величины намагничивающей силы (НС), необходимой + для создания заданного магнитного потока (заданной магнитной индукции) на каком + - либо участке магнитопровода (задача синтеза или “прямая“ задача);

+

-задача нахождения потоков (магнитных индукций) на отдельных участках + цепи по заданным значениям НС (задача анализа или “обратная” задача).

+

Следует отметить, что задачи второго типа являются обычно более сложными и + трудоемкими в решении.

+

В общем случае в зависимости от типа решаемой задачи (“прямой” или “обратной”) + решение может быть осуществлено следующими методами:

+

-регулярными;

+

-графическими;

+

-итерационными.

+

При этом при использовании каждого из этих методов первоначально необходимо + указать на схеме направления НС, если известны направления токов в обмотках, + или задаться их положительными направлениями, если их нужно определить. Затем + задаются положительными направлениями магнитных потоков, после чего можно переходить + к составлению эквивалентной схемы замещения и расчетам.

+

Магнитные цепи по своей конфигурации могут быть подразделены на неразветвленные + и разветвленные. В неразветвленной магнитной цепи на всех ее участках + имеет место один и тот же поток, т.е. различные участки цепи соединены между + собой последовательно. Разветвленные магнитные цепи содержат два и более контура.

+

 

+

Регулярные методы расчета

+

Данными методами решаются задачи первого типа -”прямые” задачи. + При этом в качестве исходных данных для расчета заданы конфигурация и основные + геометрические размеры магнитной цепи, кривая (кривые) намагничивания ферромагнитного + материала и магнитный поток или магнитная индукция в каком-либо сечении магнитопровода. + Требуется найти НС, токи обмоток или, при известных значениях последних, число + витков.

+

 

+

1. Прямая” задача для неразветвленной магнитной цепи

+

Решение задач подобного типа осуществляется в следующей последовательности:

+

1. Намечается средняя линия (см. пунктирную линию на рис.1), которая затем + делится на участки с одинаковым сечением магнитопровода.

+

            2. + Исходя из постоянства магнитного потока вдоль всей цепи, определяются + значения индукции для каждого -го участка:

+

.

+

3. По кривой намагничивания для каждого значения  находятся напряженности  на ферромагнитных участках; напряженность + поля в воздушном зазоре определяется согласно

+

+

            4. + По второму закону Кирхгофа для магнитной цепи определяется искомая + НС путем суммирования падений магнитного напряжения вдоль контура:

+

,

+

где -длина воздушного + зазора.

+

 

+

2. “Прямая” задача для разветвленной магнитной цепи

+

            +Расчет разветвленных магнитных цепей основан на совместном применении + первого и второго законов Кирхгофа для магнитных цепей. +Последовательность решения + задач данного типа в целом соответствует рассмотренному выше алгоритму + решения + “прямой” задачи для неразветвленной цепи. При этом для определения +магнитных + потоков на участках магнитопровода, для которых магнитная +напряженность известна + или может быть вычислена на основании второго закона Кирхгофа, следует + использовать + алгоритм

+ + + + + + + +
по
+ +

В остальных случаях неизвестные магнитные потоки определяются на + основании первого закона Кирхгофа для магнитных цепей.

+

В качестве примера анализа + разветвленной магнитной цепи при заданных геометрии магнитной цепи на рис. 2 + и характеристике  ферромагнитного сердечника определим + НС , необходимую для создания в воздушном + зазоре индукции .

+

Алгоритм решения задачи следующий:

+

1. Задаем положительные направления магнитных потоков в стержнях магнитопровода + (см. рис. 2).

+

2. Определяем напряженность в воздушном зазоре  и по зависимости  для  - значение .

+

3. По второму закону Кирхгофа для правого контура можно записать

+

+

откуда находим  и по зависимости  - .

+

4. В соответствии с первым законом Кирхгофа

+

.

+

Тогда , и по зависимости  определяем .

+

5. В соответствии со вторым законом Кирхгофа для искомой НС имеет место уравнение

+

.

+

 

+

Графические методы расчета

+

Графическими методами решаются задачи второго типа - “обратные” + задачи. При этом в качестве исходных данных для расчета заданы конфигурация + и геометрические размеры магнитной цепи, кривая (кривые) намагничивания ферромагнитного + материала, а также НС обмоток. Требуется найти значения потоков (индукций) на + отдельных участках магнитопровода.

+

            Данные методы основаны на графическом представлении вебер-амперных + характеристик  линейных и нелинейных участков + магнитной цепи с последующим решением алгебраических уравнений, записанных по + законам Кирхгофа, с помощью соответствующих графических построений на плоскости.

+

 

+

1. “Обратная” задача для неразветвленной магнитной цепи

+

            +Решение задач подобного типа осуществляется в следующей +последовательности: +

+

1. Задаются значениями потока и определяют для них НС , как при решении “прямой” задачи. + При этом следует стремиться подобрать два достаточно близких значения потока, + чтобы получить , несколько меньшую и несколько + большую заданной величины НС.

+

2. По полученным данным строится часть характеристики  магнитной цепи (вблизи заданного + значения НС), и по ней определяется поток, соответствующий заданной величине + НС.

+

При расчете неразветвленных магнитных цепей, содержащих воздушные зазоры, удобно + использовать метод пересечений, при котором искомое решение определяется точкой + пересечения нелинейной вебер-амперной характеристики нелинейной + части цепи и линейной характеристики линейного участка, строящейся на основании + уравнения

+

+

где -магнитное сопротивление + воздушного зазора.

+

 

+

2. “Обратная” задача для разветвленной магнитной цепи

+

Замена магнитной цепи эквивалентной электрической схемой замещения (см. рис. + 3, на котором приведена схема замещения магнитной цепи на рис. 2) позволяет + решать задачи данного типа с использованием всех графических методов и приемов, + применяемых при анализе аналогичных нелинейных электрических цепей постоянного + тока.

+

В этом случае при расчете магнитных цепей, содержащих два узла (такую конфигурацию + имеет большое число используемых на практике магнитопроводов), широко используется + метод двух узлов. Идея решения данным методом аналогична рассмотренной для нелинейных + резистивных цепей постоянного тока и заключается в следующем:

+

1. Вычисляются зависимости  потоков во всех -х ветвях магнитной + цепи в функции общей величины -магнитного напряжения  между узлами  и .

+

2. Определяется, в какой точке графически реализуется первый закон Кирхгофа +  Соответствующие данной точке + потоки являются решением задачи.

+

 

+

Итерационные методы расчета

+

Данные методы, сущность которых была рассмотрена при анализе нелинейных резистивных + цепей постоянного тока, являются приближенными численными способами решения + нелинейных алгебраических уравнений, описывающих состояние магнитной цепи. Как + было отмечено выше, они хорошо поддаются машинной алгоритмизации и в настоящее + время широко используются при исследовании сложных магнитных цепей на ЦВМ. При + анализе относительно простых цепей, содержащих небольшое число узлов и нелинейных + элементов в эквивалентной электрической схеме замещения (обычно до двух-трех), + возможна реализация методов “вручную”.

+

В качестве примера приведем алгоритм расчета магнитной цепи на рис. 1, в которой + при заданных геометрии магнитопровода, характеристике  материала сердечника и величине + НС F необходимо найти поток Ф.

+

В соответствии с пошаговым расчетом для данной цепи можно записать

+ + + + + +
,  (1)
+

 

+

где .

+

Задаемся значением , вычисляем для -х участков магнитопровода , по кривой намагничивания  находим , подсчитываем  и по (1) определяем  для следующего приближения и + т.д., пока с заданной погрешностью не будет выполняться равенство .

+

 

+

Статическая и дифференциальная индуктивности катушки
+ с ферромагнитным сердечником

+

Пусть имеем катушку с ферромагнитным сердечником, представленную на рис. 4.

+

В соответствии с определением + потокосцепления

+ + + + + +
,         (2)
+

 

+

и на основании закона полного тока , откуда

+ + + + + +
(3)
+

 

+

Из соотношений (2) и (3) вытекает, что функция  качественно имеет такой же вид, + что и . Таким образом, зависимости относительной + магнитной проницаемости  и индуктивности  также подобны, т.е. представленные + в предыдущей лекции на рис. 2 кривые  и  качественно аналогичны кривым +  и .

+

Статическая индуктивность катушки с ферромагнитным сердечником

+

;

+

дифференциальная индуктивность

+

.

+

Если магнитную проводимость сердечника на рис. 4 обозначить через , то  и , откуда

+ + + + + +
(4)
+

 

+

Используя соотношение (4), покажем влияние воздушного зазора на индуктивность + катушки.

+

Пусть катушка на рис. 4 имеет воздушный зазор . Тогда полное магнитное сопротивление + контура

+

,

+

откуда

+

.

+

При , следовательно

+

.

+

Таким образом, воздушный зазор линеаризует катушку с ферромагнитным сердечником. + Зазор, для которого выполняется неравенство , называется большим зазором. +

+

 

+

Литература

+
    +
  1. Основы теории цепей: Учеб. для вузов /Г.В.Зевеке, П.А.Ионкин, А.В.Нетушил, + С.В.Страхов. –5-е изд., перераб. –М.: Энергоатомиздат, 1989. -528с.
  2. +
  3. Бессонов Л.А. Теоретические основы электротехники: Электрические + цепи. Учеб. для студентов электротехнических, энергетических и приборостроительных + специальностей вузов. –7-е изд., перераб. и доп. –М.: Высш. шк., 1978. –528с.
  4. +
  5. Теоретические основы электротехники. Учеб. для вузов. В трех т. Под + общ. ред. К.М.Поливанова. Т.2. Жуховицкий Б.Я., Негневицкий И.Б. Линейные + электрические цепи (продолжение). Нелинейные цепи. –М.:Энергия- 1972. –200с.
  6. +
+

Контрольные вопросы и задачи

+

 

+
    +
  1. Какие два типа задач встречаются при расчете магнитных цепей? Дайте им характеристику.
  2. +
  3. Какие существуют методы расчета магнитных цепей?
  4. +
  5. Какими методами решаются «обратные» задачи?
  6. +
  7. Как влияет воздушный зазор на индуктивность нелинейной катушки?
  8. +
  9. Что такое большой зазор?
  10. +
  11. В магнитной цепи на рис. 2 заданы  и . Составить алгоритм расчета длины + воздушного зазора .
  12. +
  13. Составить алгоритм итерационного расчета потока в воздушном зазоре магнитной + цепи на рис. 2 при заданной НС .
  14. +
  15. Запишите закон электромагнитной индукции с использованием статической  и дифференциальной  индуктивностей.
  16. +
+
+ +
+ + +
+
+ + +
+ + + +
+
+Education Banner Network (468x60) - Образовательная Баннерная Сеть
+ + + + +

+ + + + + + + +HotLog + + +Рейтинг@Mail.ru + +rax.ru: показано число хитов за 24 часа, посетителей за 24 часа и за сегодня +

+ + +
+ + + + + \ No newline at end of file diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/bb.htm" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/bb.htm" new file mode 100644 index 0000000..1721083 --- /dev/null +++ "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/bb.htm" @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/count.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/count.gif" new file mode 100644 index 0000000..21b6dcd Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/count.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/counter.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/counter.gif" new file mode 100644 index 0000000..4b9bdef Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/counter.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/erle.js" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/erle.js" new file mode 100644 index 0000000..f50917c --- /dev/null +++ "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/erle.js" @@ -0,0 +1,56 @@ + +var CgiHref = '//ad.adriver.ru/cgi-bin/click.cgi?sid=40303&ad=0&bid=1275&bt=16&bn=0&pz=0&nid=0&ref=&custom='; +var ar_bt=16; +var ar_siteid = 40303; +var Mirror = 'http://eltel1.adriver.ru'; +var bid = 1275; +var sliceid = 0; +var ar_adid = 0; +var ar_pz=0; +var ar_sz=''; +var ar_nid=0; +var ar_pass=''; +var ar_bn=0; +var ar_geozoneid=41; +var Path = '/images/0000001/0000001275/'; +var Comp0 = '0/script.js'; +var Width = 0; +var Height = 0; +var date = 'Sat, 07 Apr 2012 13:27:28 GMT'; +var Uid = 798183576; +var Target = '_top'; +var Alt = ''; +var CompPath = Mirror + Path + '0/'; +var RndNum4NoCash = 157258012; +var ar_ntype = 0; +var ar_tns = 1; +var ar_rhost='ad.adriver.ru'; +var ar_exposure_price = -1; +if (typeof(ar_tansw) != 'undefined') clearInterval(ar_tansw); +document.write(' + + + \ No newline at end of file diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/orphus_data/orphus.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/orphus_data/orphus.gif" new file mode 100644 index 0000000..55be1f8 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/orphus_data/orphus.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/show_ads.js" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/show_ads.js" new file mode 100644 index 0000000..4e53e48 --- /dev/null +++ "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/show_ads.js" @@ -0,0 +1,15 @@ +(function(){var g=!0,h=null,i=!1,j=(new Date).getTime();var aa=this,ba=function(a,b){var c=a.split("."),d=aa;!(c[0]in d)&&d.execScript&&d.execScript("var "+c[0]);for(var e;c.length&&(e=c.shift());)!c.length&&void 0!==b?d[e]=b:d=d[e]?d[e]:d[e]={}},ca=function(a,b,c){return a.call.apply(a.bind,arguments)},da=function(a,b,c){if(!a)throw Error();if(2/g,ha=/\"/g,l={"\x00":"\\0","\u0008":"\\b","\u000c":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\x0B":"\\x0B",'"':'\\"',"\\":"\\\\"},n={"'":"\\'"};var ia=document,q=window;var r=function(a){return"true"==a?g:i},ja=/^([\w-]+\.)*([\w-]{2,})(\:[0-9]+)?$/,t=function(a){return!a?"pagead2.googlesyndication.com":(a=a.match(ja))?a[0]:"pagead2.googlesyndication.com"};var ka=r("false"),la=r("false"),ma=r("false"),na=r("false");var v=function(a,b,c){c||(c=na?"https":"http");return[c,"://",a,b].join("")};var w=parseFloat("0"),oa=isNaN(w)||1w?0:w;var pa=function(){return t("")};t("");var y=function(a){return!!a&&"function"==typeof a&&!!a.call},ra=function(a,b){if(!(2>arguments.length))for(var c=1,d=arguments.length;cMath.random()&&(a=["/pagead/gen_204","?id=jserror","&jscb=",ka?1:0,"&jscd=",la?1:0,"&context=",z(a),"&msg=",z(b),"&file=",z(c),"&line=",z(d.toString()),"&url=",z(ia.URL.substring(0,512)),"&ref=",z(ia.referrer.substring(0,512))],a.push(["&client=",z(q.google_ad_client),"&format=",z(q.google_ad_format),"&slotname=",z(q.google_ad_slot),"&output=",z(q.google_ad_output),"&ad_type=",z(q.google_ad_type)].join("")),a=v(pa(),a.join("")),ta(q,a));return!ma});var ua=function(a){try{var b=a.google_test;a.google_test=!b;if(a.google_test===!b)return a.google_test=b,g}catch(c){}return i},A=h,va=function(){if(!A){for(var a=window;a!=a.parent&&ua(a.parent);)a=a.parent;A=a}return A};var B,C=function(a){this.c=[];this.a=a||window;this.b=0;this.d=h},wa=function(a,b){this.l=a;this.i=b};C.prototype.n=function(a,b){0==this.b&&0==this.c.length&&(!b||b==window)?(this.b=2,this.g(new wa(a,window))):this.h(a,b)};C.prototype.h=function(a,b){this.c.push(new wa(a,b||this.a));D(this)};C.prototype.o=function(a){this.b=1;a&&(this.d=this.a.setTimeout(k(this.f,this),a))};C.prototype.f=function(){1==this.b&&(this.d!=h&&(this.a.clearTimeout(this.d),this.d=h),this.b=0);D(this)};C.prototype.p=function(){return g}; +C.prototype.nq=C.prototype.n;C.prototype.nqa=C.prototype.h;C.prototype.al=C.prototype.o;C.prototype.rl=C.prototype.f;C.prototype.sz=C.prototype.p;var D=function(a){a.a.setTimeout(k(a.m,a),0)};C.prototype.m=function(){if(0==this.b&&this.c.length){var a=this.c.shift();this.b=2;a.i.setTimeout(k(this.g,this,a),0);D(this)}};C.prototype.g=function(a){this.b=0;a.l()}; +var xa=function(a){try{return a.sz()}catch(b){return i}},ya=function(a){return!!a&&("object"==typeof a||"function"==typeof a)&&xa(a)&&y(a.nq)&&y(a.nqa)&&y(a.al)&&y(a.rl)},E=function(){if(B&&xa(B))return B;var a=va(),b=a.google_jobrunner;return ya(b)?B=b:a.google_jobrunner=B=new C(a)},za=function(a,b){E().nq(a,b)},Aa=function(a,b){E().nqa(a,b)};var Ba=/MSIE [2-7]|PlayStation|Gecko\/20090226/i,Ca=/Android|Opera/,Da=function(){var a=F,b=G.google_ad_width,c=G.google_ad_height,d=["");b="border:none;height:"+c+"px;margin:0;padding:0;position:relative;visibility:visible;width:"+b+"px";return['',d.join(" "),""].join("")};var Ea=function(){},J=function(a,b,c){switch(typeof b){case "string":Fa(b,c);break;case "number":c.push(isFinite(b)&&!isNaN(b)?b:"null");break;case "boolean":c.push(b);break;case "undefined":c.push("null");break;case "object":if(b==h){c.push("null");break}if(b instanceof Array){var d=b.length;c.push("[");for(var e="",f=0;fb?e+="000":256>b?e+="00":4096>b&&(e+="0");return K[a]=e+b.toString(16)}));b.push('"')};var L="google_ad_block,google_ad_channel,google_ad_client,google_ad_format,google_ad_height,google_ad_host,google_ad_host_channel,google_ad_host_tier_id,google_ad_output,google_ad_override,google_ad_region,google_ad_section,google_ad_slot,google_ad_type,google_ad_width,google_adtest,google_allow_expandable_ads,google_alternate_ad_url,google_alternate_color,google_analytics_domain_name,google_analytics_uacct,google_bid,google_city,google_color_bg,google_color_border,google_color_line,google_color_link,google_color_text,google_color_url,google_container_id,google_contents,google_country,google_cpm,google_ctr_threshold,google_cust_age,google_cust_ch,google_cust_gender,google_cust_id,google_cust_interests,google_cust_job,google_cust_l,google_cust_lh,google_cust_u_url,google_disable_video_autoplay,google_ed,google_eids,google_enable_ose,google_encoding,google_font_face,google_font_size,google_frame_id,google_gl,google_hints,google_image_size,google_kw,google_kw_type,google_language,google_max_num_ads,google_max_radlink_len,google_num_radlinks,google_num_radlinks_per_unit,google_num_slots_to_rotate,google_only_ads_with_video,google_only_pyv_ads,google_only_userchoice_ads,google_override_format,google_page_url,google_previous_watch,google_previous_searches,google_referrer_url,google_region,google_reuse_colors,google_rl_dest_url,google_rl_filtering,google_rl_mode,google_rt,google_safe,google_scs,google_skip,google_tag_info,google_targeting,google_tdsma,google_tfs,google_tl,google_ui_features,google_ui_version,google_video_doc_id,google_video_product_type,google_with_pyv_ads".split(",");var M=function(a){this.a=a;a.google_iframe_oncopy||(a.google_iframe_oncopy={handlers:{},log:[],shouldLog:0.01>Math.random()?g:i});this.e=a.google_iframe_oncopy;a.setTimeout(k(this.k,this),3E4)},Ha;var N="var i=this.id,s=window.google_iframe_oncopy,H=s&&s.handlers,h=H&&H[i],w=this.contentWindow,d;try{d=w.document}catch(e){}if(h&&d&&(!d.body||!d.body.firstChild)){if(h.call){i+='.call';setTimeout(h,0)}else if(h.match){i+='.nav';w.location.replace(h)}s.log&&s.log.push(i)}"; +/[&<>\"]/.test(N)&&(-1!=N.indexOf("&")&&(N=N.replace(ea,"&")),-1!=N.indexOf("<")&&(N=N.replace(fa,"<")),-1!=N.indexOf(">")&&(N=N.replace(ga,">")),-1!=N.indexOf('"')&&(N=N.replace(ha,""")));Ha=N;M.prototype.set=function(a,b){this.e.handlers[a]=b;this.a.addEventListener&&this.a.addEventListener("load",k(this.j,this,a),i)};M.prototype.j=function(a){var a=this.a.document.getElementById(a),b=a.contentWindow.document;if(a.onload&&b&&(!b.body||!b.body.firstChild))a.onload()}; +M.prototype.k=function(){if(this.e.shouldLog){var a=this.e.log,b=this.a.document;if(a.length){b=["/pagead/gen_204?id=iframecopy&log=",z(a.join("-")),"&url=",z(b.URL.substring(0,512)),"&ref=",z(b.referrer.substring(0,512))].join("");a.length=0;ta(this.a,v(pa(),b))}}};var Ia=function(){var a="script";return["<",a,' src="',v(t(""),"/pagead/js/r20120328/r20110914/show_ads_impl.js",""),'">"].join("")},Ja=function(a,b,c,d){return function(){var e=i;d&&E().al(3E4);try{var f;try{f=!!a.document.getElementById(b).contentWindow.document}catch(bb){f=i}if(f){var u=a.document.getElementById(b).contentWindow, +o=u.document;if(!o.body||!o.body.firstChild)o.open(),u.google_async_iframe_close=g,o.write(c)}else{var H=a.document.getElementById(b).contentWindow,S;f=c;f=""+f;if(f.quote)S=f.quote();else{u=['"'];for(o=0;oqa)x=I;else{var p=I;if(p in n)x=n[p];else if(p in l)x=n[p]=l[p];else{var m=p,s=p.charCodeAt(0);if(31s)m=p;else{if(256>s){if(m="\\x",16>s||256s&&(m+="0");m+=s.toString(16).toUpperCase()}x= +n[p]=m}}T=x}Ua[Va]=T}u.push('"');S=u.join("")}H.location.replace("javascript:"+S)}e=g}catch(cb){H=va().google_jobrunner,ya(H)&&H.rl()}e&&(new M(a)).set(b,Ja(a,b,c,i))}};window.google_loader_used=g;(function(a){"google_onload_fired"in a||(a.google_onload_fired=i,sa(a,function(){a.google_onload_fired=g}))})(window);if(!window.google_loader_experiment){var O;a:{var Ka=["async_bad_black","block_bad_black"];if(!(1.0E-4>Math.random())){var La=Math.random();if(La<",_script$$inline_81,">",Ra,"google_show_ads_impl=true;google_unique_id=",W.google_unique_id,';google_async_iframe_id="',X,'";google_start_time=',j,";",db?'google_loader_experiment="'+db+'";':"","google_bpp=",ab>j?ab-j:1,";",Ia(),""].join("");(W.document.getElementById(X)?za:Aa)(Ja(W,X,eb,g))}else window.q=j,document.write(Ia());})(); diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/top100.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/top100.gif" new file mode 100644 index 0000000..75b945d Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/lecture33_files/top100.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/razdel2_5122.doc" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/razdel2_5122.doc" new file mode 100644 index 0000000..2bc7b21 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/razdel2_5122.doc" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\230\321\201\321\201\320\273\320\265\320\264\320\276\320\262\320\260\320\275\320\270\320\265 \320\274\320\260\320\263\320\275\320\270\321\202\320\275\321\213\321\205 \321\201\320\262\320\276\320\271\321\201\321\202\320\262 \321\215\320\273\320\265\320\272\321\202\321\200\320\276\321\202\320\265\321\205\320\275\320\270\321\207\320\265\321\201\320\272\320\270\321\205 \321\201\321\202\320\260\320\273\320\265\320\271.doc" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\230\321\201\321\201\320\273\320\265\320\264\320\276\320\262\320\260\320\275\320\270\320\265 \320\274\320\260\320\263\320\275\320\270\321\202\320\275\321\213\321\205 \321\201\320\262\320\276\320\271\321\201\321\202\320\262 \321\215\320\273\320\265\320\272\321\202\321\200\320\276\321\202\320\265\321\205\320\275\320\270\321\207\320\265\321\201\320\272\320\270\321\205 \321\201\321\202\320\260\320\273\320\265\320\271.doc" new file mode 100644 index 0000000..34a96fa Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\230\321\201\321\201\320\273\320\265\320\264\320\276\320\262\320\260\320\275\320\270\320\265 \320\274\320\260\320\263\320\275\320\270\321\202\320\275\321\213\321\205 \321\201\320\262\320\276\320\271\321\201\321\202\320\262 \321\215\320\273\320\265\320\272\321\202\321\200\320\276\321\202\320\265\321\205\320\275\320\270\321\207\320\265\321\201\320\272\320\270\321\205 \321\201\321\202\320\260\320\273\320\265\320\271.doc" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217.jpg" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217.jpg" new file mode 100644 index 0000000..f097162 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217.jpg" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206.htm" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206.htm" new file mode 100644 index 0000000..b25e5a7 --- /dev/null +++ "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206.htm" @@ -0,0 +1,793 @@ + + + + +Переходные процессы при включении силового трансформатора в сеть с синусоидальным напряжением + + + + + + + + +
+
+ +
+ + +
+ + + + + + + + +
+
+ +
+ +
+ + +
+ +
+ + + + + + + + + + + +
+
+ +
+
  +

+ +
+ +
+ +
+

Силовая электроника №4'2005

+ + +

Переходные процессы при включении силового трансформатора в сеть с синусоидальным напряжением

+

Сергей Котенев
+Андрей Евсеев


+

+В статье исследуются переходные процессы в силовом трансформаторе при +включении его в сеть с синусоидальным напряжением и даются рекомендации +для разработчиков. +

+
+

+Хорошо известно, что при включении силового трансформатора в сеть (даже +ненагруженного) возникает всплеск тока, который может превышать +номинальный ток во много раз. Максимальный всплеск тока (будем называть +далее «пусковой ток») необходимо учитывать при проектировании силовых +трансформаторов, так как он оказывает силовое воздействие на обмотки +трансформатора, а также приводит к ложному срабатыванию устройств +защиты. +

+

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

+

+Для первичной обмотки однофазного силового трансформатора можно записать [1]: +

+

+(1) +

+

+где u(t) — мгновенное значение напряжения первичной обмотки; i(t) — мгновенное значение намагничивающего тока трансформатора; Ψ(t) мгновенное значение потокосцепления; r— активное сопротивление обмотки; Lp— индуктивность рассеяния обмотки. +

+

+Учитывая, что у тороидальных трансформаторов индуктивность рассеяния обмотки достаточно мала, можно принять Lp = 0. + Кроме этого, будем предполагать, что потокосцепление Ψ(t) в уравнении +(1) зависит от тока. Эта зависимость задается кривой намагничивания и +имеет нелинейный характер. На основании определения потокосцепления +запишем: +

+

+(2) +

+

+где W— количество витков первичной обмотки силового трансформатора; S — + сечение магнитопровода трансформатора; μ(i) — дифференциальная +магнитная проницаемость. Для тороидального трансформатора по закону +полного тока имеем: +

+

+(3) +

+

+где l — длина средней магнитной линии. Если подставить (3) в (2) и в (1), то получим +

+

+(4) +

+

+(5) +

+

+где μ(i) — дифференциальная магнитная проницаемость. Дифференциальное +уравнение (4) является основным при анализе переходных процессов в +силовом трансформаторе. Как видно из этого уравнения, намагничивающий +ток трансформатора имеет нелинейный характер. Анализ решения уравнения +(4) невозможен без конкретной зависимости B = f(H), + которую необходимо получить экспериментально. В соответствии с ГОСТ +21427.1-83 была измерена индукция электротехнической стали 3413 в +переменном магнитном поле и получена зависимость B = f(H). Результаты приведены в таблице 1, а график показан на рис. 1. +

+
+Рис. 1. Кривая намагничивания для стали 3413 +
+
+Рис. 1. Кривая намагничивания для стали 3413 +
+
+Таблица 1. Результаты анализа +
+
+Таблица 1. Результаты анализа +
+

+На этом же рисунке показана кусочно-линейная аппроксимация кривой +намагничивания двумя отрезками прямых, причем отрезки прямых выбираются +так, чтобы они как можно ближе подходили к экспериментальным точкам. +Тогда B = f(H) можно записать в виде функции +

+

+(6) +

+

+где h — напряженность магнитного поля в точке перегиба кривой намагничивания; b — индукция в точке перегиба на кривой намагничивания; k — коэффициент, характеризующий степень наклона участка насыщения к оси Н. Из (6) легко получить выражение для дифференциальной магнитной проницаемости: +

+

+(7) +

+

+С учетом (7) дифференциальное уравнение (4) может быть представлено в виде двух: уравнения для тока i1(t), соответствующего рабочему участку кривой намагничивания, и уравнения для тока i2( t ), соответствующего участку насыщения:. +

+

+(8) +

+

+где +

+

+Дифференциальные уравнения (8) решаются при начальных условиях +

+

+i1(0) = 0, i1(t0) = i2(t0), (9) +

+

+где t0 — момент времени, когда величина тока изменяется с i1(t) на i2(t). +

+

+Пусть на первичную обмотку силового трансформатора подано синусоидальное напряжение u(t) = umsin(ωt + φ), где um— амплитудное значение напряжения; ω— частота сети; φ — начальная фаза. +

+

+Так как в соответствии с законом электромагнитной индукции магнитный поток в сердечнике трансформатора отстает от напряжения u(t) на π/2, то максимальный всплеск тока возникает при φ=0, и потому интерес представляет именно этот случай. +

+

+Решая дифференциальные уравнения (8) при φ=0, получим: +

+

+ +

+

+Момент времени t0 определяется как корень трансцендентного уравнения +

+

+i1(t0) = i0 (12) +

+

+при i0 = hl/W. Выражения + для токов (10) и (11) позволяют полностью рассчитать переходные токи в +обмотке силового трансформатора при включении его в сеть с +синусоидальным напряжением. +

+

+Для расчета был выбран трансформатор, намотанный на тороидальном +магнитопроводе с размерами ОЛ100/180-60 мм. Этот силовой трансформатор +имеет первичную обмотку W = 275 витков, площадь керна S = 0,0024 м2, омическое сопротивление обмотки r = 0,4 Ом и длину средней магнитной линии l = 0,44 м. Из графика, изображенного на рис. 1, можно определить параметры h = 45,3 А/м и b = 1,8 Тл. +

+

+Для расчета тока было выбрано два метода. Это расчет по формулам (10), +(11) и непосредственное решение дифференциального уравнения (4). Расчет +тока по уравнению (4) имеет преимущество, так как здесь при построении +решения используются все экспериментальные точки, и поэтому этот подход +является более точным. Включение всех точек в расчет достигается за счет + сплайн-аппроксимации экспериментальных данных. Однако этот метод имеет и + недостаток, который заключается в том, что нельзя получить +аналитическое выражение, а значит, и нельзя проанализировать полученный +результат. Расчет же по формулам (10) и (11) позволяет провести анализ +результата, но менее точный, так как эти формулы основаны на грубой +аппроксимации кривой намагничивания. +

+

+Возвращаясь к решению (10) и (11), заметим, что несмотря на простоту +формул, проводить по ним вычисление затруднительно. В связи с этим +получим грубую оценку максимальных значений токов i 1 и i2. Максимальное значение i 1 на рабочем участке достигается при таком t, которое является корнем уравнения +

+

+(13) +

+

+Приблизительно вычислить первый корень уравнения (13) можно следующим +образом. Из таблицы 1 определяем дифференциальную магнитную +проницаемость на рабочем участке кривой намагничивания +

+

+ +

+

+Замерить индукцию на участке насыщения очень трудно, так как пусковые +токи для мощных силовых трансформаторов составляют сотни ампер, и +поэтому необходимо замерять индукцию именно при этих значениях токов. +Поступим следующим образом. Экстраполируем участок, соответствующий +большим значениям магнитного поля, прямой линией так, чтобы она явилась +продолжением начального участка кривой намагничивания. Такую прямую +линию можно построить, если выбрать μ2=0,0000164. +Допустимость такой аппроксимации должны показать конкретные замеры +пусковых токов и сравнения их с теоретическими вычислениями. +

+

+В большинстве практических случаев выполняется условие ωL1 >>r, что дает: +

+

+(14) +

+

+но cosΨ1=r/x1 <<1, тогда Ψ1≈π/2 +

+

+Из (13) следует, что cos(ω t-Ψ1)≈0, и тогда имеем ω t-Ψ1=π/2, откуда следует +

+

+t = π/ω. (15) +

+

+С учетом (15) из формулы (10) получим максимальное значение тока i 1: +

+

+(16) +

+

+Второе слагаемое в (10) определяет установившееся значение тока. Его амплитудное значение будет равно: +

+

+(17) +

+

+Таким образом, на рабочем участке кривой намагничивания максимальное и +установившееся значения токов отличаются в два раза. Дадим численную +оценку установившегося значения тока: +

+

+(18) +

+

+В соответствии с (16) i 1max = 2i 1 = 2x0,060 + = = 0,120 А. Для качественной оценки этой величины следует определить +допустимое значение тока намагничивания. Допустимый ток (i0) вычисляется как ток, соответствующий точке перегиба на кривой намагничивания: +

+

+(19) +

+

+И если i 1max > i0, то переходный процесс в трансформаторе будет протекать с большими токами. +

+

+Для вычисления пикового значения переходного тока необходимо найти +магнитную индукцию для рабочего участка кривой намагничивания. +Воспользуемся дифференциальным уравнением (1), переписав его в виде +

+

+(20) +

+

+Подставим в (20) выражение для тока из (10) и проинтегрируем. Тогда получим +

+

+(21) +

+

+Принимая во внимание условие ωL1>>r и рассуждения, сделанные при выводе соотношения (16), получим: +

+

+(22) +

+

+Учитывая, что участок насыщения на кривой намагничивания достаточно +линейный, на основании определения дифференциальной магнитной +проницаемости можно записать: +

+

+(23) +

+

+Выберем приращение для индукции и напряженности магнитного поля в виде +

+

+ +

+

+Подставим значения из (24) и (25) в (23), получим: +

+

+(26) +

+

+На участке насыщения кривой намагничивания для напряженности магнитного поля имеем H = Wi2/l, а на рабочем участке — b = hμ1. Подставим последние выражения в (26). В результате элементарных преобразований будем иметь: +

+

+(27) +

+

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

+

+Следует заметить, что формула (27) записана для участка насыщения, на котором выполняется неравенство В>b, и + если оно нарушается, то можно получить отрицательные значения тока. +Физически это будет означать, что пусковой ток силового трансформатора +не превышает допустимый ток и поэтому весь переходный процесс +укладывается на рабочем участке кривой намагничивания. Другими словами, i2 = 0. +

+

+Для выбранного нами трансформатора рассчитаем пик пускового тока i2 по формуле (27): +

+

+ +

+

+Таким образом, при включении силового трансформатора в сеть может +возникнуть всплеск тока более 100 ампер. Точный расчет токов по формулам + (10) и (11) дает i 2 = 100 A, что на 17% ниже. Это расхождение с точным расчетом будет тем меньше, чем сильней выполняется неравенство ωL2>>r, но для грубой оценки этого вполне достаточно. +

+

+Сравнение расчетов токов по формулам (10), (11) и расчета этих же токов, + но через дифференциальное уравнение (4) с использованием численных +методов и сплайн-аппроксимации кривой намагничивания, показало, что оба +метода расчета дают очень близкий результат. В области больших токов +результаты вычисления обеими методами практически совпадают. В области +малых токов есть расхождения, которые связаны с неточным +воспроизведением формы намагничивающего тока. Это расхождение +определяется отклонением начального участка кривой намагничивания от +прямой линии. Таким образом, можно с успехом использовать оба метода +расчета. +

+

+Ниже произведены расчеты переходных процессов в трансформаторах с +различным числом витков. Расчеты произведены через решение +дифференциального уравнения (4) с использованием численного метода +Рунге-Кутта 4-5-го порядка. +

+

+Из графика на рис. 2 видно, что трансформатор с первичной обмоткой в 275 + витков имеет пусковой ток около 100 А. На этом же рисунке можно +проследить, как влияет изменение количества витков первичной обмотки на +пусковой ток. +

+
+Рис. 2. Пусковой ток трансформатора для различного числа витков первичной обмотки +
+
+Рис. 2. Пусковой ток силового трансформатора для различного числа витков первичной обмотки +
+

+Кривая тока переходного процесса представлена на рис. 3. + Из данного графика видно, что максимальный ток достигает 100 А. Этот же + график позволяет оценить и постоянную времени переходного процесса. +

+

+На рис. 4 представлен график установившегося тока. Установившийся ток +рассчитан для случая, когда начальная фаза сети равна π/2. В этом случае + включение силового трансформатора проходит без переходных процессов, +что видно из рис. 4. На этом же рисунке просматривается нелинейный +характер тока намагничивания. +

+
+Рис. 4. Ток установившегося режима, φ=π/2 +
+
+Рис. 4. Ток установившегося режима, φ=π/2 +
+

+Для подтверждения теоретических вычислений проводились испытания с +несколькими силовыми трансформаторами. Включение трансформаторов +проводилось на напряжение 220 В при нулевой фазе. Результаты испытаний +приводятся в таблице 2. +

+

Основные выводы

+
    +
  1. Увеличение числа витков и сечения керна магнитопровода приводит к +снижению пускового тока трансформатора. Увеличение числа витков вдвое +уменьшает пусковой ток до величины, не превышающий номинальное значение +тока холостого хода. Однако указанные меры приводят к увеличению потерь в + проводах обмоток и стали сердечника, а также к увеличению +массогабаритных показателей силового трансформатора и его стоимости.
  2. +
  3. Наиболее эффективным способом уменьшения пускового тока является +обеспечение подключения силового трансформатора к питающей сети в момент + достижения максимального мгновенного значения напряжения, то есть при +φ=π/2
  4. +
+

Литература

+
    +
  1. Касаткин А. С, Немцов М. В. Электротехника. М.: Высшая школа, 2000.
  2. +
+

Другие статьи по этой теме

+ +
+
  +
+ +
+ +
+ + + + +
+ +
ПОДПИСКА НА НОВОСТИ

+ +
+
+
+ +
+ +
+ + + +
+ + + + + + + +
Оцените, пожалуйста, удобство и практичность (usability) сайта:
+
+ + + + +
+ + + + + + + + + + + + + +
Хорошо
Нормально
Плохо
+ + + +
+
+
+
+
+
+
+
+ +
+ +
+ + +
+
+
+ + + + + +
\ No newline at end of file diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f01.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f01.gif" new file mode 100644 index 0000000..ce05c92 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f01.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f02.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f02.gif" new file mode 100644 index 0000000..fcb458c Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f02.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f03.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f03.gif" new file mode 100644 index 0000000..396ed6b Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f03.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f04.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f04.gif" new file mode 100644 index 0000000..60e45cd Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f04.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f05.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f05.gif" new file mode 100644 index 0000000..e7e1244 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f05.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f06.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f06.gif" new file mode 100644 index 0000000..bef9f64 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f06.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f07.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f07.gif" new file mode 100644 index 0000000..dd3fbd1 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f07.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f08.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f08.gif" new file mode 100644 index 0000000..1c9e35a Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f08.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f09.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f09.gif" new file mode 100644 index 0000000..721b861 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f09.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f10.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f10.gif" new file mode 100644 index 0000000..3788e8f Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f10.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f11.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f11.gif" new file mode 100644 index 0000000..b486f66 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f11.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f12.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f12.gif" new file mode 100644 index 0000000..a3d1a87 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f12.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f13.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f13.gif" new file mode 100644 index 0000000..218731c Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f13.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f14.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f14.gif" new file mode 100644 index 0000000..6c249f4 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f14.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f15.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f15.gif" new file mode 100644 index 0000000..c413833 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f15.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f16.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f16.gif" new file mode 100644 index 0000000..05539fa Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f16.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f17.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f17.gif" new file mode 100644 index 0000000..0e50214 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f17.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f18.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f18.gif" new file mode 100644 index 0000000..6c0f986 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f18.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f19.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f19.gif" new file mode 100644 index 0000000..f5f5e5f Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f19.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f20.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f20.gif" new file mode 100644 index 0000000..702da77 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f20.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f21.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f21.gif" new file mode 100644 index 0000000..3a28687 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f21.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f22.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f22.gif" new file mode 100644 index 0000000..e504586 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f22.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f23.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f23.gif" new file mode 100644 index 0000000..7b23da8 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f23.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f24.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f24.gif" new file mode 100644 index 0000000..c956e33 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_f24.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_ris01.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_ris01.gif" new file mode 100644 index 0000000..4b65c97 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_ris01.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_ris02.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_ris02.gif" new file mode 100644 index 0000000..ace8a38 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_ris02.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_ris04.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_ris04.gif" new file mode 100644 index 0000000..c531220 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_ris04.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_tab01.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_tab01.gif" new file mode 100644 index 0000000..5b59bff Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/2005_04_34_tab01.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/banner_show.htm" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/banner_show.htm" new file mode 100644 index 0000000..2aac2a9 --- /dev/null +++ "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/banner_show.htm" @@ -0,0 +1,3 @@ +Blocked

Blocked

+Access to the requested URL http://banner.kit-e.ru/banner_show.php?rotator=15 was not allowed (rule #4). + diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/banner_show_002.htm" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/banner_show_002.htm" new file mode 100644 index 0000000..0577416 --- /dev/null +++ "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/banner_show_002.htm" @@ -0,0 +1,3 @@ +Blocked

Blocked

+Access to the requested URL http://banner.kit-e.ru/banner_show.php?rotator=9 was not allowed (rule #4). + diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/banner_show_003.htm" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/banner_show_003.htm" new file mode 100644 index 0000000..950e060 --- /dev/null +++ "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/banner_show_003.htm" @@ -0,0 +1,3 @@ +Blocked

Blocked

+Access to the requested URL http://banner.kit-e.ru/banner_show.php?rotator=14 was not allowed (rule #4). + diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/banner_show_004.htm" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/banner_show_004.htm" new file mode 100644 index 0000000..f378087 --- /dev/null +++ "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/banner_show_004.htm" @@ -0,0 +1,3 @@ +Blocked

Blocked

+Access to the requested URL http://banner.kit-e.ru/banner_show.php?rotator=21 was not allowed (rule #4). + diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/bul_2.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/bul_2.gif" new file mode 100644 index 0000000..8515db0 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/bul_2.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/context.htm" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/context.htm" new file mode 100644 index 0000000..a7916ba --- /dev/null +++ "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/context.htm" @@ -0,0 +1,3 @@ +Blocked

Blocked

+Access to the requested URL http://an.yandex.ru/system/context.js was not allowed (rule #28). + diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/divider.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/divider.gif" new file mode 100644 index 0000000..a459158 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/divider.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/flag_eng.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/flag_eng.gif" new file mode 100644 index 0000000..571f920 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/flag_eng.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/ga.js" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/ga.js" new file mode 100644 index 0000000..7ad3433 --- /dev/null +++ "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/ga.js" @@ -0,0 +1,56 @@ +(function(){var g=void 0,h=!0,i=null,j=!1,ba=encodeURIComponent,ca=Infinity,da=setTimeout,ea=decodeURIComponent,l=Math;function fa(a,b){return a.onload=b}function ga(a,b){return a.name=b}var m="push",ha="slice",n="replace",ia="load",ja="floor",ka="charAt",la="value",p="indexOf",ma="match",q="name",na="host",t="toString",u="length",v="prototype",oa="clientWidth",w="split",qa="stopPropagation",ra="scope",x="location",sa="clientHeight",ta="href",y="substring",ua="navigator",z="join",A="toLowerCase",B;function va(a,b){switch(b){case 0:return""+a;case 1:return 1*a;case 2:return!!a;case 3:return 1E3*a}return a}function wa(a){return a!=g&&-1<(a.constructor+"")[p]("String")}function C(a,b){return g==a||"-"==a&&!b||""==a}function xa(a){if(!a||""==a)return"";for(;a&&-1<" \n\r\t"[p](a[ka](0));)a=a[y](1);for(;a&&-1<" \n\r\t"[p](a[ka](a[u]-1));)a=a[y](0,a[u]-1);return a} +function ya(a){var b=1,c=0,d;if(!C(a)){b=0;for(d=a[u]-1;0<=d;d--)c=a.charCodeAt(d),b=(b<<6&268435455)+c+(c<<14),c=b&266338304,b=0!=c?b^c>>21:b}return b}function za(){return l.round(2147483647*l.random())}function Aa(){}function D(a,b){if(ba instanceof Function)return b?encodeURI(a):ba(a);E(68);return escape(a)}function F(a){a=a[w]("+")[z](" ");if(ea instanceof Function)try{return ea(a)}catch(b){E(17)}else E(68);return unescape(a)} +var Ba=function(a,b,c,d){a.addEventListener?a.addEventListener(b,c,!!d):a.attachEvent&&a.attachEvent("on"+b,c)},Ca=function(a,b,c,d){a.removeEventListener?a.removeEventListener(b,c,!!d):a.detachEvent&&a.detachEvent("on"+b,c)};function G(a){return a&&0f?c(d[e],"1"):c(d[e][y](0,f),d[e][y](f+1))}}function Ia(a,b){var c;C(a)||"["==a[ka](0)&&"]"==a[ka](a[u]-1)?c="-":(c=H.domain,c=a[p](c+(b&&"/"!=b?b:""))==(0==a[p]("http://")?7:0==a[p]("https://")?8:0)?"0":a);return c};var Ja=0;function Ka(a,b,c){!(1<=Ja)&&!(1<=100*l.random())&&(a=["utmt=error","utmerr="+a,"utmwv=5.2.6","utmn="+za(),"utmsp=1"],b&&a[m]("api="+b),c&&a[m]("msg="+D(c[y](0,100))),I.s&&a[m]("aip=1"),La(a[z]("&")),Ja++)};var Ma=0,Na={};function K(a){return Oa("x"+Ma++,a)}function Oa(a,b){Na[a]=!!b;return a} +var Pa=K(),Qa=K(),Ra=K(),Sa=K(),Ta=K(),L=K(),M=K(),Ua=K(),Va=K(),Wa=K(),Xa=K(),Ya=K(),Za=K(),$a=K(),ab=K(),bb=K(),cb=K(),db=K(),eb=K(),fb=K(),gb=K(),hb=K(),ib=K(),jb=K(),kb=K(),lb=K(),mb=K(),nb=K(),ob=K(),pb=K(),qb=K(),rb=K(),sb=K(),tb=K(),ub=K(),O=K(h),vb=Oa("page"),wb=Oa("title"),xb=K(),yb=K(),zb=K(),Ab=K(),Bb=K(),Cb=K(),Db=K(),Eb=K(),Fb=K(),P=K(h),Gb=K(h),Hb=K(h),Ib=K(h),Kb=K(h),Lb=K(h),Mb=K(h),Nb=K(h),Ob=K(h),Pb=K(h),Qb=K(h),Q=K(h),Rb=K(h),Sb=K(h),Tb=K(h),Ub=K(h),Vb=K(h),Wb=K(h),Xb=K(h),Yb=K(h), +Zb=K(h),$b=K(h),ac=K(h),bc=K(h),cc=K(h),dc=Oa("campaignParams"),ec=K(),fc=Oa("hitCallback"),gc=K();K();var hc=K(),ic=K(),jc=K(),kc=K(),lc=K(),mc=K(),nc=K(),oc=K(),pc=K(),qc=K(),uc=K(),vc=K();K();var wc=K(),xc=K(),yc=K();var zc=function(){function a(a,c,d){R(S[v],a,c,d)}T("_getName",Ra,58);T("_getAccount",Pa,64);T("_visitCode",P,54);T("_getClientInfo",$a,53,1);T("_getDetectTitle",cb,56,1);T("_getDetectFlash",ab,65,1);T("_getLocalGifPath",mb,57);T("_getServiceMode",nb,59);U("_setClientInfo",$a,66,2);U("_setAccount",Pa,3);U("_setNamespace",Qa,48);U("_setAllowLinker",Xa,11,2);U("_setDetectFlash",ab,61,2);U("_setDetectTitle",cb,62,2);U("_setLocalGifPath",mb,46,0);U("_setLocalServerMode",nb,92,g,0);U("_setRemoteServerMode", +nb,63,g,1);U("_setLocalRemoteServerMode",nb,47,g,2);U("_setSampleRate",lb,45,1);U("_setCampaignTrack",bb,36,2);U("_setAllowAnchor",Ya,7,2);U("_setCampNameKey",eb,41);U("_setCampContentKey",jb,38);U("_setCampIdKey",db,39);U("_setCampMediumKey",hb,40);U("_setCampNOKey",kb,42);U("_setCampSourceKey",gb,43);U("_setCampTermKey",ib,44);U("_setCampCIdKey",fb,37);U("_setCookiePath",M,9,0);U("_setMaxCustomVariables",ob,0,1);U("_setVisitorCookieTimeout",Ua,28,1);U("_setSessionCookieTimeout",Va,26,1);U("_setCampaignCookieTimeout", +Wa,29,1);U("_setReferrerOverride",xb,49);U("_setSiteSpeedSampleRate",pc,132);a("_trackPageview",S[v].qa,1);a("_trackEvent",S[v].w,4);a("_trackPageLoadTime",S[v].pa,100);a("_trackSocial",S[v].ra,104);a("_trackTrans",S[v].ta,18);a("_sendXEvent",S[v].n,78);a("_createEventTracker",S[v].X,74);a("_getVersion",S[v].ba,60);a("_setDomainName",S[v].v,6);a("_setAllowHash",S[v].ga,8);a("_getLinkerUrl",S[v].aa,52);a("_link",S[v].link,101);a("_linkByPost",S[v].fa,102);a("_setTrans",S[v].ka,20);a("_addTrans",S[v].Q, +21);a("_addItem",S[v].O,19);a("_setTransactionDelim",S[v].la,82);a("_setCustomVar",S[v].ha,10);a("_deleteCustomVar",S[v].Z,35);a("_getVisitorCustomVar",S[v].ca,50);a("_setXKey",S[v].na,83);a("_setXValue",S[v].oa,84);a("_getXKey",S[v].da,76);a("_getXValue",S[v].ea,77);a("_clearXKey",S[v].U,72);a("_clearXValue",S[v].V,73);a("_createXObj",S[v].Y,75);a("_addIgnoredOrganic",S[v].M,15);a("_clearIgnoredOrganic",S[v].R,97);a("_addIgnoredRef",S[v].N,31);a("_clearIgnoredRef",S[v].S,32);a("_addOrganic",S[v].P, +14);a("_clearOrganic",S[v].T,70);a("_cookiePathCopy",S[v].W,30);a("_get",S[v].$,106);a("_set",S[v].ia,107);a("_addEventListener",S[v].addEventListener,108);a("_removeEventListener",S[v].removeEventListener,109);a("_addDevId",S[v].L);a("_setPageGroup",S[v].ja,126);a("_trackTiming",S[v].sa,124);a("_initData",S[v].o,2);a("_setVar",S[v].ma,22);U("_setSessionTimeout",Va,27,3);U("_setCookieTimeout",Wa,25,3);U("_setCookiePersistence",Ua,24,1);a("_setAutoTrackOutbound",Aa,79);a("_setTrackOutboundSubdomains", +Aa,81);a("_setHrefExamineLimit",Aa,80)},R=function(a,b,c,d){a[b]=function(){try{return d!=g&&E(d),c.apply(this,arguments)}catch(a){throw Ka("exc",b,a&&a[q]),a;}}},T=function(a,b,c,d){S[v][a]=function(){try{return E(c),va(this.a.get(b),d)}catch(e){throw Ka("exc",a,e&&e[q]),e;}}},U=function(a,b,c,d,e){S[v][a]=function(f){try{E(c),e==g?this.a.set(b,va(f,d)):this.a.set(b,e)}catch(k){throw Ka("exc",a,k&&k[q]),k;}}},Ac=function(a,b){return{type:b,target:a,stopPropagation:function(){throw"aborted";}}};var Bc=function(a,b){return"/"!==b?j:(0==a[p]("www.google.")||0==a[p](".google.")||0==a[p]("google."))&&!(-1b[u]||Jc(b[0],c))return j;b=b[ha](1)[z](".")[w]("|"); +0=b[u])return h;b=b[1][w](-1==b[1][p](",")?"^":",");for(c=0;cb[u]||Jc(b[0],c))return a.set(Sb,g),a.set(Tb,g),a.set(Ub,g),a.set(Wb,g),a.set(Xb,g),a.set($b,g),a.set(ac,g),a.set(bc,g),a.set(cc,g),a.set(Yb,g),a.set(Zb,g),j;a.set(Sb,1*b[1]);a.set(Tb,1*b[2]);a.set(Ub,1*b[3]);Sc(a,b[ha](4)[z]("."));return h},Sc=function(a,b){function c(a){return(a=b[ma](a+"=(.*?)(?:\\|utm|$)"))&&2==a[u]?a[1]:g}function d(b,c){c&&(c=e?F(c):c[w]("%20")[z](" "), +a.set(b,c))}-1==b[p]("=")&&(b=F(b));var e="2"==c("utmcvr");d(Wb,c("utmcid"));d(Xb,c("utmccn"));d($b,c("utmcsr"));d(ac,c("utmcmd"));d(bc,c("utmctr"));d(cc,c("utmcct"));d(Yb,c("utmgclid"));d(Zb,c("utmdclid"))},Jc=function(a,b){return b?a!=b:!/^\d+$/.test(a)};var Dc=function(){this.u=[]};Dc[v].add=function(a,b){this.u[m]({name:a,Ha:b})};Dc[v].execute=function(a){try{for(var b=0;b=100*a.get(lb)&&a[qa]()}function Vc(a){Wc()&&a[qa]()}function Xc(a){"file:"==H[x].protocol&&a[qa]()}function Yc(a){a.get(wb)||a.set(wb,H.title,h);a.get(vb)||a.set(vb,H[x].pathname+H[x].search,h)};var Zc=new function(){var a=[];this.set=function(b){a[b]=h};this.Ia=function(){for(var b=[],c=0;cs;s++){for(var pa=0;3>pa;pa++){if(c==ya(f+o+r)){E(127);c=[o,r];break a}var J=o[n](/ /g,"%20"),N=r[n](/ /g,"%20");if(c==ya(f+J+N)){E(128); +c=[J,N];break a}J=J[n](/\+/g,"%20");N=N[n](/\+/g,"%20");if(c==ya(f+J+N)){E(129);c=[J,N];break a}o=F(o)}r=F(r)}c=g}if(!c)return j;o=c[0];r=c[1]}if(!Kc(a,d,h))return j;Nc(a,e,h);Tc(a,o,h);Pc(a,r,h);Fd(a,k,h);return h},Hd=function(a,b,c){var d;d=Lc(a)||"-";var e=Mc(a)||"-",f=""+a.b(L,1)||"-",k=Gd(a)||"-",o=Rc(a,j)||"-",a=Oc(a,j)||"-",r=ya(""+d+e+f+k+o+a),s=[];s[m]("__utma="+d);s[m]("__utmb="+e);s[m]("__utmc="+f);s[m]("__utmx="+k);s[m]("__utmz="+o);s[m]("__utmv="+a);s[m]("__utmk="+r);d=s[z]("&");if(!d)return b; +e=b[p]("#");if(c)return 0>e?b+"#"+d:b+"&"+d;c="";f=b[p]("?");0f?b+"?"+d+c:b+"&"+d+c};var Id="|",Kd=function(a,b,c,d,e,f,k,o,r){var s=Jd(a,b);s||(s={},a.get(sb)[m](s));s.id_=b;s.affiliation_=c;s.total_=d;s.tax_=e;s.shipping_=f;s.city_=k;s.state_=o;s.country_=r;s.items_=s.items_||[];return s},Ld=function(a,b,c,d,e,f,k){var a=Jd(a,b)||Kd(a,b,"",0,0,0,"","",""),o;a:{if(a&&a.items_){o=a.items_;for(var r=0;rb[u])&&/^\d+$/.test(b[0])&&(b[0]=""+c,od(a,"__utmx",b[z](".")))},Gd=function(a,b){var c=Ic(a.get(L),W("__utmx"));"-"==c&&(c="");return b?D(c):c},Od=function(a){try{var b=Ga(H[x][ta],j),c=ea(Da(b.d.get("utm_referrer")))||"";c&&a.set(xb,c);var d=ea(G(b.d.get("utm_expid")));d&&a.set(yc,d)}catch(e){E(146)}};var Td=function(a,b){var c=l.min(a.b(pc,0),100);if(a.b(P,0)%100>=c)return j;c=Pd()||Qd();if(c==g)return j;var d=c[0];if(d==g||d==ca||isNaN(d))return j;0a[b])return j;return h},Ud=function(a){return isNaN(a)|| +0>a?0:5E3>a?10*l[ja](a/10):5E4>a?100*l[ja](a/100):41E5>a?1E3*l[ja](a/1E3):41E5},Sd=function(a){for(var b=new id,c=0;c=f)return j;c=1*(""+c);if(""==a||!gd(a)||""==b||!gd(b)||!hd(c)||isNaN(c)||0>c||0>f||100=a||a>e.get(ob)||!b||!c||128=a&&wa(b)&&""!=b){var c=this.get(uc)||[];c[a]=b;this.set(uc,c)}};B.L=function(a){a=""+a;if(a[ma](/^[A-Za-z0-9]{1,5}$/)){var b=this.get(vc)||[];b[m](a);this.set(vc,b)}};B.o=function(){this.a[ia]()};B.ma=function(a){a&&""!=a&&(this.set(Hb,a),this.a.g("var"))};var Wd=function(a){"trans"!==a.get(ec)&&500<=a.b(Qb,0)&&a[qa]();if("event"===a.get(ec)){var b=(new Date).getTime(),c=a.b(Rb,0),d=a.b(Mb,0),c=l[ja](1*((b-(c!=d?c:1E3*c))/1E3));0=a.b(Q,0)&&a[qa]()}},Yd=function(a){"event"===a.get(ec)&&a.set(Q,l.max(0,a.b(Q,10)-1))};var Zd=function(){var a=[];this.add=function(b,c,d){d&&(c=D(""+c));a[m](b+"="+c)};this.toString=function(){return a[z]("&")}},$d=function(a,b){(b||2!=a.get(nb))&&a.p(Qb)},ae=function(a,b){b.add("utmwv","5.2.6");b.add("utms",a.get(Qb));b.add("utmn",za());var c=H[x].hostname;C(c)||b.add("utmhn",c,h);c=a.get(lb);100!=c&&b.add("utmsp",c,h)},ce=function(a,b){b.add("utmac",xa(a.get(Pa)));a.get(yc)&&b.add("utmxkey",a.get(yc),h);a.get(hc)&&b.add("utmni",1);var c=a.get(vc);c&&0=a[u])ne(a,b,c);else if(8192>=a[u]){if(0<=V[ua].userAgent[p]("Firefox")&&![].reduce)throw new me(a[u]);oe(a,b)||pe(a,b)}else throw new le(a[u]);},ne=function(a,b,c){var c=c||ke+"/__utm.gif?",d=new Image(1,1);d.src=c+a;fa(d,function(){fa(d,i);d.onerror= +i;b()});d.onerror=function(){fa(d,i);d.onerror=i;b()}},oe=function(a,b){var c,d=ke+"/p/__utm.gif",e=V.XDomainRequest;if(e)c=new e,c.open("POST",d);else if(e=V.XMLHttpRequest)e=new e,"withCredentials"in e&&(c=e,c.open("POST",d,h),c.setRequestHeader("Content-Type","text/plain"));if(c)return c.onreadystatechange=function(){4==c.readyState&&(b(),c=i)},c.send(a),h},pe=function(a,b){if(H.body){a=ba(a);try{var c=H.createElement('')}catch(d){c=H.createElement("iframe"),ga(c, +a)}c.height="0";c.width="0";c.style.display="none";c.style.visibility="hidden";var e=H[x],e=ke+"/u/post_iframe.html#"+ba(e.protocol+"//"+e[na]+"/favicon.ico"),f=function(){c.src="";c.parentNode&&c.parentNode.removeChild(c)};Ba(V,"beforeunload",f);var k=j,o=0,r=function(){if(!k){try{if(9 + + + + +#logo_adv, #buttons_adv, #events_adv, #news_adv { + text-align: center; + width:100%; +} + +#logo_adv .advert, #buttons_adv .advert, #events_adv .advert { + text-align:center; + margin:3px 0 0 -2px; +} + +#news_adv .advert { + text-align:center; + margin:3px 0 -6px -2px; +} diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/reklama.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/reklama.gif" new file mode 100644 index 0000000..75051c6 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/reklama.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/rubrikator.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/rubrikator.gif" new file mode 100644 index 0000000..9f3a436 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/rubrikator.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/sobytia.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/sobytia.gif" new file mode 100644 index 0000000..21d86c0 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/sobytia.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/spacer.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/spacer.gif" new file mode 100644 index 0000000..5bfd67a Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/spacer.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/symmetron110px.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/symmetron110px.gif" new file mode 100644 index 0000000..1450727 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/symmetron110px.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/tbl-bl.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/tbl-bl.gif" new file mode 100644 index 0000000..8af8920 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/tbl-bl.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/tbl-tl.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/tbl-tl.gif" new file mode 100644 index 0000000..e4dc9d1 Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/tbl-tl.gif" differ diff --git "a/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/tbl-tr.gif" "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/tbl-tr.gif" new file mode 100644 index 0000000..b30a54d Binary files /dev/null and "b/Docs/\320\234\320\260\320\263\320\275\320\270\321\202\320\275\320\260\321\217 \320\277\321\200\320\276\320\275\320\270\321\206\320\260\320\265\320\274\320\276\321\201\321\202\321\214/\320\237\321\200\320\276 \320\264\320\270\321\204\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\260\320\273\321\214\320\275\321\203\321\216 \320\274\320\260\320\263\320\275\320\270\321\202 \320\277\321\200\320\276\320\275\320\270\321\206_files/tbl-tr.gif" differ diff --git "a/Docs/\320\234\320\276\320\264\320\265\320\273\321\214 \320\272\321\200\320\270\320\262\320\276\320\271 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217.xmcd" "b/Docs/\320\234\320\276\320\264\320\265\320\273\321\214 \320\272\321\200\320\270\320\262\320\276\320\271 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217.xmcd" new file mode 100644 index 0000000..37c3c97 --- /dev/null +++ "b/Docs/\320\234\320\276\320\264\320\265\320\273\321\214 \320\272\321\200\320\270\320\262\320\276\320\271 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217.xmcd" @@ -0,0 +1,2544 @@ + + + + + + Mathcad Professional 14.0 + + + <description/> + <author>MFISoft</author> + <company>Parametric Technology Corporation</company> + <keywords/> + <revisedBy>MFISoft</revisedBy> + </userData> + <identityInfo> + <revision>12</revision> + <documentID>ED7077F3-242F-41B6-976A-FD8B57AB4DEA</documentID> + <versionID>8B93B89A-1C54-4260-8E86-1DDC6FBD0305</versionID> + <parentVersionID>00000000-0000-0000-0000-000000000000</parentVersionID> + <branchID>00000000-0000-0000-0000-000000000000</branchID> + </identityInfo> + </metadata> + <settings> + <presentation> + <textRendering> + <textStyles> + <textStyle name="Normal"> + <blockAttr margin-left="0" margin-right="0" text-indent="inherit" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Heading 1"> + <blockAttr margin-left="0" margin-right="0" text-indent="inherit" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="14" font-weight="bold" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Heading 2"> + <blockAttr margin-left="0" margin-right="0" text-indent="inherit" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="12" font-weight="bold" font-style="italic" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Heading 3"> + <blockAttr margin-left="0" margin-right="0" text-indent="inherit" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="12" font-weight="normal" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Paragraph"> + <blockAttr margin-left="0" margin-right="0" text-indent="21" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="List"> + <blockAttr margin-left="14.25" margin-right="0" text-indent="-14.25" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Indent"> + <blockAttr margin-left="108" margin-right="0" text-indent="inherit" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Title"> + <blockAttr margin-left="0" margin-right="0" text-indent="inherit" text-align="center" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Times New Roman" font-charset="0" font-size="24" font-weight="bold" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Subtitle" base-style="Title"> + <blockAttr margin-left="0" margin-right="0" text-indent="inherit" text-align="center" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Times New Roman" font-charset="0" font-size="18" font-weight="normal" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + </textStyles> + </textRendering> + <mathRendering equation-color="#000"> + <operators multiplication="narrow-dot" derivative="derivative" literal-subscript="large" definition="colon-equal" global-definition="triple-equal" local-definition="left-arrow" equality="bold-equal" symbolic-evaluation="right-arrow"/> + <mathStyles> + <mathStyle name="Variables" font-family="Times New Roman" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="Constants" font-family="Times New Roman" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="User 1" font-family="Arial" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="User 2" font-family="Courier New" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="User 3" font-family="Arial" font-charset="0" font-size="10" font-weight="bold" font-style="normal" underline="false"/> + <mathStyle name="User 4" font-family="Times New Roman" font-charset="0" font-size="10" font-weight="normal" font-style="italic" underline="false"/> + <mathStyle name="User 5" font-family="Times New Roman" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="User 6" font-family="Arial" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="User 7" font-family="Times New Roman" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="Math Text Font" font-family="Times New Roman" font-charset="0" font-size="14" font-weight="normal" font-style="normal" underline="false"/> + </mathStyles> + <dimensionNames mass="mass" length="length" time="time" current="current" thermodynamic-temperature="temperature" luminous-intensity="luminosity" amount-of-substance="substance" display="false"/> + <symbolics derivation-steps-style="vertical-insert" show-comments="false" evaluate-in-place="false"/> + <results numeric-only="true"> + <general precision="3" show-trailing-zeros="false" radix="dec" complex-threshold="10" zero-threshold="15" imaginary-value="i" exponential-threshold="3"/> + <matrix display-style="auto" expand-nested-arrays="false"/> + <unit format-units="true" simplify-units="true" fractional-unit-exponent="false"/> + </results> + </mathRendering> + <pageModel show-page-frame="false" show-header-frame="false" show-footer-frame="false" header-footer-start-page="1" paper-code="9" orientation="portrait" print-single-page-width="false" page-width="595.5" page-height="841.5"> + <margins left="86.4" right="86.4" top="86.4" bottom="86.4"/> + <header use-full-page-width="false"/> + <footer use-full-page-width="false"/> + </pageModel> + <colorModel background-color="#fff" default-highlight-color="#ffff80"/> + <language math="en" UI="en"/> + </presentation> + <calculation> + <builtInVariables array-origin="0" convergence-tolerance="0.001" constraint-tolerance="0.001" random-seed="1" prn-precision="4" prn-col-width="8"/> + <calculationBehavior automatic-recalculation="true" matrix-strict-singularity-check="true" optimize-expressions="false" exact-boolean="true" strings-use-origin="false" zero-over-zero="0"> + <compatibility multiple-assignment="MC12" local-assignment="MC12"/> + </calculationBehavior> + <units> + <currentUnitSystem name="si" customized="false"/> + </units> + </calculation> + <editor view-annotations="false" view-regions="false"> + <ruler is-visible="false" ruler-unit="cm"/> + <plotTemplate> + <xy item-idref="1"/> + </plotTemplate> + <grid granularity-x="6" granularity-y="6"/> + </editor> + <fileFormat image-type="image/png" image-quality="75" save-numeric-results="true" exclude-large-results="false" save-text-images="false" screen-dpi="96"/> + <miscellaneous> + <handbook handbook-region-tag-ub="50" can-delete-original-handbook-regions="true" can-delete-user-regions="true" can-print="true" can-copy="true" can-save="true" file-permission-mask="4294967295"/> + </miscellaneous> + </settings> + <regions> + <region region-id="2" left="24" top="69" width="106.5" height="12.75" align-x="50.25" align-y="78" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedBIUnit" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:function> + <ml:id xml:space="preserve">H</ml:id> + <ml:boundVars> + <ml:id xml:space="preserve">B</ml:id> + </ml:boundVars> + </ml:function> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:real>22</ml:real> + <ml:apply> + <ml:id xml:space="preserve">tan</ml:id> + <ml:id xml:space="preserve">B</ml:id> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:real>220</ml:real> + <ml:id xml:space="preserve">B</ml:id> + </ml:apply> + </ml:apply> + </ml:define> + </math> + <rendering item-idref="2"/> + </region> + <region region-id="31" left="294" top="63" width="95.25" height="18.75" align-x="312.75" align-y="78" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:function> + <ml:id xml:space="preserve">i</ml:id> + <ml:boundVars> + <ml:id xml:space="preserve">I</ml:id> + </ml:boundVars> + </ml:function> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:real>2</ml:real> + <ml:parens> + <ml:apply> + <ml:minus/> + <ml:real>1</ml:real> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve">e</ml:id> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:real font="0">-0.01</ml:real> + <ml:apply> + <ml:absval/> + <ml:id xml:space="preserve">I</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + </ml:define> + </math> + <rendering item-idref="3"/> + </region> + <region region-id="40" left="594" top="93" width="36.75" height="12.75" align-x="613.5" align-y="102" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:id xml:space="preserve">i</ml:id> + <ml:real>0</ml:real> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="4"/> + </region> + <region region-id="48" left="54" top="114" width="390.75" height="303.75" align-x="54" align-y="114" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <plot disable-calc="false" item-idref="5"/> + <rendering item-idref="6"/> + </region> + <region region-id="41" left="594" top="111" width="91.5" height="18.75" align-x="620.25" align-y="126" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:id xml:space="preserve">i</ml:id> + <ml:real>0.1</ml:real> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.0019990003332499562</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="7"/> + </region> + <region region-id="42" left="594" top="135" width="52.5" height="12.75" align-x="618" align-y="144" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:id xml:space="preserve">i</ml:id> + <ml:real>10</ml:real> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.19032516392808074</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="8"/> + </region> + <region region-id="54" left="618" top="237" width="136.5" height="22.5" align-x="646.5" align-y="252" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:function> + <ml:id xml:space="preserve" subscript="0">I</ml:id> + <ml:boundVars> + <ml:id xml:space="preserve">Р¤</ml:id> + </ml:boundVars> + </ml:function> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:real>2</ml:real> + <ml:apply> + <ml:pow/> + <ml:real>10</ml:real> + <ml:real>21</ml:real> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve">Р¤</ml:id> + <ml:real>7</ml:real> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:real>3</ml:real> + <ml:apply> + <ml:pow/> + <ml:real>10</ml:real> + <ml:real>4</ml:real> + </ml:apply> + </ml:apply> + <ml:id xml:space="preserve">Р¤</ml:id> + </ml:apply> + </ml:apply> + </ml:define> + </math> + <rendering item-idref="9"/> + </region> + <region region-id="55" left="510" top="264" width="468" height="241.5" align-x="510" align-y="264" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <plot disable-calc="false" item-idref="10"/> + <rendering item-idref="11"/> + </region> + <region region-id="39" left="408" top="435" width="54.75" height="12.75" align-x="445.5" align-y="444" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math error="This variable is undefined." optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:id xml:space="preserve">i2</ml:id> + <ml:real>1000</ml:real> + </ml:apply> + </ml:eval> + </math> + <rendering item-idref="12"/> + </region> + <region region-id="6" left="18" top="441" width="68.25" height="12.75" align-x="48.75" align-y="450" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:id xml:space="preserve">H</ml:id> + <ml:real>0.3</ml:real> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>72.805397491411711</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="13"/> + </region> + <region region-id="25" left="210" top="441" width="107.25" height="18.75" align-x="259.5" align-y="456" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:id xml:space="preserve">H</ml:id> + <ml:apply> + <ml:mult/> + <ml:real>1.11</ml:real> + <ml:apply> + <ml:sqrt/> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>21929.364127815621</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="14"/> + </region> + <region region-id="8" left="18" top="459" width="77.25" height="12.75" align-x="53.25" align-y="468" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:id xml:space="preserve">H</ml:id> + <ml:real>1.35</ml:real> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>395.01487871037949</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="15"/> + </region> + <region region-id="12" left="18" top="477" width="93" height="18.75" align-x="53.25" align-y="492" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:id xml:space="preserve">H</ml:id> + <ml:real>1.55</ml:real> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>1398.7266145428196</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="16"/> + </region> + <region region-id="19" left="6" top="519" width="22.5" height="12.75" align-x="16.5" align-y="528" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve">a</ml:id> + <ml:real>0</ml:real> + </ml:define> + </math> + <rendering item-idref="17"/> + </region> + <region region-id="20" left="42" top="519" width="23.25" height="12.75" align-x="53.25" align-y="528" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve">b</ml:id> + <ml:real>0</ml:real> + </ml:define> + </math> + <rendering item-idref="18"/> + </region> + <region region-id="21" left="84" top="519" width="22.5" height="12.75" align-x="94.5" align-y="528" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedBIUnit" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve">c</ml:id> + <ml:real>0</ml:real> + </ml:define> + </math> + <rendering item-idref="19"/> + </region> + <region region-id="18" left="6" top="549" width="24" height="12.75" align-x="17.25" align-y="558" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:id xml:space="preserve" xmlns:ml="http://schemas.mathsoft.com/math30">Given</ml:id> + </math> + <rendering item-idref="20"/> + </region> + <region region-id="14" left="30" top="567" width="99" height="12.75" align-x="113.25" align-y="576" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">a</ml:id> + <ml:apply> + <ml:id xml:space="preserve">tan</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">b</ml:id> + <ml:real>0.3</ml:real> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">c</ml:id> + <ml:real>0.3</ml:real> + </ml:apply> + </ml:apply> + <ml:real>70</ml:real> + </ml:apply> + </math> + <rendering item-idref="21"/> + </region> + <region region-id="15" left="30" top="591" width="112.5" height="12.75" align-x="122.25" align-y="600" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">a</ml:id> + <ml:apply> + <ml:id xml:space="preserve">tan</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">b</ml:id> + <ml:real>1.35</ml:real> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">c</ml:id> + <ml:real>1.35</ml:real> + </ml:apply> + </ml:apply> + <ml:real>400</ml:real> + </ml:apply> + </math> + <rendering item-idref="22"/> + </region> + <region region-id="52" left="462" top="597" width="76.5" height="18.75" align-x="521.25" align-y="612" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math error="This variable is undefined." optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:id xml:space="preserve">i2</ml:id> + <ml:apply> + <ml:mult/> + <ml:real>2.41</ml:real> + <ml:apply> + <ml:pow/> + <ml:real>10</ml:real> + <ml:real>-2</ml:real> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:eval> + </math> + <rendering item-idref="23"/> + </region> + <region region-id="24" left="30" top="615" width="117" height="12.75" align-x="122.25" align-y="624" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">a</ml:id> + <ml:apply> + <ml:id xml:space="preserve">tan</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">b</ml:id> + <ml:real>1.55</ml:real> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">c</ml:id> + <ml:real>1.55</ml:real> + </ml:apply> + </ml:apply> + <ml:real>1600</ml:real> + </ml:apply> + </math> + <rendering item-idref="24"/> + </region> + <region region-id="49" left="666" top="608.25" width="89.25" height="27.75" align-x="689.25" align-y="624" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:function> + <ml:id xml:space="preserve">i3</ml:id> + <ml:boundVars> + <ml:id xml:space="preserve">I</ml:id> + </ml:boundVars> + </ml:function> + <ml:apply> + <ml:absval/> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve">I</ml:id> + <ml:apply> + <ml:minus/> + <ml:real>15</ml:real> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">I</ml:id> + <ml:real>0.029</ml:real> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:define> + </math> + <rendering item-idref="25"/> + </region> + <region region-id="50" left="564" top="648" width="388.5" height="303.75" align-x="564" align-y="648" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <plot disable-calc="false" item-idref="26"/> + <rendering item-idref="27"/> + </region> + <region region-id="22" left="6" top="652.5" width="119.25" height="45.75" align-x="69" align-y="678" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:Minerr auto-method="true" method="levenberg" derivative-estimation="central" variable-estimation="tangent" linear-check="false" multistart="false" evolutionary="false"/> + <ml:sequence> + <ml:id xml:space="preserve">a</ml:id> + <ml:id xml:space="preserve">b</ml:id> + <ml:id xml:space="preserve">c</ml:id> + </ml:sequence> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:matrix rows="3" cols="1"> + <ml:real>0</ml:real> + <ml:real>0</ml:real> + <ml:real>704.75086921523621</ml:real> + </ml:matrix> + </result> + </ml:eval> + </math> + <rendering item-idref="28"/> + </region> + <region region-id="26" left="12" top="716.25" width="61.5" height="27.75" align-x="42.75" align-y="732" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:function> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <ml:boundVars> + <ml:id xml:space="preserve">B</ml:id> + </ml:boundVars> + </ml:function> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:id xml:space="preserve">H</ml:id> + <ml:id xml:space="preserve">B</ml:id> + </ml:apply> + <ml:id xml:space="preserve">B</ml:id> + </ml:apply> + </ml:define> + </math> + <rendering item-idref="29"/> + </region> + <region region-id="27" left="6" top="768" width="406.5" height="300.75" align-x="6" align-y="768" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <plot disable-calc="false" item-idref="30"/> + <rendering item-idref="31"/> + </region> + <region region-id="28" left="42" top="1155" width="109.5" height="12.75" align-x="68.25" align-y="1164" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDFunction" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:function> + <ml:id xml:space="preserve">H</ml:id> + <ml:boundVars> + <ml:id xml:space="preserve">B</ml:id> + </ml:boundVars> + </ml:function> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:real font="0">0.1</ml:real> + <ml:apply> + <ml:id xml:space="preserve">tan</ml:id> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:real>1.5</ml:real> + <ml:id xml:space="preserve">B</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:real>0</ml:real> + <ml:id xml:space="preserve">B</ml:id> + </ml:apply> + </ml:apply> + </ml:define> + </math> + <rendering item-idref="32"/> + </region> + <region region-id="29" left="30" top="1200" width="378" height="297.75" align-x="30" align-y="1200" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <plot disable-calc="false" item-idref="33"/> + <rendering item-idref="34"/> + </region> + <region region-id="30" left="210" top="1539" width="52.5" height="12.75" align-x="234" align-y="1548" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:id xml:space="preserve">H</ml:id> + <ml:real>1</ml:real> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>1.4101419947171721</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="35"/> + </region> + <region region-id="37" left="18" top="1614" width="400.5" height="303.75" align-x="18" align-y="1614" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <plot disable-calc="false" item-idref="36"/> + <rendering item-idref="37"/> + </region> + </regions> + <binaryContent> + <item item-id="1" content-encoding="gzip">H4sIAAAAAAAA/4yQwW7CMAyG7aZbS9etu3AhSOUZeIIdENph2iT2ACiUAkVUTF2ROPLm3W8n +u+w0R3b+Ot/vRsmJiJGfyEy1QS228/W+c1+H9e7cta5PSGKMHGl74XqnLZog07b62Bzrqvet +ld8omqGYMF+8hWr5yty1+V7q6FjZKfKNA+tjwCKe/r/7OzzpO1fV84XRIxvAkp+JLQ+imG0E +U8kRWwNryYZtPEgnBkMDxB2Y2wuO7oURV6IMRCqMwCOZI/YMjNofwKg9B6P2R/0XxJMyEIUw +AvvrFu+Xtu6ayp38g6R67VfklhosE14uC6/5J3IpPwAAAP//AwARvY6sxgEAAA==</item> + <item item-id="2">iVBORw0KGgoAAAANSUhEUgAAAI4AAAARCAYAAAALzZSeAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AcVJREFUaEPtWQGOwzAI6/18P9+t1dJjCLDhkmrZEmma2kJCjGNQ+3N/jG2NhUAWgZ04aywE +sghsWYdlvxA4qtSCYSFQQeAkzqPE7b3O8WvDuiefPfuj00/by7kqwSEfL74objRn9Xnbq1z7 +SjyyWDAYhXuRQFmJZu5FNqPIo+eViUN70uSvksWb52o8slh49hYO3l5eStV/SeIlbBR5GIJE +a/eIi8GsKXOFsJUYPZ9eh+tQIgS+Ll0ZVqK5K0B66oDA0n5I2q3Ymw+KmyETSwjWjsF6KHGs +usYApf2sRKGSENXUyDdLGqbESJA9wkTr9sBDKxXCL7KPBACpsrWXt1AcBpAexGFqu6VEnl+G +sMzaktAjD1EUCxPn25QqBFgP0jAl1juVVxOHKTvMfhhlRarmld2pFYdJNJJhCRwzn2ePks2c +5AwZolYA7SMTCySOJ9GyvruTiHdAuh9A/RFifNQMm7WXiEUrnE56VCaY3sXyr/R8LDbeelEc +Vr6tGN25s/1FdIKjJGfXmcX+W/H4e3N8e/36sAXXGbAytrOQpaoerILMgMPBlp0kkijUtfg0 +8Y1KUyHPJx2ikziNQJn/GU7GinEMAr9hVWPaI9ckegAAAABJRU5ErkJggg==</item> + <item item-id="3">iVBORw0KGgoAAAANSUhEUgAAAH8AAAAZCAYAAAAYEPFUAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +Am5JREFUaEPtWuGxwjAI9q3iCq7QFbqCK7iCK7iCK9QRXMEVXKFPvBcvppB80KRN3rV3/hIC +fB9QkvRnfD27xp7b7bbruq4xr9d3d4Ibkd/S83w+x2EYWnK5iK+vVEquG8pcr9cvnfQKSRPL +CpzP52UNVmrNQj6F4uPXHPnH47FSOpZ1y0r+6XT6ONoU+Y/HY/SdXxZu3BoR436SVkxGS6y0 +FrcOVT7h+J718JDWl7xcLiP9an5CwDkCYjKppHGxW+yQLs1L7t3fFPlU9ff7vWbu3xXvP1ry +3xVpGOYQO7Q24ee6Z1Pkv7Z3G/l/mWVJMlKllk84Ntf29/t91VXPVS1SkQiRYeCIjtRBDodD +e+Qj7bBUdvhDlWZYq5F851NTbX9N8tGkslQkopOz8jfyUTaVcgiRKRkkyVNrxAZHlvxYiwrb +nhITlbhm34pOxyoHZgoj/sdkkO2ezxVij9uBRNt+LLuQ7LRgqLWJAGXxo3YdBH9JJtn2LYNK +CcB8P9yUmnr/lfCjtjXnkM9O+5+MEA4ZkITg2ssc4Hyb0j4fAULrQ+0dBYmZk6Fb0ck+3w82 +1S60BIfzAgps6Id0wocAoSE/fJ9qdGuXFU/4clf+XCBCUulMmrvSTZGvTb5Qfm4cNenT2b67 +H/ka+EqRrwVfmuCpZXFXuinyteDnXk9rv6S8eKtXinxtMLG22/f9ZLncZP3nts/e56danf8/ ++s63kMJ1Cd9e2PYlv7QJx+0gLP7PtVta378SF/f5SOCITIlgar/TLxFzjjXDbx9Vhzxoxedw +NLbG9gGnDWEV+dLgtVbF20LetCQEmrrV22jMi8AvypqpYqmoq/gAAAAASUVORK5CYII=</item> + <item item-id="4">iVBORw0KGgoAAAANSUhEUgAAADEAAAARCAYAAAB0MEQqAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +ALpJREFUSEvtlo0OgCAIhO39H7q0ZSNEjvyZo+XW1rI4PzywbY8jeB8JwvsI3gFOJ30OIpZG +wUSfpft8XbU0JQdcB4moO8EBaLA8J4EjUW2ex7PEr0KgYBrgUggtu2+glkEgr/dAUI8jvyMd +KUEPO7nfCdptUJeSOpNWgP9OCG2fW+q2E8+W6D12Tkgtt6eo87eobqoQxYQhA1R0xOJbY5gP +u5qA5TBqXZz1O/jvhArWKjTzPQgxU3xU7AOU0jdlcxdCZQAAAABJRU5ErkJggg==</item> + <item item-id="5" content-encoding="gzip">H4sIAAAAAAAA/2xTy27TUBC913Zix42TEJJC6iRuGx4LhFQsFtBVqSqERAER1HXlOqY1IiS4 +Luoy4gPYIbFjwycg9vwAvxTOzDhpi7jW3Jk598zjPlxVSmnIG4jLtonZST4Ok+N08qGkaDyE +VEaTWDCLscdEG8evjt4lcc6IGnK8gbl8ejLdnZwLvA+xAQyXxBeQZ5BvkNfg3zcufBpbRVOG +Mkw2msviT/I8S4/O8kQzcxtSV5eHtb15xS9xAivPksRnIIR4UzbLYee3UrOSHX6H3ik7ou2K +aMcVXVkJDRT5hPMxtEZ8lf2f4lOzHhNnlVpI3ex61BWbnz0u1Aibf7DuXOPAUYMCU2wr/IJG +Zg11nfEfTcIPOKIlGe22tNBaFd2+Ia2sLkrfZP/X0lcdCWyvSSsdQL600uHEXXFa7PSEXO5L +9l4gur/OWfMAx6etB7j/LbqTjfDrc7ADtSn737i6rNRA0vVvSe0BoNtSbsDl7sg2e4tt3uXH +Uh+Fh8dZND05fDvJxlFuM7dNb47hvSiP5C7Xijs11jGZxSN5BLnHNnludJ6ePuU88k67kJou +uC5Dc3xKd/+P7i9QdYEuktt5FsVJuGfykl8QA91Q2tdzsrT2saV5oA3tmwgNtKl9a06IBY6a +wyiBM9vBUpk4FGUzB4ZDHCJXKA+Fu+Bw+Ao4HF4Fh8M9rgWjxhwYdeIQWdqtvzwbJ1kaR+/l +QBxum360kUrxmcXP4xan+c+oXnb+AgAA//8DAD9mQBwoBAAA</item> + <item item-id="6">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</item> + <item item-id="7">iVBORw0KGgoAAAANSUhEUgAAAHoAAAAZCAYAAAD+OToQAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AZJJREFUaEPtmesOgyAMhd37P/SmJhpGWnpK6w0PyX5IKJTz2VLc5zu3iW18BRbQbOMrMI2/ +Re5wzdqU4R0KEPRDOc9FxVJbrT+kYaOQmTjmNAVquAhsgj4Nz3ELEfRx2t5mZgQyi7Hb4Opz +hGd0n26XW5UFlqfYQqKaZ/TleOMOEHRcw0fM4AYtGZR9aDqpbY5Sy9qg5q+3P+q/pqvnjC19 +qFM84l8zdbeAaSJLzltAEEfrMZZI2l3T29/jmwSl7ms9R9eU7FXQ1qW8Bc/KDFkb8fiwjT0b +9Hq1qb5eWc9Z+vy9TNKbhYDyiLytkR3ZHh+yQCPaSNnnNhFdpkJkMx6REdD1uWOlZilSEDEz +Irp1pIlpkxEdS1JWhtCKFm+/Bs9aX3vBX526syMaKXY0UAhAJOMQdCyQd2sUCJJOkeNFGtPj +w6URraUz6arQcrScxypKIry1dcqiS6s1PP3IHqx6RYr+lk4RXTRb+HoVXRx586Nr0F5XAP5g +EhGRkCPq5diaf2pEIUXtc7bJWUzQlGgMBX6r5RZINlHs/AAAAABJRU5ErkJggg==</item> + <item item-id="8">iVBORw0KGgoAAAANSUhEUgAAAEYAAAARCAYAAABgpdrLAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AQFJREFUWEftl1EOhCAMRN37H9pVI6RA2+kQtyYb/MRCp68D6Gc/nm09I4ETzHpGAtuCohNY +YAxnNGCOjTaE9WNWzDle3mkxTziz5EDrRzQiPa5jNCgI1K/goLylUNkgOSZBILDXhWSRsyYj +gfJ9RADq3ExxjEazfo2kVxCb9Ck4KK/nCGZubYRmwSww8sxA5wdTHIqNNEs9fLPARLfR/RHa +hDMay3wEv3Hdm1spyzHswTscvpEbhbVpxLYR56C8keIZLXUr9d3TxFpW9CzKiEGAvPz9Wdnf +jqwO+rpG4iOdY9Z4K5b6wGNEsh1i1s6Ihf9KMwXOzMkolskBwTCL/VPsF5Kw7uV5HwOVAAAA +AElFTkSuQmCC</item> + <item item-id="9">iVBORw0KGgoAAAANSUhEUgAAALYAAAAeCAYAAACBv+SHAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AqJJREFUeF7tm+FOxDAMg4/3f2i4nTQ0qiS102QqkyfxA7S5yRc3zQ74+n5fL10i8DQCh7F1 +icDTCLyelpDyEYHPFCIMIvBEAjJ2YVXfY+rxvvL5Gi/rZ9mlr+tU6mbj6XpuJTcZu6gqYxGu +33tmzywdrZPR2/WZVWYydlNl7zLgSldrSn1Z9sxpJTcZe7kMtsAdxl4pfFPaJbIydgnGHhEZ +O8d1HOFyKvpUJMstfK775fFc/Gkdu7IZaBQptrZntg4TdmgW46Dkxk97Vl4gZWwKfXxzdIxW +m7BarxBDmdRKjr/Gvu4WNDLvyLV22kqQSDyZ+FFd6zPpMUer21xHBqb7ILl08ETWRZhZvBCG +yHOozp+OzcCK7r3zOD4SrZzNruCQDcowY0zRpevF8J8Zmg12LCQCf9apx+6VWQOJAy1SpVaX +Ac4NWjlnrrxkVm6sGbPMWh6nU4vu2J6pI/POEqs2PnNizKDOYp89j26qznXYGNnTeKZfnRui +t52xrbmUmf0YyLN7kTEH0UDMjRQL0bHuYWK0xq9o9kW0q3ND9EJjW4bq7tjZ4jHHLlI8T28G +lYn/qjXTRQxkvR9YRzYS42y9uxmyrFxje6CjY96CiGwEr8uwRZkVYzwNMgWeGRDRjN4NUIbM +OigXZiS829jWqRGxKjM2C4UpDHJvtKO92JCCz4yMaCDxR8d95nmmHuz4grK+49SzxsXPz8Yu +dgbNdmxPZwUaWlC0s7OnhzWKnSCZjoXmwTBkNJHNNzKMThVmE3YzdPXRBNhdiuoyBdK9IoAS +cH+l3nEEI50DDVz3iUBEIG1sb7ZRp5bhdiCwZOwdElAMImC+x4XtPPjnVOEUgZ0J6M9Wd66O +YksTkLHT6PTgzgRk7J2ro9jSBGTsNDo9uDOBH3gY90TKgr2sAAAAAElFTkSuQmCC</item> + <item item-id="10" content-encoding="gzip">H4sIAAAAAAAA/2xT227TQBDdtRPbcXMxISlNncQhFMJFqtoNEqJPpSoIRAtS+IDiJqYNIiS4 +LupjxAfwxjMSQogPQLzzygNfhBTOzuTSSqw13pmzZ2aOV+OsEELCXsBc8k28nehdJzrqD9+m +hV53YZnesMtYirD7mjboPj98HXUTQkSH8g28rZPj0c7wjOE9mA2gMyfuw76D9xKdV9Dii7GI +9boH8+AbwjBJXXHe/EGSxP3D0yRi6hasIM6v1FbzQpymAqkkjiKfAAXLjci1VOWXEOO0rT5j +37Yc3u0M747Le2ZJGWiS4H5MabTFhhBZQn4AMaTc0BWJOs7kldazk9O6yP2Qo1aeKv7BuXOJ +EnseJJlPxLquVVQfIWfsict09rWINsY3c53ySlzXLrOU0jLv5SvEfb88E7BC8c95LCqcWF5l +QRVAPguqUOEqByUKaky26ly9FvBebyjrN/bgKl9AA6qluQnZbSGaKv0XOY1rfNaky9nUH7Sm +Pj3FSVNc51taI1Ft6nSDoWCus8Wt6zdZZwvQLZbWooTbfCm1xaXcoREr9NTBURyOjg9eDeNB +mNjELutJJXg3TEKegNXpJOgsmm49EA9hDfJ15IZn/ZNHVIenuwrLyynXJWiCR8jq/9G9GSoW +6Ky4ncRhN1K7Jh35U2IgPSF9OdGelD7ETQJpSN9EaiBN6acmGkmBIyZw0uCMt3FkaY7OsokD +x9EcTc7oOjrdBYfSl8Ch9Cw4lJ6jXnDyxIFT0BxNZrmFZ6eDKO53wzd8IQ7JfgzriT4ec/rL +uRe+eL6y54N/AAAA//8DANchNateBAAA</item> + <item item-id="11">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</item> + <item item-id="12">iVBORw0KGgoAAAANSUhEUgAAAEkAAAARCAYAAACRroFGAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AQRJREFUWEftloEOhCAIhu39H7pLlztkAj9oV91ka0tD0a8fdNsPS8t0AhnSMp1AWoBsAguS +zWhvISXSzO/16Ux0JHHTy9tnrcv1rjzUap/V35sT2NN0l76S2KYKLGLS5iyfCq7nJ0F/Aigs +3QgkadGWsup3FAb1uxuUnG7t7y4tbbFXQrJiT88vNuEXklR/ABVpaVTjjSjJgkRrnFTvkJoo +wbaV9AJIXiUhIBuorCK38YATjCvFakdq0nOVxK8Df1ST4kqi96LeuwIJvfdQlXnuT5aSfptu +QLQ7juPZMeNKAgBJ9cYx1O06G5B7ATmDIoNmy188evnNP7rYwXFhSINxXzX8A/iVhF7fX+e6 +AAAAAElFTkSuQmCC</item> + <item item-id="13">iVBORw0KGgoAAAANSUhEUgAAAFsAAAARCAYAAACy9dCTAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +ATFJREFUWEftV9ESgzAIc///0Zv2Vo9hIaFy9abtnS8WSwgJ3V7vdS1zjWFgI3uuMQwsY9LM +LGWCTBrGMbCTvQ6tbXaXp67WO7nHxFkxMk9WuRJvpBZUB+JB57Lq+VF2iwD0Tu+j+O+FXPBk +E25hycTInJVGNkrGEKjdk6VseY6H44wgWs5n8YeUHQFpdleMqdZIYoGjuCjZluOQuCIOPZCN +5p4ukgGjZyI6QyvUwxRpKkMMqsdqIuVoZD1keQSuRUbPN0jJqA7GRRWXV/OtyW6pGqmoh5Az +lyvjmBKDFHEXZffWwbgQNX93lfcbU6rK656O05bV6ozM7Mj4sDCy95BXR93z+EJYw/8g2S6i +xMwMZc/4l7gw2ex8YgjIbhyT88qYLrIzCH8a0YcL8squPyH3B0brfJ4wetdqAAAAAElFTkSu +QmCC</item> + <item item-id="14">iVBORw0KGgoAAAANSUhEUgAAAI8AAAAZCAYAAAAIXH3NAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AoJJREFUaEPtWottAjEMpSOwArOwAiuwAiuwAiuwAiuwAiuwAsVIqUJw7Gdzd8ldHamqBPHv +5cV2En4ez7GKEQh4ECDyxAgEPAisPEIhEwi8KlbAEAh4EQjyeJFbuNyzBVIj1GeoKmLC0hAg +4gR5lraqE8STSDMqeU6n0wShfG/ifD5/r+QfaRidPJfL5XG73WYB6fV6fdBfDB2BPNuMlnl2 +u53uyUQzUn3m/icX9vv9RN7M10xJllHIQxnncDh0gxIS5PF4nE2mbAVsbRNK/phPW7QQVLZ6 +GQh5qGyR3zFwBBBc/8iTMy+Z4D7bbrdsDwEZq9wdILJc2Fyq5Y6ZlC3J76EGhwviH82pyaI6 +rTFw2CK2kDV5yzw1Q7nD6/X6w3/kXqA2B5GtASY1eGUsm83Gijs7H+0NuLhqsqhOawAWH6y6 +XxshF0LIU2MkxNSRM48UC+KfC0DhJlYjxTdYor56fUD0B3kQlIQ5Eik9C2fRl8qg2NQW5NZ8 +ssDxQZ68HiJpL++PNMND7zSLPm1RtLjRnsaS/biF1DKkVKoRH0clT+kA2jtoQUu7RCuXFhLX +7AzV82hlXvu+JCmy4NyaIHhzWDQlT6vTFho0B+r9fhdPW1zW0RZH+14rKVom1EoRYr878tB9 +CfdehARjKTPajkSyVdIx9D0PWjq88aLE8mCObkKtBXk7beW7L+9jypLB3TBzsiXrpTlcWbKS +R+pZ6BF3qLc4yU5JqjKuWpxIKatlMo1otZKPYi5mQIRh5ZyWb1sJLGTXJb97ek7x4N2rjPl5 +ggJp+VJt3THU7/T0nNIrETx+uchDhlr+TsaSdebyuyPP4rWWcZOnpeMW8rT0c+m2fwFJKjL0 +X2RYFQAAAABJRU5ErkJggg==</item> + <item item-id="15">iVBORw0KGgoAAAANSUhEUgAAAGcAAAARCAYAAADAOrIlAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AWFJREFUWEftmNsSgjAMRPH/P1oBRUNNsrupOH1oZ3yBtkn25MJ4u69rmWtMBTY4c42pwDKm +W9OrvaNNGcZV4A1nbbrb7Nl/x/Ke2Xc2LHvOCxfdlb3/hXzR/axflZjUM+3+U+V4AjPPWqhf +Rgzw1wfIaUtrA4FWYUX3I7uZH9nZTA8lNhlOdLlk1KlOBFQFku0/fK0KXE0wlMRdlaNkUiSO +AlcBzsJr2zZqzay/qAqRHbcFtodsD/ZmkCq6dz97B0qGzNes36tzk23tCgAm8aS2hsSqZG8W +EBMAazOy0wKOoKK2q1SO1xapysmcGAmOVzUsTKYSUBUgGMgX9H4HqDhxJRxVsErFqO0sy/Ae +OAyYExybiTYIO3ey4eh9iRz7o9bh2UTJUoGC7HvdwounhRX5z2jJxCH/Q8BSZ4xne/5lp9fP +K8/LcNhh1uP0BPNUrwTnSkATzCety3B6KmOe5RR4ACPoRv7X/SvCAAAAAElFTkSuQmCC</item> + <item item-id="16">iVBORw0KGgoAAAANSUhEUgAAAHwAAAAZCAYAAADzJ0pXAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AchJREFUaEPtWImugzAMY///0RsgwbouiZ0EEEeQnp7E2iS2c7S83uMz1PMcBibB63kOA8Nz +oBbSuZsXDc9ioAS/uN7j4WM6g81/zMOtYizVmsMZ6EVmRC/BD5dpP4cl+H7cns4yI3Yd2k4n +WyygmuEx3i6/i6nymuGXl/kLoAS/kZgMFJfg0n3OuuOFrgTKnbH1wwTNgJfWINsaXu/7aHzL +PilOpA/Cttpug9Mc9QAksRmH2ppI8nhJRQcbLQbve29cEreID4ZrLY6fGc4IzorGAJmvCcpX +ogwoFSz5NWqJq/3fVx8SJSM8sp3hxiW45YgNwpMwrE2WXNZeuy5b4UwRMR0UdWKag95QOyv6 +6ttCcKlqtNmF/FmxRma41HGygvd4maS7VYVvJTib0dHK6Ku8Ta42QaX3WrIxYltjxDrUsXwc +3tK3ElyqbkQo+h0lh2ccsWcYphOhimfFnrn3gEQtlnHsIc0jUMZ3hHRPtVlngojvDC+r4Khl +ocrs5327Xmt7qB1mgGkVZs1ki4NoxXoPbVGumIT/q3Bm05YiWP6O8sNgvtOa0Lf0vcXY2/6d +BPRiCQlutXdvAFKrzNqo/ToDYcGL1Gsy8AEcIJzBPx4LVQAAAABJRU5ErkJggg==</item> + <item item-id="17">iVBORw0KGgoAAAANSUhEUgAAAB4AAAARCAYAAADKZhx3AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AH1JREFUSEvdlOEKwCAIhOv9H3orKTBxnMHwImG/Jn13p1WfVoVRHcyowoBKyteD2xr1XZIv +zfGEzXRFQEbUIbCOwxNlD4kIh2DdgAB6ZnZ+VgwEj8dkWYKII9QDwTTHO2DkUv+Hjm3U3pzR +7L8EUe6xezt2IvuzN+UBOcrxC8tu6msu6stGAAAAAElFTkSuQmCC</item> + <item item-id="18">iVBORw0KGgoAAAANSUhEUgAAAB8AAAARCAYAAAAlpHdJAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AHRJREFUSEtj/A8EDAMFQJYPFGAYKIvBIT5oLAdGPU3dAjIfhlF8jixICxegewxsH7JFtPQ5 +0ZYTCgVyHEmU5ciKCFmCHIfo8YkedURZTqtooLrlw8fn0HIeJS9iy3aE0gKurIozn9MibxMy +k7ZFGgHbR67lAM2WHkZ9syRLAAAAAElFTkSuQmCC</item> + <item item-id="19">iVBORw0KGgoAAAANSUhEUgAAAB4AAAARCAYAAADKZhx3AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AIxJREFUSEvdlIEKgCAMRO3P+/PSkWOacSfZBg1EhOG7O5zbkStFVAFHVIqASsq/B+dnVN6S +LDfHFVbTFQEeUVPgPpJeWH8JIxyCbQMCWIGzYm9RIxjjbtQz5RhBPnO80j10fP3bOmtMbCiZ +ZoS853hoQBXt7UgncGadPvUJrUAsCJ3fQvXLrFB2XwE+AfCd0Qxi4kKHAAAAAElFTkSuQmCC</item> + <item item-id="20">iVBORw0KGgoAAAANSUhEUgAAACAAAAARCAYAAAC8XK78AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AKdJREFUSEvNVAEKgCAQs/8/ulTymGtXCsolBCLXbW47jzOvFLkKgciVIsGr+r8jkONQMlG/ +Ox/GsZ2tJN0pwABIZCUo9jIC3u123HqKQFcMtrBNrJZSD221fQNQN8U8KABFzssNZ6vVTVmg +MsKA1pjC7Na9KfA1BWpSFJCHUVXxZFQ/eTbxhGCdt39YgICuX/A+jCjH4DK4u+Z7tO//nuJR +5qvqwhW4APqVEFQb1zbjAAAAAElFTkSuQmCC</item> + <item item-id="21">iVBORw0KGgoAAAANSUhEUgAAAIQAAAARCAYAAAAc7wRXAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AZpJREFUaEPtWYsKwzAI7P7/o7d2LMVa9S4mNAwsjD2i5nqemrLXe7+2uoqBxsAhiLqKgcbA +VlQUA5KBEkTp4cLAckHso+sEJD+jPB227eXZapue+Gj/7HoGd3avcwwIrjRnN44ym80iVouB +javtLD/Pht0jwwvyGcGNYkfrLBdfcWQ2mkEqk8So8i9zT3QZxqcHf48t4pIRhI4xc//fE6Xb +kU1B9LZh3ZasRFltyiKv3TyDoUcQM8WHKjHC3iuISAyy1TNjSObJ+tzEcukQuoUz1eapzgIp +E+4JgsHQQ6yXILbyMnaezwzc0bmAwRrxG3YI5Gi1NtQJGEF4ld+LB7XeTPUhn6jr6cKxviN/ +NJLQOhLkTRBMdaIbYxI3WkHoxhhimWpik8bazcA90iHQ/sOCsCq+BPH9K8AsVpQQRsiPCuI8 +WIBnfGsut9+sdzautssc4KRIJRY0QtjzEoOJsfHEoflDY4Bdj0Qq85l67GRBIGJmxMnEYMdF +Jva/+ywTBDt3ZxNcYogZXSqIp0VRYsDltVwQGGJZPMnAB/dq0sbjfRbuAAAAAElFTkSuQmCC</item> + <item item-id="22">iVBORw0KGgoAAAANSUhEUgAAAJYAAAARCAYAAAA/tFWCAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AdpJREFUaEPtWNFuw0AI6/7/o7c2UiZKDTYXqssDkapuCccZ48NRf36f12OuYaCbgZew5hoG +uhl4dCecfMPA4YJDwzDwDQa2C+tp7f912b+VYln86/n58fnsM5ZHwdIRw3Co9XRgsTl8jxCn +HtuSsBgBamEIcGVthsM/q/6v4uiKiw7AmX8XfosrwoDubxMWEkVVsJV4RcSr+TrFpeZS6lFz +RXHnHv7bi10SlnJyslGIRqiPjxpoC1CarMQcL5LGbqMRH00GRrrSvMzCGB6Uv1KPrcviYH22 +vF0Wlj8FKqloHSIzAuiLV5usCIsRyCxG5UCJY3jZ87PZWVwmuoqwop5Gg8Pf/7DCTBBZwyvr +1BPHhK40gom0IizUmKpwGYfKBKxOYTUne5+LuEL334TFGsk29gWrQJS8FUuoxFaE1WlbFYyV +2I6JpR6gzCIvCQslzsSpWGGleVcnFlqv5lyJY2vYc8YNs8iKFaqWh6bnsY8/DX7z6LTA8Wd+ +N/LWqOS17xCMZGS9/oUTxUTrmGUinlSLYXaZ1W0P40o9KsYszg8LVM9Hvzs2XsnBhLOS8+qa +O2K6WtOu9Uu/Y3WBvVMj74Sli9+debYKC/nzDjJGVP2sbxdWf0mT8Q4M/AGp2t/xYFcNsAAA +AABJRU5ErkJggg==</item> + <item item-id="23">iVBORw0KGgoAAAANSUhEUgAAAGYAAAAZCAYAAADDq1t2AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AiVJREFUaEPtWouNwjAM7SxdoSt0BVZgBVZgBVboCqzQFViBFYrMXTnjs+MPySXqNVIlqtqO +7Rd/YtEtwXW9XoOc7bO1YFsXcdP9fl9aUD6iu4VnmiYLWVGaEDDn87moUi0Ir21jCJjj8diC +74rqcDqdisrXhLuBud1uS22lNaM837uuW9YH80HEgK21lhuYy+WywLOFBYDghd+hhtasNW5g +IFrmed4CLr9swMCAjTUzgxuYcRz/BTCQxsDWWssNTN/3tXQtvi9NbcMwFN9T2sANDFW+muaJ +jXFBl4o7ZefsqmnrJoHxHhYJgB0Yrycz0mPnp7q0jFuaRNF+8YcJWsn1QaKkkOfuAmL+TLSp +Ka1z7E3bY5r2pPbZ5M2MRHwqI457AvS9tFOlhT8F0AooR6fp8qmfNFs+lZ88hCbhCBitU0kZ +s36LOlTjy+1IzVaT74JEcip7j+nXm3aP2QowMEFv4x7D1JMnGiStpW7+FlC+RMqjEE+Nicqx +HGLt5u9tya1t+6tkvClJawsDDMyPpJG4te20ONRyr7DIsYDA0cCsLOdMMC8wDFAQ4tzYX4sW +7oRJDUW0m8tZY7Tpcr2IwaAQgA6HAwk0uWvjnBw96RpfTmByDzDjEYPvLdxv5GGcyiKRgB1o +VViis/J7U1rONLbWVa7lF7ODV+GVPrfiUT1K8JX4P4P3ALlnZasjSihfwskRmS3YFgYmYvDO +Y/fADozdV39K+QBsKop+tdN1rQAAAABJRU5ErkJggg==</item> + <item item-id="24">iVBORw0KGgoAAAANSUhEUgAAAJwAAAARCAYAAAAolsVLAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AdRJREFUaEPtWAFuxDAIu/3/0dvdTZ0YA2wITSuNSpOmNiHGGAfdx+fzecwzDOxi4CW4eYaB +XQw8dh005wwD79t0aBgGdjJwueCeo8NPvvJ/hgRm/WvN8SdjyvdMHAbP6hoGB5PPKo5jf4RH +c8riKgmOIYZJWostE9cSkXWmF1O/z5zN5JZd051P9ny9PsKDuDu+W+suE5xV4GzR0XqPtOg9 +Wyh0NhtHu260L5tPBQPCw9QtJTjUacg6LcCW/UZuhDAwlo+Iew+w4jrviunlxeTEiph17WiE +qOCRQtK3k1f3Pxi8wkTJR5aqQVnAIsKiRCzbZ7uYLdJq0SOMKDb6Xm2io7mkWVQFx9Sz5HCM +gr0O8tzCA4LWr7qRt996jxrNKhraE7k5IyJ2f5Qn25gRHs9oMu9/zXCsuzAOFxWzy23OcAQ2 +Zve6rFhYDmUzdzgce3V69V8SnOVYjDOyZKGiou9oLrP2r8bccaWy/J01w2leyw5n3fXREMwk +JEUpO8yzeGaNxul1nTWnoPjdgpNYo2vNw2Xxh0aZyvVpNUqGvwi/jFP6WaQroY44nTFYsXWe ++d9iXSa47MxydmFGbGcz/B3/UsHdRXQjtj1iu4Xg9qU6J92BgS834kangmNIJgAAAABJRU5E +rkJggg==</item> + <item item-id="25">iVBORw0KGgoAAAANSUhEUgAAAHcAAAAlCAYAAAB4f3Z2AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +Ah5JREFUeF7tm+tuwyAMhbf3f+itlZaOIF+DMQadSPuxhBh8PoztVv3+eV1fuM5U4A13t+tF +Yrclp6231WZLlQCX3yuAmxZH+RMBbpDmbyGvvyCTw2YAd1jCfwPVUgTgAm6gAsGmKkVLpbX8 +tbUftVEtD248wB0UsH+9kqCV1oLIPXijAS7gBisQbK7KUbhVn3vrkZQG/RrbOpgletY8wXsy +xZza5/bief7PED5jjhQSEyZR4UrVKSWsBj/aB8B98MWBBo4TVXsvupUBXCdc6gPw/l4U3Gtp +fb6m1kC5AbhOuH2P1L7eFk9WsWcCoNIAt1FOvy+mUAoi9wIiN7p6iLfHFlQaPO25ZaNEuDPz +VIhY30obJFzp+GpzJBXVXL7mnByFM/r+SvFnz+1uhbwROVv82fZnA5hpfwiuVHhpz6KcAtwH +1bJHfG9v67GtjZXgSnWBtdWyzK/ZatOclJ6kFlTqCiwp76gv6yXBo6Pds8EsgcC1m9p9cyuk +7dgqzz3CXqliF7jWNtTSuRwVuVrOjwTs2WCeyAVc4eckGkDtufV0yoB7q3w7nxG5BClLwWUt +hrgWkSqEpNzInThSQQW4DrjWiJU+0OGePTmWPScDu8m8TlUYH+H4qB+eNXjhPjmOqY11VEFF +HaeWI9YL2mKTG9ODu8a1cNp321bIUi/c7HsdqzDe4mSFda5YA+CuUD1pTsBNEnrFNNvDXSHa +jnP+AqwCqr5ghRz6AAAAAElFTkSuQmCC</item> + <item item-id="26" content-encoding="gzip">H4sIAAAAAAAA/2xTy27TUBCdazvxo3k1JIXUSVxKYYOEiqlE6apUFQKpgBQ+oHUT0xoRElwH +dRnxAfwCGz4BsecH+BY2sA3nzjhJQVxr7p05c+ZxHy4RkYK8gnism5id+H0vPktG7wqkxw7E +HYz6glmMPdK0Yf/l6Zu4nzFCPY43MBcvzscHo0uBjyA2gN6C+BzyE7wT1PqNdL+spa1HmDdl +kGGyUl8Uf5xlaXI6yWLFzD1Ila4Oa2/zL7vACawsjWN/kbw8ZrUYtr4TTQt2+BnrftGR1XZl +dTxZ3ZXQQJEPOB9H2Q9pFznuQXb0IZTY9w0+Q6ltnZuDpm4l1J0dlHWHrH4sc9FaWP8Bv7PK +gYMakWkk9ACbDD+hrWmNrrHnS117ntGEoxqS1W5KS401WZvXpbW1efkb0s7CppYENtelnRYg +X9ppceK2GA02OkIudiV7J5C1u8FZswDHqaz72Pg2PrrJ6NdgUWtTwru3pJa+iC1JL3dyWzbW +WW7sDj+X6iA8Pkuj8fnx61E6jDKb2U396hg+jLJIbnM9v1VjA5OZP5NdyF3WteVFl8nFE84j +L7UNqaic6zE0w0eq/X/0aI7SEp0nt7M06sfhoTxUPycGqkbKVzOtKeVjS7NAGco3ERooU/nW +TCMWODSDUgBnug9XUXN0lM0cKI7maLKr8+hwDxwOXwGHw0vgcHiZa0GpMAdKVXM0WdqtvpgM +4zTpR2/lQBxu+ylkQAk+M/99vPw0/xmlq8YfAAAA//8DAHUNa9IqBAAA</item> + <item item-id="27">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</item> + <item item-id="28">iVBORw0KGgoAAAANSUhEUgAAAJ8AAAA9CAYAAACzz7sFAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +BIxJREFUeF7tXAFuGzEMW///6K7JeoWr2Balo2xnYIEBy84mJZKRnSLYx+fXzx/9SIEdCjzC +p59zFPjKwDnFAJXcqfe9OgXEeOcld4zc2Xe2boVvp2sNd9bAQ8p/XN3CpcR3hCm0wVMgY5yH +eT1/YF9/0D3ZddE+FL6s0sR9UdNQaotbxdMGHa3t+UE3slhr+QpUBmJ1+J6BChy/Ch8/TyHE +iFkh4E4QKrky00/hizpKXl8ZCE0+sln/E1xl8HpHYDVfdPpp8m1Mc3UYdky+yL1P4VP46Aqg +byqFjy49DoiahCO+rlz5ez4du3ecWrx3RfgWt/SkQ/vS5NvhzjcnatLGElPUaF8KX0pezibU +JA7bOhS0L4VvnScvTKhJG0tMUaN9KXwpeTmbUJM4bOtQ0L4UvnWeaPIZBRQ+hY+ugCYfXVI+ +IGoSn7kWEe1Lk6/Whyk6atLGElPUaF8KX0pezibUJA7bOhS0L4VvnSf6wKEPHBvTZsUPfOv3 +nKr9SjT5fI22r0BN2l5osAC0r59j1/v2Q+85ShKsnXo8MWpkYPQ0qMJtuTxf73pzp69fd76r +0BHgCrEs9x3OWT9R0e/UMeKqwLTBm72OaoCuR/t6Cd+DwG6+XqOgaJHeOgYfA+Oqk4nV09nT +I/p85GMUJ7oe1elW+FqSNqA98t4UsqH2MNoQwA1+X+qjU3B0XKG8iGFMLOT4q+aLvknT4WvN +7BnVC2b7brd7eq89QRExbejQPSMhZ/vbHkbhXXkMvuXksyFBjJg1ak3J4GUv0RkDvIAhUw1Z +g7wREBz0TlnNR5l8FeHzppi9A42EGk1UpgHZ8Gny/XMBDXn32K0M3yw8SLCQNbOjDREGrfHO +VIqYlOXJTP0sV+Y6Mf09nzVhdM/z7m+X0CieZ8zsGO+Fa3b/snfC9ugYYTEM8npkcox6ZHFY +HOQN/uy/qgAGLtpE5l2X2ZOpZ6YDG4+hOQMD7evo8EWnA9r0CcGL9sYIxSoM1Ifjw3eCSaiY +UXOrcKN1sNejfb1F+NjinIKHmnRKvWgdaF8KH6powTrUpALqUki0L4Wv1IY5OGrSxhJT1Ghf +Cl9KXs4m1CQO2zoUtC+Fb50nL0yoSRtLTFGjfSl8KXk5m1CTOGzrUNC+FL51nmjyGQUUPoWP +roAmH11SPiBqEp+5FhHtS5Ov1ocpOmrSxhJT1GhfCl9KXs4mz6T22zj2mynts1E1PfwZ5gNn +hOvV2taArlX4ODlKoXgm2efX69G/2wCMwjcLyiywaJNeXxeOwocqWrAONemaSD+mmf/pAA2p +baG3b1RTttaZbApfQahQyKyh3uQbTUgvfKNw2/B7/aF9KXyeksXPYaOaaTcLX/vMw5499wIe +uWcO1xZrK3hHAS8gvamDHrORcHlTEakzPCGVjr0KIKZ6U6g9ZttPq9ffex16vB6nJt/e3NDY +7wYh8yEhOhW9GqNT77mepqCA0gpEg3AZPZtsNgzeXbCdmL0j2ONS+NL279+ITJb9VY4ryNSv +yXeQoxkDTyg/W7fCd4J7TQ1ZI3e1cadehW+Xa+L9/Av4QVKJuE2w3AAAAABJRU5ErkJg +gg==</item> + <item item-id="29">iVBORw0KGgoAAAANSUhEUgAAAFIAAAAlCAYAAADRC77iAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +Ab5JREFUaEPtmNuywiAMRfX/P1prx3YizWUnxAExnTkPB0Igi00C3h/bd6uvn8ALZH39BG79 +LsrDfqoLQw6BZUFuSe+V+/e/4+PaaN+7XpzjWnvqq8W/LMgDyiVgAraFKP1PfUkw/x4kB8Zq +Y/tzMsScXiJAUCW3vpdXJM1zXM7kJKCNEdPBnFrKWVUpMofjR8XmlCQWjkBBWv5oa1W7QAKK +Re6R0tHvypHcYO0CKsVyjNH8RfwC7EImkbWY1x8rOVsrvVwJlFwTCcCaP9rvWQt0Ie8BiY6l +dp4AopDQcchaNJuPYoPCQJ5d0Yst9Y0Eh4L6tt0FZJvbkAVo1c/yh8DKyt9ILFEbUZFIgNoj +P0OR4aDILz/SJmS277FqRwmFqSnSSgPIHD+tSElR0tsUbUcqe1SJI8ediqS73qqU6zvatCPM +KclS6BLFxtpRTU3IEfVAtNYyW7/rrW0dSw9Mj+1s0Ng05lmkBRLNq7NAzCxiYUVKOdWzMTPY +Rh8hlzTlDcYqMl5/o+2HgRwdePb8BTKJKHJFQ6Zy5UjE4a/ZlCKTdqxAFsgkAgluht0jE9a+ +rIu/LzZZO1sgk0gWyCSQT0yMB1e32YApAAAAAElFTkSuQmCC</item> + <item item-id="30" content-encoding="gzip">H4sIAAAAAAAA/2xTS28SURQ+d54wPEWxwiBUQMRHjF410a4qaYyJVRP8Ac0UxnaMCE4H0yXx +B5i4cO3Gn2Dcu3XhLzLB8xhoa7yTc+853/3OM3fyAKBQXqF4rJu4Z8L3w/Agmr6zgdZ9lOx4 +OhLMYuwR0Sajl/tvwlHCCAzZ38DdOTqcDabHAu+iuAgM18Tn5EsKhuoh/7N9YtPy06IMMExW +Kuvkj5MkjvbnSaiYuYVSgtPL2mqfsW0OYCVxGPoMaJTCjFVH134CLGxXf8Vz28nI6WblzHhy +ZnPa+YWnl9cGJktyWJlSDzCMtv+gf64oeAHAVMZduIM1MfK9wMx7lKusvzxDrgfn5KqMpSlL +I5k+6pGTLbLnNXU0qCB0gdWPFS62qiu/8T5zkf3HVWzKHMJtmANs6E/Y0KIKl/ju2walHbBX +TaK6dWml5stZbzDzg88FYv7LbP9Y29AUx3pLymkitCnlNDnwFTFqbLSF7HQkersrZ+eqDKbL +UXHwPRlCF67JEHqrC4C+hOhcl3x9hG5Iij6nuCmttVet3eKHVhrrvYM4mB3uvZ7GkyBxZVT0 +XhneCZJA3kE9fQ/GJm5m+sAeUmDWyfKC4+joCceRh9hAKaqU6zG0xA9U4//o7gqFE3QV3E3i +YBTqHfPMC2+pMihfLUlTyseWli1lKN9E15YylW8tCbGQA0tUbOQstvHKIQ55ucxBJUMcImcp +Drl7yGH3HHLYPY8cdi9wLlSKzEGlRBwiS7mlF/NJGEej4K0MhH9PeIoyhgg/M/3xvHSa/6z8 +aeMvAAAA//8DAJULHdVkBAAA</item> + <item item-id="31">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 +SUVORK5CYII=</item> + <item item-id="32">iVBORw0KGgoAAAANSUhEUgAAAJIAAAARCAYAAAA2X/X4AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +Ad9JREFUaEPtWYuOwzAI6/58f35bq0vHkAGT17oplU5TW5KAbR7q3f6e17auhUArAruQ1rUQ +aEVga91grV8IHF1twbAQ6IHAKaRni9xnpeOvXOiZfPc/X53rtL3cq4ezeg/PP2k72g+NiXWP +MECYyWeSk5FxMFgiv4pPbxUJOco882xGBa/3tc7RyYHE2EPkyB8mdgbfkrDyt4fPNQlg+ZsW +UjbwqwafqRoRaZ6IvbWWyCOMGYFm4mOT0uLyiCNqAbrVWeU5ynQv+AwwvbJIt2WNgwWuJr9H +XAyRjA3LTW+uoJBQH4zU7a2J1iIC9X4MQLWEegSVd9IfNCNaVSeTIDphIwzYvRm7jEgtri9R +kaLWMVNIVqXyKtQIIbVWDUQ424K9LmS13UsJqVfwEQleO7dA/CYhReNKhE+2usPW5h3CKhoN +ZUyJzVSmbDmOqoZsY6gdjxQSEwtjw1RuxqZJSNYcUJ67E7v4BiXt2cyoFRnyWftp2UixIJK8 +6hjNL9EgH7235hAWz1o7izuNFYo//WW7hvSaNZnq9Gnb2fHNPo/B9/Vl+/6uqc25zwSSsWUc +vqrNrDhnnZPF+VDPLhopHOpe/Cslmj+yTn2r/WiSR+/fgvsppCKozG/LwWvtbyHwALUHfc52 +3+nuAAAAAElFTkSuQmCC</item> + <item item-id="33" content-encoding="gzip">H4sIAAAAAAAA/2xTzW7TQBCetZ34p07cpCSlcYhDCFCJC7I4QE8lqhASBaTwAJXrmNZVQ4Lr +oh4jHoAbZy48AuLeB4BXMvPjJAWx0Xhnvv2+nZndjQsACu0dmsO+jl8r+ThOTtLZhwrQeIJm +T2axYAZjz4g2jd8enyVxzgiMWa/ht3pxOh/NrgQ+RDMRGK+Ir9F20farAH3k/zLXMY07ZVEa +aDo7zVXy53mepceXeaKYuYfmwc1h7A3+iiu8gZFnSeIzEKLV5uxWw51rgEXFDL9dU3ZLZtOW +2XJktjdCDZPkeD6aUqh3w6+vUOdAjRd+uMsFgDpLFrYXUl2jOkKb7H6uc8pG2PyN61aTlZMG +KV8CbIVfsKRFA24x/n2L8BErWrKj2ZZiWtsyt28z89M2534MsMPxz1UMHRG2fSmlg1BXSunI +KUvQ4qAn5Gogu/f6Mgd3pfX+ssOBtN6He9L6YN36ULYI7ku+IUIPJMWQUzyU1nrL1nb5qXiT +8Ogki+anR+9n2TTKTWmaXhzDB1EeyU12yhvVsBh+pXSxT9EesU+RE12lFy94H3mlXboSVXId +hgr8ger+Hz1corBGl5ubeRbFSXig85JfEgO1CcpXBXlK+dhSEShN+TpKA6Ur3ygIMZADBToV +5Cz2calKHFKZzEHHIg6RbdqH5A5yWL6BHJa7yGF5jXOhU2cOOh5xiCzlem8up0mWxtG5HIjF +ZeNbgwmk+NPLv45TnuY/w70Z/AEAAP//AwCSUjB4JgQAAA==</item> + <item item-id="34">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</item> + <item item-id="35">iVBORw0KGgoAAAANSUhEUgAAAEYAAAARCAYAAABgpdrLAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +APdJREFUWEftl9EShSAIROv/P7pbza0hBHbRfLDRmV4SZD0g2brtY5mjJHCAmaMksEwoNoEJ +xqmMG8x+yI5ecz7XsN7JObmm9utViTIOiqFtU77e5jwA/2b90KSBWjZoE8y8Fcfz85LMxDn1 +Z8F41K33mQzRgkVFR1C8BNJxMmCijWaAseIsOwb2ZfPqUZJ9xSpHlCU9j2BG8WrARL2OgXq3 +kC9VDKqQYcBY1YLEt1QgWvtRJF+qGHSMq8Aw95iowXqf0owY1JQtjdHVQPeb1OceiUFZiPzf +hJLV2Wpf9UvAbJixaRXf078KDLrZjg6luPn2zMBoa/8AV3AG3EVO1YsAAAAASUVORK5C +YII=</item> + <item item-id="36" content-encoding="gzip">H4sIAAAAAAAA/2xTXW8SURCdu7uwy5aPgqLAghQQ8SNpysZE7VNtGqOx1gR/QLOFtWBEkC6m +j8T/4LMv/gTju79LDZ47s6XUeMnsnTn3nJnZ4W6aiBTsDcxl38TTCT/2wtPR5EOC9HoISw0m +fcEsxp5o2rj/+uRd2I8YoR7rDTyTZ8Pp/uRc4EOYDaC3Ir6ClWBDh2gb/D+py1ivdtyUQYbJ +TmFV/GkUzUYn8yhUzNyF5Wh9WbvNK3GCE1jRLAw9BnxYZspu0i//JFokbP8r9r2kI7udkt1x +ZU9t+AaKRJiPpcwubeuBpP0vL6F1KcOH39Prh0RZli5SOV/3t58FtMnu5yyXzvv2L5w7BT/x +GyXy1zjLoEBkGi9oTnRd0gIwlHoERZGZi/wNaaYIpjK6tEN0U6iC+PyCmKc0YJflHUoV2cse +kz9VOC/EVY5/rGKqibB8SzqvAapL5zVOvCVBiYOGkJNNyd5oyd68LU22MH9ldTGSHd1oW2bW +ojvScfvqMVFH0jXvSu0OoHtSrsPl7rPuW2M1JXrA9y038I9PZ8F0ePx2MhsHkc3sor62DB8E +USDXoRJfC2MLDzO+Z485kfZ15Abno7NnnEeuelX/nyrmugwt8SNV/T96eIHSJXqR3I5mQT/0 +D0w+8mJiXW2S8tRSe0p5eKVlXRnKMyGtK1N51lIjFji0hJMAZ7GHo6TmaJXNHDiO5mhySufR +chcclm+Aw/I0OCzPcC04WebAyWmOJku7uaP5OJyN+sF7GYh8oM9hAxrhZ8bfnxtP85+VXg/+ +AgAA//8DAL4Ui89rBAAA</item> + <item item-id="37">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 +dgAAAABJRU5ErkJggg==</item> + </binaryContent> +</worksheet> \ No newline at end of file diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/R \320\261\320\276\320\273\321\214\321\210\320\265 R_kp.png" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/R \320\261\320\276\320\273\321\214\321\210\320\265 R_kp.png" new file mode 100644 index 0000000..ac79a23 Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/R \320\261\320\276\320\273\321\214\321\210\320\265 R_kp.png" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/R \320\274\320\265\320\275\321\214\321\210\320\265 R_kp.png" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/R \320\274\320\265\320\275\321\214\321\210\320\265 R_kp.png" new file mode 100644 index 0000000..5649cc5 Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/R \320\274\320\265\320\275\321\214\321\210\320\265 R_kp.png" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/R=R_kp.png" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/R=R_kp.png" new file mode 100644 index 0000000..cc9a0dc Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/R=R_kp.png" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\224\320\273\321\217 \320\275\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\320\270.txt" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\224\320\273\321\217 \320\275\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\320\270.txt" new file mode 100644 index 0000000..903395d --- /dev/null +++ "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\224\320\273\321\217 \320\275\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\320\270.txt" @@ -0,0 +1,22 @@ + A.BAX.set(0,0); + A.BAX.set(0.9,0.9); + A.BAX.set(4,1.1); + *A.R[0] = 1e-3; + *A.R[1] = 1e-3; +bool tstA::update_sources(bool force_update){ *E[2] = sin(100*M_PI*TIME); return true;} + + A.BAX.set(-100,-200); + A.BAX.set(0,0); + A.BAX.set(0.5,0.0625); + A.BAX.set(0.67,0.125); + A.BAX.set(0.77,0.167); + A.BAX.set(0.89,0.333); + A.BAX.set(7.8,42.56) + + + A.BAX.set(0,0); + A.BAX.set(0.5,0.0625); + A.BAX.set(0.67,0.125); + A.BAX.set(0.77,0.167); + A.BAX.set(0.89,0.333); + A.BAX.set(7.8,42.56) \ No newline at end of file diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217.htm" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217.htm" new file mode 100644 index 0000000..4606911 --- /dev/null +++ "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217.htm" @@ -0,0 +1,71 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html><head> +<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> +<meta name="copyright" content="© 2002 MBLab computer software"> +<title>Выбор аппроксимирующей функции + + + +
+

Выбор аппроксимирующей функции +
+

+ +

+ +         Для + аппроксимации кривых намагничивания магнитопроводов трансформаторов +желательно применять аналитические функции, которые не содержат сложные +многочлены. В работе [18] + представлены наиболее часто используемые функции, имеющие одну или две +постоянные (см. таблицу 2.1). Применение той или иной формулы зависит от + конкретных условий моделирования процесса намагничивания. Некоторые +формулы достаточно точно аппроксимируют кривую намагничивания в +начальной части, другие - на ее "колене". +
+ +
+

Таблица 2.1 +
+

Формулы аппpоксимации основной кривой намагничивания с одной и двумя постоянными +
+
tabl15.gif +
+

+         Наиболее полно требованиям к аппроксимирующим функциям удовлетворяет формула арктангенса с тремя коэффициентами и линейным членом [63]: +
+
embdim265.gif.(2.1) + 
+
         Она + обеспечивает достаточно точное приближение на всех характерных участках + кривой намагничивания, а ее производная имеет относительно простое +математическое описание +
+
embdim266.gif.(2.2) + 
+
         Так как коэффициенты аппроксимации embdim267.gif, embdim268.gif, embdim269.gif + всегда положительные величины отличные от нуля, то в операциях деления, + при численном интегрировании систем нелинейных дифференциальных +уравнений, при любом значении напряженности embdim270.gif производная не равна нулю, что повышает вычислительную устойчивость системы. +
+         На рис. 2.1 и 2.2 +представлены аппроксимации кривой намагничивания выбранной функцией +электротехнической стали марки М3411 и магнитопровода трансформатора +напряжения НКФ-220. +
+ +
+

risyn31.gif +
+

Pис. 2.1. Аппроксимация кривой намагничивания электротехнической стали М3411 функцией embdim271.gif: embdim272.gif= 1,05536; embdim273.gif= 0,008687; embdim274.gif= 9,1927е-5. +
+
+
+

risyn32.gif +
+

Pис. 2.2. Аппроксимация кривой намагничивания трансформатора напряжения НКФ-220 функцией embdim275.gif: embdim276.gif= 506,976; embdim277.gif= 15,61; embdim278.gif= 74,234. +
+
+ + +
\ No newline at end of file diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/btnleft.gif" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/btnleft.gif" new file mode 100644 index 0000000..37e2087 Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/btnleft.gif" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/btnright.gif" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/btnright.gif" new file mode 100644 index 0000000..f881d36 Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/btnright.gif" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/btnup.gif" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/btnup.gif" new file mode 100644 index 0000000..e2c53b3 Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/btnup.gif" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim265.gif" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim265.gif" new file mode 100644 index 0000000..571f44e Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim265.gif" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim266.gif" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim266.gif" new file mode 100644 index 0000000..fb743fa Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim266.gif" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim267.gif" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim267.gif" new file mode 100644 index 0000000..c703ec4 Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim267.gif" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim268.gif" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim268.gif" new file mode 100644 index 0000000..9cbf662 Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim268.gif" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim269.gif" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim269.gif" new file mode 100644 index 0000000..0d626b7 Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim269.gif" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim270.gif" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim270.gif" new file mode 100644 index 0000000..2d51f28 Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim270.gif" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim271.gif" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim271.gif" new file mode 100644 index 0000000..99f2993 Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim271.gif" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim272.gif" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim272.gif" new file mode 100644 index 0000000..604ae1a Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim272.gif" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim273.gif" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim273.gif" new file mode 100644 index 0000000..2d841c6 Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim273.gif" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim274.gif" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim274.gif" new file mode 100644 index 0000000..0d626b7 Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim274.gif" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim275.gif" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim275.gif" new file mode 100644 index 0000000..59d7dde Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim275.gif" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim276.gif" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim276.gif" new file mode 100644 index 0000000..604ae1a Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim276.gif" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim277.gif" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim277.gif" new file mode 100644 index 0000000..2d841c6 Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim277.gif" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim278.gif" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim278.gif" new file mode 100644 index 0000000..0d626b7 Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/embdim278.gif" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/risyn31.gif" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/risyn31.gif" new file mode 100644 index 0000000..369567b Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/risyn31.gif" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/risyn32.gif" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/risyn32.gif" new file mode 100644 index 0000000..f981e8c Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/risyn32.gif" differ diff --git "a/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/tabl15.gif" "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/tabl15.gif" new file mode 100644 index 0000000..23526b7 Binary files /dev/null and "b/Docs/\320\235\320\265\320\273\320\270\320\275\320\265\320\271\320\275\320\276\321\201\321\202\321\214/\320\232\321\200\320\270\320\262\320\260\321\217 \320\275\320\260\320\274\320\260\320\263\320\275\320\270\321\207\320\270\320\262\320\260\320\275\320\270\321\217_files/tabl15.gif" differ diff --git "a/Docs/\320\240\320\260\321\201\321\207\320\265\321\202 \321\201\320\276\320\277\321\200\320\276\321\202\320\270\320\262\320\273\320\265\320\275\320\270\321\217 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200\320\260.xmcd" "b/Docs/\320\240\320\260\321\201\321\207\320\265\321\202 \321\201\320\276\320\277\321\200\320\276\321\202\320\270\320\262\320\273\320\265\320\275\320\270\321\217 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200\320\260.xmcd" new file mode 100644 index 0000000..8889c58 --- /dev/null +++ "b/Docs/\320\240\320\260\321\201\321\207\320\265\321\202 \321\201\320\276\320\277\321\200\320\276\321\202\320\270\320\262\320\273\320\265\320\275\320\270\321\217 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200\320\260.xmcd" @@ -0,0 +1,6502 @@ + + + + + + Mathcad Professional 14.0 + + + <description/> + <author>РЇ</author> + <company>Parametric Technology Corporation</company> + <keywords/> + <revisedBy>MFISoft</revisedBy> + </userData> + <identityInfo> + <revision>111</revision> + <documentID>4E5EF83F-B829-432C-9E03-573F2C11705C</documentID> + <versionID>962D0F05-948E-4CE6-9CEF-FB3209D95B3F</versionID> + <parentVersionID>00000000-0000-0000-0000-000000000000</parentVersionID> + <branchID>00000000-0000-0000-0000-000000000000</branchID> + </identityInfo> + </metadata> + <settings> + <presentation> + <textRendering> + <textStyles> + <textStyle name="Normal"> + <blockAttr margin-left="0" margin-right="0" text-indent="inherit" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Heading 1"> + <blockAttr margin-left="0" margin-right="0" text-indent="inherit" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="14" font-weight="bold" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Heading 2"> + <blockAttr margin-left="0" margin-right="0" text-indent="inherit" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="12" font-weight="bold" font-style="italic" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Heading 3"> + <blockAttr margin-left="0" margin-right="0" text-indent="inherit" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="12" font-weight="normal" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Paragraph"> + <blockAttr margin-left="0" margin-right="0" text-indent="21" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="List"> + <blockAttr margin-left="14.25" margin-right="0" text-indent="-14.25" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Indent"> + <blockAttr margin-left="108" margin-right="0" text-indent="inherit" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Title"> + <blockAttr margin-left="0" margin-right="0" text-indent="inherit" text-align="center" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Times New Roman" font-charset="0" font-size="24" font-weight="bold" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Subtitle" base-style="Title"> + <blockAttr margin-left="0" margin-right="0" text-indent="inherit" text-align="center" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Times New Roman" font-charset="0" font-size="18" font-weight="normal" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + </textStyles> + </textRendering> + <mathRendering equation-color="#000"> + <operators multiplication="narrow-dot" derivative="derivative" literal-subscript="large" definition="colon-equal" global-definition="triple-equal" local-definition="left-arrow" equality="bold-equal" symbolic-evaluation="right-arrow"/> + <mathStyles> + <mathStyle name="Variables" font-family="Times New Roman" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="Constants" font-family="Times New Roman" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="User 1" font-family="Arial" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="User 2" font-family="Courier New" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="User 3" font-family="Arial" font-charset="0" font-size="10" font-weight="bold" font-style="normal" underline="false"/> + <mathStyle name="User 4" font-family="Times New Roman" font-charset="0" font-size="10" font-weight="normal" font-style="italic" underline="false"/> + <mathStyle name="User 5" font-family="Times New Roman" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="User 6" font-family="Arial" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="User 7" font-family="Times New Roman" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="Math Text Font" font-family="Times New Roman" font-charset="0" font-size="14" font-weight="normal" font-style="normal" underline="false"/> + </mathStyles> + <dimensionNames mass="mass" length="length" time="time" current="current" thermodynamic-temperature="temperature" luminous-intensity="luminosity" amount-of-substance="substance" display="false"/> + <symbolics derivation-steps-style="vertical-insert" show-comments="false" evaluate-in-place="false"/> + <results numeric-only="true"> + <general precision="3" show-trailing-zeros="false" radix="dec" complex-threshold="10" zero-threshold="15" imaginary-value="i" exponential-threshold="2"/> + <matrix display-style="auto" expand-nested-arrays="false"/> + <unit format-units="true" simplify-units="true" fractional-unit-exponent="false"/> + </results> + </mathRendering> + <pageModel show-page-frame="false" show-header-frame="false" show-footer-frame="false" header-footer-start-page="1" paper-code="9" orientation="portrait" print-single-page-width="false" page-width="595.5" page-height="841.5"> + <margins left="86.4" right="86.4" top="86.4" bottom="86.4"/> + <header use-full-page-width="false"/> + <footer use-full-page-width="false"/> + </pageModel> + <colorModel background-color="#fff" default-highlight-color="#ffff80"/> + <language math="en" UI="en"/> + </presentation> + <calculation> + <builtInVariables array-origin="0" convergence-tolerance="0.001" constraint-tolerance="0.001" random-seed="1" prn-precision="4" prn-col-width="8"/> + <calculationBehavior automatic-recalculation="true" matrix-strict-singularity-check="true" optimize-expressions="false" exact-boolean="true" strings-use-origin="false" zero-over-zero="0"> + <compatibility multiple-assignment="MC12" local-assignment="MC12"/> + </calculationBehavior> + <units> + <currentUnitSystem name="si" customized="false"/> + </units> + </calculation> + <editor view-annotations="false" view-regions="false"> + <ruler is-visible="false" ruler-unit="cm"/> + <plotTemplate> + <xy item-idref="1"/> + </plotTemplate> + <grid granularity-x="6" granularity-y="6"/> + </editor> + <fileFormat image-type="image/png" image-quality="75" save-numeric-results="true" exclude-large-results="false" save-text-images="false" screen-dpi="96"/> + <miscellaneous> + <handbook handbook-region-tag-ub="4775" can-delete-original-handbook-regions="true" can-delete-user-regions="true" can-print="true" can-copy="true" can-save="true" file-permission-mask="4294967295"/> + </miscellaneous> + </settings> + <regions> + <region region-id="2" left="6" top="2.25" width="198" height="12" align-x="11.25" align-y="12" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="false"> + <p style="Normal" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">Для однофазного трансформатора запишем</p> + </text> + </region> + <region region-id="92" left="336" top="1.5" width="33" height="14.25" align-x="345" align-y="12" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve">j</ml:id> + <ml:apply> + <ml:sqrt/> + <ml:real>-1</ml:real> + </ml:apply> + </ml:define> + </math> + <rendering item-idref="2"/> + </region> + <region region-id="39" left="6" top="27" width="45" height="16.5" align-x="34.5" align-y="36" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="РЅРѕРј">S</ml:id> + <ml:real>10</ml:real> + </ml:define> + </math> + <rendering item-idref="3"/> + </region> + <region region-id="52" left="6" top="45" width="55.5" height="16.5" align-x="40.5" align-y="54" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">U</ml:id> + <ml:real>115</ml:real> + </ml:define> + </math> + <rendering item-idref="4"/> + </region> + <region region-id="53" left="6" top="63" width="51" height="16.5" align-x="40.5" align-y="72" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="2РЅРѕРј">U</ml:id> + <ml:real>11</ml:real> + </ml:define> + </math> + <rendering item-idref="5"/> + </region> + <region region-id="54" left="6" top="81" width="47.25" height="16.5" align-x="30" align-y="90" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="Рє%">u</ml:id> + <ml:real>10.5</ml:real> + </ml:define> + </math> + <rendering item-idref="6"/> + </region> + <region region-id="55" left="6" top="99" width="52.5" height="16.5" align-x="30.75" align-y="108" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="РєР·">dP</ml:id> + <ml:real>0.058</ml:real> + </ml:define> + </math> + <rendering item-idref="7"/> + </region> + <region region-id="77" left="6" top="117" width="34.5" height="16.5" align-x="21.75" align-y="126" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="xx">i</ml:id> + <ml:real>0.9</ml:real> + </ml:define> + </math> + <rendering item-idref="8"/> + </region> + <region region-id="79" left="6" top="135" width="51.75" height="16.5" align-x="30" align-y="144" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="xx">dP</ml:id> + <ml:real>0.014</ml:real> + </ml:define> + </math> + <rendering item-idref="9"/> + </region> + <region region-id="56" left="6" top="152.25" width="270" height="12" align-x="34.5" align-y="162" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="false"> + <p style="Normal" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">Номинальное напряжение РЅР° обмотке высшего напряжения</p> + </text> + </region> + <region region-id="57" left="6" top="166.5" width="135.75" height="33" align-x="60.75" align-y="186" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="1РЅРѕРј_фаз">U</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">U</ml:id> + <ml:apply> + <ml:sqrt/> + <ml:real>3</ml:real> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>66.395280956806971</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="10"/> + </region> + <region region-id="1799" left="12" top="208.5" width="131.25" height="33" align-x="66.75" align-y="228" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="2РЅРѕРј_фаз">U</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="2РЅРѕРј">U</ml:id> + <ml:apply> + <ml:sqrt/> + <ml:real>3</ml:real> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>6.3508529610858835</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="11"/> + </region> + <region region-id="82" left="6" top="254.25" width="103.5" height="12" align-x="35.25" align-y="264" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="false"> + <p style="Normal" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">Номинальные токи фаз</p> + </text> + </region> + <region region-id="84" left="6" top="274.5" width="149.25" height="36.75" align-x="36.75" align-y="294" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">I</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="РЅРѕРј">S</ml:id> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:sqrt/> + <ml:real>3</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">U</ml:id> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.0502043712338805</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="12"/> + </region> + <region region-id="88" left="6" top="316.5" width="121.5" height="36.75" align-x="36.75" align-y="336" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="2РЅРѕРј">I</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="РЅРѕРј">S</ml:id> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:sqrt/> + <ml:real>3</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="2РЅРѕРј">U</ml:id> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.524863881081478</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="13"/> + </region> + <region region-id="86" left="6" top="362.25" width="154.5" height="12" align-x="37.5" align-y="372" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="false"> + <p style="Normal" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">Активные сопротивления обмоток </p> + </text> + </region> + <region region-id="59" left="6" top="376.5" width="128.25" height="47.25" align-x="31.5" align-y="402" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="СЃРєРІ">R</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="РєР·">dP</ml:id> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">U</ml:id> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="РЅРѕРј">S</ml:id> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>7.6705000000000005</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="14"/> + </region> + <region region-id="64" left="6" top="424.5" width="84" height="31.5" align-x="22.5" align-y="444" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="1">R</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="СЃРєРІ">R</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>3.8352500000000003</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="15"/> + </region> + <region region-id="70" left="6" top="460.5" width="167.25" height="41.25" align-x="22.5" align-y="486" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="2">R</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="СЃРєРІ">R</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <ml:apply> + <ml:pow/> + <ml:parens> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="2РЅРѕРј">U</ml:id> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">U</ml:id> + </ml:apply> + </ml:parens> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.03509</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="16"/> + </region> + <region region-id="65" left="6" top="506.25" width="138.75" height="12" align-x="31.5" align-y="516" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="false"> + <p style="Normal" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">Напряжение РЅР° фазе РїСЂРё Рѕ.Рє.Р·.</p> + </text> + </region> + <region region-id="66" left="6" top="520.5" width="139.5" height="31.5" align-x="27.75" align-y="540" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="1Рє">U</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рє%">u</ml:id> + <ml:real>100</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="1РЅРѕРј_фаз">U</ml:id> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>6.9715045004647314</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="17"/> + </region> + <region region-id="73" left="6" top="560.25" width="87" height="12" align-x="13.5" align-y="570" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="false"> + <p style="Normal" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">РўРѕРє холостого С…РѕРґР°</p> + </text> + </region> + <region region-id="75" left="6" top="574.5" width="138" height="31.5" align-x="22.5" align-y="594" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="xx">I</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="xx">i</ml:id> + <ml:real>100</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">I</ml:id> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.00045183934110492457</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="18"/> + </region> + <region region-id="1042" left="6" top="620.25" width="105" height="12" align-x="21.75" align-y="630" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="false"> + <p style="Normal" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">Порери холостого С…РѕРґР°</p> + </text> + </region> + <region region-id="1045" left="6" top="636" width="207" height="25.5" align-x="31.5" align-y="654" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="xx">dQ</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:sqrt/> + <ml:apply> + <ml:minus/> + <ml:apply> + <ml:pow/> + <ml:parens> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:sqrt/> + <ml:real>3</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="xx">I</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">U</ml:id> + </ml:apply> + </ml:parens> + <ml:real>2</ml:real> + </ml:apply> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="xx">dP</ml:id> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.088904443083571483</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="19"/> + </region> + <region region-id="1815" left="6" top="680.25" width="103.5" height="12" align-x="30" align-y="690" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="false"> + <p style="Normal" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">Реактивные потери РѕРєР·</p> + </text> + </region> + <region region-id="1820" left="6" top="693" width="223.5" height="39" align-x="32.25" align-y="720" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="РєР·">dQ</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:sqrt/> + <ml:apply> + <ml:minus/> + <ml:apply> + <ml:pow/> + <ml:parens> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:sqrt/> + <ml:real>3</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">I</ml:id> + </ml:apply> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рє%">u</ml:id> + <ml:real>100</ml:real> + </ml:apply> + </ml:apply> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">U</ml:id> + </ml:apply> + </ml:parens> + <ml:real>2</ml:real> + </ml:apply> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="РєР·">dP</ml:id> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>1.0483968714184526</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="20"/> + </region> + <region region-id="1711" left="0" top="740.25" width="139.5" height="12" align-x="23.25" align-y="750" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="false"> + <p style="Normal" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">Параметры первичной обмотки</p> + </text> + </region> + <region region-id="1702" left="6" top="765" width="30" height="16.5" align-x="24" align-y="774" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:real>0</ml:real> + </ml:define> + </math> + <rendering item-idref="21"/> + </region> + <region region-id="1703" left="54" top="765" width="112.5" height="16.5" align-x="154.5" align-y="774" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="мДобавление1РїСЂРѕРёСЃ">X</ml:id> + <ml:real>0</ml:real> + </ml:define> + </math> + <rendering item-idref="22"/> + </region> + <region region-id="1704" left="114" top="765" width="30.75" height="16.5" align-x="132.75" align-y="774" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u">X</ml:id> + <ml:real>0</ml:real> + </ml:define> + </math> + <rendering item-idref="23"/> + </region> + <region region-id="1705" left="162" top="765" width="29.25" height="16.5" align-x="179.25" align-y="774" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <ml:real>0</ml:real> + </ml:define> + </math> + <rendering item-idref="24"/> + </region> + <region region-id="1706" left="210" top="765" width="26.25" height="16.5" align-x="224.25" align-y="774" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + <ml:real>1</ml:real> + </ml:define> + </math> + <rendering item-idref="25"/> + </region> + <region region-id="2766" left="300" top="765" width="33" height="16.5" align-x="321" align-y="774" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u.Рє">I</ml:id> + <ml:real>2</ml:real> + </ml:define> + </math> + <rendering item-idref="26"/> + </region> + <region region-id="2827" left="408" top="765" width="51" height="16.5" align-x="426.75" align-y="774" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="2РЅ">I</ml:id> + <ml:id xml:space="preserve" subscript="2РЅРѕРј">I</ml:id> + </ml:define> + </math> + <rendering item-idref="27"/> + </region> + <region region-id="2849" left="492" top="765" width="36.75" height="16.5" align-x="516.75" align-y="774" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="Рј2">X</ml:id> + <ml:real>0</ml:real> + </ml:define> + </math> + <rendering item-idref="28"/> + </region> + <region region-id="2891" left="564" top="765" width="30" height="16.5" align-x="582" align-y="774" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="2">X</ml:id> + <ml:real>0</ml:real> + </ml:define> + </math> + <rendering item-idref="29"/> + </region> + <region region-id="3629" left="30" top="813" width="202.5" height="48.75" align-x="48" align-y="846" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:apply> + <ml:div/> + <ml:real>1</ml:real> + <ml:real>2</ml:real> + </ml:apply> + <ml:apply> + <ml:sqrt/> + <ml:apply> + <ml:minus/> + <ml:apply> + <ml:pow/> + <ml:parens> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рє%">u</ml:id> + <ml:real>100</ml:real> + </ml:apply> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">U</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="РЅРѕРј">S</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + <ml:real>2</ml:real> + </ml:apply> + <ml:apply> + <ml:pow/> + <ml:parens> + <ml:id xml:space="preserve" subscript="СЃРєРІ">R</ml:id> + </ml:parens> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>69.325243122545189</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="30"/> + </region> + <region region-id="3696" left="30" top="865.5" width="158.25" height="56.25" align-x="47.25" align-y="900" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:minus/> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="xx">dP</ml:id> + <ml:real>3</ml:real> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="xx">I</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="1">R</ml:id> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.0046658836666666672</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="31"/> + </region> + <region region-id="3806" left="30" top="928.5" width="149.25" height="35.25" align-x="65.25" align-y="948" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u.РїРѕС‚">X</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="xx">dQ</ml:id> + <ml:id xml:space="preserve" subscript="xx">dP</ml:id> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.029629842062695179</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="32"/> + </region> + <region region-id="4083" left="18" top="992.25" width="108" height="12" align-x="31.5" align-y="1002" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="false"> + <p style="Normal" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">Расчет для компьютера</p> + </text> + </region> + <region region-id="4071" left="492" top="998.25" width="207.75" height="12" align-x="507.75" align-y="1008" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="true"> + <p style="Normal" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">РќР° этой половине Рассчет РІ векторной форме</p> + </text> + </region> + <region region-id="4087" left="18" top="1004.25" width="83.25" height="29.25" align-x="42" align-y="1020" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="СЃРІ1">k</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:real>1</ml:real> + <ml:apply> + <ml:sqrt/> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.70710678118654746</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="33"/> + </region> + <region region-id="4072" left="516" top="1029" width="24" height="12.75" align-x="527.25" align-y="1038" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:id xml:space="preserve" xmlns:ml="http://schemas.mathsoft.com/math30">Given</ml:id> + </math> + <rendering item-idref="34"/> + </region> + <region region-id="4073" left="570" top="1053" width="33.75" height="16.5" align-x="592.5" align-y="1062" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:apply> + <ml:absval/> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + </ml:apply> + <ml:real>1</ml:real> + </ml:apply> + </math> + <rendering item-idref="35"/> + </region> + <region region-id="4088" left="18" top="1048.5" width="126" height="35.25" align-x="42.75" align-y="1068" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="1РЅРѕРј_фаз">U</ml:id> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>66.395280956806971</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="36"/> + </region> + <region region-id="4074" left="570" top="1072.5" width="231" height="45" align-x="684.75" align-y="1110" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="1РЅРѕРј_фаз">U</ml:id> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve">e</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:apply> + <ml:id xml:space="preserve">atan</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="xx">dQ</ml:id> + <ml:id xml:space="preserve" subscript="xx">dP</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="xx">I</ml:id> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="1">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </math> + <rendering item-idref="37"/> + </region> + <region region-id="4089" left="18" top="1102.5" width="129" height="47.25" align-x="36.75" align-y="1128" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u">X</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="СЃРІ1">k</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>127.17830143172499</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="38"/> + </region> + <region region-id="4075" left="576" top="1125" width="46.5" height="16.5" align-x="611.25" align-y="1134" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:apply> + <ml:id xml:space="preserve">Im</ml:id> + <ml:id xml:space="preserve" subscript="u">X</ml:id> + </ml:apply> + <ml:real>0</ml:real> + </ml:apply> + </math> + <rendering item-idref="39"/> + </region> + <region region-id="4076" left="642" top="1125" width="29.25" height="16.5" align-x="660" align-y="1134" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:greaterThan/> + <ml:id xml:space="preserve" subscript="u">X</ml:id> + <ml:real>0</ml:real> + </ml:apply> + </math> + <rendering item-idref="40"/> + </region> + <region region-id="4077" left="696" top="1125" width="143.25" height="16.5" align-x="828" align-y="1134" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + <ml:parens> + <ml:apply> + <ml:minus/> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="u.РїРѕС‚">X</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="xx">I</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + </ml:apply> + <ml:real>0</ml:real> + </ml:apply> + </math> + <rendering item-idref="41"/> + </region> + <region region-id="4078" left="582" top="1154.25" width="82.5" height="29.25" align-x="606" align-y="1170" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:div/> + <ml:real>1</ml:real> + <ml:apply> + <ml:sqrt/> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:sqrt/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:id xml:space="preserve" subscript="u">X</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + </math> + <rendering item-idref="42"/> + </region> + <region region-id="4079" left="516" top="1229.25" width="215.25" height="57" align-x="555" align-y="1260" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:matrix rows="3" cols="1"> + <ml:id xml:space="preserve" subscript="u">X</ml:id> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + </ml:matrix> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:Minerr auto-method="true" method="levenberg" derivative-estimation="central" variable-estimation="tangent" linear-check="false" multistart="false" evolutionary="false"/> + <ml:sequence> + <ml:id xml:space="preserve" subscript="u">X</ml:id> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + </ml:sequence> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:matrix rows="3" cols="1"> + <ml:complex> + <ml:real>127.05889563552036</ml:real> + <ml:imag>-5.4143587342957219E-23</ml:imag> + </ml:complex> + <ml:complex> + <ml:real>66.364104871589063</ml:real> + <ml:imag>6.3276604566136292E-23</ml:imag> + </ml:complex> + <ml:complex> + <ml:real>0.98781920004207469</ml:real> + <ml:imag>-0.1556025191426767</ml:imag> + </ml:complex> + </ml:matrix> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="43"/> + </region> + <region region-id="4080" left="510" top="1298.25" width="323.25" height="12" align-x="538.5" align-y="1308" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="true"> + <p style="Normal" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">Коэффициент магнитной СЃРІСЏР·Рё обмотоки Р’Рќ СЃ магнитопроводом</p> + </text> + </region> + <region region-id="4081" left="546" top="1312.5" width="101.25" height="36.75" align-x="569.25" align-y="1332" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:id xml:space="preserve" subscript="СЃРІ1">k</ml:id> + <ml:parens> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + <ml:apply> + <ml:sqrt/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:id xml:space="preserve" subscript="u">X</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:eval> + </ml:parens> + </ml:apply> + </math> + <rendering item-idref="44"/> + </region> + <region region-id="4090" left="642" top="1377" width="268.5" height="22.5" align-x="774" align-y="1392" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + <ml:parens> + <ml:apply> + <ml:minus/> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="u.РїРѕС‚">X</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="xx">I</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:complex> + <ml:real>-1.42859565896436E-06</ml:real> + <ml:imag>-9.0367181076536629E-06</ml:imag> + </ml:complex> + </result> + </ml:eval> + </math> + <rendering item-idref="45"/> + </region> + <region region-id="4029" left="12" top="1430.25" width="432.75" height="12" align-x="19.5" align-y="1440" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="true"> + <p style="Normal" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">Так как индуктивность обмотки РІ первом приближении пропорциональна квадрату числа витков</p> + </text> + </region> + <region region-id="3725" left="582" top="1431" width="162" height="16.5" align-x="726.75" align-y="1440" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math error="This value must be a function, but has the form: Unitless." optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <ml:apply> + <ml:id xml:space="preserve">j</ml:id> + <ml:apply> + <ml:minus/> + <ml:id xml:space="preserve" subscript="u">X</ml:id> + <ml:id xml:space="preserve" subscript="u">X</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="xx">I</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + </ml:apply> + </ml:eval> + </math> + <rendering item-idref="46"/> + </region> + <region region-id="3403" left="582" top="1461" width="99.75" height="16.5" align-x="626.25" align-y="1470" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + <ml:apply> + <ml:absval/> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + </ml:apply> + </ml:apply> + <ml:id xml:space="preserve" subscript="1РЅРѕРј_фаз">U</ml:id> + </ml:apply> + </math> + <rendering item-idref="47"/> + </region> + <region region-id="4030" left="60" top="1450.5" width="126" height="41.25" align-x="78" align-y="1476" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="2">X</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:apply> + <ml:pow/> + <ml:parens> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="2РЅРѕРј">U</ml:id> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">U</ml:id> + </ml:apply> + </ml:parens> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.634280107208164</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="48"/> + </region> + <region region-id="3407" left="582" top="1504.5" width="360" height="31.5" align-x="869.25" align-y="1524" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="xx">I</ml:id> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="xx">I</ml:id> + <ml:id xml:space="preserve" subscript="1">R</ml:id> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="xx">I</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="u">X</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="xx">I</ml:id> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:div/> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="xx">dP</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="xx">dQ</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + <ml:real>3</ml:real> + </ml:apply> + </ml:apply> + </math> + <rendering item-idref="49"/> + </region> + <region region-id="3987" left="12" top="1520.25" width="444" height="24" align-x="29.25" align-y="1530" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="true"> + <p style="Normal" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">Считаем счо магнитная СЃРІСЏР·СЊ обмотки Р’Рќ Рё магнитовпровода такая, же как Рё Сѓ РѕР±Рј. РќРќ Рё магнитопровода</p> + </text> + </region> + <region region-id="3396" left="582" top="1545" width="201" height="16.5" align-x="591.75" align-y="1554" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:real>0</ml:real> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="u.Рє">I</ml:id> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="u">X</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">I</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="2РЅ">I</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="Рј2">X</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </math> + <rendering item-idref="50"/> + </region> + <region region-id="3988" left="66" top="1555.5" width="125.25" height="18" align-x="90.75" align-y="1566" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="Рј2">X</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="СЃРІ1">k</ml:id> + <ml:apply> + <ml:sqrt/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="2">X</ml:id> + <ml:id xml:space="preserve" subscript="u">X</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:complex> + <ml:real>6.347870900760693</ml:real> + <ml:imag>-1.3525086175118223E-24</ml:imag> + </ml:complex> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="51"/> + </region> + <region region-id="3397" left="582" top="1575" width="201" height="16.5" align-x="591.75" align-y="1584" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:real>0</ml:real> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="u.Рє">I</ml:id> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="u">X</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">I</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="2РЅ">I</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="Рј2">X</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </math> + <rendering item-idref="52"/> + </region> + <region region-id="2299" left="6" top="1578.75" width="102" height="13.5" align-x="25.5" align-y="1590" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="true"> + <p style="Heading 3" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">Проверка: </p> + </text> + </region> + <region region-id="4041" left="246" top="1570.5" width="303" height="35.25" align-x="412.5" align-y="1590" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + <ml:parens> + <ml:apply> + <ml:minus/> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="u.РїРѕС‚">X</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">U</ml:id> + <ml:id xml:space="preserve" subscript="2РЅРѕРј">U</ml:id> + </ml:apply> + </ml:apply> + <ml:id xml:space="preserve" subscript="xx">I</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="Рј2">X</ml:id> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:complex> + <ml:real>-1.42859565896436E-06</ml:real> + <ml:imag>-9.0367181076536629E-06</ml:imag> + </ml:complex> + </result> + </ml:eval> + </math> + <rendering item-idref="53"/> + </region> + <region region-id="2613" left="12" top="1604.25" width="265.5" height="12" align-x="17.25" align-y="1614" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="false"> + <p style="Normal" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">1) РџРѕ напряжению холостого С…РѕРґР° РЅР° выводах обмотки РќРќ</p> + </text> + </region> + <region region-id="3419" left="18" top="1629" width="99.75" height="16.5" align-x="62.25" align-y="1638" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="Рј2">X</ml:id> + <ml:apply> + <ml:absval/> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + </ml:apply> + </ml:apply> + <ml:id xml:space="preserve" subscript="2РЅРѕРј_фаз">U</ml:id> + </ml:apply> + </math> + <rendering item-idref="54"/> + </region> + <region region-id="3398" left="582" top="1606.5" width="276.75" height="49.5" align-x="721.5" align-y="1644" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рє%">u</ml:id> + <ml:real>100</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="1РЅРѕРј_фаз">U</ml:id> + </ml:apply> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve">e</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:apply> + <ml:id xml:space="preserve">atan</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="РєР·">dQ</ml:id> + <ml:id xml:space="preserve" subscript="РєР·">dP</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">I</ml:id> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="1">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="u.Рє">I</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </math> + <rendering item-idref="55"/> + </region> + <region region-id="2301" left="84" top="1659" width="77.25" height="16.5" align-x="128.25" align-y="1668" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="Рј2">X</ml:id> + <ml:apply> + <ml:absval/> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:complex> + <ml:real>6.3478674600084162</ml:real> + <ml:imag>-1.3525078844082073E-24</ml:imag> + </ml:complex> + </result> + </ml:eval> + </math> + <rendering item-idref="56"/> + </region> + <region region-id="2314" left="252" top="1659" width="87" height="16.5" align-x="306" align-y="1668" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="2РЅРѕРј_фаз">U</ml:id> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>6.3508529610858835</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="57"/> + </region> + <region region-id="3399" left="588" top="1665" width="128.25" height="16.5" align-x="597.75" align-y="1674" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:real>0</ml:real> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="2РЅ">I</ml:id> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="2">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="2">X</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="Рј2">X</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </math> + <rendering item-idref="58"/> + </region> + <region region-id="3400" left="588" top="1695" width="99.75" height="16.5" align-x="632.25" align-y="1704" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="Рј2">X</ml:id> + <ml:apply> + <ml:absval/> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + </ml:apply> + </ml:apply> + <ml:id xml:space="preserve" subscript="2РЅРѕРј_фаз">U</ml:id> + </ml:apply> + </math> + <rendering item-idref="59"/> + </region> + <region region-id="2615" left="12" top="1700.25" width="160.5" height="12" align-x="17.25" align-y="1710" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="false"> + <p style="Normal" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">2) РџРѕ потерям короткого замыкания</p> + </text> + </region> + <region region-id="2637" left="24" top="1718.25" width="444" height="24" align-x="44.25" align-y="1728" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="true"> + <p style="Normal" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">Рндукция магнитного поля, обуславливающая потери холостого С…РѕРґР° пропорциональна подведенному напряжению</p> + </text> + </region> + <region region-id="3401" left="588" top="1726.5" width="621" height="31.5" align-x="1134.75" align-y="1746" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">I</ml:id> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">I</ml:id> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="1">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="u.Рє">I</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="u.Рє">I</ml:id> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="u.Рє">I</ml:id> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="u">X</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">I</ml:id> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="Рј2">X</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="2РЅ">I</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="2РЅ">I</ml:id> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="2РЅ">I</ml:id> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="2">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="2">X</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="u.Рє">I</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="Рј2">X</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:div/> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="РєР·">dP</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="РєР·">dQ</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + <ml:real>3</ml:real> + </ml:apply> + </ml:apply> + </math> + <rendering item-idref="60"/> + </region> + <region region-id="3402" left="588" top="1755" width="58.5" height="16.5" align-x="615" align-y="1764" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:apply> + <ml:absval/> + <ml:id xml:space="preserve" subscript="2РЅ">I</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="2РЅРѕРј">I</ml:id> + </ml:apply> + </math> + <rendering item-idref="61"/> + </region> + <region region-id="2638" left="138" top="1750.5" width="69" height="31.5" align-x="156" align-y="1770" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:id xml:space="preserve" subscript="m">B</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="1">E</ml:id> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:real>4.44</ml:real> + <ml:id xml:space="preserve">f</ml:id> + </ml:apply> + <ml:id xml:space="preserve">w</ml:id> + </ml:apply> + <ml:id xml:space="preserve">S</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </math> + <rendering item-idref="62"/> + </region> + <region region-id="2639" left="24" top="1790.25" width="383.25" height="12" align-x="35.25" align-y="1800" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="true"> + <p style="Normal" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">РўРѕРіРґР° потери холостого С…РѕРґР° пропорциональны квадрату подведенного напряжения </p> + </text> + </region> + <region region-id="2640" left="24" top="1808.25" width="418.5" height="24" align-x="31.5" align-y="1818" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="true"> + <p style="Normal" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">Так как ток Iu (РІ контуре магнитопровода) связан СЃ потерями РІ магнитопроводе, то РІ режиме короткого замыкания:</p> + </text> + </region> + <region region-id="2641" left="96" top="1840.5" width="189.75" height="41.25" align-x="220.5" align-y="1866" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:apply> + <ml:equal/> + <ml:id xml:space="preserve" subscript="u.РєР·">I</ml:id> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:pow/> + <ml:parens> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="1Рє">U</ml:id> + <ml:id xml:space="preserve" subscript="1РЅРѕРј_фаз">U</ml:id> + </ml:apply> + </ml:parens> + <ml:real>2</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="u.xx">I</ml:id> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:pow/> + <ml:parens> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рє%">u</ml:id> + <ml:real>100</ml:real> + </ml:apply> + </ml:parens> + <ml:real>2</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="u.xx">I</ml:id> + </ml:apply> + </ml:apply> + </math> + <rendering item-idref="63"/> + </region> + <region region-id="2629" left="12" top="1899.75" width="432" height="56.25" align-x="345" align-y="1944" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:apply> + <ml:equal/> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">I</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="1">R</ml:id> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="2РЅРѕРј">I</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="2">R</ml:id> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:pow/> + <ml:parens> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:pow/> + <ml:parens> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рє%">u</ml:id> + <ml:real>100</ml:real> + </ml:apply> + </ml:parens> + <ml:real>2</ml:real> + </ml:apply> + <ml:apply> + <ml:absval/> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + <ml:real>2</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="РєР·">dP</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="xx">dP</ml:id> + <ml:apply> + <ml:pow/> + <ml:parens> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="1Рє">U</ml:id> + <ml:id xml:space="preserve" subscript="1РЅРѕРј_фаз">U</ml:id> + </ml:apply> + </ml:parens> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:real>3</ml:real> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="РєР·">dP</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="xx">dP</ml:id> + <ml:apply> + <ml:pow/> + <ml:parens> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рє%">u</ml:id> + <ml:real>100</ml:real> + </ml:apply> + </ml:parens> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:real>3</ml:real> + </ml:apply> + </ml:apply> + </math> + <rendering item-idref="64"/> + </region> + <region region-id="2643" left="18" top="1972.5" width="282" height="43.5" align-x="234.75" align-y="2004" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">I</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="1">R</ml:id> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="2РЅРѕРј">I</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="2">R</ml:id> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:pow/> + <ml:parens> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:pow/> + <ml:parens> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рє%">u</ml:id> + <ml:real>100</ml:real> + </ml:apply> + </ml:parens> + <ml:real>2</ml:real> + </ml:apply> + <ml:apply> + <ml:absval/> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + <ml:real>2</ml:real> + </ml:apply> + <ml:apply> + <ml:id xml:space="preserve">Re</ml:id> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.019333900473794376</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="65"/> + </region> + <region region-id="2645" left="330" top="1969.5" width="162.75" height="52.5" align-x="427.5" align-y="2010" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="РєР·">dP</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="xx">dP</ml:id> + <ml:apply> + <ml:pow/> + <ml:parens> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рє%">u</ml:id> + <ml:real>100</ml:real> + </ml:apply> + </ml:parens> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:real>3</ml:real> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.019384783333333332</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="66"/> + </region> + <region region-id="2661" left="12" top="2052.75" width="166.5" height="13.5" align-x="35.25" align-y="2064" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="false"> + <p style="Heading 3" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">Параметры схемы замещения</p> + </text> + </region> + <region region-id="2690" left="144" top="2086.5" width="84" height="31.5" align-x="159.75" align-y="2106" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="1">L</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:real>100</ml:real> + <ml:id xml:space="preserve">ПЂ</ml:id> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.22066910248000976</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="67"/> + </region> + <region region-id="2691" left="312" top="2097" width="48.75" height="16.5" align-x="327.75" align-y="2106" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="1">R</ml:id> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>3.8352500000000003</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="68"/> + </region> + <region region-id="2692" left="312" top="2121" width="81" height="22.5" align-x="327.75" align-y="2136" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="2">R</ml:id> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.03509</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="69"/> + </region> + <region region-id="2693" left="144" top="2122.5" width="116.25" height="31.5" align-x="159.75" align-y="2142" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="2">L</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="2">X</ml:id> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:real>100</ml:real> + <ml:id xml:space="preserve">ПЂ</ml:id> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.002018976287340732</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="70"/> + </region> + <region region-id="2694" left="144" top="2158.5" width="93.75" height="31.5" align-x="160.5" align-y="2178" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u">L</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:absval/> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="u">X</ml:id> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:real>100</ml:real> + <ml:id xml:space="preserve">ПЂ</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.40444102608380622</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="71"/> + </region> + <region region-id="2695" left="300" top="2163" width="81.75" height="22.5" align-x="316.5" align-y="2178" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.0046658836666666672</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="72"/> + </region> + <region region-id="3382" left="432" top="2162.25" width="191.25" height="31.5" align-x="449.25" align-y="2178" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u">C</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:real>1</ml:real> + <ml:apply> + <ml:absval/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:real>100</ml:real> + <ml:id xml:space="preserve">ПЂ</ml:id> + </ml:apply> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="u">X</ml:id> + <ml:id xml:space="preserve" subscript="u.РїРѕС‚">X</ml:id> + </ml:apply> + </ml:parens> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>2.5046312008705842E-05</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="73"/> + </region> + <region region-id="3746" left="690" top="2158.5" width="151.5" height="31.5" align-x="723" align-y="2178" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u.РїРѕС‚">L</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:absval/> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="u.РїРѕС‚">X</ml:id> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:real>100</ml:real> + <ml:id xml:space="preserve">ПЂ</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>9.4314716546201963E-05</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="74"/> + </region> + <region region-id="2696" left="144" top="2200.5" width="99.75" height="31.5" align-x="166.5" align-y="2220" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="Рј1">L</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:absval/> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:real>100</ml:real> + <ml:id xml:space="preserve">ПЂ</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.21124350668364664</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="75"/> + </region> + <region region-id="3979" left="438" top="2205" width="99.75" height="22.5" align-x="472.5" align-y="2220" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u.РїРѕС‚">X</ml:id> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.029629842062695179</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="76"/> + </region> + <region region-id="3751" left="690" top="2204.25" width="150.75" height="31.5" align-x="723.75" align-y="2220" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u.РїРѕС‚">C</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:real>1</ml:real> + <ml:apply> + <ml:absval/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:real>100</ml:real> + <ml:id xml:space="preserve">ПЂ</ml:id> + </ml:apply> + <ml:parens> + <ml:id xml:space="preserve" subscript="u.РїРѕС‚">X</ml:id> + </ml:parens> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.10742881636367273</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="77"/> + </region> + <region region-id="2697" left="144" top="2242.5" width="132" height="31.5" align-x="166.5" align-y="2262" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="Рј2">L</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:absval/> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рј2">X</ml:id> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:real>100</ml:real> + <ml:id xml:space="preserve">ПЂ</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.02020590063930533</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="78"/> + </region> + <region region-id="4721" left="36" top="2278.5" width="69.75" height="35.25" align-x="46.5" align-y="2298" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve">k</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="1РЅРѕРј_фаз">U</ml:id> + <ml:id xml:space="preserve" subscript="2РЅРѕРј_фаз">U</ml:id> + </ml:apply> + </ml:define> + </math> + <rendering item-idref="79"/> + </region> + <region region-id="4722" left="30" top="2347.5" width="408" height="77.25" align-x="46.5" align-y="2388" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="a">Z</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:minus/> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="u.РїРѕС‚">X</ml:id> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + <ml:id xml:space="preserve">k</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + <ml:id xml:space="preserve">k</ml:id> + </ml:apply> + </ml:apply> + <ml:parens> + <ml:apply> + <ml:minus/> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="2">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve">k</ml:id> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + <ml:id xml:space="preserve">k</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="2">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve">k</ml:id> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:parens> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:complex> + <ml:real>3.5085536944918232</ml:real> + <ml:imag>-129.67007879970475</ml:imag> + </ml:complex> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="80"/> + </region> + <region region-id="4723" left="498" top="2446.5" width="351.75" height="35.25" align-x="732.75" align-y="2466" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="1">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:parens> + <ml:apply> + <ml:minus/> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + </ml:parens> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:parens> + <ml:apply> + <ml:minus/> + <ml:apply> + <ml:neg/> + <ml:id xml:space="preserve" subscript="u.РїРѕС‚">X</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + </ml:parens> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + <ml:apply> + <ml:minus/> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="u.РїРѕС‚">X</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:complex> + <ml:real>22844.231177590384</ml:real> + <ml:imag>145113.08808245807</ml:imag> + </ml:complex> + </result> + </ml:eval> + </math> + <rendering item-idref="81"/> + </region> + <region region-id="4724" left="30" top="2452.5" width="237.75" height="35.25" align-x="175.5" align-y="2472" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="1">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:parens> + <ml:apply> + <ml:minus/> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + </ml:parens> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="a">Z</ml:id> + </ml:apply> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="a">Z</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:complex> + <ml:real>7.6791606039248927</ml:real> + <ml:imag>138.68217069532449</ml:imag> + </ml:complex> + </result> + </ml:eval> + </math> + <rendering item-idref="82"/> + </region> + <region region-id="4725" left="30" top="2496" width="230.25" height="63.75" align-x="172.5" align-y="2544" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рє%">u</ml:id> + <ml:real>100</ml:real> + </ml:apply> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="1РЅРѕРј_фаз">U</ml:id> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve">e</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:apply> + <ml:id xml:space="preserve">atan</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="РєР·">dQ</ml:id> + <ml:id xml:space="preserve" subscript="РєР·">dP</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">I</ml:id> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:complex> + <ml:real>7.6704999999999988</ml:real> + <ml:imag>138.65048624509038</ml:imag> + </ml:complex> + </result> + </ml:eval> + </math> + <rendering item-idref="83"/> + </region> + <region region-id="4726" left="492" top="2496" width="234.75" height="63.75" align-x="609.75" align-y="2544" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="1РЅРѕРј_фаз">U</ml:id> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve">e</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:apply> + <ml:id xml:space="preserve">atan</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="xx">dQ</ml:id> + <ml:id xml:space="preserve" subscript="xx">dP</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:id xml:space="preserve" subscript="xx">I</ml:id> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:complex> + <ml:real>22858.024691358009</ml:real> + <ml:imag>145155.71108397935</ml:imag> + </ml:complex> + </result> + </ml:eval> + </math> + <rendering item-idref="84"/> + </region> + <region region-id="4498" left="18" top="2710.5" width="143.25" height="35.25" align-x="32.25" align-y="2730" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="С‚">k</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="2РЅРѕРј_фаз">U</ml:id> + <ml:id xml:space="preserve" subscript="1РЅРѕРј_фаз">U</ml:id> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.095652173913043467</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="85"/> + </region> + <region region-id="4465" left="18" top="2751" width="26.25" height="16.5" align-x="32.25" align-y="2760" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + <ml:real>1</ml:real> + </ml:define> + </math> + <rendering item-idref="86"/> + </region> + <region region-id="4464" left="18" top="2782.5" width="126" height="35.25" align-x="42.75" align-y="2802" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="1РЅРѕРј_фаз">U</ml:id> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>66.395280956806971</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="87"/> + </region> + <region region-id="4496" left="294" top="2782.5" width="121.5" height="35.25" align-x="318.75" align-y="2802" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="Рј2">X</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="2РЅРѕРј_фаз">U</ml:id> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>6.3508529610858835</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="88"/> + </region> + <region region-id="4461" left="948" top="2793" width="28.5" height="16.5" align-x="965.25" align-y="2802" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:greaterThan/> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:real>0</ml:real> + </ml:apply> + </math> + <rendering item-idref="89"/> + </region> + <region region-id="4462" left="1038" top="2793" width="28.5" height="16.5" align-x="1055.25" align-y="2802" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:greaterThan/> + <ml:id xml:space="preserve" subscript="2">X</ml:id> + <ml:real>0</ml:real> + </ml:apply> + </math> + <rendering item-idref="90"/> + </region> + <region region-id="4568" left="12" top="2823" width="208.5" height="48.75" align-x="36" align-y="2856" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="Пѓ1">X</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:apply> + <ml:div/> + <ml:real>1</ml:real> + <ml:real>2</ml:real> + </ml:apply> + <ml:apply> + <ml:sqrt/> + <ml:apply> + <ml:minus/> + <ml:apply> + <ml:pow/> + <ml:parens> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рє%">u</ml:id> + <ml:real>100</ml:real> + </ml:apply> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">U</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="РЅРѕРј">S</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + <ml:real>2</ml:real> + </ml:apply> + <ml:apply> + <ml:pow/> + <ml:parens> + <ml:id xml:space="preserve" subscript="СЃРєРІ">R</ml:id> + </ml:parens> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>69.325243122545189</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="91"/> + </region> + <region region-id="4569" left="294" top="2841" width="102.75" height="22.5" align-x="318" align-y="2856" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="Пѓ2">X</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="Пѓ1">X</ml:id> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="С‚">k</ml:id> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.63428010720816386</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="92"/> + </region> + <region region-id="4570" left="294" top="2883" width="81" height="16.5" align-x="312" align-y="2892" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="2">X</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:id xml:space="preserve" subscript="Пѓ2">X</ml:id> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.63428010720816386</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="93"/> + </region> + <region region-id="4571" left="12" top="2889" width="85.5" height="16.5" align-x="30" align-y="2898" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:id xml:space="preserve" subscript="Пѓ1">X</ml:id> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>69.325243122545189</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="94"/> + </region> + <region region-id="4572" left="6" top="2932.5" width="99" height="47.25" align-x="29.25" align-y="2958" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u1">X</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:apply> + <ml:pow/> + <ml:real font="0">1</ml:real> + <ml:real>2</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>63.58915071586248</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="95"/> + </region> + <region region-id="4573" left="288" top="2932.5" width="99" height="47.25" align-x="311.25" align-y="2958" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u2">X</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="Рј2">X</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:apply> + <ml:pow/> + <ml:real>1</ml:real> + <ml:real>2</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="2">X</ml:id> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>63.589150715862466</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="96"/> + </region> + <region region-id="4574" left="138" top="2997" width="135" height="22.5" align-x="156.75" align-y="3012" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u">X</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="u1">X</ml:id> + <ml:id xml:space="preserve" subscript="u2">X</ml:id> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>127.17830143172495</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="97"/> + </region> + <region region-id="4575" left="6" top="3025.5" width="158.25" height="56.25" align-x="23.25" align-y="3060" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:minus/> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="xx">dP</ml:id> + <ml:real>3</ml:real> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="xx">I</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="1">R</ml:id> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.0046658836666666672</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="98"/> + </region> + <region region-id="4586" left="360" top="3021.75" width="210.75" height="54" align-x="377.25" align-y="3060" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="xx">I</ml:id> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + <ml:apply> + <ml:id xml:space="preserve">cos</ml:id> + <ml:apply> + <ml:id xml:space="preserve">atan</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="xx">dQ</ml:id> + <ml:id xml:space="preserve" subscript="xx">dP</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.0046666666666666645</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="99"/> + </region> + <region region-id="4578" left="6" top="3081.75" width="325.5" height="60" align-x="41.25" align-y="3120" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u.РїРѕС‚">X</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:minus/> + <ml:apply> + <ml:minus/> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="xx">dQ</ml:id> + <ml:real>3</ml:real> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="xx">I</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:real>2</ml:real> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="xx">I</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + </ml:apply> + <ml:apply> + <ml:id xml:space="preserve">sin</ml:id> + <ml:apply> + <ml:id xml:space="preserve">atan</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="xx">dQ</ml:id> + <ml:id xml:space="preserve" subscript="xx">dP</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>-0.029648967718954655</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="100"/> + </region> + <region region-id="4734" left="354" top="3087.75" width="237" height="54" align-x="389.25" align-y="3126" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u.РїРѕС‚">X</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:neg/> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="xx">I</ml:id> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + <ml:apply> + <ml:id xml:space="preserve">sin</ml:id> + <ml:apply> + <ml:id xml:space="preserve">atan</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="xx">dQ</ml:id> + <ml:id xml:space="preserve" subscript="xx">dP</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:id xml:space="preserve" subscript="u">I</ml:id> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>-0.0296348143611905</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="101"/> + </region> + <region region-id="4554" left="6" top="3148.5" width="84" height="31.5" align-x="21.75" align-y="3168" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="1">L</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:real>100</ml:real> + <ml:id xml:space="preserve">ПЂ</ml:id> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.22066910248000976</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="102"/> + </region> + <region region-id="4555" left="174" top="3159" width="48.75" height="16.5" align-x="189.75" align-y="3168" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="1">R</ml:id> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>3.8352500000000003</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="103"/> + </region> + <region region-id="4556" left="174" top="3183" width="81" height="22.5" align-x="189.75" align-y="3198" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="2">R</ml:id> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.03509</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="104"/> + </region> + <region region-id="4557" left="6" top="3184.5" width="116.25" height="31.5" align-x="21.75" align-y="3204" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="2">L</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="2">X</ml:id> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:real>100</ml:real> + <ml:id xml:space="preserve">ПЂ</ml:id> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.002018976287340732</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="105"/> + </region> + <region region-id="4558" left="6" top="3220.5" width="93.75" height="31.5" align-x="22.5" align-y="3240" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u">L</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:absval/> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="u">X</ml:id> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:real>100</ml:real> + <ml:id xml:space="preserve">ПЂ</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.4048211065378019</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="106"/> + </region> + <region region-id="4559" left="162" top="3225" width="81.75" height="22.5" align-x="178.5" align-y="3240" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.0046666666666666645</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="107"/> + </region> + <region region-id="4560" left="294" top="3224.25" width="190.5" height="31.5" align-x="311.25" align-y="3240" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u">C</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:real>1</ml:real> + <ml:apply> + <ml:absval/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:real>100</ml:real> + <ml:id xml:space="preserve">ПЂ</ml:id> + </ml:apply> + <ml:parens> + <ml:apply> + <ml:minus/> + <ml:id xml:space="preserve" subscript="u">X</ml:id> + <ml:id xml:space="preserve" subscript="u.РїРѕС‚">X</ml:id> + </ml:apply> + </ml:parens> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>2.502280090198258E-05</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="108"/> + </region> + <region region-id="4561" left="6" top="3262.5" width="99.75" height="31.5" align-x="28.5" align-y="3282" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="Рј1">L</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:absval/> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:real>100</ml:real> + <ml:id xml:space="preserve">ПЂ</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.21134274324502031</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="109"/> + </region> + <region region-id="4565" left="294" top="3267" width="105" height="22.5" align-x="328.5" align-y="3282" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="u.РїРѕС‚">X</ml:id> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>-0.0296348143611905</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="110"/> + </region> + <region region-id="4563" left="6" top="3304.5" width="132" height="31.5" align-x="28.5" align-y="3324" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="Рј2">L</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:absval/> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рј2">X</ml:id> + <ml:apply> + <ml:mult style="auto-select"/> + <ml:real>100</ml:real> + <ml:id xml:space="preserve">ПЂ</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>0.020215392832132376</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="111"/> + </region> + <region region-id="4698" left="12" top="3358.5" width="69.75" height="35.25" align-x="22.5" align-y="3378" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve">k</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="1РЅРѕРј_фаз">U</ml:id> + <ml:id xml:space="preserve" subscript="2РЅРѕРј_фаз">U</ml:id> + </ml:apply> + </ml:define> + </math> + <rendering item-idref="112"/> + </region> + <region region-id="4740" left="6" top="3414" width="230.25" height="63.75" align-x="148.5" align-y="3462" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рє%">u</ml:id> + <ml:real>100</ml:real> + </ml:apply> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="1РЅРѕРј_фаз">U</ml:id> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve">e</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:apply> + <ml:id xml:space="preserve">atan</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="РєР·">dQ</ml:id> + <ml:id xml:space="preserve" subscript="РєР·">dP</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">I</ml:id> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:complex> + <ml:real>7.6704999999999988</ml:real> + <ml:imag>138.65048624509038</ml:imag> + </ml:complex> + </result> + </ml:eval> + </math> + <rendering item-idref="113"/> + </region> + <region region-id="4744" left="468" top="3426" width="234.75" height="63.75" align-x="585.75" align-y="3474" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="1РЅРѕРј_фаз">U</ml:id> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve">e</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:apply> + <ml:id xml:space="preserve">atan</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="xx">dQ</ml:id> + <ml:id xml:space="preserve" subscript="xx">dP</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:id xml:space="preserve" subscript="xx">I</ml:id> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:complex> + <ml:real>22858.024691358009</ml:real> + <ml:imag>145155.71108397935</ml:imag> + </ml:complex> + </result> + </ml:eval> + </math> + <rendering item-idref="114"/> + </region> + <region region-id="4741" left="6" top="3499.5" width="408" height="77.25" align-x="22.5" align-y="3540" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="a">Z</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:minus/> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="u.РїРѕС‚">X</ml:id> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + <ml:id xml:space="preserve">k</ml:id> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + <ml:id xml:space="preserve">k</ml:id> + </ml:apply> + </ml:apply> + <ml:parens> + <ml:apply> + <ml:minus/> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="2">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve">k</ml:id> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + <ml:id xml:space="preserve">k</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="2">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve">k</ml:id> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:parens> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:complex> + <ml:real>3.5118473167044613</ml:real> + <ml:imag>-129.82004027115022</ml:imag> + </ml:complex> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="115"/> + </region> + <region region-id="4742" left="6" top="3604.5" width="237.75" height="35.25" align-x="151.5" align-y="3624" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="1">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:parens> + <ml:apply> + <ml:minus/> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + </ml:parens> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="a">Z</ml:id> + </ml:apply> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="a">Z</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:complex> + <ml:real>7.6719950655836433</ml:real> + <ml:imag>138.61772949507139</ml:imag> + </ml:complex> + </result> + </ml:eval> + </math> + <rendering item-idref="116"/> + </region> + <region region-id="4743" left="468" top="3604.5" width="346.5" height="35.25" align-x="697.5" align-y="3624" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="1">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:parens> + <ml:apply> + <ml:minus/> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + </ml:parens> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + <ml:parens> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:parens> + <ml:apply> + <ml:minus/> + <ml:id xml:space="preserve" subscript="u.РїРѕС‚">X</ml:id> + <ml:id xml:space="preserve" subscript="Рј1">X</ml:id> + </ml:apply> + </ml:parens> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + <ml:apply> + <ml:plus/> + <ml:id xml:space="preserve" subscript="u">R</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">j</ml:id> + <ml:id xml:space="preserve" subscript="u.РїРѕС‚">X</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:complex> + <ml:real>22861.859941358012</ml:real> + <ml:imag>145225.0363271019</ml:imag> + </ml:complex> + </result> + </ml:eval> + </math> + <rendering item-idref="117"/> + </region> + <region region-id="4745" left="18" top="3844.5" width="141" height="35.25" align-x="37.5" align-y="3864" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="xx">Z</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:id xml:space="preserve" subscript="1РЅРѕРј_фаз">U</ml:id> + <ml:id xml:space="preserve" subscript="xx">I</ml:id> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>146944.44444444444</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="118"/> + </region> + <region region-id="4747" left="18" top="3898.5" width="165" height="35.25" align-x="38.25" align-y="3918" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="РєР·">Z</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:mult/> + <ml:real font="0">0.105</ml:real> + <ml:id xml:space="preserve" subscript="1РЅРѕРј_фаз">U</ml:id> + </ml:apply> + <ml:id xml:space="preserve" subscript="1РЅРѕРј">I</ml:id> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>138.8625</ml:real> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="119"/> + </region> + <region region-id="4759" left="18" top="3957" width="36" height="16.5" align-x="35.25" align-y="3966" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve" subscript="Рј">k</ml:id> + <ml:real>0.3</ml:real> + </ml:define> + </math> + <rendering item-idref="120"/> + </region> + <region region-id="4771" left="18" top="3993" width="24" height="12.75" align-x="29.25" align-y="4002" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:id xml:space="preserve" xmlns:ml="http://schemas.mathsoft.com/math30">Given</ml:id> + </math> + <rendering item-idref="121"/> + </region> + <region region-id="4770" left="42" top="4030.5" width="84" height="47.25" align-x="61.5" align-y="4056" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:id xml:space="preserve" subscript="РєР·">Z</ml:id> + <ml:apply> + <ml:minus/> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="Рј">k</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + </ml:apply> + <ml:apply> + <ml:minus/> + <ml:real>2</ml:real> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="Рј">k</ml:id> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + </math> + <rendering item-idref="122"/> + </region> + <region region-id="4772" left="36" top="4083" width="98.25" height="22.5" align-x="54.75" align-y="4098" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:apply xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:equal/> + <ml:id xml:space="preserve" subscript="xx">Z</ml:id> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:parens> + <ml:apply> + <ml:minus/> + <ml:real>1</ml:real> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="Рј">k</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <ml:real>0.5</ml:real> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + </ml:apply> + </math> + <rendering item-idref="123"/> + </region> + <region region-id="4769" left="6" top="4185" width="169.5" height="36.75" align-x="38.25" align-y="4206" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define warning="WarnRedefinedUDScalar" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:matrix rows="2" cols="1"> + <ml:id xml:space="preserve" subscript="Рј">k</ml:id> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + </ml:matrix> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:apply> + <ml:Find auto-method="true" method="levenberg" derivative-estimation="central" variable-estimation="tangent" linear-check="false" multistart="false" evolutionary="false"/> + <ml:sequence> + <ml:id xml:space="preserve" subscript="Рј">k</ml:id> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + </ml:sequence> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:matrix rows="2" cols="1"> + <ml:real>0.99988181216876881</ml:real> + <ml:real>293819.441228001</ml:real> + </ml:matrix> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="124"/> + </region> + <region region-id="4773" left="36" top="4246.5" width="120.75" height="47.25" align-x="99" align-y="4272" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:minus/> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="Рј">k</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + </ml:apply> + <ml:apply> + <ml:minus/> + <ml:real>2</ml:real> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="Рј">k</ml:id> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>138.86249999993015</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="125"/> + </region> + <region region-id="4775" left="36" top="4311" width="135.75" height="22.5" align-x="114" align-y="4326" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve" subscript="1">X</ml:id> + <ml:parens> + <ml:apply> + <ml:minus/> + <ml:real>1</ml:real> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve" subscript="Рј">k</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <ml:real>0.5</ml:real> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:apply> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:real>146944.44444444438</ml:real> + </result> + </ml:eval> + </math> + <rendering item-idref="126"/> + </region> + </regions> + <binaryContent> + <item item-id="1" content-encoding="gzip">H4sIAAAAAAAA/4yQwW7CMAyG7aZbS9etu3AhSOUZeIIdENph2iT2ACiUAkVUTF2ROPLm3W8n +u+w0R3b+Ot/vRsmJiJGfyEy1QS228/W+c1+H9e7cta5PSGKMHGl74XqnLZog07b62Bzrqvet +ld8omqGYMF+8hWr5yty1+V7q6FjZKfKNA+tjwCKe/r/7OzzpO1fV84XRIxvAkp+JLQ+imG0E +U8kRWwNryYZtPEgnBkMDxB2Y2wuO7oURV6IMRCqMwCOZI/YMjNofwKg9B6P2R/0XxJMyEIUw +AvvrFu+Xtu6ayp38g6R67VfklhosE14uC6/5J3IpPwAAAP//AwARvY6sxgEAAA==</item> + <item item-id="2">iVBORw0KGgoAAAANSUhEUgAAACwAAAATCAYAAADrqO95AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +ALpJREFUSEvVluEOwBAMhO39H3pjWcUY11NhmuwXab+eUztOH26nCMA7hdsJ9nbDKmDvwmBF +/lsJ3FN7qcJm4HBEM4Ktk+6fQ5ipwACLzyXF74GfdyK2/AJudc6ogmzF5vq0RC59rWhtFCHI +dH0IcC49A4Caa8FqBKheOk3nmgIIkBXDBMwWKy5Nx+jsAtao37JGHEskcHqixb+EBQopL7mt +NdRjDQGhde0UgnnEY9bOUaFRU2jqSzdClAvduGkzB8qltAAAAABJRU5ErkJggg==</item> + <item item-id="3">iVBORw0KGgoAAAANSUhEUgAAADwAAAAWCAYAAACcy/8iAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AOFJREFUWEftlosOgCAIRev/P7qs6cYQBA0fRW5tbVh6uFx0P8LYPI0L2NPYPMHe1ewaOFj5 +8vP9RG+/Kh9p33DTGVMK4skQ/A3U1H5JJg74CwoXgRMgVRYjFX6yPgWYlTcFs0I5Q+9hH3IC +NAOXynyk2rVrVQFzHa52Uav53RXWdDkrmF7/aVKY8gt1PuMEab6DVuH6RGvT4nzOnsNS1kvZ +k2IrnfHqqyXlqdKlBcfw7a1VSUkYKV4FjM+0HzhmAKqneZdUsYyrFLZqWrCsZ11uVMCWGZ79 +rx94tgK913en8AlS5hDuVMBwdgAAAABJRU5ErkJggg==</item> + <item item-id="4">iVBORw0KGgoAAAANSUhEUgAAAEoAAAAWCAYAAABnnAr9AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AQ1JREFUWEftl+EShCAIhOv9H/qumvSQQFbK8u5wpj8Omn3sIs2vZUwxbAIrqBg2gckOiYjN +dYEBI5BBLSZda9X2pCHNYduOGUW/jZ6wNp8ZWAu0TcZEoZ+Ki4CLQVpZiOZfQO23u0hSEsPB +Xd8G6ozCW61H4RbFXCM7os1o/URrqQdUguUCdSarT0K/FZRWFO8GEIrqSNyjqLTm0HDyTFnX +ZvYw6cHQnkyrLbWa47V9y7vE83sSiBR93rhqt6tk5VHsXZz5SlCaGjlYCWKW+P5n4FWO53uQ +Na5/vasVVfQrAeqTN82WNbsiWe8Z06wopFAjMdolIM33BIDu3QwK3fjX4gIUmNEAFaBAAmDY +G8lqa8v0KmoUAAAAAElFTkSuQmCC</item> + <item item-id="5">iVBORw0KGgoAAAANSUhEUgAAAEQAAAAWCAYAAAB5VTpOAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +APlJREFUWEftltsSgzAIRO3/f3SrHaO4hbgJ0jEtmfFBc0EOC+HxnMeUYyewAMmxE5gSxpFA +AgFFbEDmJFpqyfspQ/s2sqKkb9KPg8/WhIQyMgQMLvryIYJ/AbLepmpsh1aIJXtGxT+dMrK+ +sbUuBAhrnInYt9dcDgQP9MjXC+M2Cjkrwl5HI/c3K6RUYjYtigFcz/Y0lp2a/V5Vsra6O9Wz +9MEGz2yEoBmUQYlUi3X2pUAwr63mToMl1VbrGaIhdQHRZFtTDDM3LBArFRinNcWw50UrY/u3 +FkPaVYeFWHtnv1lFuuUfvWu7UsZr9M77EwhEJ4EkkHrCvgDDlpCKqF2MpgAAAABJRU5ErkJg +gg==</item> + <item item-id="6">iVBORw0KGgoAAAANSUhEUgAAAD8AAAAWCAYAAAB3/EQhAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +ARFJREFUWEftluEOwyAIhLv3f+i1NWrQnnKoa2atyf5MKnycgJ/vsbZV1wm/6tpWBXc3/oWf +LANHi7pEfP4XfjUcaTed8ggwTwZKTkiI3JsO3k+nRFwWPk9chL9s+Gv0q4qoqaP51GC1s8N+ +orx2qBZUy35Sg4a6lb5a4nZ+hxxSaEAtyWC+0WA15UPpdMEnzUMkgHEuGxBSX+vYQ0QrHcKM +jhHwjNK5Ta/ysObjdfAqRqOsFlFipC0DZLkduUClcVcbgzBmJlA5XlDWETgKhPV1lx095xmY +UhLugrH6McGjBwZ8OTU2P2vwvfZmeOsLq7W2e8GY7yn4vFmg1yDqyP8M7kRkMvRUmxf+qcpq +XEsrvwPgrSbmz+LmGQAAAABJRU5ErkJggg==</item> + <item item-id="7">iVBORw0KGgoAAAANSUhEUgAAAEYAAAAWCAYAAAB9oOpzAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +ARdJREFUWEftlosOgzAIRd3/f/Smxi6MVymgTReaGOOkHRzhwuu9r60WJXCAqUUJbAWFJ1Bg +hMxQweyFd2477viamWnQF8kPzYZ7h38TwTTD9scNkvT8FCiLHz0by3tTxrSsgcHjw1cBgz+4 +FBsBAzfC4HuUPWA8cC1+RGy+8iFlAVdKltr2ArLqWCRo7Jt21k/GqIaXEHsCz9xzFxjYaM7y +0nRDK6XsYGdmDAdbBEPa159lTE8/TeI7MhNwX14SWY/44rmqp5EYANeVuDNTJl9cn7gFegFk +luvoWWlgsrNiNJBs+zQw3KA0e0qOwEoFA+E81dEiwWt7w2C47gU1Z0V9IXPMXfRXPDecMSsG +bfG5wAiUCowA5gOlxQghNC0LMwAAAABJRU5ErkJggg==</item> + <item item-id="8">iVBORw0KGgoAAAANSUhEUgAAAC4AAAAWCAYAAAC/kK73AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AL9JREFUWEftlusKgCAMhev9H7o0MuY4XnYBmST0R6Z+OzvTziuNI+LI4BHHERH6cckW4Mnq +S/LI55avBcBj1pASOi4WEg/F7AFutYpmvVnxkcck5qd+HPnXDP4+RBI+l9gZ8MJWCUJP15Qa +0Xsrjhir5vQCl5RiVnHuiA8cqYRKROc4oDbxVh+U/VD/Na9DuqgAojmJup6x3Xt85jHwhJHs +tR94SKvQZuBN22tOSamtscv/VbQJ/OBa5bTrwip+A9y3+r2sLVPbAAAAAElFTkSuQmCC</item> + <item item-id="9">iVBORw0KGgoAAAANSUhEUgAAAEUAAAAWCAYAAACWl1FwAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +ARtJREFUWEftluEOwyAIhLv3f+itbWYC9BRQ0S3BZNmPKuDHefp6n+PIwQlcUHJwAkcCeRJI +KEAVTSjnQbuXXP/yt0thtI5aDa05ZU/NtVrg8l0G04JHQLPU0JpTYGl7NimlqIUG+0coaB+y +6Tc4SY3SpBu3dMmjjh6olhq0ObW8zCpq3ZdSi/IU5Fda4bUjbVE0ii2bz5SinUePEiLmairo +gYJiboeyWykwv3Z86FmL6L4nZoRSoKdajFa795lJkTcNfeOgPB4g1EfQ1frwhW8dsumma7mn +sNoG0W3Vc8vMqGkkxrRnvubqI0WuXptQAPEpUJAZ/5JBe5U2DEW+gKUpa8bmLXjF/GEoK4pc +nSOhRHnK6k5G50ulAMIfpT3DVxakr5gAAAAASUVORK5CYII=</item> + <item item-id="10">iVBORw0KGgoAAAANSUhEUgAAALUAAAAsCAYAAAAjOvkiAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AzhJREFUeF7tmwFvAyEIhbv//6O3tsstjoA+VE6qr8myrPVQH58ccOvX9/P14IsK7KTAC2q+ +qMBOCjx22gz3QgXemQdloAK7KUCogzz6TFFftcr753pp7wVNf7RZQh3o/hLoEuzAKWma6Ucs +A4Q6Vl/LOiN1oO6EOlDcimlCHag7oQ4Ul1AvErcoEms5tQb/mhXvMSsjdaAfkUgtOySByznG +NKEOdDUC9fthgRLRA5e1vWlCHezisjdtwSvfl/1stOdt9cFP648T6mCoEfNIRJcPcUq72gMe ++flJdwNCjVAXPMaC2oryWmSXheg1Rv4O3koK84Q6gRtmR+oyTyfUCRx84hIioJYFKNOPE8la +tGekCETGXBCXLcIySp/UOvxLP1DhFvme0yZVwDostUPU06XxdHD+5dTIbTCptlzWAgXQFqXV +qdFyf1nwWn/XtkuoF8Cww5Q9QGv7tgrZVpuSUHdSdFJx5ZFI5upaOxHRDu29e6M1IzXgTdkv +3rHo8uxR7r8FuRWhvVDLjo7lui6okVMIsDJ9SJZ1WYBkeH+G6FJnJIUwATS+7jaS3rihzhql +ItfliWIzoFlhw7PHKKiRNAMJXG6o0VvAKsesmPe0OSOhrkGLAP3mUzpEnthaxVqerDJSljas +Mdfh0CKsdn212i2+uW1FbC0PbM2Dinga1D2+k3m35Y8aj6jOXf/7oTnbOr1aZJcFgnYtCpS0 +pd3CtDHWdahwHJdXgalQW1EeAV4WGzOhbkWWvO75/QKBJ9/NvJe71jYV6nLRtUhYi5wS7pYQ +vZHaWmtrvrs/Rw/33evKPF8aqGWagjqzF+pPST9QHTJDdvfa3FAjRSAyRksJtGICEUS7PSMF +sCxWkLnuHGPVGgS97gU31Hc61TvXbs5GUzivTruPJ9SJPVw7pLsd4JluSA81Wv1rKc9MoVbY +ssAl0AelHyvAi5xTgzd7HRCpB2o7faRGN/LJ4zRQW9G49fkn6zG6dkI9quCk67VOR800obbV +IdSToJxhxtM7J9SEegZz4TZaLbwdi+EIURmpI1QdsFk+gBowc/SlhDqZ+9ndGHcIoR7XcLoF +5stjkhLqMf1CribUY7L+AAyYv5IpniR3AAAAAElFTkSuQmCC</item> + <item item-id="11">iVBORw0KGgoAAAANSUhEUgAAAK8AAAAsCAYAAAATtugDAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +A0ZJREFUeF7tm4lSwzAMROH/PxooNIwjdKxcH0rYzjBDU8eS18/q2oH3j6/XG19U4IoKPODl +iwpcUYG3KybNnKnAt2OgDFTgqgoQ3kkz92UhH3uJ75/jpV2bFP5fdEt4J05zC24L8MSQ/6pr +wjtxugnvRHHpeSeL21gGVt7xWrPyjtf05HFl91o1npjCrbsmvBOnF7EN3MT1TwDh7dcuvDOC +V37OqhxKempAeHN6pVpH8NJSpOT805jwvqZfeHdrC6LKenwurQR6ZmxZkLtaE8Ib4remQWQh +5MOONivtQYj8PFo4a0Y5NgrhHatnd28avFbV9kBvq/cjGfm+O8GCNxLeApOCeONM5dWgZeUt +MNF3S8GCEqmuhxZIH4T3buRsHo+0BaM3bFZ/m4c9LPyvbUB3tMMis6NbKHBwow3GO+XwTkZQ +YU6eF/FeaMdsd38FPCuSOT1p7U/G3hDe+zM2ZYQZyNoN5PG7dX+mX8LrTG1GyCmEFO1Ueuko +zQyoGc0Jb6T886zU2lwBt1+iiTY+Dzrv6K4dsOeJZUXW3nvipeH1TPjuWcqs2pm5WiBUuD5i +3JGftTZvyPXMHKbg7Ul6hFhIH9EKR/qw2mSq0itxdt6bGWMPB6h1mAavFDcTaMXEVMtnxZh3 +xBgF76unW38eD8sV6HqO57+5SCuhWQv0WrsbRWFE/KiszMg40fg7ANod07KPh2aWvp7tzFrS +7r9tiFZf+7nXVvu6z1gAK0503ctvNxiMjykwFF5vtckd6PG+XantbhOtehGkbRxroWBS7Wml +fatkFveerNdE7YIX8SqZyqtBOxLeqMqisdZMyTlK5dx26HEqgtkEMpVOVlftPdqfdxLQ028E +dFaXWe0Jr61sqvJqX2HaBksz3sg1zewjUFh5Sasic6j+9avtFarnjMzXqDYpeEcFndXP3aoU +ar1m6Vm9X8JbeIa8xXi3hdozDeXhRXfbmi3pEaTSPRagBPdnlsrDWwmm1blYpzqEl/CuZtGM +13P+TIBZeUsBLE9HvOQIL+EtA+9x5KidWWtJEl7Cexl45ca1VOKbkuGGbZPwVtj2QU2x1Mql +Q3iLTQmfoOETQnhxrZa1pJ/FpCa8mE5LWxFeTO5P+vXrLlva0csAAAAASUVORK5CYII=</item> + <item item-id="12">iVBORw0KGgoAAAANSUhEUgAAAMcAAAAxCAYAAABuzr3CAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +A6xJREFUeF7tW4tuwyAM3P7/o7u2Sirm2vgAQx6+StOkBgw++/yA9Pfx/PzwQwSIwDcCL3Lw +QwSIwDcCPwSFCBABHQGSg55BBAwESA4BzLPwfPVg77+tH6PzJEWA5CgMvxNi/6okSVL/SK02 +yVEhBzNHam48SA6jrMrtFtT+HRgJg3FSUfQdxCgnAiSHY3fZh+R0k5xakxzsOdJ4vjyJ9BQn +OQQ5tBMrD0Q+Pz8CPXYlOZTMoUUY7f5DHvUi8+QxMcu2Y4iF4E5yNNimFn28Z7xDaQB6wVCS +IxjkMjNoWaNcrgRf3rbz9j3YMB3iSI4O0GpTvOxAcgQDDojTApbn+N7zT+kLrM8hGwKj5HiJ +0TIKAV6HAEqMt63WbevaK0U15GVJxXe31vpEa2D6kKP1DHitWlxtNgKe/a3n3rzefWsRfmSt +Wr9o7fFf5mhJOb1Kc945EajZ3iona2XmiJZaRp21VrXHtJrIEeU491oIeOUd6piRwdVbM3Kt +S2aOFQBcy43n7tbC23PUz+nO9gMxuUurRKpGbSEL3UMkQpcoq7R6kcSx3WAEL8SRkTE1giC2 +88iAyBglikuOFZsYVUIzhOUgd/o+Grf38aUS/T1HteZZdkH27a25wi+r5PBqUUTJiDEjkTBi +/avJGMGrhxyoo7b40+nJgUaEqzkP96sj0NNzlHNqJEHHWf2LR5YZNnXvObRNlRGgjFKlYjJK +aON28lkRBY1IM4DJItOyiwyMnp1rWQHJRiXePb4yw17uDTmiWC0qyGcW2WYoR5lEYASBbnLI +uhZJhzsxrP8jirTMtWpyZqoWFO8/tpscMg1ejRz3Ny01HEXgEHJo9eyoIi3zmSFa0Mo7tkoO +rwmzGmp0nteQzzCLd8CgrYnoM2OvlHksAm7mOHZ78aujhwdyZeRgIn63lHgkAqnJgRDA6qVk +aXikEbn2HARIjg1Xrw9h5pjjgGeWSnI8rVO7wGLmOLP7zt3bbcmhOXxLdtAad6QM89aYa05K +j0TgtuTQegLPcWvPkbIKyUCRxqOsuQjcmhySILPJwSZ9rrOulp6aHNYrMJYRkPHePQp6Z6KN +28nHDLWGJrcnRxnNvcwRATlaflmNvryHscgWsVfKqCOQhhwriGGVVdqLjig5NHKv0iU7eVKQ +Y2UvEJ05SI7jKEpyBGM/gxytBwvBKqUVl4YcKyyMNNvIGK3x3klnNeor9Mu2BsmRzeLUF0aA +5ICh4sBsCJAc2SxOfWEESA4YKg7MhsAfzr2NQMzWnZIAAAAASUVORK5CYII=</item> + <item item-id="13">iVBORw0KGgoAAAANSUhEUgAAAKIAAAAxCAYAAABZAHL2AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AzZJREFUeF7tmotS6zAMROH/PxpKISBUWVqlquMo25k7lyGJYq+O9SrvH7fPGz9U4GgFvkDk +hwocrcDb0Qvg+6nAPStTBiqwggIEUXnhVip91cz3fz/18wp+ar8GgihcvMG3/UoC2Z6EgzdI +EB0QGRHn0UkQB6l5ngv4JjYrDgNMy3MPCCNioLeuG+e65zpvI4isEZegnSAqEK3OeQlPNV8E +QTQiop4lbt2zni/qOhJ5To+GmPq/FSGIiUjjRcvoGmeUvtAEMQmijHoSrghEOZPktzaPohPE +JIjydoKYEC+aTtSZ6m8JiXqyBsz83F89puYSH1t/DLGnWZFpmUPzP9f8pmar4yvxII0srwDq ++8xUwJo0eEL8qxE5SliemfIFZuam0b3RdYJY7r4+BlF4kDJCN2+ZwLZ0RMxspA8ac3eCgmg1 +Xnqllr9QHy4Noty8nt+hG5zr1jXeZmk10isLopyHjkZZCKAP93jG0CJ2DflFByb+3H/klA6/ +r9B9eRD3LLBCGMtG5oS/ag1nspvRa4+fs88g2QtOzYixMzmLa/1W4FmodIOyJy3f12HVYaOo +tC1cdlDobGmU5r30T/jnHBfPN5bPvdrdu9/bDfRdc3RqvFMRtfQS6jmy8y0rKrAbRF2HyFMy +aoA2KEf/zxLIa1RmrYHv+a9ACKKVHr0IiVxbAUSCsJYCLoijlIvAZkVI1N6rJWLt+WqF8/aH +IFrpq7JZkVFxZp1oHaLo/WhDlpefT/wGrKtJgTZWyBiCkbWOnrBGrHvVGpY8eLLXCGKdTwni +j5YRVEjTVueW61kiiDefRzXiVhsj6fp6CNXsuC2IFlyZqBcN8S04raamxk39rbQFcQSK59Jn +akQE3P447d9haxA1jJmIiKThLLj73dT/yUuDqGelkbsz94/mpOhMcpTmu6b/9iDKqBhFxAhE +9HqUptFZ5qjOnbUPdL8V910GxJnO87690XB50MqoesSBqgAMtXEJEEfjF1SkzH3IvDETES0A +Zx6qzN6fuZcgPqOeenYEGBL1NlOIDYJY6LRupnQjU92sjOx10fEyEbGLw7rugyB29ezJ9kUQ +T+awrssliF09e7J9fQJLV2fqOIzQrwAAAABJRU5ErkJggg==</item> + <item item-id="14">iVBORw0KGgoAAAANSUhEUgAAAKsAAAA/CAYAAACfHzhMAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +A75JREFUeF7tnItyAyEIRdP//+g2r20NRQUWV8Gbmc704YvLEZFN+vV9f93wggIRFHjAihcU +iKDALcIisUYo8MwAIAMUiKIAYI3iKcE672nn4/7x/Mr4ymlVRk91bKKAZgQWsCYFG7AmdWxG +swBrRq8mtQmwJnVsNrMygorSVTZKX08jE1r1MimvZWldVjesBDUjtOlgPZxU1hw9a49cLXOF ++uYoe1fa86lgpVCOqj1yUStjJFsJ1JRpQOso9AIKsM7BOEVkLSMqYJ0D0hWzhoeVwsn97Jmz +Po8j5sbtFbWvcHrUOVLBSkHyAkiS+wLg8VsAsBo0loDpHc0Ny0zXJRWstITkFVmp1yWw1tKF +dARdaFB4WA8oyvpq+bsaWPRSpq1T0vacz7j0oTbv0V9Tx12hvnshq/s+waJwj8h3JRFYWr3g +0ordUo0UkdWyu1uO9kofelGdrqF1keNOjt1Sja1hbTnbA1jvyFqulzsZLJs2Up/tYeUA8IpY +I2Adka5EAXZLWLmqQRmpvKIqd8x7XLDoWj3WGwHYX1i52/AuIkRw1Mw1WisltCpTuyRKbfuI +rJJjSzow2uVRoHXx69Wge5dGTUAErHmYusSSFlw98M4Gw+mw9gy8xAOYRKxAzV+SnN8dVpqf +iK042RA580kBld2terdgLf8mBVMTrKqRVTOIUieX5jWx8fu/fyHk7UNNCiDNczVrbKYBmoHO +Emjd6Wfn3bW/RW/AuistAe1eBtZyp5U60toYbdf6uTYmHT+g37Zbcu9iRWuqEh9L+PgYR6N6 +LYEub4K1RV6ZUmhsQts4Cqget0pvgof52p0TRzasdIYCbrAexwAiq86N2NByvcyw9lICCi/S +gP9OkZZ35O7M3VIFa5lE1456S0kkt8Ry67Ch21qpYZVLj5ZaBQArYNUyM609YAWs0+DTTAxQ ++2ohDehrNLwFQJVJDFhlOg1rVauqDJsw8MCA9e087rHxaL9ylZPRc0YeH7DevcfVO3E0r4c1 +YGVgPerJ67lr7xUBVpIG7I3D2tYDVuIf+pbItd231+oAa8XfyFnX2wiAFTnrelTWAkiYlQ5c +KHf0I7IOFNw4NCJrEVm595b2PsZzVA56H/85/IP3rxpJffjJ3nWfnq33nfb+hhquHyeAVaBl +60lTD9ayZlv7rJpgCWiCyCpjQAJkeczT7ymkyIdlutNWiKwC3c7CWkZX+r1gejR5KwBYOyh4 +XbDK6IoHD7b9B1htuqHXBAUA6wTRMaVNAcBq0w29JigAWCeIjiltCvwAxM3fztC66KUAAAAA +SUVORK5CYII=</item> + <item item-id="15">iVBORw0KGgoAAAANSUhEUgAAAHAAAAAqCAYAAABr9d/aAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AfZJREFUeF7tmIsOwiAMRfX/P1qdcQa7lj4E7R1dYmIYsHIPpaXX2+O51IOrwAawHlwFLrim +l+XP07NkwFYgFcBHINri8eGHLfFc61MBfCVUhxVvUOvhFUinDAerAMrbtwCCu3ZKgDQOgms8 +1fyUAPcV19Gps08NUEpq9GWt06MAgrNOBbCNfa2ue3t7tLZtdNxK98lUAC3O0MZF7j+Nm1J/ +y7cQ+kAD7Hmp5K0IUDw2ngogl/SUB3q2ww/6akcohVgAfwDF+wlPUiMlRt5vZu3/PkJXytxG +wbBsDi2zlmq/dJNKNn/EwCok29H2sl2pkrSP0cZ6KlAF0M6s29Oy+SUwNE7/FaDn44O0+/s0 +vTVLXqfVe606HjyQxsKoOogxNWKzJVb1PM8Cv8dAPEIt7h6Fy42TxJvRPtJuqydFQFm8sBsD +uWBrmXS/i3HizxBv1JwRD+wB1JIVK/yQB3JVDaltlIDI84xKYjSoVCP2Hth2ome85oHae2RI +nC5cDOSySqlN66vp5a6FrgJIEy7L+wKYhUTQDliAbcIRXPsphkECtGZ3pyCkLMIFMOuuXzku +uwBm3dEFMCsZg10rw3veyw0ape5SAFPj6Ru3OjxoD6QVDOB9+JXpkEcoWpH8K0IjrxEzDam5 +YwpAemBsqeccVQDBuRZAcIB3XZqVKPTWVw0AAAAASUVORK5CYII=</item> + <item item-id="16">iVBORw0KGgoAAAANSUhEUgAAAN8AAAA3CAYAAACM7p/DAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +BS1JREFUeF7tXAGOHDEIa///6Pb2pFFzKQEzCwnMeqVKp1uGgLEDybT9/efr84sfIkAE9iPw +Eh8/RIAI7Efg1/4luSIRIALfEydhIAJE4AwCFN8Z3I+v+nXAeZ31v//wcwYBIn8G96OrzoKj +AM+Ug+I7g3upVSm+M+Wg+M7gXmpViu9MOSi+M7iXWpXiO1MOig/AvRs5PfF6bAGoaOJAgOIz +wOpKTiRuxMbBJZo6EaD4FMC6k1OLf/yue55OzpcxLyW+8d3T6fdQFnHnd2Sn410xSspDwrkM +Iz8okFLie+G+IsvumljdoEqcFi5WHtbz/D4PAYpPwBYhbBfxrTa0PErRM4oAxUfxoVyhXTAC +JcU3n0mCczbdsfOZENEgAIGS4rvyQkQQgMEPF+iayNhZ6RIGzSsaT/pbI1BafCfOKyhJLfHN +36N+s8h6ev2svCr59W62FN9UPZSklvhmUqB+s8h0ev2svKr4vbPZlhLfauew3qnNz0nvsVDy +oXZXV0Z3u8uvFus4bls5a7YSIT15VSF05zgQvEuJDwF7TEr6WduBIEAS/nGptSuucprH7lmQ +4wZgYYfkbvng9zgCCN6txTdCIRFz7k4IdAhoiJ85NilWqWsim8fYRdFzcUZeXhw+yR7B+1Hi +k4iodZUd45lUBERg41g5/0zx7ZPxnSMMIrxvru5LI2Yla+yURjWJyKtoUOCQbJBYtXjRXJCY +ERskJ9roCHhwbic+6ZyjXWJIo50Gnwc8y8+8a0pj8Gr0nMdoKUfPWB2VF8W3RsA9ZY1dQWqx +nwb2U0m6Iy90o0M3HM/m4uXp6jgwb3qo3zva+dH5kPMJGkxXux0kPYFNdl7aOXbO17Kdz7Se +YwOCrSQwKybEr9eG4psQyyapt0BR9rvzWq3nIX6mICzfO/AKF9+OoKMIKfnpHv+OiyQLfwRD +7Xzk7Xx3JraS4ptnVwtordh35uC760U9hxAnaq2dfu7kJdXP8uM5M1kiswQy4qeJGdlkPWtF +1W3Z+Va7iQdcT5CrQmf8flW064CvxZ0RT5RPK25PPd61tUQ6Yq0R39MMPNy0xIbE/zZGKBGt +YKVDNTvfu+WJe/4Ome50vitiZD2r82ncXHUzZF1pk/XyO6Iy6plPSwRNMiLInT6YVwzaFo7a +mHhHCK3HznGXm3ec1QiKzNIxpdznxSLNvkhiV8rOSxsPxw63Gg0l/qFjpIefV9eTfK80EFuJ +f95u/Q2X7EJmJYv4fWpuT80LqWlVG4pvqsxTSfrUvKoKC4nLLb4qRcwaEZD8tBEJeR4pTLRN +1bii8+zkzyU+76E2C4g7B3I0FpSk3nMGun6WHZpX1vr0+z8CsPjmA3WlYkbGgvqi+CindxGA +xffuQpnPo4JBYkB9UXwImrTREGgvPlQsKA1QfxQfiijtVghQfDdvO1HxoWLOpmiVOLLz7OS/ +tfgyCIX6RMR3nZMrEALNq0KsnxJDW/Fl3byiJEXE9yIR6i+bcFXiyM6zk/+W4su8efWQdI5D +Krz0WmTsiKOP63n0d5e4kQ7ryasTgTvH2lJ82YBHEhXpkFoXn79biVm9VUv4j4Cza/AJ/ik+ +oco7xLfqmpK4xo44jrKXrRWv9f0nEL1ijhTfIfGNy3o6H8VXUUb3YqL4FrhFdYvosXPugtal +TlQe9+jFp9TjAOGREYggLXJxgthIFyvjyKlduETkQY7kIMDOp+Danbjd48+hfB2vFJ9Ri64E +7hp3HWnkR0LxARh3I3K3eIESPNKE4ntkWZlUBwT+AorviktRbwgbAAAAAElFTkSuQmCC</item> + <item item-id="17">iVBORw0KGgoAAAANSUhEUgAAALoAAAAqCAYAAAAEaEGyAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AylJREFUeF7tnNtSwzAMROH/Pxpapum4QlffYlvbFyBtHGt1tFacDt8/j9cXXlDgdAWeoOMF +BU5X4Ov0ABEfFPjrWiADFMigAEDPkGXECEcHAzkUgKPnyHP6KLcB/bH79dwGfSeM/p0+kxBA +VWAb0F/7/R/BlOAjz1BAU+B40CXnR5HkKoyjQaetzpVaQJ4L8u320bkeXYMWoOcDWop4K0e/ ++vQL4PJn2aJcv3Ogw81zwr8d6GLFvnZkKMi0AMr2BdDngf4o0C1w6UrA7eTkSX2uSI8CXQMX +/XousGm0x4Hu2W+XoM+NwtnRHwE6vfnknqL+q3DypPXsNCO6N+jSTkX2R+3QpV+RaCxZOktf +AbHuy96bD2UY3EnegfrJsd5I0KU9J97nHWXrye2geVpTbrYfrQsSyicUurSBbpmlBLRlwuVW +sTXDqaBbAVuTvet9gF6vPH2ox7pt8a1UaecssiIs4+hlP8b1ZvWyjjkToH/qGsmfd2PAcm8J +dK95Vjm6d/Be2EnC9jyuCe0FfbYuXn3vnJenLblcXDK9Vjf/Gz9aSbRCvWLT63CQ1ow14xwP +6D10GRHLiHlFHd1izHq/1c2rQJd6qBFJWmVMD+gr67KDo2v6Wfp74vv3wIhWq/fmoXQOyUU8 +E1oFbjqPnrqUOnDLtbaERxzas2rS8TxxRnNktSRaTBLk0XlWPRnVKmxnmKMJ5IrBOkYhl5Zt +LvlRyK+xpWtyx7X5tepz5/ldQc8MubT0aq5K9dLAu97zauyBm94EWr3ynaC2Xrsr6LP7VGtZ +k26AW0WTztdWOstdqXYU7BGgW+7tLapRevYctzvos2CXlnbOlTTn7ComefDBaRFpXTzF4Sk6 +j7tzhZQadO7Ggh6L9JItoFkASy44IoERXSh4VC9OT63N0GCnrZPnJntW/lpyHz23ytGjFxn1 ++ZVAHxVjj3FHFHaPec0cA6DPVPumawH0zf9tdGZHpy0J1zrVtDs31eLwy8LRh0uMC6ygAEBf +IQuYw3AFtgU9ulRLnx+uMC6whALbgr6EepjENgoA9G1ShYm2KADQW9TDudsoANC3SRUm2qLA +Lzn1YtNJYQ0MAAAAAElFTkSuQmCC</item> + <item item-id="18">iVBORw0KGgoAAAANSUhEUgAAALgAAAAqCAYAAAAAnZGPAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AvxJREFUeF7tmttywzAIRNP//+gm6cQdReXqIITp5qUzqUewyxFGdr6+H58bPnCgqwNPwPGB +A10duHUVBl1w4Gc6gQ1woLMDZQF/jISdfYe2JAdAUZLRCLPHAQC+x3dETXKgLOAYUZIIaB6m +JOBPuAF4c/KS5JUE/PXyKckChOnsAADvXN3m2ix3eQDeHIKu8qxjbEnAj+THv8fYwn3XtZDQ +9deBo3NfuoOPsihBHpGApJcDntqX7OBUOajdatnBvUoLNWPNLfUH4GBmuwPUSGppaG0Ax4iy +ncESCVg3wtt4WyJzIYnxtDwLHA+e1XUgv3gHXB18fjoRn87+FbtplArMaeVu/dbHbp4qro7l +Avy/vD20mOIp4q5rNSAluKgnVMd3Uf5Q+c1rR8WSavB2yMwIuAuI6ALu1KE9JpPg1yCLZCAz +FlePcMAjDVoBUfX8LJo1wKXNLD2d0EaeOTfNy5aAj+ZSp15LAVdeoxVlZWxqbcojK2gWLRpk +njvbuFZEbMsan9YjvIOfTYgr9JnvvTNmhtFnffFq0brs2Q4+Ny6LHm1zZfi+DHBvZ7IYFnEN +ZXqG0eyM+Prt++xXRLenHhx8Cp0033s3V4bvywCPgHHFGlIHWxFv5ZoaIBatGvDcHUSLfWZz +rfDqF/CxgxzJHSKo7sLtZIvwFUIsa84aufmT82KeQWcPpPU9nc+iZQaIqhXVUak8uLyl8YgC +eL7+bCyrfst14m9RRtNmGCqDbBHuLd4Mt9TZqo1BXj86Xa/+2Mpym7u6IZxGbi6WbutzU6Ca +xNX9ulL+JQHXgLPcCj1FsGxiTwcfb98A3FOJ+GvLjSjc3EaNBJ4DkmTdCsC5GTm+hFhRrC33 +zxE0zyEzwm4NXK4rnjkXUAesqEOm5eAX4RfW4B1QR5Qd5mUCvkMfYuY5AMDzvEakDQ4A8A2m +I2SeAwA8z2tE2uAAAN9gOkLmOVAOcO/rbstr5jw7EamaA+UAr2YQ8rm2AwD82vVD9ooDAByI +tHYAgLcuL8TdAeJNxmEOrF/OAAAAAElFTkSuQmCC</item> + <item item-id="19">iVBORw0KGgoAAAANSUhEUgAAARQAAAAiCAYAAACeJCZ9AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +BRxJREFUeF7tndtx3DAMRZ0S3JNbcAvbwrbgFtyCW3AL24Jb2BY2ZiaaoWGAuARBiqKgmXwk +4gM4BC6hxyp/Ht/HUxxBIAgEAQ8CSVDiCAJBIAh4EHjyGCTGCAJBIAj8u9pZDcN31ZYu4eJP +MBBjYLWYn8mfJQVlJsBhSxA4E4EQlDOtdvgaBDoTCEHpDHi14fPLydV8C3/aCYSgtDM8zQhJ +TPKD/v00IMJRkcBSghIBPjbSj8I7qip7XNSyC0Gxsz59zyMISlRV9jC1sDuFoHx+ftqpnrQn +wuwIgkKX74g2zxKCCLvlBeV+vz8+Pj5mWZPD2JEEJbGTDiS4ZnT2qHbPwBJht7ygXK/XGdbi +kDa8vb2xdiOBNavDR7Z9b6YIu+UF5fX1FVqH0tu10AALNrpcLr+8yoMKCbCZsBzN3l7spFgv +zYeyW1pQvr6+HtIuG9fWergmdonhdnCBqI8yRws0Ieawdi4ratgtLSgpIdD7JzXQ5lruftbc +brfH+/t7vwkGjXzkqmoQIuheGZIjRUHhHhvVPpceCYTamy53UlJoR8nP0k3JjYU2vlZK0nFm +YZzYcZc9Lf4ifbf18KiIPMbgbEbWSGqD9EU4IVV2y1wWdqKgcEGOOGAB4dWHCsPLy8uPkr0k +DnlZn7crqTKi2Ihv3DheYyPzS23SU57EcOShxd0MXLgNSMuNXCTR+Krhzm1uiJ01cyBtoQpl +RFIhxmo7PT3//PwMDWv1zyu4ZxWUBA9lCIEGG+U89kgKzUzEJqkN0lebH9kYU5uec4k2cMpK +1dSacAiYGZJSskGzTTuP+M8tvPRv6Hie7bx81GzKd9jZBSVfHyQ3LP5YNhlNQEas5Y8KhTou +lWk9S7YtsLgSrrZCQQFKi6f1185rSbSdtwQPOnZrOy8f0bWj626Nh1q/6TxI/CFsWpK8JESc +fy1z1fKCKhTJIESFvQyyjoMkJRckWlBYdhfNB23hZ6paND5SYHMJainVLfNr/D3O12y23Hrn +fDSxRRlocYWO08JHrFBqy7oWI7a5aoKQzocICpeoGuQRYorYjuyYrWuA7Hoj5qjdmT1sqqlQ +tMRF40yLvTwvEB81u5D5kHmKApifpAuZBzES9K3GtPTn7JNuKNYE7CyCIlUtLcyQviNuytbG +HWJ3zzZa4iKCgiR3TZx6zdnK7ddTnpKIUBWnYpSXgbSkk3ZYBCziJDdOeuTJvYdSWqiSj5y/ +1Geu2kJ2GmReLpDpelHOdB2ofSWf0rlRj425uONs3+yV/ObWA4mf2jaSbSVxROIg94/apG1u +XI6VGNb6jLQ3vSkrOZYvJgXjJRySU9z46aUs6cU2zlYEWLHc+/9FM06wPPznxuBERgpKLtil +TSH9e2KH/haqlZ2l/57xZrH3DH1MgqLtcjXKaoEsKTEdK702Lr06LlVMFntoUvbyXxIUqbpB +xIYmZd7nCK/eIyLbuqbRHydgFpSaSsFjd9aSlJsj/bCt9PmCEXZt4osvidwSSR6uOuIqFklI +8v70x4EePniPgTDxnjPGK8SoJ5zRJShy2VL6LYq3oPT2H0meWkGhgpf3n/1bMr15e+bGWcZy +q1DySwiuBO9xiYEIyqik6O1/zjSvOKR5pTbc5WrOMR8P/fTDHsnSm/cePq0wp5ug7AVDE6r0 +Azfk+6h72T/rvOmzD6VPQM5qd9i1L4HlBSXhDUGpD7JgVs8seizyn6V73wuJwAgCQcBG4PAV +Cr2paMMQvYJAEPAg8BeS3Ek5qAT2awAAAABJRU5ErkJggg==</item> + <item item-id="20">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</item> + <item item-id="21">iVBORw0KGgoAAAANSUhEUgAAACgAAAAWCAYAAACyjt6wAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +ALdJREFUSEvtlVEOgCAMQ/H+h1YgYGCZUKpTTFjCD2Hy1pW57T7czBEAZw43M1zs7m8AvQ2D +F+PKUe6V+5ZFSY5KQQ3iLbD0WKvaI6xUQypoqVbr7gyselC2moFklJc5qoKl/xgwTRXp5St4 +GLCnIKMOUiwE2PNgD95UQfQVf6LgyBxEAJEzWtubcxDxiTav0DzmHPWrY9VZgE/PSETR4RZr +jwm5iD0zDMhexOYtQFa50+93P2CdfwByhD1tqQV7BQAAAABJRU5ErkJggg==</item> + <item item-id="22">iVBORw0KGgoAAAANSUhEUgAAAJYAAAAWCAYAAAAisWU6AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AelJREFUaEPtWYmuwkAI1P//6Kc2VpE3wLBS7VaaGE1FjmE4tp7/rtepr0agGoEbsfpqBKoR +OFUrbH2NwDIFG4ZGYAsEHsS6jtjbrrW81kvek/e3cKR1zo2A5s9Lx0LkaULNnfBPeK85spBM +G9Yd6xOOtY25EaCIdX/88DIS5w67vc8gMDKhaGKt5Mo41LLHQkDv13r/ltHSxPKUMPBZTmWq +4UgHh0zcDL57k6GIVbVjIWMsIEdKxLtFymJWLVfasSpPhU2sZ6qPVCiIwG7HYp5jIRm57Hvd +ziItquhoDOrfWPJR1Xl6dFwePvq5n3fS9vSuGMl3FreMfx7RR4tA208/efeIEC107Pdet7PI +u8V9fYjRNhib1kHIitEiiCSvheOof9VjdIk5qxRVFQIvGoUseSzdUbdBiUDAR90PkUdjgLqQ +V0QRXqPYWLmxyJ3NfUZ+E2JZ7XuvHSvjF9ulvkWsEf8yhGFlh4kVjQlmz2BaOmvHGgMM0JaM +Z5v1KzsKZfeLum6VfyxZMnIpYv1b0O5/WMv70WdNJrSz6dGCSOrZkQmR48Eae1oe/QbFHumz +4oh0afte/IzvCI8MSUZkU8RiDKAxiCqP0fWrMh6Gs2DSxNphpppYO0zK7C7pMTlrPOUda1Yg +2u9aBC4WUJfUyjy/TwAAAABJRU5ErkJggg==</item> + <item item-id="23">iVBORw0KGgoAAAANSUhEUgAAACkAAAAWCAYAAABdTLWOAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +ALlJREFUSEvtluEOgCAIhO39H7rUZUN2OiEx3GLrj8v8OA7sOGME75EgvUfwDpgrvRVktGXy +Zn5K0DW6bp0YZ6mURCAr4e4mrjTIwFwVrqS1ar3zCzT0JC+7FlRTBb4HKkn9qIVD6nB/txIY +hpylpCbJIUgLTyIV1Uq67+6ROdmao62yahrn6Wgys8U3DvKMxnuSPT+kRK3eu6+URD6eBUa/ +I4akxkZ3rRtIC5Cp5V4NuN9P7xcKjZ55Aetkgigt4R1+AAAAAElFTkSuQmCC</item> + <item item-id="24">iVBORw0KGgoAAAANSUhEUgAAACcAAAAWCAYAAABDhYU9AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AKpJREFUSEvtlesOgCAIhe39H7rE6caQlEs2WrL1xxsfh5MeZ44UNQAuaqSoYKWjn4DLtgPv +dd+b8Dh/pxxM0uDGVgDTPAUUJ/oFnEVtkXLUd54Wanwsgmswluq9hVCLDT3nBVymXH3WPGKo +9g7bSu8Y3F5uro1xBFbFh/fcrFSuutkez7zq+dpwSGqzcnce9bSxezq1h+EfwWp8aU6VctJD +n1q34axKhlbuAt3O18RbjqiaAAAAAElFTkSuQmCC</item> + <item item-id="25">iVBORw0KGgoAAAANSUhEUgAAACMAAAAWCAYAAABKbiVHAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AItJREFUSEvtleEKwCAIhNv7P/RWMYY5MnFax0joX3TH+WnHmSuhVDGDUgnFSO0QpJmMTWGn +nplF9RrlFUZgzNyT/DTCJZkviYYlQ7nTMhhmxgJ+mJl/JsN7zHeOtIOsAL80pT5zEauoliVx +3W4zvRibsZvwdw1/RQruUma04HndGybjJaR5Z5vppXQBWfDNwPal82gAAAAASUVORK5C +YII=</item> + <item item-id="26">iVBORw0KGgoAAAANSUhEUgAAACwAAAAWCAYAAAC7ZX7KAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +ALhJREFUWEftllEOgCAMQ/H+h1YgYsYUNqTBLXGJP0bwUbrCtscKnioBe6rgCTa7wS1wtHHy +cn4sFeeq6CzCUvEyPH9hSV3OshQYsXtLgYta1JMjfVMW7MYSnwG/UZjaybzCFSxNiVvesUxu +ZbQ0jnp3NIEed6M3Ce/sVqdf/lpw6HSPtRFgRGxpdgAGfF5TNf+c+kYN3MtM3hhTRMJg8aZD +m+0JTNt0qEWIwKgfoeb5gVFKtuZxp/ABLi53QdZMGVwAAAAASUVORK5CYII=</item> + <item item-id="27">iVBORw0KGgoAAAANSUhEUgAAAEQAAAAWCAYAAAB5VTpOAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AQhJREFUWEftl4EOwyAIRLv//+itNdNSJnBFq0vEpMlWV/Y8D6Sv9z62GKcChyAxTgW2EOOq +QAjCHFEE2ZPoqCXpmjlmc1xWP1uMvBEzOUIQKWW+x2/XbPHutPe5HvBDHELrAlIj/lYQBL7H +rvAYXJCRHKJDalDexbc4pCcHwg+nzEgba//1NAfch2QQbl/Nzh54Kz3ucNRiSfHLfchGrFkb +bWOpP9E4rDmxTnkF4XUBidP6G63YZh5EPOoy2m6kGBZkzfYzHHKXw3IIFyJ/VwWhQaXPTzR0 +2jGMciCCcHbVIbWjsqhIXgKtImg50Jpv4UCK6k+RtoBWmzdrSAiymgLa2+7iWqTlfwAAMmC6 +ZBIO5QAAAABJRU5ErkJggg==</item> + <item item-id="28">iVBORw0KGgoAAAANSUhEUgAAADEAAAAWCAYAAABpNXSSAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AOZJREFUWEftlgsOhDAIRN37H9pPYzeIgANd6tbYxJg01fJmgPYzr2MafWwQo49pdICSSY+C +WMtiq43y1EHn6Pzd4DzWgxNSoP8U/N6EDhoWIK4qd+Ju1a34KpRYEzytskAiLvNvRCdoPWQF +L6nL608DhCFanZCaxK8EgSBaa0La5ApAciHsREZ3iuS9BW06gZwTWppY6WNBRAHNc+LK9m9L +IweiNif1dOT/kTXua0dVT3vTIKJKe0HSIHoBhC6AWvdC5r0Ko+tdTpwKaq8NrUW2njcpEOhP +e69zOdE7OHS/FwJVKnvdAtWQy/r181ALAAAAAElFTkSuQmCC</item> + <item item-id="29">iVBORw0KGgoAAAANSUhEUgAAACgAAAAWCAYAAACyjt6wAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AL1JREFUSEvtluEKwCAIhNv7P/RWscDEad4qHEzYn2L1eZ7VceZIkaMARo4UGa5W9zOA2YbF +i/VrQcfo+MqkOEenoASxC+xu1i73CsvV4AquVEvbuwGLHuSlRiAR5fk/ooLUfwiYpAr38hP8 +MKCmoNRMMxKZ4kEpQwtOUg9W0NvFiM+0hNQSI+egBojCq+egVS46jwJ49nh11YUG3AUHKbj7 +pnG9ZkYPXK/P1M6eudiKtVwKrgCw1vwBLYWs+QsF0y586PRwYQAAAABJRU5ErkJggg==</item> + <item item-id="30">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</item> + <item item-id="31">iVBORw0KGgoAAAANSUhEUgAAANMAAABLCAYAAADqMrL3AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +BQNJREFUeF7tnYuS2yAMRdM/75+3mzRkCAUjAeIhn8zs7NgLQlzpmJcz++vPz+fBBwVQoF+B +J0x8UAAF+hV49JvAAgqgwGuGhwwogAJjFDgKpp9J7avXz9/pzxg5sIIC7QocA1OAJ3Q1gFW6 +bpeEmijQpsAxMIURCZjaAk0tewW2hykekeLRiJHJPjloQafA1jCl8OSu0+mfrvuURoFxChwD +U22aN04SLKFAmwLA1KZbd614N7LbGAa2UOAYmNLkS9dMW6gpdIL1nlCow4ptDVOY2sXnS/G9 +HFDphkUOwt1A3M2fw3J4G3e3h6lFqRS+eL21Y+Lu6FOL7nev4xKmdLMiBHnXpN3Vr7vDoe0/ +MGkVG1wekAYLutCcS5hOmeYB0sLMN2jaHUynbEBcvc1hEGdMTlDAHUwTNPs00XpWJH3rPVeO +0WxmhHVtAZNOr/9KWyd3afu/022qGygATJ2iAlOngI6qA1NnMIGpU0BH1YGpM5gzYErXTp0u +U91IgS1hKi28R94v6ald9I+G6eq9vVJbo30wyjX3ZreE6STVrRP5Cq6nTvFRwEm6efQVmDqj +uhqmAFRnN6g+QAFg6hAxPWcafWBcOsdKRyNroDskulVVYBoc7hWvMgHT4CA2mgOmRuGuqs0+ +aAUmgyA2mDweptZXehq0ElcBJrFUrgoeDVNtp2tFpJjmrVDdpk3tg/pomFIJV093Rm9ASFJE +G3CJTcr8O3KIP5LccgOTpLMkCQq0KiDJLxcwcXDZmiLUkyggAelpxwVMQRBppyUCUgYFXoC8 +/+OKRA1gkqhEGTcKxGtMzXpT8qAGJjdpQkcsFXAPU/qUsRQT2/dWQAVT6/B3b4nv0/taMpXW +Ftr7rYqWDso1a550K1wzDfxvA2L2yX2rcNSbq0AtIUugae+39irnX8s5UWv7nw2wlMbUYO2J +1OsA9fdWIMRfC4a2fK8KNXhm5PHXBsSokWmG473iU1+mwBVM8d/imGvvSx7gtZzaEqaRi3rW +YbKEnVVKG48cILl1xWea834FJ5121eDK9b/Wdg3AGlwWmhdHptqTwMSZ9wFZKejcf3wOEa+0 +GBEbSTKWymjvl/zNrYWuyl4tWWbk8+U0r9cB7ZNwRBJgo6yAJh6SslpoJIBejXxXsa3Z7s1l +SV6ZwiRxgDJnKJBLRkuYjp7mxU+i3NMhNw8u0T7jKXBGCvrxspTckrwp5ZN0yvYsd5VTWh+s +oqJ6nag2lFo5iV0UOEGBD0yP38mXoTLXX0+nn7+n1yd0GB9RwEqBF0FPkGKYStcBnvD39NrK +yZ3tlqYYO/uMbzYKfGAKUEl/v5LoPToFENPRzcblfawy7d0nFjt48pCMSMHR2oh0N5jSALLx +skNKr/PhC6Z4VIoB+tqNqayt1nVlfcvAtD4GKz1Q7eatdPSEtoHphCjZ+QhMg7QFpEFCHmwG +mAYED5AGiOjABDB1BlH72ktnc1TfWAFgSoKjOTfKvQy6caxxzVgBYMoIzLTNOOucmgcmYHKa +2vO7BUzAND/rnLYITMDkNLXndwuYgGl+1jltEZiAyWlqz+8WMAHT/Kxz2iIwVc6ZNF/Xd5oj +dEuoADAJhOJ7SwKRKOLrn51ZxROYrJT1ZZeRSRBPYBKIRBFGJkkOpC+zpusoiQ3K+FeAkUkY +4xgg3t0TinazYsB0s4DTXTsFgMlOWyzfTAFgulnA6a6dAsBkpy2Wb6bAX6D6N9MnLq84AAAA +AElFTkSuQmCC</item> + <item item-id="32">iVBORw0KGgoAAAANSUhEUgAAAMcAAAAvCAYAAABXEt4pAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +A9NJREFUeF7tm4tOHDEMReH/P5ou2x0UjJ+xE4fhrlRVZSa2c+ybONny/vH4vOEDAiDwk8Cn +OPABARD4SeANUEAABHgCEAcqAwQEAhBHcWk8GtdvFj//Pf4pdgdzCwlAHIVwLxFcJqlQXpcf +hR5haiUBiKOY7iUIThiaaIrDgLkCAhBHBcRX6zTuDBBHAdhmExBHMgGjCMa2CuJIgj1gOMSR +TAJ3ALfOFppwkuFgeCEBiCMJE+JIAtw4PHprCHEkk8O1VdqhHLtGEvjkcGkR08xBHJOwx2Ha +WUP7noOOoysbvRouCBUmXgQ8ixTEsalcpGRwu4znOnhT2Ld1A3Ecllqp58WXhfsTBXHsZz7l +EeKYwvYcRNtWTyvqEcbT9nxYGFlBAG1VBUW/Da8wIA4/0yVv4kC+BKtolN4sWt6/dg6uH9Zu +WizDpz2f2X5Pm0M2Hs89v/UObVus92djllpNT9vE+eTyb8X2ra26e+979/lpyaZz97CwxljP +reKTnnMCWOVLZUYfRreeWQAd4zwF0RFXh08Pi2gtRPp5a86WGCp9iSLVtiBrAl3PZ8F4CqJr +Trv9eljQywKtpdFy4vGlLdLPwzHzS2SrmYm3VbMFuDrg0X70HDHTd+6cT9RXdP6XfSm3UgFS +UXDvWfWS3YWOEYe2QkQTeNL70QRRIXqEKRVs5ufVDK1Vfow1smp7BGK9Iwn4CHFkCqg6iZa9 +6MrZAdiaQ+Z5dP5coYv99tDGeLlZhR9ZdC2flq8M1y+BaqtjBGZFMKttWMBX+++27134LE7e +tkyqLU9hz8ZQyTj0PQfXe3IT1VqIcduU7NFtnU7YA5cbw61cNFYaXyXsTltcTmgLo63sXE4k +dp58eVs7qZXdwTL830csRXt6RsnG9XP69w4Qkd56Vzzw00vgKHFIwtqFyCv8XfHATy8BiGPg +XyWOcefzth69ZQDvHIGUOLSzgVZoVhHOnCkq0ksPrFoPLvnjzlHSwbQiZthYRyAsjqs3584F +3Io5vu8pPuswvg7Ff8tjcc+KlM4T4lidtTX2p8SxJpTfbVUSlbVL/u5Z3zt6iKMgv9yOOF4u +dO+GBVP8kyYgjoK0R85XBe5gYhMBiKMANMRRAPFAExBHQVK0i4bZQ31BWDCRJABxJAHSs8V1 +4yXd0knv03PJzDVy0VRg5kUA4mgsBes6vDE0uH4QgDiay4Bru9CKNScFO8chCSC//jm2ZWdE ++HejwM7RmHu0VY3wHa4hDgekFa/Qb9RxIF9BOWcT4sjxw+gbE4A4bpxcTC1HAOLI8cPoGxOA +OG6cXEwtR+AfTfXzhTuDezAAAAAASUVORK5CYII=</item> + <item item-id="33">iVBORw0KGgoAAAANSUhEUgAAAG8AAAAnCAYAAAABzhZhAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AeVJREFUeF7tmeuSwyAIhbvv/9C7TafZsYyGA9FykfzqVFFyPsBLfn6fz6OemAoc8OqJqcAj +ptvl9atilgxxFUgF77lwxSWh8DzN2x7gCp4iAryYFDwvJBR+FDyFaF5MCp4XEgo/Cp5CNC8m +Bc8LCYUfBU8hmgeT86iwE8CPc95OL3434LhgadvpGbRne9V/5Os/vB0PuVqANMh7QT/qI/3/ +ysfKPAVBBF47bNsfsUUr4BDe6kxEHVRou9wEAWAG75vC9mr9N+c/RZb44RbeLOFmjUPTaCQy ++v+MtJTA4/py7eI1767wkpIrifgZwg93bu+vEtSfXn+J4Fxfrl0M7zCYAXCl2JZjSwTn+nLt +ELw24k54dJfUZhQXoRx8rt0SDjI31atdO3u/6QamV52kmkAfYylExFGpI4hg1edTATE8JIJm +lF0tqKuNi3ZMr3a34Y1KhFXmWc1rAVgMDymh1plnIaTFnBA8bgPT2zFJjguzXtyLH7PehxsH +hscN5KF9VBUsK8FKXdLCo6JlXAsL3srUWDz2FvAyZt1rKVgcHEuGl95OFLwlGPSDoneCWcGF +zTzkeo7uMDNCDFk2EXi9azJ9nvu0DA2vza6MmcWFTAp4O4ILv+aNLsW5iM3SHj7zsl59IQH2 +B26gAXajtnjLAAAAAElFTkSuQmCC</item> + <item item-id="34">iVBORw0KGgoAAAANSUhEUgAAACAAAAARCAYAAAC8XK78AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AKdJREFUSEvNVAEKgCAQs/8/ulTymGtXCsolBCLXbW47jzOvFLkKgciVIsGr+r8jkONQMlG/ +Ox/GsZ2tJN0pwABIZCUo9jIC3u123HqKQFcMtrBNrJZSD221fQNQN8U8KABFzssNZ6vVTVmg +MsKA1pjC7Na9KfA1BWpSFJCHUVXxZFQ/eTbxhGCdt39YgICuX/A+jCjH4DK4u+Z7tO//nuJR +5qvqwhW4APqVEFQb1zbjAAAAAElFTkSuQmCC</item> + <item item-id="35">iVBORw0KGgoAAAANSUhEUgAAAC0AAAAWCAYAAABUpxX0AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +ALNJREFUWEftl9sOgCAMQ/X/P1ohcQTHYksmApElvnA9jFJwP0Jss0WE1hHWYBXTZd7+aCKT +zjupt/8/oWPW5EMZkPoWmc7HpORRC1HbHiVDJ20K6Mvh0tq6QOeSY+XXXR5TQiMNo7tjyYO1 +vOby0AelsJ/Lx/MtbWV5Mi4lD/Q20ZBvQxfzI9Ez9QuasBa3PKzLYUh5yLWaDoZ6fw8L/bSL +C9r6s2LcgTgbtyZdMl0L+XX7Ew/lfTsEIIhEAAAAAElFTkSuQmCC</item> + <item item-id="36">iVBORw0KGgoAAAANSUhEUgAAAKgAAAAvCAYAAAB3/oHUAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AyBJREFUeF7tmuGSwjAIhL33f+g7dazDIQkLpkqS7cz9uJYmdPlKIPXn93pceFCBqgrcAOVB +BaoqcKnqGP2iAvfVnTJQgcoKTAvotWS61c73v+OwzlUWn775CkwL6KO5e3lCCaz/+LSorgAB +rR6hzf0joJsDUP3xCWj1CG3u3xaAVq1Lq/pV6Z1YHlDd6VcRv6pfVfR57sxUcyjij5WB0HOR +ec6yZQb1lZ06gx5bTd7+pwZB26N7qq15vPl1GKR9K5P29nh3Ant6QP138P5jGHe/VG/4yxus +jwH6OgpNax7vfM8/RINZbbYGVGcy+UWqB6j8SHCAMxJQvTK0fJkVuojfWwPqQWgBq4E8A1Av +W6IvQwSEqrYE9BGZyBLfA9cLtLeUy+xsZWp93Ztv9uvLA4o0QIiNtezK7NlqdixAIk2SHDcy +x+xgPpOAzAbsHD8b1mpLNbqjYDWI+ll6Oxu9azoC/zIo0u1+NoRrz1YJ0JYvPR8tKK0SpGWH +RPdlifcKdGTQnW2s5dvKTJEscraeGThbpYsHaLRMMWvQ6CBZAStlkOwzzH6frqN1A4iygDaZ +VoPZ07DZJH0SnlbWmT343/I/oqfVd8iGEAGqNYZ3L8LYaRkUmTwbwN4yutO1rH66ybH+z9SN +Oot6ZQzCyCk1KLosWDsI3kONCMrqY0Qz6BmAetnTqlXNurb3NqGD9Arm1WGY/fmynTgS88gO +QEvHZwa1Mtc7HSmUvo0fccwe8Bn9b61avfOyTrVqUCv+mdUx/CXJWr5b52YMFn2upUAKULn0 +y20Kr1yo9ej0ZgYFCCgQpczSBAxLE0CBNKC6gcpsSwD+lTFBauoyzi7kSAhQnUnk8i7r0BUz +DgH9DvUhQL/jYo1ZCeh34kBAQd0JKCjUYDMCCgpKQEGhBpsRUFBQAgoKNdiMgIKCElBQqMFm +BBQQ1Nq9kMBGfxwDTEmThwIENInC6vu+SVmG30ZAk5IS0KRwwdsIaFCww5yAJoUL3kZAg4JZ +gK745Swpy/DbCOgbkurPu28MxVsbChBQolFaAQJaOjx0joCSgdIKENDS4aFzfwHZJiwLO46h +AAAAAElFTkSuQmCC</item> + <item item-id="37">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 +RK5CYII=</item> + <item item-id="38">iVBORw0KGgoAAAANSUhEUgAAAKwAAAA/CAYAAAB9wyM1AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +BDBJREFUeF7tnYGSpCAMRGf/fP/8brVGl2EJSWNQAj1VV1c6IcTOMwacuvv69/N58UMFoiiw +AcsPFYiiwCtKoIyTCuzdAGWgApEUILCGbP20d1ufv//h51kFmAFF/xxSQktgn1UAnJ3AgoI5 +m7PCgoISWFAwZ3MCCwpKYEHBnM0JLCAoYQXE6mRKYI3CElajUJ3NCKxB4BRWgmsQrKNJaGBL ++6PpOQ+4cn8ePjvmc3rXoYHdX9UVNvMJ1bzchgc2h5awzgvrnutZLo+vTmfJZP06pgFWag/W +SOM6VzkNsB4Vlu3E+OBPAazHtpMH8OOne7wI0V/ChQfWc5eAFfZeoFt+CRcaWMs+rHQHS2Pv +TRlnSxWwFIzQwFrTXXrcS+esPmnnrwCBfWt6CCH9fUhvEcw/TfSI6L9MhU23vXJwEcGIVx8F +rMViKWC1t2JW0fqkbF2viO7TA5svrtLqmvax6PbKunj5Xjm6JXkCa1lx+4ZKb6gCWiWy5DAH +pMf+s7TVmM+VxmuN46PCeu5posmgfV0BLaHSniZ6/moeLLsv2o1Xi+FPS4CW6KsXyPF2BZBE +o8UH8a1FLN0kHovbYg+r3c1awB6BWedYyQ6BygtY1E++sLUcIzkUF12IONqEpV7F0782/4jf +t2hi1UyyQ8+XCo8lhrAVthUUKZkRz7dqUBpngaVU0aRzyJMQeereCmyPHralmngmekRfLZpY +gEWrqMXnATxim2quAYzkh7sEiFoP22rA1IqN1ovWfKNFTANUuw7TLkF6x6ePilIlyL+XJrgS +2MNsDDd9KT/po17LU35BNftadbS0F6X2QYofFRp+06XdPWgAtKcCiAK/b7q+P9l9CccHsMf3 ++TEyOW2pAKrATukGXwpo7Xgv7Yl9fnz4QwN5wt7rMfVE7KvOeQKbgnZWz3eVTY8PQE/Q3wCX +xo8sKlubkbMjx/ayVta0Ep+VSanMkSThAjFGtj6ALT3OpV72uDzt+xgylP/JoyixrxQnvEsw +qzissDEyS2C3RSf/d5gYtG65ChNpp0AJaydhO7ldGlj0lWOnHNAtoMDQwPasfsiryfxVYz4W +0JumFxUYFtjS++iL19o8XPvhSLNjDoQVGBbYfYttoMUQ2weYrS4DwgA7QsUdIYYuFARyGgLY +USttoDxPE+rwwHrBiviRbLUKi8wxDUE3X8jwwHr0shpoFs21HtZjDkscq9uEANYL2tZkW3cJ +WGFbFbaPGxbY/Leqtb3QA+ja71tbYSr5lPZhW+ewp4uWwwJbS430eK49tu+A6Y45Vkc2PLBp +AntUWAQQAouo1WY7HbCHDDk8d8B0xxxtaZ5nVHhgLe2Bx6LNknICa1Hpmk1IYNNFVlpRpZag +1ipck+939B1zeMUa2U9YYCOLztjbFSCw7dpx5AMKENgHROeU7QoQ2HbtOPIBBf4Dod9zbTn+ +VXMAAAAASUVORK5CYII=</item> + <item item-id="39">iVBORw0KGgoAAAANSUhEUgAAAD4AAAAWCAYAAACYPi8fAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AYFJREFUWEflWIGNgzAMzArsxAqswAqswAqswAqswAqswAqprvpUburQOLlUSB8JqSB8uYt9 +TqjzpLFtGwnJeyZWipRjsN333eNiDWAdx8GCU3EowqdpopNsgSlJVgs/z9OP49hEOLBbjZdw +55wPl2WydV39siyvEA1HPsPvnAGfA5s1Yl5vLHJJSTLIduxvDceKDUxWJcVzPxfhre4zsyFj ++r73WknKyayigQ9MYDOGWXgIkBbQQJJbxp99Ssl3XZcMje1zZVOT8A9PCBGWbJZkO6i9im0m +HJOnBOYKL2mWtdbTSsSU8VrhuYtzZYNbZ1zzIaOrY0F+4vGUp1MNLjxH55XHyxgnVI7mSell +bbFYXT3m8Lwv7bghTtvHczC/7Q7MfVz1fQ7Jq3dwuprn2QzzTTj75BYTrM44DhrDMNCFYzF/ +clY3MxcBJV9ScdePt76SKrJoqM44JkNzK/mgSJ0I2d/3TTweQJn/mpQsoiXblK5unfAu71NK +/S5iLDz+rfAHtRBxzZfLJ9kAAAAASUVORK5CYII=</item> + <item item-id="40">iVBORw0KGgoAAAANSUhEUgAAACcAAAAWCAYAAABDhYU9AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AMFJREFUSEvtleEOgCAIhO39H7rU5aYM4cB01mLrTwP9OE88zhhh10hwu0bYFSyf6Cvgou2S +9/JXov5X/5/VEGVolOMAVkDdl7LpOYNSFahyIypZGqO5LFzpwrKw1AC1Si8XhuNkHlEQWQ+G +Q7u1AkvrQnBPeq6G12yiws24regpiHDInOvNQdTkmg3EOacV9+YRUufJMT9fnPyejZGa78Jx +PkUUQXPMytEXRBsRKAiX54Ib2dBS+8NZ1GpeFW/hiroLViXmtXpCA+IAAAAASUVORK5C +YII=</item> + <item item-id="41">iVBORw0KGgoAAAANSUhEUgAAAL8AAAAWCAYAAACR+U0gAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AwpJREFUeF7tW4ux4jAM5EqgJ1qgBVqgBVqgBVqAEmiBFmghD725MEYny7u2EuBizzBvJtF3 +tZZFwvszPNYqcF0ul9Vmswm0uBxTHbuZay3kj1rX63WQT191CAh2t9utTrlr0QisaA1HYb/f +R5pbpK2O4XxlDyP//X4fdrvdfJH/p56E/IJlX9Mj8CT/Y9qS2f/3U7NOp9NwPB6fqqm9Vtts +PF4OViw6VtZfpPz5fB4Ey8jF4lHj+9Nx/fvd9oXjL0yvJb4Ylq6v533LXouPmqJYOp8al8Qq +GM59gkbV5JNx1bH9btaUHC0gPJ7w/HNcfwsYLXlHbcjRjow8giWyouKOsjN21zH2SLsIHp7M +pORHiT4HIKiPljGvtRie/nq9hswzeTLEgJw7QnPhyozWbyH/3PM0CzxKoFZCMPpoTIgcggdi +h4lfnwCsLir/NvJbO0kHncq0AMwkaQGf840QAy1EpJyHVQ6Lko433tbWZkpca2PK1eEtnT/q +OwVDLgS4qI3JxIXKIvEz3bVkr3QfjTtq5kebEtMUJyW/NacipwMDLCpbKqZ1v6SD+o6Q+9aZ +PxJXpB5h5E8NjTtYd0cvIHlCkb6a1/ZGUuiA9fUI8pRGAN1ZSiDmOhEyglg4WHpp3tFPexg8 +0lytWiFY5GqNcCLVjeCCnjxe8vMcMJ3bes5fCp6xX7IVPV6hsXlyuXvjdf1XcpjiOT/SRS38 +dPNjRi1v9rZwQfFmeFCSdV/nMgHJW8nD4VDy93Kfsc8YZott2UZjqyG/193mfsPrkVTfi8TV +awARmwzhSxj55eXMdrtFfD5lUIKhRnNHMqrvnR65wkeTXxpI1G97WvCw8l0s+XPzWkoY9heJ ++lhtKVYNwdGRz8t9CvJH58Las8Yx6xprV3d0a6zyTsUaf26NSwZTQpZ2vnzhZX+UxdgvxRp9 +PxdbSgQtozdwbuNY1z/h/yFy+eica7DWOTM41vgr6dT9hNOxKjNrX3UIsI2jzkvXep4uHYqO +wFIRCO/8SwWy5/19CHTyf1/NesRBCPwAVxHiEzuX7J4AAAAASUVORK5CYII=</item> + <item item-id="42">iVBORw0KGgoAAAANSUhEUgAAAG4AAAAnCAYAAADuDH1fAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AilJREFUeF7tWdlywyAMTP//o9vEEzJElUAXh7D8kpka69jVCkF/fp/PI594CLyIyyceAo94 +IWfEV5dMGGIicAxxz00qJgPKqI/I9kVaEqesgNWfJXGrGVD6T+KUwK3+LIlbzYDSfxKnBG71 +Z6OIK4PPdr+rAffyP5I4rxg97Rx1HBhB3gibHgR+iKtbQTEM24OHw2g2CnHe+FjtfSkOq65d +K25GAcDcvfGx2PvXKmtjdybtushFrtG88dHaQ/e4WVdI1KQ2Q00cH1TheuOjsUcOJzPUFpU4 +So2cYqDWSPEepjhpIJykrWep2gcnPq3iWt9hebooTttzIShcYDAyOCTOWKPZ46QkaPEeNlVG +J65HWn1kgkXEyZ0z/LSKU3SOq9WBKUxbPTPUI/UBwcdyh92iRSZGLlRnb8+v14tvTrBWQP1N +CtZO67mqofYsr1ywArrUKnVQDFG/kqqT+u6tbw0vzbaD/Ac9ieuh7fjeE2xPW5YU3RUHN1fK +gSVo6bcWsHv5SGKxxgHnh7qLfbqKNKCvDfJ9JQQ3bmqIkfiSruUMEz2bHsPViNxRzHvJRHnf +Al2iAGzQ2hED8XCyYxKwzWGjNzfuJI6LlNO6lqokiusVgVO4ZjPHK05KWhJnrincgPSwryFu +UOiuZkMqjnv0OJW0qyu4lsFEY73Rvfd+YqhDXB1JHHb1NQS9hUbDElcPESe3RKo2whN3R9JC +73GlEpO4hf3a4vquxP0BLC5o8iO0ejkAAAAASUVORK5CYII=</item> + <item item-id="43">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 +RIAIXBeB32QuK+3Y1NfrAAAAAElFTkSuQmCC</item> + <item item-id="44">iVBORw0KGgoAAAANSUhEUgAAAIcAAAAxCAYAAADwdLpiAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +Ax5JREFUeF7tm4FuwyAMRLf//+itlZqJUYMPcga7uNKkrSXG3L0Yh6nfP4/XV75SAUmBJxxR +X4/1RE3dTd49DcOqm2Dw+GppGRKOBIMHxhVJ0jQcHAwwnjGun1Ic6X2+DX4j1toeCcerCX9z +iQGeX+v1zELDwTavjMeOrVvhc8Q/TXymKGdlYWC9vUTSwyLXhKNS1QI6C+NWxAwJh5WBjMph +ldsKGKQ5rvWEaUgtDGD0HAy4dkHQmvd4OMTn+skTVwtwdwJzNBzIOUfrzKN17U4z2XMfDQcq +prRltN5DY0YYl3AALv2J9Npu6r97R89AeLdDEg7AmoQDEMnDkB1NX+tpps5lR26WnmTlUNSt +G8+yipR9R6txtTTPOrYIh+c7wHNu1matjv8Gh/fDnIRjHSJZOdZpHW4mFQ7rSlLu1ci+nZVj +HWNdOFYYkXDoZs9oxLipm3CwwGDFQQ+aWkJGeF/HBBuBVGAkkmnlQOiduSuQhX3SmBmNEO01 +jaCeQwvS+1yrHDMLv5PPCdeaVY46cE1g6/MWqRoco2ax443OH2G8GRxoFShNav3+jMU2kx0v +gtmjOW6Ho0y4lwzbzLvxvDamowCsGC/2HK2JW8ZEqhx34Vphipc5puGIuq0kHDh6Q3BcPUQN +RmtbYe199RaGL+995N+CyV+FlNZab2F38t5x7TAcO5JkwVFXDamK3Kks7HhetD7iqwmaeXfA +uIzs9V+7zR6d/+jKURrKAMMq3qiprPEJx0tJJhwW5zssw0fiJByvg7oeHMgjvHTuM2KEx7HH +w6H1CNcTB2qeFg+N42HcMXBozajUUPbek8xD5/BgPJLDsXCMnEsg/QgSr65Co1UJMZQ5Jhwc +s80eYnBL2DvX1jGRsxamwbOx/m2Ps0F2XKeZJd2R2jW9ddy5NuFYTAhiFvMOReZDJWDmhc45 +My5s5UC3FtaTgxUcUp8yYyT7mjeA2RNYx0MMY8BhYWC57SHrsNZS3fpWJ8CYDxHW+xMBQwdm +DPFxnDnBylgaIAkH7kZLyzD/lUUPn8pxGkC4fJ87sqdRaDg0yxIOTaH+57/ps2TUNeM5qQAA +AABJRU5ErkJggg==</item> + <item item-id="45">iVBORw0KGgoAAAANSUhEUgAAAWYAAAAeCAYAAAAfILQOAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +BThJREFUeF7tnYFx2zAMRdMRspNXyApZIStkhayQFbJCVsgKWcENeyeXRQnif5KSKPnrrtdL +TYLAA/gJKbb76/pzPegSAREQARGYh0ASZl0iIAIiIALzEHiYxxV5IgIiIAIi8OcphjCIgAiI +gAjMRUDCPFc+5I0I7Erg5yFr+p3Trj6ceXGUrzJw5ipQbCJAEJAgE7AahjJ8JcwNgDVFBM5G +gBGNs8W+RTwsXwnzFlnRGiIwMYFFNNDb7IlDmdK1Fr7Dhfnj42NKOEdwSuyOkKXz+WgFme3u +zkdkbEQtfIcK8+fn5zX90dVGILH7+vpqm6xZImAILIJg/7agrBBLmLFSWpPvUGF+eXnBItIo +l4AYqji2JiBhXpd4C99hwvz9/X19fn5eN8I7sJ6EObHUJQJbEWgRjq18O8M6LXxvwpy35S0w +3t/fr29vb7epaJvfslY0p3YrVoozutWL1hv5enrOnFiOvFgeLWvPzhWJibmFz8d6e6d3T3k+ +l/zsXat3fslXxCbDrqQpy7pM7qJamIHvPx1zT3CpW7bPl70AIzBrvz6rXynuxHDrO4+evOe5 +mplrVFPLpo/GpdfzsV431NIlsWt7ojQqn4g/6OGB1MYyZmumtoaj3G3Bd5gwXy6X/27BkWT0 +JL9nru14emyNnJseYySWyDWqQEbZWURrjS4G4dE7BuHgiYeNOdrcPb5GtpE4etZH5kY+2lop +/VyrozVjjHxfc+1bzFHHgyTBg7qXMKPgmC4J5TBi3OPjI2SGibNmELUDOWU6SnTODOMQDqOF +uWWPzCAcUb4iH1Fh9nKC2Gd0qaaD6FoRE+b1YR2zV2CL+G0lguw6yGZkgI4Yi/qEjEN4IHbY +uNawaX2wtYXE2nNA5TFFgsps5shuKW5GSNjcjRiPxB+NqeXTMqvV2xH5NgtzBNWeVj0bld2A +iG+Lfz1+jSjgko2oyEbzaGXgzesVSK/T6eGNMIu4R3eXpbrL140OBTQPUX2jdlieCEPLqBZ/ +FMdiCxkXxczUZLRetBbLtagBUbGhi5ScjQJEbbPjEHDsKcr60DMe8Z8Rr8he9DoTywiu6CZi +hSKKIxLm0nqeeLD7Co25lPe99lnEM2KD+o2Mi2r4aHybO2ablNJzUQQomlxmHJIkay+aw6zf +O/aoz5iRwxlls0c+mDW9A6il5tnDLFqDiQPNR+u46LBDDrAo3qhJOSJf933M9oSJTpz0ToL8 +48R5d4Hc3kT2mcKIisGLzXZE+YnviU7UtZU41DqvtObod2UwPHI2JR5entA4S/O9uUzOe8fW +6rVke2Hq5RKtZ6+uvHiQfdXLYsT8WvxWKKP9GIm3x8QTbGY/WA2ozR3B7bZezRhyUi3zS+9j +jhxl7Ee2ouQx80sJ9RJSi8F7Ld/Udq013sfMFpP1L/eRtWW514R5dA7ZnGu8CMxCoPqRbEY4 +06fVXl9fqbgY+4zhXvFYW5jzU9jGtfUn/2qdWUlUmTxEnWZN8EfksNdXzReBvQgME+b0wYin +pycqjtHCjN4+Ik6ivrV0zDVhTofbqO/K6OHB3mIjTEtCXOrOSwcjal/jROAMBGBhrj3HWUCw +34wWPWvaEzDq2xrCvGfcXhfrCSjrq+XqHVLqmFmyGn8mAuG3y+VdV7RZ0i//2C/gYexvDd7z +LRcpO8Z2qd6BVvr3Gb7P2ovHxtySCxszw7FlPc0RgaMSCIWZDUz/CwdL7O949lBrX0kzRUAE +ZiYwXJhnDla+iYAIiMARCEiYj5Al+SgCInBXBCTMd5VuBSsCInAEAr8BgfntrcGvqNsAAAAA +SUVORK5CYII=</item> + <item item-id="46">iVBORw0KGgoAAAANSUhEUgAAANgAAAAWCAYAAACiwlIpAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +A5FJREFUeF7tW9uRIjEM5EIgJ1IgBVIgBVIgBVKAEEiBFEhhFl3dcEbIo9bDu17Krtofjyy3 +Wg9rBu+f6TFWieNyuaw2m02ixlxVveOzWCvZ8kn2WbjoVpYSLGtcr9eJ/nodveOz8kb23G63 +l2XSnFXvkM9jYJWnapr2+32munRdvePzGCzZ9Il2erjpYU1agt3v92m32/Vgk4ihd3xe4iiZ +yLZySHNe/WNdjIFngj16WHoX+/vnGafTaToej8+lpb6obg+ehyEvy5bwzYIcs2tfcJHEiWf/ +8/k8kW3lkOZAWFWxpbjI8m8WJ1FbM9e/RKE3uQgQnV78/UvSF9kjYniP+DL4Ic555yDNRbhD +1mb5NYMTBO93yaQl2OPL4Vur0oIsryMlfERyqc+rO+Ks6P7UHpJt5ZDmahizbM7S04NPIv7k +a9MSDE2mqCPg9axFRFqcTGItuiKtOe2zXq/ftpPmJEwon5qc9tzCx5xk2TqtGDLkmyeY571i +yTCIdEouQ4LxqplBrFUHZFdFKVrcvAmGFIAI/tanqxZPPEaRYoza604wvoHmZBRQLQgkEhZ1 +GhIMCSAkYcwY/ymN7q9x/9a2FB+00AKo+dvr39q6KCetimbJFxQTpZCXpJoxmlMQgFJwQOvA +BCsxRuyHMAlCGftbE8zjc40b7bmFnyxOEEzWovhjCSb1/D0lGIKvVdWztEBIUHB9n/QOFikW +7mJsyH53gvGF/IjWjmz6klVe26kBqbUkmv6ZAzgA2QmG4NOqGYoR8ZfEj3d//hWR9pfmvO9g +WuFZih3J3zUeLZxIxVuKWcQXFhl3giHkLwW39DuTBrzFCffckyWYB58UWHCCa8aDzzWOvut3 +MKvds7zU7ll11d4heaurcQVSvij2YwlGtwkOh4PJhqaECDc5rPh+Q4L1cJOjdQtca/14EjeN +J1Nk/xdevBdlAUw/bm63WxMMi35YsfCJntZ68P2GBKOiwe8iSnMwf0ww0hZLJ1X09Cp98lEJ +hhyN1lvcvH2IOBMJICs+nmAIBwgOi4zGkXQqe05qCyZEtnWLOGOQWlDpGYK5hYx6s7cMeq36 +0EcOfvFUA23Rr+nSnnvwzUkmBYy2X9bzGkfS/7f18D9vHC8vTJFCKukqfVT6KbJPmu+yFM16 +6J2g59E7Pgt3UjGzFjjLfkPWzoB6gtlVjhWDgcHAs00dVAwGBgPtGBgnWDtuh+bBwPQFoiDr +Ta/yWFwAAAAASUVORK5CYII=</item> + <item item-id="47">iVBORw0KGgoAAAANSUhEUgAAAIUAAAAWCAYAAADuKF/RAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AftJREFUaEPtWAGOwzAI2/7/6G2dlIkyiHEhXTOl0ulOTQjGGEjv/ng9t/UsBiQDmyiu8Lww +pWBk7VPO/8w4l4lCMrJJzdoXhjL9UUsU06ewPoCPKLZKaz/NjXw3uhLl+RYWFHolPsQFwjL7 ++q5TWMRWkt0jS/th/bL7UeJ+yQXCNnr9a3zoih0NQHYl6YtNMrsfxbVEoRjSYwQRWLE+ulPo +UYhiXKIwslpdeUg4SxSIofPWza8PVEUReJ6oou9ZUbL7UQzRTlHtF+GKrmdwDblTHBHVjJ3i +SJzRpGb2ZXEN+/pglTqjKLbEsXFmks3YZnBR/6eQlzX9paDVyYLSXz3yPOvsrIgiBOvLqWVj +4bCw9+Jr4rIq3OPcw68xe2PQw/O2j5BjCSDyjjkbiQiJANkzWJi9kbuHToD36d0TRQST5we9 +/xJIxJkVRDtI/2572SSh/bOJwusyvTg8ThE3FudIiJ4A311riYJlYL+/ulPIe4pXcL3RwQjE +HS0sJagVndEprDkbrSY2XrR/hCikMPTfPTyR3Fh7UuNDJ0MqWbYjK2lHyNU22oc3m5GvqnVP +nIiLqF0ThNXqe93CG12yYK1cfvJZRVD2nGylZ+2z+K9mn+GDvlOMCj4TBNNiR+G/2rkZPpco +rpbNDh49FrwxfWR870bxRJwsqCcx8ATvKqp7trRFywAAAABJRU5ErkJggg==</item> + <item item-id="48">iVBORw0KGgoAAAANSUhEUgAAAKgAAAA3CAYAAACYewEiAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +BEtJREFUeF7tXYtuIzEITP+8f37XrLIRccAMXvBjTaRT1Cy2gRkP2Gl1P//+Xo98ZQZmzcCT +oPnKDMyagcesjqVfmYGjumcaMgMzZyAJOjM6Bt/+WsjnWeL4d6fXvaK5EzKGWEpS3omkSVAD +EVYxTYKugtSmfiZBNwV+lbCToKsgJfi5GoAWfy22K8C4XQ+6KoCI34jNCqSkPm5F0NUBrPlP +n60e55YE1cAt7xBnvVfk4qC+3u0udBsF1VRFAn62kqjFMZu/V/3ZgqAIqKsQ9Ph++mbfFtVI +nAR9ZScJelXrYsYnQZOgMcxymvX2BEXLIaKgMx2c0LiceDJsmiQoqKCz/UJGEnTYnvFdGAUS +UdCP+7nBBxU0Lt9s9p8tFZTkvLxPrJ4uXwQtyz7XBqCfnSd05C4zCdp/s4SsGAGkVu5r3+qU +z7i5EJ8Rm5CEdp40FbQh4RKpJKWUWoNzHukdUfAG95cakgQ1woX0qhYFpRfvJVGToBv80Zxn +KZSIVyv56LMaqTmiesZl3KNdzVNBwXSXByiqdvRQgx6IuMNVHpK+wXgTVEtsjx0b4UMPv0GO +u5r1iIvDQwqCblJ0oyExfCgo0l+5ZpmZzNsHJAnRMUXMHx1XrTUp49FsJUyRGL5KvLUXik4+ +EsSOh4mredFw00h3jkf8kOaCxkoNODI4khhlydASWis9rWNnHncVHy02hKBlH44e5ug41Y9o +YGkfY+lp6PWLFkTkRrmyduTYFoJasEAJWqu4nMhYKzR7iq+pl5VkrSBpCioBhCSW+iSBNsPn +IzcekkfEhgoNav+BT63h1SZEdrFl13J9DbeGRt6SgK2bZOZxSO45bDk8kNIs4YDkumwFSh+q +G1FboJaIliRpoCOJsJT/CB+1GHo8j45LEycOA7SqcUIktprUuFQmjene5OXaB8kHFCDUrgep +PNfoEReHR0lMC2a1aq0S1Jq8Hgny6MFG+2nNK2p/17i+SPxW0N/P89Lj4s9oolvtUIBQu1Y/ +Ro27a1wsQZ9kpIT0+DkaOBQgxE4rU9GxtMyPxNUy72xjDtk8yYm8H2C+1FV7jwwWBeiKHTo2 +Mk6xNxv8Jye9Yn60KOdbcRTljQpCat659VCSobcHUTFZ50Xjss47m/0HQamaevWmowNGgUyC +jkaKXz9/H/SVlyRoEnRIBrwVFJ0vOthZ/AiPM3qB0fOjQCIKeva+o2M6WrFdDkkzJDvSBxRI +hKAzEQONKzK3PebOHpRkmd4OSAQoPy9vFNA7VekmAr2hSIL22B6d1vAEE1FaasMR+n1DwvzP +cEgb4RlPJwial7m9gnqXZYmgkvpqBKX+nbYaAbXnzWyYcGAS1AiKt4ImQesAbEFQTxWNIGjp +X00hd1LPIy9GAVnW3ANY5ACE2JyEpP0mLe+1PtQjjpVA3Iagnio6CuDdyLmVgtKT8yiCXVl3 +R3JuSdAVlXRXcm5L0CtKlmP7ZuA/gLKa2DJmy1YAAAAASUVORK5CYII=</item> + <item item-id="49">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</item> + <item item-id="50">iVBORw0KGgoAAAANSUhEUgAAAQwAAAAWCAYAAAA1tqLaAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +A/tJREFUeF7tXO11wjAMpCOwEyuwAiuwAiuwAivACKzACqyQ4r6G56qWdbJkkw/nvf4hknw6 +OSclhH4Nr2OzgON2u212u90CMsmnsJY8F1/IuSYYBGPux/1+H8LfGo6Q5+PxWEOqPccJMrCZ +ICY1pOPxqPaZs8Pa8p1zrZaGffaC8Xw+h8PhsLS6ZPMJghHy7kdnoDUDfwTjdVsVnmf8/Hkc +3vFSmC6Xy3A+n9+n4jVbrE8x5bhL4aF4Ed6v1+sQ8vY8tLg91y6J5cVlydoan9a81ublrQw0 +MU/R0BCstQ3TBX1+kcLulY8WHyIoWmwh39ZTlRajlSfEf8p1RvAHmxq81uRl9oLx+mbk33he +gzDPwsaxSuKG25GQN3KUxE/F9YqDYNbYWLnUrBXbevHhFSfXmDzXUAuGduT3BItu5E8KBprv +yGPpht1ut5CrBk8uIBoHAuVsZOWyBA7Kh2QnnS/BNvrU4GWxgkGFzUI8OjpqC2TZLKgvYofg +RuJYObb4t8aHrDcFXhGcGt7VgqEJjl5ompiUAGmasBDGTVO5mAi+kRcrNo63GrglnjU1LLXl ++EIuTGlNpBYteI3XkDDHkwQ3fSN5IfvovRa3qFQctINbACOEIRvZAwMaA7GLbRB79Faspl1K +CEuxI3VFbby41OaC2kt2OfySL3oLWRKHa3zqCYNT2ZxKocUvsUvdy6NdXrMeSrpkhwgcgmsK +zzCkXJE8LDZeXJZMwmjukl3uvOSrueZKY9GBoul7GKPYxCC4ose21C8mKnxbEL8qHQtabEeF +TsJAi4ESLm0AjgMtPu9vSbS4UxcZ5T5VC/SzMT5XeykOxycXF62vdBug2TfcXv13kZL3o3J+ +3rxkBcOi9qgv2v1HO6mQqfcwJCwoBimO5RYAHSdTF2aN9zAkntFcc9xK51LnS3ClGgXyWUm9 +JZ9S/NIeLY2ba5Q5cX77SQl7n5eI0Hb+8Mbj6XRSwUQxqIL+GlsLyXXuGEvrNz05HlK50s4e +20iCEeeONgypRjQOF9ejbqioSpi5PZCbmpCYVDRRvv/UULuQ1R69WNENE15i2u/3KlgoBk1Q +Tp01MWKxTBV3/CwIpNdvSSy4OcHgsK9JMFryatljnKCye7FkMYsP7TjQGCT8tkX7600UgyVP +i6+ETztRWbDkfGsIBu2u1s7PTTg1moYHz63wIuukbHx+ZaZkKhaJJCjmIQ+3THjoqf0xFodB +mUo1cw7fVP73Rzwex92I4qYNAfUbhcPaqVM8UgwpTNUKmwkc48jxaMWbyp/yzWL5BDE11gz3 +9Ws4tMK4Bk56ju0Y+MiE0S69vlJnoDPgyUAXDE82e6zOwMIZ6IKx8AL39DoDngx8AysA/TsB +PkTuAAAAAElFTkSuQmCC</item> + <item item-id="51">iVBORw0KGgoAAAANSUhEUgAAAKcAAAAYCAYAAACfiu1MAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AqlJREFUaEPtWotuhEAItH/eP7+exrXIwTIsqJsLJk1jj0WYGR7m+vN6X0tdhcCMCKzirKsQ +mBGBZcagKqZCYJvoBcM4Au9JuK5E0/2MZzTXyRJngI9VmHVdh0ChG8C2xBkADzh6iJOOp3aO +jyzA3y0ms4iixZGNXba/CCktFsmHFCe3o1wh9vT8qXNKpM8iBF4wEcAzznJcsrHL9jeSc497 +NH9awCfhASvRx1jnSh9J6uozMxSMJZ6MGJ/kwhu/JtZUcW6v8Psb6Kwik0bF1bH2xhXvCF5i +e7HfxYXU1dBn9wpVKjAUH/WFCHWQIQq6iyB7iVaNGbGgPjwjD/Wp2WVw4cGYi9LKtTfikfGv +5t1bdEdBRQQ26ju7s1vj2SuYXrfp4aIJAO1eETytqYAUBzK+vU0lfeccqRRPVTdx0t+jxESI +t0Rt4eAhPDNXjrXWnNwvL/sLjsalhYcYhxUEAqK1M42KB+laT8RnCbPFbY1DL27RXFEehoSk +vH0jHdUc69LI8VSB1oUiBPVWDpo0fQbPw+oUI4RL5PH8I8/1cEELYSSXXgOQOOW4W9Onx41V +LO5viLSA0W5iBRT5nAMhdbCRrmDtZN6Ys0SUkYs39jvt/78h+j3rdFHuj8rZP+f3hyDen5/E +wvxdkaRGutSJkNHbdr1sEZQ4MfY3Ra5CpGLs3W9EE3t+j/rDwvNZ9cSpiRERSqY4keehWWfG +hT7zTrtDnE1U1u8mRm7n/fsVSV451jXfnjwyfNDnRfY5T9xP2S5ox6QdkY7yrYu2/2ncOyq/ +P436i8c734npSJc6jbRDS2REhcXjyOqgNP4sn0+J8XO3B3dNKrBT9QbPzwIEEgcqZMRX2dgI +uN/WbZffa1HivJfbEqcT728bnc70bzUvcTrhLnE6AQuY/wHZzd83wB/xsAAAAABJRU5ErkJg +gg==</item> + <item item-id="52">iVBORw0KGgoAAAANSUhEUgAAAQwAAAAWCAYAAAA1tqLaAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +A/tJREFUeF7tXO11wjAMpCOwEyuwAiuwAiuwAivACKzACqyQ4r6G56qWdbJkkw/nvf4hknw6 +OSclhH4Nr2OzgON2u212u90CMsmnsJY8F1/IuSYYBGPux/1+H8LfGo6Q5+PxWEOqPccJMrCZ +ICY1pOPxqPaZs8Pa8p1zrZaGffaC8Xw+h8PhsLS6ZPMJghHy7kdnoDUDfwTjdVsVnmf8/Hkc +3vFSmC6Xy3A+n9+n4jVbrE8x5bhL4aF4Ed6v1+sQ8vY8tLg91y6J5cVlydoan9a81ublrQw0 +MU/R0BCstQ3TBX1+kcLulY8WHyIoWmwh39ZTlRajlSfEf8p1RvAHmxq81uRl9oLx+mbk33he +gzDPwsaxSuKG25GQN3KUxE/F9YqDYNbYWLnUrBXbevHhFSfXmDzXUAuGduT3BItu5E8KBprv +yGPpht1ut5CrBk8uIBoHAuVsZOWyBA7Kh2QnnS/BNvrU4GWxgkGFzUI8OjpqC2TZLKgvYofg +RuJYObb4t8aHrDcFXhGcGt7VgqEJjl5ompiUAGmasBDGTVO5mAi+kRcrNo63GrglnjU1LLXl ++EIuTGlNpBYteI3XkDDHkwQ3fSN5IfvovRa3qFQctINbACOEIRvZAwMaA7GLbRB79Faspl1K +CEuxI3VFbby41OaC2kt2OfySL3oLWRKHa3zqCYNT2ZxKocUvsUvdy6NdXrMeSrpkhwgcgmsK +zzCkXJE8LDZeXJZMwmjukl3uvOSrueZKY9GBoul7GKPYxCC4ose21C8mKnxbEL8qHQtabEeF +TsJAi4ESLm0AjgMtPu9vSbS4UxcZ5T5VC/SzMT5XeykOxycXF62vdBug2TfcXv13kZL3o3J+ +3rxkBcOi9qgv2v1HO6mQqfcwJCwoBimO5RYAHSdTF2aN9zAkntFcc9xK51LnS3ClGgXyWUm9 +JZ9S/NIeLY2ba5Q5cX77SQl7n5eI0Hb+8Mbj6XRSwUQxqIL+GlsLyXXuGEvrNz05HlK50s4e +20iCEeeONgypRjQOF9ejbqioSpi5PZCbmpCYVDRRvv/UULuQ1R69WNENE15i2u/3KlgoBk1Q +Tp01MWKxTBV3/CwIpNdvSSy4OcHgsK9JMFryatljnKCye7FkMYsP7TjQGCT8tkX7600UgyVP +i6+ETztRWbDkfGsIBu2u1s7PTTg1moYHz63wIuukbHx+ZaZkKhaJJCjmIQ+3THjoqf0xFodB +mUo1cw7fVP73Rzwex92I4qYNAfUbhcPaqVM8UgwpTNUKmwkc48jxaMWbyp/yzWL5BDE11gz3 +9Ws4tMK4Bk56ju0Y+MiE0S69vlJnoDPgyUAXDE82e6zOwMIZ6IKx8AL39DoDngx8AysA/TsB +PkTuAAAAAElFTkSuQmCC</item> + <item item-id="53">iVBORw0KGgoAAAANSUhEUgAAAZQAAAAvCAYAAADEvzyiAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +BzlJREFUeF7tnY9RHD0MxfOVQE+0QAu0QAu0QAu0QAu0kBZogeDMLJ9RLOvJK//bezeTmeRO +a0s/yX629/by3+fX6xdfJEACJEACJHCWQBIUvkiABEiABEjgLIFfZxvg9SRAAiRAAiTw97SL +GEiABEiABEggggAFJYLiBdr4OjpN99L+/jlepfcuECpDIAES6ESAgtIJ7I7N5mKSi8qOsdBn +EiCB8QQoKOOZL9sjBWXZ1NAxEtiCAAVlizSNcZKCMoYzeyGBqxKgoFw1sw1xUVAaoPESEiCB +bwIUFBbD/8WQ3ZCv3UMpCQ8xkgAJkAAFhTXgEhT5TTDiI4EVCLAu+2YB5UtB6ZuHrVpHj7y4 +Q9kqrZd3lvXYN8UevhSUvrnYrvX82ROtkOT78nkV9JkW7TkXPv+yXdlMc9gz2U1zcuOOvXwp +KBsne5bryE5GPiCZ+1p6eFJ+7i3kWSzY7zwCR42gxzHzPN2z5xa+4YLy9va2J70FvN6FnSYo +2u6mtKM5cOdFm96T/14gLXRhUQJSSLgIiU1UC99QQXl/f/9Mf/hqI5DY/f79u+3igVdF71BK +QsLJYWBCF+tKLky0HUhtobJYSEu505NvqKA8PT0tBW5HZ3Zg2ENQclGRf98xj/S5PwEKSl/G +LXzDBOXj4+Pz8fGxb4Q30HoSlMRy1Rdywx2xOUQjX33KM1vuUlatgjX8apnw1vB8Dy9a+H4L +SmkS8IT9+vr6+fLy8n0Juq3y9IHa1iYia7KbPYml+yiJZeRrdkyRsRxtna3XWjvavaAecUS0 +6clvbqsxjGIrY9N2ttqRFsKmh69Imx52pbkwrz8kTsRmBb4/diiewpQBpt2JvH+CHI0goKJt +VvUrxZkYcqeHZfxMveY9rFwPFgnPZFzaDcqJrWVVavmY70Zr3KPyifij2SDxazbe98/4WRJr +y/cRfMME5f7+/p+jmpUHqlypRSb3TFvpuCuxRF4jCgTxY5ZNZPyr1gPCFuFw2Gi22udI24iP +h6hcWVDQHRnKy2t3KUFBxSOyQNFVRs1uhD/ewri7u4MuQX1H7aBOFzKKjsuz2l8Iw4//FM0a +E1GCgo53j4BE57MlR9akjAhjyebwBWlfu97iY7VtXd/C6x8RrSXc04FWYMcgHTVYvf2MgOzh +WCtGZAVUslkxRi+Tkn2PuHq0qeUkamxYPlu7r9rntbatdq16tSbAiBrxtoH4ZNnU5iDJ7Gp8 +m4+8LKhyYrSKvpZ4OfAs0UB8O/w745e3WFF7q8iieWjtrfC+Z4V7lq9VV1b7OS/LFv0cybVV +L9aisTRe0Fg8zKxx2WssIgwlo1r8Vhye3YgV8w58f7Czis1T+N4VCdq2185KUqTYeX1D7BH/ +o3cyiF+r2aCcEL/lyhG5plXsvBOc5YslKKX+tEnPOx/sNuFZLJH4KSg6xeYdimyydO6Pgvck +GbG1JprS59Y1SL9RNryHgpGMylmPeojyDSHh6UsTzpax6hVhqw9PHAiXMzaWSEcJD9oPwmYF +vupzKHLlYa1E0jeT8p8N0baMcrWUr5QQaEiRWEnSYvP6pq005UBD+svjiv6WVxRXhP0oG1lf +OeNSHrX6LdUpktdjh1hrdwSL2jgr9X/UQinGPCbL91JNecedxdDyocfntXnOO64t0dFyd3CR +8e3At/qkvKV4ecCl51CshHvat9qykue5vpRQLZm1GLTP8kEt++rxHMoVBcWaLPOFijZAPTVR +mmhmi4nHf9qSwAgCYYKSnu5+fn52+XyrgiInuxwan5R3ldA/xt6VM9qbtgjo1R/qF+1IYCUC +YYKSHsh7eHhwxRYtKLXtqsuxL2PUt5YdSk1QkihH/ZaXh4d19OPlN8u+1wSPCsqt7AZn5Zf9 +rk0AFpTaed8RoveXcq0zyZnoUN96CMqsuHtNxqPikZN+ftR1dqKX9VBaFGg2o+JnPyQwm4D5 +a8P5KtcalOmmvPeHDT3tj4al+ZZPXNJG7go0IS69P/v/k9lZULQ8yFy11JDMVSn/uY1nZ9ji +D68hgVUJmILidXyX/3XQG9cIe68YR/u0s6BEs2B7JEACfgLhguJ3gVesQoCCskom6AcJ7EmA +grJn3rp4jQgKci+ti3NslARIYHkCFJTlUzTOQUtQal9AGOcleyIBEliVAAVl1cxM8MsSFOmS +9SWNCSGwSxIggYkEKCgT4a/Ytfy2Us3Hs99283wDbkVW9IkESOAnAQoKK6KJgHX8VXsmQ35W +aou7n6a08CISmEqAgjIV/76dayJQ2nXUxCff5SQa8t/7EqLnJHB7BCgot5fz0xEj91o8O5SS +kHCHcjpNbIAEhhOgoAxHvneHmlAgu5AjcqQNCsredULvb5MABeU2894UtfbzIvKYSzv2kj9J +Urru2K1I2yaHeREJkMBQAhSUobjZGQmQAAlclwAF5bq5ZWQkQAIkMJQABWUobnZGAiRAAtcl +QEG5bm4ZGQmQAAkMJfAHu9GrzL9jFtcAAAAASUVORK5CYII=</item> + <item item-id="54">iVBORw0KGgoAAAANSUhEUgAAAIUAAAAWCAYAAADuKF/RAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AglJREFUaEPtWu1uwzAI3N7/oddmUjJKwQec7bYTkfZjtTHn4/josu+f+/PVTzMgGThE8Q7P +HRMFg7WnnP8zYy4SE8lgg8raT7zKxx/Vovj4EM6/wCWKI9POn9ON/Gx1JsrzLSzo6jPxIS4Q +lk9ff6gUFrEzyR6Rpf1k/Wb3o8C9kguEbfX6U/vQGbsagKxK0lc2yNn96F4tCsWQbiOIwBnr +qyuFboXoji0KI6qzMw8Jp0WBGNq3bn77QFmE4I0GRU9sq0WBMOv1SKWoDMRZHNX9TFJPnymq +wa3aeTOJFWSrhXikI1GweKvBjtjRSY2GO0Zxx9lRe5Zk5Gf1TIH8R4I5cw+DJ/V3Cq9cVtrF +qFzr87TyrUxgSBhVi2iLOP172CU+68wKtxbuSDX0+Lxss+r0AoLKLfKDgooqCbJH/pn1DLbR +3gy3niCsdqoFqfc8CTZLhswI2R5aFH9MjrIVicLiNCp4FHwphlG1Tb/7iIoiepHMoDiaf7L+ +sslQHUj1XPVqUXjCeRBMlpyIGpFjVPrQuteTs3dh90e4qIgC2UQEGsGmE/z0m6oUOhjyUKtk +WiUqciE0+GnSrN/ZgCN7r0VYHGkePFHLfRa3CNMVVPFy02vrHs7fMyKOduxhyz9rv+OOO30w +fLQodkZqo68WxVHyyH/n2xivsqtoi7baU8bp21SKDOjeu5aBG/3EjJn+XLBOAAAAAElFTkSu +QmCC</item> + <item item-id="55">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</item> + <item item-id="56">iVBORw0KGgoAAAANSUhEUgAAAGcAAAAWCAYAAADdP4KdAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AaJJREFUaEPtWFsOAjEI1Psf2ldcg1hgBorbjzYxMSstwwyPrtfbY132WpOBpzgrrAc7JRjV +/SXnTZtrjEwEVSW3un9iKNOO2uJMo3L+QR9xnpl3fA438ll3ZsrzR1ii0LvwaU4kDgRnJa6v +yhkF2BW0Jlv7Yf2y9pHY74uSaYbglcIi9j+ceCR1BGxFmwGvsxghHLVhY7fwH88z8Q1njlfK +aHCsXQZ8lziSUEQkr+PothZV5FdMaCazZLP23eLo+YnMEjl7PZ487JW4WirHG5RWJlaCYLIR +SZoMFqR9WTam8LNnTiawEblIO2HaGls5zNkSv+Unw0v7bQ0lOQOeJRCpmmyiRB0hEx/1nmO1 +q0wbiypWzgQ9H0bzAk0CRiDPj64QZHZ7PI320/8QWIC9GwtCSERulHnRfgTDajYpcXSPtQYy +Q1hku8UBUkffOJBbCnDs668jb21xABYlSex3hnxmJs2+SgM0/MWEamt6oMmqQa+QyOBEXvii +SvoLe81OKHE6sURtLfJd3R+df8bvW5wzWAd9bnFAos4wW0acM4Jf3ecdgZYDsht6bwgAAAAA +SUVORK5CYII=</item> + <item item-id="57">iVBORw0KGgoAAAANSUhEUgAAAHQAAAAWCAYAAAARprh2AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AZ1JREFUaEPtWIsOwjAI1P//aF9xC+LBQW2TBllijOsK9A4O3PX2uC591UHgSWhfdRC41DlK +n+Sltg1DLQROQh9N5NlLX5/jQvdqHX/NaTSO0ouHqbUmOWERf1Qo2pgxxpz9w7qHl15jv98D +60eRMQybUIZQYj2b/EgNkbuM3SY0QZj36AG6J7daeqPkNaETSZJ9LdIb5fxhhcFIj0ixaZtl +DTLOApqEZ9pMJpPTxsmGERKseEdsnYmUIfQXR7MB1PZWJBmqzpkkzLQ1RCgCcTVRGfsVKvTX +fxpfLxZ0VmYGAT0YoCmO3ZOjepSgSJ/TFZw5ZzSppE2kfJZPa98QFtFgWXV6cszWrD4diU0n +CBpK0DPWvojPnZ8ZfvXnDUuoGqxeLav6yEj5zcCLEOplelQFWBy7rA8RGtF5rwK8itEEM6Ai +hLJqrERqmtAIgLrCmOQymYz0cc9nS66BoDV86KaOmnzknqxOLduMVDbkoPWMD6YUu6ynK3SX +wFEclaRzFOcmdBS5TfdtTyiSeSSVSNI3xXxpWNsTuvT0BY3fAebxE9psfjhWAAAAAElFTkSu +QmCC</item> + <item item-id="58">iVBORw0KGgoAAAANSUhEUgAAAKsAAAAWCAYAAAC/vGyyAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AudJREFUaEPtWoGNwjAM5EdgJ1ZgBVZgBVZgBVaAEViBFVihXyNR+U1inxOn35ZGQkKqa5/P +19iE/nT92sx03W63zW63myl6G/bS87MZEBYk1jmu+/3e0WfJi/J7PB5LTtGV28ZlPSHj4/E4 +ITTtoHxLngiDsxTr8/nsDocDkt/sbUislO+6+nGVk9BPCDS/vj4RK9rfG9PlcunO5/MAkcdp +FTPHh8ZVCovEavF8vV47yjdyeTGjsSPy1WINqpQJRAoWTRa1o11VzqspvFE5oLhSdrW4KM+x +u0gNb7X5Lk6s/QnAR2uMJqmmYJJw7svrl0YAyhdZXt8l3cKLIwoTxXXvrN6WGwn2TRQqzJrY +6L0eO9RWCmK73SIagcc3C4d1HQETOU4Odc8JIAd4ymL1zoNqywHmdm9BSkWA3ofYIZgRP6hg +ETvUxr2zoo61hwAhjMeR5Fk7a+66FTf3IGrFQ7C9Wpjyw5XHRedezm/tBoLm4MFmcW3pKMWJ +W6w1xNSQoon3LYacTUlcdHdB7LiNhcV6EGu7QYorbca2RGUJGOHHiv/2MapYLVAoMakZzhKB +JfZSbFYxvOJL2c9pZvXmi9T8Q6y8VVkFQAIg/gYQ4nzXaov065j/DZmzz7UiJD/Extqlkq2M +5YoWNvo0QMtNYpYcau0dydeqlcZJzOk/ql5mZ+2EGqGpc1YUAirC//CXwtbinNXLgVUrlCs5 +Z8tuZz28kxIrf+o0QukfndPp5OXoZe8tlBUk0l/K19j/YFkzaASHvKNyf5MUqwXKIoQOyvf7 +vaWjj+vRwor2l0qIHsqodwO0Fq6R2WJnTYnUijP6zsoB5b5bYqXr3reRtFhu1QffoGEr7SCR +ECW+UtHzMaDk+6hilW2etwNOQG4I5wWgH1joCx65uJEFLfWlYZvSO7uyPhH5yt01xcWfuKVB +p3AfzXNLXujDuGQOeG6j7qzfQuqaZxsGVrG24XX12oCBVawNSF1dtmHgF+Xdpfvr22arAAAA +AElFTkSuQmCC</item> + <item item-id="59">iVBORw0KGgoAAAANSUhEUgAAAIUAAAAWCAYAAADuKF/RAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AglJREFUaEPtWu1uwzAI3N7/oddmUjJKwQec7bYTkfZjtTHn4/josu+f+/PVTzMgGThE8Q7P +HRMFg7WnnP8zYy4SE8lgg8raT7zKxx/Vovj4EM6/wCWKI9POn9ON/Gx1JsrzLSzo6jPxIS4Q +lk9ff6gUFrEzyR6Rpf1k/Wb3o8C9kguEbfX6U/vQGbsagKxK0lc2yNn96F4tCsWQbiOIwBnr +qyuFboXoji0KI6qzMw8Jp0WBGNq3bn77QFmE4I0GRU9sq0WBMOv1SKWoDMRZHNX9TFJPnymq +wa3aeTOJFWSrhXikI1GweKvBjtjRSY2GO0Zxx9lRe5Zk5Gf1TIH8R4I5cw+DJ/V3Cq9cVtrF +qFzr87TyrUxgSBhVi2iLOP172CU+68wKtxbuSDX0+Lxss+r0AoLKLfKDgooqCbJH/pn1DLbR +3gy3niCsdqoFqfc8CTZLhswI2R5aFH9MjrIVicLiNCp4FHwphlG1Tb/7iIoiepHMoDiaf7L+ +sslQHUj1XPVqUXjCeRBMlpyIGpFjVPrQuteTs3dh90e4qIgC2UQEGsGmE/z0m6oUOhjyUKtk +WiUqciE0+GnSrN/ZgCN7r0VYHGkePFHLfRa3CNMVVPFy02vrHs7fMyKOduxhyz9rv+OOO30w +fLQodkZqo68WxVHyyH/n2xivsqtoi7baU8bp21SKDOjeu5aBG/3EjJn+XLBOAAAAAElFTkSu +QmCC</item> + <item item-id="60">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 +73EAAAAAAElFTkSuQmCC</item> + <item item-id="61">iVBORw0KGgoAAAANSUhEUgAAAE4AAAAWCAYAAABud6qHAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +ATRJREFUWEftmeEOgyAMhLf3f+hNFzHQFNu7UtwWTPZHaT0+ewXd87Udj3XgBHZw8tiyaKfD +57LyhoURCVRCWRPMykvMOxyywJEITXB7lZQfeY8zbGTFjdTFzMsEdyweTO703jnyQaATXOBQ +Ysf4rwJX289jxVVx5SlW/fQvwXkmNWN/KCuO1cW4FbaqJtZ7Y8taEatGdHn11+NgcJG3jExw +EV0p4KzyLzDkOC3OAodMYLQuuVft5T/PR3qRZQ/rOgIKGWvdt75+NVbb+KeBk32q6QtJHw8s +m2q9s8RY4OoXgMZdbMVptkOeNFJByFhU11RwvVK/GxyjywNOvnZ+KhituF7Zz14cNHtqbcKr +y1ocGpsy4BDbWL0nkuvuWLjiIoJHbkciOkbELnAkxZw/F0gxvxT2Bo5rEDWC/DXVAAAAAElF +TkSuQmCC</item> + <item item-id="62">iVBORw0KGgoAAAANSUhEUgAAAFwAAAAqCAYAAAA+lDyEAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AelJREFUaEPtmlmSwjAMRJn7H3qGhAnlyFraiSI7sVLFB+D1qdVe4Of3/bzyiSOwAM8njsAr +rqvsaXWTxBBLYArgb4Ne1qnqFYv609sUwP83Bju+SwB6PH167TDTXoDpVKcE3hP+VMBLH++Q +ZPN6OKfwKNVPpXBJ1ZvyI1Q/NfBS1alwR7kh+/AE7ggcaSqBI5QcyyRwR5hIUwkcoeRYJoE7 +wrSaijwQfbeFyEpuDTy/twns9uE9T2D2UJ9RIoEHx/FS4GlTdTQr4BTSGQEkcAB4dWEe+MuI +FKCnfL7+8lQC9l40U+HBCk/gCnAEzpYB5f1x1AntzFoyUl34PpyexhL6sTDCwFfDLxbQHpf3 +x6Y4Vq3hgSOWJZWx6l51h8K5wRb2oYGXtiXpVCpj1b0qQ2mQ6Thg4JaHW2pqTexygdZgU6sr +32tj8h7vV8HMuWUX3FYQUeWvBE53ZNyc6KaAe9+addXBJwqm1Q+S7sgCflbhSB/aXDhbgy3F +guT1PeeB1nWDlA1a4LhgaH1rGWfZ09CWQtOdVYnw92Okrua1UmCpnViq1gQynMItNUt+2/I5 +t9BaCzNaRxLIoW2hl220tNPq52XbUqrTHReqWMs66A7pFh7eEow7lh3eUu4IVc2Yp01o9Pmk +woMj9Ac99Eq8xyx9MwAAAABJRU5ErkJggg==</item> + <item item-id="63">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</item> + <item item-id="64">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 +brdwAAAAAElFTkSuQmCC</item> + <item item-id="65">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</item> + <item item-id="66">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</item> + <item item-id="67">iVBORw0KGgoAAAANSUhEUgAAAHAAAAAqCAYAAABr9d/aAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AjRJREFUeF7tm4GNhSAMht+t4izu5E6u4ArO4grewxweIkiLpRYsyUsuCKX8H4WiuZ/1Wz5a +6lXAANRSrwKfel1Xz7fdU2WoWwHRAL8Hkzmft58tbp1bXzeGfO9FA/xLsE6zU3D/kogH6ENU +eMf1XAVAC1HhnbfaagDGttP806ONntUA9JMZX/63RmcVAP0sNARPAQrdUUJgoHVCp0TqlugI +xNwDNQJJ1wW/MQXIrznpiAqQVE5+YwqQX3PSERUgqZy8xkLJDq8Hz422Z6FvFiFXfohmsTZX +fTG7yeEagemYO+lW+vlaQe6mts1V39Qbp9NLDLdCAcKXFwQg9HVfji1rmzQC37QAckSP6ZNj +qwjA3ajzJR1yTsDXfdmWrq8pv7GiQ+Fhv7qgIrBUhMWEK1VPsQyqA4g5XDErmUJMKhsYvzEA +MdFHHoHu4KUikAoApx0owJh+V7pidA7eA2P7f8pw6jmnwBxjpXQKRbSNMP9ZKH+AzAH1Oelt +gCACPt1GAT5N4Ob44gCGovxqq8IkVze1EtldFMAQjFiyAE0iRKpO6BQYYOpiS+VTCox9nmpH +5Y90O2CAXBNJgUkBXJZl/3+KUBY4zzPXVFjGaQ5g3/frOI6rAWn+xl6MWVQnHKQ5gDbCDEQF +SLhSoKbubqF2nGEYDgCnaYK6UFW75iLQfaNhIJrSdd32a7GIAoi9711lxuaZ3U5N9LX6FkkU +wBYjpPScFGBphQvbV4CFBS5tXgGWVriw/V8FIHJLZmSDRQAAAABJRU5ErkJggg==</item> + <item item-id="68">iVBORw0KGgoAAAANSUhEUgAAAEEAAAAWCAYAAACffPEKAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AQVJREFUWEftl9EOwyAIRbv//+hVm9gwFbhQ1q0Rk740InCAa/t6l7WtviqE1de2OoBjEhIC +gVBkoWrD8HwbEvXJ+eL2SLbIuc3fRydUw37N3kWB6c9G/Lc9mq0l7p9CQIBryZ7VJAVsXYAW +628gSJXjqj8DQBNHu2GA0OsCSpMGZNUWpHJcQpotAoLtBMmpFQy6X/OJdAsyYsMeqX1m86iR +vXLLWIQRTVaLd/hOQEQIORStPJIIEtORyIWb7RwH7l7tZy4SgqQ/1M8sNs6Wy0MqjPmLMRKC +t2Oi7RKC598hO4ERoOj2vPs80zh4ROfuhDz+TBA8Dp5gkxA8wviEylpjzE4oxHY6cOMpa+MU +RwAAAABJRU5ErkJggg==</item> + <item item-id="69">iVBORw0KGgoAAAANSUhEUgAAAGwAAAAeCAYAAADJjPsHAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AahJREFUaEPtWVsOwyAM2+5/6K2t1IqxQOzQiFY10r4a8rDJA/b+LOuldR8EVsK07oPA6z6u +ytOtGgqGeyEgwibztTTPdYbYfsjCpBBNkqERqElCSBNhNMx5G0RYHrYpmkVYCqx5SkVYHrZd +zeUggQ4VCFka6ycRWptFyRJhFyCsJAsh7pgSI2l8RrxMyajvK629qE7WfwvQEVsW5p5PP2N9 +yyFPSfQ7cw/xZPfvntyIr55uJEOi9vd9UwlDa7n1EtACzwN1BDBP96MIQ4Lt1Xs2wyLV5JKE +1XWVPZGRXmhlUMuuR4wHaqmXbvjVex9ji8WxGT8TwEiDRRxmsqwHFnPoIofl6CcOgUjMrEy3 +hyElyOpDkelnu2MAL9ZehrUOYC9jEbuWf5fKMA9ANEjmBHk6mQPk6arjY+URApnYUVnzHlaf +0kiDRhzola4yk1plyyrRaIljY2q1g+w28VfBEGDR8TuiS3s4BEL/hyHlg3ND0igCNGEiC4U2 +R44ijL235Lj8bK0wYdFR/dnwnh89TNj5pqUxgoAIi6A2cY8Imwh+xLQIi6A2cc8XcJWCBleD +gSAAAAAASUVORK5CYII=</item> + <item item-id="70">iVBORw0KGgoAAAANSUhEUgAAAJsAAAAqCAYAAACk9ylcAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +At1JREFUeF7tm4FxAiEQRU0r1mJP9mQLtmAttmDkJmQQgf1wsHDwmclMcgfs8vcBC5qf17uc +WKiAhgIGNhYqoKHAScMIbVCBbQelDFRAS4GhYXunESaf3H5scZ+5z7UEo51yBYaG7e/w8jU6 +QlYe8J4th4fNB46g9cRln+1DwGaBI2j7gt279WFgi22pvQWkfVyBw8DmHxTcIYYOErgErKml +wCFg80+jPmipv7WEXNFO7iQfHrZQnpbK3ZjX6WDv64zoPjRsJfdsyKB1wrGWFUT3oWHLDRcy +4Nw+WV9WANWdsMlaskZCgdTBzW82DWzo7CI5aQX8jwNRmBD9p4AtdVolXDoKLAFbaCbqyEsr +uVdO/ytb7p0Jpd6+4fz1rZSvPCVRJ3atg25dOTGobavk2zcf2yiyFOYMcOa6yD1Tqk4IKKTP +Ek01baX8I2wl0Qu0QS6fJZik93tclfrWWGiqwqbh8B7BW7bVhA2xFdrOUzmWRuyqwmYHU3p8 +bgkD0nep37FA5a4mUv0YLAgoUt9IH4iGVbZRJBkudSYW5FbPS/2MtasFm+k/J/HOOUgcBjbJ +0dQJrCWkLaAJAZ6crc7/R9TcupCVZjrYSvKD2hCM2p+rDaITOmlR0Ny0RdJIso3YlGxI74P3 +bNJqhG4bkvEjv0+tgD6EoRUopDG6UiFg+/kd6kPLmGR/XKUxA1oOmH33U4Cw9dN+OctZsGms +arEtYoRtYDk6Kg8Yhk1Khmv4FQMqdL8kJbw1/GEfdRWAYMu9DtjjogSRfS/V2+MD27ZRAIKt +jelwrxJEEmzP5/PrYtSdLI/HQ3M4tOUoMB1sl8vldbvdXgY687spGrkmqZIVmA42u3IZ4Aib +DIBmjelgs+Jdr9cP2O73u6autBVQYFrYzNZpgDPlfD5vPyx9FRgKttjHZLnPbZ5mt1SzqjFv +6wvaFpP+LtCDVRQgbKtEeoBxErYBgrCKC4RtlUgPMM5fvdL7L9LweuQAAAAASUVORK5C +YII=</item> + <item item-id="71">iVBORw0KGgoAAAANSUhEUgAAAH0AAAAqCAYAAACeC1RqAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AsBJREFUeF7tm4FxwyAMRdtVMkt28k5ZIStklqzghlxJCUHmCyQsXPku19YVsvQfAuFrv9fH +9eXX/1IgQLd0PdS3FE4oCFPxSARjLiNrIluLx6FLKFDx4dANiRxgxE8MK70nBUvKzwDp4EdM +vbyXgEhDkvYHk1E0nBr678njJY8GIA2fijwh19NDj+C14Gj5hegoGR0Cel7xklo5dEk1CV8t +IucNnWSYLfFIPl/D1/SVnkLRAKThUwMkx+fU0L1756D+s50WOnJOp87xHKm80jlqNdpKi5z7 +4/rn2jemPXTYtJWOquTQP5Vy6P7uHa0fPTvp5TTv7rnHO+l49JTDPR++0vM3dlyIXHtc+v0s +X9BL3fAeYVkTWToers7clQqJ963SkQHaE8FCDGmOkvFwm8p0K0LGoluXQx/YyCHgYjjRNv+a +/56y30pLHHpvZfSOl16JJOM5LPR05qX7F7z0GPtDxBr0Uo7UGBR6vo/HZpTadkr2Qyu9t9JK +wlDCatzP469B5+SLQKdsuPd3gc6pAK3GiQOEsq1B5+SJQkd8pns9d0Wt7um1pCWEnRk6J38E +OrXSoGMRXsVzejpz8pcbpZ8loSFBc4TutZWOJ9eW6sZL96mxXP3hN3LoTLMm8tHi6c3nWbSo +E4eOKmXfbiropaV2a7mMv+vBIL2898QiNbYJOrK3tAZIiVwCKHmMae3eW/PccxwMPW/gtCpg +y29ti0mPMdzmxqHvOA01od/v99f/v5XOtrfb7SNzrcm9o8R4IzcqSE3o5/N5vVwua4Afvo+r +11ZuDn0AeU3osZIDeIc+ACb6CE3oMYZlWd6gX69XMjyvdJRch90I6OEZAXy4TqfT8+ONXAe0 +3qG1I1upg6eOc9Q5PdyPS32ocs5E683PwnjWkW1EwNaWU2vxSDBw6BUVHbrENJtMZIc+ALo/ +Ql+BH1anjZK7bN7EAAAAAElFTkSuQmCC</item> + <item item-id="72">iVBORw0KGgoAAAANSUhEUgAAAG0AAAAeCAYAAAAmTpA5AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AaJJREFUaEPtmeEOgyAMhN37P/SmJiyMAb0rlEhyJvuDpdT7aovs9T6vQ9deClzQdO2lwLFX +uIr2roySYT8FBO0BzM6Geu0r7h9yYVaIJ9m4FChBIeAEzSV13CRBi9M2xDMCTBuREOl9TtXT +fLpNnZVvLpiNBvK2qadNRTXuTNDGNVzugYLmfZ1nP5UVdKv2s+PeuGvxMeWvXLfUHYnrpzy2 +AkIczbCxmnELKDvujbUWn+c7y7t+mvcYaOnhWQCs/bBgxamFoF2HoZWjnBxofp8dr5UmZCy3 +sSBZ5X00af6+02p9zbMI2x9rIEqhRmD1hLTWtqBaED36WXOa5XFFxtxZY5Sbnk1rLuKzlxQ9 +0SzfK3Tr9jRvAMybhtiycCxhWzs4K8ORJPNqhqwNbURWBGCVn+g3bevymGd8rXSk+1/axP8/ +VBZl5bIUtIwhAWXGe5uKWoK0tEDGmedmbKljLLbsMIHIFldA0HCtHmMpaI9BgQfihtbqgfjS +svQqQEHLG7/VtL0BaZ6tAA3NdimLaAUELVrhAP+CFiBqtEtBi1Y4wP8Hm7HjpJ8ELnUAAAAA +SUVORK5CYII=</item> + <item item-id="73">iVBORw0KGgoAAAANSUhEUgAAAP8AAAAqCAYAAAB8+41WAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +BLxJREFUeF7tXIGRGyEM/JTgFr4Wt+AW3MK34BbcgltwC27BLbgF/+sTPoQIJHFgdMfejCc/ +PiGWlRYEd86v59f1hgsMgIH5GCDx4wIDYGA+Bt7mGzJGDAbAwHfFDxrAABiYkwGI30Hcvzab +DlAAwmwMIOsGR5yED/EPDsKGug/5pMkpiN9B4DWBcgATEJwzYM0jiN9BQK1BcwAZEBwyYK0i +IX4HQYT4HQRhQxC0+QTxOwi6NlgOoALCShjQ5BTE7yCYmkA5gAkIAxiID/BMh3mKJ0gQ/4CA +pl1C/A6CsDEImpyC+AcH3TKbD4aK7lfCgEb4NJT/xJ8mo9bRSngBzA0zoJ1IObtSW61fC7Wc +rpb0U9P2H/GngKyPDiyDhy0YaMkAl7s5/5KtdH8pbk5XvfvkMP+IP7fCY+VfGmq0H8FAKZ8l +ocX3ey2AFgy9+BPFX9MxJowa1tCmJQNSDqYCj/vOleTaSuJ7Py2ctm9W/IGkeB9SsydpmQzw +tT4GavNHEl6cn5xQa6rg0mTCltzJ5CBNBj2i12XlrwWaCza+//3jn61+avPFshKXBKgVnjSp +WLYIUp9SXy04E8W/BETtzN1iYPCxfgZq8seSr8FWEmJaKZQmHW3/Up9aP0uiLJ72L3G+xbbX +63WLw2o+phE8WUrvlnv+dOugEa478YdBcOVL+l2pxNEMXpNtrfxo+tLY3G63J31wyQwQT/f7 +nTXsEVeuSuD29rm8jdvH7TSlPDee0hi5vkrak9muszC94SfNVnUQ8q16JMkSjB8fH0uaT9c2 +x5e3uE4XmD8DhviVkX88Hs/j8ai0hhkxQOIn3tIL4veRH6sTf67EKm1VWiTb5XJ5ns/nn6hJ +ZWKLPqUU8YChhJH2/cQbxC9Fcsz9avHn9i0th8FtM6StR7gv2Vlx0qqf7vetez1rnxp7Dxhy +OIkvrlp6xcSo4W52G5P440OJ8HdPAjWJnRN5a/Hv93uxhG2Z1BZfsa2lXc/YkW8q+Yk3rPy9 +ma7zbxZ/XTd1rXqInxIyrlrSv3On+ZrT27pR8q2sIua2PS3x1Pra7XYQfy15ndtNJ35aiWgf +Gq9KGqFJNtJ9axxr/NW0seKy2msmcKtP2LdhYDrxh5WdJoBQkmoS9BUrf6kikcLtdeXXcCuN +Dff7MDCd+AON9BgqFr/0RlpO/L3225ZVvBeGFikH8bdgsY+PacVPSRleQnl/f3/Sp3Rp964W +0Zb60/rxLi4tb33SG16LOeaZHu7Enitv43I5Hk/ue7Khe2ELQKu+JDaqEuLXVTnfubI9YLKU +5hKeMIbUZy0GzZZDO+Y4Bjjt96uw1a38o6jknvNrsHATmKZdSxsthpJd7l74Pv2X8OM5f8so +tvcF8Ss5pQPC0+mktP5rphWe2bGhgRZDjfjjqiaFhDf8DEEaYArxK0mnR4OHw0FpDfETAzRZ +4t1+c8q8rAHEb6C65ld96Um8Zd9vgFY01WJovfLnKiXNeUarscNPngGI35AddODH/VBFchEL +flTi5zDEe/XUpnSYGI+ZOwgs/d8HoziQ4jTbfYjfGHHpfQCju82alyZJiN9H2CF+H3GYCgXE +7yPcEL+POEyFAuL3EW7X4vdBEVCAgW0y8AkE1IYxsv8rMwAAAABJRU5ErkJggg==</item> + <item item-id="74">iVBORw0KGgoAAAANSUhEUgAAAMoAAAAqCAYAAADyIcQqAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +A91JREFUeF7tXIGRGyEMTFpxLe7JPbkFt+Ba3ILzJOYHE4QkLA7p2Zvx/PsOJLHaBcHN+Pfz +6/qFCwgAgT4CSSg7XF8ohB5m9PhDg58Wk+gDkMYfnWjR45fmyWs7CMVrZqq4IJS1idpaKIl8 ++ZPTUN7zRE5Psayl7BrvWwvldZDxH/IeSekxpjWUXeN1e6HUYvFKSK9xraHt8V4hlBfmdQl2 +fCr6HiGUtRmBUAr8PZPRc2xrKXyMdwgFK8oxTAvuBUJJL5OKl5FeZ26vcUXmf+vUkxrP9kJp +EdAjKT3GFF0kmvi3ForkPQr1nqUGuX7/wtmm3ttQgoBQNLTm22oPb7YWCg/nvxY1SaVk7pV0 ++Rn1tyVEabxoJ0dAOgFBKAJMZwqlXFl6oUgTKhgOmlQISLCFUAS0gVAEIDloQpW/XGgQSoGQ +BAzyxKM6FaPq256gOLFx8XHPOTLgOY2ABFusKEIGleJo7T3qzbt0M5/3QNzmUpJM4VDQbGAC +/RZKK7E/CdHoRLOOX5vvenKQrqoWHGqNXRt/GcdI37cVxToZFiBZ2Yg+Nsv4uTKwdeKW+3Dl +pWWc5WpbE7333Yozbz6OdjhjEBKb1gmU+LRsYxm/RiiUQPLYNLZG8eB8WGJD7lOjCOVTMD7t +P5pkq36W8XPEa3GCKn9aq09vzFI7mhXEEpvwQilnsLLGpGplbQKtCD3LDkeGFiZUH6lQ6n1J +q84fwblnt4UfFy+HjUVOtt2jUMTycn+EgBpC1OPk/H0qupZ9KcEhFE1mX201M2eUslICA0cq +a1yk9jgSk6XM6/cKRsY+6lPia7j04hL0ifMj+0Yfx4z4NTYtV5TQpVdvBqn3AdS+oFe2tPYY +vX0HVwpoRaYhhdb2Ee0t46fyl8bBCaJXspXPeiuJJreUTYkvy7yI38xLl7teO+pZvl//NR0o +finSEs7tbLkQSrmyzMqA5Yw8K8ae3ejxr8DM0ieE0kGzRc5VpQCEYkl7va0hofTqw5HSy+OK +0qrjudJx5jggFD25LXuIhZI3eq19RHmvJFhLUJFmZG5fRu2pZpB6hk1LIv10WyqhRAZjhGif +CuXxeHz/tnF9WpS+3+93MaQj8YuNoyGLAISi2KNoS6/z+fy8Xq/PJJj0f+/4lcsUhMIhNPc5 +hDJRKHnFSGKBUOYSebZ1CGWiULLpy+XyJpTb7abOK1YUNWSmHSCUA4SSSJ7Ekq7T6fT3o70g +FC1itu0hFAJP7ekcd2Sey7C0moyQfqSPLVX2tgahBMk/hLI2URDKWvzF3iEUMVRTGkIoU2C1 +Nwqh2GOqsbiNUDSgoC0QqBH4A442yOvDB22UAAAAAElFTkSuQmCC</item> + <item item-id="75">iVBORw0KGgoAAAANSUhEUgAAAIUAAAAqCAYAAACdkJgHAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +Ay1JREFUeF7tWwFyAiEMbL/iW/yTf/ILfsG3+AVbHLGUAtmEhEkxN+O0PUNYdvdCsOPn/fv6 +iCsYKBlIpvhP1zd2V3C94dEgxxfDwIq8ieAND0AhGRKmICkaB4QpJgnUGN4TId3PrzxPec9K +PKu8GlxJc2xVKVoCWYtmnV8q7My4rUzxPEm9+Fgh2Io5ZgSWjN3OFNkYq8RaNY9EXOmYLU1R +VwwpOci4MAXCknEMIkLdcEogIfOsNJ9kDdIx21WKUkxU2Jo8jqmkc0gFWzFuK1Nonj5QsdG4 +FWJqzbGNKZDPKVoxZWMqqTJhCi0rTuSZFaG1NfTuITBn8SBzrI7ZplKgxGURez9zHlRsNA7F +5yEuTPH8r2stLio2GudBbBTD25qiPk6GKX4s81amqBvNcgsp+4peQ9p60rauFBwi0DJkEedN +BG08iA6jmB4eDs5flYIz0EJwJKc3jJp4kC1sFNM6RZVHboTfR3wZqLlAFAA3zhtGTTyIKVqf +viIacnAuNwUH3H/Yw2fXMxIUyY0aCcn1Oo4jLuM+zUh8uS8i+yj38wMEg0YMRTZnnajAIy5c +9hQUSbNCtIjrEW9xnyrfM+vb0hS9Rqe3DbREo0i1Nh01P9cUVpWCWxE4vJE9BSdZ7nS5xHLi +uXg4uSWxmnjQSlHGScZQ63yZYuTo3p7fuk+RRL1PAt78y0AjrvNDV2tV9hitas3p2R5zUCLU +E9aNKepUdB4qbtZUVH7u+97wcPE3t3Y0SV587+eq04E3EbzhQfUcxbEqRdkz1ObwYIqWQJyt +T0JomOLJmqTRkRDeLG2dnqK3l9bbXasZnhF2ZqwWJ9p5oEpRP21llSjF4DY0ksWMRKD6G4vq +9ramkIhnNcbSFLfb7fV91LrDT39fr9c/ywpTWCnNyGtpiuPxeD+fz/dkjvR7a6upoYYpGOJZ +hVqaIleCZIwwhZWCBnktTZHhnk6nX6a4XC7dlUSlMBCZm3KFKdIcyRjpOhwOj1fvClNwFTSI +74nA/TxidFIqm8pUJThGNFjy8pTQkXQ5qsGE3p5Mb3g0tApTTLIYppgkUGO4NxG84VHhWCNJ +5NiLgS+SP1IUpL9kxQAAAABJRU5ErkJggg==</item> + <item item-id="76">iVBORw0KGgoAAAANSUhEUgAAAIUAAAAeCAYAAAACe928AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AfxJREFUaEPtmQuOwzAIRNv7H7qfSKkowTDgOnbbibRa7RYbGF4Ica+3x3XhRQWkAk8oeFEB +qcCFclABrQChIBMHBQjFH0DxGBeec+P2g1yYFbITbZZUQIOAgEEolizluKAIxThtv3ZnQvG1 +pRsXOKEYp+30neXwiA6SCBDbYeb07BjAKQqgQBCKU8ox34kEAoHj1SmsFqRb1Pz0ahEg7TWy +0e/5kX0t0u17qONhUvKc4e3IWqxFzyreImgFVE1whXXIe3pkk/28mrdVtMh31Ze37oBlttWM +CGrkngj4WQ2QlozmFEHwSV+tmMxBE20zaKIr2WWg2G09PbwiIb60NstCsU2g4Dn5jILrWQeF +uJVTqxDWHGE9r91WLHRENF0WClTkGUD0+Izuaj08RgXaY4mKndEz8hn56tHnlY/Xvs4IoJJE +pVOguXjzBNppLE0r/q2Oje5T0dWEovIM7HF+1lqv0PpxkPkb6RSo79ZeUecYoWHqnMJ6xrZA +iu5m3ar3u0Kv603aikMXwGvvSJzNKb5x5uDZW7FYMfTq4s5B2c1Rcj271mf7//XvbIy071Mg +/d3HSCiQdtyXLlcjChAKRKU/s+mCwnvWVR4f7BRr0JeGQg6E+pVJzgJyYIqGNT3xe4PfGrL9 +dhQlKH5bEmZHKMjAQQFCQSgIBRmIFbgDBQQy8DFaUzkAAAAASUVORK5CYII=</item> + <item item-id="77">iVBORw0KGgoAAAANSUhEUgAAAMkAAAAqCAYAAAAZFn8pAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +BAJJREFUeF7tW4FxwjAMbEdgBWZhBVZgBVZgBVZgBVZgBVZgBYquTc91JUtKbEchnzuOI7Fl +5V9vyU74fL6ODxxAAAjICJBIcAABICAj8AFwgAAQKCMAkSBCgICCAEQSOEReRXJg79bjGlgI +yjUJBCKJQQ5EEoMH1guIJAY5EEkMHiCSyDwE9m31riGTxAgBZJIYPCCTROYhsG+rdw2ZJEYI +IJPE4AGZJDIPgX1btWvDFjCyyfxh8C+T5OSApPlJWrMH1smCi1Oub3rO+izqj0jygaxG1kwi +7r0dAlw8cqNxcSr1tdpMx/kViZQxkEnaBQEslxHwBLTWVso0Fg5UkViM9GoDwfZCOsY4WuD/ +me2z99wsfa3xtCiRDKBwdaX1hmPQv14vPNxZAj2NCY9oqK01ZhYpEm+IScTg/PdLlC0+Xo6k +tUYp8D2i8Agu90UViVVtNUCx2vDMRlabaNcHAQ93nsDW2mrXS3ev7m71gQ6jXK/X8CD09tET +2Fpb7bpZJEOdJm2ppQNxbfL++azBrSlK64x/aa/Sn5CiZcfb7fakT/SDfLzf76ybrTBNY0gq +r0ptpFj2YO16LcWqxlI76dpwPv/23Iy1bStCrePn7Y7H49iu3ftJvkbDtCYwYUSSZpSaN8jZ +ikTo4/F4Hg6H1rdczT6JhHxuleWrOVrREETyAyYnHG8aH8PL5XJ5ns/n367cmFLZOma8qX1o +XUI+QyQCktyaRAquUv0oXaPzPWZ5ruTTSkmpDJzqL2WRfD1iwXRqsI/tT75ymW8qDmP96dHP +lUmGIOYCJj2XLpa0mTEXjLQhUBMMSxBqa6da5eFut1PLl0gBSKUW+YxMUjMiA9pqIRIKnrws +Sn9Lu1clAfSYMMbQs9lsIJIxwC2pTwuR0OxKtXo601oygNZGuz4H7hb85vCr1ZjucquVIz3t +Wkj2lltDpiChDOXImHG48rMnNpaxLPdlsbOUNhDJD1O1Fu60RZqKRHtKLWWK9Hy0bAKRLEXe +E/y0kOzNJOlCfnjgtt1un/QpHdb6PpJQrD5PoChUV2SSFx3cDly6k8cJRlpU0/mh9KIsogU3 +ZZ30VQ9tN7B0ndtxkjYTUlHn98L1SW1jdyuUhts4owVum1F5q9xzEsv4WnmYiiBf52jXBtv5 +N/XDcxILO2/QJpJIaKF/Op3cqLYUiSQiOo8n7m6qltkhkkhoy3i/37uBnEskJGi8u+Wma3kd +IomE0BvzFnC++1VaI3nLrVImkbJeNExrRiUW7jXRHGmLFu7cS4OauVQY3JZxvsjXNgVyMeXC +K/3vBSLR2FrY9YiEas9TIkBcEnJETGthhkxSC8mV24FI3iwA3pnQuah6Z0xXmUnmCiSMu0wE +vgCPSUKldzpF6gAAAABJRU5ErkJggg==</item> + <item item-id="78">iVBORw0KGgoAAAANSUhEUgAAALAAAAAqCAYAAAATStF7AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +A85JREFUeF7tnI1tKyEQhPNacS3uyT25BbfgWtyCn88KEcYssz/AAbcnRbECC8PwsQfIyr/n +6/nxxx2Y1YEN4Jmel89DyR1Nz1DmdBAzFg2MAY8GzGh6GBYuVcUBNk6nA2w00Bi+DMAbSOEn +eBL/rRVordo1zuthwpcB+Pcw+jVxrQFr3f5hSFQOdCmAU4h7wNWjD+XcHiJsOYADxL3A6tXP +IWhUDHJJgKnthMIfGOIAQ4uaVlgS4PQwJ3UwdyCk2nCApe7Wrb8cwDFQGrjSGNQGKq87Xeu3 +Jkke7zftbJaUgMmVWQFD8ah8Nn/31CtNHksBzLkHplZ3adUjQFH5nkDM3jfH26UyMGfCcvtj +as/MMnCw72ZwPJilDsv/WQYTdHIGVRpTiKd+x7Gcvjh1ZvN4FL0cbw+ZgeNrthRk6ULhmDwK +EHvpiLdo3EMa19fDApzeFceGUZ9zAHCN3gueGfuVeHoogNPVH2dfKksgM1H5jADtqVmSPD5u +Ibipfc/BpVlzby0t9HDmocVtisbL3OLl6Kf6yiURpOsjA8+QTUbTWFNP2hYFSO6gWYoNYCAY +JOW5Njn6JX1w6jrAHJcKdWoCnHYjARjFttCJgG3R59c4pddGxvl+f+nc8ljjLX33PsT1BJjT +l3SR9Jir3TIwdWhCgPUwBWmQLPra40RZj9qXc3wTH6CSZMTRJvGWU7cqwJYNPEdsbnIoQFr9 +HWUh7jhQPQo4DiSabBr0SPbLSAtn0SAfUHk1gNFgchOfgwwKNm5BUPvScjRJmgxcahP5zAWf +GudyAKMJKhkhhYFTX6uH07amTm096DVeArgUy9GJ+kZvH7S4NP6imL8MXMoU1NagtGWwZoLe +CwMZ1UNP6Y2UwpVmShSLMqt026FhQutxKY59JZAzgDKFs9q1g2nZtkbTaHo0Y5g5RgRwfIgK +EydduVazRgNmND1Wf2eLrw5w6wkttU8tptLbw6rXGj8bMKPpFQMcZ2Hu55qDLu2t0SGCemtY +ILTE1vTlqG2xAE437DEIucMDOjBYzJZkYApoBLpEnwMscat+XRbA9bvVt9gS4Mfj8ff/1XIL +836/fwl3gPVzWSPSAX65GCA8n8/P6/X63EDePqdbpJzhDnANDPVtOMARwCHDbhA7wHqoekY6 +wBHAwfjL5fIB8O12I+fEM3BPXL/7coAzAG9QbhBvz+l0ev9QjwPsAIscQNdouRsG6T3wVj9s +J7bsKzk4igbjlc0OLJWBzW4oGvAMrDCtYogDbDTTATYaaAx3gK0GDvb9ZONwpgufDuDpHHbB +TR34DxvDzwTkvxrZAAAAAElFTkSuQmCC</item> + <item item-id="79">iVBORw0KGgoAAAANSUhEUgAAAF0AAAAvCAYAAACBm8YJAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AmBJREFUeF7tm+F2wyAIhdv3f+itTWdL8YIkB5Es9Jz9WGNAPy4oyXb/eXxu9Ykl8IRen1gC +t1h35W2rLIUhnkAo9EfhfO4f20/7oO/iMcR6DIX+t2l3K6RBiF3+Gm8FfQH3gl7QFxBY4DKt +0rPWeY95pYTOTzgLxAhdes0rJXTplJMB/imV3oCOzud8cXy89cwv+Rn55wGm4yXFaz3IV2+S +QT1oDkhRKBC0yaJ2UAPGr1tVy20hn2iMeN/ZoHPFWaHTktVgeELnGSwJYBt3NuiamkfXOGxP +6JKqYVZcCTrfoGdDP1V5sWySljEo5ana9xwB92yk1C7y8VVerJHPmh0R8/Jg9Ia+J+oRi8vq +wxV65oZkdgBQ6YBlAbwPODI3sbxoDcARR3XPhwCEbkkhSR0Fd0ygg24BPjbbj9BS+ErXuuZo +T6dWSj8ivdc9ak0/brbu1Ah0R0bePPCbZ5WfK4Up7bOX/xyEgr4guqHQrc9LFnAIdRkKXep6 +r7ZPFPRQjYMjY4R/pOpS+mTyBX3B6zoLdLThTtaC2bxHVqar6XxRHos0Ex0M9HrnkA569g7Y +QwTh0Nux0VpC+GMJ6XdutwVP8mP1j+xo7xpoUPhDwbctr9SbYWdUavgC6RzQ4vl1q2olP6Pv +xeszYHnZRNBF9ZB/qeFNGM0Oes0TupRpqCFcUl4sQbGecmj6a0pHsD2ha1nXicACIHrMKG0R +aK0UWe1J67Tcj8acprzw8uG9kWobsSYuaV5on6AbLdp005aX6Oyy+rOWJDWAVmc17kWgoDsp +AZUOWBZm/LGR0xrKzIDAL/ewgthw29VAAAAAAElFTkSuQmCC</item> + <item item-id="80">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 +rkJggg==</item> + <item item-id="81">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 +AABJRU5ErkJggg==</item> + <item item-id="82">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</item> + <item item-id="83">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</item> + <item item-id="84">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 +n7GqI7/Q3YEAAAAASUVORK5CYII=</item> + <item item-id="85">iVBORw0KGgoAAAANSUhEUgAAAL8AAAAvCAYAAACyjBtFAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +A+FJREFUeF7tm42O3CAMhK/v/9DtXa5ZsY6Nx0CygGelSm3Cjz18GDtJ//z9/n3xRwUyKvAD +P39UIKMCXxmdps9U4Mh4KAMVyKrAx+H/TjV/ao7jz/nTrmVdIPp9nwIfh/9/wX3xsNwM97nP +kTMrQPgzr35y3wl/cgAyu0/4M69+ct+XgX/mIpj1yZq7aAn4JVwzwSafVK2JwR5WRwPkEvDL +pZkJfutp1R44reNFS4CcAv4TIHTnno7K9ug7A2sedH7tfYR1AtTeYcy2iddB3bcU0XYa+H13 +flt4O1y+LCvH1V6kyfuIaNIOa07tes0+VAO28xVA1nEL+MuIHYG/hLg8TXxp3zehN6d2KiCL +g9jBNroCiL5Lwa85VDsJkHsSekS0nshvnUSE2IZYBjdvjbz7r7R1FdGR1KIGZQuwNW0Qe5j2 +PE8XCv7Bw/PmxWe0dn55/YS7VmC+drz4mK6M/lqKYlmMRCQtJYvMEVcrb49oPfUGf2TX5JX4 +6vksuslggGxa2caqT0ZvWCuFbZ0HCUQXX2U0JNRxBWaAv1bfaIBrXlp+jPbP2mBP10OM/Abr +WiR5KirGt5//CNgLcjXwR8Mv6y/k3y2aeH1M+CPHzx3ieIbz/rsCkcgvYZM1T+RU0MC1rtUi +e9T+Eeuvwt8KsxUtRxiacYyIni3wWNC3pD/hYrP4n3vTRP5W8FvgrKUWme61aGdFZ7ToLYFD +N47HRk+2gNowSqvDf+0o8py0DIhEqpFO7DpWq57o+pWRHyk2vXG3gB/J2XYFbnW/PEDLwlf7 ++4gcHrHBi/TIGL1r9Yr88rispR1y0icM7XV09/61qCtze229tHQJTaGs8ZAMQZ44kdOjd03d +N7zyaCTovZKz/ywKuPBbR+MsDtAOKtCqwMfh7zluW51mPypwedpTk+TOdCeaM3LpqMAIBaDI +jxY+rQYR/lbl2K9HAQj+ngmQvoQfUYltRitA+EcryvGWUWAp+O+sO3pWbFa7enzK0HcZ+J98 ++RFZ+FntiviQte0y8B+PpsSXgLMs2qx2zaLPrHZMAf8JtvdUSfsepIy86DsDax5vfrmI2icg +VpvzuuwzKxgZ7JoGfkRs5KlQ2UbbLBLCct5ICmPN412v2YdowDbjFNgCfiuaevCXqZT8hsmT +2INci/Ryo3lz8P69CmwBvwXVp+H3ojxrhXvh9kZPD78spFEgkcivtfE2hLdgvD9OgWXgR4pZ +pI0srmXqE837vQJWux+ZY9xSc6TLwwhK0q8Aelr0z8QRRiqwTOQf6fTosQj/aEWfGY/wGzpr +z/C1dCX6buCZZeUsiAKEH1GJbbZU4B8C/tJEAiGbjgAAAABJRU5ErkJggg==</item> + <item item-id="86">iVBORw0KGgoAAAANSUhEUgAAACMAAAAWCAYAAABKbiVHAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +ALZJREFUSEvdlo0OgCAIhOnNe/NKJg7MH6ZiLLbW2Kz7Ok7XcT0FXirAeCnwAoITcgnzxCZk +B6+dxfWE8hcgbmDiTk6DWOLMjKNmzvDcaTNoBjMSfDOYfzqTzzg/c1pn0GiAX5qtOecio6La +LKWtDac8eUMvwlXotSLadUiAwgyGeoKp9VoR7boEQ1C1O843ukPguZta0do6KDlCi3uOmMJw +VzgQ/5LVAOLds9aufH7vz0uH3BXMDYHVihQ+KuZTAAAAAElFTkSuQmCC</item> + <item item-id="87">iVBORw0KGgoAAAANSUhEUgAAAKgAAAAvCAYAAAB3/oHUAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +A2lJREFUeF7tnYFy4zAIRNM/75+3jSd2CQWxUqQU7M3MzY1tLKPlBYGcufv4+vnc+KECWRW4 +A8oPFciqwC2rY/SLCmyrO2WgApkVKAvoT8l0r523P/vHOpdZfPoWK1AW0Edz92eGEth4+rTI +rgABzR6hi/tHQC8OQPbpE9DsEbq4f5cANGtdmtWvTN+J0wOqO/0s4mf1K4s+x85MNod6/LEy +EHqu5zmrbJlBY2VLZ9B9qyna/9QgaHt0T9V7TvR8HQZp72XS1h7vlcAuD2j8Hdx+DBPul+oN +f3mD9TJAX0eh8Z4TnW/5h2hQ1ebSgOpMJt9ItQCVLwl2cGYCqlcGz5eq0PX4fWlAIwgtYDWQ +KwCNsiX6ZegBIastAX1EpmeJb4EbBTpaymV2tjK1vh49r/r10wOKNECIjbXsyuzpNTsWID1N +khy35xnVwTySgMwG7BzfG9ZsSzW6o2A1iHourZ2N1jUdgacMinS77w3huZ+WCVDPl5aPFpRW +CeLZIdH9s8RHBToy6JVtrOXbykw9WWS1niNweqVLBGhvmWLWoL2DjAqYKYOMzqH6fbqO1g0g +ygLaZFoNZktDt0l6Jzxe1qke/P/yv0dPq++QDSEClDdGdC/C2LIMijx8NICtZfRK10b1002O +dTxSN+osGpUxCCNLalB0WbB2EKJJzQjK2cfozaArAI2yp1WrmnVt69uEDtIqmM8OQ/X5jXbi +SMx7dgA8HY8MamWuVzpSKH0bP+KoHvCK/nurVuu8rFOtGtSK/8jq2P0myVq+vXMVg0Wfcynw +m0E/n1m9OcfHtsTjuj4+ao9gvFwy0JusCmxU3mGUQLaOt2wp7PUxOl5WQbzaqrfxqzS/zL4e +gO5gRX/vQGo7fd6zk/dlFkb7htTUleZTxdcbmjllZpTL+pZN93+G5pFZ9bFc9nXpUEeo7nK9 +ytRS+/kEqJXdvFoUrTWj+1OrI5xjBv2fSDEtgLoTUFCoyWYEFBSUgIJCTTYjoKCgBBQUarIZ +AQUFJaCgUJPNCCggqH5Fh77aA4amSaAAAR1ExPuRxeBwvM1RgIAOokFAB4XrvI2Adgp27P+q +X2KxRh0Ukkv8IuH4nzesEVaNygz6gsyyWWIGfUHIxq0EdI2uHHWSAgR0kpAcZo0CBHSNrhx1 +kgIEdJKQHGaNAt/rnbSt32IlkwAAAABJRU5ErkJggg==</item> + <item item-id="88">iVBORw0KGgoAAAANSUhEUgAAAKIAAAAvCAYAAABg3BEdAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AzxJREFUeF7tXIuO4jAM5P78/vxuqTZgjB0/moDTDNJqVeI47ng6dgLiz7+f1w0vIPBtBO5E +xAsIfBuB27cDwPpA4KjKgAEIVEBgWSL+tDT33vb4ay/pvQogIwYbgWWJ+LvJertDSkz79mFR +BQEQsUomNo8DRNycAFVuH0SskonN47g8EStvYNDPPp++SxORJ7pS4vmOf3NBXPscUSJWj2yV +iKjt+ncl5NKK2JLpLb+NiNzeeyapreNdXzrv1JSxd0Za7YEa8fAsT0QvCFaZ5gfj1K90aM7H +veTQ1rHe78XnxaCy3dZEpEoWISItq1RlPYm2CGd9SuQlvCeWSjZbENHTS1YioqV+VyTj5YkY +USCqRr3SLNl5yeGJR7KxyFlJ3TKxXJqIvPSO3qxo/qxEaHFJfSfdtGgbG2u9FcYfRJR2floP +tcKNrRCjV0U/dS89okv8GNnPviiip5f6FCg7rFOJiL1Y+Jh1TY/VvHl8K81X70W8wGTtpLIr +KU1PYbJrZ+dFHwjOEW1+xK/YI36qF4kEmgUZ8/oI8D7XwitCukh+1c1KxIkVvDWuqYg1D+My +AhE8uehYJdoa104brFxNUcTZZadX/nYas5LrGff0e9yPVxUjYja8R8zemEQgD5CweUcgqohR +FZtORGmBCKslUpydD6LNRSArHB6VjOQ+dI6oldxeKY70FHMhh3cNgV5e6VGM1E9qG9toexb+ +ZEVauBcM0g8EPAg8FfHvKydvynVTuDbOr9ui93GqhtyfJzjY7IPAwb6DNIR4vetD/Yg9v/b6 +WwniaJlZ6d6qxPogYiOQ9b8Rj9tF368CgDeOSOPt9Qm7JwI3rxJSpaPluJVgqowPBTGUdqVE +gIhzs/VCRKpytNejIWi9Y9Z+7u2N8w4ijsNS8hTeNc8Np653EHFubkBEJ74gohOopBmI6AQO +RHQClTQDEZ3AgYhOoJJmIKIDOH6OqH3U5XAFEwUBEDFJjcyXBZJLbTENREymGURMAgdFHAwc ++e3u4/yVXY9d7freoIjJHL98oUP4Yfmk222ngYgnUk83LVDEE0DeK8q56ZgNBMYgACKOwRFe +TiIAIp4EENPHIAAijsERXk4i8B95CJ6LqWZiwAAAAABJRU5ErkJggg==</item> + <item item-id="89">iVBORw0KGgoAAAANSUhEUgAAACYAAAAWCAYAAACsR+4DAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AK5JREFUSEvtlNEOgCAIRe3/P7rU5YaEeKHcWJOtF2N6OILHmSNFjAIWMVJEqHqL4cFym5Ve +q18LukbXVxTDz++MSYevBrqHr6u1QvLquTGvHUtBPFcEaxVYNh7B89bQ8ui/IZik12sO2esz +Yx6bmj0IbNZj6PXwq9GMT8HQqUSNoUWoYJZ3DAFDch4NT95R18tvPdQzOBvMau0/xqQhsdpA +8l3GkI3f5mwwq8Gwxi5Zh6H6nx+GUAAAAABJRU5ErkJggg==</item> + <item item-id="90">iVBORw0KGgoAAAANSUhEUgAAACYAAAAWCAYAAACsR+4DAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AMBJREFUSEvtlUsOwCAIRNv7H7pVUxMkCAyRhEVJuqm/NyPI/bS4KkYHqxhXRahxi+XBWpr1 +XBvfDPqP/s8Qw89fHJMOzwb6im/ROiC5eu5Y1B1EEJ8rgk0FyMY7eJ4a2jw6tgWT7I0659nr +iGNSkXigNfdcYFqOSRt4obR5JhhalVYeHsmxyDumgVnQ0mtAhYRffvRgz5UvlYkuoF0hutaz +LuRYtluhJn6qM1iuQY7xpp7pHARmqTw5/oOhbpZ17AXZE5MJXN709AAAAABJRU5ErkJg +gg==</item> + <item item-id="91">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 +yAcInACBXzmYcNxJdMcoAAAAAElFTkSuQmCC</item> + <item item-id="92">iVBORw0KGgoAAAANSUhEUgAAAIkAAAAeCAYAAAAYRz0yAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AlNJREFUeF7tmo2NgzAMhXszsQI7sROzMAsr9BokUJqL7ef8EM4yUnUSTYz9/MUO6f28P9fL +L1eAUyBA4pcrwCnwcnlcAUkBh0RSyL9/OyQNIfi09bC/Oz6WLlvRDMxMCoYlUBySTmA5JJ2E +tWTWIbGUzU6xOCSdhLVi1hIgx2GrlcQ8JQ5rgDgkjcmKAbEEy1VJcu/48b0nBD3CRzTuVCt0 +nsSp5uwlPaNB5iJ+frWb3ATEiBRoy+/v9HH0wZjm7EUaS+mG5PfPnuQ/lMw7fUREbLkIYltS +4s+xiI+ULWhuLsA7VhDiHPvL5E3H3ymQtX5rgEIgOcdwOeOqLxIP+XaDTNYETI3N9XL02ei4 +Gj/jJNTYiVd9LmZqsXKV5XjzSBZLDiwONkTDLCQ1lSQWoIWoElylz6DEQUQufaZ2nqaSSK2H +gr0Ikpp+jwSVClVSSWp8zK0+qa2dc7RJ5lp5GndNJZGqTex/kd7SAxDSuNXeQtgePqJx1QJZ +Ez+y6JAxHOSIDupzknmerz4orQbOAcQ5rupQPT7cR3xEnp+2TmoVIrZKYaHadwpvbm+CtH7E +d9Wx/Cn+tm1HzMuyHAlBSmWpSNp5qI+IOFKFpPq81uenj1dBEkRZ1/WKad938r+wapJQIxrq +Ywv/WtioifWuuV0gGSmeQ9IeHRUk0zR9tZfQbsI9amM5AhbER24jp5F4RHwa/1qNVUESHnom +IfwNn9ByqE3kKBE5H09A0o2eVlBkU6i1+dTxakieGoj71U8Bh6SftmYsOyRmUtkvEIekn7Zm +LP8CFeqfxFZDjusAAAAASUVORK5CYII=</item> + <item item-id="93">iVBORw0KGgoAAAANSUhEUgAAAGwAAAAWCAYAAAAl33lqAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AeJJREFUaEPtWW2ygyAM9J3JK3gn/77zeBbP4hX6GqbwIA35ULDQwRnH0WLc7MIm2p/Hc5vG +1g8DINjY+mFg6gfqQOrccNDQFwNBsKeJQy1zu9/ia/H1Wim2gIHLjcKXG89xyd0jcZusMEqU +O4SKQbaAgSIN4+J4kcbmctRw/WaJeIVJitf4vQUMOC9JhNiVJE5ysU4J9mrzE2uUAGhmpDUG +thTr/aXHawTzYzjsnIOcFsyLViJpXActQmgSuILRgk0rGOcOVO5WNyG7RGmGWEg/S+iVZ1ia +Ay0+rWBSPY4XgybmmzVzXi0F1KwAyyym6oDmGRxJ3P0WbBIXlCvlno2tE+NgO1VpRkgJa2eo +dhzn8doYUk4l4mhwSoJJjQ3ZG8SzGtuQpHxpMSkrozAsyxLeGa9gtAqXs1pch6w8mjpMK2hL +8LOxufu8WPu+u2Hruj7gGjkbo48ANbB8Iub/l47ftP+YLp7XSgZm77ZtIfxxHNlXEGv9q4W5 +ZFynEogTC1TivCRIXJM0gn2jWE4rL5j26Pz5tfqkYw3R5nlOLBAsEa7lGo1vE246s7JC8RVW +Zg3BIKYXDY6wgy3GtVVqRGrhuiNuIli8ygIBjdayO8hp8Rnj/7AWVWEwDcGGYJ0x0BncP0l+ +g+9mZ2W2AAAAAElFTkSuQmCC</item> + <item item-id="94">iVBORw0KGgoAAAANSUhEUgAAAHIAAAAWCAYAAAAcuMgxAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AfRJREFUaEPtWW2SgyAMdc/kFbyTf/c8nsWzeIVuwywU0pAPCoxamOl0RAnJe8kLtj+P55jG +uD4CQOQY10dgun4IIwKnqgOGeyAQiHw2CeiV7uNHPBfPtwr9DD5oYuNwyq2nYvs/n7zhTuEv ++ZVUJEVWDwJjJ8/gAwca9k+69mRRMUprLdi/SSuuSCkTWtw/gw9UXJok04Cfe4ZSQy2+ZI/E +0qE1JlWWxU4NHyz7Sc96kClZtcTNEa1JlKx0c5ouBae5j/ushSBNdmt80PStXA/D/Sq+5mQz +V9GaasRrNTgUVaTG8CcAx4eAUju1feT6GU5WyWdr5WliMfdIS0XhU5mU9TjbqYyXQLIkgUUt +pIOJxVeNLYtcu72lBdbs0QDNPVNrP00WW3yVwLfshw81VAJzc6Rs4x5AnZykBp/rBxagcPVS +fnnflmUJ7145WbMAq/WTUhROobwPnI/UPa1yJUWoDUKq3BI7JWs8ifu+u+Xruj5gDo8WRJb4 +22vN65ed37RdTsy1yxjh+VYBwN7btgXzx3Ekv0ZZJamVn73tOvaAlJiYGtetAhlE0sgGIj2h +Nb9bkDnPcyKlIK0w9/XSWlKJoRkLldyCSLDpyYRv+IC84h5ufU1q5Wsvu5PU6z693yuQb99n +/B95kwwYRA4ib4LATcL4A3GIbiGbD6GnAAAAAElFTkSuQmCC</item> + <item item-id="95">iVBORw0KGgoAAAANSUhEUgAAAIQAAAA/CAYAAAAhSWARAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +Aw9JREFUeF7tm+uSwyAIhbvv/9DbNjPpWIsCBjXA6cz+abwePgFp9u//9XngAwVOBd5A4AMF +TgUekAIKlAoACPDwpQCAaADxCqnv3Or4y/TJtVuhZWsIMkEBIASQAAiBSJmaAIhM1hbsFUAI +RMrSJBMMR5Eyi2FH9pkNBgDRoaSEIRMY7jwEVR8ov7MwXj2exZgjHmpHH3dAHG6NKBZlMtpM +UFwCUUMBGOwQcQvECQVgsIMhRFIJIADERwGLH58A1DdQbkOGxbXQAijb87l/NJdAWN4y4CGc +ewhJHaL1LkOr7/5zeZ8VuPQQEvmocND6TjJeljahgSjrFWdoyPzyiwRqAJHsFTkOivBAcFVN +JJXOk0qO8LKCWYeJOqlsJZ+SOaK2+XgISfYeVYRd+6qTXCmgnK3K/UjHPPt8hQzL+/0ukb3M +yyW3vVAm7cu1o7T6ySEsKoBejLJrnZK8pdVGcnW+cqMik8rZJV2JILuMNXve0lg9o3PraJ3+ +3oGW6N68ZUg6c4vmnpfxTRvruLFXPtfsg8obqJgvWT8XErjnopBRZumSRdVtZoLUEn7V9yN6 +cPpYeYlemNAcNtMcQhtqNCfLwhizxtDsQ3pqJQdLkytIxjucQe2uOKI5UaUTc+NEfW4FhCZX +0NhEVYeg4p90gxx4UQEg4zTxn+W1l6H06rl+6pnWY/94CIlROAA0NErmQ5u1Cqh/ywAQaw20 +erZwQGgy6tVie5jvEhCtuLVr45z32rUuT/OqgajrFHW2O5LIzBIM+Yxe2SEg9NPs6QEg9LoD +CL1moXuEBQLeYYzbkEAAhjEYhgpT41Ot6dkr6a5Zge9ZXHsI6ppJlYB7Zd073YrugJJbILSG +pMIIQssvgm6BOOshmlOFcMKrlQqIuqjGy5OvRTogRjxLJizSAcHlHtnzilRAcDkEB0sGT5EG +COktAx7CKfaa9x40dQgA4RSIWcsGELOUdTougHBquFnLBhCzlHU6LoBwargZy9YkqjPmv8OY +rq+ddxAw2hoARDSLXtwPgLgoYLTuACKaRS/u5wl5P0l51aoZhgAAAABJRU5ErkJggg==</item> + <item item-id="96">iVBORw0KGgoAAAANSUhEUgAAAIQAAAA/CAYAAAAhSWARAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AyhJREFUeF7tnOtyAyEIhdv3f+g22YyJa1ABr8jJTH+08Xr4BGST/v49Xj94QYGgwBMIvKBA +UOAHUkCBWAEAAR5uCgCIDBCPkPrMra4fTy9fu2VaNoXAExQAggEJgGCI5KkJgPBkbcZeAQRD +JC9NPMFwFSm9GFazT28wAIgCJTEMnsAw5yGo+kD8tx7GS8frMabGQ63oYw6Iy60RxSJPRhsJ +ikkgUigAQz9EzAIRoAAM/WA4IqkEEADirUDrwyevD7BKCJkNGa3XQs8PsI4DYsQtA6HnhYk5 +D8GpQ+RCQSlEAAijQHBTKCq/yOUcgOGjqjkPIQEirlcEo48IN9w1WWjnHgh4hzumxwNRqmq2 +3lQsnHjpGo8EIk0e43BBPbhqrWdIRd+5/RsITva+80Ysri0FkVsoq9kq1oI7Zuhz8xBIuOZh +VSuMlXIbbt9aO2q3XyEDcXU8FJxENtcmd51OvUKaO1G/s4AIHTmL1ko3cmztmmb1S/MZ0iiM +LwflTn/pQHN0zyaVnM6tIuYSvNZxZ/eX7IPKG6iYz9lDLSTU3h/uIaQJDGfTuQSpdFsY9Z50 +vZzTXwoNtfkob0BBILFLtxxCRWP0/UnJomtCzX5f6iGoeJ+umeOh4/BTG5Mz3pUu9BpIs6HZ +htthPu7BqRlQkivUxroxEH6hTmiNfCrjjcfLGUCywB2M2HsNHK2pg1ryoqUxJesXVyo5hHs3 +uMQAu7UFELtZZPF6ugOx2jtYTk4Xs3BN3wREKn4p0ZmxWU44m7EOy3OIgbgoiv7VTnz1SZPQ +1cKs9lar96+ZXwWEZqIVfQCEXHUAIdfs6B7HAgHvoOP2SCAAgw4G1S1DP9WcnqtvOnN2OW4W +0x6CumZSNx1pqXic3PuPbBaI0nMUSnYqjCC0fCtlFohQD5GcOYSTulqugEiLanV5/LVwB4TG +s3jCwh0Qtc9wSHOT02BxBUQph8CDsRfaboCQ3jK83kDMAiH53IOmDgEgTguGDfvxCoP5kNFg +82JXADFKWYPjeoYBHiIBFpVM47eMng4ofSjm1VOYvWX0hAFjfRQAEKDhpgCAABAAAgzkFfgH +V4Ycps68dcAAAAAASUVORK5CYII=</item> + <item item-id="97">iVBORw0KGgoAAAANSUhEUgAAALQAAAAeCAYAAACFSjS6AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +ArNJREFUeF7tW4tuxCAM6/58f77dVUdHUSAOhEeZK01T25A4xgmUaV8/r+vgRQZ2YeAtaF5k +YBcGjl0SYR5k4NxtkAYysBMDFPROs7lhLq+t/fsb7/xBLswK8UQbMuDMQCpiRNQUtPMk0F0/ +BijoftzS8wQGKOgJpDNkPwYo6H7c0vNgBhAx89hu8KQwXB0DqJgp6Dp+OWogA7GYEWFfpxzS +eV/8DHHmkecqOKRcVsZ2diflrBbBnwrIcgaMzr+E04otF+t2bJcLhAL1slsFR07U6XNNSF68 +lPxowsud6Vqft+Yi4aw5b4YEnVb5zImyLjUeRKM+RmOrwaWNsTYNTy1oAm6JJf5hRat2jazw +vgVYKK5WH72wenGE4kPsLFx5CdrqR9oaaQJHcr80l23d4N/OkWDx/kjaK2lLKRKj1cYiBq+C +1fKWeNPGIDzkcrU+l3hAeNQEjPiAtxyjO6M2QbXJIeNyhWYZiwgotrEWtMU/glvqkLlnlsK1 +rFhDBd1jf1jToVtwWMi1TFptR8rFKAmwlTPrylvbnePcagtKE7ipqNPukQ5GQVqCarY1+7JW +3GieHthqikjjTOuy6XtERGhTQe3QwkbnQuLEdA6ddj6tE9YAk5ZkrVtJOKyxEXsvbD0EndvK +hLwkDks4SvYtTbCEU9MTVNSIUSkBRAjWGIi91mFm4ZI6pWdXR7j5zzZ/Hfr7foJ3ZO6viv+8 +T+9HkUlBj2L6WXFOFb/FGwu4dH8uC5F9eh/89abhyYKeuXr0npfZ/i9Bx0IM4pZ+BwFfhfAR +uDS+Z3Lph4i0v+8Zv+S7hM36ATUrh6fGPdDOHHfya2OvdPbepMQi1gTeG0vqX8KGfmiNxrpT +vJugpe1Cbi8dSNDe70QWc1mfAf6T7PpzRIQGBihoA1k0XZ8BCnr9OSJCAwO/xCYgMpNU/t4A +AAAASUVORK5CYII=</item> + <item item-id="98">iVBORw0KGgoAAAANSUhEUgAAANMAAABLCAYAAADqMrL3AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +BQNJREFUeF7tnYuS2yAMRdM/75+3mzRkCAUjAeIhn8zs7NgLQlzpmJcz++vPz+fBBwVQoF+B +J0x8UAAF+hV49JvAAgqgwGuGhwwogAJjFDgKpp9J7avXz9/pzxg5sIIC7QocA1OAJ3Q1gFW6 +bpeEmijQpsAxMIURCZjaAk0tewW2hykekeLRiJHJPjloQafA1jCl8OSu0+mfrvuURoFxChwD +U22aN04SLKFAmwLA1KZbd614N7LbGAa2UOAYmNLkS9dMW6gpdIL1nlCow4ptDVOY2sXnS/G9 +HFDphkUOwt1A3M2fw3J4G3e3h6lFqRS+eL21Y+Lu6FOL7nev4xKmdLMiBHnXpN3Vr7vDoe0/ +MGkVG1wekAYLutCcS5hOmeYB0sLMN2jaHUynbEBcvc1hEGdMTlDAHUwTNPs00XpWJH3rPVeO +0WxmhHVtAZNOr/9KWyd3afu/022qGygATJ2iAlOngI6qA1NnMIGpU0BH1YGpM5gzYErXTp0u +U91IgS1hKi28R94v6ald9I+G6eq9vVJbo30wyjX3ZreE6STVrRP5Cq6nTvFRwEm6efQVmDqj +uhqmAFRnN6g+QAFg6hAxPWcafWBcOsdKRyNroDskulVVYBoc7hWvMgHT4CA2mgOmRuGuqs0+ +aAUmgyA2mDweptZXehq0ElcBJrFUrgoeDVNtp2tFpJjmrVDdpk3tg/pomFIJV093Rm9ASFJE +G3CJTcr8O3KIP5LccgOTpLMkCQq0KiDJLxcwcXDZmiLUkyggAelpxwVMQRBppyUCUgYFXoC8 +/+OKRA1gkqhEGTcKxGtMzXpT8qAGJjdpQkcsFXAPU/qUsRQT2/dWQAVT6/B3b4nv0/taMpXW +Ftr7rYqWDso1a550K1wzDfxvA2L2yX2rcNSbq0AtIUugae+39irnX8s5UWv7nw2wlMbUYO2J +1OsA9fdWIMRfC4a2fK8KNXhm5PHXBsSokWmG473iU1+mwBVM8d/imGvvSx7gtZzaEqaRi3rW +YbKEnVVKG48cILl1xWea834FJ5121eDK9b/Wdg3AGlwWmhdHptqTwMSZ9wFZKejcf3wOEa+0 +GBEbSTKWymjvl/zNrYWuyl4tWWbk8+U0r9cB7ZNwRBJgo6yAJh6SslpoJIBejXxXsa3Z7s1l +SV6ZwiRxgDJnKJBLRkuYjp7mxU+i3NMhNw8u0T7jKXBGCvrxspTckrwp5ZN0yvYsd5VTWh+s +oqJ6nag2lFo5iV0UOEGBD0yP38mXoTLXX0+nn7+n1yd0GB9RwEqBF0FPkGKYStcBnvD39NrK +yZ3tlqYYO/uMbzYKfGAKUEl/v5LoPToFENPRzcblfawy7d0nFjt48pCMSMHR2oh0N5jSALLx +skNKr/PhC6Z4VIoB+tqNqayt1nVlfcvAtD4GKz1Q7eatdPSEtoHphCjZ+QhMg7QFpEFCHmwG +mAYED5AGiOjABDB1BlH72ktnc1TfWAFgSoKjOTfKvQy6caxxzVgBYMoIzLTNOOucmgcmYHKa +2vO7BUzAND/rnLYITMDkNLXndwuYgGl+1jltEZiAyWlqz+8WMAHT/Kxz2iIwVc6ZNF/Xd5oj +dEuoADAJhOJ7SwKRKOLrn51ZxROYrJT1ZZeRSRBPYBKIRBFGJkkOpC+zpusoiQ3K+FeAkUkY +4xgg3t0TinazYsB0s4DTXTsFgMlOWyzfTAFgulnA6a6dAsBkpy2Wb6bAX6D6N9MnLq84AAAA +AElFTkSuQmCC</item> + <item item-id="99">iVBORw0KGgoAAAANSUhEUgAAARkAAABICAYAAADCtYHxAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +B9FJREFUeF7tXQ1zZCkIzP7z++e3ydy8OWOhDSqC73WqUpsZFLCBfmA+9s+/3x9f/CACRIAI +eCHwQzL8OAeB7zwIczbS9vth2D17tH9hgUluOC5jkwOT0b3IIoq0XcYC+YHkGeN6d59IModE +OLJ4Im1L4UH+IPkhIb+NmySZA0IZWTRW2/X6n9fl5yq4kV9IvsoP6sEIkGQwRuErIgvGYvsi +kwswaa9FXw94pAfJw4P6IAdIMsmDHVksI7avPb29I3o5NiVP1I57JJnksVtVkCPH1NouOxiS +zAjS995DkkkeX22hexxDY7tcI5HNSAeiPQvyD8m1drhuDgGSzBx+rrsji0RrW7ro/QFlx7iE +7GjkrgGk8hcCJJnEiaAtdI8jaG2TZDzQv5dOkkzieGoL3eMIWtvSuNS7l9Hq1Z4J6UNyrR2u +G0eAJDOOnfvOyAKx2O7dxVyycs0FXL2vXHuNOsiPWbl7EGmA41LmHEAF5On7atstfVLX0+uE +6jMjP5HcE0Pq/g8BdjKJMyGyQDxs151K2dFYyaO3t9TlcY7EKZPSNZJMyrC8nwAP+Y1riQi0 +5IDWIXni8N/GNZJM4lBGFsgu2xyXEifgItdIMouA9FCzq9Al33fY5sWvR9bk05mOZFpzuxU6 +SU/vOx1W/TvW7yj01jkibVuwRX4iucUW144hkI5kXrfRi+4iZmb9MTjX7hrFYXTfiRem6KxI +vjZi1CZ2xRlhWZkYpa6VenfgNurv6D6SzI6oPs/GrTuZK5zl7L8jxL1v1bZ8aY13yN9aH7It +EYnk0wqiQr6vkCM/kXyFD9TRR+ARJLNyBEMJ1eqc6mTXrEMFotFRn/3ag0gN2UY47JIjP5F8 +l59PtnMrkmkl1IpOpqdbM2YgkpH0awoEkUXdzfXGR8toWdr1/rpXoAgjJH9y8e86+61IRrx0 +Ki6RRxPOQlIzZCSNPtoCGyEPRHy7knDGDoopks/Y5l4dArcmmdHuAJHVrsJHBYLGpXI0Kjsa +6evWWKVLo7hVFozivHy25XQkU7f/5dO9bsuvwmiRidQZtFr7euSxdhXS/jq1pNGmPEOvs2il +qRaT3kgj+YCKN0vZID+RPMs57uxHOpLpdRHSk3s2iaRRqPXe7kSYPduMv5G2LX4jP5HcYotr +xxA4gmTqVr7V7o9AUI8U0ojRsj9iz7InskAiba/E6JRzWM582lqSzPtiuEU2KwnNmhyRBTJj +u8RSGuesOPTWIz+RfKUv1CUjcATJSN1Fq+OwBloawaTOJSJZI2zOkmo9ao7cM1liiDBCcost +rh1DID3JlEkrPRWl+xMtFKW+klik92fsaP2p10UWyIztFnF7jJ3ITyQfjQ336RFITzL6o9xv +ZWSBWG3XD4NWR2TVi6KK9CE50k/5PAIkmXkM3TREFojFdt25SK+9OkHkJ5K7BY+KPwiQZBIn +Q2SBWGz37l0sekZCgfQj+YhN7rEhQJKx4bV1dWSBWGyTZLamRbix+s4SOUSSQQgFyi2FvtpN +i+3WeORx0Wu9HLecYzWGd9TXe6C0zkuSSZwJkQVitS1d/PaeePX6eq32Dgf5ieSJw3+Eaxp8 +STLJQ6kJotcRvG1f+utOSNsBIf+Q3Au3p+jV4kuSSZ4R2kB6HGOHbcmG1i5ah+QemD1Fp7bT +fD0wngLKqeeMLJQdtkkyOTKzHFd7Y671TowkkyO+0Isdxd68tFv0P0dI+mfGJYQJkkPQuUCF +gAZndjIqKGMXaQLp5aGX7dmLX+QXknvh9TS9Gpw/JDPaLj0N1KjzaoLp5Vuk7V4HFNF9WceF +1t1Fj2RX4t0aRy13KuWZa57Q5NyvTmZmPtYY45o5BFYmn9WTSNt1kvd83+knKtSWL/X76LU1 +Vtd6yT8vW92YoADuDNoomE/aFxmPSNs/MUb2kXxlnly2tERSFv5OkkSksgMzl05mh+MrE4a6 +iIAVgR7JlLKyFlrvowd9j6BQraUkmZGZqzcb1/oQKNZgcz0RmEVAytFenkrEId1b1ORQjy+S +DVQfyHaNRUqS0bZ1s4GV9reCzfe/XqMCP+cwWJGzqGilsa7V9Wh09epEcx5kA5GaxgZa0x2X +Zh2wPiGQs5QTAQ8ELHmqWdsq7FUFX3dEljse5IMLvr15cJZkPBymTiKQCQHNyLOykzl6XCoZ +WpovpXmyRUIkp0xlQF88EWgVvaaeeg/41piE7lxatat53wsn00/8RrRaXgenXiJABPYg8P9P +/P7zm2++hNe/WPtbXr/e4zKtEAEicBICL2b5IZSSVFqvP7Ple339+qSDn+Zrq/0+7Rz093kI +fEjmIhvtv6+kf3czF0HV3c/z4PQ9Me+6fPGldh8EvjQdzGX66nBaHQxJxidIH/wd/+yCr+fU +/mQEfpFM2cWUxFICJN3VPBnAnWdnJ7MTbdpahYDpu0urjFLPGAIkmTHcuCsWAZJMLP4m6yQZ +E1xcnAQBkkySQGjcIMloUOKabAiQZLJFpOMPSeagYNHVDwIkmUOSof45GcuveRxyRLp5UwRI +MgcHlr/mcXDwHuQ6SebgYJNkDg7eg1wnyRwcbJLMwcF7kOskmYODXf+ZAcsfMzr42HT9MARI +MocFrHa3JBZ+9+nwYN7UfZLMTQPLYxGBLAiQZLJEgn4QgZsiQJK5aWB5LCKQBQGSTJZI0A8i +cFME/gLVNSJeZf88AAAAAABJRU5ErkJggg==</item> + <item item-id="100">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</item> + <item item-id="101">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</item> + <item item-id="102">iVBORw0KGgoAAAANSUhEUgAAAHAAAAAqCAYAAABr9d/aAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AmNJREFUeF7tm+2RhCAMhr1WrMWe/Hv1bAu2YC224IlzsIggCSYIGGd27taPEN6HF6Le/azb +1slWrwIKoGz1KtDVm7pkvs+eIkPdChQNcFuY1Pq8f/Rm77P3140hPfuiAf4XWKfeCbivJMUD +dCEKvON4rgKghijwzlNtNQBD02n66tHGldUAdIsZV/63urMKgG4V6oMnAAudUXxgoPsK7RJp +WkU7EHMfKA4kHRf5gwnA/JqTtigASeXMH0wA5tectEUBSCpn3mC+YidvBs+1ZqrQN4uQKj9E +s9A5V9diZpPDbQTmwtROt3KdqxXk3lSfc3Vt7InT6SGGvUMAwocXBCD0cV9KLB2b1IFvGgAp +oof0SYnFAtAEtd6kQ9YJ+LjnPdPONZY3VnQoPOxbF5QDuRwWEo5rP8UwqA4gZnHFjGQKMali +YPLGAMS4j9yBduNcDqQCkDMOFGBIvytdMTp77wND838scOx4ToFztBXTyedo7TD3mK9+gPQB +9TrpbYAgAj59zteBv0eWnef7wfbO8ac78tb2d2oKlg0s9F0D9B2nEtDn8qupClNcUeVYUhwD +UIO88/Nux3wwQsUCtIi4m1Pp13cQ55mFN+JUis7GwJhZwPpze2zpTZFnKTEOAG33maoIsDZS +duYuwGVZzP9T+KrAeZ4p0308FqoKzZHtXYDDMKyfz2dVINXvrbuzOYDaYQqiAMxhOaeNuw7U +4cZxPACcpumB3vA32ZwDzdq9FTkKotr6vt8/LW5FAcTe74XO1+uenk6V+1p9ilQUwBYdwt0n +AcitMHN8AcgsMHd4AcitMHP8PylWIa7EL1j5AAAAAElFTkSuQmCC</item> + <item item-id="103">iVBORw0KGgoAAAANSUhEUgAAAEEAAAAWCAYAAACffPEKAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AQVJREFUWEftl9EOwyAIRbv//+hVm9gwFbhQ1q0Rk740InCAa/t6l7WtviqE1de2OoBjEhIC +gVBkoWrD8HwbEvXJ+eL2SLbIuc3fRydUw37N3kWB6c9G/Lc9mq0l7p9CQIBryZ7VJAVsXYAW +628gSJXjqj8DQBNHu2GA0OsCSpMGZNUWpHJcQpotAoLtBMmpFQy6X/OJdAsyYsMeqX1m86iR +vXLLWIQRTVaLd/hOQEQIORStPJIIEtORyIWb7RwH7l7tZy4SgqQ/1M8sNs6Wy0MqjPmLMRKC +t2Oi7RKC598hO4ERoOj2vPs80zh4ROfuhDz+TBA8Dp5gkxA8wviEylpjzE4oxHY6cOMpa+MU +RwAAAABJRU5ErkJggg==</item> + <item item-id="104">iVBORw0KGgoAAAANSUhEUgAAAGwAAAAeCAYAAADJjPsHAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AahJREFUaEPtWVsOwyAM2+5/6K2t1IqxQOzQiFY10r4a8rDJA/b+LOuldR8EVsK07oPA6z6u +ytOtGgqGeyEgwibztTTPdYbYfsjCpBBNkqERqElCSBNhNMx5G0RYHrYpmkVYCqx5SkVYHrZd +zeUggQ4VCFka6ycRWptFyRJhFyCsJAsh7pgSI2l8RrxMyajvK629qE7WfwvQEVsW5p5PP2N9 +yyFPSfQ7cw/xZPfvntyIr55uJEOi9vd9UwlDa7n1EtACzwN1BDBP96MIQ4Lt1Xs2wyLV5JKE +1XWVPZGRXmhlUMuuR4wHaqmXbvjVex9ji8WxGT8TwEiDRRxmsqwHFnPoIofl6CcOgUjMrEy3 +hyElyOpDkelnu2MAL9ZehrUOYC9jEbuWf5fKMA9ANEjmBHk6mQPk6arjY+URApnYUVnzHlaf +0kiDRhzola4yk1plyyrRaIljY2q1g+w28VfBEGDR8TuiS3s4BEL/hyHlg3ND0igCNGEiC4U2 +R44ijL235Lj8bK0wYdFR/dnwnh89TNj5pqUxgoAIi6A2cY8Imwh+xLQIi6A2cc8XcJWCBleD +gSAAAAAASUVORK5CYII=</item> + <item item-id="105">iVBORw0KGgoAAAANSUhEUgAAAJsAAAAqCAYAAACk9ylcAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AxxJREFUeF7tm+uVwiAQhd1WrMWe/Lv12IItWIstuMIRlxAel9dAkptzPG4SYIY7X4ZH3J/X ++zjxoAISCijYeFABCQVOEkZogwroEZQyUAEpBaaG7T2NUPNJ/TGHfc2+LiUY7ZQrMDVsn8XL +qneErDzgI2tOD5sLHEEbiUud7U3AZoAjaHXBHl17M7CFhtTRAtI+rsBmYHMXCnYXfQsJXAKW +lFJgE7C5q1EXtNi5lJBHtJP7kE8Pm2+eFpu7cV4ng72rM6L71LCV7LMhnZYJx7GsILpPDVtu +uJAO57bJ8mkFUN0JW1pLlogoEFu4udV2Axv6dJGcuALu60AUJkT/XcAWW60SLhkFDgGb70mU +kZdWcrecvpktd8+EUutfOK9+lbKap0TKhLZ10KErJwatbZX8+mYxjCKpMKeDey6L7DPFyviA +Qtos0VTSVsw/wlYSPU8dZPM5BVPqfo2rqbYlEk1T2CQcrhG8Z11J2BBbvuE8NseSiF1T2Exn +SpfPPWFA2i71OxSo3GySKh+CBQEl1TbSBqJhk2EUmQyXOhMKcq/rpX6G6rWCTbWfM/HOWUhs +BraUo7EVWE9Ie0DjAzz6tFr/H9Fy6EIyze5gK5kftIZg1vZsbRCd0IcWBc2etqQ0StlGbKZs +pO5799lS2QgdNlLGt3w/lgFdCH0ZyKcxmqkQsN35HepDz5hkv66SeAJ6dphtj1PgP7P9Lrk7 +Bc4NbO79cV2g5a0ooAlT4NjwhM5t0NzyrTocGiJmGAZa9fGo7XxhM9CFvnWwP9ku9F0rYggo +d/5htgh812t9YP1+CpzQjGZg01nvs9x3M2ALN9FVU6pcC1/YRlsFFrDZWc2YCc3dQvdr3UtB +9AXd2d8y15/P52pj1F75PR6PWhdZv1CB7NVooR24Wi1sl8vldbvdXgo69bdvyIWdYcGmCuwO +NpO5FHCErSkr1Y3tDjajyPV6XcB2v9+rxWIDdQrsFjY1HCvg1HE+n/WHx1gFpoIt9Jos97qZ +p5khVWU1vvkYC5qOyXgX6MFRFCBsR4n0BP0kbBME4SguELajRHqCfv4BBjqqkkII7rsAAAAA +SUVORK5CYII=</item> + <item item-id="106">iVBORw0KGgoAAAANSUhEUgAAAH0AAAAqCAYAAACeC1RqAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AwZJREFUeF7tm/1xAiEQxZNWrMWe/Df12IItWIstGLmRCyIf78HuCZe9GSdqYHm8Hwt7N8n3 +/XF92fW/HHDQR7oe7o8kxyXEUHokxAw3o9FMHk2PQZdwoBLDoA9ksoPhX15W+J0ULKk4G1gH +DzH19p4CIg1JOh5MRrHh1NCfdx6rPRqANGIq8oRCTw/dg9eCoxUXoqPUaBfQ44yX9MqgS7qZ +idViclzQScps0SM5vkas6TM9hKIBSCOmBkgm5tTQrXpnUP+1nRY6cp+eu49nrLJMZ9xqbCtt +chyPjc+2b5z2pt2mzXTUJYP+7pRBt2fvaP7otZPeTuPqnr29k9aj5xweefeZHj+xYyGy7XHr +P9dyhZ6qhj8hazSTpfWwPqM7FRP3JdOlJ9iyaEbQEOqW1MMWleFRVOvL6DToGxZyNXCpxeb7 +lPrSdYr0qmZWXMrv3v4tu0upj6QeLeheP6pVLdPDM4Y6bwb7Q8Sakcw8UejxOe6LUSRBa3qX +WEgg6exhMitnqtb3sTbERNQfBHquDdI3tTiSu6kWdCYDtDSgMJhFmFoUqbkiR1dqQZUWM+IT +skirmY4EkTCXPZckx+yBzuhAs7VU0JV8Qlkl79PjMziuDkvVIjpwzqze/gwEpK20nlx9kxsn +Pt9zLBid8BO5llWKmKp5hraMP7oekTmt28XPK/+vzs+t4pgV2zoG0280PYz27G66VHwPwCHk +3s89wkom1wqf+CwsHUOoxl1D9/BzPxcDn9m/LIroc9gPNRSpcMPCpXbE+N/X2jH6dgm9NcM9 +9Lg/YygDfVlU0YOb3OdaO0bj7qGnspU92xlDt4Z+u93W/38Lq2j//nq9vknaJfReSNL9mTOd +zfTj8Xg/n893B9+9T+0e8XwMujThRDxN6D6THXiDvgFMdAhN6F7D6XR6gX65XLLyLNNRch3t +toDuxnDg3XU4HJZX7jLoHTDRrjmTw8IrjMV+789xv9W7LGcWGjqPkdvBj2G3msRomTWaHgkO +Br3iokGXWGaTmWzQN4BuQ+g78AveNFDjrAxFlgAAAABJRU5ErkJggg==</item> + <item item-id="107">iVBORw0KGgoAAAANSUhEUgAAAG0AAAAeCAYAAAAmTpA5AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AahJREFUaEPtmIEOwiAMRPX/P1rdkiVYKXftmKHLLTHRrZTjHhTm8/W5HrpqObBB01XLgUct +uVK7V0bZUM8BQVuA2WdD3c4V+4e5uCgmk2JSDlhQDDhBS1l9XSNBu87bSzIzwHQQucT6XFLt +aTnfprZqDxeRgwaz2rSnTUV1Ppmgnffw7xlC0LLLefaokGiv9rf3e2OZpbOnL1L+rA6rldH5 +VR49QUyiGTFoM/aAoncdNBFY7T19qG82dyRuGWjH4FkwxyAREPQ8YtZ+3Db/WqDf0fxMfAlo +LdDWJO9+O/ARtExlQZBmT5IexB9omRqL6nSk7I32DLu6bN6zEBjDl4TGlh1mGTMxyIRRSUJt +GQhH/kjsaCWzeRhvvJhhecwKsKt1tNKYWA+OoBGb7JnZwbZlSpx3aEEQu/tDc7BgJinqg8nB +egFXWjvj7fLvPUP7VFZYO2j7vdfnSDfSwEwQzwvmPuo/+zz0NxaaZVkRahdzQNBifi0RLWhL +YIiJSEPz9pJY94rOOBCCZt9p/nFSygzq7m3C0O5uSIXxCVoFSkajoAlaQQcKSn4DI4fylUON +IPUAAAAASUVORK5CYII=</item> + <item item-id="108">iVBORw0KGgoAAAANSUhEUgAAAP4AAAAqCAYAAACTOeZoAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +BOxJREFUeF7tXNF1IyEM9JWQFlJLWkgLaSG/95kW0kJaSAtpIS2kBcfyBQdzgEZrFrTL+D2/ +nBchiZEGBLt7f46nz4EfIkAE5kJAiM8PESACcyFwmGu4HC0RIALnKp8wEAEiMB8CJL6DmJ82 +lw68oAszIcCMGxxtIT2JPzgIOzEfcgnJJxLfQdCRQDlwky44RsCaQyS+g2Bag+bAZbrgDAFr +5UjiOwggie8gCDtxAc0lEt9BwNFgOXCVLmwAASSfSHwHgUQC5cBNutAZgfiwznRwB9wlIvE7 +BzNnjsR3EIQduYDkE4k/OOCWmXywqzS/AQQQ0ssw/iN+moioog1gQhd3jAA6gebkSn1RnVZY +c5y6xdaSvlfETx2y3iKwAkB5ItACgVzelvRqsqFdk1vqd45Ta9mq+Xghfmll54q/NMTsNwqB +Wi5rJOvBg6U+tMRTJf4SY5wslqDGPq0Q0PIvbtdIGHyyTAgW++f9dnIKr/VvgdMqxI/Bivcf +3Dq0CNkcOnJ5gxACkYnJhpBO01mbSHLR0mxq9lpkwKrEtzpYCjav/3uRZ49fa45o8ihpgpxG +wtyKXCKz1XapmkD1aFgM2+MvnbVvGRD77gOBJbljIQxKfFSnpZrVJhvU5i2RVk/1b1G+x77v +7+97HFbTMY3AyFJu12RLbTUyWmwje/ruxA9O5Wav9FpthmvleCs9rbL64+PjKF9+6ggIRp+f +n1mhNWKaqw7SMjqWSR3LtdV0xv1z49EmiRq/1sAnuzWxJLFWolh0IbK9QEB8EZnn52dUdHq5 +ElbeYjproH4P9/5eP8R3yPy+KmlO7env1iB6SpKvr6/j09NT6yHuVp8QXzDLra67HfSGBnZm +u5A8Jnrp9+VA5Ec+/d163GgZVSrjauWd1de3t7fj6+vrpRtSHlptWORH29d8lX2+YEbia0iN +ab8QP0wA6N9z4v2s+mHSSKuEW4eU21po243LZNT4oQhZ7dP9PTox3YpDqf9o+7VxCVa5CslT +FbdWXLag94Cs9GEgoRIorfRrE/88KSmEXov4Dw8Pauk6IqmvtlvAe9i9klLKfMGMK34vxG12 +rogfr/Yx2WOVub2/zSQujaxopYmgdF0SMi6T03+XTu1rpA468JG1lRxtvzSau7s7Er9tqJtp +c/0+/hrEl1VI9p7xioSs1JqM1t4sYgVFo+3n3ELitzYu1J9HYDrihxVdyB9KUSRBe6z4pUpE +S16vKz6CqzY2tq+DwHTEDzDK7aaY+NrTZiXij95jj7ZfS0sSfx3SttA6LfElKcNDJvf390f5 +1j7ofrVnye2dWChmLRKZOmwIbIr4cSl8deAYvbmGXD8fYp76hLJfVnuNsFIdxI+h5nzRSvWW +JXlL+7XDzoAnai/Gn6f6NjL2lN4U8XsCk9rK3cdH/EknFG2CQXRaZFD7NblSW7ie/hX/eB/f +EqX+siQ+iLkcBr68vIDSv2Io8cyKwQ6o/SXEj6uB1B0+uQcGaJAYiQ8CL7f/Hh8fQWkSXyZJ +PqtvTpduHUh8A9RL3s5LT91b7vMR11H7rVf8UnXUe6uDYDSjDIlviLoc7uVePNFUxGQfkfgl ++/HePJVJJyjLwWrt/y0YMX4tPjO2k/jGqGv3+43qdilemxxJfB8hJ/F9xGEaL0h8H6Em8X3E +YRovSHwfoXZNfB8Q0QsisD8EvgHdipojSKMa7AAAAABJRU5ErkJggg==</item> + <item item-id="109">iVBORw0KGgoAAAANSUhEUgAAAIUAAAAqCAYAAACdkJgHAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +A2BJREFUeF7tW9FxwyAMTVfJLNkpv50nK2SFzJIV0uALLqEIPQnBKRTf5VrbQoj3niXhNl+P +53FYx0IgRSCI4pOOZ+yuwvUWjwU4vhAGVuSNBG/xABCyJksULER1gyWKRgAthlMkhOvxE+dJ +r/Uir5dfC6y0PqbKFCWCepPW27+W2JZxU4nitZPa8RhB2Ig5WgjWjJ1OFFEYo8gaNY+GXO2Y +KUWRZwwtOMi4JQoEpc42CAl5w6kJCZlnpPg0a9COmS5TpGSixObgSUSlnUNL2IhxU4nCcveB +ko3ajSDTao5pRIG8pyjZpI2pJsssUVhJscFPKwml0kBdQ8JsjQeZY7TNNJkCBS6SSP2MflCy +UTs0Pg92SxSvv7rm5KJko3YeyEZj+LeiyLeTSxS/kvlXosgbzbSEpH0F1ZCWnrSpM4UECDQN +9bDzRoJ1PAgPNRsqHkmcb5lCMrAH4YhPbzFaxoOUsJpNaReVbrkRfDf71NBygWgAUjtvMVrG +g4ii9PYV4VAS53BRSIL7hBreup4aoYhvVEiIr307jqhM+jQj9mldROqo9P0BEoOFDQe2ZJ0o +wTUsXPYUHEitRJSAo4DvcZ1L3y3rm1IUVKNDlYESaRyovUXHzS8VRa9MIc0IEtzYnkLiLHa6 +UmAl9tJ4JL41tpbxoJkitdOM4da5i6KmaKrml65zIHH32YAn/zJQDev40OVcpT1GKVtLerZt +Do6EfMK8MUWVis7D2bWKivMvve8tHmn8xdK+k/79ro8DcR5BiPe5c8q/NnhvJHiLR4vr28O+ +pYunAFIR1M63VJTYc+cl/y2B10go3ZOUPk1cU4sikkf9jOTn9/PrlF06TgN+WsaKKe/1DbG8 +vJXOLUvelKJAMsT+tL0yRFoytqwR/yeBuG9ZQiSZgiJ/iaL+WB6o3kHaa6D2LVliyzaV3QdH +9i7ezEe8fr/f9++j5h1+OL/dbn/CnzJTtJI0enxPUZxOp8flcnkEcYTfOREi90fjYzEfvCW1 +mMzCR09RxEwQhLFEYcHWIB89RRGXcD6f30RxvV7J1a3yMYj42jQjRBHmCMIIx/F43D7UsUTh +WBTS9xGUfewTYikJWUIiRAcQNYcwVU/RjIbCwcoUCtCsh3gjwVs8FnivTNGI4hJFI4Br+Gcg +8AP6buSPM3V8LAAAAABJRU5ErkJggg==</item> + <item item-id="110">iVBORw0KGgoAAAANSUhEUgAAAIwAAAAeCAYAAAD+bvZ2AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +Af1JREFUeF7tWouOwyAM2/7/o/eo1IllATtQViiudDrtGvJwTBK43R+v56ZHCLAIvAmjRwiw +CNxYQckJga0bCQYhEEFAhImgdUHZ1+jynmG3H+bhpBhNkpkOAUsShjQizHRp7uewCNMP20tq +FmEumdZ+QYkw/bAdWnM6yLJDLUMWHauHTvv/nGPJIsL8LyfDWkrJwhDnc0rySpctbcNG3eAY +U7KRjL3HQPK17noJbbHltS7k29exOucQUjLre+YeAslE39di5V2uIdu1tkrrfu5hoiWqh1Nn +6WQ2TBQfpsyz8SKCHGkr55N7ceexmQ1qZrkIYXbZElalBDK2LJbDEmabhsn/LZxBEK/3tvqb +W59Lkje3pFgwm661WiEC9cjN5SsMSy5UDexwySYLEZkh1p54ZBPZOoJAU84wLAlYgFigSxWB +rVBem6mx73UBVg+Liye39CnJgo6qjG05pc+5qpBbwyR7qApjS+4OprebUzBywxuqAqy9lt2A +1qLYUgzc3eZ8l8TqzJ42nBkREdZrXx6OKO6W9+GvNyCWM/02p2P/u/3dEqDWHovAUIRhyvix +4UtbFAERJorY4vJNhCn1z1LrQm2NGQAXz9tp4YcJYwdB76hpiYQGXHty8Ia70xCS4S8Eqggj +DNdFQIRZN/dVkYswVbCtu0iEWTf3VZE/AcmNSgOoaRh7AAAAAElFTkSuQmCC</item> + <item item-id="111">iVBORw0KGgoAAAANSUhEUgAAALAAAAAqCAYAAAATStF7AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +BAdJREFUeF7tnGF2KiEMhe1WXIt78m/X4xbcgmtxC7Z4RBkk5IbADDDxnJ5Wh4Rw800m8F77 +8/h/HexlCoyqgAN4pNe/zl2F21s8XYmzQjB90QAsuDdgeosHkHCqIQawMp0GsFJApfk0ADuQ +/JfXJPysFWit/CrzuhvzaQB+bUa/EtcasNb+d0Ni4UKnAjiGeA241pijMLe7MJsOYA/xWmCt +Nc8uaCxY5JQAU+1EgT6siQHMStR0wJQAx5s5qYKpDSHlwwCWqlt3/HQAh0CVwBXbcD6463XT +Nb83SfF4PmlHkyQHTOqaFjDOnrs+mr5bxistHlMBjJwDU3d37q7nAOWubwnE6HMj2k5VgZGE +pfpjqmeGBOzs/2YgGowyBtJ/lMX4OJFF5dbk7anvoS0yFzJmNI17iRfRdpcVODxmi0GW3iiI +yL0AsVUcYYuGbtJQXXcLcHxWHApG/ZwCABV6K3hGnFei6a4Aju/+sPpSVYITk7s+IkBbxiwp +HotTCLS0b7m4uGpuHUuLeJA8SE9TEJ8lWqZuXs1cqSLCxbWowCNUk95irBlP7IsCJLXRpGwR +nxwkVOvE+a6pDRWjAVySvcCmZZIkAMfLoOKqGe8uAdYKqLVX8vpl3jKeNQFG5uJuEg7o2tov +euAW/VwuYGrTxC2yJTDc3CWnELXXiUBSWn1DO0RnLhbER4nmixYq1U+VOtU08OicKdEoSFp8 +zlUhdB3cOBRCSeVEgPKacfGlCh4HNOJTOqZaDywNvnZlki681ngOipJ15nxyOqPgk5ui1+8W +IvqUxoL4RsewAHMJygmBBiEZVxqPZA7J2NrxcI/xHDSULefTrxcdlxqPVGSJrujYN8C5SkG1 +BrmWQVsJ1r4xUMFathCpHFBwxY96yjbnk2sfuSdBqt3IMVGqcc4O/pe4XLAtk7qm7xKBa1fg +khj2bPOpwL9Llg/Ee58wfz1+7x8llL1W7N6A6S0erb6j2T+pdbCFwOXePytxMJ57n/KvEYl7 +rKUqdstHnQGsyabe9g2wB4367kGNr0s/14ac661zG5xwk8GNk8RoAEvUqj/2gFTed2P+qrxh +2/Csxv7POgXX48ocgq9ZhqQCU6AawJoM9GW7ADgFGdfLSq9rl98S4Pv9/rkZg7+15m/Q2+32 +Fb5VYG1GdfbwKYRumnrWLQE+nU6Py+XycCC7n8O2g1qBAVwvtyWeDGC3iX39YqavsA5iA7gE +p/VtDOAAYC//+XxeAHy9XsnMWAVeH9pwRgM4AbCD0kHsXsfj8fllLcS2oJL69xkWHRV3jJY6 +YZCeA7vxvp1w1VfSd4+m5+jxTlWBt0iGtRBbqP6Z0wBW6m8AKwVUmhvAWgHtT0spFdSZDwew +brlmPZsCfzKxVZrqy1x8AAAAAElFTkSuQmCC</item> + <item item-id="112">iVBORw0KGgoAAAANSUhEUgAAAF0AAAAvCAYAAACBm8YJAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AnhJREFUeF7tm4t2wyAIhrM335tvTbq0BEHQIWJDztlZMy/I5y9o0n39PK4tL18CO/S8fAls +vubS2hFZEoM/AVfoj8C554/j57yov/lj8LXoCv0vaRcewknwdX+OtYQ+gXtCT+gTCEwwGVbp +UeO8xbhCQsc7nAliJE1ajSskdG6XEwH+kko/gUr7c+wcrq/d83N2JPt4gmF9TvG1M8jlbBJB +PdQYKEVREwEPWbAf6gCGy7WqxX1RNqk6bLvVoGPFaaHDkHXCsISOVzAngKPeatBrapbKMGxL +6JyqyVVxJ+g4QY+GvlR40SRJTR1qyUO1t2wBWxIp7JeycQkv2pmPujo8xmXB6AW9ZdY9nItq +wxR65APJ6AmgQgcZFoj3AT1jY8NL7QDQYyjbvAmQ0DVLiFNHwpUJFNA1wOVuyxq1JXynsuJw +1HJSS6X3SO/ZphrT+7vNljUCxZYRHx5w41Hh507TFPbZyydPwlvp31f+m3D/yVBG+3aQ3gFD +yNJ976C0z0t6+1+l3Qv6CV/z+z/OUTnhbnlia1E4Djk98BP6/tV051ie0Ce8OUroQaFTCbcn +lI1oY5F/3PfpktJxuYWTVvCt3jmEgx79BGwhAnfox5YUvAyQnMCPJbh73O85eVyoag1h1AM+ +SiDQH87PKdC1y10KNdhB2C/lPC6XJhxOXM9nbnzLQWfVA/6l5lQ9BoUfXVtC51YaHstxr1Wd +dz0p4XJga4ocCb226oqxesPU2GOXpULNPWFAGpNmPFSdZcILl7Bw4qMSoeZvtURcg9+SSOHW +En5+CUKa5Sy/EtDmgeoEJtQ2Agm9jRdbmwodZFgY8WUjIx+yG4HALwYJRyBgajYFAAAAAElF +TkSuQmCC</item> + <item item-id="113">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</item> + <item item-id="114">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 +n7GqI7/Q3YEAAAAASUVORK5CYII=</item> + <item item-id="115">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</item> + <item item-id="116">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 +SUVORK5CYII=</item> + <item item-id="117">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</item> + <item item-id="118">iVBORw0KGgoAAAANSUhEUgAAALwAAAAvCAYAAABZu6BGAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +A1tJREFUeF7tm+FuwzAIhLf3f+itq5bJogYOB3e2uUj70cbBcHx2IOk+vx7HBw8qUEWBH+B5 +UIEqCnxUCZRxUoFnNUMZqEAlBZYG/lFW/vQXz7/r6H1XKWGM9Z4CSwP/21C/RNgugHvh8+pq +ChD4ahkvHi+BLw5AtfAJfLWMF4/3GOBXretX9asq90cAL5/krJLMVf1aRZ8sPyJP7o4AXnua +kyXoHTvc4e+o518b1Xd54C+YvVUsA5fj0Wf62jze/DI17Xhtp7feMUQT6aNx5ojoXXQL4JFU +9QDpLYL2BVZrt/dyS55HIZS2enP2xmjXIfFXHwPn5hShNODlTosC35ZJl21YVPFm2Jqzt0Oh +85ySu6w4EN24w/+qbe24M4D3dnMkeVmgnGIH0YzAG8DLZhgR1LrGK3W8RXAKmLPiQPJzBPBI +Q4qMkQ2yLGsiDVKkaW3tRuaYBc6OdhHYn/nsNWZa3bujEP/tM5qId/gZ8cXqidqeZMYC9fqx +O/O/AC+Fj4j0jqTtNscq+kXARBppGVdWnCNzR5gwS5qsICIO7TC2V65oiYqANjt2JJ/XGK+f +mAW87IGQzxHdVOARcZCJsuwgc3GMrQCSCwl8+9laBJptrTyxPPUWExKHZr8L/B2D6kTNfy+1 +OyQhHVNAu8tEQLLKVw90D0rZG7Z1txexZ/sOny/A3zHmBRI5b5UNlc5FNPPGWrnVILPgk3nw +FhvK1tuARx3yhO2dH9mRRuapcs2Inh7wiM2REuWqw1G+3gJ8pAarAtVpcaLAtY1iBnxW7a9t +jlpJ1GtiI3n6K2msMkGu0N6t7PrOqgsjjnFsrgJa34RsdL1rtXwj+UfvNBJ6dE6ztIrIejna +W7GR3SMyJ8dSgUwFwj8tGK3hMp2mLSowqkB54LVb/aigvG5tBULAn1rSsBxbG9JM72Dg24Yh +0rRmOjvLFoGfpex6dmHg13M9zyMCn6fl6pYI/CNDBH51TPP8I/AEPo+mDSwReAK/AaZ5LhJ4 +Ap9H0waWygMvn8Of/DRqAx6nu1ge+J7Cp75vmE7TBhMQeCVJ/AnFBvQOuEjgCfwANvteQuA7 +uWNJsy/QnucEXijEptVDZu/zBH7v/NH7oAIEPigYh++tAIHfO3/0PqgAgQ8KxuF7K/ANEfwT +BG3HLvMAAAAASUVORK5CYII=</item> + <item item-id="119">iVBORw0KGgoAAAANSUhEUgAAANwAAAAvCAYAAACIXKQ2AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +BBBJREFUeF7tnItu5CAMRbv//9HbmVHT9RKba/MKjztSVXUSML72AUOi/vn7+nzxQwWowBgF +3sDxQwWowBgFvsaYoRUqQAU+1SRloAJUYJwCSwD3Kq7f+8zPT+6jXc+1Rf1q11GbcaGjpRUV +mB64FCILOg1I1BYB/HOgdIurp92KycAx91dgG+A0OHLAeVZMAtc/AU+zcCxwV6DRamWVqacl +Cv1to8DxwFmrWA5IBGmb0LCXHRUgcO+jWnEYg/Z9q5WZnBzmwpbAJcCl4fGUlN794OjQzzqu +0Tr0tBc9tT4eOLQCeIBDZWnPgKO+kX+oPa/bCniqodsEvoKg1iySloLWo4H0+/CsJJ4D5h5L +SC1TG95nejlfIyuW7Mdql9OFoMbJ8Gg2/QoXd/uZFp6V0LtXzE0cHu8sO+j73Pg8dk+/h8AN +zAALuHSlsU4/tWS/vkt/I7cQWHIMFtzIBq/fFSBwA7Oi9Qon94U9gEOrmSd5Bso7vSmvXiwp +G4WyB3DpYYw7qMZjDrTyIQgbSbVdN964fOK5nfcPOKQddKTfee65AJNlnlzdtPLPcjctZT0l +r7T/gIxLmoxOUv8BpwUpQu+Sim0+6Jnih8aiTUraJIT2oLUhRZOTZt87Gd6ASweLRKp1ju37 +KjBL/FBCpuO09q3o+1o1tXFaYyuxlS0pZwlWiWM7t7EqES0xUKKP1CmSTwislhCgRaalLRO4 +iDgoaC37QrZ4fV4FvHngWe28EFjlYU4l1LfXD82GClxNh8gRbXaeN0U4ssihDMobdD13aFMD +gWzrHYP0G9mOZMkNOM+AIgZq7s2VTrz2799O9NSiJn6oVEOTszycuGBMQZC+o/68uY0A8/YD +V7iajjyBsRLD05b3zKVASSwj+YX2cLkVSE10x//ESQH3/h2JzO8KZ4kRESlimPeep0Akl7zA +efqcsqTMlSWytpZCePdjHlHOS7+zPLZKPyufrNJRrjqevNLuybXLjfO6VhO50Jsm2qwTnT1q +Bsu2VGB1BcLAsfRcPeQc/5MKhIHTTouszeWTjrWw7T0Ba2GLfZyhQBFwErrdS0rPPuGMVKGX +LRRwA5fO9nID2WIz2cKZHn0QuB6qntunG7hTJSJwp0a+j98EDuhK4Pok3qm9ErgC4AjhqbjU ++03ggsDtvF+tTyf2gBQgcEHgco9FkNi8TgUIXCYH0OtIV1PrBDd9ZJKujr1fI2J6z6cAgSuI +ief9vNzzSQ1EOQyWrQVBWaQJgSsIlAWcXLEiwMkyVXtftWCIbDKpAgSuIDCtVzgCVxCERZsQ +uILA9QAuPYzho4eCwCzQhMAFg6QddLQ6NJHlJPdxwcAscjuBWyRQHOYeChC4PeJILxZRgMAt +EigOcw8FCNwecaQXiyjwDYllPQE5B/IpAAAAAElFTkSuQmCC</item> + <item item-id="120">iVBORw0KGgoAAAANSUhEUgAAADAAAAAWCAYAAACG9x+sAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +ANBJREFUWEftlt0OgCAIhe39H7rUpSPEHwTnqNy6aUh8h4N2nH45yysAWF7OcvHRPa8C8KOw +lSd8Pz21QnBMrri3cTUZFo8Sk4p5SL6zAyMAWMQoOnwJk0g6MiMEFyDFkwAzBVAWg37t+ZsD +AMUtALSK584MByDlrlpIC2JVB7oA9+8FV0RRvLgDxfkKzmRqoFuenu1gLWceWFTT8E3cAhDJ +rrB56OqFCkB7zSqtUHdO8S0APNwmOkANdwKR3NZaNhqykNbHVuT5AVaoyslpvgMXSCyNOZ/b +IYIAAAAASUVORK5CYII=</item> + <item item-id="121">iVBORw0KGgoAAAANSUhEUgAAACAAAAARCAYAAAC8XK78AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AKdJREFUSEvNVAEKgCAQs/8/ulTymGtXCsolBCLXbW47jzOvFLkKgciVIsGr+r8jkONQMlG/ +Ox/GsZ2tJN0pwABIZCUo9jIC3u123HqKQFcMtrBNrJZSD221fQNQN8U8KABFzssNZ6vVTVmg +MsKA1pjC7Na9KfA1BWpSFJCHUVXxZFQ/eTbxhGCdt39YgICuX/A+jCjH4DK4u+Z7tO//nuJR +5qvqwhW4APqVEFQb1zbjAAAAAElFTkSuQmCC</item> + <item item-id="122">iVBORw0KGgoAAAANSUhEUgAAAHAAAAA/CAYAAAA47kzyAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AwJJREFUeF7tm4tuwyAMRbf//+itjZSKEhu/Q0hupKlSC8bcg8Gm6+/f6/nBs64Cb4B41lXg +Z13X4fm2e0KGtRUAwAJ+rwP1nVdsf9VP/QjVM7iY/R5aNUQALF4AAFgscLV5AKxWuNg+ABYL +XGm+Gh7KiEJ6Z8ADwCKALbxqkMhCGYhe4dsacFQLUrVi31ezvgCQUOm0Ipwo9K0LBwCTI1AT +NW2b6HYLgAqA1REZsQ+AAkDrlmaNwL29dxwAHAD0ispB5OxJETjyAwAnR6B0BopwvSF/936S +sBnzpyJL+95n681w5G42+hpNqu2omk7SxFIHYguV1DR8Tm1p0jZnME82BcCogk3/XUzuNXGo +jykATFQVABPFnGGKS26ySw7utqafM8oIwyqgkpt3d08Sox1Wsv0FkMq2KlcWNQlLdqYV4c7t +DgAPIXrCv8Zpxjx7Ia0CfbiFzhTtjEJ6FUgjP1mAmfC8W3N1fXVbgJnw+kNeOpQ12+kdhM+a +wyECs+FFHJUiUOOrNfq59ld8fwsObb2RAaIXYbi3N8kTBUqCG/F3pb4fgNxq1qxyacKeKNBs +pRm+Sb5f/fMvgCOhqSKWah+dsKUOBEDj7wN3wbgU/2xBzx4vujgr+puu0kbnzgwxZ4xZASFi +0wxwLwu4a7CIM9a+TwLIlV8ugC1Ebju1wvC0fwrAfp5fmmuF45KYtlDX2spox63IDNtXt+EC +ePVJPck/AFycNgAuDPBwHi48l8e5Tl4pPk6FRSfMXp4sOp9ytyuyXG/ZM7qyNNWB5apdZIBR +3eV1cXSL5bW5lXCRzk/p642cXp8sO61dAFSswizh+3Mswy4ACgAzRN6HoL7NUayfYRMADACk +kosR8IpzEAAHADOjb78zbl+j0YckRgkvC2TFNzeIQALiqO7yRg33bQ5Xb2rrUAD0EknsR52N +2vMSABNBeE312aklWwVAr+qJ/QAwUcwZptiLasUvwxCBM4g1Y1LJzV5qaM5BAJwMMDo8AEYV +nNwfACcDiA4PgFEFJ/f/B+na8rYV4jApAAAAAElFTkSuQmCC</item> + <item item-id="123">iVBORw0KGgoAAAANSUhEUgAAAIMAAAAeCAYAAAAPZa37AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AlRJREFUaEPtW9GSwyAIvPv/j767dCY9QwV2EbWpZqZPJYjLsqCdfv/8PV/72QgcCBxkWO1Z +dNuPNFt7X44MKxPhLHoNg6XIsInw3wNqWCxDhrsQ4Yjz/PRu3xKTTYbeiBP+X5LTeaRbkgx3 +UQXJmxFxl2ssoQwjQCUEADYdEfcmA5yOuYabDMn4jwA0OWT3PiB7vROjj28TdyTD6Jg3GbLL +K8nfpYd3Pk3IS6iLMpRn3JHn3TIoecaWMbGYI1WG2DDrRv3V8NfWRfOD2FWVoXorNYid1lVp +FFzvLv78vsV/7TiY6a9GBuY+AokFahOII6ZiUNtMqUT2gNigsSMEZHy1kEGqrKUyj7g9g4zA +GfmTLSNjfc9HTzKgCfFiLL9nlAEhp6kMmeC0zCEZcSA+EJtIsrL9aq0UWceyUcmAOGaAidp6 +FaXFyVYNWjmMunmxRzCxWieSM5oMiFN2IxFl8GYGBmxkT4gNs+9npXUavrMJ/6IMaKUxoJTT +uiQFM6vUYkMTiNghNsy+PTIzvloGSK2tSJ9VMlhVXFZjLbFMtVpEkH40EqEJ9OxK/61JkuTX +ikEOgxHstLhLVUL9vpABAaImf70lkVGQDFsEh6hNLTlowqJreu9dVMwz1iTFOuqwPiP2XsXP +js+Sd1lAzF4iWFnvbDJkIwr600hwSzLctU2cvRvMWTczbbCcRQa5LvwT9ogBEs1CZOibBXg5 +0UsMawMnikGGXZgMGYvP9jGbELP3781RsDK800ZaYtmE0P9VtRwZ3mV+aCF0y7tWMSxJhhYw +P/ndXxCMyD43gqRpAAAAAElFTkSuQmCC</item> + <item item-id="124">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</item> + <item item-id="125">iVBORw0KGgoAAAANSUhEUgAAAKEAAAA/CAYAAACIPaiFAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +A8BJREFUeF7tm4FywyAIhrv3f+itzdbNGRBQVNS/d7vdZQnizyeCzT4+n58HPlBgpgIvCPGB +AjMVeMwcHGNDgWsnhgxQYLYCW0H4LGte9e31g886CmwTrRw8gAgIpysACKeHQO3ANpkwnzEg +VDMw/UZAOD0EcGBLCJEF1wJ7OwgB4FoAbndOmAIIGNeBMVwmrIUnPSMsnRVSZ4n5s+uEbw9P +Q0E46qCZAr0W/j0wmDuLUBBe9cGgbzuwdc8FLx09NIS9M2Nv+3HCHNuTsBDOyIixQ7WvdyEh +9AaQsydlQm8/9sWobWYhIRxRG0o1oQRom+x7P219mykshD1B1HbHyIT2xVLzNlMoCPMVJJ39 +WVfcG+w8y3HnhIDQDmHNiyShICxNmdoee2+ZgBAQ/lPgDQT3u12uuwVA2K6qRsOlMmFaJ+Yw +tssFCL011AB4xdR74F72uG5WO9Eav3rarvFnpWcs2i0BIdWwcE2GV6Bqmh6vsVe3Ix1/3ZqX +9wVKdK5rXF2kSP5LGYNbDNbrrXPmjrWkkwZpfrftmBuodQJ4nlZA6u7zeHB1sHS9VX/uZCK1 +q4GN8+O2HVtTaesET3/eEjwJNg5aD40l25Z5sNtxTnWLUY9Jn2JDq7MmK0qgpKXXDQThFTrJ +tnYeVFzZxqTF6CkAUYHM62hJR+nvaQMmgSOBwm2fWh9K26/Ghno7Lk26tJJaA0IFL+o1z0Vm +CR5VKlHgpbqVfJVqUgt0lnmI27FUE1oc9wzWCra4RSOBoJ2bVBNaGwVLLKUs6wYhZUh7TSsk +7vuvgCV4Wgg1NqVk47n1SzH/rQmpFJ6vbMt2LA2Mv3//Pw2VjVLYSvfkz2ozmzWxWHyoiWvV +NyaalVbjDJ45UwFAeGbcQ80aEArh0HaaoaK6mDOAsBAwqSNcLNZh3TVDeHJmQC3ch2MzhH3c +WMMqIOwTJ0Bo0BUQGsQy3AoIlWIBQKVQFbcBQoVoAFAhUsMtgFBxRINvihoIUzwaDsIe3Xdt +JqNeSFBoiluMCoSCsMe5nPb7VKNuuN1RgVAQ5vOqzWC97DjqDlOJAsdBiMwYj/+wEHplwZfk +3Ht48cJxpkdLQkg1DCVokf1iwx0SQs8siEwYG8ArPtFcTAH0grGHzWi6rexPKAh7nMvl547S +GD3OKVcGZITvoSAcMeF0DKpWRP04OgoBt+OREuRdM7roker/jXV8JqQaF69adE5I1xsVEP7E +DM3LPHiPhZBqWN5ZEXXhWCCPhXCszBitpAAgBB/TFQCE00MABwAhGJiuwBeWon6/nQH/YQAA +AABJRU5ErkJggg==</item> + <item item-id="126">iVBORw0KGgoAAAANSUhEUgAAALUAAAAeCAYAAABqiF+EAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AvlJREFUeF7tWwFywzAI2/7/6K3dLa3rGUtyDPYacrfrXYMRCBnTtPv8ul0feSUD78TAXdSR +1427SLitsK6ce2QhQhWWRf05FSPre0msMIazmE99JRe+ey1E1P+liPc4jz9f2rNjq/wqtUlR +/7JbbzzvjejtXxXNzvYqV+6iVgPahdyIuCMwduHzTBzq6ZmiNtiOEFwExhkx7baW5StFnaLe +TbvdeBhhu4qaCWBHRiPjjsTakWs1JoavFHXFKkOaWoiefTTezNhX+GL4SlEXlSkJY8ibUdQo +nBmxrvbBcvUQdes5YPke67BMnFnD2Chkjvqrc+35YZ+ZMnaj8VqcKP5atvWTBiYHpT6HbQ+7 +bi51TAjvpVNbQMjJKMFqsCiO2f5aeDVHSPxMzMiGva/k37JFuSkbBo1cnlh/xo+ZRzBDAmPD +FvVuN9tfjY2KUXYiJhbGZnb+ByaqNZurEp/VqWdiNWdqZcejHYkS9izqrDx6IxWK/+x9xB/a +dL3TphZ3a/RgxsmREx6JGPHW1d3o6MCQzQTG2DBYdQeY7ZftMMzIwgjlOHUOoZWvZxpJqztb +YkbCs/JguEe+GR+mdq0i9Jxa91CgasFHCuvdnWfneKZ4Kp9W7L2c6k2FNhSbD+KR9dPkoHd8 +WccKC8jYMTbZqZ+/HkR8oWbU6vxIYEdzQXVQGgrCRHnS44cl4pG5TSECkaXcbx2vynpki4qh +cnWmeGqntmJDOTExqrzPwITjR7mDy/nReh8VnxF1yzfj10ym+j10qyvVc6DSXVq8tOZKJS9G +MCwnFq6FUQux5oLlhm2GDH8sJt2pFfI8bFmfI3YtsmYQOBJLWdwz63Ntm4Ghr8mV7qLYehbp +iMN69cTunSwrcN8dM0W98B9hd9nw7yZyd1Ezs3UEqdYHmVXCWoUbwfVqDFnUyoegXWbHOuZy +BFk1V6eo/aQvi3o0lCzik7nkYlRF3LowUe8yhnC0+FmloP24fUwG/hCvCFcu6pVzj9RZaKeO +TCyxrsvANwhqlaYfhSKCAAAAAElFTkSuQmCC</item> + </binaryContent> +</worksheet> \ No newline at end of file diff --git "a/Docs/\320\240\320\265\321\210\320\265\320\275\320\270\320\265 \320\277\321\200\320\276\321\201\321\202\320\265\320\271\321\210\320\265\320\271 \321\206\320\265\320\277\320\270.xmcd" "b/Docs/\320\240\320\265\321\210\320\265\320\275\320\270\320\265 \320\277\321\200\320\276\321\201\321\202\320\265\320\271\321\210\320\265\320\271 \321\206\320\265\320\277\320\270.xmcd" new file mode 100644 index 0000000..3c43e3c --- /dev/null +++ "b/Docs/\320\240\320\265\321\210\320\265\320\275\320\270\320\265 \320\277\321\200\320\276\321\201\321\202\320\265\320\271\321\210\320\265\320\271 \321\206\320\265\320\277\320\270.xmcd" @@ -0,0 +1,946 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<?validation-md5-digest f4a3c49414dc479d0ea7bd35bd0f08e1?> +<worksheet version="3.0.3" xmlns="http://schemas.mathsoft.com/worksheet30" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ws="http://schemas.mathsoft.com/worksheet30" xmlns:ml="http://schemas.mathsoft.com/math30" xmlns:u="http://schemas.mathsoft.com/units10" xmlns:p="http://schemas.mathsoft.com/provenance10" xmlns:prd="http://schemas.mathsoft.com/point-release-data"> + <pointReleaseData/> + <metadata> + <generator>Mathcad Professional 14.0</generator> + <userData> + <title/> + <description/> + <author>РЇ</author> + <company>Parametric Technology Corporation</company> + <keywords/> + <revisedBy>РЇ</revisedBy> + </userData> + <identityInfo> + <revision>4</revision> + <documentID>AADA1947-375F-452A-959C-AB15170C0246</documentID> + <versionID>EAEFC2CF-7C28-4C42-9736-B15C699B09C0</versionID> + <parentVersionID>00000000-0000-0000-0000-000000000000</parentVersionID> + <branchID>00000000-0000-0000-0000-000000000000</branchID> + </identityInfo> + </metadata> + <settings> + <presentation> + <textRendering> + <textStyles> + <textStyle name="Normal"> + <blockAttr margin-left="0" margin-right="0" text-indent="inherit" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Heading 1"> + <blockAttr margin-left="0" margin-right="0" text-indent="inherit" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="14" font-weight="bold" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Heading 2"> + <blockAttr margin-left="0" margin-right="0" text-indent="inherit" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="12" font-weight="bold" font-style="italic" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Heading 3"> + <blockAttr margin-left="0" margin-right="0" text-indent="inherit" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="12" font-weight="normal" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Paragraph"> + <blockAttr margin-left="0" margin-right="0" text-indent="21" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="List"> + <blockAttr margin-left="14.25" margin-right="0" text-indent="-14.25" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Indent"> + <blockAttr margin-left="108" margin-right="0" text-indent="inherit" text-align="left" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Arial" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Title"> + <blockAttr margin-left="0" margin-right="0" text-indent="inherit" text-align="center" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Times New Roman" font-charset="0" font-size="24" font-weight="bold" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + <textStyle name="Subtitle" base-style="Title"> + <blockAttr margin-left="0" margin-right="0" text-indent="inherit" text-align="center" list-style-type="inherit" tabs="inherit"/> + <inlineAttr font-family="Times New Roman" font-charset="0" font-size="18" font-weight="normal" font-style="normal" underline="false" line-through="false" vertical-align="baseline"/> + </textStyle> + </textStyles> + </textRendering> + <mathRendering equation-color="#000"> + <operators multiplication="narrow-dot" derivative="derivative" literal-subscript="large" definition="colon-equal" global-definition="triple-equal" local-definition="left-arrow" equality="bold-equal" symbolic-evaluation="right-arrow"/> + <mathStyles> + <mathStyle name="Variables" font-family="Times New Roman" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="Constants" font-family="Times New Roman" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="User 1" font-family="Arial" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="User 2" font-family="Courier New" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="User 3" font-family="Arial" font-charset="0" font-size="10" font-weight="bold" font-style="normal" underline="false"/> + <mathStyle name="User 4" font-family="Times New Roman" font-charset="0" font-size="10" font-weight="normal" font-style="italic" underline="false"/> + <mathStyle name="User 5" font-family="Times New Roman" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="User 6" font-family="Arial" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="User 7" font-family="Times New Roman" font-charset="0" font-size="10" font-weight="normal" font-style="normal" underline="false"/> + <mathStyle name="Math Text Font" font-family="Times New Roman" font-charset="0" font-size="14" font-weight="normal" font-style="normal" underline="false"/> + </mathStyles> + <dimensionNames mass="mass" length="length" time="time" current="current" thermodynamic-temperature="temperature" luminous-intensity="luminosity" amount-of-substance="substance" display="false"/> + <symbolics derivation-steps-style="vertical-insert" show-comments="false" evaluate-in-place="false"/> + <results numeric-only="true"> + <general precision="3" show-trailing-zeros="false" radix="dec" complex-threshold="10" zero-threshold="15" imaginary-value="i" exponential-threshold="3"/> + <matrix display-style="auto" expand-nested-arrays="false"/> + <unit format-units="true" simplify-units="true" fractional-unit-exponent="false"/> + </results> + </mathRendering> + <pageModel show-page-frame="false" show-header-frame="false" show-footer-frame="false" header-footer-start-page="1" paper-code="9" orientation="portrait" print-single-page-width="false" page-width="450" page-height="600"> + <margins left="86.4" right="86.4" top="86.4" bottom="86.4"/> + <header use-full-page-width="false"/> + <footer use-full-page-width="false"/> + </pageModel> + <colorModel background-color="#fff" default-highlight-color="#ffff80"/> + <language math="ru" UI="ru"/> + </presentation> + <calculation> + <builtInVariables array-origin="0" convergence-tolerance="0.001" constraint-tolerance="0.001" random-seed="1" prn-precision="4" prn-col-width="8"/> + <calculationBehavior automatic-recalculation="true" matrix-strict-singularity-check="true" optimize-expressions="false" exact-boolean="true" strings-use-origin="false" zero-over-zero="0"> + <compatibility multiple-assignment="MC12" local-assignment="MC12"/> + </calculationBehavior> + <units> + <currentUnitSystem name="si" customized="false"/> + </units> + </calculation> + <editor view-annotations="false" view-regions="false"> + <ruler is-visible="false" ruler-unit="cm"/> + <plotTemplate> + <xy item-idref="1"/> + </plotTemplate> + <grid granularity-x="6" granularity-y="6"/> + </editor> + <fileFormat image-type="image/png" image-quality="75" save-numeric-results="true" exclude-large-results="false" save-text-images="false" screen-dpi="96"/> + <miscellaneous> + <handbook handbook-region-tag-ub="109" can-delete-original-handbook-regions="true" can-delete-user-regions="true" can-print="true" can-copy="true" can-save="true" file-permission-mask="4294967295"/> + </miscellaneous> + </settings> + <regions> + <region region-id="8" left="6" top="2.25" width="112.5" height="12" align-x="19.5" align-y="12" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <text use-page-width="false" push-down="false" lock-width="false"> + <p style="Normal" margin-left="inherit" margin-right="inherit" text-indent="inherit" text-align="inherit" list-style-type="inherit" tabs="inherit">Расчет простейшей цепи</p> + </text> + </region> + <region region-id="60" left="210" top="1.5" width="35.25" height="14.25" align-x="220.5" align-y="12" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve">j</ml:id> + <ml:apply> + <ml:sqrt/> + <ml:real>-1</ml:real> + </ml:apply> + </ml:define> + </math> + <rendering item-idref="2"/> + </region> + <region region-id="9" left="6" top="15" width="25.5" height="12.75" align-x="18.75" align-y="24" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve">E</ml:id> + <ml:real>1</ml:real> + </ml:define> + </math> + <rendering item-idref="3"/> + </region> + <region region-id="10" left="6" top="27" width="35.25" height="12.75" align-x="19.5" align-y="36" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve">R</ml:id> + <ml:real>200</ml:real> + </ml:define> + </math> + <rendering item-idref="4"/> + </region> + <region region-id="11" left="6" top="45" width="40.5" height="12.75" align-x="18" align-y="54" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve">L</ml:id> + <ml:real>0.001</ml:real> + </ml:define> + </math> + <rendering item-idref="5"/> + </region> + <region region-id="13" left="6" top="63" width="42" height="18.75" align-x="18.75" align-y="78" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve">C</ml:id> + <ml:apply> + <ml:pow/> + <ml:real>10</ml:real> + <ml:real>-5</ml:real> + </ml:apply> + </ml:define> + </math> + <rendering item-idref="6"/> + </region> + <region region-id="96" left="6" top="87" width="42" height="12.75" align-x="33.75" align-y="96" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:function> + <ml:id xml:space="preserve">A</ml:id> + <ml:boundVars> + <ml:id xml:space="preserve">p</ml:id> + </ml:boundVars> + </ml:function> + <ml:id xml:space="preserve">E</ml:id> + </ml:define> + </math> + <rendering item-idref="7"/> + </region> + <region region-id="65" left="6" top="104.25" width="225.75" height="27.75" align-x="32.25" align-y="120" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:function> + <ml:id xml:space="preserve">B</ml:id> + <ml:boundVars> + <ml:id xml:space="preserve">p</ml:id> + </ml:boundVars> + </ml:function> + <ml:symEval style="default" hide-keywords="false" hide-lhs="false"> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">L</ml:id> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve">p</ml:id> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">R</ml:id> + <ml:id xml:space="preserve">p</ml:id> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:div/> + <ml:real>1</ml:real> + <ml:id xml:space="preserve">C</ml:id> + </ml:apply> + </ml:apply> + <ml:symResult> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:real>200</ml:real> + <ml:id xml:space="preserve">p</ml:id> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:real>0.001</ml:real> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve">p</ml:id> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:real>100000</ml:real> + </ml:apply> + </ml:symResult> + </ml:symEval> + </ml:define> + </math> + <rendering item-idref="8"/> + </region> + <region region-id="90" left="6" top="134.25" width="390" height="74.25" align-x="18.75" align-y="174" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:id xml:space="preserve">p</ml:id> + <ml:eval placeholderMultiplicationStyle="default"> + <ml:symEval style="default" hide-keywords="false" hide-lhs="false"> + <ml:matrix rows="2" cols="1"> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:minus/> + <ml:apply> + <ml:sqrt/> + <ml:apply> + <ml:minus/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve">C</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve">R</ml:id> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:real>4</ml:real> + <ml:id xml:space="preserve">C</ml:id> + </ml:apply> + <ml:id xml:space="preserve">L</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">C</ml:id> + <ml:id xml:space="preserve">R</ml:id> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:real>2</ml:real> + <ml:id xml:space="preserve">C</ml:id> + </ml:apply> + <ml:id xml:space="preserve">L</ml:id> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:neg/> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:sqrt/> + <ml:apply> + <ml:minus/> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve">C</ml:id> + <ml:real>2</ml:real> + </ml:apply> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve">R</ml:id> + <ml:real>2</ml:real> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:real>4</ml:real> + <ml:id xml:space="preserve">C</ml:id> + </ml:apply> + <ml:id xml:space="preserve">L</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:id xml:space="preserve">C</ml:id> + <ml:id xml:space="preserve">R</ml:id> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:mult/> + <ml:real>2</ml:real> + <ml:id xml:space="preserve">C</ml:id> + </ml:apply> + <ml:id xml:space="preserve">L</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:matrix> + <ml:symResult> + <ml:matrix rows="2" cols="1"> + <ml:real>-501.25628933800452655</ml:real> + <ml:real>-199498.74371066199547</ml:real> + </ml:matrix> + </ml:symResult> + </ml:symEval> + <result xmlns="http://schemas.mathsoft.com/math30"> + <ml:matrix rows="2" cols="1"> + <ml:apply> + <ml:neg/> + <ml:real>501.25628933800452655</ml:real> + </ml:apply> + <ml:apply> + <ml:neg/> + <ml:real>199498.74371066199547</ml:real> + </ml:apply> + </ml:matrix> + </result> + </ml:eval> + </ml:define> + </math> + <rendering item-idref="9"/> + </region> + <region region-id="107" left="360" top="213" width="48.75" height="18" align-x="390.75" align-y="222" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math error="Эта переменная неопределена." optimize="false" disable-calc="false"> + <ml:eval placeholderMultiplicationStyle="default" xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:apply> + <ml:id xml:space="preserve">B'</ml:id> + <ml:apply> + <ml:indexer/> + <ml:id xml:space="preserve">p</ml:id> + <ml:real>1</ml:real> + </ml:apply> + </ml:apply> + </ml:eval> + </math> + <rendering item-idref="10"/> + </region> + <region region-id="91" left="6" top="223.5" width="139.5" height="29.25" align-x="33.75" align-y="240" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:provenance expr-id="1" xmlns:ml="http://schemas.mathsoft.com/math30"> + <originRef doc-id="5C5ACDFF-A469-4F2D-A20A-0660C7FC3907" version-id="4F0D7176-0DB9-4A27-985A-E3F09C85BDE5" branch-id="00000000-0000-0000-0000-000000000000" revision-num="309602812" is-modified="true" region-id="0" href="D:\Учеба\РўРћР­\РўРћР­\3 РєСѓСЂСЃ\РљСѓСЂСЃРѕРІРёРє\РљСѓСЂСЃРѕРІРёРє_1.xmcd" xmlns="http://schemas.mathsoft.com/provenance10"> + <hash/> + </originRef> + <parentRef doc-id="5C5ACDFF-A469-4F2D-A20A-0660C7FC3907" version-id="4F0D7176-0DB9-4A27-985A-E3F09C85BDE5" branch-id="00000000-0000-0000-0000-000000000000" revision-num="309596612" is-modified="true" region-id="0" href="D:\Учеба\РўРћР­\РўРћР­\3 РєСѓСЂСЃ\РљСѓСЂСЃРѕРІРёРє\РљСѓСЂСЃРѕРІРёРє_1.xmcd" xmlns="http://schemas.mathsoft.com/provenance10"> + <hash/> + </parentRef> + <comment xmlns="http://schemas.mathsoft.com/provenance10"/> + <originComment xmlns="http://schemas.mathsoft.com/provenance10"/> + <contentHash xmlns="http://schemas.mathsoft.com/provenance10">e1ddc1248593d50fd724d11b28c1ccdf</contentHash> + <ml:define> + <ml:function> + <ml:id xml:space="preserve">B'</ml:id> + <ml:boundVars> + <ml:id xml:space="preserve">p</ml:id> + </ml:boundVars> + </ml:function> + <ml:symEval style="default" hide-keywords="false" hide-lhs="false"> + <ml:apply> + <ml:derivative/> + <ml:lambda> + <ml:boundVars> + <ml:id xml:space="preserve">p</ml:id> + </ml:boundVars> + <ml:apply> + <ml:id xml:space="preserve">B</ml:id> + <ml:id xml:space="preserve">p</ml:id> + </ml:apply> + </ml:lambda> + </ml:apply> + <ml:symResult> + <ml:apply> + <ml:plus/> + <ml:apply> + <ml:mult/> + <ml:real>0.002</ml:real> + <ml:id xml:space="preserve">p</ml:id> + </ml:apply> + <ml:real>200</ml:real> + </ml:apply> + </ml:symResult> + </ml:symEval> + </ml:define> + </ml:provenance> + </math> + <rendering item-idref="11"> + <element-image-map> + <box left="1.5" top="0.75" width="138" height="27.75" expr-idref="1" xmlns="http://schemas.mathsoft.com/worksheet30"/> + </element-image-map> + </rendering> + </region> + <region region-id="109" left="6" top="289.5" width="107.25" height="43.5" align-x="25.5" align-y="312" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <math optimize="false" disable-calc="false"> + <ml:define xmlns:ml="http://schemas.mathsoft.com/math30"> + <ml:function> + <ml:id xml:space="preserve">i</ml:id> + <ml:boundVars> + <ml:id xml:space="preserve">t</ml:id> + </ml:boundVars> + </ml:function> + <ml:apply> + <ml:summation/> + <ml:lambda> + <ml:boundVars> + <ml:id xml:space="preserve">i</ml:id> + </ml:boundVars> + <ml:parens> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:div/> + <ml:apply> + <ml:id xml:space="preserve">A</ml:id> + <ml:apply> + <ml:indexer/> + <ml:id xml:space="preserve">p</ml:id> + <ml:id xml:space="preserve">i</ml:id> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:id xml:space="preserve">B'</ml:id> + <ml:apply> + <ml:indexer/> + <ml:id xml:space="preserve">p</ml:id> + <ml:id xml:space="preserve">i</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + <ml:apply> + <ml:pow/> + <ml:id xml:space="preserve">e</ml:id> + <ml:apply> + <ml:mult/> + <ml:apply> + <ml:indexer/> + <ml:id xml:space="preserve">p</ml:id> + <ml:id xml:space="preserve">i</ml:id> + </ml:apply> + <ml:id xml:space="preserve">t</ml:id> + </ml:apply> + </ml:apply> + </ml:apply> + </ml:parens> + </ml:lambda> + <ml:bounds> + <ml:real>0</ml:real> + <ml:real>1</ml:real> + </ml:bounds> + </ml:apply> + </ml:define> + </math> + <rendering item-idref="12"/> + </region> + <region region-id="112" left="6" top="606" width="347.25" height="168.75" align-x="6" align-y="606" show-border="false" show-highlight="false" is-protected="true" z-order="0" background-color="inherit" tag=""> + <plot disable-calc="false" item-idref="13"/> + <rendering item-idref="14"/> + </region> + </regions> + <binaryContent> + <item item-id="1" content-encoding="gzip">H4sIAAAAAAAA/4yQwW7CMAyG7aZbS9etu3AhSOUZeIIdENph2iT2ACiUAkVUTF2ROPLm3W8n +u+w0R3b+Ot/vRsmJiJGfyEy1QS228/W+c1+H9e7cta5PSGKMHGl74XqnLZog07b62Bzrqvet +ld8omqGYMF+8hWr5yty1+V7q6FjZKfKNA+tjwCKe/r/7OzzpO1fV84XRIxvAkp+JLQ+imG0E +U8kRWwNryYZtPEgnBkMDxB2Y2wuO7oURV6IMRCqMwCOZI/YMjNofwKg9B6P2R/0XxJMyEIUw +AvvrFu+Xtu6ayp38g6R67VfklhosE14uC6/5J3IpPwAAAP//AwARvY6sxgEAAA==</item> + <item item-id="2">iVBORw0KGgoAAAANSUhEUgAAAC8AAAATCAYAAAAAn1R6AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AOxJREFUSEvVlusNwyAMhOk8zMM+zMM87ONgyFuh8hmagqX8iITD58vZ8KEUZtZg+FnDzAqe +HTMCfHItWxd/RoHXcAyjfCN8IGcs+aj5jD6H7YJE9JaMCzkFy0R2Ea5F4DM498aM8KxHRXmB +baInmypfCxdq+30ZonwFnsF5VEk9H8nbymgDK+sAn/9HUlUKj4u+zfFz5hVcJsizbSB42Ub3 +Eu8qo6rXPQ/B48pvGWfgd+E7NGwTfHDHFSL11jHnX1I+Hy7rwaRR/tIz+0uGd1TOrt/GU/Nq +djRlypSxB045zX57Tqvqf70e9IBfAKQxLIwkDVoAAAAAAElFTkSuQmCC</item> + <item item-id="3">iVBORw0KGgoAAAANSUhEUgAAACIAAAARCAYAAAC4qX7BAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AKhJREFUSEvtlNsNwCAIRek8zOM+zNN52IdWa+KjL4wl4aMm/alGD4eri+wDPIwI4mGAB4jU +FV8gTIIAMSvdF2Q1JGVCgXCcUBlhIQTJ/9MkUxBiG5IEEQvXgNgglF1VRl5t5HbWBkfBH0FK +TlDZlqOl53wV7XeA3xgZLf9ivQpEf46xkXxtBGdC8FLN2cjtO9Je52bf2bCuoeRqL9bZy6oP +hNnK30ivdgPx1dUaZLMZGwAAAABJRU5ErkJggg==</item> + <item item-id="4">iVBORw0KGgoAAAANSUhEUgAAAC8AAAARCAYAAABNV/VxAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AQ1JREFUSEvdltENwyAMRNN5mMf7MA/zsI9rO+AaAhVpihSC1B+rMo+7s9sX0tlWPQy/6tlW +BZfEPAA+oncbZ7/8QJj4NnunQx/NVdGjE5bvdaP83kx5A8hDZvFHDwocgECdx50/IGRoeQRQ +pV3vw1MrfowrJJlkhIVk0VQxI2ij3oWP3h1tq9mTvZfd4T5JebnXNGRXWMBW/QCvuT9F1JkZ +zu1IH1I1O8yQ1m0LX9fbyrNFmsFJUdG2lHFz13V4Hptk1xj678oHyAOZbvpH5vepn7dtGJVV +/symR5DlUG2b3haieopNqZxmK63Lw77NdlwYWFmPxe+K2enn9/xYQO70rSf8PbiTnuMsSyv/ +BjBjjaIXHmZtAAAAAElFTkSuQmCC</item> + <item item-id="5">iVBORw0KGgoAAAANSUhEUgAAADYAAAARCAYAAACW7F9TAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +APFJREFUSEvtVtENxCAI9eZhHvdxHudxH044azwiEm2ba8yR9KfhFZ7vgX1hDrdjELEdw+1I +il24ObGEARzNGj8+3kw3BQSuBRiSUkvLGWBTAHSl+UaxD7nbSWFEfxDiJn1+I0PL0bFMig7r +Z8Sir8URlcPUcgzsecWKHVbUbYuTTtE7BOFHLcfCnidWnfM9m8eMtpaQJqPiLRGNWC/Hwl5I +bH7JWM3RF7UcC3shsXnFsvceMGO5iZU5GusoNhuEvEKMrVhzxtiOYtrJ91Yxe4XvoWXSvbtI +fnP2HiMnlHuYVv7ufx7zS+DpiL9iT1dI9vcGOwIxIcy74IIAAAAASUVORK5CYII=</item> + <item item-id="6">iVBORw0KGgoAAAANSUhEUgAAADgAAAAZCAYAAABkdu2NAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AUtJREFUWEftl9sNwyAMRek8zON9mId52If6QYEAiihJqsYKUv4Ac+zr6/YVcRnNiwA1L6MZ +jtX5AN4uAz6CMeQr+IHCCnoXXShVUSbREJ2V6oEXSHWAgaoXXLQJUhlgZRgEad0dKlhkJ8ZR +fR8dDo2Qzmk0mQyLgHCLCi7OKQ/Rop12PRicLTIgCeDGXSUsxqdjHKu9PBmEMXZj91Nh8K1Z +wuneDaAHGY7JYRmuttypIJObciI3gDSkExiDVm+ZvLfdVgD5wkHWfllBSmgGFnM5qp4MKBn9 +ImPVrFlMbifRVrKkKOqjIysDsjxxbnx/3aqN9z1IgDXQqYCcvSXA9fy2FbsUUAxl0IMoRdiV +yXkV5Ddc1YNUh85F0U/hwqr2Y6Jx0RNid3NQIMv/qTwyWiUeNZnBzOIQR+bgoFv0/thOsA/g +ukf+x0n1FXwDl1bfxI38KLMAAAAASUVORK5CYII=</item> + <item item-id="7">iVBORw0KGgoAAAANSUhEUgAAADgAAAARCAYAAACIJW/gAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AW9JREFUSEvlVtGtwyAM5M3DPOzDPMzDPn62CY3BhvBoI1V5SP1ohJM733HmB3C5Jy8i+OTl +nkyO3flvCabgwIU04Z8guACzHaUY9/kI+a5O5gjeIVb1K9gGCiaI3mPRiACR8xBXUTOIlWbs +diEjXgdSjxwD4zMJ5hiRPZFoi+rnSd2puBbOFC4csUuO6jTB+jaDIG6OxXhs095epIb1jBRN +p110AwjERPXDan9uHCNtCVb17JDBDx38sI4At6ByROs2KIrSfAYO4rzHsOSa8gWsPlOzTOhr +TsxKQVatO7BeHDYCL/+XBvaNsO1t1r7jzFftsoIYLl1ysBrCkusEtR3XCO4raNm7UVB692xs +q4a2aFVQBA8FijEa1iy6I6kRMuQqZHwQlF2Tcd51k0APQ0Za2xoJN4XMcA6Whm/dZJQSRhgp +HW4dE2PVtwjy7USm6xXB2wf9xwnW2UNWFGPCvK2sXul2zt51zaaC1y/+lh2/npuYN4qufWoA +AAAASUVORK5CYII=</item> + <item item-id="8">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</item> + <item item-id="9">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 +/B/LKCxqv59DlwAAAABJRU5ErkJggg==</item> + <item item-id="10">iVBORw0KGgoAAAANSUhEUgAAAEEAAAAYCAYAAACldpB6AAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +AgZJREFUWEftmM2RwyAMhbm5CXdAE26CQrYD6uGWDnJyBb4lvWglg+MfwAah2fXOrGcyiRPQ +oI+nhxwFDZezFib2/AmsdezZkhMVO5gzYFpzkIjBTmCdyIQgt4ttahIggCF4ECR3UDIWk0mA +8AWjwo/HVzfAKwQeewXv4THfOaPB8s1gv9TJgm6uK2b2YdpGCQ94dgrGryWgv4fef0EQ/G9Y +CtpAqx2sy3ZgdIvBtgGg2ScQ8NfHAO+ghtfQeQi0c6KLJqiCymIwOYVAu78o4TX08KRqwBpW +R/kSGIWJOHpXWFWq6uRwpm48I8/TKRGEnS+EUthFiCCgnEPiKihkshrDlJdMHgKpxEONXic+ +sh1bAuxaCaqHcRNpTjCnhI9ZejClfkcQtJjTkr+v0JohzJ6AAVezJEvQ8YKXcthBKK/zZMx5 +9bdRQue9IFx5JWx2nkomYZ65Hc9DKNnHeAxTCZk+4aCCeW+y5bCt29gPvE+kZX8TCBXEz06H +iwYql6z06cBUQgWEVIcXeUI63k9BqMhmHsp4djh2eJsj8uJYTEO4VbNUyo/fNmchmNu0zaUQ ++A9QaQiopNKGonyJVSMZ5eBbZ866kxCYsaqyvBjMg0BNTOVfY8sReTwm/+6fKkQWH5aaO108 +VSpZSgrgE4uphNDSNhkaqqlpvhyPBghyi/jtSP8QcAe+AWRFtQfWmZTDAAAAAElFTkSuQmCC</item> + <item item-id="11">iVBORw0KGgoAAAANSUhEUgAAALoAAAAnCAYAAAC49lJsAAAAAXNSR0IArs4c6QAAAARnQU1B +AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA +BCZJREFUeF7tW4GxpCAM9eqxHvuxHuvZfjxRkAAJBHZZ94fszM3cV5C85PEIEf/tx2/Sn3pA +ugcM0fWnHpDugUk6QMWnHjizFnWDemAEDyjRR4iyYlRFVw6M4QFV9DHiPDxKmUR/rfs8zfv6 +Gj6+6gDrAYFE3/Zlmo53A0p0Zbn3gECiH+BU0ZXjkQcEEf21r7NRcvdPFV3ZLlDRt+Ug+LJd +yLZFUxdleeABIYpu8nKg4Jq6KM1Fpi4nsafdCbrm6Mrz2ANW0V2lAua4x//ndXcVOpMazEG9 +zvRZdpssZDx7tAPP6RMCm5+7caoUvYzd2/xLmBFP2gmfrThRbdDrcN/z5J4nYwcTD0hdrofd +qnhQ/Nzc2QuG6P5elCqU2Hsaw5kUpQdl7t+AzQSdT4Wf2GPmsdvEP0yPSqZ+A3NgA4gJOTbV +Br/+Wpf7XcS5B+ouWLhTaTv4eDJEt2U6C+61zjfRQ9KXIm7vmw2inynMTt9qFhM9xH7tb+FE +Z9r1AcwwyNlRg7EQPG6T7vM7L2ycvl0m7mHn4rMGllehHZTdyPUs0WEl43a4GSie2S5V2K5c +2ZT4Uk4b52eWvzjPZqH+VKOUGEEVpxdmlvm81dMIERSSNNU0rxfwNpy+576HUnRW/DGwjUQH +4othxvAkRPd1aFCuAzbGDzm0zr6J9Evb2QZJG3iqGNfDwb6h24qAjAnG6o+5wHgrAuEeKexj +bIT3KaJjbTh9TckWH58f/xRlA9GBHZTd2PWyokeEjR9yGp9s/i7wMS/RvixV692IUHSLvSvm +s+YfFQEyf1Nk55C1hhhJ4QGqebHKhcf/imJGyIp7gLCwUYOnnKNHhOUHPU1TeESvV/QaosC2 +fvoQObrF3h8zT9GzCxonz67IaeFY21IoJKBCx6nS1Cl6YkcFHoaihwany7hTdKDgxgBkdvJS +l97qTeSKQcXp2ny6Mt2zmHk5+pVC2liR+TTVhu4LixBm5V6wI6GxwhPxfyd1we3g48nX0bFN +Jbkxg8svpgC/uhkl6ujxCyh0A/4mZsacZldd7hQyOrmJphnI6U6kHn1Ndsb5IVjarS3rMqou +WTvq6+gMr9smiTJzXtB8oNTGt/DzLUfEzPYiJ/7sh/Vp2HjWpfJsSZcabB+H0E8dETPTx3KJ +7nbPJkWBSz+WsnBfmzOd+mgzk36Nhrnk8FL8S/2/c79R0b9jXPMof0BhmrFpxyYPCCS6fkrX +xAThnQQS3ZU7OXVc4dFVeLcHBBGd+JSu+RyGskSSB8QQHf+U7p1zGJLCrFiEED1T+mOew1Eq +yPaADKLnDhk1n8OQHfjR0MkgujsRh31K13wOYzQqyMYrhOiu0mLPZcBP6ZrPYcgO/Gjo5BCd +ipy+PBqN0yheJbrSYAgPCCf63ziHMQTTHgYpnOgPe1eH/xkP/Adz56E4JkBm1gAAAABJRU5E +rkJggg==</item> + <item item-id="12">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</item> + <item item-id="13" content-encoding="gzip">H4sIAAAAAAAA/1xTS2/TQBCetR3bcZ4EQkkckpIHaSEt6QIHeipVhZAoIIUfULmJaYMICa6L +eoz4Adw4c+EnIO5cOXDlzyCFeeRR2Gi8s99+38zsZDcNAArtFZrHvolfN3zfC0+G43cJoPEA +LTkY9wWzGHtEtFH/5fGbsB8zAj3WG/i1z04n++MLgQ/RHAR6S+Jz0qJtYK7fmD1prdY0Jmh5 +xA0wTK6usEz+OI6j4fF5HCpm7qLl4PKwduv/rBMcwIqjMPQZ0GiZCbu2Lv0AmCYc/QXnPduV +2UnK7HoyJ1Pa/omzl9YGJotTWJlSDzGMTvxBfSoreAbAVMYOdLEm/fkZ7mQgz1vfciy5z1mv +COQx1KXTcZpp8qqms+wXELrG7scCC4q68Av33essHBRJOARY05/wGNMi3GD86xrh0uGSRHTK +coCSL3O5wswP/iL1TV5/X66hKsJyTUqpIrQupVQ58C1ZlHhRF7LdkOj1psyNlrSreVva0sL2 +K3MHtqn1bWlZa0P22quWbUrL2nBH+rPJRWnOdFeg5rLOjqRubEmdHYS2pbQOC+5JS+qLlnT5 +WuYG+ugkCianR6/H0SiIHWkv3W6GD4I4kFtTnt8eYx0/dCtJvkV/DN9xulJecDE8e8Jx5EVU +0LIK5D25DM3wB6qyRBOX0cMFCit0EdyJo6Af6gN5EP6cWFN5UL6akaeUjzXNaspQvonSmjKV +b80IsZADM3QSyJnu4ZZNHFI5zEHHJQ6RkxSH5B5yWJ5CDsvTyGF5hnOhk2UOOjniEFnKzb04 +H4XRsB+8lYbI6Z+iDWCIP3P+TL15N/8b6cuLvwAAAP//AwD9+qhFkgQAAA==</item> + <item item-id="14">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</item> + </binaryContent> +</worksheet> \ No newline at end of file diff --git "a/Docs/\320\241\321\205\320\265\320\274\320\260 \320\267\320\260\320\274\320\265\321\211\320\265\320\275\320\270\321\217 \320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\260.spl" "b/Docs/\320\241\321\205\320\265\320\274\320\260 \320\267\320\260\320\274\320\265\321\211\320\265\320\275\320\270\321\217 \320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\260.spl" new file mode 100644 index 0000000..eb6f15e Binary files /dev/null and "b/Docs/\320\241\321\205\320\265\320\274\320\260 \320\267\320\260\320\274\320\265\321\211\320\265\320\275\320\270\321\217 \320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\260.spl" differ diff --git "a/Docs/\320\242\320\242/1.png" "b/Docs/\320\242\320\242/1.png" new file mode 100644 index 0000000..c07f105 Binary files /dev/null and "b/Docs/\320\242\320\242/1.png" differ diff --git "a/Docs/\320\242\320\242/2.png" "b/Docs/\320\242\320\242/2.png" new file mode 100644 index 0000000..8e4a535 Binary files /dev/null and "b/Docs/\320\242\320\242/2.png" differ diff --git "a/Docs/\320\242\320\242/s1.png" "b/Docs/\320\242\320\242/s1.png" new file mode 100644 index 0000000..623bf08 Binary files /dev/null and "b/Docs/\320\242\320\242/s1.png" differ diff --git "a/Docs/\320\242\320\242/s2.png" "b/Docs/\320\242\320\242/s2.png" new file mode 100644 index 0000000..07d01b3 Binary files /dev/null and "b/Docs/\320\242\320\242/s2.png" differ diff --git "a/Docs/\320\242\320\242/s\320\244.png" "b/Docs/\320\242\320\242/s\320\244.png" new file mode 100644 index 0000000..c9c7621 Binary files /dev/null and "b/Docs/\320\242\320\242/s\320\244.png" differ diff --git "a/Docs/\320\242\320\242/\320\244.png" "b/Docs/\320\242\320\242/\320\244.png" new file mode 100644 index 0000000..a51c6b3 Binary files /dev/null and "b/Docs/\320\242\320\242/\320\244.png" differ diff --git "a/Docs/\320\242\320\242/\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.txt" "b/Docs/\320\242\320\242/\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.txt" new file mode 100644 index 0000000..5ba089f --- /dev/null +++ "b/Docs/\320\242\320\242/\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.txt" @@ -0,0 +1,12 @@ + PType fa(double &time){ return 100*exp(-time/0.1) +100*sin(w*time);} + PType I_F_TA(PType &F){ return 2e25*pow(F,7)+1e4*F;} + TA.R1(0); + TA.L1(0); + TA.R2(1.2); // номинальная загрузка + TA.L2(0); + TA.n1 = 1; + TA.n2 = 20; + TA.I1 = 100; + TA.S = 30; + TA.K = 10; + PType q = 85*M_PI/180; // отношение активных потерь к реактивным, считаем по умолчанию \ No newline at end of file diff --git "a/Docs/\320\242\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200 1\321\204/\320\236\320\264\320\275\320\276\321\204\320\260\320\267\320\275\321\213\320\271 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200.spl" "b/Docs/\320\242\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200 1\321\204/\320\236\320\264\320\275\320\276\321\204\320\260\320\267\320\275\321\213\320\271 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200.spl" new file mode 100644 index 0000000..04dc2f3 Binary files /dev/null and "b/Docs/\320\242\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200 1\321\204/\320\236\320\264\320\275\320\276\321\204\320\260\320\267\320\275\321\213\320\271 \321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200.spl" differ diff --git "a/Docs/\320\242\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200 1\321\204/\320\237\320\276\321\202\320\276\320\272 \321\200\320\260\321\201\321\201\320\265\321\217\320\275\320\270\321\217.spl" "b/Docs/\320\242\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200 1\321\204/\320\237\320\276\321\202\320\276\320\272 \321\200\320\260\321\201\321\201\320\265\321\217\320\275\320\270\321\217.spl" new file mode 100644 index 0000000..b2ada45 Binary files /dev/null and "b/Docs/\320\242\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200 1\321\204/\320\237\320\276\321\202\320\276\320\272 \321\200\320\260\321\201\321\201\320\265\321\217\320\275\320\270\321\217.spl" differ diff --git "a/Docs/\320\242\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200 1\321\204/\320\242\320\276\320\272 \321\205\320\276\320\273\320\276\321\201\321\202\320\276\320\263\320\276 \321\205\320\276\320\264\320\260.png" "b/Docs/\320\242\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200 1\321\204/\320\242\320\276\320\272 \321\205\320\276\320\273\320\276\321\201\321\202\320\276\320\263\320\276 \321\205\320\276\320\264\320\260.png" new file mode 100644 index 0000000..bb433ec Binary files /dev/null and "b/Docs/\320\242\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200 1\321\204/\320\242\320\276\320\272 \321\205\320\276\320\273\320\276\321\201\321\202\320\276\320\263\320\276 \321\205\320\276\320\264\320\260.png" differ diff --git "a/Docs/\320\242\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200 1\321\204/\320\242\320\276\320\272 \321\205\320\276\320\273\320\276\321\201\321\202\320\276\320\263\320\276 \321\205\320\276\320\264\320\260_2.png" "b/Docs/\320\242\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200 1\321\204/\320\242\320\276\320\272 \321\205\320\276\320\273\320\276\321\201\321\202\320\276\320\263\320\276 \321\205\320\276\320\264\320\260_2.png" new file mode 100644 index 0000000..9f2b629 Binary files /dev/null and "b/Docs/\320\242\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200 1\321\204/\320\242\320\276\320\272 \321\205\320\276\320\273\320\276\321\201\321\202\320\276\320\263\320\276 \321\205\320\276\320\264\320\260_2.png" differ diff --git "a/Docs/\320\242\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200 1\321\204/\320\242\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200_1.spl" "b/Docs/\320\242\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200 1\321\204/\320\242\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200_1.spl" new file mode 100644 index 0000000..c798895 Binary files /dev/null and "b/Docs/\320\242\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200 1\321\204/\320\242\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200_1.spl" differ diff --git a/Dynamic_Array.cpp b/Dynamic_Array.cpp new file mode 100644 index 0000000..0195476 --- /dev/null +++ b/Dynamic_Array.cpp @@ -0,0 +1,5 @@ +//--------------------------------------------------------------------------- +#pragma hdrstop +#include "Dynamic_Array.h" + +#pragma package(smart_init) diff --git a/Dynamic_Array.h b/Dynamic_Array.h new file mode 100644 index 0000000..aa3bbb3 --- /dev/null +++ b/Dynamic_Array.h @@ -0,0 +1,117 @@ +//--------------------------------------------------------------------------- +#ifndef Dynamic_ArrayH +#define Dynamic_ArrayH +#include <vector> +using namespace std; +//--------------------------------------------------------------------------- +#define DYNAMIC_ARRAY_BLOCK_LEN 64 // длинна каждого блока (блок выделяется по мере необходимости в дополнительной памяти) +//using namespace std; +//--------------------------------------------------------------------------- +// обеспечивается валидность узазателей на элементы массива (в отличие от вектора) +template<class T> class Dynamic_Array{ + private: + const unsigned block_len; // длинна блоков + unsigned elem_cnt; // число сохраненных элементов в текущем блоке + vector <T*> Block; // Массив указателей на блоки + public: + Dynamic_Array(); + Dynamic_Array(unsigned Num_Elements); + Dynamic_Array(unsigned Blocks_num, unsigned Block_Len); + ~Dynamic_Array(); + T& push_back(const T &value); // сохранить значение + void clear(); // очистка содержимого + unsigned size(); // размер массива + T* begin(); // указатель на первый элемент + T& operator[](unsigned int i); // возвращаем элемент массива + Dynamic_Array operator=(Dynamic_Array op2); + int index(const T* ptr); // получить индекс по указателю (возвращает -1 если элемент не содержится в массиве) + }; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +template<class T> Dynamic_Array<T>::Dynamic_Array(): + block_len(DYNAMIC_ARRAY_BLOCK_LEN){ + Block.push_back( new T [block_len] ); + elem_cnt = 0; // элементов сохранено в текущем блоке +} +//--------------------------------------------------------------------------- +/*/ создаем Num_Elements элементов и гарантируем что поместится Max_Num_Elements +template<class T> Dynamic_Array<T>::Dynamic_Array(unsigned Num_Elements, unsigned Max_Num_Elements): + blocks_num(1 + Max_Num_Elements/(Num_Elements+1)), + block_len(Num_Elements+1){ + Block = new T*[blocks_num]; + for(unsigned i=0; i<blocks_num; i++) Block[i] = NULL; + i_block = 0; // используемый блок + Block[ i_block ] = new T [block_len]; + elem_cnt = 0; // элементов сохранено в текущем блоке +}*/ +//--------------------------------------------------------------------------- +template<class T> Dynamic_Array<T>::Dynamic_Array(unsigned Num_Elements): + block_len(Num_Elements+1){ // число элементов в блоке равно числу элементов + 1 (иначе вдруг Num_Elements==0) + Block.push_back( new T[block_len] ); + elem_cnt = Num_Elements; // элементов сохранено в текущем блоке +} +//--------------------------------------------------------------------------- +template<class T> Dynamic_Array<T>::~Dynamic_Array(){ + for(unsigned i=0, n=Block.size(); i<n; i++) + delete [] Block[i]; +} +//--------------------------------------------------------------------------- +template<class T> T& Dynamic_Array<T>::push_back(const T &value){ + // сохраняем + unsigned i_block = Block.size()-1; + *(Block[ i_block ] + elem_cnt) = value; + unsigned blk = i_block; + unsigned ind = elem_cnt; + elem_cnt++; + // нужно ли создать новый блок + if(elem_cnt >= block_len){ + Block.push_back( new T [block_len] ); + elem_cnt = 0; // элементов сохранено в текущем блоке + } + return Block[blk][ind]; +} +//--------------------------------------------------------------------------- +template<class T> void Dynamic_Array<T>::clear(){ + // все очищаем + for(unsigned i=0, n=Block.size(); i<n; i++) + delete [] Block[i]; + Block.clear(); + // создаем по новой + Block.push_back( new T [block_len] ); + elem_cnt = 0; // элементов сохранено в текущем блоке +} +//--------------------------------------------------------------------------- +template<class T> T& Dynamic_Array<T>::operator[](unsigned int i){ + if( i > size() ) {err(0, "Доступ к несуществующему элементу"); i = i%size();} + unsigned blk = i / block_len; + unsigned index = i - blk*block_len; + return Block[ blk ][ index ]; +} +//--------------------------------------------------------------------------- +template<class T> unsigned Dynamic_Array<T>::size(){ + return (Block.size()-1) * block_len + elem_cnt; +} +//--------------------------------------------------------------------------- +template<class T> Dynamic_Array<T> Dynamic_Array<T>::operator=(Dynamic_Array op2){ + this->clear(); + unsigned n = op2.size(); + for(unsigned i=0, blk1=0, blk2=0, index1=0, index2=0; i<n; i++, index1++, index2++){ + if(index1 >= block_len) { blk1++; index1=0; } + if(index2 >= op2.block_len) { blk2++; index2=0; } + Block[ blk1 ][ index1 ] = Block[ blk2 ][ index2 ]; + } + return *this; +} +//--------------------------------------------------------------------------- +template<class T> int Dynamic_Array<T>::index(const T* ptr){ + for(unsigned i=0, n=Block.size(); i<n; i++){ + int ind = ptr - Block[i]; + if( ind >= 0 && ind < (signed)block_len ) + return ( i * block_len + ind ); + } + return -1; +} +//--------------------------------------------------------------------------- +template<class T> T* Dynamic_Array<T>::begin(){ return &Block[0][0]; } +#endif diff --git a/Dynamic_Array.obj b/Dynamic_Array.obj new file mode 100644 index 0000000..faad274 Binary files /dev/null and b/Dynamic_Array.obj differ diff --git a/Forms/ObectsLibrary.cpp b/Forms/ObectsLibrary.cpp new file mode 100644 index 0000000..a2bae07 --- /dev/null +++ b/Forms/ObectsLibrary.cpp @@ -0,0 +1,40 @@ +//--------------------------------------------------------------------------- + +#include <vcl.h> +#pragma hdrstop + +#include "ObectsLibrary.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma resource "*.dfm" +TfrmObjLib *frmObjLib; +//--------------------------------------------------------------------------- +__fastcall TfrmObjLib::TfrmObjLib(TComponent* Owner) + : TForm(Owner) +{ +} +//--------------------------------------------------------------------------- +void __fastcall TfrmObjLib::FormClose(TObject *Sender, + TCloseAction &Action) +{ + /* + caNone The form is not allowed to close, so nothing happens. + caHide The form is not closed, but just hidden. Your application can still access a hidden form. + caFree The form is closed and all allocated memory for the form is freed. + caMinimize The form is minimized, rather than closed. This is the default action for MDI child forms. + */ + caFree; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmObjLib::FormActivate(TObject *Sender) +{ + AlphaBlend = false; +} +//--------------------------------------------------------------------------- + +void __fastcall TfrmObjLib::FormDeactivate(TObject *Sender) +{ + AlphaBlend = true; +} +//--------------------------------------------------------------------------- + diff --git a/Forms/ObectsLibrary.ddp b/Forms/ObectsLibrary.ddp new file mode 100644 index 0000000..cdc0ee8 Binary files /dev/null and b/Forms/ObectsLibrary.ddp differ diff --git a/Forms/ObectsLibrary.dfm b/Forms/ObectsLibrary.dfm new file mode 100644 index 0000000..d5369d5 --- /dev/null +++ b/Forms/ObectsLibrary.dfm @@ -0,0 +1,53 @@ +object frmObjLib: TfrmObjLib + Left = 25 + Top = 31 + AlphaBlendValue = 200 + BorderStyle = bsToolWindow + Caption = #1041#1080#1073#1083#1080#1086#1090#1077#1082#1072' '#1086#1073#1098#1077#1082#1090#1086#1074 + ClientHeight = 306 + ClientWidth = 286 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Scaled = False + OnActivate = FormActivate + OnClose = FormClose + OnDeactivate = FormDeactivate + PixelsPerInch = 96 + TextHeight = 13 + object tvList: TTreeView + Left = -4 + Top = 0 + Width = 289 + Height = 305 + DragMode = dmAutomatic + Indent = 19 + TabOrder = 0 + Items.Data = { + 06000000220000000000000000000000FFFFFFFFFFFFFFFF0000000001000000 + 09C8F1F2EEF7EDE8EAE82D0000000000000000000000FFFFFFFFFFFFFFFF0000 + 00000000000014C3E5EDE5F0E0F2EEF020F2F0E5F5F4E0E7EDFBE92700000000 + 00000000000000FFFFFFFFFFFFFFFF00000000030000000ED2F0E0EDF1F4EEF0 + ECE0F2EEF0FB200000000000000000000000FFFFFFFFFFFFFFFF000000000200 + 000007D1E8EBEEE2FBE5230000000000000000000000FFFFFFFFFFFFFFFF0000 + 0000000000000ACEE4EDEEF4E0E7EDFBE9230000000000000000000000FFFFFF + FFFFFFFFFF00000000000000000AD2F0E5F5F4E0E7EDFBE91D00000000000000 + 00000000FFFFFFFFFFFFFFFF000000000100000004D2EEEAE023000000000000 + 0000000000FFFFFFFFFFFFFFFF00000000000000000ACEE4EDEEF4E0E7EDFBE9 + 230000000000000000000000FFFFFFFFFFFFFFFF00000000000000000ACDE0EF + F0FFE6E5EDE8FF1E0000000000000000000000FFFFFFFFFFFFFFFF0000000001 + 00000005CBE8EDE8E82A0000000000000000000000FFFFFFFFFFFFFFFF000000 + 000000000011CEE4EDEEF6E5EFEDE0FF20E1E5E720C3D2240000000000000000 + 000000FFFFFFFFFFFFFFFF00000000010000000BCFEEF2F0E5E1E8F2E5EBE823 + 0000000000000000000000FFFFFFFFFFFFFFFF00000000000000000AD2F0E5F5 + F4E0E7EDFBE9320000000000000000000000FFFFFFFFFFFFFFFF000000000100 + 000019CAEEECECF3F2E0F6E8EEEDEDE0FF20E0EFEFE0F0E0F2F3F0E024000000 + 0000000000000000FFFFFFFFFFFFFFFF00000000000000000BC2FBEAEBFEF7E0 + F2E5EBFC200000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 + 07CFEEE4F1E5F2FC} + end +end diff --git a/Forms/ObectsLibrary.h b/Forms/ObectsLibrary.h new file mode 100644 index 0000000..1250161 --- /dev/null +++ b/Forms/ObectsLibrary.h @@ -0,0 +1,26 @@ +//--------------------------------------------------------------------------- + +#ifndef ObectsLibraryH +#define ObectsLibraryH +//--------------------------------------------------------------------------- +#include <Classes.hpp> +#include <Controls.hpp> +#include <StdCtrls.hpp> +#include <Forms.hpp> +#include <ComCtrls.hpp> +//--------------------------------------------------------------------------- +class TfrmObjLib : public TForm +{ +__published: // IDE-managed Components + TTreeView *tvList; + void __fastcall FormClose(TObject *Sender, TCloseAction &Action); + void __fastcall FormActivate(TObject *Sender); + void __fastcall FormDeactivate(TObject *Sender); +private: // User declarations +public: // User declarations + __fastcall TfrmObjLib(TComponent* Owner); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TfrmObjLib *frmObjLib; +//--------------------------------------------------------------------------- +#endif diff --git a/Forms/ObectsLibrary.obj b/Forms/ObectsLibrary.obj new file mode 100644 index 0000000..12928a0 Binary files /dev/null and b/Forms/ObectsLibrary.obj differ diff --git a/Forms/Scope.cpp b/Forms/Scope.cpp new file mode 100644 index 0000000..c3f1ddd --- /dev/null +++ b/Forms/Scope.cpp @@ -0,0 +1,630 @@ +//--------------------------------------------------------------------------- + +#include <vcl.h> +#pragma hdrstop + +#include "Scope.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma resource "*.dfm" +vector<TfrmScope*> frmScope; +extern double TIME; +//--------------------------------------------------------------------------- +int scale_X(TfrmScope* Owner, PType x){ return Owner->out->Width*((x - Owner->Xmin)/(Owner->Xmax-Owner->Xmin+1e-300)); } +int scale_Y(TfrmScope* Owner, PType y){ return Owner->out->Height*(1 - (y - Owner->Ymin)/(Owner->Ymax-Owner->Ymin+1e-300)); } +PType scale_X(TfrmScope* Owner, int x){ return Owner->Xmin+(Owner->Xmax-Owner->Xmin)*x/Owner->out->Width; } +PType scale_Y(TfrmScope* Owner, int y){ return Owner->Ymax+(Owner->Ymin-Owner->Ymax)*y/Owner->out->Height; } +//--------------------------------------------------------------------------- +// Округление к ближайшему с заданным количеством знаков после запятой. +// value - округляемое значение +// digits - количество знаков после запятой +String RoundTo(const PType &value, int digits) { + int exp=0; + PType t = value; + if(fabs(t)<1e-100) return "0"; + while(fabs(t) < 1){ + t *= 10; + exp--; + } + while(fabs(t) > 10){ + t = t/10; + exp++; + } + PType temp = pow10(digits-1); + if(exp != 0) + return FloatToStr((floor(t*temp+0.5))/temp) + "e" + IntToStr(exp); + else + return FloatToStr((floor(t*temp+0.5))/temp); +} +//--------------------------------------------------------------------------- +// очистка поля для графика +void Graph_Clear(TfrmScope* Owner){ + static bool Working=false; + if(Working) return; + Working=true; + if(Owner->out->Width <= 0 || Owner->out->Height<=0) return; + // очищаем + Owner->out->Canvas->Rectangle(0,0,Owner->out->Width+1,Owner->out->Height+1); + // запоминаем настройки перьев + TColor PenColor = Owner->out->Canvas->Pen->Color; + int PenWidth = Owner->out->Canvas->Pen->Width; + TPenStyle PenStyle = Owner->out->Canvas->Pen->Style; + Owner->out->Canvas->Pen->Color=(TColor)RGB(128,128,128); //Задаем цвет пера + /*psSolid Сплошная линия + psDash Штриховая линия + psDot Пунктирная линия + psDashDot Штрих-пунктирная линия + psDashDotDot Линия, чередующая штрих и два пунктира + psClear Отсутствие линии + psInsideFrame Сплошная линия, но при Width > 1 допускающая цвета, отличные от палитры Windows*/ + // границы графика + unsigned border_X = Owner->border_X; + unsigned border_Y = Owner->border_Y; + int min_X = border_X, + max_X = Owner->out->Width-border_Y, // дада- Y + min_Y = border_Y, + max_Y = Owner->out->Height-border_Y; + Owner->out->Canvas->Pen->Width=1; + Owner->out->Canvas->MoveTo(min_X, min_Y); + Owner->out->Canvas->LineTo(max_X, min_Y); + Owner->out->Canvas->LineTo(max_X, max_Y); + Owner->out->Canvas->LineTo(min_X, max_Y); + Owner->out->Canvas->LineTo(min_X, min_Y); + // вывод сетки + unsigned step = Owner->Grid_Step; // шаг сетки + int X_axis = scale_X(Owner, Owner->Main_Y); // координаты главной вертикальной оси + int Y_axis = scale_Y(Owner, Owner->Main_X); // координаты главной горизонтальной оси + //второстепенные оси + Owner->out->Canvas->Pen->Width=1; + Owner->out->Canvas->Pen->Style = psDot; + int w = X_axis - step*((X_axis-min_X)/step); + for(int cnt=0; w < max_X; w=w+step, cnt++){ + Owner->out->Canvas->MoveTo(w, min_Y); + Owner->out->Canvas->LineTo(w, max_Y); + if(cnt%2)Owner->out->Canvas->TextOutA(w-16,Owner->out->Height-16, RoundTo((Owner->Xmax-Owner->Xmin)*(w-X_axis)/Owner->out->Width,3).c_str()); //Owner->Xmin+(Owner->Xmax-Owner->Xmin)*((double)w/Owner->out->Width) + } + int h = Y_axis - step*((Y_axis-min_Y)/step); + for(; h < max_Y; h=h+step){ + Owner->out->Canvas->MoveTo(min_X, h); + Owner->out->Canvas->LineTo(max_X, h); + Owner->out->Canvas->TextOutA(3,h-8, RoundTo((Owner->Ymin-Owner->Ymax)*(h-Y_axis)/Owner->out->Height, 3).c_str()); //Owner->Ymax-(Owner->Ymax-Owner->Ymin)*((double)h)/Owner->out->Height + } + // вывод цены деления по шкале + TColor FColor = Owner->out->Canvas->Font->Color; + unsigned FSize = Owner->out->Canvas->Font->Size; + Owner->out->Canvas->Font->Color=(TColor)RGB(128,128,128); // цвет шрифта подписей + Owner->out->Canvas->Font->Size= 0.8 * FSize; + Owner->out->Canvas->TextOutA(max_X-50,max_Y-FSize-4, RoundTo(scale_X(Owner,(int)step)-scale_X(Owner,(int)0),3).c_str()); + Owner->out->Canvas->TextOutA(min_X+4,min_Y+4, RoundTo(scale_Y(Owner,(int)0)-scale_Y(Owner,(int)step),3).c_str()); + // Минимальные значения + Owner->out->Canvas->Font->Color=FColor; // цвет шрифта подписей + Owner->out->Canvas->Font->Size= FSize; + //главные оси + Owner->out->Canvas->Pen->Width=2; //Задаем ширину пера + Owner->out->Canvas->Pen->Style = psSolid; + if(X_axis>min_X && X_axis<max_X){ + Owner->out->Canvas->MoveTo(X_axis, min_Y); + Owner->out->Canvas->LineTo(X_axis, max_Y); + } + if(Y_axis>min_Y && Y_axis<max_Y){ + Owner->out->Canvas->MoveTo(min_X, Y_axis); + Owner->out->Canvas->LineTo(max_X, Y_axis); + } + // восстанавливаем параметры пера + Owner->out->Canvas->Pen->Color=PenColor; //Задаем цвет пера + Owner->out->Canvas->Pen->Width=PenWidth; //Задаем ширину пера + Owner->out->Canvas->Pen->Style = PenStyle; + Working=false; +} +//--------------------------------------------------------------------------- +void Graph_Refresh(TfrmScope* Owner){ + static bool Working=false; + if(Working) return; + Working=true; + if(Owner->out->Width <= 0 || Owner->out->Height<=0) return; + // прорисовываем сетку + Graph_Clear(Owner); + // очищаем + if(Owner) Owner->Graph->Canvas -> CopyRect(Owner->Rect, Owner->out->Canvas, Owner->Rect); // выводим сетку + //прорисовываем график + unsigned n=Owner->X.size(); + unsigned i; + for (i=0; i<n;i++) if(Owner->X[i] > Owner->Xmin) break; + if((i-1)<n && i>0) + Owner->out->Canvas->MoveTo(scale_X(Owner, Owner->X[i-1]), scale_Y(Owner, Owner->Y[i-1])); + else if(i<n) + Owner->out->Canvas->MoveTo(scale_X(Owner, Owner->X[i]), scale_Y(Owner, Owner->Y[i])); + for (; i<n;i++) Owner->out->Canvas->LineTo(scale_X(Owner, Owner->X[i]), scale_Y(Owner, Owner->Y[i])); + if(Owner) Owner->Graph->Canvas -> CopyRect(Owner->curve_Rect, Owner->out->Canvas, Owner->curve_Rect); // выводим график+сетку + Working=false; +} +//--------------------------------------------------------------------------- +__fastcall TfrmScope::TfrmScope(TComponent* Owner) + : TForm(Owner) +{ + Xmax=0.01; + Xmin=0; + Ymax=5; + Ymin=-5; + Signal=NULL; // выводимый сигнал + SignalBase=NULL; // относительно какого сигнала + out = new Graphics::TBitmap(); // здесь содержится график + //Задаем цвет пера + out->Canvas->Pen->Color=clActiveCaption; // цвет графика + //Задаем ширину пера + out->Canvas->Pen->Width=2; + // Цвет кисти + out->Canvas->Brush->Color=clBtnFace; // цвет фона + //Цвет текста + out->Canvas->Font->Color=clBlack; // цвет шрифта подписей + //Размер шрифта в точках + out->Canvas->Font->Size=10; + //Стиль шрифта + TFontStyles tFontStyle; + //Зачеркнутый, наклонный, жирный, подчепкнутый + //tFontStyle << fsStrikeOut << fsItalic << fsBold << fsUnderline; + tFontStyle << fsBold; + out->Canvas->Font->Style =tFontStyle; + //Имя шрифта + out->Canvas->Font->Name="Times"; + // сетка графика. шаг + Grid_Step=40; + Scroll->Min = 0; + Scroll->Max = 0; + // поля графика + border_X = 50; + border_Y = 20; + // масштабируем по X + Scale_To=true; + mnu_Scale->Caption = "Масштаб по Y"; + Move_Graph = false; // перетаскиваем график - нет + Mouse_Scale = false; // масштабируем график мышкой - нет + Main_X = 0; Main_Y = 0; // координаты главных осей + this->Constraints->MinHeight = 300; + this->Constraints->MinWidth = 550; + // время между обновлениями графика + cmb_Timer_Value->ItemIndex = 1; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::FormDestroy(TObject *Sender) +{ + delete out; +} +//--------------------------------------------------------------------------- +PType get_signal(TfrmScope* Owner){ + if(Owner->rbCurrent->Checked){ // мерием ток + if(Owner->fromPin) return Owner->usePin->I(); + else return *Owner->Signal; + } + else{ // напряжение + PType signal, signal_base; + if(Owner->fromPin) signal = Owner->usePin->f(); + else signal = *Owner->Signal; + if(Owner->fromPinBase) signal_base = Owner->usePinBase->f(); + else signal_base = *Owner->SignalBase; + return (signal - signal_base); + } +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::TimerTimer(TObject *Sender) +{ + if(fabs(Xmax-Xmin)>1e-6) Scroll->Max = TIME/(Xmax-Xmin)*100; + X.push_back(TIME); + PType signal = get_signal(this); + Y.push_back(signal); + out->Canvas->LineTo(scale_X(this, TIME), scale_Y(this, signal)); + Graph->Canvas -> CopyRect(curve_Rect, out -> Canvas, curve_Rect); // обновляем только область графика (обрезая его) +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::btnStartClick(TObject *Sender) +{ + // если уже был запущен вывод графика то останавливаем + if( Timer->Enabled ){ + btnPauseClick(Sender); + return; + } + // запустим рассчет + int tmp; + if(rbCurrent->Checked){ // мерием ток + if(cmbBranches->ItemIndex != -1){ // c какого вывода брать значения + usePin = (PPin*)cmbBranches->Items->Objects[cmbBranches->ItemIndex]; + fromPin = true; + } + else if(TryStrToInt(cmbBranches->Text,tmp) && StrToInt(cmbBranches->Text)>=0 && StrToInt(cmbBranches->Text)<(signed)obj->Branches()){ + Signal = obj->I[StrToInt(cmbBranches->Text)]; // график чего строим + fromPin = false; + } + else{ // пытаемся найти объект по имени + int point=cmbBranches->Text.Pos(":"); + PElement* child = ((PGrid*)obj)->obj_from_name( cmbBranches->Text.SubString(1,point-1) ); + String Number = cmbBranches->Text.SubString(point+1, cmbBranches->Text.Length()-point); + if(TryStrToInt(Number,tmp) && child!=NULL ){ + if(tmp>=0 && tmp<(int)child->Branches()){ + Signal = child->I[tmp]; // график чего строим + fromPin = false; + } + } + else + {ShowMessage("Не верная ветка");return;} + } + } + else if(rbVoltage->Checked){ // Напряжение + // первый узел + if(cmbPot1->ItemIndex != -1){ // c какого вывода брать значения + usePin = (PPin*)cmbPot1->Items->Objects[cmbPot1->ItemIndex]; + fromPin = true; + } + else if(TryStrToInt(cmbPot1->Text,tmp) && StrToInt(cmbPot1->Text)>=0 && StrToInt(cmbPot1->Text)<(signed)obj->Nodes()){ + Signal = obj->f[tmp]; + fromPin = false; + } + else{ // пытаемся найти объект по имени + int point=cmbPot1->Text.Pos(":"); + PElement* child = ((PGrid*)obj)->obj_from_name( cmbPot1->Text.SubString(1,point-1) ); + String Number = cmbPot1->Text.SubString(point+1, cmbPot1->Text.Length()-point); + if(TryStrToInt(Number,tmp) && child!=NULL){ + if(tmp>=0 && tmp<(int)child->Nodes()){ + Signal = child->f[tmp]; // график чего строим + fromPin = false; + } + } + else + {ShowMessage("Не верный узел 1");return;} + } + // второй узел + if(cmbPot2->ItemIndex != -1){ // c какого вывода брать значения + usePinBase = (PPin*)cmbPot2->Items->Objects[cmbPot2->ItemIndex]; + fromPinBase = true; + } + else if(TryStrToInt(cmbPot2->Text,tmp) && StrToInt(cmbPot2->Text)>=0 && StrToInt(cmbPot2->Text)<(signed)obj->Nodes()){ + SignalBase = obj->f[StrToInt(cmbPot2->Text)]; + fromPinBase = false; + } + else{ // пытаемся найти объект по имени + int point=cmbPot2->Text.Pos(":") ; + PElement* child = ((PGrid*)obj)->obj_from_name( cmbPot2->Text.SubString(1,point-1) ); + String Number = cmbPot2->Text.SubString(point+1, cmbPot2->Text.Length()-point); + if(TryStrToInt(Number,tmp) && child!=NULL){ + if(tmp>=0 && tmp<(int)child->Nodes()){ + SignalBase = child->f[tmp]; // график чего строим + fromPinBase = false; + } + } + else + {ShowMessage("Не верный узел 2");return;} + } + } + // обновить график + Graph_Refresh(this); + PType signal = get_signal(this); + out->Canvas->MoveTo(scale_X(this,TIME), scale_Y(this,signal)); + Timer->Interval = StrToInt(cmb_Timer_Value->Text); // время между обновлениями графика + Timer->Enabled=true; + rbCurrent->Enabled = false; + rbVoltage->Enabled = false; + btnStart->SetFocus(); // установить фокус на кнопке старта + // оставим видимым то для чего ведется рассчет графика + if( rbCurrent->Checked ){ + cmbPot1->Visible = false; + cmbPot2->Visible = false; + rbVoltage->Visible = false; + } + else if( rbVoltage->Checked ){ + cmbBranches->Visible = false; + rbCurrent->Visible = false; + } +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::btnPauseClick(TObject *Sender) +{ + Timer->Enabled=false; + rbCurrent->Enabled = true; + rbVoltage->Enabled = true; + // отобразим нужные компоненты + cmbBranches->Visible = true; + rbCurrent->Visible = true; + cmbPot1->Visible = true; + cmbPot2->Visible = true; + rbVoltage->Visible = true; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::FormResize(TObject *Sender) +{ + bool tmr=Timer->Enabled; + Timer->Enabled=false; + Graph->Top=0; Graph->Left=0; + Graph->Height=ClientHeight-pnlControl->Height - Scroll->Height;//-47; + Graph->Width=ClientWidth;//-18; //9 + pnlControl->Left=0; + pnlControl->Width=ClientWidth;//-18; //9 + pnlControl->Top=ClientHeight-pnlControl->Height;//-40; + Scroll->Left = 0; + Scroll->Width=ClientWidth;// - 18; //10 + Scroll->Top=ClientHeight-pnlControl->Height - Scroll->Height;//-47; + out->Width = Graph->Width; + out->Height = Graph->Height; + Rect.left=0; + Rect.bottom=0; + Rect.right=Rect.left+out->Width; + Rect.top=out->Height; + + curve_Rect.left = border_X; + curve_Rect.bottom = border_Y; + curve_Rect.top = out->Height-border_Y; + curve_Rect.right = out->Width-border_Y; + + // Обновить график + Graph_Refresh(this); + Timer->Enabled=tmr; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::btnStopClick(TObject *Sender) +{ + Timer->Enabled=false; + X.clear(); + Y.clear(); + Scroll->Position=0; + Scroll->Min=0; + Scroll->Max=0; + rbCurrent->Enabled = true; + rbVoltage->Enabled = true; + // Обновить график + Graph_Refresh(this); +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::FormPaint(TObject *Sender) +{ + Graph_Refresh(this); +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::pnlControlResize(TObject *Sender) +{ + //btnStop->Left = pnlControl->Width-btnStop->Width-5; + //btnPause->Left = pnlControl->Width-btnStop->Width-btnPause->Width-5; + //btnStart->Left = pnlControl->Width-btnStop->Width-btnPause->Width-btnStart->Width-5; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::ScrollChange(TObject *Sender) +{ + static int ScrollPos=0; // предыдущее положение + int delta = Scroll->Position - ScrollPos; + PType wd = Xmax-Xmin; + Xmin += delta*wd/100; + Xmax = Xmin+wd; + Graph_Refresh(this); + ScrollPos = Scroll->Position; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::FormHide(TObject *Sender) +{ + /*/ остановим вывод графика + Timer->Enabled = false; + // ищем свой указатель в векторе и удаляем его + unsigned n = frmScope.size(); + for (unsigned i=0;i<n;i++) + if(frmScope[i] == this){ + frmScope.erase(frmScope.begin()+i); + break; + } + /* + caNone The form is not allowed to close, so nothing happens. + caHide The form is not closed, but just hidden. Your application can still access a hidden form. + caFree The form is closed and all allocated memory for the form is freed. + caMinimize The form is minimized, rather than closed. This is the default action for MDI child forms. + */ + //caFree; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::FormMouseWheel(TObject *Sender, + TShiftState Shift, int WheelDelta, TPoint &MousePos, bool &Handled) +{ + if(Scale_To){ + PType dX = 0.1*(Xmax-Xmin); + PType percent = (double)(MousePos.x - Left)/Graph->Width; + Xmax = Xmax - (1-percent) *dX*WheelDelta/abs(WheelDelta); + Xmin = Xmin + percent *dX*WheelDelta/abs(WheelDelta); + }else{ + PType dY = 0.1*(Ymax-Ymin); + PType percent = (double)(MousePos.y - Top)/Graph->Height; + Ymax = Ymax - (percent)*dY*WheelDelta/abs(WheelDelta); + Ymin = Ymin + (1-percent) *dY*WheelDelta/abs(WheelDelta); + } + Graph_Refresh(this); +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::mnu_ScaleClick(TObject *Sender) +{ + Scale_To = !Scale_To; + if(Scale_To) mnu_Scale->Caption = "Масштаб по Y"; + else mnu_Scale->Caption = "Масштаб по X"; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::GraphMouseDown(TObject *Sender, + TMouseButton Button, TShiftState Shift, int X, int Y) +{ + if(Button == mbLeft){ // правой кнопкой мышки перетаскиваем график + Mouse_Down_X = X; + Mouse_Down_Y = Y; + Mouse_Down_Xmin = Xmin; + Mouse_Down_Xmax = Xmax; + Mouse_Down_Ymin = Ymin; + Mouse_Down_Ymax = Ymax; + Mouse_Scale = false; + Move_Graph = true; // перетаскиваем график + Graph->Cursor = crHandPoint; // появляется курсор-рука + } + else if (Button == mbMiddle){ // по нажатию на колесико - мастшабируем мышью + Mouse_Down_X = X; + Mouse_Down_Y = Y; + Move_Graph = false; + Mouse_Scale = true; + } +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::GraphMouseMove(TObject *Sender, + TShiftState Shift, int X, int Y) +{ + if(Move_Graph){ // если передвигаем график + PType delta_X = (Xmax-Xmin)*(X-Mouse_Down_X)/Graph->Width; + Xmin = Mouse_Down_Xmin - delta_X; + Xmax = Mouse_Down_Xmax - delta_X; + PType delta_Y = (Ymax-Ymin)*(Y-Mouse_Down_Y)/Graph->Height; + Ymin = Mouse_Down_Ymin + delta_Y; + Ymax = Mouse_Down_Ymax + delta_Y; + Graph_Refresh(this); + } + if(Mouse_Scale){ //Если масштабируем + // вырисовываем прямоугольник + TColor C = Graph->Canvas->Pen->Color; + int W = Graph->Canvas->Pen->Width; + Graph->Canvas->Pen->Color = (TColor)RGB(200,200,200); + Graph->Canvas->Pen->Width = 1; + Graph_Refresh(this); + Graph->Canvas->MoveTo(Mouse_Down_X, Mouse_Down_Y); + Graph->Canvas->LineTo(Mouse_Down_X, Y); + Graph->Canvas->LineTo(X, Y); + Graph->Canvas->LineTo(X, Mouse_Down_Y); + Graph->Canvas->LineTo(Mouse_Down_X, Mouse_Down_Y); + Graph->Canvas->Pen->Color = C; + Graph->Canvas->Pen->Width = W; + } + +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::GraphMouseUp(TObject *Sender, + TMouseButton Button, TShiftState Shift, int X, int Y) +{ + if(Button == mbLeft){ // правой кнопкой мышки перетаскиваем график + Move_Graph = false; // перетаскиваем график + Graph->Cursor = crDefault; // появляется курсор-стрелка + } + else if (Button == mbMiddle){ // по нажатию на колесико - мастшабируем мышью + if(Mouse_Down_X > X) {int t=X; X=Mouse_Down_X; Mouse_Down_X=t;} + if(Mouse_Down_Y > Y) {int t=Y; Y=Mouse_Down_Y; Mouse_Down_Y=t;} + PType X_min = scale_X(this,(int) Mouse_Down_X); // Xmin+(Xmax-Xmin)*Mouse_Down_X/Graph->Width; + PType X_max = scale_X(this,(int) X ); //Xmin+(Xmax-Xmin)*X/Graph->Width; + PType Y_max = scale_Y(this,(int) Mouse_Down_Y); //Ymax+(Ymin-Ymax)*Mouse_Down_Y/Graph->Height; + PType Y_min = scale_Y(this,(int) Y); //Ymax+(Ymin-Ymax)*Y/Graph->Height; + // добавим поля + X_min -= 0.15*(X_max-X_min); + X_max += 0.15*(X_max-X_min); + Y_min -= 0.15*(Y_max-Y_min); + Y_max += 0.15*(Y_max-Y_min); + Xmin = X_min; + Xmax = X_max; + Ymin = Y_min; + Ymax = Y_max; + Mouse_Scale = false; + Graph_Refresh(this); + } +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::Fit_GraphClick(TObject *Sender) +{ + PType x_min, x_max, y_min, y_max; + unsigned n = X.size(); + if(n>0){ + // найдем максимумы и минимумы + x_min=X[0];x_max=X[0]; y_min=Y[0];y_max=Y[0]; + for(unsigned i=0; i<n; i++){ + if(X[i]<x_min) + x_min=X[i]; + if(X[i]>x_max) + x_max=X[i]; + if(Y[i]<y_min) + y_min=Y[i]; + if(Y[i]>y_max) + y_max=Y[i]; + } + // добавим поля + x_min -= 0.15*(x_max-x_min); + x_max += 0.15*(x_max-x_min); + y_min -= 0.15*(y_max-y_min); + y_max += 0.15*(y_max-y_min); + if(x_min == x_max) x_max += 1e-100; + if(y_min == y_max) y_max += 1e-100; + // установим + Xmin = x_min; + Xmax = x_max; + Ymin = y_min; + Ymax = y_max; + // перерисуем график + Graph_Refresh(this); + } +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::SaveClick(TObject *Sender) +{ + saveDlg->Filter = ".png|*.png|.bmp|*.bmp|любой файл|*.*"; + if( saveDlg->Execute() ){ + Graphics::TBitmap* bmp = new Graphics::TBitmap(); + bmp->Width = out->Width; + bmp->Height = out->Height; + bmp->Canvas->CopyRect(Rect, out->Canvas, Rect); + AnsiString Name = saveDlg->FileName; + if(saveDlg->FilterIndex==2) // .bmp + bmp->SaveToFile(Name); + else if(saveDlg->FilterIndex==1 || saveDlg->FilterIndex==3){ // .png + TPNGObject* png = new TPNGObject; + png->Assign(bmp); + png->SaveToFile(Name); + delete png; + } + delete bmp; + } + +} +//--------------------------------------------------------------------------- + +void __fastcall TfrmScope::FormShow(TObject *Sender) +{ + cmbBranches->Items->Clear(); + cmbPot1->Items->Clear(); + cmbPot2->Items->Clear(); + // набиваем списки ветвей и узлов значениями + for(unsigned i=0, n=obj->Out.Count(); i<n; i++){ // цикл по выводам + Pins* pins = &obj->Out[i]; + for(unsigned k=0, cnt_pins = pins->Count; k<cnt_pins; k++){ // цикл по выводам объекта + PPin *pin = &(*pins)[k]; + String Name = pins->Name + ":"; + switch(k){ + case _N_: Name += "N"; break; + case _A_: Name += "A"; break; + case _B_: Name += "B"; break; + case _C_: Name += "C"; break; + } + cmbBranches->AddItem(Name, (TObject*)pin); + cmbPot1->AddItem(Name, (TObject*)pin); + cmbPot2->AddItem(Name, (TObject*)pin); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TfrmScope::cmb_Timer_ValueChange(TObject *Sender) +{ + Timer->Interval = StrToInt(cmb_Timer_Value->Text); // время между обновлениями графика +} +//--------------------------------------------------------------------------- + +void __fastcall TfrmScope::FormClose(TObject *Sender, TCloseAction &Action) +{ + // остановим вывод графика + Timer->Enabled = false; + // ищем свой указатель в векторе и удаляем его + unsigned n = frmScope.size(); + for (unsigned i=0;i<n;i++) + if(frmScope[i] == this){ + frmScope.erase(frmScope.begin()+i); + break; + } + /* + caNone The form is not allowed to close, so nothing happens. + caHide The form is not closed, but just hidden. Your application can still access a hidden form. + caFree The form is closed and all allocated memory for the form is freed. + caMinimize The form is minimized, rather than closed. This is the default action for MDI child forms. + */ + Action = caFree; +} +//--------------------------------------------------------------------------- + diff --git a/Forms/Scope.ddp b/Forms/Scope.ddp new file mode 100644 index 0000000..cdc0ee8 Binary files /dev/null and b/Forms/Scope.ddp differ diff --git a/Forms/Scope.dfm b/Forms/Scope.dfm new file mode 100644 index 0000000..89fe8df --- /dev/null +++ b/Forms/Scope.dfm @@ -0,0 +1,207 @@ +object frmScope: TfrmScope + Left = 319 + Top = 190 + Width = 708 + Height = 406 + Caption = #1054#1089#1094#1080#1083#1086#1075#1088#1072#1092 + Color = clBtnFace + Constraints.MinHeight = 100 + Constraints.MinWidth = 100 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + OnClose = FormClose + OnDestroy = FormDestroy + OnHide = FormHide + OnMouseWheel = FormMouseWheel + OnPaint = FormPaint + OnResize = FormResize + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object Graph: TPaintBox + Left = 8 + Top = -4 + Width = 673 + Height = 293 + Cursor = crHandPoint + PopupMenu = PopupMenu + OnMouseDown = GraphMouseDown + OnMouseMove = GraphMouseMove + OnMouseUp = GraphMouseUp + end + object pnlControl: TPanel + Left = 0 + Top = 304 + Width = 673 + Height = 57 + TabOrder = 0 + OnResize = pnlControlResize + DesignSize = ( + 673 + 57) + object Label1: TLabel + Left = 500 + Top = 8 + Width = 164 + Height = 13 + Caption = #1042#1088#1077#1084#1103' '#1086#1073#1085#1086#1074#1083#1077#1085#1080#1103' '#1084#1089 + end + object btnStart: TButton + Left = 600 + Top = 32 + Width = 25 + Height = 25 + Anchors = [akRight, akBottom] + Caption = '>' + Default = True + TabOrder = 0 + OnClick = btnStartClick + end + object btnPause: TButton + Left = 624 + Top = 32 + Width = 25 + Height = 25 + Anchors = [akRight, akBottom] + Caption = '| |' + TabOrder = 1 + OnClick = btnPauseClick + end + object btnStop: TButton + Left = 648 + Top = 32 + Width = 25 + Height = 25 + Anchors = [akRight, akBottom] + Caption = '<|' + TabOrder = 2 + OnClick = btnStopClick + end + object rbCurrent: TRadioButton + Left = 40 + Top = 16 + Width = 41 + Height = 17 + Caption = #1058#1086#1082 + Checked = True + TabOrder = 3 + TabStop = True + end + object rbVoltage: TRadioButton + Left = 228 + Top = 16 + Width = 137 + Height = 17 + Caption = #1056#1072#1079#1085#1086#1089#1090#1100' '#1087#1086#1090#1077#1085#1094#1080#1072#1083#1086#1074 + TabOrder = 4 + end + object cmbBranches: TComboBox + Left = 40 + Top = 32 + Width = 170 + Height = 21 + BevelInner = bvNone + BevelKind = bkTile + ItemHeight = 13 + TabOrder = 5 + Text = '0' + end + object cmbPot1: TComboBox + Left = 228 + Top = 32 + Width = 170 + Height = 21 + BevelInner = bvNone + BevelKind = bkTile + ItemHeight = 13 + TabOrder = 6 + Text = '1' + end + object cmbPot2: TComboBox + Left = 404 + Top = 32 + Width = 170 + Height = 21 + BevelInner = bvNone + BevelKind = bkTile + ItemHeight = 13 + TabOrder = 7 + Text = '0' + end + object cmb_Timer_Value: TComboBox + Left = 598 + Top = 5 + Width = 50 + Height = 21 + BevelEdges = [] + BevelInner = bvLowered + BevelKind = bkFlat + BevelOuter = bvNone + Style = csDropDownList + Color = clBtnFace + DropDownCount = 10 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ItemHeight = 13 + ItemIndex = 8 + ParentFont = False + TabOrder = 8 + Text = '1000' + OnChange = cmb_Timer_ValueChange + Items.Strings = ( + '1' + '10' + '50' + '100' + '200' + '300' + '400' + '500' + '1000') + end + end + object Scroll: TScrollBar + Left = 0 + Top = 292 + Width = 669 + Height = 12 + PageSize = 0 + TabOrder = 1 + OnChange = ScrollChange + end + object Timer: TTimer + Enabled = False + Interval = 100 + OnTimer = TimerTimer + Left = 648 + Top = 8 + end + object PopupMenu: TPopupMenu + Left = 648 + Top = 32 + object mnu_Scale: TMenuItem + Caption = #1052#1072#1089#1096#1090#1072#1073' '#1087#1086' Y' + OnClick = mnu_ScaleClick + end + object Fit_Graph: TMenuItem + Caption = #1042#1087#1080#1089#1072#1090#1100' '#1075#1088#1072#1092#1080#1082' '#1074' '#1086#1082#1085#1086 + OnClick = Fit_GraphClick + end + object Save: TMenuItem + Caption = #1057#1086#1093#1088#1072#1085#1080#1090#1100' '#1075#1088#1072#1092#1080#1082 + OnClick = SaveClick + end + end + object saveDlg: TSaveDialog + DefaultExt = '.png' + Left = 352 + Top = 200 + end +end diff --git a/Forms/Scope.h b/Forms/Scope.h new file mode 100644 index 0000000..843e6c2 --- /dev/null +++ b/Forms/Scope.h @@ -0,0 +1,103 @@ +//--------------------------------------------------------------------------- + +#ifndef ScopeH +#define ScopeH +//--------------------------------------------------------------------------- +#include <Classes.hpp> +#include <Controls.hpp> +#include <StdCtrls.hpp> +#include <Forms.hpp> +#include <ExtCtrls.hpp> +#include <Menus.hpp> +#include <Dialogs.hpp> +//--------------------------------------------------------------------------- +#include <vector> +#include "model.h" +#include "pngimage.hpp" +//--------------------------------------------------------------------------- +class TfrmScope : public TForm +{ +__published: // IDE-managed Components + TTimer *Timer; + TPanel *pnlControl; + TButton *btnStart; + TButton *btnPause; + TButton *btnStop; + TRadioButton *rbCurrent; + TRadioButton *rbVoltage; + TComboBox *cmbBranches; + TComboBox *cmbPot1; + TComboBox *cmbPot2; + TPaintBox *Graph; + TScrollBar *Scroll; + TPopupMenu *PopupMenu; + TMenuItem *mnu_Scale; + TMenuItem *Fit_Graph; + TMenuItem *Save; + TSaveDialog *saveDlg; + TComboBox *cmb_Timer_Value; + TLabel *Label1; + void __fastcall TimerTimer(TObject *Sender); + void __fastcall btnStartClick(TObject *Sender); + void __fastcall btnPauseClick(TObject *Sender); + void __fastcall FormResize(TObject *Sender); + void __fastcall btnStopClick(TObject *Sender); + void __fastcall FormPaint(TObject *Sender); + void __fastcall pnlControlResize(TObject *Sender); + void __fastcall ScrollChange(TObject *Sender); + void __fastcall FormHide(TObject *Sender); + void __fastcall FormMouseWheel(TObject *Sender, TShiftState Shift, + int WheelDelta, TPoint &MousePos, bool &Handled); + void __fastcall mnu_ScaleClick(TObject *Sender); + void __fastcall GraphMouseDown(TObject *Sender, TMouseButton Button, + TShiftState Shift, int X, int Y); + void __fastcall GraphMouseMove(TObject *Sender, TShiftState Shift, + int X, int Y); + void __fastcall GraphMouseUp(TObject *Sender, TMouseButton Button, + TShiftState Shift, int X, int Y); + void __fastcall Fit_GraphClick(TObject *Sender); + void __fastcall SaveClick(TObject *Sender); + void __fastcall FormDestroy(TObject *Sender); + void __fastcall FormShow(TObject *Sender); + void __fastcall cmb_Timer_ValueChange(TObject *Sender); + void __fastcall FormClose(TObject *Sender, TCloseAction &Action); +private: // User declarations +public: // User declarations + __fastcall TfrmScope(TComponent* Owner); + PGrid *obj; + Graphics::TBitmap *out; + Types::TRect Rect; // какого размера прямоугольник canvas + TRect curve_Rect; // прямоугольник для вывода кривой + // предельные значения графика + PType Xmax; + PType Xmin; + PType Ymax; + PType Ymin; + vector<PType> X; + vector<PType> Y; + + bool fromPin; // снимаем показания с вывода, иначе с узла или ветки + bool fromPinBase; // снимаем показания с вывода, иначе с узла или ветки + PType *Signal; // выводимый сигнал + PType *SignalBase; // относительно какого сигнала + PPin* usePin; // с этого вывода снимаем показания + PPin* usePinBase; // измеряем потенциал относительно этого вывода + + double Grid_Step; // сетка графика. шаг + unsigned border_X; // поле по оси X + unsigned border_Y; // поле по оси Y + bool Scale_To; // по X или по Y будем мастабировать + int Mouse_Down_X; // координаты при нажании по мышке + int Mouse_Down_Y; // координаты при нажании по мышке + PType Mouse_Down_Xmin; // координаты при нажании по мышке + PType Mouse_Down_Xmax; // координаты при нажании по мышке + PType Mouse_Down_Ymin; // координаты при нажании по мышке + PType Mouse_Down_Ymax; // координаты при нажании по мышке + PType Main_X; PType Main_Y; // координаты главных (выделенных жирным) осей + bool Move_Graph; // перетаскиваем график + bool Mouse_Scale; // масштабируем график мышкой +}; +//--------------------------------------------------------------------------- +extern PACKAGE vector<TfrmScope*> frmScope; +//--------------------------------------------------------------------------- +#endif diff --git a/Forms/Scope.obj b/Forms/Scope.obj new file mode 100644 index 0000000..92bdea2 Binary files /dev/null and b/Forms/Scope.obj differ diff --git a/Forms/main.cpp b/Forms/main.cpp new file mode 100644 index 0000000..c85ea6e --- /dev/null +++ b/Forms/main.cpp @@ -0,0 +1,620 @@ +//--------------------------------------------------------------------------- + +#include <vcl.h> +#pragma hdrstop + +#include "main.h" +#include "Scope.h" +#include "ObectsLibrary.h" +#include "kernel.h" // хидер для работы с моделями +#include <fstream> +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma resource "*.dfm" +//TfrmMain *frmMain; +//FFT obj((double)T, (unsigned)N); +//Current_Transformer CT1; +/*PSource C; +PLine w1(2); +PConsumer H; +PTransformer_1 T1; +PTransformer_3 T3; +PSingleTransformer T0; +PCurrent_Transformer_1 TA; +PBreaker Q; +//--------------------------------------------------------------------------- +PType fa(PElement* obj, double &time){ return 100*sqrt(2)*(exp(-time/0.1)+sin(w*time));} //5773*sqrt(2)*sin(w*time); //93897 //8573 +PType fb(PElement* obj, double &time){ return 5773*sqrt(2)*sin(w*time-2*M_PI/3);} +PType fc(PElement* obj, double &time){ return 5773*sqrt(2)*sin(w*time+2*M_PI/3);} //9859 //900 +PType I_F(PType &F){ return 1e7*pow(F,7)+2*F;} // 3e18*pow(F,9)+10*F +PType I_F_TA(PType &F){ return 2e21*pow(F,7)+1e4*F;} // 3e18*pow(F,9)+10*F +PType U_I(PType &I){ return pow(I,1.7);} */ +//--------------------------------------------------------------------------- +void err(unsigned num, String text){ + static unsigned cnt=0; + cnt++; + //if(cnt>3) + // frmMain->Timer->Enabled = false; + ShowMessage(text); +} +//--------------------------------------------------------------------------- +__fastcall TfrmMain::TfrmMain(TComponent* Owner) + : TForm(Owner), LinkLines(this) +{ + // инициализируем объекта + grid = NULL; + LinkLines.Clear(); + Objects.clear(); + // компонент отображения связей + LinkLines.Parent = this; + LinkLines.OnDelete = LinkDelete; + LinkLines.OnAdd = LinkAdd; + // если главная форма и если передали параметр - открываем файл + if(Name == "frmMain") if( ParamCount()>0 ) OpenFile( ParamStr(1) ); + + // владелец создаваемых компонентов (может быть переопределен из-вне) + ComponentOwner = this; + // исключим мерцание + //DoubleBuffered = true; + + /*/ параметры генератора + C.Name = "G"; + C.Ea = fa; + C.Eb = fb; + C.Ec = fc; + C.R_[_A_] = 1.0; + C.R_[_N_] = 1e-6; + C.accept(); + + // параметры линии + w1.length = 10; + w1.R0[_A_] = 0.5; + w1.R0[_B_] = 0.5; + w1.R0[_C_] = 0.5; + w1.L0[_A_] = 0.667/314 ; + w1.L0[_B_] = 0.667/314 ; + w1.L0[_C_] = 0.667/314 ; + w1.M0[_AB_] = 0.267/314 ; + w1.M0[_BC_] = 0.267/314 ; + w1.M0[_CA_] = 0.267/314 ; + //w1.Gz_( 1e-5 ); + //w1.Cz_ ( 2e-7 ); + w1.accept(); + + // параметры нагрузки + H.R_[_A_] = 1322.5/sqrt(2); //11.0 //1322.5 + H.R_[_B_] = 1322.5/sqrt(2); + H.R_[_C_] = 1322.5/sqrt(2); + H.L_[_A_] = 1322.5/314.16/sqrt(2); + H.L_[_B_] = 1322.5/314.16/sqrt(2); + H.L_[_C_] = 1322.5/314.16/sqrt(2); + H.L_[_N_] = 1e-3; // нейтраль заземляем + H.accept(); + + // параметры трансформатора + T3.Name = "T"; + T3.U1 = 115000; + T3.U2 = 10500 ; + T3.S = 10e6 ; + T3.dPk = 58e3 ; + T3.Uk = 10.5 ; + T3.dPx = 14e3 ; + T3.Ix = 0.9 ; + T3.F_nom= 0.07 ; + T3.mType = Three_Rod; //Armored + T3.Winding_X1 = wGroundedStar; + T3.Winding_X2 = wTriangle; + T3.mCurve.func( I_F ); + T3.accept(); + // трансформатор тока + TA.R1 = 0; + TA.L1 = 0; + TA.R2 =0.96; // учтем нагрузку + TA.L2 =2.29e-3; + TA.n1 = 1; + TA.n2 = 20; + TA.I1 = 100; + TA.S = 30; + TA.K = 10; // токовая погрешность (класс точности) + TA.d = 1; // угловая погрешность + //TA.mCurve.func( I_F_TA ); + TA.accept(); + // выключатель + Q.Rmax = 1e6; + Q.accept(); */ + + /*PBreaker *G = new PBreaker(); + grid = new PGrid(G); + grid->Make_Equation(); + int i=0; + while (i<1e3){ + grid->calc(); + TIME += smp; + i++; + } + btnStart->Enabled = true;*/ + + /* + Преобразование Фурье + double i[3]; + CT1.get(i); + vector y = obj.calc(i[0]); + Out->Text = y.mod; + static int cnt; + cnt++; + lbl->Caption = cnt;*/ + /*/работа с матрицами + const unsigned n=3, m=3; + Matrix <double> A(n,m), B(n,m), S(m,n); + double C[n][m], D[n][m], E[m][n]; + for(unsigned i=0; i<n; i++) + for(unsigned j=0; j<m; j++){ + C[i][j] = 1.0*random(10); + A[i][j] = C[i][j]; + } + for(unsigned i=0; i<n; i++) + for(unsigned j=0; j<m; j++){ + D[i][j] = 1.0*random(10); + B[i][j] = D[i][j]; + } + //double det = B.det(); + S = B.inverse(); + S = S*B; + for(unsigned i=0; i<m; i++) + for(unsigned j=0; j<n; j++){ + E[i][j] = S[i][j]; + }*/ + // работа с моделью + //TPL w1[1]; + //PGrid grid(w1); +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::mnuScopeClick(TObject *Sender) +{ + // если рассчет разрешен + if(grid && btnStart->Enabled){ + frmScope.push_back(new TfrmScope(this)); + frmScope[frmScope.size()-1]->obj = grid; + frmScope[frmScope.size()-1]->Show(); + }else + err(1,"PowerSystem: перед вызовом осциллографа выполните сборку сети"); +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::btnStartClick(TObject *Sender) +{ + Timer->Enabled = !Timer->Enabled; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::btnPauseClick(TObject *Sender) +{ + Timer->Enabled = false; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::TimerTimer(TObject *Sender) +{ + for(unsigned i=0;i<50;i++){ + TIME += smp; + grid->calc(); + } + lblTime->Caption=FloatToStr(TIME); +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::FormDestroy(TObject *Sender) +{ + // Owner у grid не выставляется, а значит он чиститься автоматически в model.cpp + // в структуре PObjectList + //delete grid; grid = NULL; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::btnStopClick(TObject *Sender) +{ + Timer->Enabled=false; + TIME = 0; + lblTime->Caption=FloatToStr(TIME); +} +//--------------------------------------------------------------------------- +// Закрытие осциллогрфов +void TfrmMain::CloseScope(){ + /*if(frmScope.size()>0){ + err(_NOTICE_, "PowerSystem: перед удаление объекта закройте все осциллографы"); + return; + }*/ + for(int i=0, n=frmScope.size(); i<n; i++){ + frmScope[i]->Timer->Enabled = false; + delete frmScope[i]; frmScope[i] = NULL; + } + frmScope.clear(); +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::BuildGridClick(TObject *Sender) +{ + Timer->Enabled = false; // останавливаем рассчет + if(Objects.size()==0){ + err(_NOTICE_,"PowerSystem: в сети нет ни одного объекта для сборки"); + return; + } + // закрываем все открытые осциллографы + CloseScope(); + + static bool cntBuild = 0; // номер сборки сети + //if(cntBuild!=0) + // err(_NOTICE_,"PowerSystem: пересборка сети. Значения потенциалов и токов остаются из предшествующего рассчета."); + // удаляем старую сеть + delete grid; grid = NULL; + // вызовем метод accept() ля всех объектов + // это необходимо делать до связывания элементов, + // т.к. она может изменить информацию о внутренних связях + Pins_Link Link; + for(int i=0, n=Objects.size(); i<n; i++){ + Objects[i]->Obj()->accept(); + // найдем все подсети и спросим у них все соединения + // и выполним accept() у элементов подсети + if( (String)Objects[i]->ClassName() == "PGridComponent" ) + SubGrid_Accept( (PGridComponent*)Objects[i], Link); // можно сразу выяснить у указанной подсети ее связи (с учетом всех подсетей) + // Link.add( Objects[i]->Obg()->Links ) - это должно работать, но пока не оттестировано + // поэтому не применено, использовать в будущем. + } + // соединяем выводы + for(int i=0, n=LinkLines.Count(); i<n; i++) + Link.add(*LinkLines[i].First->Pin(), *LinkLines[i].Second->Pin()); + // создаем сеть + if(Link.Number()==0 && Objects.size()==1 && Objects[0]->Obj()->ClassName() != "PSubGrid") + grid = new PGrid((PUnit *)Objects[0]->Obj()); + else if( Objects.size() != 0 && Link.Number()!=0 ){ + grid = new PGrid(Link); + } + else{ + err(_ERROR_, "PowerSystem: не возможно собрать сеть, т.к. не указано ни одной связи между элементами"); + return; + } + if( grid->Make_Equation() ){ + // уравнения подготовлены без ошибок + btnStart->Enabled = true; + btnStart->SetFocus(); + mnuScope->Enabled = true; + // увеличиваем номер сборки сети (просто информация) + cntBuild++; + } + else{ + // были ошибки при сборке сети + delete grid; grid = NULL; + btnStart->Enabled = false; + mnuScope->Enabled = false; + } +} +//--------------------------------------------------------------------------- +// рекурчивно опросим подсети +void __fastcall TfrmMain::SubGrid_Accept(PGridComponent *ctrl, Pins_Link &Link){ + Link.add( ctrl->Obj()->Internal_Links ); + // найдем сети внутри этой сети + for(int i=0, n=ctrl->Objects.size();i < n; i++){ + // выполним accept() + PElement *obj = ctrl->Objects[i]->Obj(); + if(obj) + obj->accept(); + PGridComponent *pb = dynamic_cast<PGridComponent*>( ctrl->Objects[i] ); + if( pb ) + SubGrid_Accept( pb , Link); + } +} +//--------------------------------------------------------------------------- +/* Событие происходит при изменении элемента */ +void __fastcall TfrmMain::UnitChange(TObject *Sender){ + // при изменении свойств объекта, чтобы запустить расчет надо пересобрать сеть + // после пересборки кнопка старта активируется + Timer->Enabled = false; + btnStart->Enabled = false; + mnuScope->Enabled = false; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::UnitDelete(TObject *Sender){ + // закрываем все открытые осциллографы + CloseScope(); + // остановим рассчет и запретим продолжение + Timer->Enabled = false; + btnStart->Enabled = false; + mnuScope->Enabled = false; + // удаляем компонент из списка + /*for(int i=0, n=Objects.size(); i<n; i++) + if(Objects[i] == (PBase*)Sender) + Objects.erase(Objects.begin() + i);*/ + vector<PBase*>::iterator iter = Objects.begin(); + while( iter != Objects.end() ) + { + if( *iter == (PBase*)Sender){ + Objects.erase( iter ); + break;} + else + ++iter; + } + // удаляем все связи с этим объектом + PElement* obj = ((PBase*)Sender)->Obj(); + for(int i=0, n=obj->Out.Count(); i<n; i++) + for(int j=0, m=obj->Out[i].Count; j<m; j++) + LinkLines.Delete( &obj->Out[i][j] ); // удалим все связи, связанные с выводом + // перерисуем связи + LinkLines.Paint(); +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::LinkDelete(PLinkComponent *Sender){ + // остановим рассчет и запретим продолжение + Timer->Enabled = false; + btnStart->Enabled = false; + mnuScope->Enabled = false; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::LinkAdd(PLinkComponent *Sender){ // вызывается при изменении связей + // остановим рассчет и запретим продолжение + Timer->Enabled = false; + btnStart->Enabled = false; + mnuScope->Enabled = false; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::PinMouseDown(TObject* Sender, TMouseButton Button, Classes::TShiftState Shift, int X, int Y){ + if(Shift.Contains(ssLeft)&&Shift.Contains(ssShift)) // был нажат шифр + // отобразим осциллограф + if( grid && mnuScope->Enabled ){ + frmScope.push_back(new TfrmScope(this)); + frmScope[frmScope.size()-1]->obj = grid; + String name = ((PPinControl*)Sender)->Pin()->Obj()->Name + ":" + IntToStr(((PPinControl*)Sender)->Pin()->Node()); + String name2 = ((PPinControl*)Sender)->Pin()->Obj()->Name + ":" + IntToStr( (TObject*)((PPinControl*)Sender) -> Pin() ->Obj() -> Grounded_Node ); + // отобразим потенциал узла относительно заземленной узла + frmScope[frmScope.size()-1]->cmbPot1->AddItem(name, NULL); + frmScope[frmScope.size()-1]->cmbPot1->ItemIndex = 0; + frmScope[frmScope.size()-1]->cmbPot2->AddItem(name2, NULL); + frmScope[frmScope.size()-1]->cmbPot2->ItemIndex = 0; + frmScope[frmScope.size()-1]->rbVoltage->Checked = true; + frmScope[frmScope.size()-1]->Show(); + }else + err(1,"PowerSystem: перед вызовом осциллографа выполните сборку сети"); +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::PinDragDrop (System::TObject* Sender, System::TObject* Source, int X, int Y){ + // если перетащили на самого себя, то не добавляем + if( Sender == Source ) return; + // сохраняем информацию графической о связи + Pair_PinConrtol pcon; + pcon.First = (PPinControl*)Source; + pcon.Second= (PPinControl*)Sender; + LinkLines.Add(pcon); + // отобразим связь + LinkLines.Paint(); +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::FormDragOver(TObject *Sender, TObject *Source, + int X, int Y, TDragState State, bool &Accept) +{ + Accept = false; + // если в процессе соединения выводов + if(PPinControl *pc = dynamic_cast<PPinControl*>(Source)){ + int from_X = pc->Left + pc->Width/2; + int from_Y = pc->Top + pc->Height/2; + TColor color = Canvas->Pen->Color; + Canvas->Pen->Color = clBlack; + Repaint(); // очищаем все временные линии + Canvas->MoveTo(from_X, from_Y); + Canvas->LineTo(X, Y); + Canvas->Pen->Color = color; + Accept = true; + } + // перетащили новый объект из библиоьеки компонентов + else if(Source->ClassNameIs("TTreeView")){ + Accept = true; + } +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::FormPaint(TObject *Sender) +{ + // рисуем линии PaintLines() + LinkLines.Paint(); +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::FormDragDrop(TObject *Sender, TObject *Source, + int X, int Y) +{ + // очищаем все временные линии созданные при соединении выводов + if(Source->ClassNameIs("PPinControl")) + Repaint(); + // перетащили новый объект из библиоьеки компонентов + else if(Source->ClassNameIs("TTreeView")){ + TTreeView *obj = (TTreeView*)Source; + int n = obj->Selected->AbsoluteIndex; + if ( n != -1){ + TTreeNode *Node = obj->Items->Item[n]; + if(Node != NULL){// && !Node->HasChildren){ + // создаем элемент + // сохраняем его в списке и применяем параметры по умолчанию + TTreeNode *Prev = obj->Selected; + String Adress = Prev->Text; + while ( Prev ){ + if ( Prev->HasChildren ) Adress = Prev -> Text + "\\" + Adress; + Prev = Prev->Parent; + } + AddObject( Adress, X, Y); + } + } + } +} +//--------------------------------------------------------------------------- +void TfrmMain::AddObject(String TypeName, int X, int Y){ // список TypeName - передается из frmObjLib->tvList + String cName = ""; + String ClassName = "PBase"; + if(TypeName == "Источники\\Генератор трехфазный") cName = "PSource"; + else if(TypeName == "Трансформаторы\\Силовые\\Трехфазный") cName = "PTransformer_3"; + else if(TypeName == "Трансформаторы\\Силовые\\Однофазный") cName = "PTransformer_1"; + else if(TypeName == "Трансформаторы\\Тока\\Однофазный") cName = "PCurrent_Transformer_1"; + else if(TypeName == "Линии\\Одноцепная без ГТ") cName = "PLine"; + else if(TypeName == "Потребители\\Трехфазный") cName = "PConsumer"; + else if(TypeName == "Коммутационная аппаратура\\Выключатель")cName = "PBreaker"; + else if(TypeName == "Подсеть") {cName = "PSubGrid"; ClassName = "PGridComponent"; } + // сохраняем его в списке и применяем параметры по умолчанию + if(cName!=""){ + // добавить компонент-модель + CreateControl(ClassName, cName); + PBase *control = Objects.back(); + control->Left = X - control->Width/2; + control->Top = Y - control->Height/2; + } + else{ + err(_WARNING_, "PowerSystem: не определено действие для создания указанного компонента из Библиотеки объектов"); + } +} +//--------------------------------------------------------------------------- +void TfrmMain::CreateControl(String Class, String ModelClass){ + // добавить компонент-модель + PBase *control; + TComponent *owner; + if(ComponentOwner) owner = ComponentOwner; + else owner = this; + if(Class == "PGridComponent") control = new PGridComponent( owner ); + else control = new PBase( owner ); + AddControl( control ); // добавить компонент в список отображаемых и установить параметры + control->ObjType( ModelClass ); // ассоциируем компонент с моделью типа +} +//--------------------------------------------------------------------------- +// добавить компонент в список отображаемых и установить параметры +void TfrmMain::AddControl(PBase *control){ + control->Parent = this; + control->OnChange = UnitChange; + control->OnPinMouseDown = PinMouseDown; + control->OnPinDragDrop = PinDragDrop; + control->OnDelete = UnitDelete; + Objects.push_back( control ); // сохраняем в список компонентов +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::mnuObjLibClick(TObject *Sender) +{ + // вызов библиотеки объектов + TfrmObjLib *frmOL = new TfrmObjLib(this); + frmOL->Show(); +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::FormMouseDown(TObject *Sender, + TMouseButton Button, TShiftState Shift, int X, int Y) +{ + // щелкнули правую кнопку + if(Button == mbRight){ + // может мы указываем на линию связи? + LinkLines.ShowMenuFor( X, Y ); + } +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::mnuSaveClick(TObject *Sender) +{ + // останавливаем рассчет + Timer->Enabled = false; + /*/ проверка имен всех объектов + for(int i=0, n=Objects.size(); i<n; i++){ + String testName = Objects[i]->Obj()->Name; + for(int j=i+1; j<n; j++) + if( testName == Objects[j]->Obj()->Name ){ + err(_ERROR_, "PoserSystem: в пределах сети не должно быть двух объектов с одинаковыми именами ("+ testName+"). Сохранение прервано."); + return; + } + } */ + // выводим диалог и сохраняем + saveDlg->Filter = ".psf|*.psf|любой файл|*.*"; + if( saveDlg->Execute() ){ + AnsiString Name = saveDlg->FileName; + ofstream out(Name.c_str()); + if(out){ + // сохраняем объекты + int n = Objects.size(); + out << n << " "; + for(int i=0; i<n; i++) { + out << StringForSave( &(String)Objects[i]->ClassName() ) << " "; + Objects[i]->Save( out ); + } + // сохраним информацию о связях + LinkLines.Save( out ); + } + } +} +//--------------------------------------------------------------------------- +PElement* TfrmMain::FindObj(String Name){ + for(int i=0, n=Objects.size(); i<n; i++) + if( Name == Objects[i]->Obj()->Name ) + return Objects[i]->Obj(); + return NULL; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::mnuOpenClick(TObject *Sender) +{ + // закрываем все открытые осциллографы + CloseScope(); + // останавливаем рассчет + Timer->Enabled = false; + btnStart->Enabled = false; + mnuScope->Enabled = false; + // выводим диалог и открываем + openDlg->Filter = ".psf|*.psf|любой файл|*.*"; + if( openDlg->Execute() ){ + OpenFile(openDlg->FileName); + } +} +//--------------------------------------------------------------------------- +void TfrmMain::OpenFile(String name){ + ifstream in(name.c_str()); + if(in){ + // очищаем существующую сеть + mnuNewClick(NULL); + // сохраняем объекты + int n; + in >> n; + for(int i=0; i<n; i++) { + // читаем тип + char cname[1024]; + in >> cname; String cName = cname; + // добавляем компонент, указывающий на нулевую модель + CreateControl( cName, "" ); + // загружаем параметры компонента + Objects.back()->Read( in ); + } + // загружаем информацию о связях + LinkLines.Read( in ); + // Изменяем заголовок окна + if( Name.Length() < 32 ) + Caption = name; + else + Caption = name.SubString(Name.Length()-32, 32); + } +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::mnuNewClick(TObject *Sender) +{ + // закрываем все открытые осциллографы + CloseScope(); + //обнуляем время + Timer->Enabled = false; + btnStart->Enabled = false; + mnuScope->Enabled = false; + TIME = 0; + lblTime->Caption = 0; + // очищаем существующую сеть + for(int i=0, n=Objects.size(); i<n; i++) + delete Objects[i]; + Objects.clear(); + LinkLines.Clear(); + // удаляем сеть + delete grid; grid = NULL; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::mnuAboutClick(TObject *Sender) +{ + MessageBoxA(NULL, + "Power System \nВерсия: 0.1 ( Violet ) \nАвторы: Ананьев В., Бычина Е. (с)2012", + "About", + MB_OK | MB_ICONINFORMATION); + +} +//--------------------------------------------------------------------------- +void __fastcall TfrmMain::FormResize(TObject *Sender) +{ + //Bevel->Left = Width - 161; + btnStart->Left = Width - 89; + btnPause->Left = Width - 65; + btnStop->Left = Width - 41; + lblTime->Left = Width - 153; + lblSec->Left = Width - 113; +} + diff --git a/Forms/main.ddp b/Forms/main.ddp new file mode 100644 index 0000000..1ffab2a Binary files /dev/null and b/Forms/main.ddp differ diff --git a/Forms/main.dfm b/Forms/main.dfm new file mode 100644 index 0000000..27fa910 --- /dev/null +++ b/Forms/main.dfm @@ -0,0 +1,134 @@ +object frmMain: TfrmMain + Left = 185 + Top = 196 + Width = 913 + Height = 478 + Caption = 'Power System' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Menu = MainMenu1 + OldCreateOrder = False + Position = poScreenCenter + OnDestroy = FormDestroy + OnDragDrop = FormDragDrop + OnDragOver = FormDragOver + OnMouseDown = FormMouseDown + OnPaint = FormPaint + OnResize = FormResize + PixelsPerInch = 96 + TextHeight = 13 + object lblSec: TLabel + Left = 800 + Top = 8 + Width = 21 + Height = 13 + Caption = #1089#1077#1082'.' + end + object lblTime: TStaticText + Left = 760 + Top = 8 + Width = 40 + Height = 20 + Hint = #1058#1077#1082#1091#1097#1077#1077' '#1074#1088#1077#1084#1103 + AutoSize = False + Caption = '0' + ParentShowHint = False + ShowHint = True + TabOrder = 0 + end + object btnStart: TButton + Left = 824 + Top = 0 + Width = 25 + Height = 25 + Hint = #1057#1090#1072#1088#1090 + Caption = '>' + Default = True + Enabled = False + ParentShowHint = False + ShowHint = True + TabOrder = 1 + OnClick = btnStartClick + end + object btnPause: TButton + Left = 848 + Top = 0 + Width = 25 + Height = 25 + Hint = #1055#1072#1091#1079#1072 + Caption = '| |' + ParentShowHint = False + ShowHint = True + TabOrder = 2 + OnClick = btnPauseClick + end + object btnStop: TButton + Left = 872 + Top = 0 + Width = 25 + Height = 25 + Hint = #1055#1088#1080#1085#1103#1090#1100' '#1101#1090#1086#1090' '#1084#1086#1084#1077#1085#1090' '#1074#1088#1077#1084#1077#1085#1080' '#1079#1072' 0' + Caption = '< |' + ParentShowHint = False + ShowHint = True + TabOrder = 3 + OnClick = btnStopClick + end + object MainMenu1: TMainMenu + Left = 32 + object mnuFile: TMenuItem + Caption = #1060#1072#1081#1083 + object mnuNew: TMenuItem + Caption = #1057#1086#1079#1076#1072#1090#1100' '#1087#1088#1086#1077#1082#1090 + OnClick = mnuNewClick + end + object mnuSave: TMenuItem + Caption = #1057#1086#1093#1088#1072#1085#1080#1090#1100 + OnClick = mnuSaveClick + end + object mnuOpen: TMenuItem + Caption = #1054#1090#1082#1088#1099#1090#1100 + OnClick = mnuOpenClick + end + end + object mnuTools: TMenuItem + Caption = #1048#1085#1089#1090#1088#1091#1084#1077#1085#1090#1099 + object BuildGrid: TMenuItem + Caption = #1057#1073#1086#1088#1082#1072' '#1089#1077#1090#1080 + OnClick = BuildGridClick + end + object mnuObjLib: TMenuItem + Caption = #1041#1080#1073#1083#1080#1086#1090#1077#1082#1072' '#1086#1073#1098#1077#1082#1090#1086#1074 + OnClick = mnuObjLibClick + end + object mnuScope: TMenuItem + Caption = #1054#1089#1094#1080#1083#1086#1075#1088#1072#1092 + Enabled = False + OnClick = mnuScopeClick + end + end + object mnuHelp: TMenuItem + Caption = #1057#1087#1088#1072#1074#1082#1072 + object mnuAbout: TMenuItem + Caption = #1054' '#1087#1088#1086#1075#1088#1072#1084#1084#1077 + OnClick = mnuAboutClick + end + end + end + object Timer: TTimer + Enabled = False + Interval = 1 + OnTimer = TimerTimer + end + object saveDlg: TSaveDialog + DefaultExt = '.png' + Left = 64 + end + object openDlg: TOpenDialog + Left = 96 + end +end diff --git a/Forms/main.h b/Forms/main.h new file mode 100644 index 0000000..3e88380 --- /dev/null +++ b/Forms/main.h @@ -0,0 +1,86 @@ +//--------------------------------------------------------------------------- + +#ifndef mainH +#define mainH +//--------------------------------------------------------------------------- +#include <Classes.hpp> +#include <Controls.hpp> +#include <StdCtrls.hpp> +#include <Forms.hpp> +#include <Buttons.hpp> +#include <Mask.hpp> +#include <Menus.hpp> +#include <ExtCtrls.hpp> +#include "PBase.h" // хидер базового графического-компонента для модели +#include "PGridComponent.h" // хидер графического-компонента "Сеть" +#include <Dialogs.hpp> +//--------------------------------------------------------------------------- +class TfrmMain : public TForm +{ +__published: // IDE-managed Components + TStaticText *lblTime; + TMainMenu *MainMenu1; + TMenuItem *mnuFile; + TMenuItem *mnuTools; + TMenuItem *mnuScope; + TButton *btnStart; + TButton *btnPause; + TButton *btnStop; + TMenuItem *BuildGrid; + TMenuItem *mnuObjLib; + TTimer *Timer; + TMenuItem *mnuSave; + TMenuItem *mnuOpen; + TSaveDialog *saveDlg; + TOpenDialog *openDlg; + TMenuItem *mnuNew; + TLabel *lblSec; + TMenuItem *mnuHelp; + TMenuItem *mnuAbout; + void __fastcall mnuScopeClick(TObject *Sender); + void __fastcall btnStartClick(TObject *Sender); + void __fastcall btnPauseClick(TObject *Sender); + void __fastcall TimerTimer(TObject *Sender); + void __fastcall FormDestroy(TObject *Sender); + void __fastcall btnStopClick(TObject *Sender); + void __fastcall BuildGridClick(TObject *Sender); + void __fastcall FormDragOver(TObject *Sender, TObject *Source, int X, + int Y, TDragState State, bool &Accept); + void __fastcall FormPaint(TObject *Sender); + void __fastcall FormDragDrop(TObject *Sender, TObject *Source, int X, + int Y); + void __fastcall mnuObjLibClick(TObject *Sender); + void __fastcall FormMouseDown(TObject *Sender, TMouseButton Button, + TShiftState Shift, int X, int Y); + void __fastcall mnuSaveClick(TObject *Sender); + void __fastcall mnuOpenClick(TObject *Sender); + void __fastcall mnuNewClick(TObject *Sender); + void __fastcall mnuAboutClick(TObject *Sender); + void __fastcall FormResize(TObject *Sender); +private: // User declarations + void AddObject(String TypeName, int X, int Y); + void CreateControl(String Class, String ModelClass); // создать новый компонент + void __fastcall PaintLines(); // прорисовывает необходимые линии + void __fastcall UnitChange(TObject *Sender); + void __fastcall UnitDelete(TObject *Sender); + void __fastcall LinkDelete(PLinkComponent *Sender); // вызывается при удалении связи + void __fastcall LinkAdd(PLinkComponent *Sender); // вызывается при изменении связей + void __fastcall SubGrid_Accept(PGridComponent *ctrl, Pins_Link &Link); + void CloseScope(); // закрытие осциллографов + PGrid *grid; // это сеть, которая будет собираться + void __fastcall PinMouseDown(TObject* Sender, TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + void __fastcall PinDragDrop (System::TObject* Sender, System::TObject* Source, int X, int Y); + vector<PBase*> Objects; // список всех объектов на форме + PElement* FindObj(String Name); + PLinkComponent LinkLines; // связи между выводами + void OpenFile(String name); // открыть указанный файл + TComponent* ComponentOwner; // если указан, владельцем всех созданных компонентов становится он + void AddControl(PBase *control); // добавить компонент в список отображаемых и установить параметры +public: // User declarations + __fastcall TfrmMain(TComponent* Owner); + }; +//--------------------------------------------------------------------------- +//extern PACKAGE TfrmMain *frmMain; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +#endif diff --git a/Forms/main.obj b/Forms/main.obj new file mode 100644 index 0000000..6ca170c Binary files /dev/null and b/Forms/main.obj differ diff --git a/Icon.ico b/Icon.ico new file mode 100644 index 0000000..a0e2fb1 Binary files /dev/null and b/Icon.ico differ diff --git a/Install/PowerSystem.exe b/Install/PowerSystem.exe new file mode 100644 index 0000000..a245207 Binary files /dev/null and b/Install/PowerSystem.exe differ diff --git a/Install/ReadMe.txt b/Install/ReadMe.txt new file mode 100644 index 0000000..1203662 --- /dev/null +++ b/Install/ReadMe.txt @@ -0,0 +1,24 @@ +Чтобы была возможность открывать сохраненные программой двойным кликом мыши, выполнить: + 1. Открыть с помощью + 2. Указать петь к программе PowerSystem.exe + +Release Notes +---------------------------------------------------- Версия 0.1 ( Violet ) ----------------------------------------------------------------- +0.1.1 Первая стабильная версия, обладающая возможностью сохранения + +0.1.2 версия, в которую добавлен компонент "подсеть". Позволяет создавать сеть, включающую подсети любого уровня вложенности друг в друга. + Эта версия все еще может открывать файлы созданные версией 0.1.1 + +0.1.3 Не читает файлы сохраненные версией 0.1.2. + В версию добавлено: + 1) внутри сетей имена элементов должны быть уникальными, каждый элемент имеет имя (напр: T1) и полное имя, которые указывает принадлежность + объекта подсетям (напр: ОЭС_Центра.Нижегородские_сети.Т1). Но разные объекты с могут иметь одинаковое имя, если они принадлежат разным сетям + 2) в списках осциллографа выводятся полное имя объекта + 3) выводы подсети в окне (редактирования подсетей) выделены красным цветом + Исправлены баги: + 1) при редактировании компонента подсеть и, если в редакторе нет ни одного объекта, нельзя было выйти из редактора, чтобы удалить компонет + 2) исключена возможность воздания связи вывода с самим собой + 3) если программа находится в режиме рассета сети (бежит время), теперь при создании связи рассчет прекращается + 4) ранее при завершении редактирования подсети и закрытии окна редактирования происходило удаление всех связей с редактируемым компонентом, + теперь удаление связей происходит лишь в случае, если изменились выводы компонента (чистка связей необходима, т.к. связи могут ссылаться на + удаленные выводы) \ No newline at end of file diff --git "a/Install/\320\237\321\200\320\270\320\274\320\265\321\200\321\213 \321\201\321\205\320\265\320\274/\320\222\321\213\321\201\321\210\320\270\320\265_\320\263\320\260\321\200\320\274\320\276\320\275\320\270\320\272\320\270.psf" "b/Install/\320\237\321\200\320\270\320\274\320\265\321\200\321\213 \321\201\321\205\320\265\320\274/\320\222\321\213\321\201\321\210\320\270\320\265_\320\263\320\260\321\200\320\274\320\276\320\275\320\270\320\272\320\270.psf" new file mode 100644 index 0000000..e9a3f5a --- /dev/null +++ "b/Install/\320\237\321\200\320\270\320\274\320\265\321\200\321\213 \321\201\321\205\320\265\320\274/\320\222\321\213\321\201\321\210\320\270\320\265_\320\263\320\260\321\200\320\274\320\276\320\275\320\270\320\272\320\270.psf" @@ -0,0 +1 @@ +4 PBase PBase1 161 67 70 70 3 2 1 0 1 PSource G1 N 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 sin:50:1 PBase PBase2 68 166 70 70 1 0 2 3 1 PSource G2 N 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 sin:100:0,5 PBase PBase3 160 241 70 70 2 3 0 1 1 PSource G3 N 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 sin:250:0,2 PBase PBase4 263 166 70 70 0 1 3 2 1 PLine 1 ЛЭП N 1 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 12 PBase1_0_0 PBase2_0_0 PBase1_0_1 PBase2_0_1 PBase1_0_2 PBase2_0_2 PBase1_0_3 PBase2_0_3 PBase3_0_0 PBase1_0_0 PBase3_0_1 PBase1_0_1 PBase3_0_2 PBase1_0_2 PBase3_0_3 PBase1_0_3 PBase2_0_0 PBase4_0_0 PBase2_0_1 PBase4_0_1 PBase2_0_2 PBase4_0_2 PBase2_0_3 PBase4_0_3 \ No newline at end of file diff --git "a/Install/\320\237\321\200\320\270\320\274\320\265\321\200\321\213 \321\201\321\205\320\265\320\274/\320\232\320\227_\320\275\320\260_\320\273\320\270\320\275\320\270\320\270.psf" "b/Install/\320\237\321\200\320\270\320\274\320\265\321\200\321\213 \321\201\321\205\320\265\320\274/\320\232\320\227_\320\275\320\260_\320\273\320\270\320\275\320\270\320\270.psf" new file mode 100644 index 0000000..c4c17ae --- /dev/null +++ "b/Install/\320\237\321\200\320\270\320\274\320\265\321\200\321\213 \321\201\321\205\320\265\320\274/\320\232\320\227_\320\275\320\260_\320\273\320\270\320\275\320\270\320\270.psf" @@ -0,0 +1 @@ +2 PBase PBase1 132 160 70 70 1 0 2 3 1 PSource G N 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 sin:50:10000 PBase PBase2 293 160 70 70 0 1 3 2 1 PLine 1 ЛЭП N 10 0.001 0 0 1e-08 0 0.5 0.00212 0 1e-08 0 0.5 0.00212 0 1e-08 0 0.5 0.00212 0 1e-08 0 0.00085 1e-08 0 0.00085 1e-08 0 0.00085 1e-08 0 4 PBase1_0_0 PBase2_0_0 PBase1_0_1 PBase2_0_1 PBase1_0_2 PBase2_0_2 PBase1_0_3 PBase2_0_3 \ No newline at end of file diff --git "a/Install/\320\237\321\200\320\270\320\274\320\265\321\200\321\213 \321\201\321\205\320\265\320\274/\320\237\320\276\320\264\321\201\320\265\321\202\321\214.psf" "b/Install/\320\237\321\200\320\270\320\274\320\265\321\200\321\213 \321\201\321\205\320\265\320\274/\320\237\320\276\320\264\321\201\320\265\321\202\321\214.psf" new file mode 100644 index 0000000..9edef74 --- /dev/null +++ "b/Install/\320\237\321\200\320\270\320\274\320\265\321\200\321\213 \321\201\321\205\320\265\320\274/\320\237\320\276\320\264\321\201\320\265\321\202\321\214.psf" @@ -0,0 +1 @@ +2 PGridComponent PGridComponent1 328 97 70 70 1 0 2 3 1 PSubGrid Сеть1 N 4 PBase PBase1 69 113 70 70 1 0 2 3 1 PSource G N 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 sin:50:10000 PBase PBase3 300 113 70 70 0 1 3 2 1 PLine 1 ЛЭП N 1 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 PBase PBase4 404 113 70 70 0 1 3 2 1 PTransformer_3 Тр N 1837.76 69.835 10000 380 1e+07 0 0.001 0 0.001 50 0.01 1 0 0 0 PBase PBase2 180 113 70 70 0 1 3 2 1 PBreaker Q N 1e+08 0.001 0.2 0.05 0.08 1 12 PBase1_0_0 PBase2_0_0 PBase1_0_1 PBase2_0_1 PBase1_0_2 PBase2_0_2 PBase1_0_3 PBase2_0_3 PBase2_1_0 PBase3_0_0 PBase2_1_1 PBase3_0_1 PBase2_1_2 PBase3_0_2 PBase2_1_3 PBase3_0_3 PBase3_1_0 PBase4_0_0 PBase3_1_1 PBase4_0_1 PBase3_1_2 PBase4_0_2 PBase3_1_3 PBase4_0_3 Тр.X2 PBase PBase1 476 97 70 70 0 1 3 2 1 PConsumer Нагр N 1 0 0 1e-08 0 1 0 0 1e-08 0 1 0 0 1e-08 0 1 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 no 4 PGridComponent1_0_0 PBase1_0_0 PGridComponent1_0_1 PBase1_0_1 PGridComponent1_0_2 PBase1_0_2 PGridComponent1_0_3 PBase1_0_3 \ No newline at end of file diff --git "a/Install/\320\237\321\200\320\270\320\274\320\265\321\200\321\213 \321\201\321\205\320\265\320\274/\320\237\320\276\320\264\321\201\320\265\321\202\321\214_\321\201\320\276\320\264\320\265\321\200\320\266\320\260\321\211\320\260\321\217_\320\277\320\276\320\264\321\201\320\265\321\202\321\214.psf" "b/Install/\320\237\321\200\320\270\320\274\320\265\321\200\321\213 \321\201\321\205\320\265\320\274/\320\237\320\276\320\264\321\201\320\265\321\202\321\214_\321\201\320\276\320\264\320\265\321\200\320\266\320\260\321\211\320\260\321\217_\320\277\320\276\320\264\321\201\320\265\321\202\321\214.psf" new file mode 100644 index 0000000..a87d9c7 --- /dev/null +++ "b/Install/\320\237\321\200\320\270\320\274\320\265\321\200\321\213 \321\201\321\205\320\265\320\274/\320\237\320\276\320\264\321\201\320\265\321\202\321\214_\321\201\320\276\320\264\320\265\321\200\320\266\320\260\321\211\320\260\321\217_\320\277\320\276\320\264\321\201\320\265\321\202\321\214.psf" @@ -0,0 +1 @@ +2 PGridComponent PGridComponent1 270 98 70 70 1 0 2 3 1 PSubGrid Сеть1 N 6 PBase PBase1 69 113 70 70 1 0 2 3 1 PSource G N 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 sin:50:10000 PBase PBase3 300 113 70 70 0 1 3 2 1 PLine 1 ЛЭП N 1 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 PBase PBase4 404 113 70 70 0 1 3 2 1 PTransformer_3 Тр N 1837.76 69.835 10000 380 1e+07 0 0.001 0 0.001 50 0.01 1 0 0 0 PBase PBase2 180 113 70 70 0 1 3 2 1 PBreaker Q N 1e+08 0.001 0.2 0.05 0.08 1 PGridComponent PGridComponent1 489 113 70 70 0 1 3 2 1 PSubGrid Сеть2 N 2 PBase PBase1 270 115 70 70 0 1 3 2 1 PLine 1 w1 N 1 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 PBase PBase2 390 115 70 70 0 1 3 2 1 PLine 10 w2 N 1 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 4 PBase1_1_0 PBase2_0_0 PBase1_1_1 PBase2_0_1 PBase1_1_2 PBase2_0_2 PBase1_1_3 PBase2_0_3 w1.X1;w2.X2 PBase PBase5 604 113 70 70 0 1 3 2 1 PLine 3 w3 N 1 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 20 PBase1_0_0 PBase2_0_0 PBase1_0_1 PBase2_0_1 PBase1_0_2 PBase2_0_2 PBase1_0_3 PBase2_0_3 PBase2_1_0 PBase3_0_0 PBase2_1_1 PBase3_0_1 PBase2_1_2 PBase3_0_2 PBase2_1_3 PBase3_0_3 PBase3_1_0 PBase4_0_0 PBase3_1_1 PBase4_0_1 PBase3_1_2 PBase4_0_2 PBase3_1_3 PBase4_0_3 PBase4_1_0 PGridComponent1_0_0 PBase4_1_1 PGridComponent1_0_1 PBase4_1_2 PGridComponent1_0_2 PBase4_1_3 PGridComponent1_0_3 PGridComponent1_1_0 PBase5_0_0 PGridComponent1_1_1 PBase5_0_1 PGridComponent1_1_2 PBase5_0_2 PGridComponent1_1_3 PBase5_0_3 w3.X2 PBase PBase1 410 98 70 70 0 1 3 2 1 PConsumer Нагр N 1 0 0 1e-08 0 1 0 0 1e-08 0 1 0 0 1e-08 0 1 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 no 4 PGridComponent1_0_0 PBase1_0_0 PGridComponent1_0_1 PBase1_0_1 PGridComponent1_0_2 PBase1_0_2 PGridComponent1_0_3 PBase1_0_3 \ No newline at end of file diff --git "a/Install/\320\237\321\200\320\270\320\274\320\265\321\200\321\213 \321\201\321\205\320\265\320\274/\320\237\321\200\320\276\321\201\321\202\320\265\320\271\321\210\320\260\321\217_\321\201\320\265\321\202\321\214.psf" "b/Install/\320\237\321\200\320\270\320\274\320\265\321\200\321\213 \321\201\321\205\320\265\320\274/\320\237\321\200\320\276\321\201\321\202\320\265\320\271\321\210\320\260\321\217_\321\201\320\265\321\202\321\214.psf" new file mode 100644 index 0000000..a277c62 --- /dev/null +++ "b/Install/\320\237\321\200\320\270\320\274\320\265\321\200\321\213 \321\201\321\205\320\265\320\274/\320\237\321\200\320\276\321\201\321\202\320\265\320\271\321\210\320\260\321\217_\321\201\320\265\321\202\321\214.psf" @@ -0,0 +1 @@ +6 PBase PBase1 69 113 70 70 1 0 2 3 1 PSource G N 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 sin:50:10000 PBase PBase3 300 113 70 70 0 1 3 2 1 PLine 1 ЛЭП N 1 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 PBase PBase4 404 113 70 70 0 1 3 2 1 PTransformer_3 Тр N 1837.76 69.835 10000 380 1e+07 0 0.001 0 0.001 50 0.01 1 0 0 0 PBase PBase5 505 184 70 70 2 3 0 1 1 PCurrent_Transformer_1 TA N 1 20 100 5 10 0.5 1 50 0.000319958 0 0.001 0.1 0 1e-06 PBase PBase2 180 113 70 70 0 1 3 2 1 PBreaker Q N 1e+08 0.001 0.2 0.05 0.08 1 PBase PBase6 627 113 70 70 0 1 3 2 1 PConsumer Нагр N 1 0 0 1e-08 0 1 0 0 1e-08 0 1 0 0 1e-08 0 1 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 no 18 PBase1_0_0 PBase2_0_0 PBase1_0_1 PBase2_0_1 PBase1_0_2 PBase2_0_2 PBase1_0_3 PBase2_0_3 PBase2_1_0 PBase3_0_0 PBase2_1_1 PBase3_0_1 PBase2_1_2 PBase3_0_2 PBase2_1_3 PBase3_0_3 PBase3_1_0 PBase4_0_0 PBase3_1_1 PBase4_0_1 PBase3_1_2 PBase4_0_2 PBase3_1_3 PBase4_0_3 PBase4_1_0 PBase6_0_0 PBase4_1_1 PBase6_0_1 PBase4_1_2 PBase6_0_2 PBase4_1_3 PBase5_0_0 PBase5_0_1 PBase6_0_3 PBase5_1_0 PBase5_1_1 \ No newline at end of file diff --git "a/Install/\320\237\321\200\320\270\320\274\320\265\321\200\321\213 \321\201\321\205\320\265\320\274/\320\245\320\245_\321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200\320\260.psf" "b/Install/\320\237\321\200\320\270\320\274\320\265\321\200\321\213 \321\201\321\205\320\265\320\274/\320\245\320\245_\321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200\320\260.psf" new file mode 100644 index 0000000..7deae41 --- /dev/null +++ "b/Install/\320\237\321\200\320\270\320\274\320\265\321\200\321\213 \321\201\321\205\320\265\320\274/\320\245\320\245_\321\202\321\200\320\260\320\275\321\201\321\204\320\276\321\200\320\274\320\260\321\202\320\276\321\200\320\260.psf" @@ -0,0 +1 @@ +2 PBase PBase1 114 120 70 70 1 0 2 3 1 PSource G N 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0.001 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 0 1e-08 0 sin:50:115000 PBase PBase2 270 120 70 70 0 1 3 2 1 PTransformer_1 ОТр N 5229.38 500.201 115000 11000 3.33e+06 19333 10.5 4667 0.9 50 0.07 5 0 0 0.06 0.2 0.08 0.4 0.1 1.2 0.21 100 2 PBase1_0_0 PBase2_0_0 PBase1_0_1 PBase2_0_1 \ No newline at end of file diff --git a/Kernel.h b/Kernel.h new file mode 100644 index 0000000..e7e851a --- /dev/null +++ b/Kernel.h @@ -0,0 +1,26 @@ +#ifndef KernelH +#define KernelH + +#define _ERROR_ 0 +#define _WARNING_ 3 +#define _NOTICE_ 6 +#define _DEBUG_ 7 + + +#include <math.h> +//#include "dft.h" +//#include "measuring_transformer.h" +//#include "Matrix.h" //используем cpp, т.к. в молуле исп. template`s +#include "model.h" +#define sampl_freq 500 //частота дискретизации +#define FREQ 50 //частота основной гармоники +double T = 1.0/sampl_freq; //время между выборками +const unsigned N = 1.0*sampl_freq/FREQ; //число выборок на период основной частоты +const double w = 2*M_PI*FREQ; //круговая частота 1 гармоники +double smp = 1e-5; // sample - шаг по времени для расчета модели +double TIME=0; //текущее время + + + +#endif + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + <program> Copyright (C) <year> <name of author> + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<https://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +<https://www.gnu.org/licenses/why-not-lgpl.html>. diff --git a/Matrix.cpp b/Matrix.cpp new file mode 100644 index 0000000..a74205c --- /dev/null +++ b/Matrix.cpp @@ -0,0 +1,35 @@ +//--------------------------------------------------------------------------- + +#pragma hdrstop + +#include "matrix.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +// умножение матрицы на число +Matrix<Float> operator*(Float op1, Matrix<Float> op2){ + Matrix<Float> temp(op2.rows, op2.cols); + for(unsigned int i=0; i<op2.rows; i++) + for(unsigned int j=0; j<op2.cols; j++) + temp.A[i][j] = op1 * op2.A[i][j]; + return temp; +} +//--------------------------------------------------------------------------- +// перемножение с созврат результата в матрицу N x 1 +void Multiply_Matrix(Matrix<Float> *op1, Float op2[], Float *result[]){ + for(unsigned int i=0; i<op1->rows; i++){ + *result[i] = 0; + for(unsigned int k=0; k<op1->cols; k++) + (*result[i]) += op1->A[i][k] * op2[k]; + } +} +//--------------------------------------------------------------------------- +// копирование одной матрицы в другую +bool Copy_Matrix(Matrix<char> *from,Matrix<Float> *to){ + if(from->Rows!=to->Rows || from->Cols!=to->Cols) {err( 0, "Присваивание матрицы: матрицы имеют разный размер" ); return false;} + for(unsigned int i=0; i<from->Rows; i++) + for(unsigned int j=0; j<from->Cols; j++) + (*to)[i][j] = (Float)(*from)[i][j]; + return true; +} + diff --git a/Matrix.h b/Matrix.h new file mode 100644 index 0000000..9dd4389 --- /dev/null +++ b/Matrix.h @@ -0,0 +1,507 @@ +//--------------------------------------------------------------------------- +#ifndef matrixH +#define matrixH +#include <vector> +#include <math.h> +#include <system.hpp> +using namespace std; +extern void err(unsigned, String); +//--------------------------------------------------------------------------- +typedef long double Float; // вещественный результат +//--------------------------------------------------------------------------- +template<class T> class Matrix{ + private: + unsigned __fastcall GetRows(){return rows;}; + unsigned __fastcall GetCols(){return cols;}; + T **A; // элементы матрицы + unsigned int rows; // число строк + unsigned int cols; // число столбцов + void Connected_Nodes(unsigned Node, bool used_node[], Matrix &Tree, unsigned &NumWritedBranch); // поиск соседних узлов для построения дерева + public: + Matrix(unsigned int num_rows, unsigned int num_columns); // нулевая матрица + Matrix(unsigned int num_rows, unsigned int num_columns, T *B);// инициализируем матрицу + Matrix(Matrix &M); // новая матрица - копия старой + Matrix(const Matrix<T> &ob);//конструктор копии + ~Matrix(); + T *operator[](unsigned int i); + Matrix<T> operator=(Matrix<T> op2); + Matrix<T> operator=(T *op2); + Matrix<T> operator+(Matrix<T> &op2); + Matrix<T> operator-(Matrix<T> &op2); + Matrix<T> operator*(Matrix<T> &op2); + void link_to_massiv(T** to); + friend Matrix<T> operator*(T op1, Matrix<T> op2); + Matrix<T> transpose(); + unsigned triangular(Matrix &temp); + Matrix<T> triangular(); + T det(); + Matrix<Float> inverse(); + void Delete_Row(unsigned row); + Matrix tree(bool deleted_branch[]); // из матрицы инциденций графа получить мат.инц. дерева, выбрасывая ненужные ветки (deleted_branch[i]==true, если удалили) + Matrix tree_with_null_branch(); // из матрицы инциденций графа получить мат.инц. дерева, обнуляем не нужные ветки + __property unsigned Rows = { read=GetRows }; + __property unsigned Cols = { read=GetCols }; + void Distance_From_Node(unsigned Start_Node, unsigned Distance[]); // поиск кратчайшего расстояния от узла до узла + Matrix<char> Way(unsigned Start_Node, unsigned End_Node); // Кратчайший путь от узла до узла + friend void Multiply_Matrix(Matrix<Float> *op1, Float op2[], Float *result[]); +}; +//------------------------------------------------------------------------- +template < class T > Matrix<T>::Matrix(unsigned int num_rows, unsigned int num_columns){ + rows = num_rows; + cols = num_columns; + A = new T*[rows]; + for(unsigned k=0; k<rows;k++) + A[k] = new T[cols]; + for(unsigned int i=0; i<rows; i++) + for(unsigned int j=0; j<cols; j++) + A[i][j]=0; +} +//------------------------------------------------------------------------- +template < class T > Matrix<T>::Matrix(unsigned int num_rows, unsigned int num_columns, T *B){ + rows = num_rows; + cols = num_columns; + A = new T*[rows]; + for(unsigned k=0; k<rows;k++) + A[k] = new T[cols]; + for(unsigned int i=0; i<rows; i++){ + T *p = (B+i*cols); + for(unsigned int j=0; j<cols; j++) + A[i][j]=p[j]; + } +} +//--------------------------------------------------------------------------- +template < class T > Matrix<T>::Matrix(Matrix &M){ + rows = M.rows; + cols = M.cols; + A = new T*[rows]; + for(unsigned k=0; k<rows;k++) + A[k] = new T[cols]; + for(unsigned int i=0; i<rows; i++) + for(unsigned int j=0; j<cols; j++) + A[i][j]=M.A[i][j]; +} +//--------------------------------------------------------------------------- +// это конструктор копии +template < class T > Matrix<T>::Matrix(const Matrix<T> &ob){ + rows = ob.rows; + cols = ob.cols; + A = new T*[rows]; + for(unsigned k=0; k<rows;k++){ + try{ A[k] = new T[cols];} + catch(std::bad_alloc xa) {err(0, "Нехватка памяти");} + } + for(unsigned int i=0; i<rows; i++) + for(unsigned int j=0; j<cols; j++) + A[i][j]=ob.A[i][j]; +} +//--------------------------------------------------------------------------- +template <class T> Matrix<T>::~Matrix(){ + for(unsigned k=0; k<rows;k++) + {delete [] A[k]; A[k] = NULL;} + delete [] A; A = NULL; +} +//--------------------------------------------------------------------------- +template <class T> Matrix<T> Matrix<T>::operator+(Matrix<T> &op2){ + Matrix<T> temp(rows, cols); + if(rows!=op2.rows || cols!=op2.cols) {err( 0, "Сложение матриц: матрицы имеют разный размер __FILE__:__LINE__" ); return temp;} + for(unsigned int i=0; i<rows; i++) + for(unsigned int j=0; j<cols; j++) + temp.A[i][j] = A[i][j] + op2.A[i][j]; + return temp; +} +//--------------------------------------------------------------------------- +template <class T> T* Matrix<T>::operator[](unsigned int i){ + return A[i]; +} +//--------------------------------------------------------------------------- +template<class T> Matrix<T> Matrix<T>::operator=(Matrix<T> op2){ + if(rows!=op2.rows || cols!=op2.cols) {err( 0, "Присваивание матрицы: матрицы имеют разный размер" ); return *this;} + for(unsigned int i=0; i<rows; i++) + for(unsigned int j=0; j<cols; j++) + A[i][j] = op2.A[i][j]; + return *this; +} +//--------------------------------------------------------------------------- +template<class T> Matrix<T> Matrix<T>::operator=(T *op2){ + for(unsigned int i=0; i<rows; i++) + for(unsigned int j=0; j<cols; j++) + A[i][j]=*(op2+i*cols+j); + return *this; +} +//--------------------------------------------------------------------------- +template<class T> Matrix<T> Matrix<T>::operator-(Matrix<T> &op2){ + Matrix<T> temp(rows, cols); + if(rows!=op2.rows || cols!=op2.cols) {err( 0, "Вычитание матриц: матрицы имеют разный размер"); return temp;} + for(unsigned int i=0; i<rows; i++) + for(unsigned int j=0; j<cols; j++) + temp.A[i][j] = A[i][j] - op2.A[i][j]; + return temp; +} +//--------------------------------------------------------------------------- +template<class T> Matrix<T> Matrix<T>::operator*(Matrix<T> &op2){ + Matrix<T> temp(rows, op2.cols); + if(cols!=op2.rows) {err( 0, "Умножение матриц: число строк и столбцов не совпадает"); return temp;} + for(unsigned int i=0; i<rows; i++) + for(unsigned int j=0; j<op2.cols; j++){ + temp.A[i][j] = 0; + for(unsigned int k=0; k<cols; k++) + temp.A[i][j] += A[i][k] * op2.A[k][j]; + } + return temp; +} +//--------------------------------------------------------------------------- +// Теперь массив указывает на матрицу-столбеу +template<class T> void Matrix<T>::link_to_massiv(T** to){ + if(cols!=1) {err( 0, "Преобазование матрицы столбца в массив: число столбцов в матрице не равно 1"); return;} + for(unsigned int j=0; j<rows; j++) + to[j] = &A[j][0]; +} +//--------------------------------------------------------------------------- +// Транспонируем матрицу +template<class T> Matrix<T> Matrix<T>::transpose(){ + Matrix<T> temp(cols, rows); + for(unsigned int i=0; i<rows; i++) + for(unsigned int j=0; j<cols; j++) + temp.A[j][i] = A[i][j]; + return temp; +} +//--------------------------------------------------------------------------- +/* Приведение матрицы к треугольному виду (возвращаем число перестановок)*/ +template<class T> unsigned Matrix<T>::triangular(Matrix &temp){ + if(temp.cols != temp.rows) {err( 0, "Привидение матрицы к треугольному виду: число строк и столбцов не совпадает"); return 0;} + // на первой строке не все нули? + unsigned h; + for(unsigned h=0; h< rows; h++) if(fabs(temp.A[h][0])>1e-300) break; + if(h==rows){err( 0, "Получение обратной матрицы: все элементы в первом столбце матрицы нулевые"); return 0;} + unsigned u=0; // число перестановок строк + for(unsigned i=0; i<rows-1; i++){ + // если диагональный элемент ноль меняем строки местами + if(fabs(temp.A[i][i]) < 1e-300){ + //поиск строки с ненулевым диагональным элементом + unsigned NotNull; for(NotNull=i+1; NotNull<rows; NotNull++) if(fabs(temp.A[NotNull][i])>1e-300) break; + if(NotNull==rows) {err( 0, "Привидение матрицы к треугольному виду: ошибка в поиске ненулевого диагонального элемента"); return 0;} + T *tmp = temp.A[i]; + temp.A[i] = temp.A[NotNull]; + temp.A[NotNull] = tmp; + u++; + } + for(unsigned k=i+1; k<rows; k++){ + if(temp.A[k][i] != 0){ + // вычисляем множитель + T d = -1.0*temp.A[k][i]/temp.A[i][i]; + // производим приведение строки + temp.A[k][i] = 0; + for(unsigned j=i+1; j<cols; j++) + temp.A[k][j] = d*temp.A[i][j] + temp.A[k][j]; + } + } + } + return u; +} +//--------------------------------------------------------------------------- +/* Приведение матрицы к треугольному виду */ +template<class T> Matrix<T> Matrix<T>::triangular(){ + Matrix<T> temp(*this); + triangular(temp); + return temp; +} +//--------------------------------------------------------------------------- +/* Находим определитель матрицы */ +template<class T> T Matrix<T>::det(){ + T d; + if(cols != rows) {err( 0, "Поиск определителя: матрица не квадратная"); return 0;} + Matrix temp(*this); + unsigned u = triangular(temp); + if( u%2==0 ) d=1; else d=-1; + for(unsigned i=0; i<rows; i++) + d *= temp.A[i][i]; + return d; +} +//--------------------------------------------------------------------------- +/* Находим обратную матрицу методом Гаусса — Жордана */ +template<class T> Matrix<Float> Matrix<T>::inverse(){ + Matrix temp(*this); + Matrix E(rows, cols); + if(temp.cols != temp.rows) {err( 0, "Получение обратной матрицы: исходная матрица не квадратная"); return E;} + // на первой строке не все нули? + unsigned h; + for(h=0; h< rows; h++) if(fabs(A[h][0])>1e-300) break; + if(h==rows){err( 0, "Получение обратной матрицы: все элементы в первом столбце матрицы нулевые"); return E;} + // формируем единичную матрицу + for(unsigned i=0; i<rows; i++) E.A[i][i] = 1; + unsigned u=0; // число перестановок строк + // в прямом направлении + for(unsigned i=0; i<rows-1; i++){ + // находим максимальный элемент в столбце + unsigned max_i = i; + Float max = fabs(temp.A[i][i]); + for(unsigned r=i+1; r<rows-1; r++) + if(fabs(temp.A[r][i]) > max){ + max = fabs(temp.A[r][i]); + max_i = r; + } + if(max_i != i){ // меняем строки местами + Float *tmp = temp.A[i]; + temp.A[i] = temp.A[max_i]; + temp.A[max_i] = tmp; + u++; + // и для единичной + tmp = E.A[i]; + E.A[i] = E.A[max_i]; + E.A[max_i] = tmp; + } + // если диагональный элемент ноль меняем строки местами + if(fabs(temp.A[i][i]) < 1e-300){ + //поиск строки с ненулевым диагональным элементом + unsigned NotNull; for(NotNull=i+1; NotNull<rows; NotNull++) if(fabs(temp.A[NotNull][i])>1e-300) break; + if(NotNull==rows) {err( 0, "Привидение матрицы к треугольному виду: ошибка в поиске не нулевого диагонального элемента"); return E;} + Float *tmp = temp.A[i]; + temp.A[i] = temp.A[NotNull]; + temp.A[NotNull] = tmp; + u++; + // и для единичной + tmp = E.A[i]; + E.A[i] = E.A[NotNull]; + E.A[NotNull] = tmp; + } + // получаем на диагональном элементе "1" + Float d = temp.A[i][i]; + for(unsigned j=i; j<cols; j++) + temp.A[i][j] = temp.A[i][j]/d; + for(unsigned j=0; j<cols; j++) + E.A[i][j] = E.A[i][j]/d; + for(unsigned k=i+1; k<rows; k++){ + // вычисляем множитель + Float d = -temp.A[k][i]; + // производим приведение строки + temp.A[k][i] = 0; + for(unsigned j=i+1; j<cols; j++) + temp.A[k][j] = d*temp.A[i][j] + temp.A[k][j]; + for(unsigned j=0; j<cols; j++) + E.A[k][j] = d*E.A[i][j] + E.A[k][j]; + } + } + // получаем на крайнем диагональном элементе "1" + Float d = 1.0*temp.A[rows-1][rows-1]; + if(d==0){ + err(0,"Matrix::inverse(): деление на ноль"); + d=1e-100;} + temp.A[rows-1][rows-1] = 1; + for(unsigned j=0; j<cols; j++) + E.A[rows-1][j] = E.A[rows-1][j]/d; + + //В обратном направлении + for(unsigned i=rows-1; i>0; i--){ + for(unsigned k=0; k<i; k++){ + if(fabs(temp.A[k][i])>1e-300){ + // вычисляем множитель + Float d = -temp.A[k][i]; + // производим приведение строки + temp.A[k][i] = 0; + for(unsigned j=0; j<cols; j++) + E.A[k][j] = d*E.A[i][j] + E.A[k][j]; + } + } + } + return E; +} +//--------------------------------------------------------------------------- +template<class T> Matrix<char> Matrix<T>::Way(unsigned Start_Node, unsigned End_Node){ + Matrix<char> way(1,cols); + if(Start_Node==End_Node) return way; + unsigned *Distance = new unsigned[cols]; + for(unsigned i=0;i<cols;i++) Distance[i] = -1; + // поиск расстояний от узла + Distance[Start_Node] = 0; + Distance_From_Node(Start_Node, Distance); + //unsigned g[200]; + //for(unsigned i=0; i<cols;i++)g[i]=Distance[i]; + // составляем путь + unsigned nB = cols; + unsigned nN = rows; + // идем от конечной вершины + unsigned s = End_Node; + while( s != Start_Node){ + unsigned Dis = Distance[s]-1; // ищем соседний узел на таком расстоянии от стартового + // ищем ветки до соседней вершины + unsigned i; + for(i=0;i<nB;i++){ + if(A[s][i]!=0){ + // в какую неиспользованную вершину попадаем + unsigned j; + for(j=0;j<nN;j++) + if(A[j][i]!=0 && Dis == Distance[j]){ + way[0][i] = A[s][i]; // 1 или -1 -в зависимости по напрявлению или против ветки + s = j; + break; + } + if(j<nN) break; // перешли в другой узел, поиск ветвей прекращаем + } + } + // нет пути + if(i >= nB){ + for(unsigned x=0;x<nB;x++) way[0][x]=0; + break; + } + } + delete [] Distance; + return way; +} +//--------------------------------------------------------------------------- +// рекурсивный поиск расстояния от узла +template<class T> void Matrix<T>::Distance_From_Node(unsigned Start_Node, unsigned Distance[]){ //, End_Node + vector<unsigned> Cocedi; + Float Find_Dist = Distance[Start_Node]+1; + //ищем соседние не использованные узлы + for(unsigned j=0; j<cols; j++) + if(fabs(A[Start_Node][j])>1e-300) // если есть ветка, найдем до какого она узла + for(unsigned i=0; i<rows; i++) + if(fabs(A[i][j])>1e-300 && Find_Dist<Distance[i]){ // если до не узла расттояние меньше + Distance[i] = Find_Dist; // помечаем узел + Cocedi.push_back(i); + } + // ищем рекурсивно + for(unsigned i=0, n=Cocedi.size(); i<n; i++) + Distance_From_Node(Cocedi[i], Distance);//, End_Node поиск соседних узлов +} +//--------------------------------------------------------------------------- +// рекурсивный поиск расстояния от узла +template<> void Matrix<char>::Distance_From_Node(unsigned Start_Node, unsigned Distance[]){ + std::vector <unsigned> Cocedi; // std::vector + unsigned Find_Dist = Distance[Start_Node]+1; + //ищем соседние не использованные узлы + for(unsigned j=0; j<cols; j++) + if(A[Start_Node][j]!=0) // если есть ветка, найдем до какого она узла + for(unsigned i=0; i<rows; i++) + if(A[i][j]!=0 && Find_Dist<Distance[i]){ // если до не узла расттояние меньше + Distance[i] = Find_Dist; // помечаем узел + Cocedi.push_back(i); + } + // ищем рекурсивно + for(unsigned i=0, n=Cocedi.size(); i<n; i++) + Distance_From_Node(Cocedi[i], Distance);// поиск соседних узлов +} +//--------------------------------------------------------------------------- +// рекурсивный поиск соседних узлов +template<class T> void Matrix<T>::Connected_Nodes(unsigned Node, bool used_node[], Matrix &Tree, unsigned &NumWritedBranch){ + //ищем соседние не использованные узлы + for(unsigned j=0; j<cols; j++) + if(fabs(A[Node][j])>1e-300) // если есть ветка, найдем до какого она узла + for(unsigned i=0; i<rows; i++) + if(fabs(A[i][j])>1e-300 && !used_node[i]){ // если до не использованного узла + used_node[i] = true; // помечаем узел + for(unsigned s=0; s<rows; s++) Tree.A[s][j] = A[s][j]; // копируем содержимое + NumWritedBranch++; + if(NumWritedBranch < (Tree.rows-1)) // веток не достаточно + Connected_Nodes(i, used_node, Tree, NumWritedBranch);// поиск соседних узлов + break; + } +} +//--------------------------------------------------------------------------- +template<class T> Matrix<T> Matrix<T>::tree(bool deleted_branch[]){ +// число узлов в дереве всегда боле на 1 чем ветвей + Matrix Res(rows, rows-1); + Matrix Tree(rows, cols); + // ищем дерево + Tree = tree_with_null_branch(); + // удаляем нулевые столбцы + for(unsigned i=0; i<cols;i++) deleted_branch[i]=true; // изначально говорим, что все ветки удалены + unsigned write_col=0; + for(unsigned h=0;h<Tree.cols;h++){ + unsigned i; + for(i=0;i<Tree.rows;i++)if(fabs(Tree.A[i][h])>1e-300) break; + if(i!=Tree.rows){ // в столбце не все нули + deleted_branch[h] = false; // ветка не удалена + for(unsigned r=0;r<Tree.rows;r++) Res.A[r][write_col]=Tree.A[r][h]; + write_col++; + } + } + if(write_col != Res.Cols){err(0, "Matrix::tree: при нахождении дерева не соблюдается ЧИСЛО_ВЕТВЕЙ == (ЧИСЛО_УЗЛОВ-1)");} + return Res; + /* + // добавляем первую ветку + unsigned k=0; // число сохраненных веток в дереве + unsigned j; // текущая ветка + for(j=0; j<cols; j++){ + unsigned h=0; + // не все ли элементы столбца == 0 ? + for(h=0; h<rows; h++) if(fabs(A[h][j])>1e-300) break; + if(h!=rows){ + for(unsigned i=0; i<rows; i++){ + if(fabs(A[i][j])>1e-300) used_node[i]=true; + temp.A[i][k] = A[i][j]; + } + deleted_branch[j] = false; // сохранили j-ветку + k++; + break; + } + } + // добавляем ветки указывающие на новый узел + for(j++; j<cols; j++){ + if(k<temp.cols) // если нужны еще ветки + for(unsigned i=0; i<rows; i++) + if(fabs(A[i][j])>1e-300 && !used_node[i]){ + // добавляем + for(unsigned s=0; s<rows; s++) temp.A[s][k] = A[s][j]; + deleted_branch[j] = false; // сохранили j-ветку + used_node[i] = true; // говорим что использовали вершину + k++; // в графе дерева стало на одну ветку больше + break; + } + } */ +} +//--------------------------------------------------------------------------- +template<class T> Matrix<T> Matrix<T>::tree_with_null_branch(){ + // число узлов в дереве всегда боле на 1 чем ветвей + Matrix Tree(rows, cols); + bool *used_node = new bool[Tree.rows]; + for(unsigned i=0; i<Tree.rows;i++) used_node[i]=false; + // добавляем нулевой узел + static unsigned Uz=0; // текущий узел + used_node[Uz]=true; + unsigned k=0; // всего найдено ветвей в дереве + //ищем соседние не использованные узлы + Connected_Nodes(Uz, used_node, Tree, k); + delete [] used_node; + return Tree; + /*/ число узлов в дереве всегда боле на 1 чем ветвей + Matrix temp(rows, cols); + bool *used_node = new bool[temp.rows]; + for(unsigned i=0; i<temp.rows;i++) used_node[i]=false; + // добавляем ветки указывающие на новый узел + for(unsigned j=0; j<cols; j++){ + unsigned i; + for(i=0; i<rows; i++) + if(fabs(A[i][j])>1e-300 && !used_node[i]){ // добавляет ли ветка новый узел? + // да + for(unsigned s=0; s<rows; s++) temp.A[s][j] = A[s][j]; + break; + } + if(i==rows) // нет + for(unsigned s=0; s<rows; s++) temp.A[s][j] = 0; + } + return temp;*/ +} +//--------------------------------------------------------------------------- +template<class T> void Matrix<T>::Delete_Row(unsigned row){ + for(unsigned i=row; i<(rows-1);i++) A[i] = A[i+1]; + delete A[rows-1]; + rows--; +} +//--------------------------------------------------------------------------- +template<class T> Matrix<Float> Multiply_Matrix(Matrix<T> *op1, Float ***op2, unsigned op2_rows, unsigned op2_cols) +{ + Matrix<Float> temp(op1->Rows, op2_cols); + if(op1->Cols!=op2_rows) {err( 0, "Умножение матриц: число строк и столбцов не совпадает"); return temp;} + for(unsigned int i=0; i<op1->Rows; i++) + for(unsigned int j=0; j<op2_cols; j++){ + temp[i][j] = 0; + for(unsigned int k=0; k<op1->Cols; k++) + temp[i][j] += (Float)(*op1)[i][k] * (*op2[k][j]); + } + return temp; +} +//--------------------------------------------------------------------------- +bool Copy_Matrix(Matrix<char> *from, Matrix<Float> *to); +#endif + diff --git a/Matrix.obj b/Matrix.obj new file mode 100644 index 0000000..80226de Binary files /dev/null and b/Matrix.obj differ diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..f8f321b --- /dev/null +++ b/NOTICE @@ -0,0 +1,15 @@ +PowerSystem +Copyright (C) 2012 Vitalii Ananev <an-vitek@ya.ru> + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <https://www.gnu.org/licenses/>. \ No newline at end of file diff --git a/PNGImage/TPNGImage.rar b/PNGImage/TPNGImage.rar new file mode 100644 index 0000000..26af887 Binary files /dev/null and b/PNGImage/TPNGImage.rar differ diff --git a/PNGImage/obj/adler32.obj b/PNGImage/obj/adler32.obj new file mode 100644 index 0000000..84d2850 Binary files /dev/null and b/PNGImage/obj/adler32.obj differ diff --git a/PNGImage/obj/compress.obj b/PNGImage/obj/compress.obj new file mode 100644 index 0000000..90cf74f Binary files /dev/null and b/PNGImage/obj/compress.obj differ diff --git a/PNGImage/obj/crc32.obj b/PNGImage/obj/crc32.obj new file mode 100644 index 0000000..ea14153 Binary files /dev/null and b/PNGImage/obj/crc32.obj differ diff --git a/PNGImage/obj/deflate.obj b/PNGImage/obj/deflate.obj new file mode 100644 index 0000000..3ffc8bc Binary files /dev/null and b/PNGImage/obj/deflate.obj differ diff --git a/PNGImage/obj/gzio.obj b/PNGImage/obj/gzio.obj new file mode 100644 index 0000000..ff94037 Binary files /dev/null and b/PNGImage/obj/gzio.obj differ diff --git a/PNGImage/obj/infback.obj b/PNGImage/obj/infback.obj new file mode 100644 index 0000000..2114f10 Binary files /dev/null and b/PNGImage/obj/infback.obj differ diff --git a/PNGImage/obj/inffast.obj b/PNGImage/obj/inffast.obj new file mode 100644 index 0000000..c8f5b1f Binary files /dev/null and b/PNGImage/obj/inffast.obj differ diff --git a/PNGImage/obj/inflate.obj b/PNGImage/obj/inflate.obj new file mode 100644 index 0000000..4c53c01 Binary files /dev/null and b/PNGImage/obj/inflate.obj differ diff --git a/PNGImage/obj/inftrees.obj b/PNGImage/obj/inftrees.obj new file mode 100644 index 0000000..c37455e Binary files /dev/null and b/PNGImage/obj/inftrees.obj differ diff --git a/PNGImage/obj/trees.obj b/PNGImage/obj/trees.obj new file mode 100644 index 0000000..98a6110 Binary files /dev/null and b/PNGImage/obj/trees.obj differ diff --git a/PNGImage/obj/uncompr.obj b/PNGImage/obj/uncompr.obj new file mode 100644 index 0000000..12cd70b Binary files /dev/null and b/PNGImage/obj/uncompr.obj differ diff --git a/PNGImage/obj/zutil.obj b/PNGImage/obj/zutil.obj new file mode 100644 index 0000000..9395409 Binary files /dev/null and b/PNGImage/obj/zutil.obj differ diff --git a/PNGImage/pngextra.pas b/PNGImage/pngextra.pas new file mode 100644 index 0000000..86b3112 --- /dev/null +++ b/PNGImage/pngextra.pas @@ -0,0 +1,353 @@ +unit pngextra; + +interface + +uses + Windows, Graphics, Messages, SysUtils, Classes, Controls, pngimage, Buttons, + ExtCtrls; + +type + TPNGButtonStyle = (pbsDefault, pbsFlat, pbsNoFrame); + TPNGButtonLayout = (pbsImageAbove, pbsImageBellow, pbsImageLeft, + pbsImageRight); + TPNGButtonState = (pbsNormal, pbsDown, pbsDisabled); + + TPNGButton = class(TGraphicControl) + private + {Holds the property values} + fButtonStyle: TPNGButtonStyle; + fMouseOverControl: Boolean; + FCaption: String; + FButtonLayout: TPNGButtonLayout; + FButtonState: TPNGButtonState; + FImageDown: TPNGObject; + fImageNormal: TPNGObject; + fImageDisabled: TPNGObject; + fImageOver: TPNGObject; + fOnMouseEnter, fOnMouseExit: TNotifyEvent; + {Procedures for setting the property values} + procedure SetButtonStyle(const Value: TPNGButtonStyle); + procedure SetCaption(const Value: String); + procedure SetButtonLayout(const Value: TPNGButtonLayout); + procedure SetButtonState(const Value: TPNGButtonState); + procedure SetImageNormal(const Value: TPNGObject); + procedure SetImageDown(const Value: TPNGObject); + procedure SetImageOver(const Value: TPNGObject); + published + {Published properties} + property Font; + property Visible; + property ButtonLayout: TPNGButtonLayout read FButtonLayout write SetButtonLayout; + property Caption: String read FCaption write SetCaption; + property ImageNormal: TPNGObject read fImageNormal write SetImageNormal; + property ImageDown: TPNGObject read FImageDown write SetImageDown; + property ImageOver: TPNGObject read FImageOver write SetImageOver; + property ButtonStyle: TPNGButtonStyle read fButtonStyle + write SetButtonStyle; + property Enabled; + property ParentShowHint; + property ShowHint; + {Default events} + property OnMouseDown; + property OnClick; + property OnMouseUp; + property OnMouseMove; + property OnDblClick; + property OnMouseEnter: TNotifyEvent read fOnMouseEnter write fOnMouseEnter; + property OnMouseExit: TNotifyEvent read fOnMouseExit write fOnMouseExit; + public + {Public properties} + property ButtonState: TPNGButtonState read FButtonState write SetButtonState; + protected + {Being painted} + procedure Paint; override; + {Clicked} + procedure Click; override; + {Mouse pressed} + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); override; + procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; + {Mouse entering or leaving} + procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + {Being enabled or disabled} + procedure CMEnabledChanged(var Message: TMessage); + message CM_ENABLEDCHANGED; + public + {Returns if the mouse is over the control} + property IsMouseOver: Boolean read fMouseOverControl; + {Constructor and destructor} + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + end; + +procedure Register; +procedure MakeImageHalfTransparent(Source, Dest: TPNGObject); + +implementation + +procedure Register; +begin + RegisterComponents('Samples', [TPNGButton]); +end; + +procedure MakeImageHalfTransparent(Source, Dest: TPNGObject); +var + i, j: Integer; +begin + Dest.Assign(Source); + Dest.CreateAlpha; + if (Dest.Header.ColorType <> COLOR_PALETTE) then + for j := 0 to Source.Height - 1 do + for i := 0 to Source.Width - 1 do + Dest.AlphaScanline[j]^[i] := Dest.AlphaScanline[j]^[i] div 3; +end; + +{TPNGButton implementation} + +{Being created} +constructor TPNGButton.Create(AOwner: TComponent); +begin + {Calls ancestor} + inherited Create(AOwner); + {Creates the TPNGObjects} + fImageNormal := TPNGObject.Create; + fImageDown := TPNGObject.Create; + fImageDisabled := TPNGObject.Create; + fImageOver := TPNGObject.Create; + {Initial properties} + ControlStyle := ControlStyle + [csCaptureMouse]; + SetBounds(Left, Top, 23, 23); + fMouseOverControl := False; + fButtonLayout := pbsImageAbove; + fButtonState := pbsNormal +end; + +destructor TPNGButton.Destroy; +begin + {Frees the TPNGObject} + fImageNormal.Free; + fImageDown.Free; + fImageDisabled.Free; + fImageOver.Free; + + {Calls ancestor} + inherited Destroy; +end; + +{Being enabled or disabled} +procedure TPNGButton.CMEnabledChanged(var Message: TMessage); +begin + if not Enabled then MakeImageHalfTransparent(fImageNormal, fImageDisabled); + if Enabled then ButtonState := pbsNormal else ButtonState := pbsDisabled +end; + +{Returns the largest number} +function Max(A, B: Integer): Integer; +begin + if A > B then Result := A else Result := B +end; + +{Button being painted} +procedure TPNGButton.Paint; +const + Slide: Array[false..true] of Integer = (0, 2); +var + Area: TRect; + TextSize, ImageSize: TSize; + TextPos, ImagePos: TPoint; + Image: TPNGObject; + Pushed: Boolean; +begin + {Prepares the canvas} + Canvas.Font.Assign(Font); + + {Determines if the button is pushed} + Pushed := (ButtonState = pbsDown) and IsMouseOver; + + {Determines the image to use} + if (Pushed) and not fImageDown.Empty then + Image := fImageDown + else if IsMouseOver and not fImageOver.Empty and Enabled then + Image := fImageOver + else if (ButtonState = pbsDisabled) and not fImageDisabled.Empty then + Image := fImageDisabled + else + Image := fImageNormal; + + {Get the elements size} + ImageSize.cx := Image.Width; + ImageSize.cy := Image.Height; + Area := ClientRect; + if Caption <> '' then + begin + TextSize := Canvas.TextExtent(Caption); + ImageSize.cy := ImageSize.Cy + 4; + end else FillChar(TextSize, SizeOf(TextSize), #0); + + {Set the elements position} + ImagePos.X := (Width - ImageSize.cx) div 2 + Slide[Pushed]; + TextPos.X := (Width - TextSize.cx) div 2 + Slide[Pushed]; + TextPos.Y := (Height - TextSize.cy) div 2; + ImagePos.Y := (Height - ImageSize.cy) div 2; + case ButtonLayout of + pbsImageAbove: begin + ImagePos.Y := (Height - ImageSize.cy - TextSize.cy) div 2; + TextPos.Y := ImagePos.Y + ImageSize.cy; + end; + pbsImageBellow: begin + TextPos.Y := (Height - ImageSize.cy - TextSize.cy) div 2; + ImagePos.Y := TextPos.Y + TextSize.cy; + end; + pbsImageLeft: begin + ImagePos.X := (Width - ImageSize.cx - TextSize.cx) div 2; + TextPos.X := ImagePos.X + ImageSize.cx + 5; + end; + pbsImageRight: begin + TextPos.X := (Width - ImageSize.cx - TextSize.cx) div 2;; + ImagePos.X := TextPos.X + TextSize.cx + 5; + end + end; + ImagePos.Y := ImagePos.Y + Slide[Pushed]; + TextPos.Y := TextPos.Y + Slide[Pushed]; + + {Draws the border} + if ButtonStyle = pbsFlat then + begin + if ButtonState <> pbsDisabled then + if (Pushed) then + Frame3D(Canvas, Area, clBtnShadow, clBtnHighlight, 1) + else if IsMouseOver or (ButtonState = pbsDown) then + Frame3D(Canvas, Area, clBtnHighlight, clBtnShadow, 1) + end + else if ButtonStyle = pbsDefault then + DrawButtonFace(Canvas, Area, 1, bsNew, TRUE, Pushed, FALSE); + + {Draws the elements} + Canvas.Brush.Style := bsClear; + Canvas.Draw(ImagePos.X, ImagePos.Y, Image); + if ButtonState = pbsDisabled then Canvas.Font.Color := clGrayText; + Canvas.TextRect(Area, TextPos.X, TextPos.Y, Caption) +end; + +{Changing the button Layout property} +procedure TPNGButton.SetButtonLayout(const Value: TPNGButtonLayout); +begin + FButtonLayout := Value; + Repaint +end; + +{Changing the button state property} +procedure TPNGButton.SetButtonState(const Value: TPNGButtonState); +begin + FButtonState := Value; + Repaint +end; + +{Changing the button style property} +procedure TPNGButton.SetButtonStyle(const Value: TPNGButtonStyle); +begin + fButtonStyle := Value; + Repaint +end; + +{Changing the caption property} +procedure TPNGButton.SetCaption(const Value: String); +begin + FCaption := Value; + Repaint +end; + +{Changing the image property} +procedure TPNGButton.SetImageNormal(const Value: TPNGObject); +begin + fImageNormal.Assign(Value); + MakeImageHalfTransparent(fImageNormal, fImageDisabled); + Repaint +end; + +{Setting the down image} +procedure TPNGButton.SetImageDown(const Value: TPNGObject); +begin + FImageDown.Assign(Value); + Repaint +end; + +{Setting the over image} +procedure TPNGButton.SetImageOver(const Value: TPNGObject); +begin + fImageOver.Assign(Value); + Repaint +end; + +{Mouse pressed} +procedure TPNGButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X, + Y: Integer); +begin + {Changes the state and repaints} + if (ButtonState = pbsNormal) and (Button = mbLeft) then + ButtonState := pbsDown; + {Calls ancestor} + inherited +end; + +{Being clicked} +procedure TPNGButton.Click; +begin + if ButtonState = pbsDown then ButtonState := pbsNormal; + inherited Click; +end; + +{Mouse released} +procedure TPNGButton.MouseUp(Button: TMouseButton; Shift: TShiftState; X, + Y: Integer); +begin + {Changes the state and repaints} + if ButtonState = pbsDown then ButtonState := pbsNormal; + {Calls ancestor} + inherited +end; + +{Mouse moving over the control} +procedure TPNGButton.MouseMove(Shift: TShiftState; X, Y: Integer); +begin + {In case cursor is over the button} + if (X >= 0) and (X < ClientWidth) and (Y >= 0) and (Y <= ClientHeight) and + (fMouseOverControl = False) and (ButtonState <> pbsDown) then + begin + fMouseOverControl := True; + Repaint; + end; + + {Calls ancestor} + inherited; + +end; + +{Mouse is now over the control} +procedure TPNGButton.CMMouseEnter(var Message: TMessage); +begin + if Enabled then + begin + if Assigned(fOnMouseEnter) then fOnMouseEnter(Self); + fMouseOverControl := True; + Repaint + end +end; + +{Mouse has left the control} +procedure TPNGButton.CMMouseLeave(var Message: TMessage); +begin + if Enabled then + begin + if Assigned(fOnMouseExit) then FOnMouseExit(Self); + fMouseOverControl := False; + Repaint + end +end; + + + +end. diff --git a/PNGImage/pngimage.dcu b/PNGImage/pngimage.dcu new file mode 100644 index 0000000..0cdd17c Binary files /dev/null and b/PNGImage/pngimage.dcu differ diff --git a/PNGImage/pngimage.hpp b/PNGImage/pngimage.hpp new file mode 100644 index 0000000..8840e86 --- /dev/null +++ b/PNGImage/pngimage.hpp @@ -0,0 +1,1499 @@ +// Borland C++ Builder +// Copyright (c) 1995, 2002 by Borland Software Corporation +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'pngimage.pas' rev: 6.00 + +#ifndef pngimageHPP +#define pngimageHPP + +#pragma delphiheader begin +#pragma option push -w- +#pragma option push -Vx +#include <pnglang.hpp> // Pascal unit +#include <zlibpas.hpp> // Pascal unit +#include <SysUtils.hpp> // Pascal unit +#include <Graphics.hpp> // Pascal unit +#include <Classes.hpp> // Pascal unit +#include <Windows.hpp> // Pascal unit +#include <SysInit.hpp> // Pascal unit +#include <System.hpp> // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Pngimage +{ +//-- type declarations ------------------------------------------------------- +typedef AnsiString pngimage__1[9]; + +class DELPHICLASS EPNGOutMemory; +class PASCALIMPLEMENTATION EPNGOutMemory : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPNGOutMemory(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPNGOutMemory(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPNGOutMemory(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPNGOutMemory(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPNGOutMemory(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPNGOutMemory(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPNGOutMemory(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPNGOutMemory(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPNGOutMemory(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPngError; +class PASCALIMPLEMENTATION EPngError : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPngError(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPngError(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPngError(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPngError(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPngError(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPngError(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPngError(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPngError(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPngError(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPngUnexpectedEnd; +class PASCALIMPLEMENTATION EPngUnexpectedEnd : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPngUnexpectedEnd(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPngUnexpectedEnd(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPngUnexpectedEnd(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPngUnexpectedEnd(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPngUnexpectedEnd(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPngUnexpectedEnd(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPngUnexpectedEnd(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPngUnexpectedEnd(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPngUnexpectedEnd(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPngInvalidCRC; +class PASCALIMPLEMENTATION EPngInvalidCRC : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPngInvalidCRC(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPngInvalidCRC(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPngInvalidCRC(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPngInvalidCRC(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPngInvalidCRC(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPngInvalidCRC(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPngInvalidCRC(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPngInvalidCRC(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPngInvalidCRC(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPngInvalidIHDR; +class PASCALIMPLEMENTATION EPngInvalidIHDR : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPngInvalidIHDR(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPngInvalidIHDR(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPngInvalidIHDR(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPngInvalidIHDR(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPngInvalidIHDR(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPngInvalidIHDR(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPngInvalidIHDR(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPngInvalidIHDR(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPngInvalidIHDR(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPNGMissingMultipleIDAT; +class PASCALIMPLEMENTATION EPNGMissingMultipleIDAT : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPNGMissingMultipleIDAT(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPNGMissingMultipleIDAT(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPNGMissingMultipleIDAT(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPNGMissingMultipleIDAT(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPNGMissingMultipleIDAT(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPNGMissingMultipleIDAT(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPNGMissingMultipleIDAT(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPNGMissingMultipleIDAT(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPNGMissingMultipleIDAT(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPNGZLIBError; +class PASCALIMPLEMENTATION EPNGZLIBError : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPNGZLIBError(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPNGZLIBError(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPNGZLIBError(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPNGZLIBError(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPNGZLIBError(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPNGZLIBError(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPNGZLIBError(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPNGZLIBError(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPNGZLIBError(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPNGInvalidPalette; +class PASCALIMPLEMENTATION EPNGInvalidPalette : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPNGInvalidPalette(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPNGInvalidPalette(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPNGInvalidPalette(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPNGInvalidPalette(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPNGInvalidPalette(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPNGInvalidPalette(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPNGInvalidPalette(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPNGInvalidPalette(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPNGInvalidPalette(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPNGInvalidFileHeader; +class PASCALIMPLEMENTATION EPNGInvalidFileHeader : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPNGInvalidFileHeader(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPNGInvalidFileHeader(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPNGInvalidFileHeader(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPNGInvalidFileHeader(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPNGInvalidFileHeader(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPNGInvalidFileHeader(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPNGInvalidFileHeader(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPNGInvalidFileHeader(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPNGInvalidFileHeader(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPNGIHDRNotFirst; +class PASCALIMPLEMENTATION EPNGIHDRNotFirst : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPNGIHDRNotFirst(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPNGIHDRNotFirst(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPNGIHDRNotFirst(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPNGIHDRNotFirst(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPNGIHDRNotFirst(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPNGIHDRNotFirst(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPNGIHDRNotFirst(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPNGIHDRNotFirst(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPNGIHDRNotFirst(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPNGNotExists; +class PASCALIMPLEMENTATION EPNGNotExists : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPNGNotExists(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPNGNotExists(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPNGNotExists(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPNGNotExists(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPNGNotExists(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPNGNotExists(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPNGNotExists(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPNGNotExists(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPNGNotExists(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPNGSizeExceeds; +class PASCALIMPLEMENTATION EPNGSizeExceeds : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPNGSizeExceeds(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPNGSizeExceeds(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPNGSizeExceeds(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPNGSizeExceeds(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPNGSizeExceeds(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPNGSizeExceeds(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPNGSizeExceeds(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPNGSizeExceeds(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPNGSizeExceeds(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPNGMissingPalette; +class PASCALIMPLEMENTATION EPNGMissingPalette : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPNGMissingPalette(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPNGMissingPalette(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPNGMissingPalette(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPNGMissingPalette(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPNGMissingPalette(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPNGMissingPalette(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPNGMissingPalette(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPNGMissingPalette(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPNGMissingPalette(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPNGUnknownCriticalChunk; +class PASCALIMPLEMENTATION EPNGUnknownCriticalChunk : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPNGUnknownCriticalChunk(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPNGUnknownCriticalChunk(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPNGUnknownCriticalChunk(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPNGUnknownCriticalChunk(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPNGUnknownCriticalChunk(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPNGUnknownCriticalChunk(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPNGUnknownCriticalChunk(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPNGUnknownCriticalChunk(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPNGUnknownCriticalChunk(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPNGUnknownCompression; +class PASCALIMPLEMENTATION EPNGUnknownCompression : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPNGUnknownCompression(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPNGUnknownCompression(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPNGUnknownCompression(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPNGUnknownCompression(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPNGUnknownCompression(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPNGUnknownCompression(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPNGUnknownCompression(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPNGUnknownCompression(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPNGUnknownCompression(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPNGUnknownInterlace; +class PASCALIMPLEMENTATION EPNGUnknownInterlace : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPNGUnknownInterlace(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPNGUnknownInterlace(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPNGUnknownInterlace(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPNGUnknownInterlace(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPNGUnknownInterlace(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPNGUnknownInterlace(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPNGUnknownInterlace(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPNGUnknownInterlace(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPNGUnknownInterlace(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPNGNoImageData; +class PASCALIMPLEMENTATION EPNGNoImageData : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPNGNoImageData(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPNGNoImageData(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPNGNoImageData(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPNGNoImageData(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPNGNoImageData(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPNGNoImageData(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPNGNoImageData(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPNGNoImageData(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPNGNoImageData(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPNGCouldNotLoadResource; +class PASCALIMPLEMENTATION EPNGCouldNotLoadResource : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPNGCouldNotLoadResource(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPNGCouldNotLoadResource(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPNGCouldNotLoadResource(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPNGCouldNotLoadResource(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPNGCouldNotLoadResource(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPNGCouldNotLoadResource(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPNGCouldNotLoadResource(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPNGCouldNotLoadResource(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPNGCouldNotLoadResource(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPNGCannotChangeTransparent; +class PASCALIMPLEMENTATION EPNGCannotChangeTransparent : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPNGCannotChangeTransparent(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPNGCannotChangeTransparent(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPNGCannotChangeTransparent(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPNGCannotChangeTransparent(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPNGCannotChangeTransparent(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPNGCannotChangeTransparent(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPNGCannotChangeTransparent(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPNGCannotChangeTransparent(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPNGCannotChangeTransparent(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPNGHeaderNotPresent; +class PASCALIMPLEMENTATION EPNGHeaderNotPresent : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPNGHeaderNotPresent(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPNGHeaderNotPresent(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPNGHeaderNotPresent(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPNGHeaderNotPresent(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPNGHeaderNotPresent(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPNGHeaderNotPresent(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPNGHeaderNotPresent(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPNGHeaderNotPresent(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPNGHeaderNotPresent(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPNGInvalidNewSize; +class PASCALIMPLEMENTATION EPNGInvalidNewSize : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPNGInvalidNewSize(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPNGInvalidNewSize(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPNGInvalidNewSize(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPNGInvalidNewSize(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPNGInvalidNewSize(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPNGInvalidNewSize(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPNGInvalidNewSize(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPNGInvalidNewSize(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPNGInvalidNewSize(void) { } + #pragma option pop + +}; + + +class DELPHICLASS EPNGInvalidSpec; +class PASCALIMPLEMENTATION EPNGInvalidSpec : public Sysutils::Exception +{ + typedef Sysutils::Exception inherited; + +public: + #pragma option push -w-inl + /* Exception.Create */ inline __fastcall EPNGInvalidSpec(const AnsiString Msg) : Sysutils::Exception(Msg) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmt */ inline __fastcall EPNGInvalidSpec(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size) : Sysutils::Exception(Msg, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateRes */ inline __fastcall EPNGInvalidSpec(int Ident)/* overload */ : Sysutils::Exception(Ident) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmt */ inline __fastcall EPNGInvalidSpec(int Ident, const System::TVarRec * Args, const int Args_Size)/* overload */ : Sysutils::Exception(Ident, Args, Args_Size) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateHelp */ inline __fastcall EPNGInvalidSpec(const AnsiString Msg, int AHelpContext) : Sysutils::Exception(Msg, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateFmtHelp */ inline __fastcall EPNGInvalidSpec(const AnsiString Msg, const System::TVarRec * Args, const int Args_Size, int AHelpContext) : Sysutils::Exception(Msg, Args, Args_Size, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResHelp */ inline __fastcall EPNGInvalidSpec(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { } + #pragma option pop + #pragma option push -w-inl + /* Exception.CreateResFmtHelp */ inline __fastcall EPNGInvalidSpec(System::PResStringRec ResStringRec, const System::TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ : Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext) { } + #pragma option pop + +public: + #pragma option push -w-inl + /* TObject.Destroy */ inline __fastcall virtual ~EPNGInvalidSpec(void) { } + #pragma option pop + +}; + + +typedef tagRGBTRIPLE TRGBLine[65536]; + +typedef tagRGBTRIPLE *pRGBLine; + +#pragma pack(push, 1) +struct TMAXBITMAPINFO +{ + tagBITMAPINFOHEADER bmiHeader; + tagRGBQUAD bmiColors[256]; +} ; +#pragma pack(pop) + +#pragma option push -b- +enum TPNGTransparencyMode { ptmNone, ptmBit, ptmPartial }; +#pragma option pop + +typedef unsigned *pCardinal; + +struct TRGBPixel; +typedef TRGBPixel *pRGBPixel; + +#pragma pack(push, 1) +struct TRGBPixel +{ + Byte B; + Byte G; + Byte R; +} ; +#pragma pack(pop) + +typedef Byte TByteArray[65536]; + +typedef Byte *pByteArray; + +typedef void *TPointerArray[65536]; + +typedef void * *pPointerArray; + +class DELPHICLASS TPNGPointerList; +class DELPHICLASS TPNGObject; +#pragma option push -b- +enum TFilter { pfNone, pfSub, pfUp, pfAverage, pfPaeth }; +#pragma option pop + +typedef Set<TFilter, pfNone, pfPaeth> TFilters; + +typedef Shortint TCompressionLevel; + +#pragma option push -b- +enum TInterlaceMethod { imNone, imAdam7 }; +#pragma option pop + +class DELPHICLASS TPNGList; +class PASCALIMPLEMENTATION TPNGPointerList : public System::TObject +{ + typedef System::TObject inherited; + +private: + TPNGObject* fOwner; + unsigned fCount; + void * *fMemory; + void * __fastcall GetItem(unsigned Index); + void __fastcall SetItem(unsigned Index, const void * Value); + +protected: + virtual void * __fastcall Remove(void * Value); + void __fastcall Insert(void * Value, unsigned Position); + void __fastcall Add(void * Value); + __property void * Item[unsigned Index] = {read=GetItem, write=SetItem}; + void __fastcall SetSize(const unsigned Size); + __property TPNGObject* Owner = {read=fOwner}; + +public: + __property unsigned Count = {read=fCount, write=SetSize, nodefault}; + __fastcall TPNGPointerList(TPNGObject* AOwner); + __fastcall virtual ~TPNGPointerList(void); +}; + + +class DELPHICLASS TChunk; +typedef TMetaClass*TChunkClass; + +class PASCALIMPLEMENTATION TPNGList : public TPNGPointerList +{ + typedef TPNGPointerList inherited; + +private: + HIDESBASE TChunk* __fastcall GetItem(unsigned Index); + +public: + TChunk* __fastcall FindChunk(TMetaClass* ChunkClass); + void __fastcall RemoveChunk(TChunk* Chunk)/* overload */; + HIDESBASE TChunk* __fastcall Add(TMetaClass* ChunkClass); + TChunk* __fastcall ItemFromClass(TMetaClass* ChunkClass); + __property TChunk* Item[unsigned Index] = {read=GetItem}; +public: + #pragma option push -w-inl + /* TPNGPointerList.Create */ inline __fastcall TPNGList(TPNGObject* AOwner) : TPNGPointerList(AOwner) { } + #pragma option pop + #pragma option push -w-inl + /* TPNGPointerList.Destroy */ inline __fastcall virtual ~TPNGList(void) { } + #pragma option pop + +}; + + +class DELPHICLASS TChunkpHYs; +class DELPHICLASS TChunkIHDR; +class PASCALIMPLEMENTATION TPNGObject : public Graphics::TGraphic +{ + typedef Graphics::TGraphic inherited; + +protected: + Byte InverseGamma[256]; + void __fastcall InitializeGamma(void); + +private: + Graphics::TCanvas* fCanvas; + TFilters fFilters; + TCompressionLevel fCompressionLevel; + int fMaxIdatSize; + TInterlaceMethod fInterlaceMethod; + TPNGList* fChunkList; + void __fastcall ClearChunks(void); + bool __fastcall HeaderPresent(void); + void __fastcall GetPixelInfo(unsigned &LineSize, unsigned &Offset); + void __fastcall SetMaxIdatSize(const int Value); + pByteArray __fastcall GetAlphaScanline(const int LineIndex); + void * __fastcall GetScanline(const int LineIndex); + void * __fastcall GetExtraScanline(const int LineIndex); + TChunkpHYs* __fastcall GetPixelInformation(void); + TPNGTransparencyMode __fastcall GetTransparencyMode(void); + Graphics::TColor __fastcall GetTransparentColor(void); + void __fastcall SetTransparentColor(const Graphics::TColor Value); + AnsiString __fastcall GetLibraryVersion(); + +protected: + bool BeingCreated; + virtual HPALETTE __fastcall GetPalette(void); + virtual void __fastcall SetPalette(HPALETTE Value); + void __fastcall DoSetPalette(HPALETTE Value, const bool UpdateColors); + virtual int __fastcall GetWidth(void); + virtual int __fastcall GetHeight(void); + virtual void __fastcall SetWidth(int Value); + virtual void __fastcall SetHeight(int Value); + void __fastcall AssignPNG(TPNGObject* Source); + virtual bool __fastcall GetEmpty(void); + TChunkIHDR* __fastcall GetHeader(void); + void __fastcall DrawPartialTrans(HDC DC, const Types::TRect &Rect); + virtual bool __fastcall GetTransparent(void); + virtual Graphics::TColor __fastcall GetPixels(const int X, const int Y); + virtual void __fastcall SetPixels(const int X, const int Y, const Graphics::TColor Value); + +public: + Byte GammaTable[256]; + void __fastcall Resize(const int CX, const int CY); + void __fastcall CreateAlpha(void); + void __fastcall RemoveTransparency(void); + __property Graphics::TColor TransparentColor = {read=GetTransparentColor, write=SetTransparentColor, nodefault}; + void __fastcall AddtEXt(const AnsiString Keyword, const AnsiString Text); + void __fastcall AddzTXt(const AnsiString Keyword, const AnsiString Text); + virtual void __fastcall SaveToClipboardFormat(Word &AFormat, unsigned &AData, HPALETTE &APalette); + virtual void __fastcall LoadFromClipboardFormat(Word AFormat, unsigned AData, HPALETTE APalette); + void __fastcall RaiseError(TMetaClass* ExceptionClass, AnsiString Text); + __property void * Scanline[int Index] = {read=GetScanline}; + __property void * ExtraScanline[int Index] = {read=GetExtraScanline}; + bool __fastcall HasPixelInformation(void); + __property TChunkpHYs* PixelInformation = {read=GetPixelInformation}; + __property pByteArray AlphaScanline[int Index] = {read=GetAlphaScanline}; + void __fastcall DrawUsingPixelInformation(Graphics::TCanvas* Canvas, const Types::TPoint &Point); + __property Graphics::TCanvas* Canvas = {read=fCanvas}; + __property TChunkIHDR* Header = {read=GetHeader}; + __property TPNGTransparencyMode TransparencyMode = {read=GetTransparencyMode, nodefault}; + virtual void __fastcall Assign(Classes::TPersistent* Source); + virtual void __fastcall AssignTo(Classes::TPersistent* Dest); + void __fastcall AssignHandle(HBITMAP Handle, bool Transparent, unsigned TransparentColor); + virtual void __fastcall Draw(Graphics::TCanvas* ACanvas, const Types::TRect &Rect); + __property int Width = {read=GetWidth, nodefault}; + __property int Height = {read=GetHeight, nodefault}; + __property TInterlaceMethod InterlaceMethod = {read=fInterlaceMethod, write=fInterlaceMethod, nodefault}; + __property TFilters Filters = {read=fFilters, write=fFilters, nodefault}; + __property int MaxIdatSize = {read=fMaxIdatSize, write=SetMaxIdatSize, nodefault}; + __property bool Empty = {read=GetEmpty, nodefault}; + __property TCompressionLevel CompressionLevel = {read=fCompressionLevel, write=fCompressionLevel, nodefault}; + __property TPNGList* Chunks = {read=fChunkList}; + __fastcall virtual TPNGObject(void); + __fastcall TPNGObject(unsigned ColorType, unsigned Bitdepth, int cx, int cy); + __fastcall virtual ~TPNGObject(void); + virtual void __fastcall LoadFromStream(Classes::TStream* Stream); + virtual void __fastcall SaveToStream(Classes::TStream* Stream); + void __fastcall LoadFromResourceName(unsigned Instance, const AnsiString Name); + void __fastcall LoadFromResourceID(unsigned Instance, int ResID); + __property Graphics::TColor Pixels[int X][int Y] = {read=GetPixels, write=SetPixels}; + __property AnsiString Version = {read=GetLibraryVersion}; +}; + + + +typedef char TChunkName[4]; + +class PASCALIMPLEMENTATION TChunk : public System::TObject +{ + typedef System::TObject inherited; + +private: + void *fData; + unsigned fDataSize; + TPNGObject* fOwner; + char fName[4]; + TChunkIHDR* __fastcall GetHeader(void); + int __fastcall GetIndex(void); + /* virtual class method */ virtual AnsiString __fastcall GetName(TMetaClass* vmt); + AnsiString __fastcall GetChunkName(); + +public: + __property int Index = {read=GetIndex, nodefault}; + __property TChunkIHDR* Header = {read=GetHeader}; + void __fastcall ResizeData(const unsigned NewSize); + __property void * Data = {read=fData}; + __property unsigned DataSize = {read=fDataSize, nodefault}; + virtual void __fastcall Assign(TChunk* Source); + __property TPNGObject* Owner = {read=fOwner}; + __fastcall virtual TChunk(TPNGObject* Owner); + __fastcall virtual ~TChunk(void); + __property AnsiString Name = {read=GetChunkName}; + virtual bool __fastcall LoadFromStream(Classes::TStream* Stream, const char * ChunkName, int Size); + bool __fastcall SaveData(Classes::TStream* Stream); + virtual bool __fastcall SaveToStream(Classes::TStream* Stream); +}; + + +class DELPHICLASS TChunkIEND; +class PASCALIMPLEMENTATION TChunkIEND : public TChunk +{ + typedef TChunk inherited; + +public: + #pragma option push -w-inl + /* TChunk.Create */ inline __fastcall virtual TChunkIEND(TPNGObject* Owner) : TChunk(Owner) { } + #pragma option pop + #pragma option push -w-inl + /* TChunk.Destroy */ inline __fastcall virtual ~TChunkIEND(void) { } + #pragma option pop + +}; + + +struct TIHDRData; +typedef TIHDRData *pIHDRData; + +#pragma pack(push, 1) +struct TIHDRData +{ + unsigned Width; + unsigned Height; + Byte BitDepth; + Byte ColorType; + Byte CompressionMethod; + Byte FilterMethod; + Byte InterlaceMethod; +} ; +#pragma pack(pop) + +class PASCALIMPLEMENTATION TChunkIHDR : public TChunk +{ + typedef TChunk inherited; + +private: + HBITMAP ImageHandle; + HDC ImageDC; + HPALETTE ImagePalette; + bool HasPalette; + #pragma pack(push, 1) + TMAXBITMAPINFO BitmapInfo; + #pragma pack(pop) + + void *ExtraImageData; + void *ImageData; + void *ImageAlpha; + #pragma pack(push, 1) + TIHDRData IHDRData; + #pragma pack(pop) + + +protected: + int BytesPerRow; + HPALETTE __fastcall CreateGrayscalePalette(int Bitdepth); + void __fastcall PaletteToDIB(HPALETTE Palette); + void __fastcall PrepareImageData(void); + void __fastcall FreeImageData(void); + +public: + __property HBITMAP ImageHandleValue = {read=ImageHandle, nodefault}; + __property unsigned Width = {read=IHDRData.Width, write=IHDRData.Width, nodefault}; + __property unsigned Height = {read=IHDRData.Height, write=IHDRData.Height, nodefault}; + __property Byte BitDepth = {read=IHDRData.BitDepth, write=IHDRData.BitDepth, nodefault}; + __property Byte ColorType = {read=IHDRData.ColorType, write=IHDRData.ColorType, nodefault}; + __property Byte CompressionMethod = {read=IHDRData.CompressionMethod, write=IHDRData.CompressionMethod, nodefault}; + __property Byte FilterMethod = {read=IHDRData.FilterMethod, write=IHDRData.FilterMethod, nodefault}; + __property Byte InterlaceMethod = {read=IHDRData.InterlaceMethod, write=IHDRData.InterlaceMethod, nodefault}; + virtual bool __fastcall LoadFromStream(Classes::TStream* Stream, const char * ChunkName, int Size); + virtual bool __fastcall SaveToStream(Classes::TStream* Stream); + __fastcall virtual TChunkIHDR(TPNGObject* Owner); + __fastcall virtual ~TChunkIHDR(void); + virtual void __fastcall Assign(TChunk* Source); +}; + + +#pragma option push -b- +enum TUnitType { utUnknown, utMeter }; +#pragma option pop + +typedef TUnitType *pUnitType; + +class PASCALIMPLEMENTATION TChunkpHYs : public TChunk +{ + typedef TChunk inherited; + +private: + unsigned fPPUnitX; + unsigned fPPUnitY; + TUnitType fUnit; + +public: + __property unsigned PPUnitX = {read=fPPUnitX, write=fPPUnitX, nodefault}; + __property unsigned PPUnitY = {read=fPPUnitY, write=fPPUnitY, nodefault}; + __property TUnitType UnitType = {read=fUnit, write=fUnit, nodefault}; + virtual bool __fastcall LoadFromStream(Classes::TStream* Stream, const char * ChunkName, int Size); + virtual bool __fastcall SaveToStream(Classes::TStream* Stream); + virtual void __fastcall Assign(TChunk* Source); +public: + #pragma option push -w-inl + /* TChunk.Create */ inline __fastcall virtual TChunkpHYs(TPNGObject* Owner) : TChunk(Owner) { } + #pragma option pop + #pragma option push -w-inl + /* TChunk.Destroy */ inline __fastcall virtual ~TChunkpHYs(void) { } + #pragma option pop + +}; + + +class DELPHICLASS TChunkgAMA; +class PASCALIMPLEMENTATION TChunkgAMA : public TChunk +{ + typedef TChunk inherited; + +private: + unsigned __fastcall GetValue(void); + void __fastcall SetValue(const unsigned Value); + +public: + __property unsigned Gamma = {read=GetValue, write=SetValue, nodefault}; + virtual bool __fastcall LoadFromStream(Classes::TStream* Stream, const char * ChunkName, int Size); + __fastcall virtual TChunkgAMA(TPNGObject* Owner); + virtual void __fastcall Assign(TChunk* Source); +public: + #pragma option push -w-inl + /* TChunk.Destroy */ inline __fastcall virtual ~TChunkgAMA(void) { } + #pragma option pop + +}; + + +#pragma pack(push, 1) +struct TZStreamRec2 +{ + Zlibpas::TZStreamRec ZLIB; + void *Data; + Classes::TStream* fStream; +} ; +#pragma pack(pop) + +class DELPHICLASS TChunkPLTE; +class PASCALIMPLEMENTATION TChunkPLTE : public TChunk +{ + typedef TChunk inherited; + +protected: + int fCount; + +private: + tagRGBQUAD __fastcall GetPaletteItem(Byte Index); + +public: + __property tagRGBQUAD Item[Byte Index] = {read=GetPaletteItem}; + __property int Count = {read=fCount, nodefault}; + virtual bool __fastcall LoadFromStream(Classes::TStream* Stream, const char * ChunkName, int Size); + virtual bool __fastcall SaveToStream(Classes::TStream* Stream); + virtual void __fastcall Assign(TChunk* Source); +public: + #pragma option push -w-inl + /* TChunk.Create */ inline __fastcall virtual TChunkPLTE(TPNGObject* Owner) : TChunk(Owner) { } + #pragma option pop + #pragma option push -w-inl + /* TChunk.Destroy */ inline __fastcall virtual ~TChunkPLTE(void) { } + #pragma option pop + +}; + + +class DELPHICLASS TChunktRNS; +class PASCALIMPLEMENTATION TChunktRNS : public TChunk +{ + typedef TChunk inherited; + +private: + bool fBitTransparency; + unsigned __fastcall GetTransparentColor(void); + void __fastcall SetTransparentColor(const unsigned Value); + +public: + Byte PaletteValues[256]; + __property bool BitTransparency = {read=fBitTransparency, nodefault}; + __property unsigned TransparentColor = {read=GetTransparentColor, write=SetTransparentColor, nodefault}; + virtual bool __fastcall LoadFromStream(Classes::TStream* Stream, const char * ChunkName, int Size); + virtual bool __fastcall SaveToStream(Classes::TStream* Stream); + virtual void __fastcall Assign(TChunk* Source); +public: + #pragma option push -w-inl + /* TChunk.Create */ inline __fastcall virtual TChunktRNS(TPNGObject* Owner) : TChunk(Owner) { } + #pragma option pop + #pragma option push -w-inl + /* TChunk.Destroy */ inline __fastcall virtual ~TChunktRNS(void) { } + #pragma option pop + +}; + + +class DELPHICLASS TChunkIDAT; +class PASCALIMPLEMENTATION TChunkIDAT : public TChunk +{ + typedef TChunk inherited; + +private: + TChunkIHDR* Header; + int ImageWidth; + int ImageHeight; + unsigned Row_Bytes; + unsigned Offset; + Byte *Encode_Buffer[6]; + Byte *Row_Buffer[2]; + bool RowUsed; + int EndPos; + void __fastcall FilterRow(void); + Byte __fastcall FilterToEncode(void); + int __fastcall IDATZlibRead(TZStreamRec2 &ZLIBStream, void * Buffer, int Count, int &EndPos, unsigned &crcfile); + void __fastcall IDATZlibWrite(TZStreamRec2 &ZLIBStream, void * Buffer, const unsigned Length); + void __fastcall FinishIDATZlib(TZStreamRec2 &ZLIBStream); + void __fastcall PreparePalette(void); + +protected: + void __fastcall DecodeInterlacedAdam7(Classes::TStream* Stream, TZStreamRec2 &ZLIBStream, const int Size, unsigned &crcfile); + void __fastcall DecodeNonInterlaced(Classes::TStream* Stream, TZStreamRec2 &ZLIBStream, const int Size, unsigned &crcfile); + void __fastcall EncodeNonInterlaced(Classes::TStream* Stream, TZStreamRec2 &ZLIBStream); + void __fastcall EncodeInterlacedAdam7(Classes::TStream* Stream, TZStreamRec2 &ZLIBStream); + void __fastcall CopyNonInterlacedRGB8(char * Src, char * Dest, char * Trans, char * Extra); + void __fastcall CopyNonInterlacedRGB16(char * Src, char * Dest, char * Trans, char * Extra); + void __fastcall CopyNonInterlacedPalette148(char * Src, char * Dest, char * Trans, char * Extra); + void __fastcall CopyNonInterlacedPalette2(char * Src, char * Dest, char * Trans, char * Extra); + void __fastcall CopyNonInterlacedGray2(char * Src, char * Dest, char * Trans, char * Extra); + void __fastcall CopyNonInterlacedGrayscale16(char * Src, char * Dest, char * Trans, char * Extra); + void __fastcall CopyNonInterlacedRGBAlpha8(char * Src, char * Dest, char * Trans, char * Extra); + void __fastcall CopyNonInterlacedRGBAlpha16(char * Src, char * Dest, char * Trans, char * Extra); + void __fastcall CopyNonInterlacedGrayscaleAlpha8(char * Src, char * Dest, char * Trans, char * Extra); + void __fastcall CopyNonInterlacedGrayscaleAlpha16(char * Src, char * Dest, char * Trans, char * Extra); + void __fastcall CopyInterlacedRGB8(const Byte Pass, char * Src, char * Dest, char * Trans, char * Extra); + void __fastcall CopyInterlacedRGB16(const Byte Pass, char * Src, char * Dest, char * Trans, char * Extra); + void __fastcall CopyInterlacedPalette148(const Byte Pass, char * Src, char * Dest, char * Trans, char * Extra); + void __fastcall CopyInterlacedPalette2(const Byte Pass, char * Src, char * Dest, char * Trans, char * Extra); + void __fastcall CopyInterlacedGray2(const Byte Pass, char * Src, char * Dest, char * Trans, char * Extra); + void __fastcall CopyInterlacedGrayscale16(const Byte Pass, char * Src, char * Dest, char * Trans, char * Extra); + void __fastcall CopyInterlacedRGBAlpha8(const Byte Pass, char * Src, char * Dest, char * Trans, char * Extra); + void __fastcall CopyInterlacedRGBAlpha16(const Byte Pass, char * Src, char * Dest, char * Trans, char * Extra); + void __fastcall CopyInterlacedGrayscaleAlpha8(const Byte Pass, char * Src, char * Dest, char * Trans, char * Extra); + void __fastcall CopyInterlacedGrayscaleAlpha16(const Byte Pass, char * Src, char * Dest, char * Trans, char * Extra); + void __fastcall EncodeNonInterlacedRGB8(char * Src, char * Dest, char * Trans); + void __fastcall EncodeNonInterlacedRGB16(char * Src, char * Dest, char * Trans); + void __fastcall EncodeNonInterlacedGrayscale16(char * Src, char * Dest, char * Trans); + void __fastcall EncodeNonInterlacedPalette148(char * Src, char * Dest, char * Trans); + void __fastcall EncodeNonInterlacedRGBAlpha8(char * Src, char * Dest, char * Trans); + void __fastcall EncodeNonInterlacedRGBAlpha16(char * Src, char * Dest, char * Trans); + void __fastcall EncodeNonInterlacedGrayscaleAlpha8(char * Src, char * Dest, char * Trans); + void __fastcall EncodeNonInterlacedGrayscaleAlpha16(char * Src, char * Dest, char * Trans); + void __fastcall EncodeInterlacedRGB8(const Byte Pass, char * Src, char * Dest, char * Trans); + void __fastcall EncodeInterlacedRGB16(const Byte Pass, char * Src, char * Dest, char * Trans); + void __fastcall EncodeInterlacedPalette148(const Byte Pass, char * Src, char * Dest, char * Trans); + void __fastcall EncodeInterlacedGrayscale16(const Byte Pass, char * Src, char * Dest, char * Trans); + void __fastcall EncodeInterlacedRGBAlpha8(const Byte Pass, char * Src, char * Dest, char * Trans); + void __fastcall EncodeInterlacedRGBAlpha16(const Byte Pass, char * Src, char * Dest, char * Trans); + void __fastcall EncodeInterlacedGrayscaleAlpha8(const Byte Pass, char * Src, char * Dest, char * Trans); + void __fastcall EncodeInterlacedGrayscaleAlpha16(const Byte Pass, char * Src, char * Dest, char * Trans); + +public: + virtual bool __fastcall LoadFromStream(Classes::TStream* Stream, const char * ChunkName, int Size); + virtual bool __fastcall SaveToStream(Classes::TStream* Stream); +public: + #pragma option push -w-inl + /* TChunk.Create */ inline __fastcall virtual TChunkIDAT(TPNGObject* Owner) : TChunk(Owner) { } + #pragma option pop + #pragma option push -w-inl + /* TChunk.Destroy */ inline __fastcall virtual ~TChunkIDAT(void) { } + #pragma option pop + +}; + + +class DELPHICLASS TChunktIME; +class PASCALIMPLEMENTATION TChunktIME : public TChunk +{ + typedef TChunk inherited; + +private: + Word fYear; + Byte fMonth; + Byte fDay; + Byte fHour; + Byte fMinute; + Byte fSecond; + +public: + __property Word Year = {read=fYear, write=fYear, nodefault}; + __property Byte Month = {read=fMonth, write=fMonth, nodefault}; + __property Byte Day = {read=fDay, write=fDay, nodefault}; + __property Byte Hour = {read=fHour, write=fHour, nodefault}; + __property Byte Minute = {read=fMinute, write=fMinute, nodefault}; + __property Byte Second = {read=fSecond, write=fSecond, nodefault}; + virtual bool __fastcall LoadFromStream(Classes::TStream* Stream, const char * ChunkName, int Size); + virtual bool __fastcall SaveToStream(Classes::TStream* Stream); + virtual void __fastcall Assign(TChunk* Source); +public: + #pragma option push -w-inl + /* TChunk.Create */ inline __fastcall virtual TChunktIME(TPNGObject* Owner) : TChunk(Owner) { } + #pragma option pop + #pragma option push -w-inl + /* TChunk.Destroy */ inline __fastcall virtual ~TChunktIME(void) { } + #pragma option pop + +}; + + +class DELPHICLASS TChunktEXt; +class PASCALIMPLEMENTATION TChunktEXt : public TChunk +{ + typedef TChunk inherited; + +private: + AnsiString fKeyword; + AnsiString fText; + +public: + __property AnsiString Keyword = {read=fKeyword, write=fKeyword}; + __property AnsiString Text = {read=fText, write=fText}; + virtual bool __fastcall LoadFromStream(Classes::TStream* Stream, const char * ChunkName, int Size); + virtual bool __fastcall SaveToStream(Classes::TStream* Stream); + virtual void __fastcall Assign(TChunk* Source); +public: + #pragma option push -w-inl + /* TChunk.Create */ inline __fastcall virtual TChunktEXt(TPNGObject* Owner) : TChunk(Owner) { } + #pragma option pop + #pragma option push -w-inl + /* TChunk.Destroy */ inline __fastcall virtual ~TChunktEXt(void) { } + #pragma option pop + +}; + + +class DELPHICLASS TChunkzTXt; +class PASCALIMPLEMENTATION TChunkzTXt : public TChunktEXt +{ + typedef TChunktEXt inherited; + +public: + virtual bool __fastcall LoadFromStream(Classes::TStream* Stream, const char * ChunkName, int Size); + virtual bool __fastcall SaveToStream(Classes::TStream* Stream); +public: + #pragma option push -w-inl + /* TChunk.Create */ inline __fastcall virtual TChunkzTXt(TPNGObject* Owner) : TChunktEXt(Owner) { } + #pragma option pop + #pragma option push -w-inl + /* TChunk.Destroy */ inline __fastcall virtual ~TChunkzTXt(void) { } + #pragma option pop + +}; + + +//-- var, const, procedure --------------------------------------------------- +#define LibraryVersion "1.564" +extern PACKAGE AnsiString ZLIBErrors[9]; +static const Shortint Z_NO_FLUSH = 0x0; +static const Shortint Z_FINISH = 0x4; +static const Shortint Z_STREAM_END = 0x1; +static const Shortint FILTER_NONE = 0x0; +static const Shortint FILTER_SUB = 0x1; +static const Shortint FILTER_UP = 0x2; +static const Shortint FILTER_AVERAGE = 0x3; +static const Shortint FILTER_PAETH = 0x4; +static const Shortint COLOR_GRAYSCALE = 0x0; +static const Shortint COLOR_RGB = 0x2; +static const Shortint COLOR_PALETTE = 0x3; +static const Shortint COLOR_GRAYSCALEALPHA = 0x4; +static const Shortint COLOR_RGBALPHA = 0x6; +extern PACKAGE unsigned __fastcall update_crc(unsigned crc, pByteArray buf, int len); +extern PACKAGE int __fastcall ByteSwap(const int a); +extern PACKAGE void __fastcall RegisterChunk(TMetaClass* ChunkClass); + +} /* namespace Pngimage */ +using namespace Pngimage; +#pragma option pop // -w- +#pragma option pop // -Vx + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // pngimage diff --git a/PNGImage/pngimage.obj b/PNGImage/pngimage.obj new file mode 100644 index 0000000..71f581e Binary files /dev/null and b/PNGImage/pngimage.obj differ diff --git a/PNGImage/pngimage.pas b/PNGImage/pngimage.pas new file mode 100644 index 0000000..d873ca0 --- /dev/null +++ b/PNGImage/pngimage.pas @@ -0,0 +1,5824 @@ +{Portable Network Graphics Delphi 1.564 (31 July 2006) } + +{This is a full, open sourced implementation of png in Delphi } +{It has native support for most of png features including the } +{partial transparency, gamma and more. } +{For the latest version, please be sure to check my website } +{http://pngdelphi.sourceforge.net } +{Gustavo Huffenbacher Daud (gustavo.daud@terra.com.br) } + + +{ + Version 1.564 + 2006-07-25 BUG 1 - There was one GDI Palette object leak + when assigning from other PNG (fixed) + BUG 2 - Loosing color information when assigning png + to bmp on lower screen depth system + BUG 3 - There was a bug in TStream.GetSize + (fixed thanks to Vladimir Panteleev) + IMPROVE 1 - When assigning png to bmp now alpha information + is drawn (simulated into a white background) + + Version 1.563 + 2006-07-25 BUG 1 - There was a memory bug in the main component + destructor (fixed thanks to Steven L Brenner) + BUG 2 - The packages name contained spaces which was + causing some strange bugs in Delphi + (fixed thanks to Martijn Saly) + BUG 3 - Lots of fixes when handling palettes + (bugs implemented in the last version) + Fixed thanks to Gabriel Corneanu!!! + BUG 4 - CreateAlpha was raising an error because it did + not resized the palette chunk it created; + Fixed thanks to Miha Sokolov + IMPROVE 1 - Renamed the pngzlib.pas unit to zlibpas.pas + as a tentative to all libraries use the same + shared zlib implementation and to avoid including + two or three times the same P-Code. + (Gabriel Corneanu idea) + + + + Version 1.561 + 2006-05-17 BUG 1 - There was a bug in the method that draws semi + transparent images (a memory leak). fixed. + + Version 1.56 + 2006-05-09 - IMPROVE 1 - Delphi standard TCanvas support is now implemented + IMPROVE 2 - The PNG files may now be resized and created from + scratch using CreateBlank, Resize, Width and Height + BUG 1 - Fixed some bugs on handling tRNS transparencies + BUG 2 - Fixed bugs related to palette handling + + Version 1.535 + 2006-04-21 - IMPROVE 1 - Now the library uses the latest ZLIB release (1.2.3) + (thanks to: Roberto Della Pasqua + http://www.dellapasqua.com/delphizlib/) + + Version 1.53 + 2006-04-14 - + BUG 1 - Remove transparency was not working for + RGB Alpha and Grayscale alpha. fixed + BUG 2 - There was a bug were compressed text chunks no keyword + name could not be read + IMPROVE 1 - Add classes and methods to work with the pHYs chunk + (including TPNGObject.DrawUsingPixelInformation) + IMPROVE 3 - Included a property Version to return the library + version + IMPROVE 4 - New polish translation (thanks to Piotr Domanski) + IMPROVE 5 - Now packages for delphi 5, 6, 7, 2005 and 2006 + + Also Martijn Saly (thany) made some improvements in the library: + IMPROVE 1 - SetPixel now works with grayscale + IMPROVE 2 - Palette property now can be written using a + windows handle + Thanks !! + + Version 1.5 + 2005-06-29 - Fixed a lot of bugs using tips from mails that Iґve + being receiving for some time + BUG 1 - Loosing palette when assigning to TBitmap. fixed + BUG 2 - SetPixels and GetPixels worked only with + parameters in range 0..255. fixed + BUG 3 - Force type address off using directive + BUG 4 - TChunkzTXt contained an error + BUG 5 - MaxIdatSize was not working correctly (fixed thanks + to Gabriel Corneanu + BUG 6 - Corrected german translation (thanks to Mael Horz) + And the following improvements: + IMPROVE 1 - Create ImageHandleValue properties as public in + TChunkIHDR to get access to this handle + IMPROVE 2 - Using SetStretchBltMode to improve stretch quality + IMPROVE 3 - Scale is now working for alpha transparent images + IMPROVE 4 - GammaTable propery is now public to support an + article in the help file + + Version 1.4361 + 2003-03-04 - Fixed important bug for simple transparency when using + RGB, Grayscale color modes + + Version 1.436 + 2003-03-04 - * NEW * Property Pixels for direct access to pixels + * IMPROVED * Palette property (TPngObject) (read only) + Slovenian traslation for the component (Miha Petelin) + Help file update (scanline article/png->jpg example) + + Version 1.435 + 2003-11-03 - * NEW * New chunk implementation zTXt (method AddzTXt) + * NEW * New compiler flags to store the extra 8 bits + from 16 bits samples (when saving it is ignored), the + extra data may be acessed using ExtraScanline property + * Fixed * a bug on tIMe chunk + French translation included (Thanks to IBE Software) + Bugs fixed + + Version 1.432 + 2002-08-24 - * NEW * A new method, CreateAlpha will transform the + current image into partial transparency. + Help file updated with a new article on how to handle + partial transparency. + + Version 1.431 + 2002-08-14 - Fixed and tested to work on: + C++ Builder 3 + C++ Builder 5 + Delphi 3 + There was an error when setting TransparentColor, fixed + New method, RemoveTransparency to remove image + BIT TRANSPARENCY + + Version 1.43 + 2002-08-01 - * NEW * Support for Delphi 3 and C++ Builder 3 + Implements mostly some things that were missing, + a few tweaks and fixes. + + Version 1.428 + 2002-07-24 - More minor fixes (thanks to Ian Boyd) + Bit transparency fixes + * NEW * Finally support to bit transparency + (palette / rgb / grayscale -> all) + + Version 1.427 + 2002-07-19 - Lots of bugs and leaks fixed + * NEW * method to easy adding text comments, AddtEXt + * NEW * property for setting bit transparency, + TransparentColor + + Version 1.426 + 2002-07-18 - Clipboard finally fixed and working + Changed UseDelphi trigger to UseDelphi + * NEW * Support for bit transparency bitmaps + when assigning from/to TBitmap objects + Altough it does not support drawing transparent + parts of bit transparency pngs (only partial) + it is closer than ever + + Version 1.425 + 2002-07-01 - Clipboard methods implemented + Lots of bugs fixed + + Version 1.424 + 2002-05-16 - Scanline and AlphaScanline are now working correctly. + New methods for handling the clipboard + + Version 1.423 + 2002-05-16 - * NEW * Partial transparency for 1, 2, 4 and 8 bits is + also supported using the tRNS chunk (for palette and + grayscaling). + New bug fixes (Peter Haas). + + Version 1.422 + 2002-05-14 - Fixed some critical leaks, thanks to Peter Haas tips. + New translation for German (Peter Haas). + + Version 1.421 + 2002-05-06 - Now uses new ZLIB version, 1.1.4 with some security + fixes. + LoadFromResourceID and LoadFromResourceName added and + help file updated for that. + The resources strings are now located in pnglang.pas. + New translation for Brazilian Portuguese. + Bugs fixed. + + IMPORTANT: As always Iґm looking for bugs on the library. If + anyone has found one, please send me an email and + I will fix asap. Thanks for all the help and ideas + I'm receiving so far.} + +{My email is : gustavo.daud@terra.com.br} +{Website link : http://pngdelphi.sourceforge.net} +{Gustavo Huffenbacher Daud} + +unit pngimage; + +interface + +{Triggers avaliable (edit the fields bellow)} +{$TYPEDADDRESS OFF} + +{$DEFINE UseDelphi} //Disable fat vcl units(perfect for small apps) +{$DEFINE ErrorOnUnknownCritical} //Error when finds an unknown critical chunk +{$DEFINE CheckCRC} //Enables CRC checking +{$DEFINE RegisterGraphic} //Registers TPNGObject to use with TPicture +{$DEFINE PartialTransparentDraw} //Draws partial transparent images +{$DEFINE Store16bits} //Stores the extra 8 bits from 16bits/sample +{$RANGECHECKS OFF} {$J+} + + + +uses + Windows {$IFDEF UseDelphi}, Classes, Graphics, SysUtils{$ENDIF}, + zlibpas, pnglang; + +const + LibraryVersion = '1.564'; + +{$IFNDEF UseDelphi} + const + soFromBeginning = 0; + soFromCurrent = 1; + soFromEnd = 2; +{$ENDIF} + +const + {ZLIB constants} + ZLIBErrors: Array[-6..2] of string = ('incompatible version (-6)', + 'buffer error (-5)', 'insufficient memory (-4)', 'data error (-3)', + 'stream error (-2)', 'file error (-1)', '(0)', 'stream end (1)', + 'need dictionary (2)'); + Z_NO_FLUSH = 0; + Z_FINISH = 4; + Z_STREAM_END = 1; + + {Avaliable PNG filters for mode 0} + FILTER_NONE = 0; + FILTER_SUB = 1; + FILTER_UP = 2; + FILTER_AVERAGE = 3; + FILTER_PAETH = 4; + + {Avaliable color modes for PNG} + COLOR_GRAYSCALE = 0; + COLOR_RGB = 2; + COLOR_PALETTE = 3; + COLOR_GRAYSCALEALPHA = 4; + COLOR_RGBALPHA = 6; + + +type + {$IFNDEF UseDelphi} + {Custom exception handler} + Exception = class(TObject) + constructor Create(Msg: String); + end; + ExceptClass = class of Exception; + TColor = ColorRef; + {$ENDIF} + + {Error types} + EPNGOutMemory = class(Exception); + EPngError = class(Exception); + EPngUnexpectedEnd = class(Exception); + EPngInvalidCRC = class(Exception); + EPngInvalidIHDR = class(Exception); + EPNGMissingMultipleIDAT = class(Exception); + EPNGZLIBError = class(Exception); + EPNGInvalidPalette = class(Exception); + EPNGInvalidFileHeader = class(Exception); + EPNGIHDRNotFirst = class(Exception); + EPNGNotExists = class(Exception); + EPNGSizeExceeds = class(Exception); + EPNGMissingPalette = class(Exception); + EPNGUnknownCriticalChunk = class(Exception); + EPNGUnknownCompression = class(Exception); + EPNGUnknownInterlace = class(Exception); + EPNGNoImageData = class(Exception); + EPNGCouldNotLoadResource = class(Exception); + EPNGCannotChangeTransparent = class(Exception); + EPNGHeaderNotPresent = class(Exception); + EPNGInvalidNewSize = class(Exception); + EPNGInvalidSpec = class(Exception); + +type + {Direct access to pixels using R,G,B} + TRGBLine = array[word] of TRGBTriple; + pRGBLine = ^TRGBLine; + + {Same as TBitmapInfo but with allocated space for} + {palette entries} + TMAXBITMAPINFO = packed record + bmiHeader: TBitmapInfoHeader; + bmiColors: packed array[0..255] of TRGBQuad; + end; + + {Transparency mode for pngs} + TPNGTransparencyMode = (ptmNone, ptmBit, ptmPartial); + {Pointer to a cardinal type} + pCardinal = ^Cardinal; + {Access to a rgb pixel} + pRGBPixel = ^TRGBPixel; + TRGBPixel = packed record + B, G, R: Byte; + end; + + {Pointer to an array of bytes type} + TByteArray = Array[Word] of Byte; + pByteArray = ^TByteArray; + + {Forward} + TPNGObject = class; + pPointerArray = ^TPointerArray; + TPointerArray = Array[Word] of Pointer; + + {Contains a list of objects} + TPNGPointerList = class + private + fOwner: TPNGObject; + fCount : Cardinal; + fMemory: pPointerArray; + function GetItem(Index: Cardinal): Pointer; + procedure SetItem(Index: Cardinal; const Value: Pointer); + protected + {Removes an item} + function Remove(Value: Pointer): Pointer; virtual; + {Inserts an item} + procedure Insert(Value: Pointer; Position: Cardinal); + {Add a new item} + procedure Add(Value: Pointer); + {Returns an item} + property Item[Index: Cardinal]: Pointer read GetItem write SetItem; + {Set the size of the list} + procedure SetSize(const Size: Cardinal); + {Returns owner} + property Owner: TPNGObject read fOwner; + public + {Returns number of items} + property Count: Cardinal read fCount write SetSize; + {Object being either created or destroyed} + constructor Create(AOwner: TPNGObject); + destructor Destroy; override; + end; + + {Forward declaration} + TChunk = class; + TChunkClass = class of TChunk; + + {Same as TPNGPointerList but providing typecasted values} + TPNGList = class(TPNGPointerList) + private + {Used with property Item} + function GetItem(Index: Cardinal): TChunk; + public + {Finds the first item with this class} + function FindChunk(ChunkClass: TChunkClass): TChunk; + {Removes an item} + procedure RemoveChunk(Chunk: TChunk); overload; + {Add a new chunk using the class from the parameter} + function Add(ChunkClass: TChunkClass): TChunk; + {Returns pointer to the first chunk of class} + function ItemFromClass(ChunkClass: TChunkClass): TChunk; + {Returns a chunk item from the list} + property Item[Index: Cardinal]: TChunk read GetItem; + end; + + {$IFNDEF UseDelphi} + {The STREAMs bellow are only needed in case delphi provided ones is not} + {avaliable (UseDelphi trigger not set)} + {Object becomes handles} + TCanvas = THandle; + TBitmap = HBitmap; + {Trick to work} + TPersistent = TObject; + + {Base class for all streams} + TStream = class + protected + {Returning/setting size} + function GetSize: Longint; virtual; + procedure SetSize(const Value: Longint); virtual; abstract; + {Returns/set position} + function GetPosition: Longint; virtual; + procedure SetPosition(const Value: Longint); virtual; + public + {Returns/sets current position} + property Position: Longint read GetPosition write SetPosition; + {Property returns/sets size} + property Size: Longint read GetSize write SetSize; + {Allows reading/writing data} + function Read(var Buffer; Count: Longint): Cardinal; virtual; abstract; + function Write(const Buffer; Count: Longint): Cardinal; virtual; abstract; + {Copies from another Stream} + function CopyFrom(Source: TStream; + Count: Cardinal): Cardinal; virtual; + {Seeks a stream position} + function Seek(Offset: Longint; Origin: Word): Longint; virtual; abstract; + end; + + {File stream modes} + TFileStreamMode = (fsmRead, fsmWrite, fsmCreate); + TFileStreamModeSet = set of TFileStreamMode; + + {File stream for reading from files} + TFileStream = class(TStream) + private + {Opened mode} + Filemode: TFileStreamModeSet; + {Handle} + fHandle: THandle; + protected + {Set the size of the file} + procedure SetSize(const Value: Longint); override; + public + {Seeks a file position} + function Seek(Offset: Longint; Origin: Word): Longint; override; + {Reads/writes data from/to the file} + function Read(var Buffer; Count: Longint): Cardinal; override; + function Write(const Buffer; Count: Longint): Cardinal; override; + {Stream being created and destroy} + constructor Create(Filename: String; Mode: TFileStreamModeSet); + destructor Destroy; override; + end; + + {Stream for reading from resources} + TResourceStream = class(TStream) + constructor Create(Instance: HInst; const ResName: String; ResType:PChar); + private + {Variables for reading} + Size: Integer; + Memory: Pointer; + Position: Integer; + protected + {Set the size of the file} + procedure SetSize(const Value: Longint); override; + public + {Stream processing} + function Read(var Buffer; Count: Integer): Cardinal; override; + function Seek(Offset: Integer; Origin: Word): Longint; override; + function Write(const Buffer; Count: Longint): Cardinal; override; + end; + {$ENDIF} + + {Forward} + TChunkIHDR = class; + TChunkpHYs = class; + {Interlace method} + TInterlaceMethod = (imNone, imAdam7); + {Compression level type} + TCompressionLevel = 0..9; + {Filters type} + TFilter = (pfNone, pfSub, pfUp, pfAverage, pfPaeth); + TFilters = set of TFilter; + + {Png implementation object} + TPngObject = class{$IFDEF UseDelphi}(TGraphic){$ENDIF} + protected + {Inverse gamma table values} + InverseGamma: Array[Byte] of Byte; + procedure InitializeGamma; + private + {Canvas} + {$IFDEF UseDelphi}fCanvas: TCanvas;{$ENDIF} + {Filters to test to encode} + fFilters: TFilters; + {Compression level for ZLIB} + fCompressionLevel: TCompressionLevel; + {Maximum size for IDAT chunks} + fMaxIdatSize: Integer; + {Returns if image is interlaced} + fInterlaceMethod: TInterlaceMethod; + {Chunks object} + fChunkList: TPngList; + {Clear all chunks in the list} + procedure ClearChunks; + {Returns if header is present} + function HeaderPresent: Boolean; + procedure GetPixelInfo(var LineSize, Offset: Cardinal); + {Returns linesize and byte offset for pixels} + procedure SetMaxIdatSize(const Value: Integer); + function GetAlphaScanline(const LineIndex: Integer): pByteArray; + function GetScanline(const LineIndex: Integer): Pointer; + {$IFDEF Store16bits} + function GetExtraScanline(const LineIndex: Integer): Pointer; + {$ENDIF} + function GetPixelInformation: TChunkpHYs; + function GetTransparencyMode: TPNGTransparencyMode; + function GetTransparentColor: TColor; + procedure SetTransparentColor(const Value: TColor); + {Returns the version} + function GetLibraryVersion: String; + protected + {Being created} + BeingCreated: Boolean; + {Returns / set the image palette} + function GetPalette: HPALETTE; {$IFDEF UseDelphi}override;{$ENDIF} + procedure SetPalette(Value: HPALETTE); {$IFDEF UseDelphi}override;{$ENDIF} + procedure DoSetPalette(Value: HPALETTE; const UpdateColors: Boolean); + {Returns/sets image width and height} + function GetWidth: Integer; {$IFDEF UseDelphi}override;{$ENDIF} + function GetHeight: Integer; {$IFDEF UseDelphi}override; {$ENDIF} + procedure SetWidth(Value: Integer); {$IFDEF UseDelphi}override; {$ENDIF} + procedure SetHeight(Value: Integer); {$IFDEF UseDelphi}override;{$ENDIF} + {Assigns from another TPNGObject} + procedure AssignPNG(Source: TPNGObject); + {Returns if the image is empty} + function GetEmpty: Boolean; {$IFDEF UseDelphi}override; {$ENDIF} + {Used with property Header} + function GetHeader: TChunkIHDR; + {Draws using partial transparency} + procedure DrawPartialTrans(DC: HDC; Rect: TRect); + {$IFDEF UseDelphi} + {Returns if the image is transparent} + function GetTransparent: Boolean; override; + {$ENDIF} + {Returns a pixel} + function GetPixels(const X, Y: Integer): TColor; virtual; + procedure SetPixels(const X, Y: Integer; const Value: TColor); virtual; + public + {Gamma table array} + GammaTable: Array[Byte] of Byte; + {Resizes the PNG image} + procedure Resize(const CX, CY: Integer); + {Generates alpha information} + procedure CreateAlpha; + {Removes the image transparency} + procedure RemoveTransparency; + {Transparent color} + property TransparentColor: TColor read GetTransparentColor write + SetTransparentColor; + {Add text chunk, TChunkTEXT, TChunkzTXT} + procedure AddtEXt(const Keyword, Text: String); + procedure AddzTXt(const Keyword, Text: String); + {$IFDEF UseDelphi} + {Saves to clipboard format (thanks to Antoine Pottern)} + procedure SaveToClipboardFormat(var AFormat: Word; var AData: THandle; + var APalette: HPalette); override; + procedure LoadFromClipboardFormat(AFormat: Word; AData: THandle; + APalette: HPalette); override; + {$ENDIF} + {Calling errors} + procedure RaiseError(ExceptionClass: ExceptClass; Text: String); + {Returns a scanline from png} + property Scanline[const Index: Integer]: Pointer read GetScanline; + {$IFDEF Store16bits} + property ExtraScanline[const Index: Integer]: Pointer read GetExtraScanline; + {$ENDIF} + {Used to return pixel information} + function HasPixelInformation: Boolean; + property PixelInformation: TChunkpHYs read GetPixelInformation; + property AlphaScanline[const Index: Integer]: pByteArray read + GetAlphaScanline; + procedure DrawUsingPixelInformation(Canvas: TCanvas; Point: TPoint); + + {Canvas} + {$IFDEF UseDelphi}property Canvas: TCanvas read fCanvas;{$ENDIF} + {Returns pointer to the header} + property Header: TChunkIHDR read GetHeader; + {Returns the transparency mode used by this png} + property TransparencyMode: TPNGTransparencyMode read GetTransparencyMode; + {Assigns from another object} + procedure Assign(Source: TPersistent);{$IFDEF UseDelphi}override;{$ENDIF} + {Assigns to another object} + procedure AssignTo(Dest: TPersistent);{$IFDEF UseDelphi}override;{$ENDIF} + {Assigns from a windows bitmap handle} + procedure AssignHandle(Handle: HBitmap; Transparent: Boolean; + TransparentColor: ColorRef); + {Draws the image into a canvas} + procedure Draw(ACanvas: TCanvas; const Rect: TRect); + {$IFDEF UseDelphi}override;{$ENDIF} + {Width and height properties} + property Width: Integer read GetWidth; + property Height: Integer read GetHeight; + {Returns if the image is interlaced} + property InterlaceMethod: TInterlaceMethod read fInterlaceMethod + write fInterlaceMethod; + {Filters to test to encode} + property Filters: TFilters read fFilters write fFilters; + {Maximum size for IDAT chunks, default and minimum is 65536} + property MaxIdatSize: Integer read fMaxIdatSize write SetMaxIdatSize; + {Property to return if the image is empty or not} + property Empty: Boolean read GetEmpty; + {Compression level} + property CompressionLevel: TCompressionLevel read fCompressionLevel + write fCompressionLevel; + {Access to the chunk list} + property Chunks: TPngList read fChunkList; + {Object being created and destroyed} + constructor Create; {$IFDEF UseDelphi}override;{$ENDIF} + constructor CreateBlank(ColorType, Bitdepth: Cardinal; cx, cy: Integer); + destructor Destroy; override; + {$IFNDEF UseDelphi}procedure LoadFromFile(const Filename: String);{$ENDIF} + {$IFNDEF UseDelphi}procedure SaveToFile(const Filename: String);{$ENDIF} + procedure LoadFromStream(Stream: TStream); + {$IFDEF UseDelphi}override;{$ENDIF} + procedure SaveToStream(Stream: TStream); {$IFDEF UseDelphi}override;{$ENDIF} + {Loading the image from resources} + procedure LoadFromResourceName(Instance: HInst; const Name: String); + procedure LoadFromResourceID(Instance: HInst; ResID: Integer); + {Access to the png pixels} + property Pixels[const X, Y: Integer]: TColor read GetPixels write SetPixels; + {Palette property} + {$IFNDEF UseDelphi}property Palette: HPalette read GetPalette write + SetPalette;{$ENDIF} + {Returns the version} + property Version: String read GetLibraryVersion; + end; + + {Chunk name object} + TChunkName = Array[0..3] of Char; + + {Global chunk object} + TChunk = class + private + {Contains data} + fData: Pointer; + fDataSize: Cardinal; + {Stores owner} + fOwner: TPngObject; + {Stores the chunk name} + fName: TChunkName; + {Returns pointer to the TChunkIHDR} + function GetHeader: TChunkIHDR; + {Used with property index} + function GetIndex: Integer; + {Should return chunk class/name} + class function GetName: String; virtual; + {Returns the chunk name} + function GetChunkName: String; + public + {Returns index from list} + property Index: Integer read GetIndex; + {Returns pointer to the TChunkIHDR} + property Header: TChunkIHDR read GetHeader; + {Resize the data} + procedure ResizeData(const NewSize: Cardinal); + {Returns data and size} + property Data: Pointer read fData; + property DataSize: Cardinal read fDataSize; + {Assigns from another TChunk} + procedure Assign(Source: TChunk); virtual; + {Returns owner} + property Owner: TPngObject read fOwner; + {Being destroyed/created} + constructor Create(Owner: TPngObject); virtual; + destructor Destroy; override; + {Returns chunk class/name} + property Name: String read GetChunkName; + {Loads the chunk from a stream} + function LoadFromStream(Stream: TStream; const ChunkName: TChunkName; + Size: Integer): Boolean; virtual; + {Saves the chunk to a stream} + function SaveData(Stream: TStream): Boolean; + function SaveToStream(Stream: TStream): Boolean; virtual; + end; + + {Chunk classes} + TChunkIEND = class(TChunk); {End chunk} + + {IHDR data} + pIHDRData = ^TIHDRData; + TIHDRData = packed record + Width, Height: Cardinal; + BitDepth, + ColorType, + CompressionMethod, + FilterMethod, + InterlaceMethod: Byte; + end; + + {Information header chunk} + TChunkIHDR = class(TChunk) + private + {Current image} + ImageHandle: HBitmap; + ImageDC: HDC; + ImagePalette: HPalette; + {Output windows bitmap} + HasPalette: Boolean; + BitmapInfo: TMaxBitmapInfo; + {Stores the image bytes} + {$IFDEF Store16bits}ExtraImageData: Pointer;{$ENDIF} + ImageData: pointer; + ImageAlpha: Pointer; + + {Contains all the ihdr data} + IHDRData: TIHDRData; + protected + BytesPerRow: Integer; + {Creates a grayscale palette} + function CreateGrayscalePalette(Bitdepth: Integer): HPalette; + {Copies the palette to the Device Independent bitmap header} + procedure PaletteToDIB(Palette: HPalette); + {Resizes the image data to fill the color type, bit depth, } + {width and height parameters} + procedure PrepareImageData; + {Release allocated ImageData memory} + procedure FreeImageData; + public + {Access to ImageHandle} + property ImageHandleValue: HBitmap read ImageHandle; + {Properties} + property Width: Cardinal read IHDRData.Width write IHDRData.Width; + property Height: Cardinal read IHDRData.Height write IHDRData.Height; + property BitDepth: Byte read IHDRData.BitDepth write IHDRData.BitDepth; + property ColorType: Byte read IHDRData.ColorType write IHDRData.ColorType; + property CompressionMethod: Byte read IHDRData.CompressionMethod + write IHDRData.CompressionMethod; + property FilterMethod: Byte read IHDRData.FilterMethod + write IHDRData.FilterMethod; + property InterlaceMethod: Byte read IHDRData.InterlaceMethod + write IHDRData.InterlaceMethod; + {Loads the chunk from a stream} + function LoadFromStream(Stream: TStream; const ChunkName: TChunkName; + Size: Integer): Boolean; override; + {Saves the chunk to a stream} + function SaveToStream(Stream: TStream): Boolean; override; + {Destructor/constructor} + constructor Create(Owner: TPngObject); override; + destructor Destroy; override; + {Assigns from another TChunk} + procedure Assign(Source: TChunk); override; + end; + + {pHYs chunk} + pUnitType = ^TUnitType; + TUnitType = (utUnknown, utMeter); + TChunkpHYs = class(TChunk) + private + fPPUnitX, fPPUnitY: Cardinal; + fUnit: TUnitType; + public + {Returns the properties} + property PPUnitX: Cardinal read fPPUnitX write fPPUnitX; + property PPUnitY: Cardinal read fPPUnitY write fPPUnitY; + property UnitType: TUnitType read fUnit write fUnit; + {Loads the chunk from a stream} + function LoadFromStream(Stream: TStream; const ChunkName: TChunkName; + Size: Integer): Boolean; override; + {Saves the chunk to a stream} + function SaveToStream(Stream: TStream): Boolean; override; + {Assigns from another TChunk} + procedure Assign(Source: TChunk); override; + end; + + {Gamma chunk} + TChunkgAMA = class(TChunk) + private + {Returns/sets the value for the gamma chunk} + function GetValue: Cardinal; + procedure SetValue(const Value: Cardinal); + public + {Returns/sets gamma value} + property Gamma: Cardinal read GetValue write SetValue; + {Loading the chunk from a stream} + function LoadFromStream(Stream: TStream; const ChunkName: TChunkName; + Size: Integer): Boolean; override; + {Being created} + constructor Create(Owner: TPngObject); override; + {Assigns from another TChunk} + procedure Assign(Source: TChunk); override; + end; + + {ZLIB Decompression extra information} + TZStreamRec2 = packed record + {From ZLIB} + ZLIB: TZStreamRec; + {Additional info} + Data: Pointer; + fStream : TStream; + end; + + {Palette chunk} + TChunkPLTE = class(TChunk) + protected + {Number of items in the palette} + fCount: Integer; + private + {Contains the palette handle} + function GetPaletteItem(Index: Byte): TRGBQuad; + public + {Returns the color for each item in the palette} + property Item[Index: Byte]: TRGBQuad read GetPaletteItem; + {Returns the number of items in the palette} + property Count: Integer read fCount; + {Loads the chunk from a stream} + function LoadFromStream(Stream: TStream; const ChunkName: TChunkName; + Size: Integer): Boolean; override; + {Saves the chunk to a stream} + function SaveToStream(Stream: TStream): Boolean; override; + {Assigns from another TChunk} + procedure Assign(Source: TChunk); override; + end; + + {Transparency information} + TChunktRNS = class(TChunk) + private + fBitTransparency: Boolean; + function GetTransparentColor: ColorRef; + {Returns the transparent color} + procedure SetTransparentColor(const Value: ColorRef); + public + {Palette values for transparency} + PaletteValues: Array[Byte] of Byte; + {Returns if it uses bit transparency} + property BitTransparency: Boolean read fBitTransparency; + {Returns the transparent color} + property TransparentColor: ColorRef read GetTransparentColor write + SetTransparentColor; + {Loads/saves the chunk from/to a stream} + function LoadFromStream(Stream: TStream; const ChunkName: TChunkName; + Size: Integer): Boolean; override; + function SaveToStream(Stream: TStream): Boolean; override; + {Assigns from another TChunk} + procedure Assign(Source: TChunk); override; + end; + + {Actual image information} + TChunkIDAT = class(TChunk) + private + {Holds another pointer to the TChunkIHDR} + Header: TChunkIHDR; + {Stores temporary image width and height} + ImageWidth, ImageHeight: Integer; + {Size in bytes of each line and offset} + Row_Bytes, Offset : Cardinal; + {Contains data for the lines} + Encode_Buffer: Array[0..5] of pByteArray; + Row_Buffer: Array[Boolean] of pByteArray; + {Variable to invert the Row_Buffer used} + RowUsed: Boolean; + {Ending position for the current IDAT chunk} + EndPos: Integer; + {Filter the current line} + procedure FilterRow; + {Filter to encode and returns the best filter} + function FilterToEncode: Byte; + {Reads ZLIB compressed data} + function IDATZlibRead(var ZLIBStream: TZStreamRec2; Buffer: Pointer; + Count: Integer; var EndPos: Integer; var crcfile: Cardinal): Integer; + {Compress and writes IDAT data} + procedure IDATZlibWrite(var ZLIBStream: TZStreamRec2; Buffer: Pointer; + const Length: Cardinal); + procedure FinishIDATZlib(var ZLIBStream: TZStreamRec2); + {Prepares the palette} + procedure PreparePalette; + protected + {Decode interlaced image} + procedure DecodeInterlacedAdam7(Stream: TStream; + var ZLIBStream: TZStreamRec2; const Size: Integer; var crcfile: Cardinal); + {Decode non interlaced imaged} + procedure DecodeNonInterlaced(Stream: TStream; + var ZLIBStream: TZStreamRec2; const Size: Integer; + var crcfile: Cardinal); + protected + {Encode non interlaced images} + procedure EncodeNonInterlaced(Stream: TStream; + var ZLIBStream: TZStreamRec2); + {Encode interlaced images} + procedure EncodeInterlacedAdam7(Stream: TStream; + var ZLIBStream: TZStreamRec2); + protected + {Memory copy methods to decode} + procedure CopyNonInterlacedRGB8( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); + procedure CopyNonInterlacedRGB16( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); + procedure CopyNonInterlacedPalette148( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); + procedure CopyNonInterlacedPalette2( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); + procedure CopyNonInterlacedGray2( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); + procedure CopyNonInterlacedGrayscale16( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); + procedure CopyNonInterlacedRGBAlpha8( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); + procedure CopyNonInterlacedRGBAlpha16( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); + procedure CopyNonInterlacedGrayscaleAlpha8( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); + procedure CopyNonInterlacedGrayscaleAlpha16( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); + procedure CopyInterlacedRGB8(const Pass: Byte; + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); + procedure CopyInterlacedRGB16(const Pass: Byte; + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); + procedure CopyInterlacedPalette148(const Pass: Byte; + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); + procedure CopyInterlacedPalette2(const Pass: Byte; + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); + procedure CopyInterlacedGray2(const Pass: Byte; + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); + procedure CopyInterlacedGrayscale16(const Pass: Byte; + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); + procedure CopyInterlacedRGBAlpha8(const Pass: Byte; + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); + procedure CopyInterlacedRGBAlpha16(const Pass: Byte; + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); + procedure CopyInterlacedGrayscaleAlpha8(const Pass: Byte; + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); + procedure CopyInterlacedGrayscaleAlpha16(const Pass: Byte; + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); + protected + {Memory copy methods to encode} + procedure EncodeNonInterlacedRGB8(Src, Dest, Trans: pChar); + procedure EncodeNonInterlacedRGB16(Src, Dest, Trans: pChar); + procedure EncodeNonInterlacedGrayscale16(Src, Dest, Trans: pChar); + procedure EncodeNonInterlacedPalette148(Src, Dest, Trans: pChar); + procedure EncodeNonInterlacedRGBAlpha8(Src, Dest, Trans: pChar); + procedure EncodeNonInterlacedRGBAlpha16(Src, Dest, Trans: pChar); + procedure EncodeNonInterlacedGrayscaleAlpha8(Src, Dest, Trans: pChar); + procedure EncodeNonInterlacedGrayscaleAlpha16(Src, Dest, Trans: pChar); + procedure EncodeInterlacedRGB8(const Pass: Byte; Src, Dest, Trans: pChar); + procedure EncodeInterlacedRGB16(const Pass: Byte; Src, Dest, Trans: pChar); + procedure EncodeInterlacedPalette148(const Pass: Byte; + Src, Dest, Trans: pChar); + procedure EncodeInterlacedGrayscale16(const Pass: Byte; + Src, Dest, Trans: pChar); + procedure EncodeInterlacedRGBAlpha8(const Pass: Byte; + Src, Dest, Trans: pChar); + procedure EncodeInterlacedRGBAlpha16(const Pass: Byte; + Src, Dest, Trans: pChar); + procedure EncodeInterlacedGrayscaleAlpha8(const Pass: Byte; + Src, Dest, Trans: pChar); + procedure EncodeInterlacedGrayscaleAlpha16(const Pass: Byte; + Src, Dest, Trans: pChar); + public + {Loads the chunk from a stream} + function LoadFromStream(Stream: TStream; const ChunkName: TChunkName; + Size: Integer): Boolean; override; + {Saves the chunk to a stream} + function SaveToStream(Stream: TStream): Boolean; override; + end; + + {Image last modification chunk} + TChunktIME = class(TChunk) + private + {Holds the variables} + fYear: Word; + fMonth, fDay, fHour, fMinute, fSecond: Byte; + public + {Returns/sets variables} + property Year: Word read fYear write fYear; + property Month: Byte read fMonth write fMonth; + property Day: Byte read fDay write fDay; + property Hour: Byte read fHour write fHour; + property Minute: Byte read fMinute write fMinute; + property Second: Byte read fSecond write fSecond; + {Loads the chunk from a stream} + function LoadFromStream(Stream: TStream; const ChunkName: TChunkName; + Size: Integer): Boolean; override; + {Saves the chunk to a stream} + function SaveToStream(Stream: TStream): Boolean; override; + {Assigns from another TChunk} + procedure Assign(Source: TChunk); override; + end; + + {Textual data} + TChunktEXt = class(TChunk) + private + fKeyword, fText: String; + public + {Keyword and text} + property Keyword: String read fKeyword write fKeyword; + property Text: String read fText write fText; + {Loads the chunk from a stream} + function LoadFromStream(Stream: TStream; const ChunkName: TChunkName; + Size: Integer): Boolean; override; + {Saves the chunk to a stream} + function SaveToStream(Stream: TStream): Boolean; override; + {Assigns from another TChunk} + procedure Assign(Source: TChunk); override; + end; + + {zTXT chunk} + TChunkzTXt = class(TChunktEXt) + {Loads the chunk from a stream} + function LoadFromStream(Stream: TStream; const ChunkName: TChunkName; + Size: Integer): Boolean; override; + {Saves the chunk to a stream} + function SaveToStream(Stream: TStream): Boolean; override; + end; + +{Here we test if it's c++ builder or delphi version 3 or less} +{$IFDEF VER110}{$DEFINE DelphiBuilder3Less}{$ENDIF} +{$IFDEF VER100}{$DEFINE DelphiBuilder3Less}{$ENDIF} +{$IFDEF VER93}{$DEFINE DelphiBuilder3Less}{$ENDIF} +{$IFDEF VER90}{$DEFINE DelphiBuilder3Less}{$ENDIF} +{$IFDEF VER80}{$DEFINE DelphiBuilder3Less}{$ENDIF} + + +{Registers a new chunk class} +procedure RegisterChunk(ChunkClass: TChunkClass); +{Calculates crc} +function update_crc(crc: {$IFNDEF DelphiBuilder3Less}Cardinal{$ELSE}Integer + {$ENDIF}; buf: pByteArray; len: Integer): Cardinal; +{Invert bytes using assembly} +function ByteSwap(const a: integer): integer; + +implementation + +var + ChunkClasses: TPngPointerList; + {Table of CRCs of all 8-bit messages} + crc_table: Array[0..255] of Cardinal; + {Flag: has the table been computed? Initially false} + crc_table_computed: Boolean; + +{Draw transparent image using transparent color} +procedure DrawTransparentBitmap(dc: HDC; srcBits: Pointer; + var srcHeader: TBitmapInfoHeader; + srcBitmapInfo: pBitmapInfo; Rect: TRect; cTransparentColor: COLORREF); +var + cColor: COLORREF; + bmAndBack, bmAndObject, bmAndMem: HBITMAP; + bmBackOld, bmObjectOld, bmMemOld: HBITMAP; + hdcMem, hdcBack, hdcObject, hdcTemp: HDC; + ptSize, orgSize: TPOINT; + OldBitmap, DrawBitmap: HBITMAP; +begin + hdcTemp := CreateCompatibleDC(dc); + {Select the bitmap} + DrawBitmap := CreateDIBitmap(dc, srcHeader, CBM_INIT, srcBits, srcBitmapInfo^, + DIB_RGB_COLORS); + OldBitmap := SelectObject(hdcTemp, DrawBitmap); + + {Get sizes} + OrgSize.x := abs(srcHeader.biWidth); + OrgSize.y := abs(srcHeader.biHeight); + ptSize.x := Rect.Right - Rect.Left; // Get width of bitmap + ptSize.y := Rect.Bottom - Rect.Top; // Get height of bitmap + + {Create some DCs to hold temporary data} + hdcBack := CreateCompatibleDC(dc); + hdcObject := CreateCompatibleDC(dc); + hdcMem := CreateCompatibleDC(dc); + + // Create a bitmap for each DC. DCs are required for a number of + // GDI functions. + + // Monochrome DCs + bmAndBack := CreateBitmap(ptSize.x, ptSize.y, 1, 1, nil); + bmAndObject := CreateBitmap(ptSize.x, ptSize.y, 1, 1, nil); + + bmAndMem := CreateCompatibleBitmap(dc, ptSize.x, ptSize.y); + + // Each DC must select a bitmap object to store pixel data. + bmBackOld := SelectObject(hdcBack, bmAndBack); + bmObjectOld := SelectObject(hdcObject, bmAndObject); + bmMemOld := SelectObject(hdcMem, bmAndMem); + + // Set the background color of the source DC to the color. + // contained in the parts of the bitmap that should be transparent + cColor := SetBkColor(hdcTemp, cTransparentColor); + + // Create the object mask for the bitmap by performing a BitBlt + // from the source bitmap to a monochrome bitmap. + StretchBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, + orgSize.x, orgSize.y, SRCCOPY); + + // Set the background color of the source DC back to the original + // color. + SetBkColor(hdcTemp, cColor); + + // Create the inverse of the object mask. + BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, + NOTSRCCOPY); + + // Copy the background of the main DC to the destination. + BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, dc, Rect.Left, Rect.Top, + SRCCOPY); + + // Mask out the places where the bitmap will be placed. + BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND); + + // Mask out the transparent colored pixels on the bitmap. +// BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND); + StretchBlt(hdcTemp, 0, 0, OrgSize.x, OrgSize.y, hdcBack, 0, 0, + PtSize.x, PtSize.y, SRCAND); + + // XOR the bitmap with the background on the destination DC. + StretchBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, + OrgSize.x, OrgSize.y, SRCPAINT); + + // Copy the destination to the screen. + BitBlt(dc, Rect.Left, Rect.Top, ptSize.x, ptSize.y, hdcMem, 0, 0, + SRCCOPY); + + // Delete the memory bitmaps. + DeleteObject(SelectObject(hdcBack, bmBackOld)); + DeleteObject(SelectObject(hdcObject, bmObjectOld)); + DeleteObject(SelectObject(hdcMem, bmMemOld)); + DeleteObject(SelectObject(hdcTemp, OldBitmap)); + + // Delete the memory DCs. + DeleteDC(hdcMem); + DeleteDC(hdcBack); + DeleteDC(hdcObject); + DeleteDC(hdcTemp); +end; + +{Make the table for a fast CRC.} +procedure make_crc_table; +var + c: Cardinal; + n, k: Integer; +begin + + {fill the crc table} + for n := 0 to 255 do + begin + c := Cardinal(n); + for k := 0 to 7 do + begin + if Boolean(c and 1) then + c := $edb88320 xor (c shr 1) + else + c := c shr 1; + end; + crc_table[n] := c; + end; + + {The table has already being computated} + crc_table_computed := true; +end; + +{Update a running CRC with the bytes buf[0..len-1]--the CRC + should be initialized to all 1's, and the transmitted value + is the 1's complement of the final running CRC (see the + crc() routine below)).} +function update_crc(crc: {$IFNDEF DelphiBuilder3Less}Cardinal{$ELSE}Integer + {$ENDIF}; buf: pByteArray; len: Integer): Cardinal; +var + c: Cardinal; + n: Integer; +begin + c := crc; + + {Create the crc table in case it has not being computed yet} + if not crc_table_computed then make_crc_table; + + {Update} + for n := 0 to len - 1 do + c := crc_table[(c XOR buf^[n]) and $FF] XOR (c shr 8); + + {Returns} + Result := c; +end; + +{$IFNDEF UseDelphi} + function FileExists(Filename: String): Boolean; + var + FindFile: THandle; + FindData: TWin32FindData; + begin + FindFile := FindFirstFile(PChar(Filename), FindData); + Result := FindFile <> INVALID_HANDLE_VALUE; + if Result then Windows.FindClose(FindFile); + end; + + +{$ENDIF} + +{$IFNDEF UseDelphi} + {Exception implementation} + constructor Exception.Create(Msg: String); + begin + end; +{$ENDIF} + +{Calculates the paeth predictor} +function PaethPredictor(a, b, c: Byte): Byte; +var + pa, pb, pc: Integer; +begin + { a = left, b = above, c = upper left } + pa := abs(b - c); { distances to a, b, c } + pb := abs(a - c); + pc := abs(a + b - c * 2); + + { return nearest of a, b, c, breaking ties in order a, b, c } + if (pa <= pb) and (pa <= pc) then + Result := a + else + if pb <= pc then + Result := b + else + Result := c; +end; + +{Invert bytes using assembly} +function ByteSwap(const a: integer): integer; +asm + bswap eax +end; +function ByteSwap16(inp:word): word; +asm + bswap eax + shr eax, 16 +end; + +{Calculates number of bytes for the number of pixels using the} +{color mode in the paramenter} +function BytesForPixels(const Pixels: Integer; const ColorType, + BitDepth: Byte): Integer; +begin + case ColorType of + {Palette and grayscale contains a single value, for palette} + {an value of size 2^bitdepth pointing to the palette index} + {and grayscale the value from 0 to 2^bitdepth with color intesity} + COLOR_GRAYSCALE, COLOR_PALETTE: + Result := (Pixels * BitDepth + 7) div 8; + {RGB contains 3 values R, G, B with size 2^bitdepth each} + COLOR_RGB: + Result := (Pixels * BitDepth * 3) div 8; + {Contains one value followed by alpha value booth size 2^bitdepth} + COLOR_GRAYSCALEALPHA: + Result := (Pixels * BitDepth * 2) div 8; + {Contains four values size 2^bitdepth, Red, Green, Blue and alpha} + COLOR_RGBALPHA: + Result := (Pixels * BitDepth * 4) div 8; + else + Result := 0; + end {case ColorType} +end; + +type + pChunkClassInfo = ^TChunkClassInfo; + TChunkClassInfo = record + ClassName: TChunkClass; + end; + +{Register a chunk type} +procedure RegisterChunk(ChunkClass: TChunkClass); +var + NewClass: pChunkClassInfo; +begin + {In case the list object has not being created yet} + if ChunkClasses = nil then ChunkClasses := TPngPointerList.Create(nil); + + {Add this new class} + new(NewClass); + NewClass^.ClassName := ChunkClass; + ChunkClasses.Add(NewClass); +end; + +{Free chunk class list} +procedure FreeChunkClassList; +var + i: Integer; +begin + if (ChunkClasses <> nil) then + begin + FOR i := 0 TO ChunkClasses.Count - 1 do + Dispose(pChunkClassInfo(ChunkClasses.Item[i])); + ChunkClasses.Free; + end; +end; + +{Registering of common chunk classes} +procedure RegisterCommonChunks; +begin + {Important chunks} + RegisterChunk(TChunkIEND); + RegisterChunk(TChunkIHDR); + RegisterChunk(TChunkIDAT); + RegisterChunk(TChunkPLTE); + RegisterChunk(TChunkgAMA); + RegisterChunk(TChunktRNS); + + {Not so important chunks} + RegisterChunk(TChunkpHYs); + RegisterChunk(TChunktIME); + RegisterChunk(TChunktEXt); + RegisterChunk(TChunkzTXt); +end; + +{Creates a new chunk of this class} +function CreateClassChunk(Owner: TPngObject; Name: TChunkName): TChunk; +var + i : Integer; + NewChunk: TChunkClass; +begin + {Looks for this chunk} + NewChunk := TChunk; {In case there is no registered class for this} + + {Looks for this class in all registered chunks} + if Assigned(ChunkClasses) then + FOR i := 0 TO ChunkClasses.Count - 1 DO + begin + if pChunkClassInfo(ChunkClasses.Item[i])^.ClassName.GetName = Name then + begin + NewChunk := pChunkClassInfo(ChunkClasses.Item[i])^.ClassName; + break; + end; + end; + + {Returns chunk class} + Result := NewChunk.Create(Owner); + Result.fName := Name; +end; + +{ZLIB support} + +const + ZLIBAllocate = High(Word); + +{Initializes ZLIB for decompression} +function ZLIBInitInflate(Stream: TStream): TZStreamRec2; +begin + {Fill record} + Fillchar(Result, SIZEOF(TZStreamRec2), #0); + + {Set internal record information} + with Result do + begin + GetMem(Data, ZLIBAllocate); + fStream := Stream; + end; + + {Init decompression} + InflateInit_(Result.zlib, zlib_version, SIZEOF(TZStreamRec)); +end; + +{Initializes ZLIB for compression} +function ZLIBInitDeflate(Stream: TStream; + Level: TCompressionlevel; Size: Cardinal): TZStreamRec2; +begin + {Fill record} + Fillchar(Result, SIZEOF(TZStreamRec2), #0); + + {Set internal record information} + with Result, ZLIB do + begin + GetMem(Data, Size); + fStream := Stream; + next_out := Data; + avail_out := Size; + end; + + {Inits compression} + deflateInit_(Result.zlib, Level, zlib_version, sizeof(TZStreamRec)); +end; + +{Terminates ZLIB for compression} +procedure ZLIBTerminateDeflate(var ZLIBStream: TZStreamRec2); +begin + {Terminates decompression} + DeflateEnd(ZLIBStream.zlib); + {Free internal record} + FreeMem(ZLIBStream.Data, ZLIBAllocate); +end; + +{Terminates ZLIB for decompression} +procedure ZLIBTerminateInflate(var ZLIBStream: TZStreamRec2); +begin + {Terminates decompression} + InflateEnd(ZLIBStream.zlib); + {Free internal record} + FreeMem(ZLIBStream.Data, ZLIBAllocate); +end; + +{Decompresses ZLIB into a memory address} +function DecompressZLIB(const Input: Pointer; InputSize: Integer; + var Output: Pointer; var OutputSize: Integer; + var ErrorOutput: String): Boolean; +var + StreamRec : TZStreamRec; + Buffer : Array[Byte] of Byte; + InflateRet: Integer; +begin + with StreamRec do + begin + {Initializes} + Result := True; + OutputSize := 0; + + {Prepares the data to decompress} + FillChar(StreamRec, SizeOf(TZStreamRec), #0); + InflateInit_(StreamRec, zlib_version, SIZEOF(TZStreamRec)); + next_in := Input; + avail_in := InputSize; + + {Decodes data} + repeat + {In case it needs an output buffer} + if (avail_out = 0) then + begin + next_out := @Buffer; + avail_out := SizeOf(Buffer); + end {if (avail_out = 0)}; + + {Decompress and put in output} + InflateRet := inflate(StreamRec, 0); + if (InflateRet = Z_STREAM_END) or (InflateRet = 0) then + begin + {Reallocates output buffer} + inc(OutputSize, total_out); + if Output = nil then + GetMem(Output, OutputSize) else ReallocMem(Output, OutputSize); + {Copies the new data} + CopyMemory(Ptr(Longint(Output) + OutputSize - total_out), + @Buffer, total_out); + end {if (InflateRet = Z_STREAM_END) or (InflateRet = 0)} + {Now tests for errors} + else if InflateRet < 0 then + begin + Result := False; + ErrorOutput := StreamRec.msg; + InflateEnd(StreamRec); + Exit; + end {if InflateRet < 0} + until InflateRet = Z_STREAM_END; + + {Terminates decompression} + InflateEnd(StreamRec); + end {with StreamRec} + +end; + +{Compresses ZLIB into a memory address} +function CompressZLIB(Input: Pointer; InputSize, CompressionLevel: Integer; + var Output: Pointer; var OutputSize: Integer; + var ErrorOutput: String): Boolean; +var + StreamRec : TZStreamRec; + Buffer : Array[Byte] of Byte; + DeflateRet: Integer; +begin + with StreamRec do + begin + Result := True; {By default returns TRUE as everything might have gone ok} + OutputSize := 0; {Initialize} + {Prepares the data to compress} + FillChar(StreamRec, SizeOf(TZStreamRec), #0); + DeflateInit_(StreamRec, CompressionLevel,zlib_version, SIZEOF(TZStreamRec)); + + next_in := Input; + avail_in := InputSize; + + while avail_in > 0 do + begin + {When it needs new buffer to stores the compressed data} + if avail_out = 0 then + begin + {Restore buffer} + next_out := @Buffer; + avail_out := SizeOf(Buffer); + end {if avail_out = 0}; + + {Compresses} + DeflateRet := deflate(StreamRec, Z_FINISH); + + if (DeflateRet = Z_STREAM_END) or (DeflateRet = 0) then + begin + {Updates the output memory} + inc(OutputSize, total_out); + if Output = nil then + GetMem(Output, OutputSize) else ReallocMem(Output, OutputSize); + + {Copies the new data} + CopyMemory(Ptr(Longint(Output) + OutputSize - total_out), + @Buffer, total_out); + end {if (InflateRet = Z_STREAM_END) or (InflateRet = 0)} + {Now tests for errors} + else if DeflateRet < 0 then + begin + Result := False; + ErrorOutput := StreamRec.msg; + DeflateEnd(StreamRec); + Exit; + end {if InflateRet < 0} + + end {while avail_in > 0}; + + {Finishes compressing} + DeflateEnd(StreamRec); + end {with StreamRec} + +end; + +{TPngPointerList implementation} + +{Object being created} +constructor TPngPointerList.Create(AOwner: TPNGObject); +begin + inherited Create; {Let ancestor work} + {Holds owner} + fOwner := AOwner; + {Memory pointer not being used yet} + fMemory := nil; + {No items yet} + fCount := 0; +end; + +{Removes value from the list} +function TPngPointerList.Remove(Value: Pointer): Pointer; +var + I, Position: Integer; +begin + {Gets item position} + Position := -1; + FOR I := 0 TO Count - 1 DO + if Value = Item[I] then Position := I; + {In case a match was found} + if Position >= 0 then + begin + Result := Item[Position]; {Returns pointer} + {Remove item and move memory} + Dec(fCount); + if Position < Integer(FCount) then + System.Move(fMemory^[Position + 1], fMemory^[Position], + (Integer(fCount) - Position) * SizeOf(Pointer)); + end {if Position >= 0} else Result := nil +end; + +{Add a new value in the list} +procedure TPngPointerList.Add(Value: Pointer); +begin + Count := Count + 1; + Item[Count - 1] := Value; +end; + + +{Object being destroyed} +destructor TPngPointerList.Destroy; +begin + {Release memory if needed} + if fMemory <> nil then + FreeMem(fMemory, fCount * sizeof(Pointer)); + + {Free things} + inherited Destroy; +end; + +{Returns one item from the list} +function TPngPointerList.GetItem(Index: Cardinal): Pointer; +begin + if (Index <= Count - 1) then + Result := fMemory[Index] + else + {In case it's out of bounds} + Result := nil; +end; + +{Inserts a new item in the list} +procedure TPngPointerList.Insert(Value: Pointer; Position: Cardinal); +begin + if (Position < Count) or (Count = 0) then + begin + {Increase item count} + SetSize(Count + 1); + {Move other pointers} + if Position < Count then + System.Move(fMemory^[Position], fMemory^[Position + 1], + (Count - Position - 1) * SizeOf(Pointer)); + {Sets item} + Item[Position] := Value; + end; +end; + +{Sets one item from the list} +procedure TPngPointerList.SetItem(Index: Cardinal; const Value: Pointer); +begin + {If index is in bounds, set value} + if (Index <= Count - 1) then + fMemory[Index] := Value +end; + +{This method resizes the list} +procedure TPngPointerList.SetSize(const Size: Cardinal); +begin + {Sets the size} + if (fMemory = nil) and (Size > 0) then + GetMem(fMemory, Size * SIZEOF(Pointer)) + else + if Size > 0 then {Only realloc if the new size is greater than 0} + ReallocMem(fMemory, Size * SIZEOF(Pointer)) + else + {In case user is resize to 0 items} + begin + FreeMem(fMemory); + fMemory := nil; + end; + {Update count} + fCount := Size; +end; + +{TPNGList implementation} + +{Finds the first chunk of this class} +function TPNGList.FindChunk(ChunkClass: TChunkClass): TChunk; +var + i: Integer; +begin + Result := nil; + for i := 0 to Count - 1 do + if Item[i] is ChunkClass then + begin + Result := Item[i]; + Break + end +end; + + +{Removes an item} +procedure TPNGList.RemoveChunk(Chunk: TChunk); +begin + Remove(Chunk); + Chunk.Free +end; + +{Add a new item} +function TPNGList.Add(ChunkClass: TChunkClass): TChunk; +var + IHDR: TChunkIHDR; + IEND: TChunkIEND; + + IDAT: TChunkIDAT; + PLTE: TChunkPLTE; +begin + Result := nil; {Default result} + {Adding these is not allowed} + if ((ChunkClass = TChunkIHDR) or (ChunkClass = TChunkIDAT) or + (ChunkClass = TChunkPLTE) or (ChunkClass = TChunkIEND)) and not + (Owner.BeingCreated) then + fOwner.RaiseError(EPngError, EPNGCannotAddChunkText) + {Two of these is not allowed} + else if ((ChunkClass = TChunkgAMA) and (ItemFromClass(TChunkgAMA) <> nil)) or + ((ChunkClass = TChunktRNS) and (ItemFromClass(TChunktRNS) <> nil)) or + ((ChunkClass = TChunkpHYs) and (ItemFromClass(TChunkpHYs) <> nil)) then + fOwner.RaiseError(EPngError, EPNGCannotAddChunkText) + {There must have an IEND and IHDR chunk} + else if ((ItemFromClass(TChunkIEND) = nil) or + (ItemFromClass(TChunkIHDR) = nil)) and not Owner.BeingCreated then + fOwner.RaiseError(EPngError, EPNGCannotAddInvalidImageText) + else + begin + {Get common chunks} + IHDR := ItemFromClass(TChunkIHDR) as TChunkIHDR; + IEND := ItemFromClass(TChunkIEND) as TChunkIEND; + {Create new chunk} + Result := ChunkClass.Create(Owner); + {Add to the list} + if (ChunkClass = TChunkgAMA) or (ChunkClass = TChunkpHYs) or + (ChunkClass = TChunkPLTE) then + Insert(Result, IHDR.Index + 1) + {Header and end} + else if (ChunkClass = TChunkIEND) then + Insert(Result, Count) + else if (ChunkClass = TChunkIHDR) then + Insert(Result, 0) + {Transparency chunk (fix by Ian Boyd)} + else if (ChunkClass = TChunktRNS) then + begin + {Transparecy chunk must be after PLTE; before IDAT} + IDAT := ItemFromClass(TChunkIDAT) as TChunkIDAT; + PLTE := ItemFromClass(TChunkPLTE) as TChunkPLTE; + + if Assigned(PLTE) then + Insert(Result, PLTE.Index + 1) + else if Assigned(IDAT) then + Insert(Result, IDAT.Index) + else + Insert(Result, IHDR.Index + 1) + end + else {All other chunks} + Insert(Result, IEND.Index); + end {if} +end; + +{Returns item from the list} +function TPNGList.GetItem(Index: Cardinal): TChunk; +begin + Result := inherited GetItem(Index); +end; + +{Returns first item from the list using the class from parameter} +function TPNGList.ItemFromClass(ChunkClass: TChunkClass): TChunk; +var + i: Integer; +begin + Result := nil; {Initial result} + FOR i := 0 TO Count - 1 DO + {Test if this item has the same class} + if Item[i] is ChunkClass then + begin + {Returns this item and exit} + Result := Item[i]; + break; + end {if} +end; + +{$IFNDEF UseDelphi} + + {TStream implementation} + + {Copies all from another stream} + function TStream.CopyFrom(Source: TStream; Count: Cardinal): Cardinal; + const + MaxBytes = $f000; + var + Buffer: PChar; + BufSize, N: Cardinal; + begin + {If count is zero, copy everything from Source} + if Count = 0 then + begin + Source.Seek(0, soFromBeginning); + Count := Source.Size; + end; + + Result := Count; {Returns the number of bytes readed} + {Allocates memory} + if Count > MaxBytes then BufSize := MaxBytes else BufSize := Count; + GetMem(Buffer, BufSize); + + {Copy memory} + while Count > 0 do + begin + if Count > BufSize then N := BufSize else N := Count; + Source.Read(Buffer^, N); + Write(Buffer^, N); + dec(Count, N); + end; + + {Deallocates memory} + FreeMem(Buffer, BufSize); + end; + +{Set current stream position} +procedure TStream.SetPosition(const Value: Longint); +begin + Seek(Value, soFromBeginning); +end; + +{Returns position} +function TStream.GetPosition: Longint; +begin + Result := Seek(0, soFromCurrent); +end; + + {Returns stream size} +function TStream.GetSize: Longint; + var + Pos: Cardinal; + begin + Pos := Seek(0, soFromCurrent); + Result := Seek(0, soFromEnd); + Seek(Pos, soFromBeginning); + end; + + {TFileStream implementation} + + {Filestream object being created} + constructor TFileStream.Create(Filename: String; Mode: TFileStreamModeSet); + {Makes file mode} + function OpenMode: DWORD; + begin + Result := 0; + if fsmRead in Mode then Result := GENERIC_READ; + if (fsmWrite in Mode) or (fsmCreate in Mode) then + Result := Result OR GENERIC_WRITE; + end; + const + IsCreate: Array[Boolean] of Integer = (OPEN_ALWAYS, CREATE_ALWAYS); + begin + {Call ancestor} + inherited Create; + + {Create handle} + fHandle := CreateFile(PChar(Filename), OpenMode, FILE_SHARE_READ or + FILE_SHARE_WRITE, nil, IsCreate[fsmCreate in Mode], 0, 0); + {Store mode} + FileMode := Mode; + end; + + {Filestream object being destroyed} + destructor TFileStream.Destroy; + begin + {Terminates file and close} + if FileMode = [fsmWrite] then + SetEndOfFile(fHandle); + CloseHandle(fHandle); + + {Call ancestor} + inherited Destroy; + end; + + {Writes data to the file} + function TFileStream.Write(const Buffer; Count: Longint): Cardinal; + begin + if not WriteFile(fHandle, Buffer, Count, Result, nil) then + Result := 0; + end; + + {Reads data from the file} + function TFileStream.Read(var Buffer; Count: Longint): Cardinal; + begin + if not ReadFile(fHandle, Buffer, Count, Result, nil) then + Result := 0; + end; + + {Seeks the file position} + function TFileStream.Seek(Offset: Integer; Origin: Word): Longint; + begin + Result := SetFilePointer(fHandle, Offset, nil, Origin); + end; + + {Sets the size of the file} + procedure TFileStream.SetSize(const Value: Longint); + begin + Seek(Value, soFromBeginning); + SetEndOfFile(fHandle); + end; + + {TResourceStream implementation} + + {Creates the resource stream} + constructor TResourceStream.Create(Instance: HInst; const ResName: String; + ResType: PChar); + var + ResID: HRSRC; + ResGlobal: HGlobal; + begin + {Obtains the resource ID} + ResID := FindResource(hInstance, PChar(ResName), RT_RCDATA); + if ResID = 0 then raise EPNGError.Create(''); + {Obtains memory and size} + ResGlobal := LoadResource(hInstance, ResID); + Size := SizeOfResource(hInstance, ResID); + Memory := LockResource(ResGlobal); + if (ResGlobal = 0) or (Memory = nil) then EPNGError.Create(''); + end; + + + {Setting resource stream size is not supported} + procedure TResourceStream.SetSize(const Value: Integer); + begin + end; + + {Writing into a resource stream is not supported} + function TResourceStream.Write(const Buffer; Count: Integer): Cardinal; + begin + Result := 0; + end; + + {Reads data from the stream} + function TResourceStream.Read(var Buffer; Count: Integer): Cardinal; + begin + //Returns data + CopyMemory(@Buffer, Ptr(Longint(Memory) + Position), Count); + //Update position + inc(Position, Count); + //Returns + Result := Count; + end; + + {Seeks data} + function TResourceStream.Seek(Offset: Integer; Origin: Word): Longint; + begin + {Move depending on the origin} + case Origin of + soFromBeginning: Position := Offset; + soFromCurrent: inc(Position, Offset); + soFromEnd: Position := Size + Offset; + end; + + {Returns the current position} + Result := Position; + end; + +{$ENDIF} + +{TChunk implementation} + +{Resizes the data} +procedure TChunk.ResizeData(const NewSize: Cardinal); +begin + fDataSize := NewSize; + ReallocMem(fData, NewSize + 1); +end; + +{Returns index from list} +function TChunk.GetIndex: Integer; +var + i: Integer; +begin + Result := -1; {Avoiding warnings} + {Searches in the list} + FOR i := 0 TO Owner.Chunks.Count - 1 DO + if Owner.Chunks.Item[i] = Self then + begin + {Found match} + Result := i; + exit; + end {for i} +end; + +{Returns pointer to the TChunkIHDR} +function TChunk.GetHeader: TChunkIHDR; +begin + Result := Owner.Chunks.Item[0] as TChunkIHDR; +end; + +{Assigns from another TChunk} +procedure TChunk.Assign(Source: TChunk); +begin + {Copy properties} + fName := Source.fName; + {Set data size and realloc} + ResizeData(Source.fDataSize); + + {Copy data (if there's any)} + if fDataSize > 0 then CopyMemory(fData, Source.fData, fDataSize); +end; + +{Chunk being created} +constructor TChunk.Create(Owner: TPngObject); +var + ChunkName: String; +begin + {Ancestor create} + inherited Create; + + {If it's a registered class, set the chunk name based on the class} + {name. For instance, if the class name is TChunkgAMA, the GAMA part} + {will become the chunk name} + ChunkName := Copy(ClassName, Length('TChunk') + 1, Length(ClassName)); + if Length(ChunkName) = 4 then CopyMemory(@fName[0], @ChunkName[1], 4); + + {Initialize data holder} + GetMem(fData, 1); + fDataSize := 0; + {Record owner} + fOwner := Owner; +end; + +{Chunk being destroyed} +destructor TChunk.Destroy; +begin + {Free data holder} + FreeMem(fData, fDataSize + 1); + {Let ancestor destroy} + inherited Destroy; +end; + +{Returns the chunk name 1} +function TChunk.GetChunkName: String; +begin + Result := fName +end; + +{Returns the chunk name 2} +class function TChunk.GetName: String; +begin + {For avoid writing GetName for each TChunk descendent, by default for} + {classes which don't declare GetName, it will look for the class name} + {to extract the chunk kind. Example, if the class name is TChunkIEND } + {this method extracts and returns IEND} + Result := Copy(ClassName, Length('TChunk') + 1, Length(ClassName)); +end; + +{Saves the data to the stream} +function TChunk.SaveData(Stream: TStream): Boolean; +var + ChunkSize, ChunkCRC: Cardinal; +begin + {First, write the size for the following data in the chunk} + ChunkSize := ByteSwap(DataSize); + Stream.Write(ChunkSize, 4); + {The chunk name} + Stream.Write(fName, 4); + {If there is data for the chunk, write it} + if DataSize > 0 then Stream.Write(Data^, DataSize); + {Calculates and write CRC} + ChunkCRC := update_crc($ffffffff, @fName[0], 4); + ChunkCRC := Byteswap(update_crc(ChunkCRC, Data, DataSize) xor $ffffffff); + Stream.Write(ChunkCRC, 4); + + {Returns that everything went ok} + Result := TRUE; +end; + +{Saves the chunk to the stream} +function TChunk.SaveToStream(Stream: TStream): Boolean; +begin + Result := SaveData(Stream) +end; + + +{Loads the chunk from a stream} +function TChunk.LoadFromStream(Stream: TStream; const ChunkName: TChunkName; + Size: Integer): Boolean; +var + CheckCRC: Cardinal; + {$IFDEF CheckCRC}RightCRC: Cardinal;{$ENDIF} +begin + {Copies data from source} + ResizeData(Size); + if Size > 0 then Stream.Read(fData^, Size); + {Reads CRC} + Stream.Read(CheckCRC, 4); + CheckCrc := ByteSwap(CheckCRC); + + {Check if crc readed is valid} + {$IFDEF CheckCRC} + RightCRC := update_crc($ffffffff, @ChunkName[0], 4); + RightCRC := update_crc(RightCRC, fData, Size) xor $ffffffff; + Result := RightCRC = CheckCrc; + + {Handle CRC error} + if not Result then + begin + {In case it coult not load chunk} + Owner.RaiseError(EPngInvalidCRC, EPngInvalidCRCText); + exit; + end + {$ELSE}Result := TRUE; {$ENDIF} + +end; + +{TChunktIME implementation} + +{Chunk being loaded from a stream} +function TChunktIME.LoadFromStream(Stream: TStream; + const ChunkName: TChunkName; Size: Integer): Boolean; +begin + {Let ancestor load the data} + Result := inherited LoadFromStream(Stream, ChunkName, Size); + if not Result or (Size <> 7) then exit; {Size must be 7} + + {Reads data} + fYear := ((pByte(Longint(Data) )^) * 256)+ (pByte(Longint(Data) + 1)^); + fMonth := pByte(Longint(Data) + 2)^; + fDay := pByte(Longint(Data) + 3)^; + fHour := pByte(Longint(Data) + 4)^; + fMinute := pByte(Longint(Data) + 5)^; + fSecond := pByte(Longint(Data) + 6)^; +end; + +{Assigns from another TChunk} +procedure TChunktIME.Assign(Source: TChunk); +begin + fYear := TChunktIME(Source).fYear; + fMonth := TChunktIME(Source).fMonth; + fDay := TChunktIME(Source).fDay; + fHour := TChunktIME(Source).fHour; + fMinute := TChunktIME(Source).fMinute; + fSecond := TChunktIME(Source).fSecond; +end; + +{Saving the chunk to a stream} +function TChunktIME.SaveToStream(Stream: TStream): Boolean; +begin + {Update data} + ResizeData(7); {Make sure the size is 7} + pWord(Data)^ := ByteSwap16(Year); + pByte(Longint(Data) + 2)^ := Month; + pByte(Longint(Data) + 3)^ := Day; + pByte(Longint(Data) + 4)^ := Hour; + pByte(Longint(Data) + 5)^ := Minute; + pByte(Longint(Data) + 6)^ := Second; + + {Let inherited save data} + Result := inherited SaveToStream(Stream); +end; + +{TChunkztXt implementation} + +{Loading the chunk from a stream} +function TChunkzTXt.LoadFromStream(Stream: TStream; + const ChunkName: TChunkName; Size: Integer): Boolean; +var + ErrorOutput: String; + CompressionMethod: Byte; + Output: Pointer; + OutputSize: Integer; +begin + {Load data from stream and validate} + Result := inherited LoadFromStream(Stream, ChunkName, Size); + if not Result or (Size < 4) then exit; + fKeyword := PChar(Data); {Get keyword and compression method bellow} + if Longint(fKeyword) = 0 then + CompressionMethod := pByte(Data)^ + else + CompressionMethod := pByte(Longint(fKeyword) + Length(fKeyword))^; + fText := ''; + + {In case the compression is 0 (only one accepted by specs), reads it} + if CompressionMethod = 0 then + begin + Output := nil; + if DecompressZLIB(PChar(Longint(Data) + Length(fKeyword) + 2), + Size - Length(fKeyword) - 2, Output, OutputSize, ErrorOutput) then + begin + SetLength(fText, OutputSize); + CopyMemory(@fText[1], Output, OutputSize); + end {if DecompressZLIB(...}; + FreeMem(Output); + end {if CompressionMethod = 0} + +end; + +{Saving the chunk to a stream} +function TChunkztXt.SaveToStream(Stream: TStream): Boolean; +var + Output: Pointer; + OutputSize: Integer; + ErrorOutput: String; +begin + Output := nil; {Initializes output} + if fText = '' then fText := ' '; + + {Compresses the data} + if CompressZLIB(@fText[1], Length(fText), Owner.CompressionLevel, Output, + OutputSize, ErrorOutput) then + begin + {Size is length from keyword, plus a null character to divide} + {plus the compression method, plus the length of the text (zlib compressed)} + ResizeData(Length(fKeyword) + 2 + OutputSize); + + Fillchar(Data^, DataSize, #0); + {Copies the keyword data} + if Keyword <> '' then + CopyMemory(Data, @fKeyword[1], Length(Keyword)); + {Compression method 0 (inflate/deflate)} + pByte(Ptr(Longint(Data) + Length(Keyword) + 1))^ := 0; + if OutputSize > 0 then + CopyMemory(Ptr(Longint(Data) + Length(Keyword) + 2), Output, OutputSize); + + {Let ancestor calculate crc and save} + Result := SaveData(Stream); + end {if CompressZLIB(...} else Result := False; + + {Frees output} + if Output <> nil then FreeMem(Output) +end; + +{TChunktEXt implementation} + +{Assigns from another text chunk} +procedure TChunktEXt.Assign(Source: TChunk); +begin + fKeyword := TChunktEXt(Source).fKeyword; + fText := TChunktEXt(Source).fText; +end; + +{Loading the chunk from a stream} +function TChunktEXt.LoadFromStream(Stream: TStream; + const ChunkName: TChunkName; Size: Integer): Boolean; +begin + {Load data from stream and validate} + Result := inherited LoadFromStream(Stream, ChunkName, Size); + if not Result or (Size < 3) then exit; + {Get text} + fKeyword := PChar(Data); + SetLength(fText, Size - Length(fKeyword) - 1); + CopyMemory(@fText[1], Ptr(Longint(Data) + Length(fKeyword) + 1), + Length(fText)); +end; + +{Saving the chunk to a stream} +function TChunktEXt.SaveToStream(Stream: TStream): Boolean; +begin + {Size is length from keyword, plus a null character to divide} + {plus the length of the text} + ResizeData(Length(fKeyword) + 1 + Length(fText)); + Fillchar(Data^, DataSize, #0); + {Copy data} + if Keyword <> '' then + CopyMemory(Data, @fKeyword[1], Length(Keyword)); + if Text <> '' then + CopyMemory(Ptr(Longint(Data) + Length(Keyword) + 1), @fText[1], + Length(Text)); + {Let ancestor calculate crc and save} + Result := inherited SaveToStream(Stream); +end; + + +{TChunkIHDR implementation} + +{Chunk being created} +constructor TChunkIHDR.Create(Owner: TPngObject); +begin + {Prepare pointers} + ImageHandle := 0; + ImagePalette := 0; + ImageDC := 0; + + {Call inherited} + inherited Create(Owner); +end; + +{Chunk being destroyed} +destructor TChunkIHDR.Destroy; +begin + {Free memory} + FreeImageData(); + + {Calls TChunk destroy} + inherited Destroy; +end; + +{Copies the palette} +procedure CopyPalette(Source: HPALETTE; Destination: HPALETTE); +var + PaletteSize: Integer; + Entries: Array[Byte] of TPaletteEntry; +begin + PaletteSize := 0; + if GetObject(Source, SizeOf(PaletteSize), @PaletteSize) = 0 then Exit; + if PaletteSize = 0 then Exit; + ResizePalette(Destination, PaletteSize); + GetPaletteEntries(Source, 0, PaletteSize, Entries); + SetPaletteEntries(Destination, 0, PaletteSize, Entries); +end; + +{Assigns from another IHDR chunk} +procedure TChunkIHDR.Assign(Source: TChunk); +begin + {Copy the IHDR data} + if Source is TChunkIHDR then + begin + {Copy IHDR values} + IHDRData := TChunkIHDR(Source).IHDRData; + + {Prepare to hold data by filling BitmapInfo structure and} + {resizing ImageData and ImageAlpha memory allocations} + PrepareImageData(); + + {Copy image data} + CopyMemory(ImageData, TChunkIHDR(Source).ImageData, + BytesPerRow * Integer(Height)); + CopyMemory(ImageAlpha, TChunkIHDR(Source).ImageAlpha, + Integer(Width) * Integer(Height)); + + {Copy palette colors} + BitmapInfo.bmiColors := TChunkIHDR(Source).BitmapInfo.bmiColors; + {Copy palette also} + CopyPalette(TChunkIHDR(Source).ImagePalette, ImagePalette); + end + else + Owner.RaiseError(EPNGError, EPNGCannotAssignChunkText); +end; + +{Release allocated image data} +procedure TChunkIHDR.FreeImageData; +begin + {Free old image data} + if ImageHandle <> 0 then DeleteObject(ImageHandle); + if ImageDC <> 0 then DeleteDC(ImageDC); + if ImageAlpha <> nil then FreeMem(ImageAlpha); + if ImagePalette <> 0 then DeleteObject(ImagePalette); + {$IFDEF Store16bits} + if ExtraImageData <> nil then FreeMem(ExtraImageData); + {$ENDIF} + ImageHandle := 0; ImageDC := 0; ImageAlpha := nil; ImageData := nil; + ImagePalette := 0; ExtraImageData := nil; +end; + +{Chunk being loaded from a stream} +function TChunkIHDR.LoadFromStream(Stream: TStream; const ChunkName: TChunkName; + Size: Integer): Boolean; +begin + {Let TChunk load it} + Result := inherited LoadFromStream(Stream, ChunkName, Size); + if not Result then Exit; + + {Now check values} + {Note: It's recommended by png specification to make sure that the size} + {must be 13 bytes to be valid, but some images with 14 bytes were found} + {which could be loaded by internet explorer and other tools} + if (fDataSize < SIZEOF(TIHdrData)) then + begin + {Ihdr must always have at least 13 bytes} + Result := False; + Owner.RaiseError(EPNGInvalidIHDR, EPNGInvalidIHDRText); + exit; + end; + + {Everything ok, reads IHDR} + IHDRData := pIHDRData(fData)^; + IHDRData.Width := ByteSwap(IHDRData.Width); + IHDRData.Height := ByteSwap(IHDRData.Height); + + {The width and height must not be larger than 65535 pixels} + if (IHDRData.Width > High(Word)) or (IHDRData.Height > High(Word)) then + begin + Result := False; + Owner.RaiseError(EPNGSizeExceeds, EPNGSizeExceedsText); + exit; + end {if IHDRData.Width > High(Word)}; + {Compression method must be 0 (inflate/deflate)} + if (IHDRData.CompressionMethod <> 0) then + begin + Result := False; + Owner.RaiseError(EPNGUnknownCompression, EPNGUnknownCompressionText); + exit; + end; + {Interlace must be either 0 (none) or 7 (adam7)} + if (IHDRData.InterlaceMethod <> 0) and (IHDRData.InterlaceMethod <> 1) then + begin + Result := False; + Owner.RaiseError(EPNGUnknownInterlace, EPNGUnknownInterlaceText); + exit; + end; + + {Updates owner properties} + Owner.InterlaceMethod := TInterlaceMethod(IHDRData.InterlaceMethod); + + {Prepares data to hold image} + PrepareImageData(); +end; + +{Saving the IHDR chunk to a stream} +function TChunkIHDR.SaveToStream(Stream: TStream): Boolean; +begin + {Ignore 2 bits images} + if BitDepth = 2 then BitDepth := 4; + + {It needs to do is update the data with the IHDR data} + {structure containing the write values} + ResizeData(SizeOf(TIHDRData)); + pIHDRData(fData)^ := IHDRData; + {..byteswap 4 byte types} + pIHDRData(fData)^.Width := ByteSwap(pIHDRData(fData)^.Width); + pIHDRData(fData)^.Height := ByteSwap(pIHDRData(fData)^.Height); + {..update interlace method} + pIHDRData(fData)^.InterlaceMethod := Byte(Owner.InterlaceMethod); + {..and then let the ancestor SaveToStream do the hard work} + Result := inherited SaveToStream(Stream); +end; + +{Creates a grayscale palette} +function TChunkIHDR.CreateGrayscalePalette(Bitdepth: Integer): HPalette; +var + j: Integer; + palEntries: TMaxLogPalette; +begin + {Prepares and fills the strucutre} + if Bitdepth = 16 then Bitdepth := 8; + fillchar(palEntries, sizeof(palEntries), 0); + palEntries.palVersion := $300; + palEntries.palNumEntries := 1 shl Bitdepth; + {Fill it with grayscale colors} + for j := 0 to palEntries.palNumEntries - 1 do + begin + palEntries.palPalEntry[j].peRed := + fOwner.GammaTable[MulDiv(j, 255, palEntries.palNumEntries - 1)]; + palEntries.palPalEntry[j].peGreen := palEntries.palPalEntry[j].peRed; + palEntries.palPalEntry[j].peBlue := palEntries.palPalEntry[j].peRed; + end; + {Creates and returns the palette} + Result := CreatePalette(pLogPalette(@palEntries)^); +end; + +{Copies the palette to the Device Independent bitmap header} +procedure TChunkIHDR.PaletteToDIB(Palette: HPalette); +var + j: Integer; + palEntries: TMaxLogPalette; +begin + {Copy colors} + Fillchar(palEntries, sizeof(palEntries), #0); + BitmapInfo.bmiHeader.biClrUsed := GetPaletteEntries(Palette, 0, 256, palEntries.palPalEntry[0]); + for j := 0 to BitmapInfo.bmiHeader.biClrUsed - 1 do + begin + BitmapInfo.bmiColors[j].rgbBlue := palEntries.palPalEntry[j].peBlue; + BitmapInfo.bmiColors[j].rgbRed := palEntries.palPalEntry[j].peRed; + BitmapInfo.bmiColors[j].rgbGreen := palEntries.palPalEntry[j].peGreen; + end; +end; + +{Resizes the image data to fill the color type, bit depth, } +{width and height parameters} +procedure TChunkIHDR.PrepareImageData(); + {Set the bitmap info} + procedure SetInfo(const Bitdepth: Integer; const Palette: Boolean); + begin + + {Copy if the bitmap contain palette entries} + HasPalette := Palette; + {Fill the strucutre} + with BitmapInfo.bmiHeader do + begin + biSize := sizeof(TBitmapInfoHeader); + biHeight := Height; + biWidth := Width; + biPlanes := 1; + biBitCount := BitDepth; + biCompression := BI_RGB; + end {with BitmapInfo.bmiHeader} + end; +begin + {Prepare bitmap info header} + Fillchar(BitmapInfo, sizeof(TMaxBitmapInfo), #0); + {Release old image data} + FreeImageData(); + + {Obtain number of bits for each pixel} + case ColorType of + COLOR_GRAYSCALE, COLOR_PALETTE, COLOR_GRAYSCALEALPHA: + case BitDepth of + {These are supported by windows} + 1, 4, 8: SetInfo(BitDepth, TRUE); + {2 bits for each pixel is not supported by windows bitmap} + 2 : SetInfo(4, TRUE); + {Also 16 bits (2 bytes) for each pixel is not supported} + {and should be transormed into a 8 bit grayscale} + 16 : SetInfo(8, TRUE); + end; + {Only 1 byte (8 bits) is supported} + COLOR_RGB, COLOR_RGBALPHA: SetInfo(24, FALSE); + end {case ColorType}; + {Number of bytes for each scanline} + BytesPerRow := (((BitmapInfo.bmiHeader.biBitCount * Width) + 31) + and not 31) div 8; + + {Build array for alpha information, if necessary} + if (ColorType = COLOR_RGBALPHA) or (ColorType = COLOR_GRAYSCALEALPHA) then + begin + GetMem(ImageAlpha, Integer(Width) * Integer(Height)); + FillChar(ImageAlpha^, Integer(Width) * Integer(Height), #0); + end; + + {Build array for extra byte information} + {$IFDEF Store16bits} + if (BitDepth = 16) then + begin + GetMem(ExtraImageData, BytesPerRow * Integer(Height)); + FillChar(ExtraImageData^, BytesPerRow * Integer(Height), #0); + end; + {$ENDIF} + + {Creates the image to hold the data, CreateDIBSection does a better} + {work in allocating necessary memory} + ImageDC := CreateCompatibleDC(0); + {$IFDEF UseDelphi}Self.Owner.Canvas.Handle := ImageDC;{$ENDIF} + + {In case it is a palette image, create the palette} + if HasPalette then + begin + {Create a standard palette} + if ColorType = COLOR_PALETTE then + ImagePalette := CreateHalfTonePalette(ImageDC) + else + ImagePalette := CreateGrayscalePalette(Bitdepth); + ResizePalette(ImagePalette, 1 shl BitmapInfo.bmiHeader.biBitCount); + BitmapInfo.bmiHeader.biClrUsed := 1 shl BitmapInfo.bmiHeader.biBitCount; + SelectPalette(ImageDC, ImagePalette, False); + RealizePalette(ImageDC); + PaletteTODIB(ImagePalette); + end; + + {Create the device independent bitmap} + ImageHandle := CreateDIBSection(ImageDC, pBitmapInfo(@BitmapInfo)^, + DIB_RGB_COLORS, ImageData, 0, 0); + SelectObject(ImageDC, ImageHandle); + + {Build array and allocate bytes for each row} + fillchar(ImageData^, BytesPerRow * Integer(Height), 0); +end; + +{TChunktRNS implementation} + +{$IFNDEF UseDelphi} +function CompareMem(P1, P2: pByte; const Size: Integer): Boolean; +var i: Integer; +begin + Result := True; + for i := 1 to Size do + begin + if P1^ <> P2^ then Result := False; + inc(P1); inc(P2); + end {for i} +end; +{$ENDIF} + +{Sets the transpararent color} +procedure TChunktRNS.SetTransparentColor(const Value: ColorRef); +var + i: Byte; + LookColor: TRGBQuad; +begin + {Clears the palette values} + Fillchar(PaletteValues, SizeOf(PaletteValues), #0); + {Sets that it uses bit transparency} + fBitTransparency := True; + + + {Depends on the color type} + with Header do + case ColorType of + COLOR_GRAYSCALE: + begin + Self.ResizeData(2); + pWord(@PaletteValues[0])^ := ByteSwap16(GetRValue(Value)); + end; + COLOR_RGB: + begin + Self.ResizeData(6); + pWord(@PaletteValues[0])^ := ByteSwap16(GetRValue(Value)); + pWord(@PaletteValues[2])^ := ByteSwap16(GetGValue(Value)); + pWord(@PaletteValues[4])^ := ByteSwap16(GetBValue(Value)); + end; + COLOR_PALETTE: + begin + {Creates a RGBQuad to search for the color} + LookColor.rgbRed := GetRValue(Value); + LookColor.rgbGreen := GetGValue(Value); + LookColor.rgbBlue := GetBValue(Value); + {Look in the table for the entry} + for i := 0 to BitmapInfo.bmiHeader.biClrUsed - 1 do + if CompareMem(@BitmapInfo.bmiColors[i], @LookColor, 3) then + Break; + {Fill the transparency table} + Fillchar(PaletteValues, i, 255); + Self.ResizeData(i + 1) + + end + end {case / with}; + +end; + +{Returns the transparent color for the image} +function TChunktRNS.GetTransparentColor: ColorRef; +var + PaletteChunk: TChunkPLTE; + i: Integer; + Value: Byte; +begin + Result := 0; {Default: Unknown transparent color} + + {Depends on the color type} + with Header do + case ColorType of + COLOR_GRAYSCALE: + begin + Value := BitmapInfo.bmiColors[PaletteValues[1]].rgbRed; + Result := RGB(Value, Value, Value); + end; + COLOR_RGB: + Result := RGB(fOwner.GammaTable[PaletteValues[1]], + fOwner.GammaTable[PaletteValues[3]], + fOwner.GammaTable[PaletteValues[5]]); + COLOR_PALETTE: + begin + {Obtains the palette chunk} + PaletteChunk := Owner.Chunks.ItemFromClass(TChunkPLTE) as TChunkPLTE; + + {Looks for an entry with 0 transparency meaning that it is the} + {full transparent entry} + for i := 0 to Self.DataSize - 1 do + if PaletteValues[i] = 0 then + with PaletteChunk.GetPaletteItem(i) do + begin + Result := RGB(rgbRed, rgbGreen, rgbBlue); + break + end + end {COLOR_PALETTE} + end {case Header.ColorType}; +end; + +{Saving the chunk to a stream} +function TChunktRNS.SaveToStream(Stream: TStream): Boolean; +begin + {Copy palette into data buffer} + if DataSize <= 256 then + CopyMemory(fData, @PaletteValues[0], DataSize); + + Result := inherited SaveToStream(Stream); +end; + +{Assigns from another chunk} +procedure TChunktRNS.Assign(Source: TChunk); +begin + CopyMemory(@PaletteValues[0], @TChunkTrns(Source).PaletteValues[0], 256); + fBitTransparency := TChunkTrns(Source).fBitTransparency; + inherited Assign(Source); +end; + +{Loads the chunk from a stream} +function TChunktRNS.LoadFromStream(Stream: TStream; const ChunkName: TChunkName; + Size: Integer): Boolean; +var + i, Differ255: Integer; +begin + {Let inherited load} + Result := inherited LoadFromStream(Stream, ChunkName, Size); + + if not Result then Exit; + + {Make sure size is correct} + if Size > 256 then Owner.RaiseError(EPNGInvalidPalette, + EPNGInvalidPaletteText); + + {The unset items should have value 255} + Fillchar(PaletteValues[0], 256, 255); + {Copy the other values} + CopyMemory(@PaletteValues[0], fData, Size); + + {Create the mask if needed} + case Header.ColorType of + {Mask for grayscale and RGB} + COLOR_RGB, COLOR_GRAYSCALE: fBitTransparency := True; + COLOR_PALETTE: + begin + Differ255 := 0; {Count the entries with a value different from 255} + {Tests if it uses bit transparency} + for i := 0 to Size - 1 do + if PaletteValues[i] <> 255 then inc(Differ255); + + {If it has one value different from 255 it is a bit transparency} + fBitTransparency := (Differ255 = 1); + end {COLOR_PALETTE} + end {case Header.ColorType}; + +end; + +{Prepares the image palette} +procedure TChunkIDAT.PreparePalette; +var + Entries: Word; + j : Integer; + palEntries: TMaxLogPalette; +begin + {In case the image uses grayscale, build a grayscale palette} + with Header do + if (ColorType = COLOR_GRAYSCALE) or (ColorType = COLOR_GRAYSCALEALPHA) then + begin + {Calculate total number of palette entries} + Entries := (1 shl Byte(BitmapInfo.bmiHeader.biBitCount)); + Fillchar(palEntries, sizeof(palEntries), #0); + palEntries.palVersion := $300; + palEntries.palNumEntries := Entries; + + FOR j := 0 TO Entries - 1 DO + with palEntries.palPalEntry[j] do + begin + + {Calculate each palette entry} + peRed := fOwner.GammaTable[MulDiv(j, 255, Entries - 1)]; + peGreen := peRed; + peBlue := peRed; + end {with BitmapInfo.bmiColors[j]}; + Owner.SetPalette(CreatePalette(pLogPalette(@palEntries)^)); + end {if ColorType = COLOR_GRAYSCALE..., with Header} +end; + +{Reads from ZLIB} +function TChunkIDAT.IDATZlibRead(var ZLIBStream: TZStreamRec2; + Buffer: Pointer; Count: Integer; var EndPos: Integer; + var crcfile: Cardinal): Integer; +var + ProcResult : Integer; + IDATHeader : Array[0..3] of char; + IDATCRC : Cardinal; +begin + {Uses internal record pointed by ZLIBStream to gather information} + with ZLIBStream, ZLIBStream.zlib do + begin + {Set the buffer the zlib will read into} + next_out := Buffer; + avail_out := Count; + + {Decode until it reach the Count variable} + while avail_out > 0 do + begin + {In case it needs more data and it's in the end of a IDAT chunk,} + {it means that there are more IDAT chunks} + if (fStream.Position = EndPos) and (avail_out > 0) and + (avail_in = 0) then + begin + {End this chunk by reading and testing the crc value} + fStream.Read(IDATCRC, 4); + + {$IFDEF CheckCRC} + if crcfile xor $ffffffff <> Cardinal(ByteSwap(IDATCRC)) then + begin + Result := -1; + Owner.RaiseError(EPNGInvalidCRC, EPNGInvalidCRCText); + exit; + end; + {$ENDIF} + + {Start reading the next chunk} + fStream.Read(EndPos, 4); {Reads next chunk size} + fStream.Read(IDATHeader[0], 4); {Next chunk header} + {It must be a IDAT chunk since image data is required and PNG} + {specification says that multiple IDAT chunks must be consecutive} + if IDATHeader <> 'IDAT' then + begin + Owner.RaiseError(EPNGMissingMultipleIDAT, EPNGMissingMultipleIDATText); + result := -1; + exit; + end; + + {Calculate chunk name part of the crc} + {$IFDEF CheckCRC} + crcfile := update_crc($ffffffff, @IDATHeader[0], 4); + {$ENDIF} + EndPos := fStream.Position + ByteSwap(EndPos); + end; + + + {In case it needs compressed data to read from} + if avail_in = 0 then + begin + {In case it's trying to read more than it is avaliable} + if fStream.Position + ZLIBAllocate > EndPos then + avail_in := fStream.Read(Data^, EndPos - fStream.Position) + else + avail_in := fStream.Read(Data^, ZLIBAllocate); + {Update crc} + {$IFDEF CheckCRC} + crcfile := update_crc(crcfile, Data, avail_in); + {$ENDIF} + + {In case there is no more compressed data to read from} + if avail_in = 0 then + begin + Result := Count - avail_out; + Exit; + end; + + {Set next buffer to read and record current position} + next_in := Data; + + end {if avail_in = 0}; + + ProcResult := inflate(zlib, 0); + + {In case the result was not sucessfull} + if (ProcResult < 0) then + begin + Result := -1; + Owner.RaiseError(EPNGZLIBError, + EPNGZLIBErrorText + zliberrors[procresult]); + exit; + end; + + end {while avail_out > 0}; + + end {with}; + + {If everything gone ok, it returns the count bytes} + Result := Count; +end; + +{TChunkIDAT implementation} + +const + {Adam 7 interlacing values} + RowStart: array[0..6] of Integer = (0, 0, 4, 0, 2, 0, 1); + ColumnStart: array[0..6] of Integer = (0, 4, 0, 2, 0, 1, 0); + RowIncrement: array[0..6] of Integer = (8, 8, 8, 4, 4, 2, 2); + ColumnIncrement: array[0..6] of Integer = (8, 8, 4, 4, 2, 2, 1); + +{Copy interlaced images with 1 byte for R, G, B} +procedure TChunkIDAT.CopyInterlacedRGB8(const Pass: Byte; + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); +var + Col: Integer; +begin + {Get first column and enter in loop} + Col := ColumnStart[Pass]; + Dest := pChar(Longint(Dest) + Col * 3); + repeat + {Copy this row} + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 2)^]; inc(Dest); + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 1)^]; inc(Dest); + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) )^]; inc(Dest); + + {Move to next column} + inc(Src, 3); + inc(Dest, ColumnIncrement[Pass] * 3 - 3); + inc(Col, ColumnIncrement[Pass]); + until Col >= ImageWidth; +end; + +{Copy interlaced images with 2 bytes for R, G, B} +procedure TChunkIDAT.CopyInterlacedRGB16(const Pass: Byte; + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); +var + Col: Integer; +begin + {Get first column and enter in loop} + Col := ColumnStart[Pass]; + Dest := pChar(Longint(Dest) + Col * 3); + repeat + {Copy this row} + Byte(Dest^) := Owner.GammaTable[pByte(Longint(Src) + 4)^]; inc(Dest); + Byte(Dest^) := Owner.GammaTable[pByte(Longint(Src) + 2)^]; inc(Dest); + Byte(Dest^) := Owner.GammaTable[pByte(Longint(Src) )^]; inc(Dest); + {$IFDEF Store16bits} + {Copy extra pixel values} + Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 5)^]; inc(Extra); + Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 3)^]; inc(Extra); + Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 1)^]; inc(Extra); + {$ENDIF} + + {Move to next column} + inc(Src, 6); + inc(Dest, ColumnIncrement[Pass] * 3 - 3); + inc(Col, ColumnIncrement[Pass]); + until Col >= ImageWidth; +end; + +{Copy нmages with palette using bit depths 1, 4 or 8} +procedure TChunkIDAT.CopyInterlacedPalette148(const Pass: Byte; + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); +const + BitTable: Array[1..8] of Integer = ($1, $3, 0, $F, 0, 0, 0, $FF); + StartBit: Array[1..8] of Integer = (7 , 0 , 0, 4, 0, 0, 0, 0); +var + CurBit, Col: Integer; + Dest2: PChar; +begin + {Get first column and enter in loop} + Col := ColumnStart[Pass]; + repeat + {Copy data} + CurBit := StartBit[Header.BitDepth]; + repeat + {Adjust pointer to pixel byte bounds} + Dest2 := pChar(Longint(Dest) + (Header.BitDepth * Col) div 8); + {Copy data} + Byte(Dest2^) := Byte(Dest2^) or + ( ((Byte(Src^) shr CurBit) and BitTable[Header.BitDepth]) + shl (StartBit[Header.BitDepth] - (Col * Header.BitDepth mod 8))); + + {Move to next column} + inc(Col, ColumnIncrement[Pass]); + {Will read next bits} + dec(CurBit, Header.BitDepth); + until CurBit < 0; + + {Move to next byte in source} + inc(Src); + until Col >= ImageWidth; +end; + +{Copy нmages with palette using bit depth 2} +procedure TChunkIDAT.CopyInterlacedPalette2(const Pass: Byte; Src, Dest, + Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); +var + CurBit, Col: Integer; + Dest2: PChar; +begin + {Get first column and enter in loop} + Col := ColumnStart[Pass]; + repeat + {Copy data} + CurBit := 6; + repeat + {Adjust pointer to pixel byte bounds} + Dest2 := pChar(Longint(Dest) + Col div 2); + {Copy data} + Byte(Dest2^) := Byte(Dest2^) or (((Byte(Src^) shr CurBit) and $3) + shl (4 - (4 * Col) mod 8)); + {Move to next column} + inc(Col, ColumnIncrement[Pass]); + {Will read next bits} + dec(CurBit, 2); + until CurBit < 0; + + {Move to next byte in source} + inc(Src); + until Col >= ImageWidth; +end; + +{Copy нmages with grayscale using bit depth 2} +procedure TChunkIDAT.CopyInterlacedGray2(const Pass: Byte; + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); +var + CurBit, Col: Integer; + Dest2: PChar; +begin + {Get first column and enter in loop} + Col := ColumnStart[Pass]; + repeat + {Copy data} + CurBit := 6; + repeat + {Adjust pointer to pixel byte bounds} + Dest2 := pChar(Longint(Dest) + Col div 2); + {Copy data} + Byte(Dest2^) := Byte(Dest2^) or ((((Byte(Src^) shr CurBit) shl 2) and $F) + shl (4 - (Col*4) mod 8)); + {Move to next column} + inc(Col, ColumnIncrement[Pass]); + {Will read next bits} + dec(CurBit, 2); + until CurBit < 0; + + {Move to next byte in source} + inc(Src); + until Col >= ImageWidth; +end; + +{Copy нmages with palette using 2 bytes for each pixel} +procedure TChunkIDAT.CopyInterlacedGrayscale16(const Pass: Byte; + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); +var + Col: Integer; +begin + {Get first column and enter in loop} + Col := ColumnStart[Pass]; + Dest := pChar(Longint(Dest) + Col); + repeat + {Copy this row} + Dest^ := Src^; inc(Dest); + {$IFDEF Store16bits} + Extra^ := pChar(Longint(Src) + 1)^; inc(Extra); + {$ENDIF} + + {Move to next column} + inc(Src, 2); + inc(Dest, ColumnIncrement[Pass] - 1); + inc(Col, ColumnIncrement[Pass]); + until Col >= ImageWidth; +end; + +{Decodes interlaced RGB alpha with 1 byte for each sample} +procedure TChunkIDAT.CopyInterlacedRGBAlpha8(const Pass: Byte; + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); +var + Col: Integer; +begin + {Get first column and enter in loop} + Col := ColumnStart[Pass]; + Dest := pChar(Longint(Dest) + Col * 3); + Trans := pChar(Longint(Trans) + Col); + repeat + {Copy this row and alpha value} + Trans^ := pChar(Longint(Src) + 3)^; + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 2)^]; inc(Dest); + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 1)^]; inc(Dest); + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) )^]; inc(Dest); + + {Move to next column} + inc(Src, 4); + inc(Dest, ColumnIncrement[Pass] * 3 - 3); + inc(Trans, ColumnIncrement[Pass]); + inc(Col, ColumnIncrement[Pass]); + until Col >= ImageWidth; +end; + +{Decodes interlaced RGB alpha with 2 bytes for each sample} +procedure TChunkIDAT.CopyInterlacedRGBAlpha16(const Pass: Byte; + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); +var + Col: Integer; +begin + {Get first column and enter in loop} + Col := ColumnStart[Pass]; + Dest := pChar(Longint(Dest) + Col * 3); + Trans := pChar(Longint(Trans) + Col); + repeat + {Copy this row and alpha value} + Trans^ := pChar(Longint(Src) + 6)^; + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 4)^]; inc(Dest); + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 2)^]; inc(Dest); + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) )^]; inc(Dest); + {$IFDEF Store16bits} + {Copy extra pixel values} + Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 5)^]; inc(Extra); + Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 3)^]; inc(Extra); + Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 1)^]; inc(Extra); + {$ENDIF} + + {Move to next column} + inc(Src, 8); + inc(Dest, ColumnIncrement[Pass] * 3 - 3); + inc(Trans, ColumnIncrement[Pass]); + inc(Col, ColumnIncrement[Pass]); + until Col >= ImageWidth; +end; + +{Decodes 8 bit grayscale image followed by an alpha sample} +procedure TChunkIDAT.CopyInterlacedGrayscaleAlpha8(const Pass: Byte; + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); +var + Col: Integer; +begin + {Get first column, pointers to the data and enter in loop} + Col := ColumnStart[Pass]; + Dest := pChar(Longint(Dest) + Col); + Trans := pChar(Longint(Trans) + Col); + repeat + {Copy this grayscale value and alpha} + Dest^ := Src^; inc(Src); + Trans^ := Src^; inc(Src); + + {Move to next column} + inc(Dest, ColumnIncrement[Pass]); + inc(Trans, ColumnIncrement[Pass]); + inc(Col, ColumnIncrement[Pass]); + until Col >= ImageWidth; +end; + +{Decodes 16 bit grayscale image followed by an alpha sample} +procedure TChunkIDAT.CopyInterlacedGrayscaleAlpha16(const Pass: Byte; + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); +var + Col: Integer; +begin + {Get first column, pointers to the data and enter in loop} + Col := ColumnStart[Pass]; + Dest := pChar(Longint(Dest) + Col); + Trans := pChar(Longint(Trans) + Col); + repeat + {$IFDEF Store16bits} + Extra^ := pChar(Longint(Src) + 1)^; inc(Extra); + {$ENDIF} + {Copy this grayscale value and alpha, transforming 16 bits into 8} + Dest^ := Src^; inc(Src, 2); + Trans^ := Src^; inc(Src, 2); + + {Move to next column} + inc(Dest, ColumnIncrement[Pass]); + inc(Trans, ColumnIncrement[Pass]); + inc(Col, ColumnIncrement[Pass]); + until Col >= ImageWidth; +end; + +{Decodes an interlaced image} +procedure TChunkIDAT.DecodeInterlacedAdam7(Stream: TStream; + var ZLIBStream: TZStreamRec2; const Size: Integer; var crcfile: Cardinal); +var + CurrentPass: Byte; + PixelsThisRow: Integer; + CurrentRow: Integer; + Trans, Data{$IFDEF Store16bits}, Extra{$ENDIF}: pChar; + CopyProc: procedure(const Pass: Byte; Src, Dest, + Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar) of object; +begin + + CopyProc := nil; {Initialize} + {Determine method to copy the image data} + case Header.ColorType of + {R, G, B values for each pixel} + COLOR_RGB: + case Header.BitDepth of + 8: CopyProc := CopyInterlacedRGB8; + 16: CopyProc := CopyInterlacedRGB16; + end {case Header.BitDepth}; + {Palette} + COLOR_PALETTE, COLOR_GRAYSCALE: + case Header.BitDepth of + 1, 4, 8: CopyProc := CopyInterlacedPalette148; + 2 : if Header.ColorType = COLOR_PALETTE then + CopyProc := CopyInterlacedPalette2 + else + CopyProc := CopyInterlacedGray2; + 16 : CopyProc := CopyInterlacedGrayscale16; + end; + {RGB followed by alpha} + COLOR_RGBALPHA: + case Header.BitDepth of + 8: CopyProc := CopyInterlacedRGBAlpha8; + 16: CopyProc := CopyInterlacedRGBAlpha16; + end; + {Grayscale followed by alpha} + COLOR_GRAYSCALEALPHA: + case Header.BitDepth of + 8: CopyProc := CopyInterlacedGrayscaleAlpha8; + 16: CopyProc := CopyInterlacedGrayscaleAlpha16; + end; + end {case Header.ColorType}; + + {Adam7 method has 7 passes to make the final image} + FOR CurrentPass := 0 TO 6 DO + begin + {Calculates the number of pixels and bytes for this pass row} + PixelsThisRow := (ImageWidth - ColumnStart[CurrentPass] + + ColumnIncrement[CurrentPass] - 1) div ColumnIncrement[CurrentPass]; + Row_Bytes := BytesForPixels(PixelsThisRow, Header.ColorType, + Header.BitDepth); + {Clear buffer for this pass} + ZeroMemory(Row_Buffer[not RowUsed], Row_Bytes); + + {Get current row index} + CurrentRow := RowStart[CurrentPass]; + {Get a pointer to the current row image data} + Data := Ptr(Longint(Header.ImageData) + Header.BytesPerRow * + (ImageHeight - 1 - CurrentRow)); + Trans := Ptr(Longint(Header.ImageAlpha) + ImageWidth * CurrentRow); + {$IFDEF Store16bits} + Extra := Ptr(Longint(Header.ExtraImageData) + Header.BytesPerRow * + (ImageHeight - 1 - CurrentRow)); + {$ENDIF} + + if Row_Bytes > 0 then {There must have bytes for this interlaced pass} + while CurrentRow < ImageHeight do + begin + {Reads this line and filter} + if IDATZlibRead(ZLIBStream, @Row_Buffer[RowUsed][0], Row_Bytes + 1, + EndPos, CRCFile) = 0 then break; + + FilterRow; + {Copy image data} + + CopyProc(CurrentPass, @Row_Buffer[RowUsed][1], Data, Trans + {$IFDEF Store16bits}, Extra{$ENDIF}); + + {Use the other RowBuffer item} + RowUsed := not RowUsed; + + {Move to the next row} + inc(CurrentRow, RowIncrement[CurrentPass]); + {Move pointer to the next line} + dec(Data, RowIncrement[CurrentPass] * Header.BytesPerRow); + inc(Trans, RowIncrement[CurrentPass] * ImageWidth); + {$IFDEF Store16bits} + dec(Extra, RowIncrement[CurrentPass] * Header.BytesPerRow); + {$ENDIF} + end {while CurrentRow < ImageHeight}; + + end {FOR CurrentPass}; + +end; + +{Copy 8 bits RGB image} +procedure TChunkIDAT.CopyNonInterlacedRGB8( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); +var + I: Integer; +begin + FOR I := 1 TO ImageWidth DO + begin + {Copy pixel values} + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 2)^]; inc(Dest); + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 1)^]; inc(Dest); + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) )^]; inc(Dest); + {Move to next pixel} + inc(Src, 3); + end {for I} +end; + +{Copy 16 bits RGB image} +procedure TChunkIDAT.CopyNonInterlacedRGB16( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); +var + I: Integer; +begin + FOR I := 1 TO ImageWidth DO + begin + //Since windows does not supports 2 bytes for + //each R, G, B value, the method will read only 1 byte from it + {Copy pixel values} + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 4)^]; inc(Dest); + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 2)^]; inc(Dest); + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) )^]; inc(Dest); + {$IFDEF Store16bits} + {Copy extra pixel values} + Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 5)^]; inc(Extra); + Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 3)^]; inc(Extra); + Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 1)^]; inc(Extra); + {$ENDIF} + + {Move to next pixel} + inc(Src, 6); + end {for I} +end; + +{Copy types using palettes (1, 4 or 8 bits per pixel)} +procedure TChunkIDAT.CopyNonInterlacedPalette148( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); +begin + {It's simple as copying the data} + CopyMemory(Dest, Src, Row_Bytes); +end; + +{Copy grayscale types using 2 bits for each pixel} +procedure TChunkIDAT.CopyNonInterlacedGray2( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); +var + i: Integer; +begin + {2 bits is not supported, this routine will converted into 4 bits} + FOR i := 1 TO Row_Bytes do + begin + Byte(Dest^) := ((Byte(Src^) shr 2) and $F) or ((Byte(Src^)) and $F0); + inc(Dest); + Byte(Dest^) := ((Byte(Src^) shl 2) and $F) or ((Byte(Src^) shl 4) and $F0); + inc(Dest); + inc(Src); + end {FOR i} +end; + +{Copy types using palette with 2 bits for each pixel} +procedure TChunkIDAT.CopyNonInterlacedPalette2( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); +var + i: Integer; +begin + {2 bits is not supported, this routine will converted into 4 bits} + FOR i := 1 TO Row_Bytes do + begin + Byte(Dest^) := ((Byte(Src^) shr 4) and $3) or ((Byte(Src^) shr 2) and $30); + inc(Dest); + Byte(Dest^) := (Byte(Src^) and $3) or ((Byte(Src^) shl 2) and $30); + inc(Dest); + inc(Src); + end {FOR i} +end; + +{Copy grayscale images with 16 bits} +procedure TChunkIDAT.CopyNonInterlacedGrayscale16( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); +var + I: Integer; +begin + FOR I := 1 TO ImageWidth DO + begin + {Windows does not supports 16 bits for each pixel in grayscale} + {mode, so reduce to 8} + Dest^ := Src^; inc(Dest); + {$IFDEF Store16bits} + Extra^ := pChar(Longint(Src) + 1)^; inc(Extra); + {$ENDIF} + + {Move to next pixel} + inc(Src, 2); + end {for I} +end; + +{Copy 8 bits per sample RGB images followed by an alpha byte} +procedure TChunkIDAT.CopyNonInterlacedRGBAlpha8( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); +var + i: Integer; +begin + FOR I := 1 TO ImageWidth DO + begin + {Copy pixel values and transparency} + Trans^ := pChar(Longint(Src) + 3)^; + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 2)^]; inc(Dest); + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 1)^]; inc(Dest); + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) )^]; inc(Dest); + {Move to next pixel} + inc(Src, 4); inc(Trans); + end {for I} +end; + +{Copy 16 bits RGB image with alpha using 2 bytes for each sample} +procedure TChunkIDAT.CopyNonInterlacedRGBAlpha16( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); +var + I: Integer; +begin + FOR I := 1 TO ImageWidth DO + begin + //Copy rgb and alpha values (transforming from 16 bits to 8 bits) + {Copy pixel values} + Trans^ := pChar(Longint(Src) + 6)^; + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 4)^]; inc(Dest); + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 2)^]; inc(Dest); + Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) )^]; inc(Dest); + {$IFDEF Store16bits} + {Copy extra pixel values} + Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 5)^]; inc(Extra); + Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 3)^]; inc(Extra); + Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 1)^]; inc(Extra); + {$ENDIF} + {Move to next pixel} + inc(Src, 8); inc(Trans); + end {for I} +end; + +{Copy 8 bits per sample grayscale followed by alpha} +procedure TChunkIDAT.CopyNonInterlacedGrayscaleAlpha8( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); +var + I: Integer; +begin + FOR I := 1 TO ImageWidth DO + begin + {Copy alpha value and then gray value} + Dest^ := Src^; inc(Src); + Trans^ := Src^; inc(Src); + inc(Dest); inc(Trans); + end; +end; + +{Copy 16 bits per sample grayscale followed by alpha} +procedure TChunkIDAT.CopyNonInterlacedGrayscaleAlpha16( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar); +var + I: Integer; +begin + FOR I := 1 TO ImageWidth DO + begin + {Copy alpha value and then gray value} + {$IFDEF Store16bits} + Extra^ := pChar(Longint(Src) + 1)^; inc(Extra); + {$ENDIF} + Dest^ := Src^; inc(Src, 2); + Trans^ := Src^; inc(Src, 2); + inc(Dest); inc(Trans); + end; +end; + +{Decode non interlaced image} +procedure TChunkIDAT.DecodeNonInterlaced(Stream: TStream; + var ZLIBStream: TZStreamRec2; const Size: Integer; var crcfile: Cardinal); +var + j: Cardinal; + Trans, Data{$IFDEF Store16bits}, Extra{$ENDIF}: pChar; + CopyProc: procedure( + Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar) of object; +begin + CopyProc := nil; {Initialize} + {Determines the method to copy the image data} + case Header.ColorType of + {R, G, B values} + COLOR_RGB: + case Header.BitDepth of + 8: CopyProc := CopyNonInterlacedRGB8; + 16: CopyProc := CopyNonInterlacedRGB16; + end; + {Types using palettes} + COLOR_PALETTE, COLOR_GRAYSCALE: + case Header.BitDepth of + 1, 4, 8: CopyProc := CopyNonInterlacedPalette148; + 2 : if Header.ColorType = COLOR_PALETTE then + CopyProc := CopyNonInterlacedPalette2 + else + CopyProc := CopyNonInterlacedGray2; + 16 : CopyProc := CopyNonInterlacedGrayscale16; + end; + {R, G, B followed by alpha} + COLOR_RGBALPHA: + case Header.BitDepth of + 8 : CopyProc := CopyNonInterlacedRGBAlpha8; + 16 : CopyProc := CopyNonInterlacedRGBAlpha16; + end; + {Grayscale followed by alpha} + COLOR_GRAYSCALEALPHA: + case Header.BitDepth of + 8 : CopyProc := CopyNonInterlacedGrayscaleAlpha8; + 16 : CopyProc := CopyNonInterlacedGrayscaleAlpha16; + end; + end; + + {Get the image data pointer} + Longint(Data) := Longint(Header.ImageData) + + Header.BytesPerRow * (ImageHeight - 1); + Trans := Header.ImageAlpha; + {$IFDEF Store16bits} + Longint(Extra) := Longint(Header.ExtraImageData) + + Header.BytesPerRow * (ImageHeight - 1); + {$ENDIF} + {Reads each line} + FOR j := 0 to ImageHeight - 1 do + begin + {Read this line Row_Buffer[RowUsed][0] if the filter type for this line} + if IDATZlibRead(ZLIBStream, @Row_Buffer[RowUsed][0], Row_Bytes + 1, EndPos, + CRCFile) = 0 then break; + + {Filter the current row} + FilterRow; + {Copies non interlaced row to image} + CopyProc(@Row_Buffer[RowUsed][1], Data, Trans{$IFDEF Store16bits}, Extra + {$ENDIF}); + + {Invert line used} + RowUsed := not RowUsed; + dec(Data, Header.BytesPerRow); + {$IFDEF Store16bits}dec(Extra, Header.BytesPerRow);{$ENDIF} + inc(Trans, ImageWidth); + end {for I}; + + +end; + +{Filter the current line} +procedure TChunkIDAT.FilterRow; +var + pp: Byte; + vv, left, above, aboveleft: Integer; + Col: Cardinal; +begin + {Test the filter} + case Row_Buffer[RowUsed]^[0] of + {No filtering for this line} + FILTER_NONE: begin end; + {AND 255 serves only to never let the result be larger than one byte} + {Sub filter} + FILTER_SUB: + FOR Col := Offset + 1 to Row_Bytes DO + Row_Buffer[RowUsed][Col] := (Row_Buffer[RowUsed][Col] + + Row_Buffer[RowUsed][Col - Offset]) and 255; + {Up filter} + FILTER_UP: + FOR Col := 1 to Row_Bytes DO + Row_Buffer[RowUsed][Col] := (Row_Buffer[RowUsed][Col] + + Row_Buffer[not RowUsed][Col]) and 255; + {Average filter} + FILTER_AVERAGE: + FOR Col := 1 to Row_Bytes DO + begin + {Obtains up and left pixels} + above := Row_Buffer[not RowUsed][Col]; + if col - 1 < Offset then + left := 0 + else + Left := Row_Buffer[RowUsed][Col - Offset]; + + {Calculates} + Row_Buffer[RowUsed][Col] := (Row_Buffer[RowUsed][Col] + + (left + above) div 2) and 255; + end; + {Paeth filter} + FILTER_PAETH: + begin + {Initialize} + left := 0; + aboveleft := 0; + {Test each byte} + FOR Col := 1 to Row_Bytes DO + begin + {Obtains above pixel} + above := Row_Buffer[not RowUsed][Col]; + {Obtains left and top-left pixels} + if (col - 1 >= offset) Then + begin + left := row_buffer[RowUsed][col - offset]; + aboveleft := row_buffer[not RowUsed][col - offset]; + end; + + {Obtains current pixel and paeth predictor} + vv := row_buffer[RowUsed][Col]; + pp := PaethPredictor(left, above, aboveleft); + + {Calculates} + Row_Buffer[RowUsed][Col] := (pp + vv) and $FF; + end {for}; + end; + + end {case}; +end; + +{Reads the image data from the stream} +function TChunkIDAT.LoadFromStream(Stream: TStream; const ChunkName: TChunkName; + Size: Integer): Boolean; +var + ZLIBStream: TZStreamRec2; + CRCCheck, + CRCFile : Cardinal; +begin + {Get pointer to the header chunk} + Header := Owner.Chunks.Item[0] as TChunkIHDR; + {Build palette if necessary} + if Header.HasPalette then PreparePalette(); + + {Copy image width and height} + ImageWidth := Header.Width; + ImageHeight := Header.Height; + + {Initialize to calculate CRC} + {$IFDEF CheckCRC} + CRCFile := update_crc($ffffffff, @ChunkName[0], 4); + {$ENDIF} + + Owner.GetPixelInfo(Row_Bytes, Offset); {Obtain line information} + ZLIBStream := ZLIBInitInflate(Stream); {Initializes decompression} + + {Calculate ending position for the current IDAT chunk} + EndPos := Stream.Position + Size; + + {Allocate memory} + GetMem(Row_Buffer[false], Row_Bytes + 1); + GetMem(Row_Buffer[true], Row_Bytes + 1); + ZeroMemory(Row_Buffer[false], Row_bytes + 1); + {Set the variable to alternate the Row_Buffer item to use} + RowUsed := TRUE; + + {Call special methods for the different interlace methods} + case Owner.InterlaceMethod of + imNone: DecodeNonInterlaced(stream, ZLIBStream, Size, crcfile); + imAdam7: DecodeInterlacedAdam7(stream, ZLIBStream, size, crcfile); + end; + + {Free memory} + ZLIBTerminateInflate(ZLIBStream); {Terminates decompression} + FreeMem(Row_Buffer[False], Row_Bytes + 1); + FreeMem(Row_Buffer[True], Row_Bytes + 1); + + {Now checks CRC} + Stream.Read(CRCCheck, 4); + {$IFDEF CheckCRC} + CRCFile := CRCFile xor $ffffffff; + CRCCheck := ByteSwap(CRCCheck); + Result := CRCCheck = CRCFile; + + {Handle CRC error} + if not Result then + begin + {In case it coult not load chunk} + Owner.RaiseError(EPngInvalidCRC, EPngInvalidCRCText); + exit; + end; + {$ELSE}Result := TRUE; {$ENDIF} +end; + +const + IDATHeader: Array[0..3] of char = ('I', 'D', 'A', 'T'); + BUFFER = 5; + +{Saves the IDAT chunk to a stream} +function TChunkIDAT.SaveToStream(Stream: TStream): Boolean; +var + ZLIBStream : TZStreamRec2; +begin + {Get pointer to the header chunk} + Header := Owner.Chunks.Item[0] as TChunkIHDR; + {Copy image width and height} + ImageWidth := Header.Width; + ImageHeight := Header.Height; + Owner.GetPixelInfo(Row_Bytes, Offset); {Obtain line information} + + {Allocate memory} + GetMem(Encode_Buffer[BUFFER], Row_Bytes); + ZeroMemory(Encode_Buffer[BUFFER], Row_Bytes); + {Allocate buffers for the filters selected} + {Filter none will always be calculated to the other filters to work} + GetMem(Encode_Buffer[FILTER_NONE], Row_Bytes); + ZeroMemory(Encode_Buffer[FILTER_NONE], Row_Bytes); + if pfSub in Owner.Filters then + GetMem(Encode_Buffer[FILTER_SUB], Row_Bytes); + if pfUp in Owner.Filters then + GetMem(Encode_Buffer[FILTER_UP], Row_Bytes); + if pfAverage in Owner.Filters then + GetMem(Encode_Buffer[FILTER_AVERAGE], Row_Bytes); + if pfPaeth in Owner.Filters then + GetMem(Encode_Buffer[FILTER_PAETH], Row_Bytes); + + {Initialize ZLIB} + ZLIBStream := ZLIBInitDeflate(Stream, Owner.fCompressionLevel, + Owner.MaxIdatSize); + {Write data depending on the interlace method} + case Owner.InterlaceMethod of + imNone: EncodeNonInterlaced(stream, ZLIBStream); + imAdam7: EncodeInterlacedAdam7(stream, ZLIBStream); + end; + {Terminates ZLIB} + ZLIBTerminateDeflate(ZLIBStream); + + {Release allocated memory} + FreeMem(Encode_Buffer[BUFFER], Row_Bytes); + FreeMem(Encode_Buffer[FILTER_NONE], Row_Bytes); + if pfSub in Owner.Filters then + FreeMem(Encode_Buffer[FILTER_SUB], Row_Bytes); + if pfUp in Owner.Filters then + FreeMem(Encode_Buffer[FILTER_UP], Row_Bytes); + if pfAverage in Owner.Filters then + FreeMem(Encode_Buffer[FILTER_AVERAGE], Row_Bytes); + if pfPaeth in Owner.Filters then + FreeMem(Encode_Buffer[FILTER_PAETH], Row_Bytes); + + {Everything went ok} + Result := True; +end; + +{Writes the IDAT using the settings} +procedure WriteIDAT(Stream: TStream; Data: Pointer; const Length: Cardinal); +var + ChunkLen, CRC: Cardinal; +begin + {Writes IDAT header} + ChunkLen := ByteSwap(Length); + Stream.Write(ChunkLen, 4); {Chunk length} + Stream.Write(IDATHeader[0], 4); {Idat header} + CRC := update_crc($ffffffff, @IDATHeader[0], 4); {Crc part for header} + + {Writes IDAT data and calculates CRC for data} + Stream.Write(Data^, Length); + CRC := Byteswap(update_crc(CRC, Data, Length) xor $ffffffff); + {Writes final CRC} + Stream.Write(CRC, 4); +end; + +{Compress and writes IDAT chunk data} +procedure TChunkIDAT.IDATZlibWrite(var ZLIBStream: TZStreamRec2; + Buffer: Pointer; const Length: Cardinal); +begin + with ZLIBStream, ZLIBStream.ZLIB do + begin + {Set data to be compressed} + next_in := Buffer; + avail_in := Length; + + {Compress all the data avaliable to compress} + while avail_in > 0 do + begin + deflate(ZLIB, Z_NO_FLUSH); + + {The whole buffer was used, save data to stream and restore buffer} + if avail_out = 0 then + begin + {Writes this IDAT chunk} + WriteIDAT(fStream, Data, Owner.MaxIdatSize); + + {Restore buffer} + next_out := Data; + avail_out := Owner.MaxIdatSize; + end {if avail_out = 0}; + + end {while avail_in}; + + end {with ZLIBStream, ZLIBStream.ZLIB} +end; + +{Finishes compressing data to write IDAT chunk} +procedure TChunkIDAT.FinishIDATZlib(var ZLIBStream: TZStreamRec2); +begin + with ZLIBStream, ZLIBStream.ZLIB do + begin + {Set data to be compressed} + next_in := nil; + avail_in := 0; + + while deflate(ZLIB,Z_FINISH) <> Z_STREAM_END do + begin + {Writes this IDAT chunk} + WriteIDAT(fStream, Data, Owner.MaxIdatSize - avail_out); + {Re-update buffer} + next_out := Data; + avail_out := Owner.MaxIdatSize; + end; + + if avail_out < Owner.MaxIdatSize then + {Writes final IDAT} + WriteIDAT(fStream, Data, Owner.MaxIdatSize - avail_out); + + end {with ZLIBStream, ZLIBStream.ZLIB}; +end; + +{Copy memory to encode RGB image with 1 byte for each color sample} +procedure TChunkIDAT.EncodeNonInterlacedRGB8(Src, Dest, Trans: pChar); +var + I: Integer; +begin + FOR I := 1 TO ImageWidth DO + begin + {Copy pixel values} + Byte(Dest^) := fOwner.InverseGamma[pByte(Longint(Src) + 2)^]; inc(Dest); + Byte(Dest^) := fOwner.InverseGamma[pByte(Longint(Src) + 1)^]; inc(Dest); + Byte(Dest^) := fOwner.InverseGamma[pByte(Longint(Src) )^]; inc(Dest); + {Move to next pixel} + inc(Src, 3); + end {for I} +end; + +{Copy memory to encode RGB images with 16 bits for each color sample} +procedure TChunkIDAT.EncodeNonInterlacedRGB16(Src, Dest, Trans: pChar); +var + I: Integer; +begin + FOR I := 1 TO ImageWidth DO + begin + //Now we copy from 1 byte for each sample stored to a 2 bytes (or 1 word) + //for sample + {Copy pixel values} + pWORD(Dest)^ := fOwner.InverseGamma[pByte(Longint(Src) + 2)^]; inc(Dest, 2); + pWORD(Dest)^ := fOwner.InverseGamma[pByte(Longint(Src) + 1)^]; inc(Dest, 2); + pWORD(Dest)^ := fOwner.InverseGamma[pByte(Longint(Src) )^]; inc(Dest, 2); + {Move to next pixel} + inc(Src, 3); + end {for I} + +end; + +{Copy memory to encode types using palettes (1, 4 or 8 bits per pixel)} +procedure TChunkIDAT.EncodeNonInterlacedPalette148(Src, Dest, Trans: pChar); +begin + {It's simple as copying the data} + CopyMemory(Dest, Src, Row_Bytes); +end; + +{Copy memory to encode grayscale images with 2 bytes for each sample} +procedure TChunkIDAT.EncodeNonInterlacedGrayscale16(Src, Dest, Trans: pChar); +var + I: Integer; +begin + FOR I := 1 TO ImageWidth DO + begin + //Now we copy from 1 byte for each sample stored to a 2 bytes (or 1 word) + //for sample + pWORD(Dest)^ := pByte(Longint(Src))^; inc(Dest, 2); + {Move to next pixel} + inc(Src); + end {for I} +end; + +{Encode images using RGB followed by an alpha value using 1 byte for each} +procedure TChunkIDAT.EncodeNonInterlacedRGBAlpha8(Src, Dest, Trans: pChar); +var + i: Integer; +begin + {Copy the data to the destination, including data from Trans pointer} + FOR i := 1 TO ImageWidth do + begin + Byte(Dest^) := Owner.InverseGamma[PByte(Longint(Src) + 2)^]; inc(Dest); + Byte(Dest^) := Owner.InverseGamma[PByte(Longint(Src) + 1)^]; inc(Dest); + Byte(Dest^) := Owner.InverseGamma[PByte(Longint(Src) )^]; inc(Dest); + Dest^ := Trans^; inc(Dest); + inc(Src, 3); inc(Trans); + end {for i}; +end; + +{Encode images using RGB followed by an alpha value using 2 byte for each} +procedure TChunkIDAT.EncodeNonInterlacedRGBAlpha16(Src, Dest, Trans: pChar); +var + i: Integer; +begin + {Copy the data to the destination, including data from Trans pointer} + FOR i := 1 TO ImageWidth do + begin + pWord(Dest)^ := Owner.InverseGamma[PByte(Longint(Src) + 2)^]; inc(Dest, 2); + pWord(Dest)^ := Owner.InverseGamma[PByte(Longint(Src) + 1)^]; inc(Dest, 2); + pWord(Dest)^ := Owner.InverseGamma[PByte(Longint(Src) )^]; inc(Dest, 2); + pWord(Dest)^ := PByte(Longint(Trans) )^; inc(Dest, 2); + inc(Src, 3); inc(Trans); + end {for i}; +end; + +{Encode grayscale images followed by an alpha value using 1 byte for each} +procedure TChunkIDAT.EncodeNonInterlacedGrayscaleAlpha8( + Src, Dest, Trans: pChar); +var + i: Integer; +begin + {Copy the data to the destination, including data from Trans pointer} + FOR i := 1 TO ImageWidth do + begin + Dest^ := Src^; inc(Dest); + Dest^ := Trans^; inc(Dest); + inc(Src); inc(Trans); + end {for i}; +end; + +{Encode grayscale images followed by an alpha value using 2 byte for each} +procedure TChunkIDAT.EncodeNonInterlacedGrayscaleAlpha16( + Src, Dest, Trans: pChar); +var + i: Integer; +begin + {Copy the data to the destination, including data from Trans pointer} + FOR i := 1 TO ImageWidth do + begin + pWord(Dest)^ := pByte(Src)^; inc(Dest, 2); + pWord(Dest)^ := pByte(Trans)^; inc(Dest, 2); + inc(Src); inc(Trans); + end {for i}; +end; + +{Encode non interlaced images} +procedure TChunkIDAT.EncodeNonInterlaced(Stream: TStream; + var ZLIBStream: TZStreamRec2); +var + {Current line} + j: Cardinal; + {Pointers to image data} + Data, Trans: PChar; + {Filter used for this line} + Filter: Byte; + {Method which will copy the data into the buffer} + CopyProc: procedure(Src, Dest, Trans: pChar) of object; +begin + CopyProc := nil; {Initialize to avoid warnings} + {Defines the method to copy the data to the buffer depending on} + {the image parameters} + case Header.ColorType of + {R, G, B values} + COLOR_RGB: + case Header.BitDepth of + 8: CopyProc := EncodeNonInterlacedRGB8; + 16: CopyProc := EncodeNonInterlacedRGB16; + end; + {Palette and grayscale values} + COLOR_GRAYSCALE, COLOR_PALETTE: + case Header.BitDepth of + 1, 4, 8: CopyProc := EncodeNonInterlacedPalette148; + 16: CopyProc := EncodeNonInterlacedGrayscale16; + end; + {RGB with a following alpha value} + COLOR_RGBALPHA: + case Header.BitDepth of + 8: CopyProc := EncodeNonInterlacedRGBAlpha8; + 16: CopyProc := EncodeNonInterlacedRGBAlpha16; + end; + {Grayscale images followed by an alpha} + COLOR_GRAYSCALEALPHA: + case Header.BitDepth of + 8: CopyProc := EncodeNonInterlacedGrayscaleAlpha8; + 16: CopyProc := EncodeNonInterlacedGrayscaleAlpha16; + end; + end {case Header.ColorType}; + + {Get the image data pointer} + Longint(Data) := Longint(Header.ImageData) + + Header.BytesPerRow * (ImageHeight - 1); + Trans := Header.ImageAlpha; + + {Writes each line} + FOR j := 0 to ImageHeight - 1 do + begin + {Copy data into buffer} + CopyProc(Data, @Encode_Buffer[BUFFER][0], Trans); + {Filter data} + Filter := FilterToEncode; + + {Compress data} + IDATZlibWrite(ZLIBStream, @Filter, 1); + IDATZlibWrite(ZLIBStream, @Encode_Buffer[Filter][0], Row_Bytes); + + {Adjust pointers to the actual image data} + dec(Data, Header.BytesPerRow); + inc(Trans, ImageWidth); + end; + + {Compress and finishes copying the remaining data} + FinishIDATZlib(ZLIBStream); +end; + +{Copy memory to encode interlaced images using RGB value with 1 byte for} +{each color sample} +procedure TChunkIDAT.EncodeInterlacedRGB8(const Pass: Byte; + Src, Dest, Trans: pChar); +var + Col: Integer; +begin + {Get first column and enter in loop} + Col := ColumnStart[Pass]; + Src := pChar(Longint(Src) + Col * 3); + repeat + {Copy this row} + Byte(Dest^) := fOwner.InverseGamma[pByte(Longint(Src) + 2)^]; inc(Dest); + Byte(Dest^) := fOwner.InverseGamma[pByte(Longint(Src) + 1)^]; inc(Dest); + Byte(Dest^) := fOwner.InverseGamma[pByte(Longint(Src) )^]; inc(Dest); + + {Move to next column} + inc(Src, ColumnIncrement[Pass] * 3); + inc(Col, ColumnIncrement[Pass]); + until Col >= ImageWidth; +end; + +{Copy memory to encode interlaced RGB images with 2 bytes each color sample} +procedure TChunkIDAT.EncodeInterlacedRGB16(const Pass: Byte; + Src, Dest, Trans: pChar); +var + Col: Integer; +begin + {Get first column and enter in loop} + Col := ColumnStart[Pass]; + Src := pChar(Longint(Src) + Col * 3); + repeat + {Copy this row} + pWord(Dest)^ := Owner.InverseGamma[pByte(Longint(Src) + 2)^]; inc(Dest, 2); + pWord(Dest)^ := Owner.InverseGamma[pByte(Longint(Src) + 1)^]; inc(Dest, 2); + pWord(Dest)^ := Owner.InverseGamma[pByte(Longint(Src) )^]; inc(Dest, 2); + + {Move to next column} + inc(Src, ColumnIncrement[Pass] * 3); + inc(Col, ColumnIncrement[Pass]); + until Col >= ImageWidth; +end; + +{Copy memory to encode interlaced images using palettes using bit depths} +{1, 4, 8 (each pixel in the image)} +procedure TChunkIDAT.EncodeInterlacedPalette148(const Pass: Byte; + Src, Dest, Trans: pChar); +const + BitTable: Array[1..8] of Integer = ($1, $3, 0, $F, 0, 0, 0, $FF); + StartBit: Array[1..8] of Integer = (7 , 0 , 0, 4, 0, 0, 0, 0); +var + CurBit, Col: Integer; + Src2: PChar; +begin + {Clean the line} + fillchar(Dest^, Row_Bytes, #0); + {Get first column and enter in loop} + Col := ColumnStart[Pass]; + with Header.BitmapInfo.bmiHeader do + repeat + {Copy data} + CurBit := StartBit[biBitCount]; + repeat + {Adjust pointer to pixel byte bounds} + Src2 := pChar(Longint(Src) + (biBitCount * Col) div 8); + {Copy data} + Byte(Dest^) := Byte(Dest^) or + (((Byte(Src2^) shr (StartBit[Header.BitDepth] - (biBitCount * Col) + mod 8))) and (BitTable[biBitCount])) shl CurBit; + + {Move to next column} + inc(Col, ColumnIncrement[Pass]); + {Will read next bits} + dec(CurBit, biBitCount); + until CurBit < 0; + + {Move to next byte in source} + inc(Dest); + until Col >= ImageWidth; +end; + +{Copy to encode interlaced grayscale images using 16 bits for each sample} +procedure TChunkIDAT.EncodeInterlacedGrayscale16(const Pass: Byte; + Src, Dest, Trans: pChar); +var + Col: Integer; +begin + {Get first column and enter in loop} + Col := ColumnStart[Pass]; + Src := pChar(Longint(Src) + Col); + repeat + {Copy this row} + pWord(Dest)^ := Byte(Src^); inc(Dest, 2); + + {Move to next column} + inc(Src, ColumnIncrement[Pass]); + inc(Col, ColumnIncrement[Pass]); + until Col >= ImageWidth; +end; + +{Copy to encode interlaced rgb images followed by an alpha value, all using} +{one byte for each sample} +procedure TChunkIDAT.EncodeInterlacedRGBAlpha8(const Pass: Byte; + Src, Dest, Trans: pChar); +var + Col: Integer; +begin + {Get first column and enter in loop} + Col := ColumnStart[Pass]; + Src := pChar(Longint(Src) + Col * 3); + Trans := pChar(Longint(Trans) + Col); + repeat + {Copy this row} + Byte(Dest^) := Owner.InverseGamma[pByte(Longint(Src) + 2)^]; inc(Dest); + Byte(Dest^) := Owner.InverseGamma[pByte(Longint(Src) + 1)^]; inc(Dest); + Byte(Dest^) := Owner.InverseGamma[pByte(Longint(Src) )^]; inc(Dest); + Dest^ := Trans^; inc(Dest); + + {Move to next column} + inc(Src, ColumnIncrement[Pass] * 3); + inc(Trans, ColumnIncrement[Pass]); + inc(Col, ColumnIncrement[Pass]); + until Col >= ImageWidth; +end; + +{Copy to encode interlaced rgb images followed by an alpha value, all using} +{two byte for each sample} +procedure TChunkIDAT.EncodeInterlacedRGBAlpha16(const Pass: Byte; + Src, Dest, Trans: pChar); +var + Col: Integer; +begin + {Get first column and enter in loop} + Col := ColumnStart[Pass]; + Src := pChar(Longint(Src) + Col * 3); + Trans := pChar(Longint(Trans) + Col); + repeat + {Copy this row} + pWord(Dest)^ := pByte(Longint(Src) + 2)^; inc(Dest, 2); + pWord(Dest)^ := pByte(Longint(Src) + 1)^; inc(Dest, 2); + pWord(Dest)^ := pByte(Longint(Src) )^; inc(Dest, 2); + pWord(Dest)^ := pByte(Trans)^; inc(Dest, 2); + + {Move to next column} + inc(Src, ColumnIncrement[Pass] * 3); + inc(Trans, ColumnIncrement[Pass]); + inc(Col, ColumnIncrement[Pass]); + until Col >= ImageWidth; +end; + +{Copy to encode grayscale interlaced images followed by an alpha value, all} +{using 1 byte for each sample} +procedure TChunkIDAT.EncodeInterlacedGrayscaleAlpha8(const Pass: Byte; + Src, Dest, Trans: pChar); +var + Col: Integer; +begin + {Get first column and enter in loop} + Col := ColumnStart[Pass]; + Src := pChar(Longint(Src) + Col); + Trans := pChar(Longint(Trans) + Col); + repeat + {Copy this row} + Dest^ := Src^; inc(Dest); + Dest^ := Trans^; inc(Dest); + + {Move to next column} + inc(Src, ColumnIncrement[Pass]); + inc(Trans, ColumnIncrement[Pass]); + inc(Col, ColumnIncrement[Pass]); + until Col >= ImageWidth; +end; + +{Copy to encode grayscale interlaced images followed by an alpha value, all} +{using 2 bytes for each sample} +procedure TChunkIDAT.EncodeInterlacedGrayscaleAlpha16(const Pass: Byte; + Src, Dest, Trans: pChar); +var + Col: Integer; +begin + {Get first column and enter in loop} + Col := ColumnStart[Pass]; + Src := pChar(Longint(Src) + Col); + Trans := pChar(Longint(Trans) + Col); + repeat + {Copy this row} + pWord(Dest)^ := pByte(Src)^; inc(Dest, 2); + pWord(Dest)^ := pByte(Trans)^; inc(Dest, 2); + + {Move to next column} + inc(Src, ColumnIncrement[Pass]); + inc(Trans, ColumnIncrement[Pass]); + inc(Col, ColumnIncrement[Pass]); + until Col >= ImageWidth; +end; + +{Encode interlaced images} +procedure TChunkIDAT.EncodeInterlacedAdam7(Stream: TStream; + var ZLIBStream: TZStreamRec2); +var + CurrentPass, Filter: Byte; + PixelsThisRow: Integer; + CurrentRow : Integer; + Trans, Data: pChar; + CopyProc: procedure(const Pass: Byte; + Src, Dest, Trans: pChar) of object; +begin + CopyProc := nil; {Initialize to avoid warnings} + {Defines the method to copy the data to the buffer depending on} + {the image parameters} + case Header.ColorType of + {R, G, B values} + COLOR_RGB: + case Header.BitDepth of + 8: CopyProc := EncodeInterlacedRGB8; + 16: CopyProc := EncodeInterlacedRGB16; + end; + {Grayscale and palette} + COLOR_PALETTE, COLOR_GRAYSCALE: + case Header.BitDepth of + 1, 4, 8: CopyProc := EncodeInterlacedPalette148; + 16: CopyProc := EncodeInterlacedGrayscale16; + end; + {RGB followed by alpha} + COLOR_RGBALPHA: + case Header.BitDepth of + 8: CopyProc := EncodeInterlacedRGBAlpha8; + 16: CopyProc := EncodeInterlacedRGBAlpha16; + end; + COLOR_GRAYSCALEALPHA: + {Grayscale followed by alpha} + case Header.BitDepth of + 8: CopyProc := EncodeInterlacedGrayscaleAlpha8; + 16: CopyProc := EncodeInterlacedGrayscaleAlpha16; + end; + end {case Header.ColorType}; + + {Compress the image using the seven passes for ADAM 7} + FOR CurrentPass := 0 TO 6 DO + begin + {Calculates the number of pixels and bytes for this pass row} + PixelsThisRow := (ImageWidth - ColumnStart[CurrentPass] + + ColumnIncrement[CurrentPass] - 1) div ColumnIncrement[CurrentPass]; + Row_Bytes := BytesForPixels(PixelsThisRow, Header.ColorType, + Header.BitDepth); + ZeroMemory(Encode_Buffer[FILTER_NONE], Row_Bytes); + + {Get current row index} + CurrentRow := RowStart[CurrentPass]; + {Get a pointer to the current row image data} + Data := Ptr(Longint(Header.ImageData) + Header.BytesPerRow * + (ImageHeight - 1 - CurrentRow)); + Trans := Ptr(Longint(Header.ImageAlpha) + ImageWidth * CurrentRow); + + {Process all the image rows} + if Row_Bytes > 0 then + while CurrentRow < ImageHeight do + begin + {Copy data into buffer} + CopyProc(CurrentPass, Data, @Encode_Buffer[BUFFER][0], Trans); + {Filter data} + Filter := FilterToEncode; + + {Compress data} + IDATZlibWrite(ZLIBStream, @Filter, 1); + IDATZlibWrite(ZLIBStream, @Encode_Buffer[Filter][0], Row_Bytes); + + {Move to the next row} + inc(CurrentRow, RowIncrement[CurrentPass]); + {Move pointer to the next line} + dec(Data, RowIncrement[CurrentPass] * Header.BytesPerRow); + inc(Trans, RowIncrement[CurrentPass] * ImageWidth); + end {while CurrentRow < ImageHeight} + + end {CurrentPass}; + + {Compress and finishes copying the remaining data} + FinishIDATZlib(ZLIBStream); +end; + +{Filters the row to be encoded and returns the best filter} +function TChunkIDAT.FilterToEncode: Byte; +var + Run, LongestRun, ii, jj: Cardinal; + Last, Above, LastAbove: Byte; +begin + {Selecting more filters using the Filters property from TPngObject} + {increases the chances to the file be much smaller, but decreases} + {the performace} + + {This method will creates the same line data using the different} + {filter methods and select the best} + + {Sub-filter} + if pfSub in Owner.Filters then + for ii := 0 to Row_Bytes - 1 do + begin + {There is no previous pixel when it's on the first pixel, so} + {set last as zero when in the first} + if (ii >= Offset) then + last := Encode_Buffer[BUFFER]^[ii - Offset] + else + last := 0; + Encode_Buffer[FILTER_SUB]^[ii] := Encode_Buffer[BUFFER]^[ii] - last; + end; + + {Up filter} + if pfUp in Owner.Filters then + for ii := 0 to Row_Bytes - 1 do + Encode_Buffer[FILTER_UP]^[ii] := Encode_Buffer[BUFFER]^[ii] - + Encode_Buffer[FILTER_NONE]^[ii]; + + {Average filter} + if pfAverage in Owner.Filters then + for ii := 0 to Row_Bytes - 1 do + begin + {Get the previous pixel, if the current pixel is the first, the} + {previous is considered to be 0} + if (ii >= Offset) then + last := Encode_Buffer[BUFFER]^[ii - Offset] + else + last := 0; + {Get the pixel above} + above := Encode_Buffer[FILTER_NONE]^[ii]; + + {Calculates formula to the average pixel} + Encode_Buffer[FILTER_AVERAGE]^[ii] := Encode_Buffer[BUFFER]^[ii] - + (above + last) div 2 ; + end; + + {Paeth filter (the slower)} + if pfPaeth in Owner.Filters then + begin + {Initialize} + last := 0; + lastabove := 0; + for ii := 0 to Row_Bytes - 1 do + begin + {In case this pixel is not the first in the line obtains the} + {previous one and the one above the previous} + if (ii >= Offset) then + begin + last := Encode_Buffer[BUFFER]^[ii - Offset]; + lastabove := Encode_Buffer[FILTER_NONE]^[ii - Offset]; + end; + {Obtains the pixel above} + above := Encode_Buffer[FILTER_NONE]^[ii]; + {Calculate paeth filter for this byte} + Encode_Buffer[FILTER_PAETH]^[ii] := Encode_Buffer[BUFFER]^[ii] - + PaethPredictor(last, above, lastabove); + end; + end; + + {Now calculates the same line using no filter, which is necessary} + {in order to have data to the filters when the next line comes} + CopyMemory(@Encode_Buffer[FILTER_NONE]^[0], + @Encode_Buffer[BUFFER]^[0], Row_Bytes); + + {If only filter none is selected in the filter list, we don't need} + {to proceed and further} + if (Owner.Filters = [pfNone]) or (Owner.Filters = []) then + begin + Result := FILTER_NONE; + exit; + end {if (Owner.Filters = [pfNone...}; + + {Check which filter is the best by checking which has the larger} + {sequence of the same byte, since they are best compressed} + LongestRun := 0; Result := FILTER_NONE; + for ii := FILTER_NONE TO FILTER_PAETH do + {Check if this filter was selected} + if TFilter(ii) in Owner.Filters then + begin + Run := 0; + {Check if it's the only filter} + if Owner.Filters = [TFilter(ii)] then + begin + Result := ii; + exit; + end; + + {Check using a sequence of four bytes} + for jj := 2 to Row_Bytes - 1 do + if (Encode_Buffer[ii]^[jj] = Encode_Buffer [ii]^[jj-1]) or + (Encode_Buffer[ii]^[jj] = Encode_Buffer [ii]^[jj-2]) then + inc(Run); {Count the number of sequences} + + {Check if this one is the best so far} + if (Run > LongestRun) then + begin + Result := ii; + LongestRun := Run; + end {if (Run > LongestRun)}; + + end {if TFilter(ii) in Owner.Filters}; +end; + +{TChunkPLTE implementation} + +{Returns an item in the palette} +function TChunkPLTE.GetPaletteItem(Index: Byte): TRGBQuad; +begin + {Test if item is valid, if not raise error} + if Index > Count - 1 then + Owner.RaiseError(EPNGError, EPNGUnknownPalEntryText) + else + {Returns the item} + Result := Header.BitmapInfo.bmiColors[Index]; +end; + +{Loads the palette chunk from a stream} +function TChunkPLTE.LoadFromStream(Stream: TStream; + const ChunkName: TChunkName; Size: Integer): Boolean; +type + pPalEntry = ^PalEntry; + PalEntry = record + r, g, b: Byte; + end; +var + j : Integer; {For the FOR} + PalColor : pPalEntry; + palEntries: TMaxLogPalette; +begin + {Let ancestor load data and check CRC} + Result := inherited LoadFromStream(Stream, ChunkName, Size); + if not Result then exit; + + {This chunk must be divisible by 3 in order to be valid} + if (Size mod 3 <> 0) or (Size div 3 > 256) then + begin + {Raise error} + Result := FALSE; + Owner.RaiseError(EPNGInvalidPalette, EPNGInvalidPaletteText); + exit; + end {if Size mod 3 <> 0}; + + {Fill array with the palette entries} + fCount := Size div 3; + Fillchar(palEntries, sizeof(palEntries), #0); + palEntries.palVersion := $300; + palEntries.palNumEntries := fCount; + PalColor := Data; + FOR j := 0 TO fCount - 1 DO + with palEntries.palPalEntry[j] do + begin + peRed := Owner.GammaTable[PalColor.r]; + peGreen := Owner.GammaTable[PalColor.g]; + peBlue := Owner.GammaTable[PalColor.b]; + peFlags := 0; + {Move to next palette entry} + inc(PalColor); + end; + Owner.SetPalette(CreatePalette(pLogPalette(@palEntries)^)); +end; + +{Saves the PLTE chunk to a stream} +function TChunkPLTE.SaveToStream(Stream: TStream): Boolean; +var + J: Integer; + DataPtr: pByte; + BitmapInfo: TMAXBITMAPINFO; + palEntries: TMaxLogPalette; +begin + {Adjust size to hold all the palette items} + if fCount = 0 then fCount := Header.BitmapInfo.bmiHeader.biClrUsed; + ResizeData(fCount * 3); + {Get all the palette entries} + fillchar(palEntries, sizeof(palEntries), #0); + GetPaletteEntries(Header.ImagePalette, 0, 256, palEntries.palPalEntry[0]); + {Copy pointer to data} + DataPtr := fData; + + {Copy palette items} + BitmapInfo := Header.BitmapInfo; + FOR j := 0 TO fCount - 1 DO + with palEntries.palPalEntry[j] do + begin + DataPtr^ := Owner.InverseGamma[peRed]; inc(DataPtr); + DataPtr^ := Owner.InverseGamma[peGreen]; inc(DataPtr); + DataPtr^ := Owner.InverseGamma[peBlue]; inc(DataPtr); + end {with BitmapInfo}; + + {Let ancestor do the rest of the work} + Result := inherited SaveToStream(Stream); +end; + +{Assigns from another PLTE chunk} +procedure TChunkPLTE.Assign(Source: TChunk); +begin + {Copy the number of palette items} + if Source is TChunkPLTE then + fCount := TChunkPLTE(Source).fCount + else + Owner.RaiseError(EPNGError, EPNGCannotAssignChunkText); +end; + +{TChunkgAMA implementation} + +{Assigns from another chunk} +procedure TChunkgAMA.Assign(Source: TChunk); +begin + {Copy the gamma value} + if Source is TChunkgAMA then + Gamma := TChunkgAMA(Source).Gamma + else + Owner.RaiseError(EPNGError, EPNGCannotAssignChunkText); +end; + +{Gamma chunk being created} +constructor TChunkgAMA.Create(Owner: TPngObject); +begin + {Call ancestor} + inherited Create(Owner); + Gamma := 1; {Initial value} +end; + +{Returns gamma value} +function TChunkgAMA.GetValue: Cardinal; +begin + {Make sure that the size is four bytes} + if DataSize <> 4 then + begin + {Adjust size and returns 1} + ResizeData(4); + Result := 1; + end + {If it's right, read the value} + else Result := Cardinal(ByteSwap(pCardinal(Data)^)) +end; + +function Power(Base, Exponent: Extended): Extended; +begin + if Exponent = 0.0 then + Result := 1.0 {Math rule} + else if (Base = 0) or (Exponent = 0) then Result := 0 + else + Result := Exp(Exponent * Ln(Base)); +end; + +{Loading the chunk from a stream} +function TChunkgAMA.LoadFromStream(Stream: TStream; + const ChunkName: TChunkName; Size: Integer): Boolean; +var + i: Integer; + Value: Cardinal; +begin + {Call ancestor and test if it went ok} + Result := inherited LoadFromStream(Stream, ChunkName, Size); + if not Result then exit; + Value := Gamma; + {Build gamma table and inverse table for saving} + if Value <> 0 then + with Owner do + FOR i := 0 TO 255 DO + begin + GammaTable[I] := Round(Power((I / 255), 1 / + (Value / 100000 * 2.2)) * 255); + InverseGamma[Round(Power((I / 255), 1 / + (Value / 100000 * 2.2)) * 255)] := I; + end +end; + +{Sets the gamma value} +procedure TChunkgAMA.SetValue(const Value: Cardinal); +begin + {Make sure that the size is four bytes} + if DataSize <> 4 then ResizeData(4); + {If it's right, set the value} + pCardinal(Data)^ := ByteSwap(Value); +end; + +{TPngObject implementation} + +{Assigns from another object} +procedure TPngObject.Assign(Source: TPersistent); +begin + {Being cleared} + if Source = nil then + ClearChunks + {Assigns contents from another TPNGObject} + else if Source is TPNGObject then + AssignPNG(Source as TPNGObject) + {Copy contents from a TBitmap} + {$IFDEF UseDelphi}else if Source is TBitmap then + with Source as TBitmap do + AssignHandle(Handle, Transparent, + ColorToRGB(TransparentColor)){$ENDIF} + {Unknown source, let ancestor deal with it} + else + inherited; +end; + +{Clear all the chunks in the list} +procedure TPngObject.ClearChunks; +var + i: Integer; +begin + {Initialize gamma} + InitializeGamma(); + {Free all the objects and memory (0 chunks Bug fixed by Noel Sharpe)} + for i := 0 TO Integer(Chunks.Count) - 1 do + TChunk(Chunks.Item[i]).Free; + Chunks.Count := 0; +end; + +{Portable Network Graphics object being created as a blank image} +constructor TPNGObject.CreateBlank(ColorType, BitDepth: Cardinal; + cx, cy: Integer); +var NewIHDR: TChunkIHDR; +begin + {Calls creator} + Create; + {Checks if the parameters are ok} + if not (ColorType in [COLOR_GRAYSCALE, COLOR_RGB, COLOR_PALETTE, + COLOR_GRAYSCALEALPHA, COLOR_RGBALPHA]) or not (BitDepth in + [1,2,4,8, 16]) or ((ColorType = COLOR_PALETTE) and (BitDepth = 16)) or + ((ColorType = COLOR_RGB) and (BitDepth < 8)) then + begin + RaiseError(EPNGInvalidSpec, EInvalidSpec); + exit; + end; + if Bitdepth = 2 then Bitdepth := 4; + + {Add the basis chunks} + InitializeGamma; + BeingCreated := True; + Chunks.Add(TChunkIEND); + NewIHDR := Chunks.Add(TChunkIHDR) as TChunkIHDR; + NewIHDR.IHDRData.ColorType := ColorType; + NewIHDR.IHDRData.BitDepth := BitDepth; + NewIHDR.IHDRData.Width := cx; + NewIHDR.IHDRData.Height := cy; + NewIHDR.PrepareImageData; + if NewIHDR.HasPalette then + TChunkPLTE(Chunks.Add(TChunkPLTE)).fCount := 1 shl BitDepth; + Chunks.Add(TChunkIDAT); + BeingCreated := False; +end; + +{Portable Network Graphics object being created} +constructor TPngObject.Create; +begin + {Let it be created} + inherited Create; + + {Initial properties} + {$IFDEF UseDelphi}fCanvas := TCanvas.Create;{$ENDIF} + fFilters := [pfSub]; + fCompressionLevel := 7; + fInterlaceMethod := imNone; + fMaxIdatSize := High(Word); + {Create chunklist object} + fChunkList := TPngList.Create(Self); + +end; + +{Portable Network Graphics object being destroyed} +destructor TPngObject.Destroy; +begin + {Free object list} + ClearChunks; + fChunkList.Free; + {$IFDEF UseDelphi}if fCanvas <> nil then + fCanvas.Free;{$ENDIF} + + {Call ancestor destroy} + inherited Destroy; +end; + +{Returns linesize and byte offset for pixels} +procedure TPngObject.GetPixelInfo(var LineSize, Offset: Cardinal); +begin + {There must be an Header chunk to calculate size} + if HeaderPresent then + begin + {Calculate number of bytes for each line} + LineSize := BytesForPixels(Header.Width, Header.ColorType, Header.BitDepth); + + {Calculates byte offset} + Case Header.ColorType of + {Grayscale} + COLOR_GRAYSCALE: + If Header.BitDepth = 16 Then + Offset := 2 + Else + Offset := 1 ; + {It always smaller or equal one byte, so it occupes one byte} + COLOR_PALETTE: + offset := 1; + {It might be 3 or 6 bytes} + COLOR_RGB: + offset := 3 * Header.BitDepth Div 8; + {It might be 2 or 4 bytes} + COLOR_GRAYSCALEALPHA: + offset := 2 * Header.BitDepth Div 8; + {4 or 8 bytes} + COLOR_RGBALPHA: + offset := 4 * Header.BitDepth Div 8; + else + Offset := 0; + End ; + + end + else + begin + {In case if there isn't any Header chunk} + Offset := 0; + LineSize := 0; + end; + +end; + +{Returns image height} +function TPngObject.GetHeight: Integer; +begin + {There must be a Header chunk to get the size, otherwise returns 0} + if HeaderPresent then + Result := TChunkIHDR(Chunks.Item[0]).Height + else Result := 0; +end; + +{Returns image width} +function TPngObject.GetWidth: Integer; +begin + {There must be a Header chunk to get the size, otherwise returns 0} + if HeaderPresent then + Result := Header.Width + else Result := 0; +end; + +{Returns if the image is empty} +function TPngObject.GetEmpty: Boolean; +begin + Result := (Chunks.Count = 0); +end; + +{Raises an error} +procedure TPngObject.RaiseError(ExceptionClass: ExceptClass; Text: String); +begin + raise ExceptionClass.Create(Text); +end; + +{Set the maximum size for IDAT chunk} +procedure TPngObject.SetMaxIdatSize(const Value: Integer); +begin + {Make sure the size is at least 65535} + if Value < High(Word) then + fMaxIdatSize := High(Word) else fMaxIdatSize := Value; +end; + +{Draws the image using pixel information from TChunkpHYs} +procedure TPNGObject.DrawUsingPixelInformation(Canvas: TCanvas; Point: TPoint); + function Rect(Left, Top, Right, Bottom: Integer): TRect; + begin + Result.Left := Left; + Result.Top := Top; + Result.Right := Right; + Result.Bottom := Bottom; + end; +var + PPMeterY, PPMeterX: Double; + NewSizeX, NewSizeY: Integer; + DC: HDC; +begin + {Get system information} + DC := GetDC(0); + PPMeterY := GetDeviceCaps(DC, LOGPIXELSY) / 0.0254; + PPMeterX := GetDeviceCaps(DC, LOGPIXELSX) / 0.0254; + ReleaseDC(0, DC); + + {In case it does not has pixel information} + if not HasPixelInformation then + Draw(Canvas, Rect(Point.X, Point.Y, Point.X + Width, + Point.Y + Height)) + else + with PixelInformation do + begin + NewSizeX := Trunc(Self.Width / (PPUnitX / PPMeterX)); + NewSizeY := Trunc(Self.Height / (PPUnitY / PPMeterY)); + Draw(Canvas, Rect(Point.X, Point.Y, Point.X + NewSizeX, + Point.Y + NewSizeY)); + end; +end; + +{$IFNDEF UseDelphi} + {Creates a file stream reading from the filename in the parameter and load} + procedure TPngObject.LoadFromFile(const Filename: String); + var + FileStream: TFileStream; + begin + {Test if the file exists} + if not FileExists(Filename) then + begin + {In case it does not exists, raise error} + RaiseError(EPNGNotExists, EPNGNotExistsText); + exit; + end; + + {Creates the file stream to read} + FileStream := TFileStream.Create(Filename, [fsmRead]); + LoadFromStream(FileStream); {Loads the data} + FileStream.Free; {Free file stream} + end; + + {Saves the current png image to a file} + procedure TPngObject.SaveToFile(const Filename: String); + var + FileStream: TFileStream; + begin + {Creates the file stream to write} + FileStream := TFileStream.Create(Filename, [fsmWrite]); + SaveToStream(FileStream); {Saves the data} + FileStream.Free; {Free file stream} + end; + +{$ENDIF} + +{Returns if it has the pixel information chunk} +function TPngObject.HasPixelInformation: Boolean; +begin + Result := (Chunks.ItemFromClass(TChunkpHYs) as tChunkpHYs) <> nil; +end; + +{Returns the pixel information chunk} +function TPngObject.GetPixelInformation: TChunkpHYs; +begin + Result := Chunks.ItemFromClass(TChunkpHYs) as tChunkpHYs; + if not Assigned(Result) then + begin + Result := Chunks.Add(tChunkpHYs) as tChunkpHYs; + Result.fUnit := utMeter; + end; +end; + +{Returns pointer to the chunk TChunkIHDR which should be the first} +function TPngObject.GetHeader: TChunkIHDR; +begin + {If there is a TChunkIHDR returns it, otherwise returns nil} + if (Chunks.Count <> 0) and (Chunks.Item[0] is TChunkIHDR) then + Result := Chunks.Item[0] as TChunkIHDR + else + begin + {No header, throw error message} + RaiseError(EPNGHeaderNotPresent, EPNGHeaderNotPresentText); + Result := nil + end +end; + +{Draws using partial transparency} +procedure TPngObject.DrawPartialTrans(DC: HDC; Rect: TRect); + {Adjust the rectangle structure} + procedure AdjustRect(var Rect: TRect); + var + t: Integer; + begin + if Rect.Right < Rect.Left then + begin + t := Rect.Right; + Rect.Right := Rect.Left; + Rect.Left := t; + end; + if Rect.Bottom < Rect.Top then + begin + t := Rect.Bottom; + Rect.Bottom := Rect.Top; + Rect.Top := t; + end + end; + +type + {Access to pixels} + TPixelLine = Array[Word] of TRGBQuad; + pPixelLine = ^TPixelLine; +const + {Structure used to create the bitmap} + BitmapInfoHeader: TBitmapInfoHeader = + (biSize: sizeof(TBitmapInfoHeader); + biWidth: 100; + biHeight: 100; + biPlanes: 1; + biBitCount: 32; + biCompression: BI_RGB; + biSizeImage: 0; + biXPelsPerMeter: 0; + biYPelsPerMeter: 0; + biClrUsed: 0; + biClrImportant: 0); +var + {Buffer bitmap creation} + BitmapInfo : TBitmapInfo; + BufferDC : HDC; + BufferBits : Pointer; + OldBitmap, + BufferBitmap: HBitmap; + Header: TChunkIHDR; + + {Transparency/palette chunks} + TransparencyChunk: TChunktRNS; + PaletteChunk: TChunkPLTE; + TransValue, PaletteIndex: Byte; + CurBit: Integer; + Data: PByte; + + {Buffer bitmap modification} + BytesPerRowDest, + BytesPerRowSrc, + BytesPerRowAlpha: Integer; + ImageSource, ImageSourceOrg, + AlphaSource : pByteArray; + ImageData : pPixelLine; + i, j, i2, j2 : Integer; + + {For bitmap stretching} + W, H : Cardinal; + Stretch : Boolean; + FactorX, FactorY: Double; +begin + {Prepares the rectangle structure to stretch draw} + if (Rect.Right = Rect.Left) or (Rect.Bottom = Rect.Top) then exit; + AdjustRect(Rect); + {Gets the width and height} + W := Rect.Right - Rect.Left; + H := Rect.Bottom - Rect.Top; + Header := Self.Header; {Fast access to header} + Stretch := (W <> Header.Width) or (H <> Header.Height); + if Stretch then FactorX := W / Header.Width else FactorX := 1; + if Stretch then FactorY := H / Header.Height else FactorY := 1; + + {Prepare to create the bitmap} + Fillchar(BitmapInfo, sizeof(BitmapInfo), #0); + BitmapInfoHeader.biWidth := W; + BitmapInfoHeader.biHeight := -Integer(H); + BitmapInfo.bmiHeader := BitmapInfoHeader; + + {Create the bitmap which will receive the background, the applied} + {alpha blending and then will be painted on the background} + BufferDC := CreateCompatibleDC(0); + {In case BufferDC could not be created} + if (BufferDC = 0) then RaiseError(EPNGOutMemory, EPNGOutMemoryText); + BufferBitmap := CreateDIBSection(BufferDC, BitmapInfo, DIB_RGB_COLORS, + BufferBits, 0, 0); + {In case buffer bitmap could not be created} + if (BufferBitmap = 0) or (BufferBits = Nil) then + begin + if BufferBitmap <> 0 then DeleteObject(BufferBitmap); + DeleteDC(BufferDC); + RaiseError(EPNGOutMemory, EPNGOutMemoryText); + end; + + {Selects new bitmap and release old bitmap} + OldBitmap := SelectObject(BufferDC, BufferBitmap); + + {Draws the background on the buffer image} + BitBlt(BufferDC, 0, 0, W, H, DC, Rect.Left, Rect.Top, SRCCOPY); + + {Obtain number of bytes for each row} + BytesPerRowAlpha := Header.Width; + BytesPerRowDest := (((BitmapInfo.bmiHeader.biBitCount * W) + 31) + and not 31) div 8; {Number of bytes for each image row in destination} + BytesPerRowSrc := (((Header.BitmapInfo.bmiHeader.biBitCount * Header.Width) + + 31) and not 31) div 8; {Number of bytes for each image row in source} + + {Obtains image pointers} + ImageData := BufferBits; + AlphaSource := Header.ImageAlpha; + Longint(ImageSource) := Longint(Header.ImageData) + + Header.BytesPerRow * Longint(Header.Height - 1); + ImageSourceOrg := ImageSource; + + case Header.BitmapInfo.bmiHeader.biBitCount of + {R, G, B images} + 24: + FOR j := 1 TO H DO + begin + {Process all the pixels in this line} + FOR i := 0 TO W - 1 DO + begin + if Stretch then i2 := trunc(i / FactorX) else i2 := i; + {Optmize when we donґt have transparency} + if (AlphaSource[i2] <> 0) then + if (AlphaSource[i2] = 255) then + ImageData[i] := pRGBQuad(@ImageSource[i2 * 3])^ + else + with ImageData[i] do + begin + rgbRed := (255+ImageSource[2+i2*3] * AlphaSource[i2] + rgbRed * + (not AlphaSource[i2])) shr 8; + rgbGreen := (255+ImageSource[1+i2*3] * AlphaSource[i2] + + rgbGreen * (not AlphaSource[i2])) shr 8; + rgbBlue := (255+ImageSource[i2*3] * AlphaSource[i2] + rgbBlue * + (not AlphaSource[i2])) shr 8; + end; + end; + + {Move pointers} + inc(Longint(ImageData), BytesPerRowDest); + if Stretch then j2 := trunc(j / FactorY) else j2 := j; + Longint(ImageSource) := Longint(ImageSourceOrg) - BytesPerRowSrc * j2; + Longint(AlphaSource) := Longint(Header.ImageAlpha) + + BytesPerRowAlpha * j2; + end; + {Palette images with 1 byte for each pixel} + 1,4,8: if Header.ColorType = COLOR_GRAYSCALEALPHA then + FOR j := 1 TO H DO + begin + {Process all the pixels in this line} + FOR i := 0 TO W - 1 DO + with ImageData[i], Header.BitmapInfo do begin + if Stretch then i2 := trunc(i / FactorX) else i2 := i; + rgbRed := (255 + ImageSource[i2] * AlphaSource[i2] + + rgbRed * (255 - AlphaSource[i2])) shr 8; + rgbGreen := (255 + ImageSource[i2] * AlphaSource[i2] + + rgbGreen * (255 - AlphaSource[i2])) shr 8; + rgbBlue := (255 + ImageSource[i2] * AlphaSource[i2] + + rgbBlue * (255 - AlphaSource[i2])) shr 8; + end; + + {Move pointers} + Longint(ImageData) := Longint(ImageData) + BytesPerRowDest; + if Stretch then j2 := trunc(j / FactorY) else j2 := j; + Longint(ImageSource) := Longint(ImageSourceOrg) - BytesPerRowSrc * j2; + Longint(AlphaSource) := Longint(Header.ImageAlpha) + + BytesPerRowAlpha * j2; + end + else {Palette images} + begin + {Obtain pointer to the transparency chunk} + TransparencyChunk := TChunktRNS(Chunks.ItemFromClass(TChunktRNS)); + PaletteChunk := TChunkPLTE(Chunks.ItemFromClass(TChunkPLTE)); + + FOR j := 1 TO H DO + begin + {Process all the pixels in this line} + i := 0; + repeat + CurBit := 0; + if Stretch then i2 := trunc(i / FactorX) else i2 := i; + Data := @ImageSource[i2]; + + repeat + {Obtains the palette index} + case Header.BitDepth of + 1: PaletteIndex := (Data^ shr (7-(I Mod 8))) and 1; + 2,4: PaletteIndex := (Data^ shr ((1-(I Mod 2))*4)) and $0F; + else PaletteIndex := Data^; + end; + + {Updates the image with the new pixel} + with ImageData[i] do + begin + TransValue := TransparencyChunk.PaletteValues[PaletteIndex]; + rgbRed := (255 + PaletteChunk.Item[PaletteIndex].rgbRed * + TransValue + rgbRed * (255 - TransValue)) shr 8; + rgbGreen := (255 + PaletteChunk.Item[PaletteIndex].rgbGreen * + TransValue + rgbGreen * (255 - TransValue)) shr 8; + rgbBlue := (255 + PaletteChunk.Item[PaletteIndex].rgbBlue * + TransValue + rgbBlue * (255 - TransValue)) shr 8; + end; + + {Move to next data} + inc(i); inc(CurBit, Header.BitmapInfo.bmiHeader.biBitCount); + until CurBit >= 8; + {Move to next source data} + //inc(Data); + until i >= Integer(W); + + {Move pointers} + Longint(ImageData) := Longint(ImageData) + BytesPerRowDest; + if Stretch then j2 := trunc(j / FactorY) else j2 := j; + Longint(ImageSource) := Longint(ImageSourceOrg) - BytesPerRowSrc * j2; + end + end {Palette images} + end {case Header.BitmapInfo.bmiHeader.biBitCount}; + + {Draws the new bitmap on the foreground} + BitBlt(DC, Rect.Left, Rect.Top, W, H, BufferDC, 0, 0, SRCCOPY); + + {Free bitmap} + SelectObject(BufferDC, OldBitmap); + DeleteObject(BufferBitmap); + DeleteDC(BufferDC); +end; + +{Draws the image into a canvas} +procedure TPngObject.Draw(ACanvas: TCanvas; const Rect: TRect); +var + Header: TChunkIHDR; +begin + {Quit in case there is no header, otherwise obtain it} + if Empty then Exit; + Header := Chunks.GetItem(0) as TChunkIHDR; + + {Copy the data to the canvas} + case Self.TransparencyMode of + {$IFDEF PartialTransparentDraw} + ptmPartial: + DrawPartialTrans(ACanvas{$IFDEF UseDelphi}.Handle{$ENDIF}, Rect); + {$ENDIF} + ptmBit: DrawTransparentBitmap(ACanvas{$IFDEF UseDelphi}.Handle{$ENDIF}, + Header.ImageData, Header.BitmapInfo.bmiHeader, + pBitmapInfo(@Header.BitmapInfo), Rect, + {$IFDEF UseDelphi}ColorToRGB({$ENDIF}TransparentColor) + {$IFDEF UseDelphi}){$ENDIF} + else + begin + SetStretchBltMode(ACanvas{$IFDEF UseDelphi}.Handle{$ENDIF}, COLORONCOLOR); + StretchDiBits(ACanvas{$IFDEF UseDelphi}.Handle{$ENDIF}, Rect.Left, + Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top, 0, 0, + Header.Width, Header.Height, Header.ImageData, + pBitmapInfo(@Header.BitmapInfo)^, DIB_RGB_COLORS, SRCCOPY) + end + end {case} +end; + +{Characters for the header} +const + PngHeader: Array[0..7] of Char = (#137, #80, #78, #71, #13, #10, #26, #10); + +{Loads the image from a stream of data} +procedure TPngObject.LoadFromStream(Stream: TStream); +var + Header : Array[0..7] of Char; + HasIDAT : Boolean; + + {Chunks reading} + ChunkCount : Cardinal; + ChunkLength: Cardinal; + ChunkName : TChunkName; +begin + {Initialize before start loading chunks} + ChunkCount := 0; + ClearChunks(); + {Reads the header} + Stream.Read(Header[0], 8); + + {Test if the header matches} + if Header <> PngHeader then + begin + RaiseError(EPNGInvalidFileHeader, EPNGInvalidFileHeaderText); + Exit; + end; + + + HasIDAT := FALSE; + Chunks.Count := 10; + + {Load chunks} + repeat + inc(ChunkCount); {Increment number of chunks} + if Chunks.Count < ChunkCount then {Resize the chunks list if needed} + Chunks.Count := Chunks.Count + 10; + + {Reads chunk length and invert since it is in network order} + {also checks the Read method return, if it returns 0, it} + {means that no bytes was readed, probably because it reached} + {the end of the file} + if Stream.Read(ChunkLength, 4) = 0 then + begin + {In case it found the end of the file here} + Chunks.Count := ChunkCount - 1; + RaiseError(EPNGUnexpectedEnd, EPNGUnexpectedEndText); + end; + + ChunkLength := ByteSwap(ChunkLength); + {Reads chunk name} + Stream.Read(Chunkname, 4); + + {Here we check if the first chunk is the Header which is necessary} + {to the file in order to be a valid Portable Network Graphics image} + if (ChunkCount = 1) and (ChunkName <> 'IHDR') then + begin + Chunks.Count := ChunkCount - 1; + RaiseError(EPNGIHDRNotFirst, EPNGIHDRNotFirstText); + exit; + end; + + {Has a previous IDAT} + if (HasIDAT and (ChunkName = 'IDAT')) or (ChunkName = 'cHRM') then + begin + dec(ChunkCount); + Stream.Seek(ChunkLength + 4, soFromCurrent); + Continue; + end; + {Tell it has an IDAT chunk} + if ChunkName = 'IDAT' then HasIDAT := TRUE; + + {Creates object for this chunk} + Chunks.SetItem(ChunkCount - 1, CreateClassChunk(Self, ChunkName)); + + {Check if the chunk is critical and unknown} + {$IFDEF ErrorOnUnknownCritical} + if (TChunk(Chunks.Item[ChunkCount - 1]).ClassType = TChunk) and + ((Byte(ChunkName[0]) AND $20) = 0) and (ChunkName <> '') then + begin + Chunks.Count := ChunkCount; + RaiseError(EPNGUnknownCriticalChunk, EPNGUnknownCriticalChunkText); + end; + {$ENDIF} + + {Loads it} + try if not TChunk(Chunks.Item[ChunkCount - 1]).LoadFromStream(Stream, + ChunkName, ChunkLength) then break; + except + Chunks.Count := ChunkCount; + raise; + end; + + {Terminates when it reaches the IEND chunk} + until (ChunkName = 'IEND'); + + {Resize the list to the appropriate size} + Chunks.Count := ChunkCount; + + {Check if there is data} + if not HasIDAT then + RaiseError(EPNGNoImageData, EPNGNoImageDataText); +end; + +{Changing height is not supported} +procedure TPngObject.SetHeight(Value: Integer); +begin + Resize(Width, Value) +end; + +{Changing width is not supported} +procedure TPngObject.SetWidth(Value: Integer); +begin + Resize(Value, Height) +end; + +{$IFDEF UseDelphi} +{Saves to clipboard format (thanks to Antoine Pottern)} +procedure TPNGObject.SaveToClipboardFormat(var AFormat: Word; + var AData: THandle; var APalette: HPalette); +begin + with TBitmap.Create do + try + Width := Self.Width; + Height := Self.Height; + Self.Draw(Canvas, Rect(0, 0, Width, Height)); + SaveToClipboardFormat(AFormat, AData, APalette); + finally + Free; + end {try} +end; + +{Loads data from clipboard} +procedure TPngObject.LoadFromClipboardFormat(AFormat: Word; + AData: THandle; APalette: HPalette); +begin + with TBitmap.Create do + try + LoadFromClipboardFormat(AFormat, AData, APalette); + Self.AssignHandle(Handle, False, 0); + finally + Free; + end {try} +end; + +{Returns if the image is transparent} +function TPngObject.GetTransparent: Boolean; +begin + Result := (TransparencyMode <> ptmNone); +end; + +{$ENDIF} + +{Saving the PNG image to a stream of data} +procedure TPngObject.SaveToStream(Stream: TStream); +var + j: Integer; +begin + {Reads the header} + Stream.Write(PNGHeader[0], 8); + {Write each chunk} + FOR j := 0 TO Chunks.Count - 1 DO + Chunks.Item[j].SaveToStream(Stream) +end; + +{Prepares the Header chunk} +procedure BuildHeader(Header: TChunkIHDR; Handle: HBitmap; Info: pBitmap); +var + DC: HDC; +begin + {Set width and height} + Header.Width := Info.bmWidth; + Header.Height := abs(Info.bmHeight); + {Set bit depth} + if Info.bmBitsPixel >= 16 then + Header.BitDepth := 8 else Header.BitDepth := Info.bmBitsPixel; + {Set color type} + if Info.bmBitsPixel >= 16 then + Header.ColorType := COLOR_RGB else Header.ColorType := COLOR_PALETTE; + {Set other info} + Header.CompressionMethod := 0; {deflate/inflate} + Header.InterlaceMethod := 0; {no interlace} + + {Prepares bitmap headers to hold data} + Header.PrepareImageData(); + {Copy image data} + DC := CreateCompatibleDC(0); + GetDIBits(DC, Handle, 0, Header.Height, Header.ImageData, + pBitmapInfo(@Header.BitmapInfo)^, DIB_RGB_COLORS); + + DeleteDC(DC); +end; + +{Loads the image from a resource} +procedure TPngObject.LoadFromResourceName(Instance: HInst; + const Name: String); +var + ResStream: TResourceStream; +begin + {Creates an especial stream to load from the resource} + try ResStream := TResourceStream.Create(Instance, Name, RT_RCDATA); + except RaiseError(EPNGCouldNotLoadResource, EPNGCouldNotLoadResourceText); + exit; end; + + {Loads the png image from the resource} + try + LoadFromStream(ResStream); + finally + ResStream.Free; + end; +end; + +{Loads the png from a resource ID} +procedure TPngObject.LoadFromResourceID(Instance: HInst; ResID: Integer); +begin + LoadFromResourceName(Instance, String(ResID)); +end; + +{Assigns this tpngobject to another object} +procedure TPngObject.AssignTo(Dest: TPersistent); +{$IFDEF UseDelphi} + function DetectPixelFormat: TPixelFormat; + begin + with Header do + begin + {Always use 24bits for partial transparency} + if TransparencyMode = ptmPartial then + DetectPixelFormat := pf24bit + else + case BitDepth of + {Only supported by COLOR_PALETTE} + 1: DetectPixelFormat := pf1bit; + 2, 4: DetectPixelFormat := pf4bit; + {8 may be palette or r, g, b values} + 8, 16: + case ColorType of + COLOR_RGB, COLOR_GRAYSCALE: DetectPixelFormat := pf24bit; + COLOR_PALETTE: DetectPixelFormat := pf8bit; + else raise Exception.Create(''); + end {case ColorFormat of} + else raise Exception.Create(''); + end {case BitDepth of} + end {with Header} + end; +var + TRNS: TChunkTRNS; +{$ENDIF} +begin + {If the destination is also a TPNGObject make it assign} + {this one} + if Dest is TPNGObject then + TPNGObject(Dest).AssignPNG(Self) + {$IFDEF UseDelphi} + {In case the destination is a bitmap} + else if (Dest is TBitmap) and HeaderPresent then + begin + {Copies the handle using CopyImage API} + TBitmap(Dest).PixelFormat := DetectPixelFormat; + TBitmap(Dest).Width := Width; + TBitmap(Dest).Height := Height; + TBitmap(Dest).Canvas.Draw(0, 0, Self); + + {Copy transparency mode} + if (TransparencyMode = ptmBit) then + begin + TRNS := Chunks.ItemFromClass(TChunkTRNS) as TChunkTRNS; + TBitmap(Dest).TransparentColor := TRNS.TransparentColor; + TBitmap(Dest).Transparent := True + end {if (TransparencyMode = ptmBit)} + + end + else + {Unknown destination kind} + inherited AssignTo(Dest); + {$ENDIF} +end; + +{Assigns from a bitmap object} +procedure TPngObject.AssignHandle(Handle: HBitmap; Transparent: Boolean; + TransparentColor: ColorRef); +var + BitmapInfo: Windows.TBitmap; + {Chunks} + Header: TChunkIHDR; + PLTE: TChunkPLTE; + IDAT: TChunkIDAT; + IEND: TChunkIEND; + TRNS: TChunkTRNS; + i: Integer; + palEntries : TMaxLogPalette; +begin + {Obtain bitmap info} + GetObject(Handle, SizeOf(BitmapInfo), @BitmapInfo); + + {Clear old chunks and prepare} + ClearChunks(); + + {Create the chunks} + Header := TChunkIHDR.Create(Self); + + {This method will fill the Header chunk with bitmap information} + {and copy the image data} + BuildHeader(Header, Handle, @BitmapInfo); + + if Header.HasPalette then PLTE := TChunkPLTE.Create(Self) else PLTE := nil; + if Transparent then TRNS := TChunkTRNS.Create(Self) else TRNS := nil; + IDAT := TChunkIDAT.Create(Self); + IEND := TChunkIEND.Create(Self); + + {Add chunks} + TPNGPointerList(Chunks).Add(Header); + if Header.HasPalette then TPNGPointerList(Chunks).Add(PLTE); + if Transparent then TPNGPointerList(Chunks).Add(TRNS); + TPNGPointerList(Chunks).Add(IDAT); + TPNGPointerList(Chunks).Add(IEND); + + {In case there is a image data, set the PLTE chunk fCount variable} + {to the actual number of palette colors which is 2^(Bits for each pixel)} + if Header.HasPalette then + begin + PLTE.fCount := 1 shl BitmapInfo.bmBitsPixel; + + {Create and set palette} + fillchar(palEntries, sizeof(palEntries), 0); + palEntries.palVersion := $300; + palEntries.palNumEntries := 1 shl BitmapInfo.bmBitsPixel; + for i := 0 to palEntries.palNumEntries - 1 do + begin + palEntries.palPalEntry[i].peRed := Header.BitmapInfo.bmiColors[i].rgbRed; + palEntries.palPalEntry[i].peGreen := Header.BitmapInfo.bmiColors[i].rgbGreen; + palEntries.palPalEntry[i].peBlue := Header.BitmapInfo.bmiColors[i].rgbBlue; + end; + DoSetPalette(CreatePalette(pLogPalette(@palEntries)^), false); + end; + + {In case it is a transparent bitmap, prepares it} + if Transparent then TRNS.TransparentColor := TransparentColor; +end; + +{Assigns from another PNG} +procedure TPngObject.AssignPNG(Source: TPNGObject); +var + J: Integer; +begin + {Copy properties} + InterlaceMethod := Source.InterlaceMethod; + MaxIdatSize := Source.MaxIdatSize; + CompressionLevel := Source.CompressionLevel; + Filters := Source.Filters; + + {Clear old chunks and prepare} + ClearChunks(); + Chunks.Count := Source.Chunks.Count; + {Create chunks and makes a copy from the source} + FOR J := 0 TO Chunks.Count - 1 DO + with Source.Chunks do + begin + Chunks.SetItem(J, TChunkClass(TChunk(Item[J]).ClassType).Create(Self)); + TChunk(Chunks.Item[J]).Assign(TChunk(Item[J])); + end {with}; +end; + +{Returns a alpha data scanline} +function TPngObject.GetAlphaScanline(const LineIndex: Integer): pByteArray; +begin + with Header do + if (ColorType = COLOR_RGBALPHA) or (ColorType = COLOR_GRAYSCALEALPHA) then + Longint(Result) := Longint(ImageAlpha) + (LineIndex * Longint(Width)) + else Result := nil; {In case the image does not use alpha information} +end; + +{$IFDEF Store16bits} +{Returns a png data extra scanline} +function TPngObject.GetExtraScanline(const LineIndex: Integer): Pointer; +begin + with Header do + Longint(Result) := (Longint(ExtraImageData) + ((Longint(Height) - 1) * + BytesPerRow)) - (LineIndex * BytesPerRow); +end; +{$ENDIF} + +{Returns a png data scanline} +function TPngObject.GetScanline(const LineIndex: Integer): Pointer; +begin + with Header do + Longint(Result) := (Longint(ImageData) + ((Longint(Height) - 1) * + BytesPerRow)) - (LineIndex * BytesPerRow); +end; + +{Initialize gamma table} +procedure TPngObject.InitializeGamma; +var + i: Integer; +begin + {Build gamma table as if there was no gamma} + FOR i := 0 to 255 do + begin + GammaTable[i] := i; + InverseGamma[i] := i; + end {for i} +end; + +{Returns the transparency mode used by this png} +function TPngObject.GetTransparencyMode: TPNGTransparencyMode; +var + TRNS: TChunkTRNS; +begin + with Header do + begin + Result := ptmNone; {Default result} + {Gets the TRNS chunk pointer} + TRNS := Chunks.ItemFromClass(TChunkTRNS) as TChunkTRNS; + + {Test depending on the color type} + case ColorType of + {This modes are always partial} + COLOR_RGBALPHA, COLOR_GRAYSCALEALPHA: Result := ptmPartial; + {This modes support bit transparency} + COLOR_RGB, COLOR_GRAYSCALE: if TRNS <> nil then Result := ptmBit; + {Supports booth translucid and bit} + COLOR_PALETTE: + {A TRNS chunk must be present, otherwise it won't support transparency} + if TRNS <> nil then + if TRNS.BitTransparency then + Result := ptmBit else Result := ptmPartial + end {case} + + end {with Header} +end; + +{Add a text chunk} +procedure TPngObject.AddtEXt(const Keyword, Text: String); +var + TextChunk: TChunkTEXT; +begin + TextChunk := Chunks.Add(TChunkText) as TChunkTEXT; + TextChunk.Keyword := Keyword; + TextChunk.Text := Text; +end; + +{Add a text chunk} +procedure TPngObject.AddzTXt(const Keyword, Text: String); +var + TextChunk: TChunkzTXt; +begin + TextChunk := Chunks.Add(TChunkzTXt) as TChunkzTXt; + TextChunk.Keyword := Keyword; + TextChunk.Text := Text; +end; + +{Removes the image transparency} +procedure TPngObject.RemoveTransparency; +var + TRNS: TChunkTRNS; +begin + {Removes depending on the color type} + with Header do + case ColorType of + {Palette uses the TChunktRNS to store alpha} + COLOR_PALETTE: + begin + TRNS := Chunks.ItemFromClass(TChunkTRNS) as TChunkTRNS; + if TRNS <> nil then Chunks.RemoveChunk(TRNS) + end; + {Png allocates different memory space to hold alpha information} + {for these types} + COLOR_GRAYSCALEALPHA, COLOR_RGBALPHA: + begin + {Transform into the appropriate color type} + if ColorType = COLOR_GRAYSCALEALPHA then + ColorType := COLOR_GRAYSCALE + else ColorType := COLOR_RGB; + {Free the pointer data} + if ImageAlpha <> nil then FreeMem(ImageAlpha); + ImageAlpha := nil + end + end +end; + +{Generates alpha information} +procedure TPngObject.CreateAlpha; +var + TRNS: TChunkTRNS; +begin + {Generates depending on the color type} + with Header do + case ColorType of + {Png allocates different memory space to hold alpha information} + {for these types} + COLOR_GRAYSCALE, COLOR_RGB: + begin + {Transform into the appropriate color type} + if ColorType = COLOR_GRAYSCALE then + ColorType := COLOR_GRAYSCALEALPHA + else ColorType := COLOR_RGBALPHA; + {Allocates memory to hold alpha information} + GetMem(ImageAlpha, Integer(Width) * Integer(Height)); + FillChar(ImageAlpha^, Integer(Width) * Integer(Height), #255); + end; + {Palette uses the TChunktRNS to store alpha} + COLOR_PALETTE: + begin + {Gets/creates TRNS chunk} + if Chunks.ItemFromClass(TChunkTRNS) = nil then + TRNS := Chunks.Add(TChunkTRNS) as TChunkTRNS + else + TRNS := Chunks.ItemFromClass(TChunkTRNS) as TChunkTRNS; + + {Prepares the TRNS chunk} + with TRNS do + begin + ResizeData(256); + Fillchar(PaletteValues[0], 256, 255); + fDataSize := 1 shl Header.BitDepth; + fBitTransparency := False + end {with Chunks.Add}; + end; + end {case Header.ColorType} + +end; + +{Returns transparent color} +function TPngObject.GetTransparentColor: TColor; +var + TRNS: TChunkTRNS; +begin + TRNS := Chunks.ItemFromClass(TChunkTRNS) as TChunkTRNS; + {Reads the transparency chunk to get this info} + if Assigned(TRNS) then Result := TRNS.TransparentColor + else Result := 0 +end; + +{$OPTIMIZATION OFF} +procedure TPngObject.SetTransparentColor(const Value: TColor); +var + TRNS: TChunkTRNS; +begin + if HeaderPresent then + {Tests the ColorType} + case Header.ColorType of + {Not allowed for this modes} + COLOR_RGBALPHA, COLOR_GRAYSCALEALPHA: Self.RaiseError( + EPNGCannotChangeTransparent, EPNGCannotChangeTransparentText); + {Allowed} + COLOR_PALETTE, COLOR_RGB, COLOR_GRAYSCALE: + begin + TRNS := Chunks.ItemFromClass(TChunkTRNS) as TChunkTRNS; + if not Assigned(TRNS) then TRNS := Chunks.Add(TChunkTRNS) as TChunkTRNS; + + {Sets the transparency value from TRNS chunk} + TRNS.TransparentColor := {$IFDEF UseDelphi}ColorToRGB({$ENDIF}Value + {$IFDEF UseDelphi}){$ENDIF} + end {COLOR_PALETTE, COLOR_RGB, COLOR_GRAYSCALE)} + end {case} +end; + +{Returns if header is present} +function TPngObject.HeaderPresent: Boolean; +begin + Result := ((Chunks.Count <> 0) and (Chunks.Item[0] is TChunkIHDR)) +end; + +{Returns pixel for png using palette and grayscale} +function GetByteArrayPixel(const png: TPngObject; const X, Y: Integer): TColor; +var + ByteData: Byte; + DataDepth: Byte; +begin + with png, Header do + begin + {Make sure the bitdepth is not greater than 8} + DataDepth := BitDepth; + if DataDepth > 8 then DataDepth := 8; + {Obtains the byte containing this pixel} + ByteData := pByteArray(png.Scanline[Y])^[X div (8 div DataDepth)]; + {Moves the bits we need to the right} + ByteData := (ByteData shr ((8 - DataDepth) - + (X mod (8 div DataDepth)) * DataDepth)); + {Discard the unwanted pixels} + ByteData:= ByteData and ($FF shr (8 - DataDepth)); + + {For palette mode map the palette entry and for grayscale convert and + returns the intensity} + case ColorType of + COLOR_PALETTE: + with TChunkPLTE(png.Chunks.ItemFromClass(TChunkPLTE)).Item[ByteData] do + Result := rgb(GammaTable[rgbRed], GammaTable[rgbGreen], + GammaTable[rgbBlue]); + COLOR_GRAYSCALE: + begin + if BitDepth = 1 + then ByteData := GammaTable[Byte(ByteData * 255)] + else ByteData := GammaTable[Byte(ByteData * ((1 shl DataDepth) + 1))]; + Result := rgb(ByteData, ByteData, ByteData); + end; + else Result := 0; + end {case}; + end {with} +end; + +{In case vcl units are not being used} +{$IFNDEF UseDelphi} +function ColorToRGB(const Color: TColor): COLORREF; +begin + Result := Color +end; +{$ENDIF} + +{Sets a pixel for grayscale and palette pngs} +procedure SetByteArrayPixel(const png: TPngObject; const X, Y: Integer; + const Value: TColor); +const + ClearFlag: Array[1..8] of Integer = (1, 3, 0, 15, 0, 0, 0, $FF); +var + ByteData: pByte; + DataDepth: Byte; + ValEntry: Byte; +begin + with png.Header do + begin + {Map into a palette entry} + ValEntry := GetNearestPaletteIndex(Png.Palette, ColorToRGB(Value)); + + {16 bits grayscale extra bits are discarted} + DataDepth := BitDepth; + if DataDepth > 8 then DataDepth := 8; + {Gets a pointer to the byte we intend to change} + ByteData := @pByteArray(png.Scanline[Y])^[X div (8 div DataDepth)]; + {Clears the old pixel data} + ByteData^ := ByteData^ and not (ClearFlag[DataDepth] shl ((8 - DataDepth) - + (X mod (8 div DataDepth)) * DataDepth)); + + {Setting the new pixel} + ByteData^ := ByteData^ or (ValEntry shl ((8 - DataDepth) - + (X mod (8 div DataDepth)) * DataDepth)); + end {with png.Header} +end; + +{Returns pixel when png uses RGB} +function GetRGBLinePixel(const png: TPngObject; + const X, Y: Integer): TColor; +begin + with pRGBLine(png.Scanline[Y])^[X] do + Result := RGB(rgbtRed, rgbtGreen, rgbtBlue) +end; + +{Sets pixel when png uses RGB} +procedure SetRGBLinePixel(const png: TPngObject; + const X, Y: Integer; Value: TColor); +begin + with pRGBLine(png.Scanline[Y])^[X] do + begin + rgbtRed := GetRValue(Value); + rgbtGreen := GetGValue(Value); + rgbtBlue := GetBValue(Value) + end +end; + +{Returns pixel when png uses grayscale} +function GetGrayLinePixel(const png: TPngObject; + const X, Y: Integer): TColor; +var + B: Byte; +begin + B := PByteArray(png.Scanline[Y])^[X]; + Result := RGB(B, B, B); +end; + +{Sets pixel when png uses grayscale} +procedure SetGrayLinePixel(const png: TPngObject; + const X, Y: Integer; Value: TColor); +begin + PByteArray(png.Scanline[Y])^[X] := GetRValue(Value); +end; + +{Resizes the PNG image} +procedure TPngObject.Resize(const CX, CY: Integer); + function Min(const A, B: Integer): Integer; + begin + if A < B then Result := A else Result := B; + end; +var + Header: TChunkIHDR; + Line, NewBytesPerRow: Integer; + NewHandle: HBitmap; + NewDC: HDC; + NewImageData: Pointer; + NewImageAlpha: Pointer; + NewImageExtra: Pointer; +begin + if (CX > 0) and (CY > 0) then + begin + {Gets some actual information} + Header := Self.Header; + + {Creates the new image} + NewDC := CreateCompatibleDC(Header.ImageDC); + Header.BitmapInfo.bmiHeader.biWidth := cx; + Header.BitmapInfo.bmiHeader.biHeight := cy; + NewHandle := CreateDIBSection(NewDC, pBitmapInfo(@Header.BitmapInfo)^, + DIB_RGB_COLORS, NewImageData, 0, 0); + SelectObject(NewDC, NewHandle); + {$IFDEF UseDelphi}Canvas.Handle := NewDC;{$ENDIF} + NewBytesPerRow := (((Header.BitmapInfo.bmiHeader.biBitCount * cx) + 31) + and not 31) div 8; + + {Copies the image data} + for Line := 0 to Min(CY - 1, Height - 1) do + CopyMemory(Ptr(Longint(NewImageData) + (Longint(CY) - 1) * + NewBytesPerRow - (Line * NewBytesPerRow)), Scanline[Line], + Min(NewBytesPerRow, Header.BytesPerRow)); + + {Build array for alpha information, if necessary} + if (Header.ColorType = COLOR_RGBALPHA) or + (Header.ColorType = COLOR_GRAYSCALEALPHA) then + begin + GetMem(NewImageAlpha, CX * CY); + Fillchar(NewImageAlpha^, CX * CY, 255); + for Line := 0 to Min(CY - 1, Height - 1) do + CopyMemory(Ptr(Longint(NewImageAlpha) + (Line * CX)), + AlphaScanline[Line], Min(CX, Width)); + FreeMem(Header.ImageAlpha); + Header.ImageAlpha := NewImageAlpha; + end; + + {$IFDEF Store16bits} + if (Header.BitDepth = 16) then + begin + GetMem(NewImageExtra, CX * CY); + Fillchar(NewImageExtra^, CX * CY, 0); + for Line := 0 to Min(CY - 1, Height - 1) do + CopyMemory(Ptr(Longint(NewImageExtra) + (Line * CX)), + ExtraScanline[Line], Min(CX, Width)); + FreeMem(Header.ExtraImageData); + Header.ExtraImageData := NewImageExtra; + end; + {$ENDIF} + + {Deletes the old image} + DeleteObject(Header.ImageHandle); + DeleteDC(Header.ImageDC); + + {Prepares the header to get the new image} + Header.BytesPerRow := NewBytesPerRow; + Header.IHDRData.Width := CX; + Header.IHDRData.Height := CY; + Header.ImageData := NewImageData; + + {Replaces with the new image} + Header.ImageHandle := NewHandle; + Header.ImageDC := NewDC; + end + else + {The new size provided is invalid} + RaiseError(EPNGInvalidNewSize, EInvalidNewSize) + +end; + +{Sets a pixel} +procedure TPngObject.SetPixels(const X, Y: Integer; const Value: TColor); +begin + if ((X >= 0) and (X <= Width - 1)) and + ((Y >= 0) and (Y <= Height - 1)) then + with Header do + begin + if ColorType in [COLOR_GRAYSCALE, COLOR_PALETTE] then + SetByteArrayPixel(Self, X, Y, Value) + else if ColorType in [COLOR_GRAYSCALEALPHA] then + SetGrayLinePixel(Self, X, Y, Value) + else + SetRGBLinePixel(Self, X, Y, Value) + end {with} +end; + + +{Returns a pixel} +function TPngObject.GetPixels(const X, Y: Integer): TColor; +begin + if ((X >= 0) and (X <= Width - 1)) and + ((Y >= 0) and (Y <= Height - 1)) then + with Header do + begin + if ColorType in [COLOR_GRAYSCALE, COLOR_PALETTE] then + Result := GetByteArrayPixel(Self, X, Y) + else if ColorType in [COLOR_GRAYSCALEALPHA] then + Result := GetGrayLinePixel(Self, X, Y) + else + Result := GetRGBLinePixel(Self, X, Y) + end {with} + else Result := 0 +end; + +{Returns the image palette} +function TPngObject.GetPalette: HPALETTE; +begin + Result := Header.ImagePalette; +end; + +{Assigns from another TChunk} +procedure TChunkpHYs.Assign(Source: TChunk); +begin + fPPUnitY := TChunkpHYs(Source).fPPUnitY; + fPPUnitX := TChunkpHYs(Source).fPPUnitX; + fUnit := TChunkpHYs(Source).fUnit; +end; + +{Loads the chunk from a stream} +function TChunkpHYs.LoadFromStream(Stream: TStream; const ChunkName: TChunkName; + Size: Integer): Boolean; +begin + {Let ancestor load the data} + Result := inherited LoadFromStream(Stream, ChunkName, Size); + if not Result or (Size <> 9) then exit; {Size must be 9} + + {Reads data} + fPPUnitX := ByteSwap(pCardinal(Longint(Data))^); + fPPUnitY := ByteSwap(pCardinal(Longint(Data) + 4)^); + fUnit := pUnitType(Longint(Data) + 8)^; +end; + +{Saves the chunk to a stream} +function TChunkpHYs.SaveToStream(Stream: TStream): Boolean; +begin + {Update data} + ResizeData(9); {Make sure the size is 9} + pCardinal(Data)^ := ByteSwap(fPPUnitX); + pCardinal(Longint(Data) + 4)^ := ByteSwap(fPPUnitY); + pUnitType(Longint(Data) + 8)^ := fUnit; + + {Let inherited save data} + Result := inherited SaveToStream(Stream); +end; + +procedure TPngObject.DoSetPalette(Value: HPALETTE; const UpdateColors: boolean); +begin + if (Header.HasPalette) then + begin + {Update the palette entries} + if UpdateColors then + Header.PaletteToDIB(Value); + + {Resize the new palette} + SelectPalette(Header.ImageDC, Value, False); + RealizePalette(Header.ImageDC); + + {Replaces} + DeleteObject(Header.ImagePalette); + Header.ImagePalette := Value; + end +end; + +{Set palette based on a windows palette handle} +procedure TPngObject.SetPalette(Value: HPALETTE); +begin + DoSetPalette(Value, true); +end; + +{Returns the library version} +function TPNGObject.GetLibraryVersion: String; +begin + Result := LibraryVersion +end; + +initialization + {Initialize} + ChunkClasses := nil; + {crc table has not being computed yet} + crc_table_computed := FALSE; + {Register the necessary chunks for png} + RegisterCommonChunks; + {Registers TPNGObject to use with TPicture} + {$IFDEF UseDelphi}{$IFDEF RegisterGraphic} + TPicture.RegisterFileFormat('PNG', 'Portable Network Graphics', TPNGObject); + {$ENDIF}{$ENDIF} +finalization + {$IFDEF UseDelphi}{$IFDEF RegisterGraphic} + TPicture.UnregisterGraphicClass(TPNGObject); + {$ENDIF}{$ENDIF} + {Free chunk classes} + FreeChunkClassList; +end. + + diff --git a/PNGImage/pnglang.dcu b/PNGImage/pnglang.dcu new file mode 100644 index 0000000..4c32e08 Binary files /dev/null and b/PNGImage/pnglang.dcu differ diff --git a/PNGImage/pnglang.hpp b/PNGImage/pnglang.hpp new file mode 100644 index 0000000..dda175a --- /dev/null +++ b/PNGImage/pnglang.hpp @@ -0,0 +1,80 @@ +// Borland C++ Builder +// Copyright (c) 1995, 2002 by Borland Software Corporation +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'pnglang.pas' rev: 6.00 + +#ifndef pnglangHPP +#define pnglangHPP + +#pragma delphiheader begin +#pragma option push -w- +#pragma option push -Vx +#include <SysInit.hpp> // Pascal unit +#include <System.hpp> // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Pnglang +{ +//-- type declarations ------------------------------------------------------- +//-- var, const, procedure --------------------------------------------------- +extern PACKAGE System::ResourceString _EPngInvalidCRCText; +#define Pnglang_EPngInvalidCRCText System::LoadResourceString(&Pnglang::_EPngInvalidCRCText) +extern PACKAGE System::ResourceString _EPNGInvalidIHDRText; +#define Pnglang_EPNGInvalidIHDRText System::LoadResourceString(&Pnglang::_EPNGInvalidIHDRText) +extern PACKAGE System::ResourceString _EPNGMissingMultipleIDATText; +#define Pnglang_EPNGMissingMultipleIDATText System::LoadResourceString(&Pnglang::_EPNGMissingMultipleIDATText) +extern PACKAGE System::ResourceString _EPNGZLIBErrorText; +#define Pnglang_EPNGZLIBErrorText System::LoadResourceString(&Pnglang::_EPNGZLIBErrorText) +extern PACKAGE System::ResourceString _EPNGInvalidPaletteText; +#define Pnglang_EPNGInvalidPaletteText System::LoadResourceString(&Pnglang::_EPNGInvalidPaletteText) +extern PACKAGE System::ResourceString _EPNGInvalidFileHeaderText; +#define Pnglang_EPNGInvalidFileHeaderText System::LoadResourceString(&Pnglang::_EPNGInvalidFileHeaderText) +extern PACKAGE System::ResourceString _EPNGIHDRNotFirstText; +#define Pnglang_EPNGIHDRNotFirstText System::LoadResourceString(&Pnglang::_EPNGIHDRNotFirstText) +extern PACKAGE System::ResourceString _EPNGNotExistsText; +#define Pnglang_EPNGNotExistsText System::LoadResourceString(&Pnglang::_EPNGNotExistsText) +extern PACKAGE System::ResourceString _EPNGSizeExceedsText; +#define Pnglang_EPNGSizeExceedsText System::LoadResourceString(&Pnglang::_EPNGSizeExceedsText) +extern PACKAGE System::ResourceString _EPNGUnknownPalEntryText; +#define Pnglang_EPNGUnknownPalEntryText System::LoadResourceString(&Pnglang::_EPNGUnknownPalEntryText) +extern PACKAGE System::ResourceString _EPNGMissingPaletteText; +#define Pnglang_EPNGMissingPaletteText System::LoadResourceString(&Pnglang::_EPNGMissingPaletteText) +extern PACKAGE System::ResourceString _EPNGUnknownCriticalChunkText; +#define Pnglang_EPNGUnknownCriticalChunkText System::LoadResourceString(&Pnglang::_EPNGUnknownCriticalChunkText) +extern PACKAGE System::ResourceString _EPNGUnknownCompressionText; +#define Pnglang_EPNGUnknownCompressionText System::LoadResourceString(&Pnglang::_EPNGUnknownCompressionText) +extern PACKAGE System::ResourceString _EPNGUnknownInterlaceText; +#define Pnglang_EPNGUnknownInterlaceText System::LoadResourceString(&Pnglang::_EPNGUnknownInterlaceText) +extern PACKAGE System::ResourceString _EPNGCannotAssignChunkText; +#define Pnglang_EPNGCannotAssignChunkText System::LoadResourceString(&Pnglang::_EPNGCannotAssignChunkText) +extern PACKAGE System::ResourceString _EPNGUnexpectedEndText; +#define Pnglang_EPNGUnexpectedEndText System::LoadResourceString(&Pnglang::_EPNGUnexpectedEndText) +extern PACKAGE System::ResourceString _EPNGNoImageDataText; +#define Pnglang_EPNGNoImageDataText System::LoadResourceString(&Pnglang::_EPNGNoImageDataText) +extern PACKAGE System::ResourceString _EPNGCannotAddChunkText; +#define Pnglang_EPNGCannotAddChunkText System::LoadResourceString(&Pnglang::_EPNGCannotAddChunkText) +extern PACKAGE System::ResourceString _EPNGCannotAddInvalidImageText; +#define Pnglang_EPNGCannotAddInvalidImageText System::LoadResourceString(&Pnglang::_EPNGCannotAddInvalidImageText) +extern PACKAGE System::ResourceString _EPNGCouldNotLoadResourceText; +#define Pnglang_EPNGCouldNotLoadResourceText System::LoadResourceString(&Pnglang::_EPNGCouldNotLoadResourceText) +extern PACKAGE System::ResourceString _EPNGOutMemoryText; +#define Pnglang_EPNGOutMemoryText System::LoadResourceString(&Pnglang::_EPNGOutMemoryText) +extern PACKAGE System::ResourceString _EPNGCannotChangeTransparentText; +#define Pnglang_EPNGCannotChangeTransparentText System::LoadResourceString(&Pnglang::_EPNGCannotChangeTransparentText) +extern PACKAGE System::ResourceString _EPNGHeaderNotPresentText; +#define Pnglang_EPNGHeaderNotPresentText System::LoadResourceString(&Pnglang::_EPNGHeaderNotPresentText) +extern PACKAGE System::ResourceString _EInvalidNewSize; +#define Pnglang_EInvalidNewSize System::LoadResourceString(&Pnglang::_EInvalidNewSize) +extern PACKAGE System::ResourceString _EInvalidSpec; +#define Pnglang_EInvalidSpec System::LoadResourceString(&Pnglang::_EInvalidSpec) + +} /* namespace Pnglang */ +using namespace Pnglang; +#pragma option pop // -w- +#pragma option pop // -Vx + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // pnglang diff --git a/PNGImage/pnglang.obj b/PNGImage/pnglang.obj new file mode 100644 index 0000000..3823453 Binary files /dev/null and b/PNGImage/pnglang.obj differ diff --git a/PNGImage/pnglang.pas b/PNGImage/pnglang.pas new file mode 100644 index 0000000..57965d0 --- /dev/null +++ b/PNGImage/pnglang.pas @@ -0,0 +1,355 @@ +{Portable Network Graphics Delphi Language Info (24 July 2002)} + +{Feel free to change the text bellow to adapt to your language} +{Also if you have a translation to other languages and want to} +{share it, send me: gubadaud@terra.com.br } +unit pnglang; + +interface + +{$DEFINE English} +{.$DEFINE Polish} +{.$DEFINE Portuguese} +{.$DEFINE German} +{.$DEFINE French} +{.$DEFINE Slovenian} + +{Language strings for english} +resourcestring + {$IFDEF Polish} + EPngInvalidCRCText = 'Ten obraz "Portable Network Graphics" jest nieprawidіowy ' + + 'poniewaї zawiera on nieprawidіowe czкњci danych (bі№d crc)'; + EPNGInvalidIHDRText = 'Obraz "Portable Network Graphics" nie moїe zostaж ' + + 'wgrany poniewaї jedna z czкњci danych (ihdr) moїe byж uszkodzona'; + EPNGMissingMultipleIDATText = 'Obraz "Portable Network Graphics" jest ' + + 'nieprawidіowy poniewaї brakuje w nim czкњci obrazu.'; + EPNGZLIBErrorText = 'Nie moїna zdekompresowaж obrazu poniewaї zawiera ' + + 'bікdnie zkompresowane dane.'#13#10 + ' Opis bікdu: '; + EPNGInvalidPaletteText = 'Obraz "Portable Network Graphics" zawiera ' + + 'niewіaњciw№ paletк.'; + EPNGInvalidFileHeaderText = 'Plik ktуry jest odczytywany jest nieprawidіowym '+ + 'obrazem "Portable Network Graphics" poniewaї zawiera nieprawidіowy nagіуwek.' + + ' Plik moїк byж uszkodzony, sprуbuj pobraж go ponownie.'; + EPNGIHDRNotFirstText = 'Obraz "Portable Network Graphics" nie jest ' + + 'obsіugiwany lub moїe byж niewіaњciwy.'#13#10 + '(stopka IHDR nie jest pierwsza)'; + EPNGNotExistsText = 'Plik png nie moїe zostaж wgrany poniewaї nie ' + + 'istnieje.'; + EPNGSizeExceedsText = 'Obraz "Portable Network Graphics" nie jest ' + + 'obsіugiwany poniewaї jego szerokoњж lub wysokoњж przekracza maksimum ' + + 'rozmiaru, ktуry wynosi 65535 pikseli dіugoњci.'; + EPNGUnknownPalEntryText = 'Nie znaleziono wpisуw palety.'; + EPNGMissingPaletteText = 'Obraz "Portable Network Graphics" nie moїe zostaж ' + + 'wgrany poniewaї uїywa tabeli kolorуw ktуrej brakuje.'; + EPNGUnknownCriticalChunkText = 'Obraz "Portable Network Graphics" ' + + 'zawiera nieznan№ krytyczn№ czкњж ktуra nie moїe zostaж odkodowana.'; + EPNGUnknownCompressionText = 'Obraz "Portable Network Graphics" jest ' + + 'skompresowany nieznanym schemat ktуry nie moїe zostaж odszyfrowany.'; + EPNGUnknownInterlaceText = 'Obraz "Portable Network Graphics" uїywa ' + + 'nie znany schamat przeplatania ktуry nie moїe zostaж odszyfrowany.'; + EPNGCannotAssignChunkText = 'Stopka mysi byж kompatybilna aby zostaіa wyznaczona.'; + EPNGUnexpectedEndText = 'Obraz "Portable Network Graphics" jest nieprawidіowy ' + + 'poniewaї dekoder znalazі niespodziewanie koniec pliku.'; + EPNGNoImageDataText = 'Obraz "Portable Network Graphics" nie zawiera' + + 'danych.'; + EPNGCannotAddChunkText = 'Program prуbuje dodaж krytyczn№ ' + + 'stopkк do aktualnego obrazu co jest niedozwolone.'; + EPNGCannotAddInvalidImageText = 'Nie moїna dodaж nowej stopki ' + + 'poniewaї aktualny obraz jest nieprawidіowy.'; + EPNGCouldNotLoadResourceText = 'Obraz png nie moїe zostaж zaіadowany z' + + 'zasobуw o podanym ID.'; + EPNGOutMemoryText = 'Niektуre operacje nie mog№ zostaж zrealizowane poniewaї ' + + 'systemowi brakuje zasobуw. Zamknij kilka okien i sprуbuj ponownie.'; + EPNGCannotChangeTransparentText = 'Ustawienie bitu przezroczystego koloru jest ' + + 'zabronione dla obrazуw png zawieraj№cych wartoњж alpha dla kaїdego piksela ' + + '(COLOR_RGBALPHA i COLOR_GRAYSCALEALPHA)'; + EPNGHeaderNotPresentText = 'Ta operacja jest niedozwolona poniewaї ' + + 'aktualny obraz zawiera niewіaњciwy nagіуwek.'; + EInvalidNewSize = 'The new size provided for image resizing is invalid.'; + EInvalidSpec = 'The "Portable Network Graphics" could not be created ' + + 'because invalid image type parameters have being provided.'; + {$ENDIF} + + {$IFDEF English} + EPngInvalidCRCText = 'This "Portable Network Graphics" image is not valid ' + + 'because it contains invalid pieces of data (crc error)'; + EPNGInvalidIHDRText = 'The "Portable Network Graphics" image could not be ' + + 'loaded because one of its main piece of data (ihdr) might be corrupted'; + EPNGMissingMultipleIDATText = 'This "Portable Network Graphics" image is ' + + 'invalid because it has missing image parts.'; + EPNGZLIBErrorText = 'Could not decompress the image because it contains ' + + 'invalid compressed data.'#13#10 + ' Description: '; + EPNGInvalidPaletteText = 'The "Portable Network Graphics" image contains ' + + 'an invalid palette.'; + EPNGInvalidFileHeaderText = 'The file being readed is not a valid '+ + '"Portable Network Graphics" image because it contains an invalid header.' + + ' This file may be corruped, try obtaining it again.'; + EPNGIHDRNotFirstText = 'This "Portable Network Graphics" image is not ' + + 'supported or it might be invalid.'#13#10 + '(IHDR chunk is not the first)'; + EPNGNotExistsText = 'The png file could not be loaded because it does not ' + + 'exists.'; + EPNGSizeExceedsText = 'This "Portable Network Graphics" image is not ' + + 'supported because either it''s width or height exceeds the maximum ' + + 'size, which is 65535 pixels length.'; + EPNGUnknownPalEntryText = 'There is no such palette entry.'; + EPNGMissingPaletteText = 'This "Portable Network Graphics" could not be ' + + 'loaded because it uses a color table which is missing.'; + EPNGUnknownCriticalChunkText = 'This "Portable Network Graphics" image ' + + 'contains an unknown critical part which could not be decoded.'; + EPNGUnknownCompressionText = 'This "Portable Network Graphics" image is ' + + 'encoded with an unknown compression scheme which could not be decoded.'; + EPNGUnknownInterlaceText = 'This "Portable Network Graphics" image uses ' + + 'an unknown interlace scheme which could not be decoded.'; + EPNGCannotAssignChunkText = 'The chunks must be compatible to be assigned.'; + EPNGUnexpectedEndText = 'This "Portable Network Graphics" image is invalid ' + + 'because the decoder found an unexpected end of the file.'; + EPNGNoImageDataText = 'This "Portable Network Graphics" image contains no ' + + 'data.'; + EPNGCannotAddChunkText = 'The program tried to add a existent critical ' + + 'chunk to the current image which is not allowed.'; + EPNGCannotAddInvalidImageText = 'It''s not allowed to add a new chunk ' + + 'because the current image is invalid.'; + EPNGCouldNotLoadResourceText = 'The png image could not be loaded from the ' + + 'resource ID.'; + EPNGOutMemoryText = 'Some operation could not be performed because the ' + + 'system is out of resources. Close some windows and try again.'; + EPNGCannotChangeTransparentText = 'Setting bit transparency color is not ' + + 'allowed for png images containing alpha value for each pixel ' + + '(COLOR_RGBALPHA and COLOR_GRAYSCALEALPHA)'; + EPNGHeaderNotPresentText = 'This operation is not valid because the ' + + 'current image contains no valid header.'; + EInvalidNewSize = 'The new size provided for image resizing is invalid.'; + EInvalidSpec = 'The "Portable Network Graphics" could not be created ' + + 'because invalid image type parameters have being provided.'; + {$ENDIF} + {$IFDEF Portuguese} + EPngInvalidCRCText = 'Essa imagem "Portable Network Graphics" nгo й vбlida ' + + 'porque contйm chunks invбlidos de dados (erro crc)'; + EPNGInvalidIHDRText = 'A imagem "Portable Network Graphics" nгo pode ser ' + + 'carregada porque um dos seus chunks importantes (ihdr) pode estar '+ + 'invбlido'; + EPNGMissingMultipleIDATText = 'Essa imagem "Portable Network Graphics" й ' + + 'invбlida porque tem chunks de dados faltando.'; + EPNGZLIBErrorText = 'Nгo foi possнvel descomprimir os dados da imagem ' + + 'porque ela contйm dados invбlidos.'#13#10 + ' Descriзгo: '; + EPNGInvalidPaletteText = 'A imagem "Portable Network Graphics" contйm ' + + 'uma paleta invбlida.'; + EPNGInvalidFileHeaderText = 'O arquivo sendo lido nгo й uma imagem '+ + '"Portable Network Graphics" vбlida porque contйm um cabeзalho invбlido.' + + ' O arquivo pode estar corrompida, tente obter ela novamente.'; + EPNGIHDRNotFirstText = 'Essa imagem "Portable Network Graphics" nгo й ' + + 'suportada ou pode ser invбlida.'#13#10 + '(O chunk IHDR nгo й o ' + + 'primeiro)'; + EPNGNotExistsText = 'A imagem png nгo pode ser carregada porque ela nгo ' + + 'existe.'; + EPNGSizeExceedsText = 'Essa imagem "Portable Network Graphics" nгo й ' + + 'suportada porque a largura ou a altura ultrapassam o tamanho mбximo, ' + + 'que й de 65535 pixels de diвmetro.'; + EPNGUnknownPalEntryText = 'Nгo existe essa entrada de paleta.'; + EPNGMissingPaletteText = 'Essa imagem "Portable Network Graphics" nгo pode ' + + 'ser carregada porque usa uma paleta que estб faltando.'; + EPNGUnknownCriticalChunkText = 'Essa imagem "Portable Network Graphics" ' + + 'contйm um chunk crнtico desconheзido que nгo pode ser decodificado.'; + EPNGUnknownCompressionText = 'Essa imagem "Portable Network Graphics" estб ' + + 'codificada com um esquema de compressгo desconheзido e nгo pode ser ' + + 'decodificada.'; + EPNGUnknownInterlaceText = 'Essa imagem "Portable Network Graphics" usa um ' + + 'um esquema de interlace que nгo pode ser decodificado.'; + EPNGCannotAssignChunkText = 'Os chunk devem ser compatнveis para serem ' + + 'copiados.'; + EPNGUnexpectedEndText = 'Essa imagem "Portable Network Graphics" й ' + + 'invбlida porque o decodificador encontrou um fim inesperado.'; + EPNGNoImageDataText = 'Essa imagem "Portable Network Graphics" nгo contйm ' + + 'dados.'; + EPNGCannotAddChunkText = 'O programa tentou adicionar um chunk crнtico ' + + 'jб existente para a imagem atual, oque nгo й permitido.'; + EPNGCannotAddInvalidImageText = 'Nгo й permitido adicionar um chunk novo ' + + 'porque a imagem atual й invбlida.'; + EPNGCouldNotLoadResourceText = 'A imagem png nгo pode ser carregada apartir' + + ' do resource.'; + EPNGOutMemoryText = 'Uma operaзгo nгo pode ser completada porque o sistema ' + + 'estб sem recursos. Fecha algumas janelas e tente novamente.'; + EPNGCannotChangeTransparentText = 'Definir transparкncia booleana nгo й ' + + 'permitido para imagens png contendo informaзгo alpha para cada pixel ' + + '(COLOR_RGBALPHA e COLOR_GRAYSCALEALPHA)'; + EPNGHeaderNotPresentText = 'Essa operaзгo nгo й vбlida porque a ' + + 'imagem atual nгo contйm um cabeзalho vбlido.'; + EInvalidNewSize = 'O novo tamanho fornecido para o redimensionamento de ' + + 'imagem й invбlido.'; + EInvalidSpec = 'A imagem "Portable Network Graphics" nгo pode ser criada ' + + 'porque parвmetros de tipo de imagem invбlidos foram usados.'; + {$ENDIF} + {Language strings for German} + {$IFDEF German} + EPngInvalidCRCText = 'Dieses "Portable Network Graphics" Bild ist ' + + 'ungьltig, weil Teile der Daten fehlerhaft sind (CRC-Fehler)'; + EPNGInvalidIHDRText = 'Dieses "Portable Network Graphics" Bild konnte ' + + 'nicht geladen werden, weil wahrscheinlich einer der Hauptdatenbreiche ' + + '(IHDR) beschдdigt ist'; + EPNGMissingMultipleIDATText = 'Dieses "Portable Network Graphics" Bild ' + + 'ist ungьltig, weil Grafikdaten fehlen.'; + EPNGZLIBErrorText = 'Die Grafik konnte nicht entpackt werden, weil Teile der ' + + 'komprimierten Daten fehlerhaft sind.'#13#10 + ' Beschreibung: '; + EPNGInvalidPaletteText = 'Das "Portable Network Graphics" Bild enthдlt ' + + 'eine ungьltige Palette.'; + EPNGInvalidFileHeaderText = 'Die Datei, die gelesen wird, ist kein ' + + 'gьltiges "Portable Network Graphics" Bild, da es keinen gьltigen ' + + 'Header enthдlt. Die Datei kцnnte beschдdigt sein, versuchen Sie, ' + + 'eine neue Kopie zu bekommen.'; + EPNGIHDRNotFirstText = 'Dieses "Portable Network Graphics" Bild wird ' + + 'nicht unterstьtzt oder ist ungьltig.'#13#10 + + '(Der IHDR-Abschnitt ist nicht der erste Abschnitt in der Datei).'; + EPNGNotExistsText = 'Die PNG Datei konnte nicht geladen werden, da sie ' + + 'nicht existiert.'; + EPNGSizeExceedsText = 'Dieses "Portable Network Graphics" Bild wird nicht ' + + 'unterstьtzt, weil entweder seine Breite oder seine Hцhe das Maximum von ' + + '65535 Pixeln ьberschreitet.'; + EPNGUnknownPalEntryText = 'Es gibt keinen solchen Palettenwert.'; + EPNGMissingPaletteText = 'Dieses "Portable Network Graphics" Bild konnte ' + + 'nicht geladen werden, weil die benцtigte Farbtabelle fehlt.'; + EPNGUnknownCriticalChunkText = 'Dieses "Portable Network Graphics" Bild ' + + 'enhдlt einen unbekannten aber notwendigen Teil, welcher nicht entschlьsselt ' + + 'werden kann.'; + EPNGUnknownCompressionText = 'Dieses "Portable Network Graphics" Bild ' + + 'wurde mit einem unbekannten Komprimierungsalgorithmus kodiert, welcher ' + + 'nicht entschlьsselt werden kann.'; + EPNGUnknownInterlaceText = 'Dieses "Portable Network Graphics" Bild ' + + 'benutzt ein unbekanntes Interlace-Schema, welches nicht entschlьsselt ' + + 'werden kann.'; + EPNGCannotAssignChunkText = 'Die Abschnitte mьssen kompatibel sein, damit ' + + 'sie zugewiesen werden kцnnen.'; + EPNGUnexpectedEndText = 'Dieses "Portable Network Graphics" Bild ist ' + + 'ungьltig: Der Dekoder ist unerwartete auf das Ende der Datei gestoЯen.'; + EPNGNoImageDataText = 'Dieses "Portable Network Graphics" Bild enthдlt ' + + 'keine Daten.'; + EPNGCannotAddChunkText = 'Das Programm versucht einen existierenden und ' + + 'notwendigen Abschnitt zum aktuellen Bild hinzuzufьgen. Dies ist nicht ' + + 'zulдssig.'; + EPNGCannotAddInvalidImageText = 'Es ist nicht zulдssig, einem ungьltigen ' + + 'Bild einen neuen Abschnitt hinzuzufьgen.'; + EPNGCouldNotLoadResourceText = 'Das PNG Bild konnte nicht aus den ' + + 'Resourcendaten geladen werden.'; + EPNGOutMemoryText = 'Es stehen nicht genьgend Resourcen im System zur ' + + 'Verfьgung, um die Operation auszufьhren. SchlieЯen Sie einige Fenster '+ + 'und versuchen Sie es erneut.'; + EPNGCannotChangeTransparentText = 'Das Setzen der Bit-' + + 'Transparent-Farbe ist fьr PNG-Images die Alpha-Werte fьr jedes ' + + 'Pixel enthalten (COLOR_RGBALPHA und COLOR_GRAYSCALEALPHA) nicht ' + + 'zulдssig'; + EPNGHeaderNotPresentText = 'Die Datei, die gelesen wird, ist kein ' + + 'gьltiges "Portable Network Graphics" Bild, da es keinen gьltigen ' + + 'Header enthдlt.'; + EInvalidNewSize = 'The new size provided for image resizing is invalid.'; + EInvalidSpec = 'The "Portable Network Graphics" could not be created ' + + 'because invalid image type parameters have being provided.'; + {$ENDIF} + {Language strings for French} + {$IFDEF French} + EPngInvalidCRCText = 'Cette image "Portable Network Graphics" n''est pas valide ' + + 'car elle contient des donnйes invalides (erreur crc)'; + EPNGInvalidIHDRText = 'Cette image "Portable Network Graphics" n''a pu кtre ' + + 'chargйe car l''une de ses principale donnйe (ihdr) doit кtre corrompue'; + EPNGMissingMultipleIDATText = 'Cette image "Portable Network Graphics" est ' + + 'invalide car elle contient des parties d''image manquantes.'; + EPNGZLIBErrorText = 'Impossible de dйcompresser l''image car elle contient ' + + 'des donnйes compressйes invalides.'#13#10 + ' Description: '; + EPNGInvalidPaletteText = 'L''image "Portable Network Graphics" contient ' + + 'une palette invalide.'; + EPNGInvalidFileHeaderText = 'Le fichier actuellement lu est une image '+ + '"Portable Network Graphics" invalide car elle contient un en-tкte invalide.' + + ' Ce fichier doit кtre corrompu, essayer de l''obtenir а nouveau.'; + EPNGIHDRNotFirstText = 'Cette image "Portable Network Graphics" n''est pas ' + + 'supportйe ou doit кtre invalide.'#13#10 + '(la partie IHDR n''est pas la premiиre)'; + EPNGNotExistsText = 'Le fichier png n''a pu кtre chargй car il n''йxiste pas.'; + EPNGSizeExceedsText = 'Cette image "Portable Network Graphics" n''est pas supportйe ' + + 'car sa longueur ou sa largeur excиde la taille maximale, qui est de 65535 pixels.'; + EPNGUnknownPalEntryText = 'Il n''y a aucune entrйe pour cette palette.'; + EPNGMissingPaletteText = 'Cette image "Portable Network Graphics" n''a pu кtre ' + + 'chargйe car elle utilise une table de couleur manquante.'; + EPNGUnknownCriticalChunkText = 'Cette image "Portable Network Graphics" ' + + 'contient une partie critique inconnue qui n'' pu кtre dйcodйe.'; + EPNGUnknownCompressionText = 'Cette image "Portable Network Graphics" est ' + + 'encodйe а l''aide d''un schйmas de compression inconnu qui ne peut кtre dйcodй.'; + EPNGUnknownInterlaceText = 'Cette image "Portable Network Graphics" utilise ' + + 'un schйmas d''entrelacement inconnu qui ne peut кtre dйcodй.'; + EPNGCannotAssignChunkText = 'Ce morceau doit кtre compatible pour кtre assignй.'; + EPNGUnexpectedEndText = 'Cette image "Portable Network Graphics" est invalide ' + + 'car le decodeur est arrivй а une fin de fichier non attendue.'; + EPNGNoImageDataText = 'Cette image "Portable Network Graphics" ne contient pas de ' + + 'donnйes.'; + EPNGCannotAddChunkText = 'Le programme a essayй d''ajouter un morceau critique existant ' + + 'а l''image actuelle, ce qui n''est pas autorisй.'; + EPNGCannotAddInvalidImageText = 'Il n''est pas permis d''ajouter un nouveau morceau ' + + 'car l''image actuelle est invalide.'; + EPNGCouldNotLoadResourceText = 'L''image png n''a pu кtre chargйe depuis ' + + 'l''ID ressource.'; + EPNGOutMemoryText = 'Certaines opйrations n''ont pu кtre effectuйe car le ' + + 'systиme n''a plus de ressources. Fermez quelques fenкtres et essayez а nouveau.'; + EPNGCannotChangeTransparentText = 'Dйfinir le bit de transparence n''est pas ' + + 'permis pour des images png qui contiennent une valeur alpha pour chaque pixel ' + + '(COLOR_RGBALPHA et COLOR_GRAYSCALEALPHA)'; + EPNGHeaderNotPresentText = 'Cette opйration n''est pas valide car l''image ' + + 'actuelle ne contient pas de header valide.'; + EPNGAlphaNotSupportedText = 'Le type de couleur de l''image "Portable Network Graphics" actuelle ' + + 'contient dйjа des informations alpha ou il ne peut кtre converti.'; + EInvalidNewSize = 'The new size provided for image resizing is invalid.'; + EInvalidSpec = 'The "Portable Network Graphics" could not be created ' + + 'because invalid image type parameters have being provided.'; + {$ENDIF} + {Language strings for slovenian} + {$IFDEF Slovenian} + EPngInvalidCRCText = 'Ta "Portable Network Graphics" slika je neveljavna, ' + + 'ker vsebuje neveljavne dele podatkov (CRC napaka).'; + EPNGInvalidIHDRText = 'Slike "Portable Network Graphics" ni bilo moћno ' + + 'naloћiti, ker je eden od glavnih delov podatkov (IHDR) verjetno pokvarjen.'; + EPNGMissingMultipleIDATText = 'Ta "Portable Network Graphics" slika je ' + + 'naveljavna, ker manjkajo deli slike.'; + EPNGZLIBErrorText = 'Ne morem raztegniti slike, ker vsebuje ' + + 'neveljavne stisnjene podatke.'#13#10 + ' Opis: '; + EPNGInvalidPaletteText = 'Slika "Portable Network Graphics" vsebuje ' + + 'neveljavno barvno paleto.'; + EPNGInvalidFileHeaderText = 'Datoteka za branje ni veljavna '+ + '"Portable Network Graphics" slika, ker vsebuje neveljavno glavo.' + + ' Datoteka je verjetno pokvarjena, poskusite jo ponovno naloћiti.'; + EPNGIHDRNotFirstText = 'Ta "Portable Network Graphics" slika ni ' + + 'podprta ali pa je neveljavna.'#13#10 + '(IHDR del datoteke ni prvi).'; + EPNGNotExistsText = 'Ne morem naloћiti png datoteke, ker ta ne ' + + 'obstaja.'; + EPNGSizeExceedsText = 'Ta "Portable Network Graphics" slika ni ' + + 'podprta, ker ali njena љirina ali viљina presega najvecjo moћno vrednost ' + + '65535 pik.'; + EPNGUnknownPalEntryText = 'Slika nima vneљene take barvne palete.'; + EPNGMissingPaletteText = 'Te "Portable Network Graphics" ne morem ' + + 'naloћiti, ker uporablja manjkajoco barvno paleto.'; + EPNGUnknownCriticalChunkText = 'Ta "Portable Network Graphics" slika ' + + 'vsebuje neznan kriticni del podatkov, ki ga ne morem prebrati.'; + EPNGUnknownCompressionText = 'Ta "Portable Network Graphics" slika je ' + + 'kodirana z neznano kompresijsko shemo, ki je ne morem prebrati.'; + EPNGUnknownInterlaceText = 'Ta "Portable Network Graphics" slika uporablja ' + + 'neznano shemo za preliv, ki je ne morem prebrati.'; + EPNGCannotAssignChunkText = Koљcki morajo biti med seboj kompatibilni za prireditev vrednosti.'; + EPNGUnexpectedEndText = 'Ta "Portable Network Graphics" slika je neveljavna, ' + + 'ker je bralnik priљel do nepricakovanega konca datoteke.'; + EPNGNoImageDataText = 'Ta "Portable Network Graphics" ne vsebuje nobenih ' + + 'podatkov.'; + EPNGCannotAddChunkText = 'Program je poskusil dodati obstojeci kriticni ' + + 'kos podatkov k trenutni sliki, kar ni dovoljeno.'; + EPNGCannotAddInvalidImageText = 'Ni dovoljeno dodati nov kos podatkov, ' + + 'ker trenutna slika ni veljavna.'; + EPNGCouldNotLoadResourceText = 'Ne morem naloћiti png slike iz ' + + 'skladiљca.'; + EPNGOutMemoryText = 'Ne morem izvesti operacije, ker je ' + + 'sistem ostal brez resorjev. Zaprite nekaj oken in poskusite znova.'; + EPNGCannotChangeTransparentText = 'Ni dovoljeno nastaviti prosojnosti posamezne barve ' + + 'za png slike, ki vsebujejo alfa prosojno vrednost za vsako piko ' + + '(COLOR_RGBALPHA and COLOR_GRAYSCALEALPHA)'; + EPNGHeaderNotPresentText = 'Ta operacija ni veljavna, ker ' + + 'izbrana slika ne vsebuje veljavne glave.'; + EInvalidNewSize = 'The new size provided for image resizing is invalid.'; + EInvalidSpec = 'The "Portable Network Graphics" could not be created ' + + 'because invalid image type parameters have being provided.'; + {$ENDIF} + + +implementation + +end. diff --git a/PNGImage/zlibpas.dcu b/PNGImage/zlibpas.dcu new file mode 100644 index 0000000..33538c9 Binary files /dev/null and b/PNGImage/zlibpas.dcu differ diff --git a/PNGImage/zlibpas.hpp b/PNGImage/zlibpas.hpp new file mode 100644 index 0000000..e673986 --- /dev/null +++ b/PNGImage/zlibpas.hpp @@ -0,0 +1,87 @@ +// Borland C++ Builder +// Copyright (c) 1995, 2002 by Borland Software Corporation +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'zlibpas.pas' rev: 6.00 + +#ifndef zlibpasHPP +#define zlibpasHPP + +#pragma delphiheader begin +#pragma option push -w- +#pragma option push -Vx +#include <SysInit.hpp> // Pascal unit +#include <System.hpp> // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Zlibpas +{ +//-- type declarations ------------------------------------------------------- +typedef void * __fastcall (*TAlloc)(void * AppData, int Items, int Size); + +typedef void __fastcall (*TFree)(void * AppData, void * Block); + +#pragma pack(push, 1) +struct TZStreamRec +{ + char *next_in; + int avail_in; + int total_in; + char *next_out; + int avail_out; + int total_out; + char *msg; + void *internal; + TAlloc zalloc; + TFree zfree; + void *AppData; + int data_type; + int adler; + int reserved; +} ; +#pragma pack(pop) + +//-- var, const, procedure --------------------------------------------------- +#define zlib_version "1.2.3" +static const Shortint Z_NO_FLUSH = 0x0; +static const Shortint Z_PARTIAL_FLUSH = 0x1; +static const Shortint Z_SYNC_FLUSH = 0x2; +static const Shortint Z_FULL_FLUSH = 0x3; +static const Shortint Z_FINISH = 0x4; +static const Shortint Z_OK = 0x0; +static const Shortint Z_STREAM_END = 0x1; +static const Shortint Z_NEED_DICT = 0x2; +static const Shortint Z_ERRNO = 0xffffffff; +static const Shortint Z_STREAM_ERROR = 0xfffffffe; +static const Shortint Z_DATA_ERROR = 0xfffffffd; +static const Shortint Z_MEM_ERROR = 0xfffffffc; +static const Shortint Z_BUF_ERROR = 0xfffffffb; +static const Shortint Z_VERSION_ERROR = 0xfffffffa; +static const Shortint Z_NO_COMPRESSION = 0x0; +static const Shortint Z_BEST_SPEED = 0x1; +static const Shortint Z_BEST_COMPRESSION = 0x9; +static const Shortint Z_DEFAULT_COMPRESSION = 0xffffffff; +static const Shortint Z_FILTERED = 0x1; +static const Shortint Z_HUFFMAN_ONLY = 0x2; +static const Shortint Z_DEFAULT_STRATEGY = 0x0; +static const Shortint Z_BINARY = 0x0; +static const Shortint Z_ASCII = 0x1; +static const Shortint Z_UNKNOWN = 0x2; +static const Shortint Z_DEFLATED = 0x8; +extern PACKAGE char *_z_errmsg[10]; +extern PACKAGE int __fastcall deflateInit_(TZStreamRec &strm, int level, char * version, int recsize); +extern PACKAGE int __fastcall deflate(TZStreamRec &strm, int flush); +extern PACKAGE int __fastcall deflateEnd(TZStreamRec &strm); +extern PACKAGE int __fastcall inflateInit_(TZStreamRec &strm, char * version, int recsize); +extern PACKAGE int __fastcall inflate(TZStreamRec &strm, int flush); +extern PACKAGE int __fastcall inflateEnd(TZStreamRec &strm); + +} /* namespace Zlibpas */ +using namespace Zlibpas; +#pragma option pop // -w- +#pragma option pop // -Vx + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // zlibpas diff --git a/PNGImage/zlibpas.obj b/PNGImage/zlibpas.obj new file mode 100644 index 0000000..2ad96f5 Binary files /dev/null and b/PNGImage/zlibpas.obj differ diff --git a/PNGImage/zlibpas.pas b/PNGImage/zlibpas.pas new file mode 100644 index 0000000..f62838f --- /dev/null +++ b/PNGImage/zlibpas.pas @@ -0,0 +1,156 @@ +{Portable Network Graphics Delphi ZLIB linking (16 May 2002) } + +{This unit links ZLIB to pngimage unit in order to implement } +{the library. It's now using the new ZLIB version, 1.1.4 } +{Note: The .obj files must be located in the subdirectory \obj} + +unit zlibpas; + +interface + +type + + TAlloc = function (AppData: Pointer; Items, Size: Integer): Pointer; + TFree = procedure (AppData, Block: Pointer); + + // Internal structure. Ignore. + TZStreamRec = packed record + next_in: PChar; // next input byte + avail_in: Integer; // number of bytes available at next_in + total_in: Integer; // total nb of input bytes read so far + + next_out: PChar; // next output byte should be put here + avail_out: Integer; // remaining free space at next_out + total_out: Integer; // total nb of bytes output so far + + msg: PChar; // last error message, NULL if no error + internal: Pointer; // not visible by applications + + zalloc: TAlloc; // used to allocate the internal state + zfree: TFree; // used to free the internal state + AppData: Pointer; // private data object passed to zalloc and zfree + + data_type: Integer; // best guess about the data type: ascii or binary + adler: Integer; // adler32 value of the uncompressed data + reserved: Integer; // reserved for future use + end; + +function inflateInit_(var strm: TZStreamRec; version: PChar; + recsize: Integer): Integer; forward; +function inflate(var strm: TZStreamRec; flush: Integer): Integer; forward; +function inflateEnd(var strm: TZStreamRec): Integer; forward; +function deflateInit_(var strm: TZStreamRec; level: Integer; version: PChar; + recsize: Integer): Integer; forward; +function deflate(var strm: TZStreamRec; flush: Integer): Integer; forward; +function deflateEnd(var strm: TZStreamRec): Integer; forward; + +const + zlib_version = '1.2.3'; + + +const + Z_NO_FLUSH = 0; + Z_PARTIAL_FLUSH = 1; + Z_SYNC_FLUSH = 2; + Z_FULL_FLUSH = 3; + Z_FINISH = 4; + + Z_OK = 0; + Z_STREAM_END = 1; + Z_NEED_DICT = 2; + Z_ERRNO = (-1); + Z_STREAM_ERROR = (-2); + Z_DATA_ERROR = (-3); + Z_MEM_ERROR = (-4); + Z_BUF_ERROR = (-5); + Z_VERSION_ERROR = (-6); + + Z_NO_COMPRESSION = 0; + Z_BEST_SPEED = 1; + Z_BEST_COMPRESSION = 9; + Z_DEFAULT_COMPRESSION = (-1); + + Z_FILTERED = 1; + Z_HUFFMAN_ONLY = 2; + Z_DEFAULT_STRATEGY = 0; + + Z_BINARY = 0; + Z_ASCII = 1; + Z_UNKNOWN = 2; + + Z_DEFLATED = 8; + + _z_errmsg: array[0..9] of PChar = ( + 'need dictionary', // Z_NEED_DICT (2) + 'stream end', // Z_STREAM_END (1) + '', // Z_OK (0) + 'file error', // Z_ERRNO (-1) + 'stream error', // Z_STREAM_ERROR (-2) + 'data error', // Z_DATA_ERROR (-3) + 'insufficient memory', // Z_MEM_ERROR (-4) + 'buffer error', // Z_BUF_ERROR (-5) + 'incompatible version', // Z_VERSION_ERROR (-6) + '' + ); + +implementation + +{$L obj\adler32.obj} +{$L obj\deflate.obj} +{$L obj\infback.obj} +{$L obj\inffast.obj} +{$L obj\inflate.obj} +{$L obj\inftrees.obj} +{$L obj\trees.obj} +{$L obj\compress.obj} +{$L obj\crc32.obj} + + + +function adler32(adler: LongInt; const buf: PChar; len: Integer): LongInt; external; + +procedure _memset(P: Pointer; B: Byte; count: Integer);cdecl; +begin + FillChar(P^, count, B); +end; + +procedure _memcpy(dest, source: Pointer; count: Integer);cdecl; +begin + Move(source^, dest^, count); +end; + + +// deflate compresses data +function deflateInit_(var strm: TZStreamRec; level: Integer; version: PChar; + recsize: Integer): Integer; external; +function deflate(var strm: TZStreamRec; flush: Integer): Integer; external; +function deflateEnd(var strm: TZStreamRec): Integer; external; + +// inflate decompresses data +function inflateInit_(var strm: TZStreamRec; version: PChar; + recsize: Integer): Integer; external; +function inflate(var strm: TZStreamRec; flush: Integer): Integer; external; +function inflateEnd(var strm: TZStreamRec): Integer; external; +function inflateReset(var strm: TZStreamRec): Integer; external; + + +function zcalloc(AppData: Pointer; Items, Size: Integer): Pointer; +begin + GetMem(Result, Items*Size); +end; + +procedure zcfree(AppData, Block: Pointer); +begin + FreeMem(Block); +end; + +end. + + + + + + + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..0764fb3 --- /dev/null +++ b/README.md @@ -0,0 +1,37 @@ +# Назначение + +Аналог программы EMTDC, PSCAD, MathLab, Micro-Cap. +Рассчывает электрических сетей РЅР° РѕСЃРЅРѕРІРµ дифференциальных уравнений. +РљРѕРґ позволяет учитывать нелинейности Рё магнитные цепи. +Рмеется удобная графическая среда для создания электрических цепей. Графическая система позволяет рассчитывать высоковольные цепей электроэнергетических энергосистем, РЅР° РѕСЃРЅРѕРІРµ библиотеки, которая РІ СЃРІРѕСЋ очередь позволяет расситывать любые электрические нелинейные магнитосвязанные электрические цепи. + +Подробная документацию читай РІ Docs/Документация.pdf + +Чтобы была возможность открывать сохраненные программой файлы двойным кликом мыши, выполнить: + 1. Открыть СЃ помощью + 2. Указать путь Рє программе PowerSystem.exe + +# Release Notes +0.1 Первая стабильная версия + +0.1.1 Первая стабильная версия, обладающая возможностью сохранения + +0.1.2 версия, РІ которую добавлен компонент "подсеть". Позволяет создавать сеть, включающую подсети любого СѓСЂРѕРІРЅСЏ вложенности РґСЂСѓРі РІ РґСЂСѓРіР°. + Эта версия РІСЃРµ еще может открывать файлы созданные версией 0.1.1 + +0.1.3 РќРµ читает файлы сохраненные версией 0.1.2. + Р’ версию добавлено: + + 1. внутри сетей имена элементов должны быть уникальными, каждый элемент имеет РёРјСЏ (напр: T1) Рё полное РёРјСЏ, которые указывает принадлежность + объекта подсетям (напр: РћР­РЎ_Центра.Нижегородские_сети.Рў1). РќРѕ разные объекты СЃ РјРѕРіСѓС‚ иметь одинаковое РёРјСЏ, если РѕРЅРё принадлежат разным сетям + 2. РІ списках осциллографа выводятся полное РёРјСЏ объекта + 3. выводы подсети РІ РѕРєРЅРµ (редактирования подсетей) выделены красным цветом + + Рсправлены баги: + + 1. РїСЂРё редактировании компонента подсеть Рё, если РІ редакторе нет РЅРё РѕРґРЅРѕРіРѕ объекта, нельзя было выйти РёР· редактора, чтобы удалить компонет + 2. исключена возможность воздания СЃРІСЏР·Рё вывода СЃ самим СЃРѕР±РѕР№ + 3. если программа находится РІ режиме рассета сети (бежит время), теперь РїСЂРё создании СЃРІСЏР·Рё рассчет прекращается + 4. ранее РїСЂРё завершении редактирования подсети Рё закрытии РѕРєРЅР° редактирования происходило удаление всех связей СЃ редактируемым компонентом, + теперь удаление связей РїСЂРѕРёСЃС…РѕРґРёС‚ лишь РІ случае, если изменились выводы компонента (чистка связей необходима, С‚.Рє. СЃРІСЏР·Рё РјРѕРіСѓС‚ ссылаться РЅР° + удаленные выводы) \ No newline at end of file diff --git a/Vector.cpp b/Vector.cpp new file mode 100644 index 0000000..1ec8d3c --- /dev/null +++ b/Vector.cpp @@ -0,0 +1,36 @@ +//--------------------------------------------------------------------------- +#pragma hdrstop +#include "Vector.h" +#pragma package(smart_init) +//--------------------------------------------------------------------------- +/* --- Конструктор --- */ +Vector::Vector(double &x, double &y){set(x,y);} +//--------------------------------------------------------------------------- +void Vector::set(double &x, double &y){ + this->x = x; + this->y = y; + this->mod = sqrt(x*x + y*y); + if(x!=0){ + this->arg = atan(y/x); + if(x<0) this->arg+=M_PI; + } + else + this->arg = 0; +} +//--------------------------------------------------------------------------- +void Vector::set_amp(double &A, double &arg){ + this->mod = A; + this->arg = arg; + this->x = A*cos(arg); + this->y = A*sin(arg); +} +//--------------------------------------------------------------------------- +void Vector::rotate(double &angle){ + arg +=angle; + x = mod*cos(arg); + y = mod*sin(arg); + arg = atan(y/x); + if(x<0) arg+=M_PI;// приводим угол +} + + diff --git a/Vector.h b/Vector.h new file mode 100644 index 0000000..d1a86b5 --- /dev/null +++ b/Vector.h @@ -0,0 +1,20 @@ +//--------------------------------------------------------------------------- + +#ifndef VectorH +#define VectorH +//--------------------------------------------------------------------------- +#include <math.h> +//--------------------------------------------------------------------------- +class Vector{ + public: + double x; + double y; + double mod; + double arg; + void set(double &x, double &y); + Vector(double &x, double &y); + void set_amp(double &A, double &arg); + void rotate(double &angle); +}; + +#endif diff --git a/Vector.obj b/Vector.obj new file mode 100644 index 0000000..d2b9dc8 Binary files /dev/null and b/Vector.obj differ diff --git a/bpr.bpr b/bpr.bpr new file mode 100644 index 0000000..014ef58 --- /dev/null +++ b/bpr.bpr @@ -0,0 +1,168 @@ +<?xml version='1.0' encoding='utf-8' ?> +<!-- C++Builder XML Project --> +<PROJECT> + <MACROS> + <VERSION value="BCB.06.00"/> + <PROJECT value="bpr.exe"/> + <OBJFILES value="bpr.obj dft.obj Matrix.obj model.obj Vector.obj PNGImage\pngimage.obj + Dynamic_Array.obj Components\Base\PBase.obj Forms\ObectsLibrary.obj + Forms\main.obj Forms\Scope.obj Components\PGridComponent.obj + Components\Forms\frmProp.obj Components\Forms\EditGrid.obj"/> + <RESFILES value="bpr.res"/> + <IDLFILES value=""/> + <IDLGENFILES value=""/> + <DEFFILE value=""/> + <RESDEPEN value="$(RESFILES) Forms\ObectsLibrary.dfm Forms\main.dfm Forms\Scope.dfm + Components\Forms\frmProp.dfm Components\Forms\EditGrid.dfm"/> + <LIBFILES value=""/> + <LIBRARIES value="bcb2kaxserver.lib indy.lib dbxcds.lib dclocx.lib soaprtl.lib bcbie.lib + nmfast.lib dbexpress.lib inetdbxpress.lib inetdbbde.lib bcbsmp.lib + dsnapcon.lib dsnapcrba.lib visualdbclx.lib teeqr.lib dss.lib tee.lib + teedb.lib teeui.lib qrpt.lib bdecds.lib cds.lib ibxpress.lib vcldbx.lib + bdertl.lib adortl.lib vcldb.lib rtl.lib vcl.lib"/> + <SPARELIBS value="vcl.lib rtl.lib vcldb.lib adortl.lib bdertl.lib vcldbx.lib ibxpress.lib + cds.lib bdecds.lib qrpt.lib teeui.lib teedb.lib tee.lib dss.lib teeqr.lib + visualdbclx.lib dsnapcrba.lib dsnapcon.lib bcbsmp.lib inetdbbde.lib + inetdbxpress.lib dbexpress.lib nmfast.lib bcbie.lib soaprtl.lib dclocx.lib + dbxcds.lib indy.lib bcb2kaxserver.lib"/> + <PACKAGES value="vcl.bpi rtl.bpi bcb2kaxserver.bpi bcbie.bpi inet.bpi inetdb.bpi dbrtl.bpi + dsnap.bpi bdertl.bpi vclx.bpi vcldb.bpi vcldbx.bpi adortl.bpi bcbsmp.bpi + bdecds.bpi cds.bpi visualclx.bpi visualdbclx.bpi dbexpress.bpi dbxcds.bpi + dss.bpi teeui.bpi teedb.bpi tee.bpi ibxpress.bpi indy.bpi dsnapcrba.bpi + dsnapcon.bpi vclie.bpi xmlrtl.bpi inetdbbde.bpi inetdbxpress.bpi + nmfast.bpi dclocx.bpi qrpt.bpi soaprtl.bpi teeqr.bpi webdsnap.bpi websnap.bpi"/> + <PATHCPP value=".;Components\Base;Forms;Forms;Forms;Components;Components\Forms;Components\Forms"/> + <PATHPAS value=".;PNGImage"/> + <PATHRC value=".;"/> + <PATHASM value=".;"/> + <DEBUGLIBPATH value="$(BCB)\lib\debug"/> + <RELEASELIBPATH value="$(BCB)\lib\release"/> + <LINKER value="ilink32"/> + <USERDEFINES value=""/> + <SYSDEFINES value="NO_STRICT"/> + <MAINSOURCE value="bpr.cpp"/> + <INCLUDEPATH value="Components\Forms;Components;Forms;Components\Base;PNGImage;$(BCB)\include;$(BCB)\include\vcl"/> + <LIBPATH value="Components\Forms;Components;Forms;Components\Base;PNGImage;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib"/> + <WARNINGS value="-w-par"/> + <OTHERFILES value=""/> + </MACROS> + <OPTIONS> + <IDLCFLAGS value="-IComponents\Forms -IComponents -IForms -IComponents\Base -IPNGImage + -I$(BCB)\include -I$(BCB)\include\vcl -src_suffix cpp -boa"/> + <CFLAG1 value="-O2 -H=$(BCB)\lib\vcl60.csm -Hc -Vx -Ve -X- -a8 -b- -k- -vi -c -tW -tWM"/> + <PFLAGS value="-$Y- -$L- -$D- -$A8 -v -JPHNE -M"/> + <RFLAGS value=""/> + <AFLAGS value="/mx /w2 /zn"/> + <LFLAGS value="-D"" -H:0x1000000 -Hc:0x1000000 -Sc:0x100000 -aa -Tpe -x -Gn"/> + <OTHERFILES value=""/> + </OPTIONS> + <LINKER> + <ALLOBJ value="c0w32.obj sysinit.obj $(OBJFILES)"/> + <ALLRES value="$(RESFILES)"/> + <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib"/> + <OTHERFILES value=""/> + </LINKER> + <FILELIST> + <FILE FILENAME="bpr.res" FORMNAME="" UNITNAME="bpr.res" CONTAINERID="ResTool" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="bpr.cpp" FORMNAME="" UNITNAME="bpr" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="dft.cpp" FORMNAME="" UNITNAME="dft" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="Matrix.cpp" FORMNAME="" UNITNAME="matrix" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="model.cpp" FORMNAME="" UNITNAME="model" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="bpr.todo" FORMNAME="" UNITNAME="bpr.todo" CONTAINERID="ToDo" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="Vector.cpp" FORMNAME="" UNITNAME="Vector" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="PNGImage\pngimage.pas" FORMNAME="" UNITNAME="pngimage" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="Dynamic_Array.cpp" FORMNAME="" UNITNAME="Dynamic_Array" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="Components\Base\PBase.cpp" FORMNAME="" UNITNAME="PBase" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="Forms\ObectsLibrary.cpp" FORMNAME="frmObjLib" UNITNAME="ObectsLibrary" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="Forms\main.cpp" FORMNAME="frmMain" UNITNAME="main" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="Forms\Scope.cpp" FORMNAME="frmScope" UNITNAME="Scope" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="Components\PGridComponent.cpp" FORMNAME="" UNITNAME="PGridComponent" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="Components\Forms\frmProp.cpp" FORMNAME="frmProperty" UNITNAME="frmProp" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="Components\Forms\EditGrid.cpp" FORMNAME="frmEditGrid" UNITNAME="EditGrid" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + </FILELIST> + <BUILDTOOLS> + </BUILDTOOLS> + + <IDEOPTIONS> +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=0 +MinorVer=1 +Release=3 +Build=11 +Debug=0 +PreRelease=1 +Special=0 +Private=0 +DLL=0 +Locale=1049 +CodePage=1251 + +[Version Info Keys] +CompanyName=Виталий Ананьев +FileDescription=Электрическая система +FileVersion=0.1.3.11 +InternalName=Power System +LegalCopyright=Ананьев Виталий (СЃ) 2012 +LegalTrademarks= +OriginalFilename= +ProductName=Power System +ProductVersion=0.1 (Violet) +Comments= + +[HistoryLists\hlIncludePath] +Count=5 +Item0=Components\Forms;Components;Forms;Components\Base;PNGImage;$(BCB)\include;$(BCB)\include\vcl +Item1=Components;Forms;Components\Base;PNGImage;$(BCB)\include;$(BCB)\include\vcl +Item2=Forms;Components\Base;PNGImage;$(BCB)\include;$(BCB)\include\vcl +Item3=PNGImage;C:\Documents and Settings\vananiev.MERANETWORKS\Desktop\PNGImage;$(BCB)\include;$(BCB)\include\vcl +Item4=$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=5 +Item0=Components\Forms;Components;Forms;Components\Base;PNGImage;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib +Item1=Components;Forms;Components\Base;PNGImage;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib +Item2=Forms;Components\Base;PNGImage;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib +Item3=PNGImage;C:\Documents and Settings\vananiev.MERANETWORKS\Desktop\PNGImage;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib +Item4=$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=1 +Item0=_DEBUG + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=1 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + </IDEOPTIONS> +</PROJECT> \ No newline at end of file diff --git a/bpr.cpp b/bpr.cpp new file mode 100644 index 0000000..7f02391 --- /dev/null +++ b/bpr.cpp @@ -0,0 +1,40 @@ +//--------------------------------------------------------------------------- + +#include <vcl.h> +#pragma hdrstop +//--------------------------------------------------------------------------- +USEFORM("Forms\ObectsLibrary.cpp", frmObjLib); +USEFORM("Forms\main.cpp", frmMain); +USEFORM("Forms\Scope.cpp", frmScope); +USEFORM("Components\Forms\frmProp.cpp", frmProperty); +USEFORM("Components\Forms\EditGrid.cpp", frmEditGrid); +//--------------------------------------------------------------------------- +WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) +{ + try + { + TfrmMain* frmMain; + Application->Initialize(); + Application->Title = "Power System"; + Application->CreateForm(__classid(TfrmMain), &frmMain); + Application->CreateForm(__classid(TfrmProperty), &frmProperty); + Application->Run(); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + catch (...) + { + try + { + throw Exception(""); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + } + return 0; +} +//--------------------------------------------------------------------------- diff --git a/bpr.exe b/bpr.exe new file mode 100644 index 0000000..adc69a5 Binary files /dev/null and b/bpr.exe differ diff --git a/bpr.obj b/bpr.obj new file mode 100644 index 0000000..f28d14b Binary files /dev/null and b/bpr.obj differ diff --git a/bpr.res b/bpr.res new file mode 100644 index 0000000..5769ad6 Binary files /dev/null and b/bpr.res differ diff --git a/bpr.tds b/bpr.tds new file mode 100644 index 0000000..7e748c6 Binary files /dev/null and b/bpr.tds differ diff --git a/bpr.todo b/bpr.todo new file mode 100644 index 0000000..9b2d693 --- /dev/null +++ b/bpr.todo @@ -0,0 +1,12 @@ +{TODO 5 -oВиталий -cФункционал : +Добавить функционал, позволяющий менять функцию рассчета +ЭДС для генератора.} +{TODO : +К дифференциальному сопротивлению отнести +взаимоиндуктивность и магнитную связь} + +{DONE : Учесть неповторимость пар узлов {A,U1} {B,U2}} +{DONE : На данном этапе ток измерятся не в конце и начале линии, а за первыми проводимостями} + + + \ No newline at end of file diff --git a/dft.cpp b/dft.cpp new file mode 100644 index 0000000..6dcdf22 --- /dev/null +++ b/dft.cpp @@ -0,0 +1,68 @@ +/* + Дискретное преобразование фурье +*/ +//--------------------------------------------------------------------------- +/*все заинклуденные хидеры до #pragma hdrstop будут прекомпилированы и закешены, +если где еще в C/CPP файлах компилятор встретит ту же последовательность +хидеров до #pragma hdrstop - то заюзается уже скомпиленый кеш.*/ +#pragma hdrstop +#include "dft.h" +#pragma package(smart_init) +//--------------------------------------------------------------------------- +DSP::DSP(double &T, unsigned int N){ + this->T = T; + this->N = N; + this->w = 2*M_PI/(N*T); + this->q = w*T; + this->sample = new double[this->N]; + this->M = 0; + this->oldest = 0; +} +//--------------------------------------------------------------------------- +DSP::~DSP(){ + delete [] this->sample; +} +//--------------------------------------------------------------------------- +Vector FFT::calc(double &new_samlpe){ + double x=0, y=0; + double q_m; //середина выборки в радианах + if(M < N){ + sample[M] = new_samlpe; + M++; //число элементов в очереди + oldest = 0; + q_m = (M-1)*q/2; + } + else{ + sample[oldest] = new_samlpe; + q_m = 0; + oldest = (++oldest)%N; + } + for(unsigned int n=0, i=oldest; n < M; n++, i=(++i)%N) + x += sample[i]*sin(q*n-q_m); + x = 2*x/N; + //коэфициент для фильтрации постоянной составляющей + double A_d = sin(q*M/2)/(M*sin(q/2)); + //поправочный коэффициент из-за подавления постоянной составляющей + double tmp = 1.0*M/N + sin(q*M)/sin(q)/N; + double C_gd = 1.0/(1.0 - 2.0/N/M*pow(sin(q*M/2.0),2)/pow(sin(q/2.0),2)/tmp ); + for(unsigned int n=0, i=oldest; n < M; n++, i=(++i)%N) + y += sample[i]*(cos(q*n-q_m)-A_d); //с учетом подавления постоянной состовляющей; + y = 2*y/N; + y = y * C_gd; + // Поправочные коэфициенты, т.к. M может быть меньше N + if( M<N && M>1 ){ + double C_h = N/(M - sin(2*M_PI*M/N)/sin(q)); + double C_g = N/(M + sin(2*M_PI*M/N)/sin(q)); + x = x * C_h; + y = y * C_g; + } + Vector ret(x,y); + // с учетом приведения угла + if(M<=N && x!=0) // <= т.к. это вверху было M++, т.е. это все еще неполнопериодный + {double a=-q_m+M*q; ret.rotate(a);} + return ret; +} + + + + diff --git a/dft.h b/dft.h new file mode 100644 index 0000000..f07567c --- /dev/null +++ b/dft.h @@ -0,0 +1,37 @@ +//--------------------------------------------------------------------------- + +#ifndef dftH +#define dftH +/* Источники: +1. Шнеерсон, Цифровая РЗ, Энергопромиздат, 2007 +*/ +//--------------------------------------------------------------------------- +#include "Vector.h" +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* ---- Базовый класс для цифрового преобразователя ---- */ +class DSP{ // Digital Signal Progessing + protected: + double T; //период дискретизации + double w; //частота основной гармоники (радианы) + double q; //изменение угла на одну выборку (радианы) q=w*T + double* sample; //выборки + unsigned int M; //запомнено выборок + unsigned int oldest; //самый старый элемент выборки + public: + unsigned int N; //число выборок + virtual Vector calc(double &sample) = 0; + DSP(double &T, unsigned N); + ~DSP(); +}; + +/* ---- Быстродействующий Фильтр Фурье ортогональных составляющих ---- + +(произвожится расчет характеристик сигнала до того как пройдет +период основной частоты, гл.3.6.4 [1])*/ +class FFT : public DSP { // Fast Fourier Transform + public: + Vector calc(double &new_samlpe); + FFT(double &T, unsigned N):DSP(T,N){}; +}; +#endif diff --git a/dft.obj b/dft.obj new file mode 100644 index 0000000..943818c Binary files /dev/null and b/dft.obj differ diff --git a/model.cpp b/model.cpp new file mode 100644 index 0000000..29de6b4 --- /dev/null +++ b/model.cpp @@ -0,0 +1,5121 @@ +//--------------------------------------------------------------------------- +#pragma hdrstop + +#include "model.h" +//--------------------------------------------------------------------------- +PObjectList ObjectList; // содержит список всех созданных объектов +//--------------------------------------------------------------------------- +PObjectList::~PObjectList(){ + // находим все объекты из списка, у которых нет владельца + vector<PElement*> toDel; + vector<PElement*>::iterator iter = Obj.begin(); + while( iter != Obj.end() ){ + if((*iter)->Owner == NULL) // удаляем объекты без владельца, остальные должны быть удалены владельцами + toDel.push_back(*iter); + iter++; + } + // удаляем все объекты из списка, у которых нет владельца + for(int i=0, n=toDel.size(); i<n; i++) + delete toDel[i]; + Obj.clear(); +} +//--------------------------------------------------------------------------- +void PObjectList::Add (PElement* obj){ + Obj.push_back(obj); +} +//--------------------------------------------------------------------------- +bool PObjectList::Delete (PElement* obj){ + vector<PElement*>::iterator iter = Obj.begin(); + while( iter != Obj.end() ) + { + if( *iter == obj){ + Obj.erase( iter ); + return true; + } + else + ++iter; + } + return false; +} +//--------------------------------------------------------------------------- +// имя может быть указано через с указанием сетей, в которые входит объект +// например ОЭС_Ценрта.Самарские_РЭС.Т1 +// имя объекта (сети или оборудования) в своей подсети должно быть уникально +PElement* PObjectList::Find (String Name){ + String obj, grid; // объект и объект который в него входит, например ОЭС.Сеть2.T2 + // зазделяем имя и полное имя сети + int point = 0; + for(int i=Name.Length(); i>0; i--) if(Name[i]=='.') {point=i;break;} + if(point!=0){ + grid = Name.SubString(1,point-1); + obj = Name.SubString(point+1, Name.Length()-point); + }else{ + grid = ""; + obj = Name; + } + // найдем этот объект + for(int i=0,n=Obj.size(); i<n; i++) + if( Obj[i]->Name == obj && Obj[i]->GridName() == grid) + return Obj[i]; + return NULL; + /*/ зазделяем имя до первой точки + int point=Name.Pos("."); + if(point!=0){ + grid = Name.SubString(1,point-1); + obj = Name.SubString(point+1, Name.Length()-point); + }else{ + grid = ""; + obj = Name; + } + // вернем объект + if(grid!=""){ + // ищем внутри указанной сети + // имя сети первого уровня должно быть уникально + PSubGrid *gr = dynamic_cast<PSubGrid*>( Find( grid ) ); + if ( gr ) return gr->obj_from_name( obj ); + else return NULL; + } + else + { + // указано имя без родителя + PElement *ret = NULL; + int cnt=0; + for(int i=0,n=Obj.size(); i<n; i++) + if( Obj[i]->Name == Name && Obj[i]->Grid == NULL){ // ищем в сети верхнего уровня + ret = Obj[i]; + cnt++; + } + if( cnt>1 ){ + err(0, "PObjectList: имется "+ IntToStr(cnt) +" объекта с именем: "+Name); + return NULL;} + else + return ret; + } */ +} +//--------------------------------------------------------------------------- +PPin* PObjectList::FindPin(String Name, unsigned pin){ + PElement* obj = Find(Name); + if(obj){ + for(int i=0, n=obj->Out.Count(); i<n; i++) + for(int j=0, m=obj->Out[i].Count; j<m; j++) + if(obj->Out[i][j].Node() == pin) + return &obj->Out[i][j]; + } + return NULL; +} +//--------------------------------------------------------------------------- +PElement::PElement():null(0),MIN(1e-3),MAX(1e8){ + M = NULL; + N = NULL; + R = NULL; + L = NULL; + C = NULL; + Lm = NULL; + D = NULL; + E = NULL; + J = NULL; + U_C = NULL; + U_L = NULL; + U_Lm = NULL; + U_D = NULL; + Z = NULL; + I = NULL; + f = NULL; + Owner = NULL; + Grid = NULL; + Grounded_Node = 0; // заземляемый узел + // сохраняем объект в список + ObjectList.Add( this ); + // опишем поля класса + Describe_Fields(); +} +//--------------------------------------------------------------------------- +PElement::PElement(unsigned NumBranches, unsigned NumNodes, unsigned NumCircuit):null(0),MIN(1e-3),MAX(1e8){ + v = NumBranches; + u = NumNodes; + k = NumCircuit; + E = new PType*[v]; + U_C= new PType*[v]; + U_L= new PType*[v]; + U_Lm= new PType*[v]; + D = new Throttle*[v]; for(unsigned i=0;i<v;i++) D[i] = NULL; // дроссели создаются по мере необходимости + U_D= new PType*[v]; + R = new PType*[v]; + L = new PType*[v]; + C = new PType*[v]; + Z = new PType*[v]; + I = new PType*[v]; + J = new PType*[u]; + f = new PType*[u]; + //Lm = new vector<PType>::iterator*[v]; for(unsigned i=0;i<v;i++)Lm[i] = new vector<PType>::iterator [v]; + Lm = new PType**[v]; for(unsigned i=0;i<v;i++)Lm[i] = new PType*[v]; + M = new Matrix<char>(u, v); + N = new Matrix<char>(k, v); + Owner = NULL; + Grid = NULL; + Grounded_Node = 0; // заземляемый узел + // сохраняем объект в список + ObjectList.Add( this ); + // опишем поля класса + Describe_Fields(); +} +//--------------------------------------------------------------------------- +PElement::PElement(PElement *obj):null(0),MIN(1e-3),MAX(1e8){ + if(obj->M->Cols != obj->N->Cols){err(0,"Создание объекта Element число строк матриц инцеденций не равны между собой");} + v = obj->M->Cols; + u = obj->M->Rows; + k = obj->N->Rows; + _Lm = obj->_Lm; + E = new PType*[v]; + U_C= new PType*[v]; + U_L= new PType*[v]; + U_Lm= new PType*[v]; + D = new Throttle*[v]; for(unsigned i=0;i<v;i++) D[i] = obj->D[i]; // копируем указатели на дроссели + U_D= new PType*[v]; + R = new PType*[v]; + L = new PType*[v]; + C = new PType*[v]; + Z = new PType*[v]; + I = new PType*[v]; + J = new PType*[u]; + f = new PType*[u]; + //Lm = new vector<PType>::iterator*[v]; for(unsigned i=0;i<v;i++)Lm[i] = new vector<PType>::iterator [v]; + Lm = new PType**[v]; for(unsigned i=0;i<v;i++)Lm[i] = new PType*[v]; + M = new Matrix<char>(*obj->M); + N = new Matrix<char>(*obj->N); + Owner = NULL; + Grid = NULL; + Grounded_Node = obj->Grounded_Node; // заземляемый узел + // сохраняем объект в список + ObjectList.Add( this ); + // опишем поля класса + Describe_Fields(); +} +//--------------------------------------------------------------------------- +void PElement::Describe_Fields(){ + // Сохраняем информацию о свойствах класса + PFieldInfo fi; + fi.Name = "Имя"; + fi.Type = "String"; + fi.ptr = (void*) &Name; + Fields.push_back(fi); +} +//--------------------------------------------------------------------------- +PElement::~PElement(){ + delete M; + delete N; + delete [] R; + delete [] L; + delete [] C; + if(Lm!=NULL) + for(unsigned j=0;j<v;j++) + delete [] Lm[j]; + delete [] Lm; + delete [] D; + delete [] E; + delete [] J; + delete [] U_C; + delete [] U_L; + delete [] U_Lm; + delete [] U_D; + delete [] Z; + delete [] I; + delete [] f; + // удаляем объект из списока + ObjectList.Delete( this ); +} +//--------------------------------------------------------------------------- +unsigned __fastcall PElement::Branches(){ return v; } +unsigned __fastcall PElement::Nodes(){ return u; } +unsigned __fastcall PElement::Circuit(){ return k; } +//--------------------------------------------------------------------------- +void PElement::mutual_inductance(unsigned branch_1, unsigned branch_2, const PType &value){ + if(value==0) return; + // взаимоиндуктивность не может быть больше корня произведения индуктивностей + if((fabs(value) - sqrt((*L[branch_1])*(*L[branch_2])))>1e-300){ + err(0, "mutual_inductance: установленная взаимоиндуктивность больше корня произведения индуктивностей. Физически это не возможно"); + } + PType *p = &_Lm.push_back(value); + //Lm[ branch_1 ][ branch_2 ] = _Lm.end()-1; + //Lm[ branch_2 ][ branch_1 ] = _Lm.end()-1; + Lm[ branch_1 ][ branch_2 ] = p; + Lm[ branch_2 ][ branch_1 ] = p; +} +//--------------------------------------------------------------------------- +void PElement::magnetic_link(unsigned Electric_Branch, unsigned Magnetic_Branch, unsigned Windings){ + // создаем новый дроссель + D[ Electric_Branch ] = new Throttle; + D[ Electric_Branch ]->EBranch = Electric_Branch; + D[ Electric_Branch ]->MBranch = Magnetic_Branch; + D[ Electric_Branch ]->Windings = Windings; + D[ Electric_Branch ]->Obj = this; +} +//--------------------------------------------------------------------------- +PPin PElement::set_pin(unsigned Node){ + PPin pin; + pin.obj = this; + pin.node = Node; + //pin.branch = -1; + return pin; +} +//--------------------------------------------------------------------------- +/* Пересчет дифференциального сопротивления для метода примоугольников при нахождении интеграла / +void PElement::update_differential_resistance_rect(){ + for(unsigned i=0; i<v; i++) + if(*C[i]) + *Z[i] = *R[i] + *L[i]/smp + smp/(*C[i]); + else + *Z[i] = *R[i] + *L[i]/smp; +} */ +//--------------------------------------------------------------------------- +/* Пересчет дифференциального сопротивления для метода трапеций*/ +void PElement::update_differential_resistance(){ + for(unsigned i=0; i<v; i++) + if(*C[i]) + *Z[i] = *R[i] + *L[i]/smp + smp/(*C[i])/2; + else + *Z[i] = *R[i] + *L[i]/smp; +} +//--------------------------------------------------------------------------- +/* Рассчет параметров схемы по измененным начальным данным */ +bool PElement::accept(){ + update_differential_resistance(); + return true; +}; +//--------------------------------------------------------------------------- +void PElement::Save(ostream &stream){ // сохранение параметров объекта в поток + // имя + stream << StringForSave( &Name ) << " "; + // сеть, в которую входим + String grName = GridName(); if( grName == "" ) grName = "N"; + stream << StringForSave( &grName ) << " "; +} +//--------------------------------------------------------------------------- +void PElement::Read(istream &stream){ // загрузка параметров объекта из потока + char name[1024]; + // имя + stream >> name; Name = name; + // сеть, в которую входим + stream >> name; String grName = name; + if(grName == "N") Grid = NULL; + else Grid = ObjectList.Find( grName ); +} +//--------------------------------------------------------------------------- +String PElement::ClassName(){ return "PElement";} +//--------------------------------------------------------------------------- +// полное имя сети, в которую входит объект +String PElement::GridName(){ + if( Grid == NULL ) return ""; + else return Grid->FullName(); +} +//--------------------------------------------------------------------------- +// имя объекта с учетом всех подсетей, в которые он входит +String PElement::FullName(){ + if( Grid == NULL ) return Name; + else return Grid->FullName() + "." + Name; +} +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- + + + + + + + + +unsigned __fastcall PPin::Node(){ return node;} +//unsigned __fastcall PPin::GetBranch(){ return branch;} +PElement* __fastcall PPin::Obj(){ return obj; } +PType __fastcall PPin::f(){ return *obj->f[node]; } +PType __fastcall PPin::I(){ + // вычислим ток всех ветвей, подходящих к узлу + PType I=0; + unsigned n=obj->Branches(); + for(unsigned j=0; j<n;j++){ + I += (*obj->M)[node][j] * (*obj->I[j]); + } + return I; +} +//--------------------------------------------------------------------------- +void PPin::Save(ostream &stream){ // сохранить информацию о выводе + stream << StringForSave(&obj->FullName()) << " "; + stream << node << " "; +} +//--------------------------------------------------------------------------- +void PPin::Read(istream &stream){ // прочитать информацию о выводе + char n[1024]; + stream >> n; + obj = ObjectList.Find( (String)n ); + if( !obj ){ + err(0, "PPin: чтение из потока. Имя объекта ("+ (String)n +") не найдено в списке объектов"); + } + stream >> node; +} +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- + + + + + + +//--------------------------------------------------------------------------- +/* Группа выводов */ +Pins::Pins(unsigned Number): + Count(Number){ + _Pin = new PPin[Count]; +} +//--------------------------------------------------------------------------- +Pins::Pins(Pins& obj): + Count(obj.Count){ + _Pin = new PPin[Count]; + Name = obj.Name; + for(unsigned i=0; i<Count; i++) + _Pin[i] = obj[i]; +} +//--------------------------------------------------------------------------- +PPin& Pins::operator[](unsigned int i){ + if(i<Count) + return _Pin[i]; + else{ + err(0,"Pins: Доступ к несуществующему элементу. Вернули 0 элемент"); + return _Pin[0]; + } +} +//--------------------------------------------------------------------------- +Pins::~Pins(){ + delete [] _Pin; +} +//--------------------------------------------------------------------------- +Pins Pins::operator=(Pins &op2){ + if(Count != op2.Count){ + err(0, "Pins::operator=: ошибка при присваивании. Число выводов в Выходных модулях не равны"); + return *this; + } + Name = op2.Name; + for(unsigned i=0; i<Count; i++) + _Pin[i] = op2[i]; + return *this; +} +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- + + + + + + +void Pins_Link::add(PPin &First, PPin &Second){ + Pair_Pin pair; + pair.First = &First; + pair.Second = &Second; + Link.push_back(pair); +} +//--------------------------------------------------------------------------- +void Pins_Link::add(Pins& First, Pins& Second){ + Pair_Pin pair; + if(First.Count != Second.Count) {err(0, "Pins_Link::add: число выводов в группах выводов не одинаково. Не все выводы одного устройста соединены со вторым");} + for(unsigned i=0, n=First.Count; i<n; i++){ + pair.First = &First[i]; + pair.Second = &Second[i]; + Link.push_back(pair); + } +} +//--------------------------------------------------------------------------- +// добавить связи из объекта obj в этот объект +void Pins_Link::add(Pins_Link obj){ + for(unsigned i=0, n=obj.Link.size(); i<n; i++) + Link.push_back(obj.Link[i]); +} +//--------------------------------------------------------------------------- +unsigned __fastcall Pins_Link::Number(){ return Link.size(); } +//--------------------------------------------------------------------------- +Pair_Pin& Pins_Link::operator[](const unsigned int i){ return Link[i]; } +//--------------------------------------------------------------------------- +void Pins_Link::clear(){ Link.clear(); }; +/*/--------------------------------------------------------------------------- +Pins_Link Pins_Link::operator=(const Pins_Link &Obj){ + Link.clear(); + Link = Obj.Link; + return *this; +} */ +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- + + + + + + + + +//--------------------------------------------------------------------------- +void Pins_List::add(Pins* X){ _Pins.push_back(X); } /* Сохранили группу выводов */ +Pins& Pins_List::operator[](unsigned int i){ // Вернули группу выводов + if(i<_Pins.size()) return *_Pins[i]; + else{ + err(0, "Pins_List::operator[]: обратились к несуществующей группе выводов."); + return *_Pins[0]; + } +} +unsigned Pins_List::Count(){ return _Pins.size();} // число групп выводов +//--------------------------------------------------------------------------- +void Pins_List::Clear(){_Pins.clear();} +//--------------------------------------------------------------------------- +void Pins_List::Delete(Pins* pins){ + for(int i=0, n=_Pins.size(); i<n; i++) + if( _Pins[i] == pins ){ + _Pins.erase(_Pins.begin() + i); + break; + } +} +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- + + + + + + + + +PUnit::PUnit(unsigned NumBranches, unsigned NumNodes, unsigned NumCircuit):PElement(NumBranches, NumNodes, NumCircuit){ + _E = new PType[v]; + _U_C= new PType[v]; + _U_L= new PType[v]; + _U_Lm= new PType[v]; + _U_D= new PType[v]; + _R = new PType[v]; + _L = new PType[v]; + _C = new PType[v]; + _Z = new PType[v]; + _I = new PType[v]; + _J = new PType[u]; + _f = new PType[u]; + for(unsigned i=0;i<v;i++){ + _E[i]=0; + _U_C[i]=0; + _U_L[i]=0; + _U_Lm[i]=0; + _U_D[i]=0; + _R[i]=MIN; // чтобы не было короткозамкнутых ветвей, при которых весь объект превращается в точку + _L[i]=0; + _C[i]=0; + _Z[i]=0; + _I[i]=0; + } + for(unsigned i=0;i<u;i++){ + _J[i]=0; + _f[i]=0; + } + // указатели указывают на эти значения + _Lm.push_back(0); const PType *first = _Lm.begin(); + for(unsigned i=0;i<v;i++){ + E[i]=&_E[i]; + U_C[i]=&_U_C[i]; + U_L[i]=&_U_L[i]; + U_Lm[i]=&_U_Lm[i]; + U_D[i]=&_U_D[i]; + R[i]=&_R[i]; + L[i]=&_L[i]; + C[i]=&_C[i]; + Z[i]=&_Z[i]; + I[i]=&_I[i]; + for(unsigned j=0;j<v;j++) Lm[i][j] = (PType*)first; + } + for(unsigned i=0;i<u;i++){ + J[i]=&_J[i]; + f[i]=&_f[i]; + } + // опишем поля класса + Describe_Fields(); +} +//--------------------------------------------------------------------------- +void PUnit::Describe_Fields(){ +} +//--------------------------------------------------------------------------- +PUnit::PUnit(PUnit *obj):PElement(obj){ + _E = new PType[v]; + _U_C= new PType[v]; + _U_L= new PType[v]; + _U_Lm= new PType[v]; + _U_D= new PType[v]; + _R = new PType[v]; + _L = new PType[v]; + _C = new PType[v]; + _Z = new PType[v]; + _I = new PType[v]; + _J = new PType[u]; + _f = new PType[u]; + for(unsigned i=0;i<v;i++){ + _E[i]=obj->_E[i]; + _U_C[i]=obj->_U_C[i]; + _U_L[i]=obj->_U_L[i]; + _U_Lm[i]=obj-> _U_Lm[i]; + _U_D[i]=obj-> _U_D[i]; + _R[i]=obj->_R[i]; + _L[i]=obj->_L[i]; + _C[i]=obj->_C[i]; + _Z[i]=obj->_Z[i]; + _I[i]=obj->_I[i]; + } + for(unsigned i=0;i<u;i++){ + _J[i]=obj->_J[i]; + _f[i]=obj->_I[i]; + } + // указатели указывают на эти значения + _Lm.push_back(0); + for(unsigned i=0;i<v;i++){ + E[i]=&_E[i]; + U_C[i]=&_U_C[i]; + U_L[i]=&_U_L[i]; + U_Lm[i]=&_U_Lm[i]; + U_D[i]=&_U_D[i]; + R[i]=&_R[i]; + L[i]=&_L[i]; + C[i]=&_C[i]; + Z[i]=&_Z[i]; + I[i]=&_I[i]; + //for(unsigned j=0;j<v;j++) Lm[i][j] = _Lm.begin() + distance(obj->_Lm.begin(), obj->Lm[i][j]); + for(unsigned j=0;j<v;j++) Lm[i][j] = &_Lm[ obj->_Lm.index( obj->Lm[i][j] ) ]; + } + for(unsigned i=0;i<u;i++){ + J[i]=&_J[i]; + f[i]=&_f[i]; + } + Fields = obj->Fields; // теже свойства полей +} +//--------------------------------------------------------------------------- +PUnit::~PUnit(){ + delete [] _R; + delete [] _L; + delete [] _C; + delete [] _E; + delete [] _J; + delete [] _U_C; + delete [] _U_L; + delete [] _U_Lm; + delete [] _U_D; + delete [] _Z; + delete [] _I; + delete [] _f; +} +//--------------------------------------------------------------------------- +String PUnit::ClassName(){return "PUnit";} +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- + + + + + + + + + + + + + + + + +PLine::PLine(unsigned Num_Of_Cells): + PUnit(15*Num_Of_Cells+12, 1+3*Num_Of_Cells+3, 12*Num_Of_Cells+9), + X1(4), // выводы первой группы + X2(4){ // выводы второй группы + z=Num_Of_Cells; // число звеньев + set_pins(); // обозначение выводов от устройства + Describe_Fields(); // Сохраняем информацию о свойствах класса + /*/ заполняем матрицы + u= 1 + 3*z + 3; + v=15*z + 12; + k=4*z + 2; // число узлов, ветвей, незав. контуров*/ + char _M[4][15] = {{ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0}, + {-1, 0, 1,-1, 0, 1,-1, 0, 0,-1, 0, 0,-1, 0, 0}, + { 1,-1, 0, 1,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1, 0}, + { 0, 1,-1, 0, 1,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1}}; + for(unsigned k=0;k<z;k++){ + for(unsigned j=0;j<15;j++) + (*M)[0][15*k+j] = _M[0][j]; + for(unsigned i=1;i<4;i++) + for(unsigned j=0;j<15;j++) + (*M)[3*k+i][15*k+j] = _M[i][j]; + (*M)[3*k+4][15*k+12]=1; + (*M)[3*k+5][15*k+13]=1; + (*M)[3*k+6][15*k+14]=1; + } + for(unsigned i=1;i<4;i++) + for(unsigned j=0;j<12;j++) + (*M)[u-4+i][v-12+j] = _M[i][j]; + (*M)[0][v-6]=1; + (*M)[0][v-5]=1; + (*M)[0][v-4]=1; + (*M)[0][v-3]=1; + (*M)[0][v-2]=1; + (*M)[0][v-1]=1; + char _N[12][15] = {{ 1, 0, 0, 0, 0, 0,-1, 1, 0, 0, 0, 0, 0, 0, 0}, + { 0, 1, 0, 0, 0, 0, 0,-1, 1, 0, 0, 0, 0, 0, 0}, + { 0, 0,-1, 0, 0, 0,-1, 0, 1, 0, 0, 0, 0, 0, 0}, + { 1, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 1, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 1, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, 1, 0, 0,-1, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,-1, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,-1, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 1, 0, 0}, + { 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 1, 0}, + { 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 1}}; + for(unsigned n=0;n<z;n++){ + for(unsigned i=0;i<12;i++) + for(unsigned j=0;j<15;j++) + (*N)[12*n+i][15*n+j] = _N[i][j]; + (*N)[12*n+9][15*(n+1)+6]=1; + (*N)[12*n+10][15*(n+1)+7]=1; + (*N)[12*n+11][15*(n+1)+8]=1; + } + for(unsigned i=0;i<9;i++) + for(unsigned j=0;j<12;j++) + (*N)[k-9+i][v-12+j] = _N[i][j]; + Name = "ЛЭП"; // имя объекта + Grounded_Node = 0; // заземляемый узел + // исходные параметры линии + for(int i=_N_;i<=_C_;i++){ + R0[i] = MIN; + C0[i] = 0; + L0[i] = 0 ; + Cz0[i] = 0 ; + Gz0[i] = 1/MAX; + } + for(int i=_AB_;i<=_CA_;i++){ + Cm0[i] = 0; + Gm0[i] = 1/MAX; + M0 [i] = 0 ; + } + /*/ большие междуфазные активные сопротивления + for(unsigned i=0; i<(z+1); i++) + *R[i*15] = *R[i*15+1] = *R[i*15+2] = + *R[i*15+3] = *R[i*15+4] = *R[i*15+5] = + *R[i*15+6] = *R[i*15+7] = *R[i*15+8] = + *R[i*15+9] = *R[i*15+10]= *R[i*15+11]= MAX; + // минимальные продольные сопротивления G (необходимы для возможности записи 2 закона Кирхгофа) + for(unsigned i=0; i<z; i++) + *R[i*15+12] = *R[i*15+13] = *R[i*15+14] = MIN; */ + length = 1; // длинна линии +} +//--------------------------------------------------------------------------- +PLine::PLine(PLine &ob): + PUnit(&ob), + X1(4), + X2(4){ + z=ob.z; // число звеньев + set_pins(); // обозначение выводов от устройства +} +//--------------------------------------------------------------------------- +PLine::~PLine(){ ;} +//--------------------------------------------------------------------------- +/* Установка человеко-понятных выводов от устройства */ +void PLine::set_pins(){ + Out.add(&X1); // указатели на группы элементов Pins_Group[0] = &X1 + Out.add(&X2); + X1.Name = "X1"; + X2.Name = "X2"; + X1[ _N_ ] = set_pin(0); + X1[ _A_ ] = set_pin(1); + X1[ _B_ ] = set_pin(2); + X1[ _C_ ] = set_pin(3); + X2[ _N_ ] = set_pin(0); + X2[ _A_ ] = set_pin(u-3); //, 12+15*(z-1) ); + X2[ _B_ ] = set_pin(u-2); //, 13+15*(z-1) ); + X2[ _C_ ] = set_pin(u-1); //, 14+15*(z-1) ); +} +//--------------------------------------------------------------------------- +void PLine::Describe_Fields(){ + PFieldInfo fi; + String name; + // длинна + fi.Name = "Длинна"; + fi.Type = "PType"; + fi.ptr = (void*) &length; + Fields.push_back(fi); + // число звеньев + fi.Name = "Звеньев"; + fi.Type = "int"; + fi.ptr = (void*) &z; + fi.Mode = ro; // только чтение + Fields.push_back(fi); + // возврящаем режим записи для последующих полей + fi.Mode = rw; + // активные сопротивления + for(int i=0; i<3; i++){ + fi.Name = "R0[_" + (String)((char)('A'+i)) + "_]"; + fi.Type = "PType"; + fi.ptr = (void*) &R0[_A_+i]; + Fields.push_back(fi); + } + // индуктивности + for(int i=0; i<3; i++){ + fi.Name = "L0[_" + (String)((char)('A'+i)) + "_]"; + fi.Type = "PType"; + fi.ptr = (void*) &L0[_A_+i]; + Fields.push_back(fi); + } + /*/ емкости в линии + for(int i=0; i<3; i++){ + fi.Name = "C0[_" + (String)((char)('A'+i)) + "_]"; + fi.Type = "PType"; + fi.ptr = (void*) &C0[_A_+i]; + Fields.push_back(fi); + } */ + // взаимная индуктивность + for(int i=0; i<3; i++){ + switch(i){ + case _AB_: name = "AB"; break; + case _BC_: name = "ВС"; break; + case _CA_: name = "СА"; break; + default: name = ""; + } + fi.Name = "M_[_" + name + "_]"; + fi.Type = "PType"; + fi.ptr = (void*) &M0[_AB_+i]; + Fields.push_back(fi); + } + // активная проводимость на землю + for(int i=0; i<3; i++){ + fi.Name = "Gz0[_" + (String)((char)('A'+i)) + "_]"; + fi.Type = "PType"; + fi.ptr = (void*) &Gz0[_A_+i]; + Fields.push_back(fi); + } + // емкостная проводимость на землю + for(int i=0; i<3; i++){ + fi.Name = "Cz0[_" + (String)((char)('A'+i)) + "_]"; + fi.Type = "PType"; + fi.ptr = (void*) &Cz0[_A_+i]; + Fields.push_back(fi); + } + // активная междуфазная проводимость + for(int i=0; i<3; i++){ + switch(i){ + case _AB_: name = "AB"; break; + case _BC_: name = "ВС"; break; + case _CA_: name = "СА"; break; + default: name = ""; + } + fi.Name = "Gm0[_"+ name +"_]"; + fi.Type = "PType"; + fi.ptr = (void*) &Gm0[_AB_+i]; + Fields.push_back(fi); + } + // емкостная междуфазная проводимость + for(int i=0; i<3; i++){ + switch(i){ + case _AB_: name = "AB"; break; + case _BC_: name = "ВС"; break; + case _CA_: name = "СА"; break; + default: name = ""; + } + fi.Name = "Cm0[_"+ name +"_]"; + fi.Type = "PType"; + fi.ptr = (void*) &Cm0[_AB_+i]; + Fields.push_back(fi); + } +} +//--------------------------------------------------------------------------- +PLine PLine::operator=(PLine &ob){ + if(z != ob.z || + u != ob.u || + v != ob.v || + k != ob.k) {err(0,"Присваивание объекта линия: число звеньев разное (TPL::operator=).");return *this; } + length = ob.length; // длинна линии + *M = *ob.M; + *N = *ob.N; + // значения параметров + for(unsigned i=0;i<v;i++){ + _E[i]=*ob.E[i]; + _U_C[i]=*ob.U_C[i]; + _U_L[i]=*ob.U_L[i]; + _U_Lm[i]=*ob.U_Lm[i]; + _R[i]=*ob.R[i]; + _L[i]=*ob.L[i]; + _C[i]=*ob.C[i]; + _Z[i]=*ob.Z[i]; + _I[i]=*ob.I[i]; + } + _Lm = ob._Lm; + for(unsigned i=0;i<v;i++) + for(unsigned j=0;j<v;j++) + //Lm[i][j] = _Lm.begin() + distance(ob._Lm.begin(), ob.Lm[i][j]); + Lm[i][j] = &_Lm[ ob._Lm.index( ob.Lm[i][j] ) ]; + for(unsigned i=0;i<u;i++){ + _J[i]=*ob.J[i]; + _f[i]=*ob.f[i]; + } + return *this; +} +//--------------------------------------------------------------------------- +/* Параметры линии +void PLine::setR_(PType value){ // установка активных сопротивлений на фазу + PType R_zvena = value / z; + for(unsigned i=0;i<z;i++){ + *R[i*15+12] = R_zvena; + *R[i*15+13] = R_zvena; + *R[i*15+14] = R_zvena; + } +} +void PLine::setL_(PType value){ // установка индуктивности фазы + PType L_zvena = value / z; + for(unsigned i=0;i<z;i++){ + *L[i*15+12] = L_zvena; + *L[i*15+13] = L_zvena; + *L[i*15+14] = L_zvena; + } +} +void PLine::setC_(PType value){ // установка умкости фазы + PType C_zvena = value * z; // обрати внимание! умножить + for(unsigned i=0;i<z;i++){ + *C[i*15+12] = C_zvena; + *C[i*15+13] = C_zvena; + *C[i*15+14] = C_zvena; + } +} +void PLine::setGz_(PType value){ // установка активных проводимостей на землю + PType Rz_zvena = (z+1) / value; // число проводимостей на 1 больше, чем число звеньев + for(unsigned i=0, cnt=z+1; i<cnt; i++){ + *R[i*15+6] = Rz_zvena; + *R[i*15+7] = Rz_zvena; + *R[i*15+8] = Rz_zvena; + } +} +void PLine::setCz_(PType value){ // установка емкостей на землю + PType Cz_zvena = value / (z+1); // да-да! именно делить + for(unsigned i=0, cnt=z+1; i<cnt; i++){ + *C[i*15+9 ] = Cz_zvena; + *C[i*15+10] = Cz_zvena; + *C[i*15+11] = Cz_zvena; + } + // обнуляем активное сопротивление в этих ветвях + if(value!=0) + for(unsigned i=0, cnt=z+1; i<cnt; i++){ + *R[i*15+9 ] = 0; + *R[i*15+10] = 0; + *R[i*15+11] = 0; + } + else + for(unsigned i=0, cnt=z+1; i<cnt; i++){ + *R[i*15+9 ] = MAX; + *R[i*15+10] = MAX; + *R[i*15+11] = MAX; + } + +} +void PLine::setGm_(PType value){ // установка активных междуфазных проводимостей + PType Rm_zvena = (z+1) / value; // число проводимостей на 1 больше, чем число звеньев + for(unsigned i=0, cnt=z+1; i<cnt; i++){ + *R[i*15+0] = Rm_zvena; + *R[i*15+1] = Rm_zvena; + *R[i*15+2] = Rm_zvena; + } +} +void PLine::setCm_(PType value){ // установка междуфазных емкостей + PType Cm_zvena = value / (z+1); // да-да! именно делить + for(unsigned i=0, cnt=z+1; i<cnt; i++){ + *C[i*15+3] = Cm_zvena; + *C[i*15+4] = Cm_zvena; + *C[i*15+5] = Cm_zvena; + } + // обнуляем активное сопротивление в этих ветвях + if(value!=0) + for(unsigned i=0, cnt=z+1; i<cnt; i++){ + *R[i*15+3] = 0; + *R[i*15+4] = 0; + *R[i*15+5] = 0; + } + else + for(unsigned i=0, cnt=z+1; i<cnt; i++){ + *R[i*15+3] = MAX; + *R[i*15+4] = MAX; + *R[i*15+5] = MAX; + } +} +void PLine::setLm_(PType value){ // установка междуфазных взаимоиндуктивностей + PType Lm_zvena = value / z; + for(unsigned i=0;i<z;i++){ + mutual_inductance(i*15+12, i*15+13, Lm_zvena); + mutual_inductance(i*15+12, i*15+14, Lm_zvena); + mutual_inductance(i*15+13, i*15+14, Lm_zvena); + } +} +//--------------------------------------------------------------------------- +// Удельные параметры +void PLine::setR0(PType value){ // установка активных сопротивлений на фазу + PType R_zvena = value * length / z; + for(unsigned i=0;i<z;i++){ + *R[i*15+12] = R_zvena; + *R[i*15+13] = R_zvena; + *R[i*15+14] = R_zvena; + } +} +void PLine::setL0(PType value){ // установка индуктивности фазы + PType L_zvena = value * length / z; + for(unsigned i=0;i<z;i++){ + *L[i*15+12] = L_zvena; + *L[i*15+13] = L_zvena; + *L[i*15+14] = L_zvena; + } +} +void PLine::setC0(PType value){ // установка умкости фазы + PType C_zvena = (value / length) * z; // обрати внимание! умножить + for(unsigned i=0;i<z;i++){ + *C[i*15+12] = C_zvena; + *C[i*15+13] = C_zvena; + *C[i*15+14] = C_zvena; + } +} +void PLine::setGz0(PType value){ // установка активных проводимостей на землю + PType Rz_zvena = (z+1) / (value * length); // число проводимостей на 1 больше, чем число звеньев + for(unsigned i=0, cnt=z+1; i<cnt; i++){ + *R[i*15+6] = Rz_zvena; + *R[i*15+7] = Rz_zvena; + *R[i*15+8] = Rz_zvena; + } +} +void PLine::setCz0(PType value){ // установка емкостей на землю + PType Cz_zvena = (value * length ) / (z+1); // да-да! именно делить + for(unsigned i=0, cnt=z+1; i<cnt; i++){ + *C[i*15+9 ] = Cz_zvena; + *C[i*15+10] = Cz_zvena; + *C[i*15+11] = Cz_zvena; + } + // обнуляем активное сопротивление в этих ветвях + if(value!=0) + for(unsigned i=0, cnt=z+1; i<cnt; i++){ + *R[i*15+9 ] = 0; + *R[i*15+10] = 0; + *R[i*15+11] = 0; + } + else + for(unsigned i=0, cnt=z+1; i<cnt; i++){ + *R[i*15+9 ] = MAX; + *R[i*15+10] = MAX; + *R[i*15+11] = MAX; + } +} +void PLine::setGm0(PType value){ // установка активных междуфазных проводимостей + PType Rm_zvena = (z+1) / (value * length); // число проводимостей на 1 больше, чем число звеньев + for(unsigned i=0, cnt=z+1; i<cnt; i++){ + *R[i*15+0] = Rm_zvena; + *R[i*15+1] = Rm_zvena; + *R[i*15+2] = Rm_zvena; + } +} +void PLine::setCm0(PType value){ // установка междуфазных емкостей + PType Cm_zvena = (value * length) / (z+1); // да-да! именно делить + for(unsigned i=0, cnt=z+1; i<cnt; i++){ + *C[i*15+3] = Cm_zvena; + *C[i*15+4] = Cm_zvena; + *C[i*15+5] = Cm_zvena; + } + // обнуляем активное сопротивление в этих ветвях + if(value!=0) + for(unsigned i=0, cnt=z+1; i<cnt; i++){ + *R[i*15+3] = 0; + *R[i*15+4] = 0; + *R[i*15+5] = 0; + } + else + for(unsigned i=0, cnt=z+1; i<cnt; i++){ + *R[i*15+3] = MAX; + *R[i*15+4] = MAX; + *R[i*15+5] = MAX; + } +} +void PLine::setLm0(PType value){ // установка междуфазных взаимоиндуктивностей + PType Lm_zvena = (value * length) / z; + for(unsigned i=0;i<z;i++){ + mutual_inductance(i*15+12, i*15+13, Lm_zvena); + mutual_inductance(i*15+12, i*15+14, Lm_zvena); + mutual_inductance(i*15+13, i*15+14, Lm_zvena); + } +}*/ +//--------------------------------------------------------------------------- +/* определение параметров схемы замещения линии по данных холостого хода */ +bool PLine::set_params(const PType _L0, const PType _R0, const PType _M0, const PType dP_f, const PType dQ_f, const PType U_n_f, const PType U_k_f, const PType dP, const PType dQ, const PType U_n, const PType U_k, const PType freq ){ + // поиск сопротивлений продольных ветвей + PType Xz = 2*M_PI*freq*(_L0*length/z); + //PType Lz = L0*length/z; + PType Rz = 2*M_PI*freq*(_R0*length/z); + // поиск проводимостей поперечных ветвей на землю + PType a = (U_k_f-U_n_f)/(z*U_k_f); + PType C1 = z*(z-1)*(3*a*a*pow(z,3) - z*z*(12*a*a+15*a) + z*(13*a*a+35*a+20) - 2*a*a - 10*a - 10 )/60; + PType C2 = (z+1)*(2*a*a*z*z + z*(a*a-6*a) + 6 )/6; + PType k = (dP_f-Rz*dQ_f/Xz)/(U_k_f*U_k_f*C2); + PType A1 = Xz*U_k_f*U_k_f*C1*(1+pow(Rz/Xz,2)); + PType B1 = 2*k*Rz*U_k_f*U_k_f*C1 + U_k_f*U_k_f*C2; + PType D1 = Xz*U_k_f*U_k_f*k*k*C1 - dQ_f; + PType b2z = (sqrt(B1*B1-4*A1*D1) - B1)/(2*A1); + PType C2z = b2z/(2*M_PI*freq); + PType g2z = (k + Rz/Xz*b2z); + // поиск междуфазных проводимостей + PType Xmz = 2*M_PI*freq*((_L0-_M0)*length/z); + //PType Mz = M0*length/z; + a = (U_k-U_n)/(z*U_k); + C1 = z*(z-1)*(3*a*a*pow(z,3) - z*z*(12*a*a+15*a) + z*(13*a*a+35*a+20) - 2*a*a - 10*a - 10 )/60; + C2 = (z+1)*(2*a*a*z*z + z*(a*a-6*a) + 6 )/6; + k = (dP-Rz*dQ/Xmz)/(3*U_k*U_k*C2); + A1 = Xmz*U_k*U_k*C1*(1+pow(Rz/Xmz,2)); + B1 = 2*k*Rz*U_k*U_k*C1 + U_k*U_k*C2; + D1 = Xmz*U_k*U_k*k*k*C1 - dQ/3; + PType bz = (sqrt(B1*B1-4*A1*D1) - B1)/(2*A1); + PType gz = k + Rz/Xmz*bz; + PType b1z = (bz - b2z)/3; + PType C1z = b1z/(2*M_PI*freq); + PType g1z = (gz - g2z)/3; + // установка значений + for(int i=_A_; i<=_C_; i++){ + R0[i] = _R0; + L0[i] = _L0; + C0[i] = 0; + M0[i] = _M0; + Gz0[i] = g2z * (z+1) / length; + Cz0[i] = C2z * (z+1) / length; + } + for(int i=_AB_; i<=_CA_; i++){ + Gm0[i] = g1z * (z+1) / length; + Cm0[i] = C1z * (z+1) / length; + } + /*setR_ ( _R0 * length ); + setL_ ( _L0 * length ); + setC_ ( 0 ); + setLm_ ( _M0 * length ); + setGz_ ( g2z * (z+1) ); + setCz_ ( C2z * (z+1) ); + setGm_ ( g1z * (z+1) ); + setCm_ ( C1z * (z+1) ); */ + return true; +} +//--------------------------------------------------------------------------- +/* определение параметров схемы замещения фазы для ЛЭП*/ +bool PLine::Phase_Params(Phase phase, PType __R, PType __L, PType __C, PType Gz, PType Cz){ + PType R2; // сопротивления на землю + if(Gz) R2 = (z+1)/Gz; + else R2 = MAX; + PType C2 = Cz/(z+1); + PType L_zvena = __L/z; + PType R_zvena = __R/z; + PType C_zvena = __C/z; + // определяем фазу + unsigned p; + switch (phase){ + case _A_: p=0; break; + case _B_: p=1; break; + case _C_: p=2; break; + default: return false; + } + // установка значений + for(unsigned i=0;i<(z+1);i++){ + // ветка активной проводимости + *R[i*15+6+p] = R2; + *L[i*15+6+p] = 0; + *C[i*15+6+p] = 0; + // ветка емкостной проводимости + if(C2){ + *C[i*15+9+p] = C2; + *R[i*15+9+p] = 0; + *L[i*15+9+p] = 0; + } + else + *R[i*15+9+p] = MAX; + } + for(unsigned i=0;i<z;i++){ + *R[i*15+12+p] = R_zvena; + *L[i*15+12+p] = L_zvena; + *C[i*15+12+p] = C_zvena; + } + return true; +} +//--------------------------------------------------------------------------- +/* определение параметров схемы замещения фазы для ЛЭП*/ +bool PLine::Phase_Params_0(Phase phase, PType R0, PType L0, PType Gz0, PType Cz0){ + return Phase_Params(phase, R0*length, L0*length, 0, Gz0*length, Cz0*length); +} +//--------------------------------------------------------------------------- +bool PLine::Mutual_Inductance(PType M_ab, PType M_bc, PType M_ca){ + for(unsigned i=0;i<z;i++){ + mutual_inductance(i*15+12, i*15+13, M_ab/z); + mutual_inductance(i*15+13, i*15+14, M_bc/z); + mutual_inductance(i*15+14, i*15+12, M_ca/z); + } + return true; +} +//--------------------------------------------------------------------------- +/* определение параметров схемы замещения линии - взаимоиндуктивности */ +bool PLine::Mutual_Inductance_0(PType M0_ab, PType M0_bc, PType M0_ca){ + return Mutual_Inductance(M0_ab*length, M0_bc*length, M0_ca*length); +} +//--------------------------------------------------------------------------- +/* определение параметров схемы замещения для ЛЭП - междуфазные проводимости */ +bool PLine::Mutual_Conductance(unsigned Phase1, unsigned Phase2, PType Gm, PType Cm){ + PType R1 = (z+1)/Gm; // междуфазные сопротивления + PType C1 = Cm/(z+1); + // определяем фазу + unsigned p; + switch (Phase1 + Phase2){ + case (_A_ + _B_): p=0; break; + case (_B_ + _C_): p=1; break; + case (_C_ + _A_): p=2; break; + default: return false; + } + // установка значений + for(unsigned i=0;i<(z+1);i++){ + // активная проводимость + *R[i*15+p] = R1; + *L[i*15+p] = 0; + *C[i*15+p] = 0; + // емкостная проводимость + if(C1){ + *C[i*15+3+p] = C1; + *R[i*15+3+p] = 0; + *L[i*15+3+p] = 0; + } + else + *R[i*15+3+p] = MAX; + } + return true; +} +//--------------------------------------------------------------------------- +/* определение параметров схемы замещения для ЛЭП - междуфазные проводимости */ +bool PLine::Mutual_Conductance_0(Phase Phase1, Phase Phase2, PType Gm0, PType Cm0){ + return Mutual_Conductance(Phase1, Phase2, Gm0*length, Cm0*length); +} +//--------------------------------------------------------------------------- +bool PLine::accept(){ + bool ret = true; + // фазные параметры + for(int i=_A_; i<=_C_; i++) + ret = ret & Phase_Params_0((Phase) i, R0[i], L0[i], Gz0[i], Cz0[i]); + // междуфазные индуктивности + ret = ret & Mutual_Inductance_0(M0[_AB_], M0[_BC_], M0[_CA_]); + // междуфазные проводимости + ret = ret & Mutual_Conductance_0(_A_, _B_, Gm0[_AB_], Cm0[_AB_]); + ret = ret & Mutual_Conductance_0(_B_, _C_, Gm0[_BC_], Cm0[_BC_]); + ret = ret & Mutual_Conductance_0(_C_, _A_, Gm0[_CA_], Cm0[_CA_]); + update_differential_resistance(); + return ret; +} +//--------------------------------------------------------------------------- +void PLine::Save(ostream &stream){ // сохранение параметров объекта в поток + // сначала сохранится базовый класс + sire::Save(stream); + // теперь сохраняем этот класс + stream << length << " "; + for(int i=0; i<4; i++){ + stream << R0[i] << " "; + stream << L0[i] << " "; + stream << C0[i] << " "; + stream << Gz0[i] << " "; + stream << Cz0[i] << " "; + } + for(int i=0; i<3; i++){ + stream << M0[i] << " "; + stream << Gm0[i] << " "; + stream << Cm0[i] << " "; + } +} +//--------------------------------------------------------------------------- +void PLine::Read(istream &stream){ // загрузка параметров объекта из потока + // сначала читает данные базовый класс + sire::Read(stream); + // теперь читает этот класс + stream >> length; + for(int i=0; i<4; i++){ + stream >> R0[i]; + stream >> L0[i]; + stream >> C0[i]; + stream >> Gz0[i]; + stream >> Cz0[i]; + } + for(int i=0; i<3; i++){ + stream >> M0[i]; + stream >> Gm0[i]; + stream >> Cm0[i]; + } +} +//--------------------------------------------------------------------------- +String PLine::ClassName(){ return "PLine";} +//--------------------------------------------------------------------------- +unsigned PLine::Cells(){return z;}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- + + + + + + + + + + + + +//--------------------------------------------------------------------------- +PGrid::PGrid(){ + // устанавливаем нулевые указатели + A=NULL; + B=NULL; + F=NULL; + _J=NULL; + Branch=NULL; + Node=NULL; + Element=NULL; + Links = NULL; + U=NULL; + _U_Lm2=NULL; + U_Lm2=NULL; + _I2=NULL; + // задаем имя + Name = "Сеть"; + Describe_Fields(); // задать описание полей + BuildOK = false; // сеть нельзя использовать для решения +} +//--------------------------------------------------------------------------- +/* Создаем сеть из одного объекта */ +PGrid::PGrid(PUnit *obj){ + PElement **Block = new PElement*[1]; + Block[0] = obj; + if(obj->Internal_Links.Number() == 0) // между узлами нет соединенй + Link_Elements(1, Block, 0, NULL); + else{ // между узлами есть связи + Pins_Link Link; + Link.add(obj->Internal_Links); + unsigned *link = new unsigned [Link.Number() * 4]; + for(unsigned i=0,m=Link.Number();i<m;i++) { + // первый узел + link[4*i] = 0; + link[4*i + 1] = Link[i].First->Node(); + // второй объект + link[4*i + 2] = 0; + link[4*i + 3] = Link[i].Second->Node(); + } + BuildOK = Link_Elements(1, Block, Link.Number(), (unsigned (*)[2][2])link); + delete [] link; + } + delete [] Block; + // задаем имя + Name = "Сеть"; + Describe_Fields(); // задать описание полей +} +//--------------------------------------------------------------------------- +/* Поузловое соединений элементов */ +PGrid::PGrid(Pins_Link Link){ + if(Link.Number() <=0 ){ + err(0, "PGrid: не возможно собрать сеть, т.к. не указано ни одной связи между элементами"); + return; + } + /*/ в сети имена всех элементов должны быть уникальны + // доделать позже + for(unsigned i=0, n=Link.Number(); i<n; i++){ + String nameA = Block[i]->Name; + for(unsigned j=i+1; j<num; j++) + if( name == Block[j]->Name ){ + err(0, "PGrid: внутри сети имена всех объектов должны быть уникальны. Сеть не собрана"); + return false; + } */ + // подготовка данных для сборки сети + vector<PElement*> Block; + vector<int> link; + for(unsigned i=0;i<Link.Number();i++) { + // первый объект + unsigned j, n=Block.size(); // уже добавили ? + PElement *e = Link[i].First->Obj(); + for(j=0;j<n;j++) + if(e == Block[j]) break; + if(j==n){ + Block.push_back(Link[i].First->Obj()); + Link.add(((PUnit*)Link[i].First->Obj())->Internal_Links); // учтем внутренние соединения между узлами одного объекта + } + link.push_back( j ); + link.push_back( Link[i].First->Node() ); + // второй объект + n=Block.size(); // уже добавили ? + e = Link[i].Second->Obj(); + for(j=0;j<n;j++) + if(e == Block[j]) break; + if(j==n) { + Block.push_back(Link[i].Second->Obj()); + Link.add(((PUnit*)Link[i].Second->Obj())->Internal_Links); // учтем внутренние соединения между узлами одного объекта + } + link.push_back( j ); + link.push_back( Link[i].Second->Node() ); + } + BuildOK = Link_Elements(Block.size(), Block.begin(), Link.Number(), (unsigned (*)[2][2])link.begin()); + // задаем имя + Name = "Сеть"; + Describe_Fields(); // задать описание полей +} +//--------------------------------------------------------------------------- +void PGrid::Describe_Fields(){ + /*PFieldInfo fi; + // сопротивление во включ. состоянии + fi.Name = "Группы выводов"; + fi.Type = "Pins_List"; + fi.ptr = (void*)this; + Fields.push_back(fi);*/ +} +//--------------------------------------------------------------------------- +/* num - число блоков для построения сети + Block - массив из этих элементов + Link - массив, указывающий как связаны блоки { { {№_блока_1, вершина_блока_1},{№_блока_2, вершина_блока_2} }, ...} +*/ +bool PGrid::Link_Elements(unsigned num, PElement *Block[], unsigned numLink,unsigned Link[][2][2]){ + // устанавливаем нулевые указатели + A=NULL; + B=NULL; + F=NULL; + _J=NULL; + Branch=NULL; + Node=NULL; + Element=NULL; + Links = NULL; + U=NULL; + _U_Lm2=NULL; + U_Lm2=NULL; + _I2=NULL; + if(num==0){err(0,"PGrid::Link_Elements(): При создании сети использовано 0 элементов. Сеть не создана."); return false;} + // запоминаем переданные элементы + numElement = num; + Element = new PElement*[numElement]; + for(unsigned i=0;i<numElement;i++) + Element[i] = Block[i]; + // запоминаем связи + numLinks = numLink; + Links = new unsigned [numLink * 4]; + for(unsigned i=0; i<numLink; i++){ + Links[0+4*i] = Link[i][0][0]; + Links[1+4*i] = Link[i][0][1]; + Links[2+4*i] = Link[i][1][0]; + Links[3+4*i] = Link[i][1][1]; + } + // проверим уникальны ли имена элементов объектов + for(unsigned i=0; i<numElement; i++){ + String name = Element[i]->FullName(); + for(unsigned j=i+1; j<numElement; j++) + if( name == Element[j]->FullName() ){ + err(0, "PSubGrid: внутри сети имена всех объектов должны быть уникальны, сеть не собрана"); + return false; + } + } + // создаем и заполняем первую матрицу связей ветвей в узлах + u = 0; + v = 0; + k = 0; + for(unsigned i=0; i<num;i++){ + PElement *p = Block[i]; + u += p->M->Rows; // общее число узлов + v += p->M->Cols; // общее число ветвей + k += p->N->Rows; // общее число контуров + } + //numNode = u; + //numBranch = v; + if(u<numLink) {err(0, "PGrid::Link_Elements(): отрицательное значение вершин"); return false;}; + if(v==0) {err(0, "PGrid::Link_Elements(): число вервей равно 0"); return false;}; + //u = u - numLink; // c учетом объединяемых узлов + + Branch = new unsigned*[numElement]; + for(unsigned i=0; i<num;i++){ + unsigned tmp_v = Block[i]->Branches(); + Branch[i] = new unsigned[tmp_v]; + for(unsigned j=0;j<tmp_v;j++) + Branch[i][j] = -1; + } + Node = new unsigned*[numElement]; + for(unsigned i=0; i<num;i++){ + unsigned tmp_u = Block[i]->Nodes(); + Node[i] = new unsigned[tmp_u]; + for(unsigned j=0;j<tmp_u;j++) + Node[i][j] = -1; + } + // сохраняем соответствие ветвей + unsigned i_branch=0; // текущее число ветвей в результирующей матрице + for(unsigned i=0; i<num;i++){ + PElement *p = Block[i]; + unsigned tmp_rows = p->M->Cols; + for(unsigned j=0; j<tmp_rows; j++){ + Branch[i][j] = i_branch; + i_branch++; + } + } + // сохраняем соответствия узлов (с учетом связей) + unsigned i_node=0; // текущее число узлов в результирующей матрице + Grounded_Node = i_node; // объявляем этот узел как заземленный + bool *link_use = new bool[numLink]; + for(unsigned i=0; i<numLink;i++) link_use[i]=false; + // а) объединяем заземляемые узлы + for(unsigned b=0; b<num;b++){ + PElement *p = Block[b]; + Node[ b ][ p->Grounded_Node ] = Grounded_Node; + // найдем связанные узлы + for(unsigned i=0; i<numLink; i++) + if( ! link_use[i]) + if( Link[i][0][0]==b && Link[i][0][1]==p->Grounded_Node ) + linked_nodes(numLink, Link, link_use, Grounded_Node, Link[i][0][0], Link[i][0][1]); + else if( Link[i][1][0]==b && Link[i][1][1]==p->Grounded_Node ) + linked_nodes(numLink, Link, link_use, Grounded_Node, Link[i][1][0], Link[i][1][1]); + } + i_node++; + // b) создаем один новый узел для нескольких объединяемых + for(unsigned i=0; i<numLink; i++) + if( ! link_use[i] ){ + // сам узел + Node[ Link[i][0][0] ][ Link[i][0][1] ] = i_node; + // c ним связанные + linked_nodes(numLink, Link, link_use, i_node, Link[i][0][0], Link[i][0][1]);//, i_node);//tmp); + // узлов в результирующей матрице стало на 1 больше + i_node++; + } + delete [] link_use; + // c) создаем один новый узел на один НЕ связанный узел + for(unsigned i=0; i<num;i++){ + unsigned tmp_rows = Block[i]->M->Rows; + for(unsigned j=0; j<tmp_rows; j++){ + // мы не записывали этот узел как объединенный? + if( -1 == Node_From_LocalNode(i,j) ){ + // узел еще не был учтен + Node[i][j] = i_node; + i_node++; + } + } + } + u = i_node; // всего столько узлов насчитали + // заполняем матрицу M связей ветвей с узлами + M = new Matrix<char>(u, v); + unsigned *Short_Branch = new unsigned[v]; // коротко-замкнутые ветви, начало и конец которых в одном узле + unsigned num_Short_Branch = 0; // число коротко-замкнутых ветвей + for(unsigned b=0; b<num;b++){ + PElement *p = Block[b]; + unsigned tmp_rows = p->M->Rows; + unsigned tmp_cols = p->M->Cols; + for(unsigned i=0; i<tmp_rows; i++) + for(unsigned j=0; j<tmp_cols; j++){ + unsigned br = Branch_From_LocalBranch(b,j); + unsigned nd = Node_From_LocalNode(b,i); + if(br>=v || nd>=u) + {err(0,"PGrid::Link_Elements(): номер узла(ветви) больше числа узлов(вейтвей)");return false;} + (*M)[nd][br] += (*p->M)[i][j]; // если ветка начинается там же где заканчивается, то получим 0 в итоге + if(fabs((*M)[nd][br]) < 0.01 && fabs((*p->M)[i][j])>0.01){ // если так, то это коротко-замкнутая ветка + Short_Branch[num_Short_Branch]=br; + num_Short_Branch++;} + } + } + + // создаем 2 матрицу инцеденций N (2 закон кирхгофа) + k = v-u+1; + N = new Matrix<char>(k,v); + //if(k != N->Rows){err(0, "Создание сети: число контуров не соответствует неоходимому количеству для решения уравнений ( PGrid() )");} + unsigned nd = 0; // число уже записанных уравнений + for(unsigned b=0; b<num;b++){ + PElement *p = Block[b]; + unsigned tmp_rows = p->N->Rows; + unsigned tmp_cols = p->N->Cols; + for(unsigned i=0; i<tmp_rows; i++){ + for(unsigned j=0; j<tmp_cols; j++){ + unsigned br = Branch_From_LocalBranch(b,j); + (*N)[nd][br] = (*p->N)[i][j]; + } + nd++; // запишем следующее уравнение + } + } + // 2 закон Кирхгофа из равенства потенциалов объединенных узлов + if( nd < N->Rows ){ + /* При объединении n узлов (2 объекта) можно составить n-1 независимое уравнение следующим образом: + приравнивать потенциалы 2х объединяемых узлов относительно 2х других объединяемых узлов. + Уравнения будем записывать для узлов, которые объединяются при соединении двух разных + объектов. + При объединении 2х узлов одного объекта, на каждую объединяемую пару можно составить + хакон кирхгофа. + */ + // Ищем узлы образуемые при объединении 2x объектов + bool *Used_Link = new bool[numLink]; for(unsigned i=0;i<numLink;i++) Used_Link[i] = false; + bool Loop = true; // продолжаем цикл + while(Loop){ + unsigned i; + for(i=0; i<numLink;i++) if( !Used_Link[i] )break; // ищем не использованные связи + if (i!=numLink){ // нашли + unsigned Obj1 = Link[i][0][0]; // первый объект + unsigned Obj2 = Link[i][1][0]; // второй объект + vector<unsigned> Node_For_Obj1; // сохраняем использованные узлы 1 объекта + vector<unsigned> Node_For_Obj2; // сохраняем использованные узлы 2 объекта + Node_For_Obj1.push_back(Link[i][0][1]); + Node_For_Obj2.push_back(Link[i][1][1]); + Used_Link[i] = true; + if( Obj1 == Obj2 ){ //объединяем узлы одного объекта + Matrix<char> Way(1,v); + Matrix<char> Way1 = Element[Obj1]->M->Way(Node_For_Obj1[0], Node_For_Obj2[0]); + for(unsigned s=0, n=Way1.Cols; s<n; s++) + Way[0][Branch_From_LocalBranch(Obj1, s)] += Way1[0][s]; // Way = Way1 + /*/ если точек больше 2 + if( Element[Obj1]->Nodes > 2){ + // выбираем третью точку + unsigned node_A = (Node_For_Obj1[0] + Node_For_Obj2[0])/2; + if( node_A == Node_For_Obj1[0] ) node_A = (node_A++)%Element[Obj1]->Nodes; + if( node_A == Node_For_Obj2[0] ) node_A = (node_A++)%Element[Obj1]->Nodes; + Matrix<char> Way1 = Element[Obj1]->M->Way(node_A, Node_For_Obj1[0]); + Matrix<char> Way2 = Element[Obj2]->M->Way(node_A, Node_For_Obj2[0]); + for(unsigned s=0, n=Way1.Cols; s<n; s++) + Way[0][Branch_From_LocalBranch(Obj1, s)] += Way1[0][s]; // Way = Way1 + for(unsigned s=0, n=Way2.Cols; s<n; s++) + Way[0][Branch_From_LocalBranch(Obj2, s)] -= Way2[0][s]; // Way = Way1 - Way2 + } + else if( Element[Obj1]->Nodes == 2){ // узлов только 2 + Matrix<char> Way1 = Element[Obj1]->M->Way(Node_For_Obj1[0], Node_For_Obj2[0]); + for(unsigned s=0, n=Way1.Cols; s<n; s++) + Way[0][ Branch_From_LocalBranch(Obj1, s) ] += Way1[0][s]; // Way = Way2 + }*/ + // считаем число ветвей в контуре (должно быть более 0) + unsigned branches=0; for(unsigned s=0;s<v;s++) if(Way[0][s]!=0) branches++; + // сохраняем закон + //PType t0[2000]; + if(branches > 0){ // >1 + for(unsigned s=0;s<v;s++) {(*N)[nd][s] = Way[0][s];}//t0[s] = Way[0][s];} + nd++; // запишем еще одно уравнение по 2 закону Кирхгофа + if(nd>=N->Rows) Loop = false; // уравнений достаточно + } + } + else{ // объединяем 2 разных объекта + // ищем другие объединяемые узлы при объединении этих объектов друг с другом + for(unsigned j=0; j<numLink;j++) + if( !Used_Link[j] ){ + if( Link[j][0][0] == Obj1 && Link[j][1][0] == Obj2){ + Node_For_Obj1.push_back(Link[j][0][1]); + Node_For_Obj2.push_back(Link[j][1][1]); + Used_Link[j] = true; + } + else if( Link[j][1][0] == Obj1 && Link[j][0][0] == Obj2){ + Node_For_Obj1.push_back(Link[j][1][1]); + Node_For_Obj2.push_back(Link[j][0][1]); + Used_Link[j] = true; + } + } + // В Node_For_Obj1 и Node_For_Obj2 под одинаковыми индексами лежат объединяемые узлы + // составим 2 закон кирхгофа (приравняем потенциалы этих узлов) + // пути будем составлять от первых узлов (у=0) до остальных + unsigned node_A = Block[Obj1]->Grounded_Node; //Node_For_Obj1[0]; + unsigned node_B = Block[Obj2]->Grounded_Node; //Node_For_Obj2[0]; + Matrix<char> Way_AB = M->Way( Node_From_LocalNode(Obj1, node_A), Node_From_LocalNode(Obj2, node_B)); // node_A и node_В один и тот же узел - путь д.б. нулевым + for(unsigned y=0, n=Node_For_Obj1.size(); y<n; y++){ // y=1 + if( Node_For_Obj1[y] != node_A || Node_For_Obj2[y] != node_B ){ + // кратчайшие пути + Matrix<char> Way1 = Element[Obj1]->M->Way(node_A, Node_For_Obj1[y]); + Matrix<char> Way2 = Element[Obj2]->M->Way(node_B, Node_For_Obj2[y]); + // составляем закон + Matrix<char> Way(Way_AB); // Way = way_AB + for(unsigned s=0, n=Way2.Cols; s<n; s++){ + unsigned br = Branch_From_LocalBranch(Obj2, s); + Way[0][br] += Way2[0][s]; // Way = ay_AB + way2 + } + for(unsigned s=0, n=Way1.Cols; s<n; s++){ + unsigned br = Branch_From_LocalBranch(Obj1, s); + Way[0][br] -= Way1[0][s]; // Way = Way_AB + way2 - way1 + } + // считаем число ветвей в контуре (должно быть более 0) + unsigned branches=0; + for(unsigned s=0;s<v;s++) {if(Way[0][s]!=0) branches++;} + // если число ветвей больше 0 сохраняем закон + //PType t0[3200]; + if(branches > 0){ // >1 + for(unsigned s=0;s<v;s++) {(*N)[nd][s] = Way[0][s];}//t0[s] = Way[0][s];} + nd++; // запишем еще одно уравнение по 2 закону Кирхгофа + } + if(nd>=N->Rows) {Loop = false; break; } // уравнений достаточно + } // условие if + } // конец цикла быбора пар + } // конец для 2х объединяемых узлов + } + else + Loop = false; // просмотрели все связи + } + delete [] Used_Link; + /* Берем произвольный узел и считаем по имеющейся 1 матрице инциденций M + два развых пути до объединяемых узлов. И так как эти узлы объединены получим контур. + Нужна функция нахождения пути между узлами: + 1) берем узел A 1 объекта и считаем путь до объединяемого узла U1 по матрице М1 + 2) считаем путь от узла A до любого узла В 2 объекта по матрице М + 3) считаем путь от В до объединяемого узла U2 по матрице М2 + 3.1) запоминаем пары {A,U1} {B,U2} и больше их не используем для заданных объектов + 4) сотавляем 2 закон Кирхгофа + 5) этот закон может быть законом для короткозамкнутой ветви, тогда его не сохраняем, + и ищем другой узел В и повторим п.3-5 + 6) этот закон может иметь 0 ветвей, тогда его не сохраняем, + и ищем другой узел В и повторим п.3-5 + 7) этот закон может содержать ветви только одного объекта - не сохраняем, повторим п.3-5 + // + vector< vector<unsigned> > First_Node_For_Obj(numElement); // сохраняем использованные пары узлов - Pairs_Node_For_Obj[Obj][№][0/1] + vector< vector<unsigned> > Second_Node_For_Obj(numElement);// сохраняем использованные узлы + for(unsigned i=0; i<numLink;i++){ + unsigned Obj1 = Link[i][0][0]; + unsigned Obj2 = Link[i][1][0]; + // A = 0, B = 0, U1 = Link[i][0][1], U2 = Link[i][1][1] + unsigned node_U1 = Link[i][0][1]; + unsigned node_U2 = Link[i][1][1]; + unsigned node_A = 0; + unsigned node_B = 0; + //*Pairs_Node_For_Obj = new vector<unsigned[2]>[numElement]; + Matrix<char> Way(1, v); // найденный контур + unsigned branches = 0; // число ветвей в результирующем законе + bool Loop = false; // повторить расчет для других узлов A, B +//PType t0[200]; + do{ + branches=0; + // Не использовали ли мы раньше этой пары узлов + bool use_1, use_2; + do{ + if(node_A == node_U1) node_A = node_A++; + if(node_B == node_U2) node_B = node_B++; + // по 1 объекту + use_1=false; + for(unsigned i=0, n=First_Node_For_Obj[ Obj1 ].size(); i<n; i++) + if( First_Node_For_Obj[ Obj1 ][i] == node_A && Second_Node_For_Obj[ Obj1 ][i] == node_U1) {use_1 = true; break;} + else if( First_Node_For_Obj[ Obj1 ][i] == node_U1 && Second_Node_For_Obj[ Obj1 ][i] == node_A ) {use_1 = true; break;} + // по 2 объекту + use_2=false; + for(unsigned i=0, n=First_Node_For_Obj[ Obj2 ].size(); i<n; i++) + if( First_Node_For_Obj[ Obj2 ][i] == node_B && Second_Node_For_Obj[ Obj2 ][i] == node_U2) {use_2 = true; break;} + else if( First_Node_For_Obj[ Obj2 ][i] == node_U2 && Second_Node_For_Obj[ Obj2 ][i] == node_B ) {use_2 = true; break;} + if(use_1) node_A = node_A++; + if(use_2) node_B = node_B++; + if( node_A >= Element[Obj1]->Nodes || + node_B >= Element[Obj2]->Nodes ){ + use_1 = false; // и далее прервем процесс поиска + use_2 = false; + } + }while( use_1 || use_2); + if( node_A >= Element[Obj1]->Nodes || + node_B >= Element[Obj2]->Nodes ){ break;} + // запоминаем эти узлы + First_Node_For_Obj[ Obj1 ].push_back(node_U1); + Second_Node_For_Obj[ Obj1 ].push_back(node_A); + First_Node_For_Obj[ Obj2 ].push_back(node_U2); + Second_Node_For_Obj[ Obj2 ].push_back(node_B); + // кратчайшие пути + Matrix<char> Way1 = Element[Obj1]->M->Way(node_A, node_U1); + Matrix<char> Way2 = Element[Obj2]->M->Way(node_B, node_U2); + Matrix<char> Way_AB = M->Way( Node_From_LocalNode(Obj1, node_A), Node_From_LocalNode(Obj2, node_B)); + // проверка: а не принадлечатли ветви конечного закона одному объекту + unsigned branches_1 = 0;// число ветвей от первого объекта + unsigned branches_2 = 0;// число ветвей от второго объекта + for(unsigned i=0, n=Way1.Cols; i<n; i++){ + unsigned br = Branch_From_LocalBranch(Obj1, i); + if( (Way1[0][i] + Way_AB[0][ br ])!=0 ) branches_1++; + } + if( branches_1>0 ){ // есть ветви от первого объекта + for(unsigned i=0; i<v; i++)Way[0][i]=Way_AB[0][i]; // Way = way_AB + for(unsigned i=0, n=Way2.Cols; i<n; i++){ + unsigned br = Branch_From_LocalBranch(Obj2, i); + Way[0][ br ] = Way2[0][i] + Way_AB[0][ br ]; // Way = ay_AB + way2 + if( Way[0][ br ]!=0 ) branches_2++; + } + if( branches_2>0){ // есть ветви от второго объекта + // составляем уравнение + for(unsigned i=0, n=Way1.Cols; i<n; i++){ + unsigned br = Branch_From_LocalBranch(Obj1, i); + Way[0][br] -= Way1[0][i]; // Way = ay_AB + way2 - way1 + } + // считаем число ветвей в контуре (должно быть более 2х) + branches=0; + for(unsigned i=0;i<v;i++) if(Way[0][i]!=0) branches++; + } + } + if(branches <= 1 || // нашли закон для короткозамкнутой ветви,нашли закон из 0 ветвей + branches_1==0 || branches_2==0){// или закон включающий ветви только одного оъекта + Loop = true; // повторим расчет для этих объединяемых ветвей изменив узла А и/или В + node_B++; + if(node_B >= Element[Obj2]->Nodes){ + node_B = 0; + node_A++; + } + } + else + Loop = false; // найденный закон удовлетворяет всем условиям, идем к другой паре объединяемых узлов + }while( Loop && node_A<Element[Obj1]->Nodes); // <=1 + //PType t1[8000]; + if(branches > 1){ // >1 + for(unsigned i=0;i<v;i++) {(*N)[nd][i] = Way[0][i];}// t1[i]= Way[0][i];} + nd++; // запишем еще одно уравнение по 2 закону Кирхгофа + } + if (nd == N->Rows) break; // уравнений достаточно + } */ + } + // 2 закон кирхгофа для короткозамкнутых ветвей (если не хватает уравнений) - в нормальном режиме должно хватать + if( nd < N->Rows ){ + unsigned num_use_SB = N->Rows - nd; + if( num_use_SB>num_Short_Branch ) num_use_SB = num_Short_Branch; + for(unsigned i=0; i<num_use_SB;i++){ + (*N)[nd][ Short_Branch[i] ] = 1; + nd++; // запишем следующее уравнение + } + } + delete [] Short_Branch; + if(nd < N->Rows) {err(0, "PGrid::Link_Elements: не удалось составить достаточное количество уравнений по 2 закону Кирхгофа");} + // матрица узловых токов и матрица потенциалов + _J = new PType[u]; + J = new PType*[u]; + for(unsigned j=0;j<u;j++) {_J[j]=0; J[j]=&_J[j];} + // обнуляем матрицу потенциалов + f = new PType*[u]; + for(unsigned j=0;j<u;j++) {f[j]=NULL;} + for(unsigned b=0; b<numElement; b++){ + PElement *p = Element[b]; + unsigned tmp_rows = p->Nodes(); + for(unsigned i=0; i<tmp_rows; i++){ + unsigned nd = Node_From_LocalNode(b,i); + (*J[nd]) += *(p->J[i]); // если узлы были объединены, то их задающие токи складываются + if( f[nd]==NULL ) + f[nd] = p->f[i]; + else // i-ый узел элемента p уже указывает на узел другого элемента_2 (они связаны) + p->f[i] = f[nd]; // тогда потенциал i-ого узела элемента p, будет равен потенциалу узла элемента_2 + } + } + + // матрица дифференциальных сопротивлений, начальных условий + // матрица эдс в ветвях + E = new PType*[v]; + // матрица дифференциальых сопротивлений + Z = new PType*[v]; + // напряжений на емкостях в ветвях (начальные условия) + U_C= new PType*[v]; + // напряжений на индуктивностях в ветвях (начальные условия) + U_L= new PType*[v]; + // напряжений на обузловленные взаимоиндуктивностями в ветвях (начальные условия) + U_Lm= new PType*[v]; + // дроссели в ветвях + D = new Throttle*[v]; + // напряжений на дроселлях в ветвях + U_D= new PType*[v]; + // матрица результатов + I = new PType*[v]; + R = new PType*[v]; + L = new PType*[v]; + C = new PType*[v]; + _Lm.clear(); + _Lm.push_back(0); + //Lm = new vector<PType>::iterator *[v]; for(unsigned i=0;i<v;i++)Lm[i] = new vector<PType>::iterator [v]; + Lm = new PType **[v]; for(unsigned i=0;i<v;i++)Lm[i] = new PType*[v]; + const PType *first = _Lm.begin(); + for(unsigned i=0;i<v;i++) + for(unsigned j=0;j<v;j++) + Lm[i][j] = (PType*)first; // по умолчанию ссылаемся на локальную матрицу взаимоиндуктивностей + for(unsigned b=0; b<numElement;b++){ + PElement *p = Element[b]; + //p->accept(); // <-- она должна вызываться до сборки сети, т.к. она может + // изменять внутренние связи, необходимые при сборке сети + // (напр трехфазный транс. PTransformer_3). Здесь вызывать нет ее смысла + ((PUnit*)p)->update_differential_resistance(); // пересчет матрицы Z - ато не дай бог забыли + unsigned tmp_cols = p->Branches(); + for(unsigned j=0; j<tmp_cols; j++){ + unsigned br = Branch_From_LocalBranch(b,j); + E[br] = p->E[j]; + Z[br] = p->Z[j]; // матрица дифференциальных сопротивлений + U_C[br] = p->U_C[j]; // напряжений на емкостях в ветвях (начальные условия) + U_L[br] = p->U_L[j]; // напряжений на индуктивностях в ветвях (начальные условия) + U_Lm[br] = p->U_Lm[j];// напряжений на обузловленные взаимоиндуктивностями в ветвях (начальные условия) + D[br] = p->D[j]; // дроссель в ветке + U_D[br] = p->U_D[j]; // напряжений на дроселлях в ветвях + I[br] = p->I[j]; // результаты расчета токов + R[br] = p->R[j]; // активное сопротивоение ветви + L[br] = p->L[j]; // индуктивность ветви + C[br] = p->C[j]; // емкость ветви + for(unsigned k=0;k<tmp_cols;k++){ + unsigned br2 = Branch_From_LocalBranch(b,k); + Lm[br][br2] = p->Lm[j][k]; // взаимоиндуктивность между ветвями (ссылаемся на _Lm первоначального объекта, но при использовании mutual_inductence будем создавать значение своем векторе _Lm и ссылаться на него) + } + } + } + // значения предшествующего тока + _I2= new PType[v]; + for(unsigned i=0;i<v;i++) + _I2[i] = *I[i]; + + update_sources(true); // принудительно обновляем значения + update_elements(true); // принудительно обновляем значения + // Создадим группы выводов + for(unsigned b=0; b<numElement;b++){ + PElement *p = Element[b]; + for(unsigned j=0, n=p->Out.Count(); j<n; j++){ + Pins *unit_pins = &p->Out[j]; // это группа выводов исходного объекта + Pins *grid_pins = new Pins(*unit_pins); // создаем Группу выводов для сети как копию + grid_pins->Name = p->FullName() + "." + unit_pins->Name; // меняем имя + Out.add(grid_pins); // добавляем группу выводов в список + } + } + return true; +} +//--------------------------------------------------------------------------- +PGrid::~PGrid(){ + // чистим память, выделенную под переменные + delete A; A = NULL; + delete [] B; B = NULL; + delete F; F = NULL; + delete [] _J; _J= NULL; + if(Branch!=NULL) + for(unsigned j=0;j<numElement;j++) + delete [] Branch[j]; + delete [] Branch; Branch = NULL; + if(Node!=NULL) + for(unsigned j=0;j<numElement;j++) + delete [] Node[j]; + delete [] Node; Node = NULL; + delete [] Element; Element = NULL; + delete [] Links; Links = NULL; + delete [] U; U = NULL; + delete [] _U_Lm2; _U_Lm2 = NULL; + delete [] U_Lm2; U_Lm2 = NULL; + delete [] _I2; _I2 = NULL; + // удаляем динамически созданные группы выводов + for(unsigned i=0, n=Out.Count(); i<n; i++) + delete &Out[i]; +} +//--------------------------------------------------------------------------- +/* Находит все узлы объединенные с заданным + numLink - число связей + Link[][2][2] - описание связей + link_use[] - связь обработана или нет? + i_node - номер узла сети, который присваивается всем объединяемым узлам (текущее число вершин в результирующей матрице) + obj, node - связь с какой вершиной ищем +*/ +void PGrid::linked_nodes(const unsigned numLink, const unsigned Link[][2][2], bool link_use[],const unsigned i_node,const unsigned obj,const unsigned node){//, unsigned &tmp){ + for(unsigned j=0; j<numLink; j++){ + if( ! link_use[j] ){ + if( Link[j][0][0] == obj && Link[j][0][1] == node ){ // если текущий узел объединяем с ним + // с ним связанный + Node[ Link[j][1][0] ][ Link[j][1][1] ] = i_node; + link_use[j]=true; // связь обработана + // какие с этим связанны? + linked_nodes(numLink, Link, link_use, i_node, Link[j][1][0], Link[j][1][1]); + } + else if( Link[j][1][0] == obj && Link[j][1][1] == node ){ // если текущий узел объединяем с ним + // с ним связанный + Node[ Link[j][0][0] ][ Link[j][0][1] ] = i_node; + link_use[j]=true; // связь обработана + // какие с этим связанны? + linked_nodes(numLink, Link, link_use, i_node, Link[j][0][0], Link[j][0][1]); + } + } + } +} +//--------------------------------------------------------------------------- +/* Возвращает номер глобальной вершины по номеру объекта в сети и номеру его локальной вершины */ +unsigned __fastcall PGrid::Node_From_LocalNode(unsigned Obj, unsigned LocalNode) { return Node[Obj][LocalNode]; } +//--------------------------------------------------------------------------- +/* Возвращает номер глобальной ветви по номеру объекта в сети и номеру его локальной ветви */ +unsigned __fastcall PGrid::Branch_From_LocalBranch(unsigned Obj, unsigned LocalBranch){ return Branch[Obj][LocalBranch]; } +//--------------------------------------------------------------------------- +unsigned PGrid::ObjNum_From_Object(PElement *obj){ + for(unsigned i=0; i<numElement; i++) + if( Element[i] == obj ) + return i; + return -1; // нет объекта в списке +} +//--------------------------------------------------------------------------- +/* Возвращает номер глобальной вершины по номеру объекта в сети и номеру его локальной вершины */ +unsigned __fastcall PGrid::Node_From_LocalNode(PElement* Obj, unsigned LocalNode) { + unsigned obj_num = ObjNum_From_Object(Obj); + if(obj_num == -1) return -1; + return Node[obj_num][LocalNode]; +} +//--------------------------------------------------------------------------- +/* Возвращает номер глобальной ветви по номеру объекта в сети и номеру его локальной ветви */ +unsigned __fastcall PGrid::Branch_From_LocalBranch(PElement* Obj, unsigned LocalBranch){ + unsigned obj_num = ObjNum_From_Object(Obj); + if(obj_num == -1) return -1; + return Branch[obj_num][LocalBranch]; +} +//--------------------------------------------------------------------------- +bool PGrid::Make_Equation(){ + if( !BuildOK ){ + err(0, "PGrid: уравнения для сети не составлены, т.к. сеть была собрана с ошибками"); + return false; + } + // инициализируем матрицы по уравнениям кирхгофа + unsigned n = u-1+k; + if( n != v) {err(0, "PGrid::Make_Equation: число уравнений по законам Кирхгофа не равно числу ветвей. Ошибка в коде.");} + A = new Matrix<PType>(n, v); + B = new PType[v]; // по числу уравнений == числу ветвей + U = new PType[v]; // падения напряжений в ветвях + F = new Matrix<PType>( M->Rows-1, M->Cols ); + _U_Lm2 = new PType[v]; // падения напряжений на взаимоиндуктивнотях от текущего тока + U_Lm2 = new PType*[v]; // падения напряжений на взаимоиндуктивнотях от текущего тока + for(unsigned i=0;i<v;i++) _U_Lm2[i]=0; + for(unsigned i=0;i<v;i++) U_Lm2[i]=&_U_Lm2[i]; + + // заполняем матрицу A по уравнениям состояния + Update_Equation(); + + // получаем матрицу для нахождения потенциалов + Matrix<PType> *tmp = new Matrix<PType>( M->Rows, M->Rows-1 ); + bool *deleted_branch = new bool[M->Cols]; + Copy_Matrix( & M->tree(deleted_branch), tmp); + //bool as[8];for(int i=0;i<M->Cols;i++) as[i]=deleted_branch[i]; + tmp->Delete_Row((unsigned)(tmp->Rows-1)); + *tmp = -1.0*(tmp->transpose().inverse()); + + for(unsigned j=0, k=0; j<F->Cols; j++) + if( deleted_branch[j] ){ + // ветка была удалена при составлении матрицы tmp + for(unsigned i=0; i<F->Rows; i++) (*F)[i][j] = 0; + } + else{ // ветка была сохранена при построении матрицы tmp + for(unsigned i=0; i<F->Rows; i++) (*F)[i][j] = (*tmp)[i][k]; + k++; // берем следующую ветку в матрице tmp + } + delete tmp; + delete [] deleted_branch; + return true; +} +//--------------------------------------------------------------------------- +void PGrid::Update_Equation(){ + // инициализируем матрицы по уравнениям кирхгофа + unsigned n = u-1+k; + if( n != v) {err(0, "PGrid::Update_Equation: число уравнений по законам Кирхгофа не равно числу ветвей. Ошибка в коде.");} + // заполняем матрицы по уравнениям Кирхгофа + // 1 закон Кирхгофа + for(unsigned i=0; i<u-1; i++) + for(unsigned j=0; j<v; j++) + (*A)[i][j]= (*M)[i][j]; + // учет взаимоиндуктивности для 2 закона Кирхгофа + Matrix<PType> *Nm = new Matrix<PType>(k,v); + *Nm = (1/smp) * Multiply_Matrix(N, Lm, v, v); +/*PType t0[3][3]; +for(int i=0;i<2;i++) + for(int j=0;j<3;j++) + t0[i][j] = (*N)[i][j];*/ + + // 2 закон Кирхгофа + for(unsigned i=0; i<k; i++) + for(unsigned j=0; j<v; j++) + (*A)[i+u-1][j]= (*N)[i][j]*(*Z[j]) + (*Nm)[i][j]; + delete Nm; + + // учет дросселей + for(unsigned j=0; j<v; j++) + if( D[j]!=NULL ){ // ветвь в которой установлен дроссель + // магнитная ветка + unsigned br = Branch_From_LocalBranch(D[j]->Obj, D[j]->MBranch); + // поиск уравнений в которые входит ветка с дросселем + for(unsigned i=0; i<k; i++){ + if( (*N)[i][j] != 0 ){ // уравнение в которую входит ветка с дросселем + int sgn_for_branch = (*N)[i][j]; // ветка сонаправлена или противонаправлена с контуром + (*A)[i+u-1][br] += sgn_for_branch * D[j]->Windings / smp; // учет влияния потока в магнитопроводе на эту ветку + } + // поиск уравнений, в которые входит магнитная ветвь + if( (*N)[i][br] != 0 ){ // уравнение в которую входит ветка с дросселем + int sgn_for_branch = (*N)[i][br]; // ветка сонаправлена или противонаправлена с контуром + (*A)[i+u-1][j] += - sgn_for_branch * D[j]->Windings; // учет МДС + } + } + } + //Matrix<PType> R1(*A); + *A = A->inverse(); + /* + R1=(*A) * R1; + unsigned NotNull=0; + //PType Sum=0; + //PType t0[3][3]; + for(unsigned i=0;i<A->Cols; i++) + for (unsigned j=0; j<A->Rows; j++){ + if(R1[i][j]>0.01) + NotNull++; + //Sum += fabs(R1[i][j]); + //t0[i][j] = R1[i][j]; + } + if(NotNull != A->Rows) + err(0,"PGrid::Update_Equation(): Обратная матрица найдена с погрешностью более 1%."); + */ +} +//--------------------------------------------------------------------------- +// обновляем информацию об источника тока и ЗДС в ветвях +bool PGrid::update_sources(bool force_update){ + bool ret=false; + //PType i = *Element[0]->I[1]; + for(unsigned i=0; i<numElement; i++){ + bool ret2 = Element[i]->update_sources(force_update); + ret = ret | ret2; + } + // если обновились + if(ret || force_update){ + // матрица узловых токов + for(unsigned j=0;j<u;j++) *J[j]=0; + for(unsigned b=0; b<numElement; b++){ + PElement *p = Element[b]; + unsigned tmp_rows = p->Nodes(); + for(unsigned i=0; i<tmp_rows; i++){ + unsigned nd = Node_From_LocalNode(b,i); + (*J[nd]) += *(p->J[i]); // если узлы были объединены, то их задающие токи складываются + } + } + } + return ret; +} +//--------------------------------------------------------------------------- +// обновляем информацию о падении напряжений в ветвях (учет нелинейных элементов) +bool PGrid::update_elements(bool force_update){ + bool ret=false; + for(unsigned i=0; i<numElement; i++){ + bool ret_i = Element[i]->update_elements(force_update); + if(ret_i) Element[i]->update_differential_resistance(); // если поменялись сопротивления, изменим значения дифференциальных сопротивлений + // у элемента. А так как сеть использует указатели на значения сопротивлений у + // объектов, то поменяются дифференциальные сопротивления и ветвей сети + ret = ret | ret_i; + } + return ret; +} +//--------------------------------------------------------------------------- +PElement* PGrid::obj_from_name(String Name){ + String obj, Child; // объект и объект который в него входит, например ОЭС.Сеть2.T2 + // зазделяем имя до первой точки + int point=Name.Pos("."); + if(point!=0){ + obj = Name.SubString(1,point-1); + Child = Name.SubString(point+1, Name.Length()-point); + }else{ + obj = Name; + Child = ""; + } + for(unsigned i=0; i<numElement;i++) + if(Element[i]->Name == obj){ // нашли объект + if(Child!="") // ищем объект который в него входит + return ((PGrid*)Element[i])->obj_from_name(Child); + else + return Element[i]; + } + return NULL; // не нашли объект с этим именем +} +/*/--------------------------------------------------------------------------- +void PGrid::calc(){ + // обновляем информацию об источника тока и ЗДС в ветвях + update_sources(); + // обновляем информацию о сопротивлении ветвей + bool elm = update_elements(); + // если изменились сопротивления элементов, то меняются уравнения состояния + if( elm ) Update_Equation(); + // на основании о токах предшествующего режима рассчитаем эдс на емкостях (начальные условия) + for(unsigned i=0; i<v; i++) + if(*C[i])*U_C[i] = *U_C[i] + *I[i]*smp/(*C[i]); + else *U_C[i]=0; + // на основании предшествующего режима рассчитаем эдс в индуктивностях (начальные условия) + for(unsigned i=0; i<v; i++) + *U_L[i] = *L[i]*(*I[i])/smp; + // на основании предшествующего режима рассчитаем дополнительную эдс во взаимоиндуктивных элементах(начальные условия) + for(unsigned int j=0; j<v; j++) + (*U_Lm[j]) = *U_Lm2[j]; + // рассчет матрицы B из уравнения A*I=B + for(unsigned i=0; i<u-1; i++) + B[i] = *J[i]; // правые части уравнений по 1 закону Кирхгофа + for(unsigned i=u-1; i<v; i++){ + B[i] = 0; + for(unsigned j=0; j<v; j++) + B[i] += (*N)[i-u+1][j]*((*E[j])+(*U_L[j])-(*U_C[j])+(*U_Lm[j])); // правые части по 2 закону Кирхгофа + } + + // расчет новых значений токов I=A*B + Multiply_Matrix( A, B, I); + + // Разность потенциалов в ветвях + for(unsigned i=0; i<v; i++){ + U[i] = (*Z[i])*(*I[i]) - (*E[i]) - (*U_L[i]) + (*U_C[i]) - (*U_Lm[i]); // Z включает падения напряжения на емк и инд, но не включает падение напряжения на взаимоинд (учтем ниже) + // падения напряжения на взаимоиндуктивностях от текущего тока + *U_Lm2[i]=0; + for(unsigned int j=0; j<v; j++) + (*U_Lm2[i]) += (*Lm[i][j])/smp * (*I[j]); + // учет этого падения напряжения + U[i] += *U_Lm2[i]; + } + // расчет потенциалов узлов + Multiply_Matrix( F, U, f); + *f[u-1]=0; // потенциал самого последнего узла == 0 +}*/ +//--------------------------------------------------------------------------- +void PGrid::calc(){ + // обновляем информацию об источника тока и ЗДС в ветвях + update_sources(); + // обновляем информацию о сопротивлении ветвей + bool elm = update_elements(); + // если изменились сопротивления элементов, то меняются уравнения состояния + if( elm ) Update_Equation(); + // на основании о токах предшествующего режима рассчитаем эдс на емкостях (начальные условия) + for(unsigned i=0; i<v; i++) + if(*C[i])*U_C[i] = *U_C[i] + smp/(*C[i])*(_I2[i] + *I[i])/2; + else *U_C[i]=0; + // на основании предшествующего режима рассчитаем эдс в индуктивностях (начальные условия) + for(unsigned i=0; i<v; i++) + *U_L[i] = *L[i]*(*I[i])/smp; + // на основании предшествующего режима рассчитаем дополнительную эдс во взаимоиндуктивных элементах(начальные условия) + for(unsigned int j=0; j<v; j++) + (*U_Lm[j]) = *U_Lm2[j]; + // на основании предшествующего режима рассчитаем ЭДС на дросселях + for(unsigned i=0; i<v; i++) + if( D[i]!=NULL ){ // ветка, в которой установлен дроссель + // магнитная ветка, на которую намотан дроссель + unsigned br = Branch_From_LocalBranch(D[i]->Obj, D[i]->MBranch); + if(br!=-1) *U_D[i] = *I[br] * D[i]->Windings / smp; + } + // рассчет матрицы B из уравнения A*I=B + for(unsigned i=0; i<u-1; i++) + B[i] = *J[i]; // правые части уравнений по 1 закону Кирхгофа + for(unsigned i=u-1; i<v; i++){ + B[i] = 0; + for(unsigned j=0; j<v; j++) + B[i] += (*N)[i-u+1][j]*( (*E[j])+(*U_L[j])-(*U_C[j])+(*U_Lm[j])+(*U_D[j]) ); // правые части по 2 закону Кирхгофа + if(*C[i]) B[i] = B[i] - smp/(*C[i])/2*(*I[i]); + } + + // сохраняем предшествующие значения тока + for(unsigned i=0; i<v;i++) + _I2[i] = *I[i]; + + // расчет новых значений токов I=A*B + Multiply_Matrix( A, B, I); + + // Разность потенциалов в ветвях + for(unsigned i=0; i<v; i++){ + U[i] = (*Z[i])*(*I[i]) - (*E[i]) - (*U_L[i]) + (*U_C[i]) - (*U_Lm[i]) - (*U_D[i]); // Z включает падения напряжения на емк, инд и дросселе, но не включает падение напряжения на взаимоинд (учтем ниже) + if(*C[i]) U[i] = U[i] + smp/(*C[i])/2*_I2[i]; + // падения напряжения на взаимоиндуктивностях от текущего тока + *U_Lm2[i]=0; + for(unsigned int j=0; j<v; j++) + (*U_Lm2[i]) += (*Lm[i][j])/smp * (*I[j]); + // учет этого падения напряжения + U[i] += *U_Lm2[i]; + // падения напряжения на дросселе от текущего тока + if(D[i]!=NULL){ + unsigned br = Branch_From_LocalBranch(D[i]->Obj, D[i]->MBranch); + U[i] += D[i]->Windings * (*I[br]) / smp; + } + } + // расчет потенциалов узлов + Multiply_Matrix( F, U, f); + *f[u-1]=0; // потенциал самого последнего узла == 0 + + /*/ выбор оптимального шага + PType d = fabs(*I[0] - _I2[0]); + if(d>0.001){ + smp = smp/2; + update_elements(true); + Update_Equation(); + } */ + /*if(d<1e-17){ + smp = smp*2; + update_elements(true); + Update_Equation(); + } */ +} +//--------------------------------------------------------------------------- +PElement* __fastcall PGrid::Unit(int Index) { return Element[Index];}; +//--------------------------------------------------------------------------- +unsigned __fastcall PGrid::num_Units(){ return numElement; } +//--------------------------------------------------------------------------- +void PGrid::Save(ostream &stream){ + // сохраняем данные базового класса + sire::Save(stream); + // число объектов + stream << numElement << " "; + // сохраняем объекты + for(unsigned i=0; i<numElement; i++) + SaveObj(Element[i], stream); + // число связей + stream << numLinks << " "; + // сохраняем информацию о связях + for(unsigned i=0; i<numLinks; i++){ + stream << Links[0+4*i] << " "; + stream << Links[1+4*i] << " "; + stream << Links[2+4*i] << " "; + stream << Links[3+4*i] << " "; + } + // сохраняем информацию о группах выводов + String outs = getOuts(); + stream << StringForSave( &outs ) << " "; +} +//--------------------------------------------------------------------------- +void PGrid::Read(istream &stream){ + // читаем данные базового класса + sire::Read(stream); + PElement **el; + unsigned *lnk; + unsigned numEl; + unsigned numLnk; + // число объектов + stream >> numEl; + el = new PElement*[numEl]; + // создаем объекты + char cname[1024]; String ClassName; + for(unsigned i=0; i<numEl; i++) + el[i] = CreateObj( stream ); + // число связей + stream >> numLnk; + lnk = new unsigned[4*numLnk]; + // сохраняем информацию о связях + for(unsigned i=0; i<numLnk; i++){ + stream >> lnk[0+4*i]; + stream >> lnk[1+4*i]; + stream >> lnk[2+4*i]; + stream >> lnk[3+4*i]; + } + // перед созданием сети применим параметры + for(unsigned i=0; i< numEl; i++ ) el[i]->accept(); + // создаем эту сеть + Link_Elements(numEl, el, numLnk, (unsigned (*)[2][2])lnk ); + // устанавливаем группы выводов + char outs[1024]; + stream >> outs; + setOuts( outs ); +} +//--------------------------------------------------------------------------- +String PGrid::ClassName(){ return "PGrid";} +//--------------------------------------------------------------------------- +String PGrid::getOuts(){ + String strOuts = ""; + for(int i=0, n=Out.Count(); i<n; i++){ + strOuts += Out[i].Name; //Out[i][0].Obj()->Name + "." + Out[i].Name; + if( (i+1)<n ) strOuts += ";"; + } + return strOuts; +} +//--------------------------------------------------------------------------- +// стороку содержащую группу выводов преобразуем в группы выводов +void PGrid::setOuts(String strOut){ + // очищаем + Out.Clear(); // список групп выводов + // очищаем группы выводов + //for(int i=0, n=X.size(); i<n; i++) delete X[i]; + //X.clear(); + // находим группы выводов + vector<String> Point; + // возможно было более одного пробела в начале + int numSpace, m; + for(numSpace=1, m=strOut.Length(); numSpace<=m; numSpace++) if(strOut[numSpace]!=' ') break; + strOut = strOut.SubString(numSpace, strOut.Length() - numSpace + 1); + int pos = strOut.Pos(";"); + while( pos ){ + Point.push_back( strOut.SubString(1,pos-1) ); + strOut = strOut.SubString(pos+1, strOut.Length()-pos); + // возможно было более одного пробела + for(numSpace=1, m=strOut.Length(); numSpace<=m; numSpace++) if(strOut[numSpace]!=' ') break; + strOut = strOut.SubString(numSpace, strOut.Length() - numSpace + 1); + pos = strOut.Pos(";"); + } + Point.push_back( strOut.SubString(1,strOut.Length()) ); + // перебираем каждую группу выводов + String obj, outName; // объект и объект который в него входит, например ОЭС.Сеть2.T2 + for(unsigned i=0, n=Point.size(); i<n; i++){ + // зазделяем имя до первой точки + int point=Point[i].Pos("."); + if(point!=0){ + obj =Point[i].SubString(1,point-1); + outName = Point[i].SubString(point+1, Point[i].Length()-point); + PElement *Obj = obj_from_name(obj); + if(Obj){ + // добавляем группу выводов этого объекта + for(unsigned j=0, m=Obj->Out.Count(); j<m; j++) + if(Obj->Out[j].Name == outName){ + set_pins( Obj, &Obj->Out[j] ); + } + } + } + } +} +//--------------------------------------------------------------------------- +void PGrid::set_pins(PElement* Obj, Pins* pins){ + // создадим группу выводов + Pins *x = new Pins( pins->Count ); + x->Name = Obj->Name + "." + pins->Name; + // создадим выводы указывающие на сеть + for(int i=0, n=pins->Count; i<n; i++){ + PPin tmp_pin; + unsigned node = Node_From_LocalNode( (*pins)[i].Obj(), (*pins)[i].Node() ); + // если такой узел найден + if(node != -1) + tmp_pin = set_pin( node ); + else{ + err(0, "PGrid: узел не найден в сети"); + tmp_pin = set_pin( Grounded_Node ); + } + (*x)[i] = tmp_pin; + } + Out.add( x ); +} +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- + + + + + + + + + +//--------------------------------------------------------------------------- +PSubGrid::PSubGrid(){ + Describe_Fields(); // опишем поля + Name = "Сеть"; +} +//--------------------------------------------------------------------------- +void PSubGrid::Describe_Fields(){ + PFieldInfo fi; + // сопротивление во включ. состоянии + fi.Name = "Группы выводов"; + fi.Type = "Pins_List"; + fi.ptr = (void*)this; + fi.Mode = ro; + Fields.push_back(fi); +} +//--------------------------------------------------------------------------- +PElement* __fastcall PSubGrid::Unit(int Index) { return Element.at(Index);}; +//--------------------------------------------------------------------------- +unsigned __fastcall PSubGrid::num_Units(){ return Element.size(); } +//--------------------------------------------------------------------------- +void PSubGrid::Save(ostream &stream){ + // сохраняем данные базового класса + sire::Save(stream); +} +//--------------------------------------------------------------------------- +void PSubGrid::Read(istream &stream){ + // читаем данные базового класса + sire::Read(stream); +} +//--------------------------------------------------------------------------- +String PSubGrid::ClassName(){ return "PSubGrid";} +//--------------------------------------------------------------------------- +String PSubGrid::getOuts(){ + String strOuts = ""; + for(int i=0, n=Out.Count(); i<n; i++){ + strOuts += Out[i][0].Obj()->Name + "." + Out[i].Name; + if( (i+1)<n ) strOuts += ";"; + } + return strOuts; +} +//--------------------------------------------------------------------------- +// стороку содержащую группу выводов преобразуем в группы выводов +void PSubGrid::setOuts(String strOut){ + // очищаем + Out.Clear(); // список групп выводов + // находим группы выводов + vector<String> Point; + // возможно было более одного пробела в начале + int numSpace, m; + for(numSpace=1, m=strOut.Length(); numSpace<=m; numSpace++) if(strOut[numSpace]!=' ') break; + strOut = strOut.SubString(numSpace, strOut.Length() - numSpace + 1); + int pos = strOut.Pos(";"); + while( pos ){ + Point.push_back( strOut.SubString(1,pos-1) ); + strOut = strOut.SubString(pos+1, strOut.Length()-pos); + // возможно было более одного пробела + for(numSpace=1, m=strOut.Length(); numSpace<=m; numSpace++) if(strOut[numSpace]!=' ') break; + strOut = strOut.SubString(numSpace, strOut.Length() - numSpace + 1); + pos = strOut.Pos(";"); + } + Point.push_back( strOut.SubString(1,strOut.Length()) ); + // перебираем каждую группу выводов + String obj, outName; // объект и объект который в него входит, например ОЭС.Сеть2.T2 + for(unsigned i=0, n=Point.size(); i<n; i++){ + // зазделяем имя до последней точки + int point=Point[i].Pos("."); + //for(int i=Point[i].Pos("."); i!=0; i=Point[i].Pos(".")) point = i; + if(point!=0){ + obj =Point[i].SubString(1,point-1); + outName = Point[i].SubString(point+1, Point[i].Length()-point); + PElement *Obj = obj_from_name(obj); + if(Obj){ + // добавляем группу выводов этого объекта + for(unsigned j=0, m=Obj->Out.Count(); j<m; j++) + if(Obj->Out[j].Name == outName) + Out.add( &Obj->Out[j] ); + } + } + } +} +//--------------------------------------------------------------------------- +PElement* PSubGrid::obj_from_name(String Name){ + String obj, Child; // объект и объект который в него входит, например ОЭС.Сеть2.T2 + // зазделяем имя до первой точки + int point=Name.Pos("."); + if(point!=0){ + obj = Name.SubString(1,point-1); + Child = Name.SubString(point+1, Name.Length()-point); + }else{ + obj = Name; + Child = ""; + } + for(unsigned i=0, n=Element.size(); i<n; i++) + if(Element[i]->Name == obj){ // нашли объект + if(Child!="") // ищем объект который в него входит + return ((PSubGrid*)Element[i])->obj_from_name(Child); + else + return Element[i]; + } + return NULL; // не нашли объект с этим именем +} +//--------------------------------------------------------------------------- +// установить описание сети +bool PSubGrid::Change( Pins_Link &InLink, vector<PSubGrid*> SubGrids ){ + // мы не являемся сетью для элементов, которые мы "забываем" + for(unsigned i=0, n=Element.size(); i<n; i++) + if(Element[i]->Grid==this) + Element[i]->Grid = NULL; + // "забудем" предшествующие элементы + Element.clear(); + // запомним связи + Internal_Links = InLink; + // запомним подсети + for(int i=0, n=SubGrids.size(); i<n; i++){ + PSubGrid *sg = SubGrids[i]; + // добавим, если элемент уже не добавлен + int i; + int n=Element.size(); + for(i=0; i<n; i++) if( Element[i]==sg ) break; + if(i==n){ + if(sg->Grid == NULL ) + sg->Grid = this; // добавляемый элемент будет относиться к этой сети + Element.push_back( sg );} + } + // запомним объекты подсети + for(int i=0, n=InLink.Number(); i<n; i++){ + PElement * A = InLink[i].First->Obj(); + PElement * B = InLink[i].Second->Obj(); + // запомним элемент А, если он не повторяющийся + int i; + int n=Element.size(); + for(i=0; i<n; i++) if( Element[i]==A ) break; + if(i==n){ + Element.push_back( A ); + // сеть видит всю аппаратуру, входящую во все его подсети + // поэтому, если какая-то подсеть сказала, что это оборудование его, + // то не перензначаем подсеть. + if(A->Grid == NULL ) + A->Grid = this; // добавляемый элемент будет относиться к этой сети + } + // запомним элемент B, если он не повторяющийся + n=Element.size(); + for(i=0; i<n; i++) if( Element[i]==B ) break; + if(i==n){ + Element.push_back( B ); + // сеть видит всю аппаратуру, входящую во все его подсети + // поэтому, если какая-то подсеть сказала, что это оборудование его, + // то не перензначаем подсеть. + if(B->Grid == NULL ) + B->Grid = this; // добавляемый элемент будет относиться к этой сети + } + } + // проверим уникальны ли имена элементов + for(unsigned i=0, n=Element.size(); i<n; i++){ + String name = Element[i]->Name; + for(unsigned j=i+1; j<n; j++) + if( name == Element[j]->Name ){ + err(0, "PSubGrid: внутри сети имена всех объектов должны быть уникальны, сеть не собрана"); + return false; + } + } + // удалим несуществующие выводы от сети + for(unsigned i=0, n=Out.Count(); i<n; i++){ + PElement *Obj = Out[i][0].Obj(); + int j, m=Element.size(); + for(j=0; j<m; j++) if(Element[j] == Obj) break; + if(j==m) // объект, на который ссылаются выводы не найден + Out.Delete( &Out[i] ); // удалим группу выводов + } + return true; +} +//--------------------------------------------------------------------------- +// возвращает все связи внутри себя. включая связи подсетей +Pins_Link PSubGrid::Links(){ + Pins_Link Link; + LinksForSubGrid( this, Link ); + return Link; +} +//--------------------------------------------------------------------------- +// рекурчивно опросим подсети +void PSubGrid::LinksForSubGrid(PSubGrid *grid, Pins_Link &Link){ + // связи объектов внутри этой сети получив их связи + Link.add( grid->Internal_Links ); + // добавим также связи объектов внутри подсетей, которые расположены внутри этой сети + for(int i=0, n=Element.size(); i<n; i++){ + PSubGrid *g = dynamic_cast<PSubGrid*>( Element[i] ); + if( g ) LinksForSubGrid( g , Link); + } +} + + + + + + + + + + + + + +tstA::tstA():PUnit(5, 4, 2),X(2){ + char _M[4][5] = {{-1, 0,-1, 0, 0}, + {+1,-1, 0, 0, 0}, + { 0,+1,+1,-1,-1}, + { 0, 0, 0, 1, 1}, + }; + char _N[2][5] = {{ 1, 1,-1, 0, 0}, + { 0, 0, 0,-1, 1}}; + M->operator =(&_M[0][0]); + N->operator =(&_N[0][0]); + /*/ должно быть задано из вне + _U_L[0]=0;_U_L[1]=0; _U_L[2]=0; + _U_C[0]=0;_U_C[1]=0; _U_C[2]=0; + _R[0]=1; _R[1]=1; _R[2]=3; + _L[0]=0.001; _L[1]=0.001; _L[2]=0; + _C[0]=0; _C[1]=0; _C[2]=0; + _E[0]=0; _E[1]=0; _E[2]=-10; + _J[0]=0; _J[1]=0; _J[2]=0;*/ + + // расчет матрицы Z + for(unsigned i=0; i<v; i++) + if(*C[i]) + *Z[i] = *R[i] + *L[i]/smp + smp/(*C[i]); + else + *Z[i] = *R[i] + *L[i]/smp; + + // установка взаимоиндуктивностей + mutual_inductance(0,1,-1*sqrt(_L[0]*_L[1])); + // установка выводов + Out.add(&X); // указатели на группы элементов + X[0] = set_pin(0); + X[1] = set_pin(1); + + /*/ моделируем магнитопровод + _Magn = new MCircuit(2,2,1); + char magn_M[2][2] ={{-1,-1}, + { 1, 1}}; + char magn_N[1][2] = { 1,-1}; + *_Magn->M = (char*)magn_M; + *_Magn->N = (char*)magn_N; + *_Magn->R[0] = *_Magn->R[1] = 1e3/2; + Magn = new PGrid(_Magn); + Magn->Make_Equation(); + + // привязываем магнитопровод к дросселю + _Magn->add_D(this, 1, 0, 1000);*/ + + magnetic_link(1,3,2); + //*R[3] = 500; *R[4]=500; + *L[4] = 2.257; + *R[4] = 709; +} +//--------------------------------------------------------------------------- +tstA::~tstA(){ +} +//--------------------------------------------------------------------------- +// обновляем информацию об источника тока и ЗДС в ветвях +bool tstA::update_sources(bool force_update){ + *E[2] = sin(100*M_PI*TIME); + return true; + } +bool tstB::update_sources(bool force_update){ return false;} +bool tstA::update_elements(bool force_update){ + // *C[1] = 6e-4 + 0.003*exp(-20*pow(fabs(*U_C[1]),4)) + //Magn->calc(); + return false; +} +bool tstB::update_elements(bool force_update){ return false;} + +//--------------------------------------------------------------------------- + +tstB::tstB():PUnit(5, 4, 2),X(2){ + char _M[5][5] = {{-1, 0, 0,-1,-1}, + {+1,-1, 0, 0, 0}, + { 0,+1,-1, 0,+1}, + { 0, 0,+1,+1, 0}}; + char _N[2][5] = {{+1,+1, 0, 0,-1}, + { 0, 0,+1,-1,+1}}; + M->operator =(&_M[0][0]); + N->operator =(&_N[0][0]); + // должно быть задано из вне + _U_L[0]=0;_U_L[1]=0; _U_L[2]=0; _U_L[3]=0; _U_L[4]=0; + _U_C[0]=0;_U_C[1]=0; _U_C[2]=0; _U_C[4]=0; _U_C[5]=0; + _R[0]=2; _R[1]=1; _R[2]=2; _R[3]=0; _R[4]=2; + _L[0]=0; _L[1]=0; _L[2]=0.002; _L[3]=0; _L[4]=0; + _C[0]=0; _C[1]=0; _C[2]=0; _C[3]=0.0001; _C[4]=0; + _E[0]=0; _E[1]=1; _E[2]=0; _E[3]=1; _E[4]=0; + _J[0]=0; _J[1]=0; _J[2]=0; _J[3]=0; + + // расчет матрицы Z + for(unsigned i=0; i<v; i++) + if(*C[i]) + *Z[i] = *R[i] + *L[i]/smp + smp/(*C[i]); + else + *Z[i] = *R[i] + *L[i]/smp; + // установка выводов + Out.add(&X); // указатели на группы элементов + X[0] = set_pin(0); + X[1] = set_pin(3); +} +//--------------------------------------------------------------------------- +void __fastcall tstB::SetR(PType value){ // установка активных сопротивлений на фазу +} +void __fastcall tstB::SetL(PType value){ // установка индуктивности фазы +} +void __fastcall tstB::SetC(PType value){ // установка умкости фазы +} +void __fastcall tstB::SetGz(PType value){ // установка активных проводимостей на землю +} +void __fastcall tstB::SetCz(PType value){ // установка емкостей на землю +} +void __fastcall tstB::SetGm(PType value){ // установка активных междуфазных проводимостей +} +void __fastcall tstB::SetCm(PType value){ // установка междуфазных емкостей +} +void __fastcall tstB::SetLm(PType value){ // установка междуфазных взаимоиндуктивностей +} +bool tstB::Mutual_Inductance(PType M_ab, PType M_bc, PType M_ca){// взаимные индуктивности между определенными фазами + return true; +} +bool tstB::Mutual_Conductance(unsigned Phase1, unsigned Phase2, PType Gm, PType Cm){ // проводимости между определенными фазами + return true; +} +bool tstB::Phase_Params(Phase phase, PType __R, PType __L, PType __C, PType Gz, PType Cz){return true;}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- + + + + + + + + + + + +/* Хранит информацию для рассчета ЭДС указанной функцией */ +//--------------------------------------------------------------------------- +void Source_Params::Change(String description){ // добавим значение + Field.clear(); + // разделяем строку по : + PType t=0; + String param = description; + int pos = param.Pos(":"); + if(pos!=0){ + Type = param.SubString(1,pos-1); + param = param.SubString(pos+1,param.Length()-pos+1); + pos = param.Pos(":"); + while(pos!=0){ + t=0; TryStrToFloat(param.SubString(1,pos-1), t); + Field.push_back(t); + param = param.SubString(pos+1,param.Length()-pos+1); + pos = param.Pos(":"); + } + t=0;TryStrToFloat(param, t); + Field.push_back(t); + } + else + Type = param; +} +//--------------------------------------------------------------------------- +String Source_Params::Get(){ + String desc = Type; + for(int j=0, m=Field.size(); j<m;j++) + desc += ":" + FloatToStr(Field[j]); + return desc; +} +//--------------------------------------------------------------------------- +void Source_Params::Save(ostream &stream){ // сохранить объект + if(Type != ""){ + String param = Get(); + stream << StringForSave( ¶m ) << " "; + } + else + stream << "no" << " "; +} +//--------------------------------------------------------------------------- +void Source_Params::Read(istream &stream){ // прочитать объект + char tmp[2048]; + String param; + stream >> tmp; // загрузили + param = tmp; + if( param!="no" ) Change(param); +} +//--------------------------------------------------------------------------- +// функция рассчета ЭДС по заданным параметрам из sourceParams +PType _Ea(PElement* obj, double &time){ + // найдем параметры рассчета ЭДС + Source_Params *sp = &((PSource*)obj)->sourceParams; + if(sp->Type == "неизменно") + return sp->Field[0]; + else if(sp->Type == "sin"){ + PType w = 2*M_PI*sp->Field[0]; + return sqrt(2)/sqrt(3)*sp->Field[1]*sin( w*time ); + } + else if (sp->Type == "нессиметрия"){ + PType w = 2*M_PI*sp->Field[0]; + return sqrt(2)/sqrt(3)*( sp->Field[1]*sin( w*time ) + + sp->Field[2]*sin( w*time ) + + sp->Field[3]*sin( w*time ) ); + } + else + return 0; +} +//--------------------------------------------------------------------------- +PType _Eb(PElement* obj, double &time){ + // найдем параметры рассчета ЭДС + Source_Params *sp = &((PSource*)obj)->sourceParams; + if(sp->Type == "неизменно") + return sp->Field[0]; + else if(sp->Type == "sin"){ + PType w = 2*M_PI*sp->Field[0]; + return sqrt(2)/sqrt(3)*sp->Field[1]*sin( w*time - 2*M_PI/3); + } + else if (sp->Type == "нессиметрия"){ + PType w = 2*M_PI*sp->Field[0]; + return sqrt(2)/sqrt(3)*( sp->Field[1]*sin( w*time - 2*M_PI/3) + + sp->Field[2]*sin( w*time + 2*M_PI/3) + + sp->Field[3]*sin( w*time ) ); + } + else + return 0; +} +//--------------------------------------------------------------------------- +PType _Ec(PElement* obj, double &time){ + // найдем параметры рассчета ЭДС + Source_Params *sp = &((PSource*)obj)->sourceParams; + if(sp->Type == "неизменно") + return sp->Field[0]; + else if(sp->Type == "sin"){ + PType w = 2*M_PI*sp->Field[0]; + return sqrt(2)/sqrt(3)*sp->Field[1]*sin( w*time + 2*M_PI/3); + } + else if (sp->Type == "нессиметрия"){ + PType w = 2*M_PI*sp->Field[0]; + return sqrt(2)/sqrt(3)*( sp->Field[1]*sin( w*time + 2*M_PI/3) + + sp->Field[2]*sin( w*time - 2*M_PI/3) + + sp->Field[3]*sin( w*time ) ); + } + else + return 0; +} + + + + + + + + +// идеальный источник бесконечной мощности (глухозаземленный) +PSource::PSource(): + PUnit(16,5,12), + X(4){ + Ea=_Ea; // функции по умолчанию для рассчета ЭДС + Eb=_Eb; + Ec=_Ec; + set_pins(); // обозначение выводов от источника + Describe_Fields(); // описываем свойства класса + // заполняем матрицы + char _M[5][16] = {{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1}, + { 0, 1, 0, 0,-1, 0, 1,-1, 0, 1,-1, 0, 0,-1, 0, 0}, + { 0, 0, 1, 0, 1,-1, 0, 1,-1, 0, 0,-1, 0, 0,-1, 0}, + { 0, 0, 0, 1, 0, 1,-1, 0, 1,-1, 0, 0,-1, 0, 0,-1}, + {-1,-1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; + *M = (char*)_M; + char _N[12][16] = {{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,-1, 1, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,-1, 1, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,-1, 0, 1, 0, 0, 0}, + { 0, 0, 0, 0, 1, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 1, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, 1, 0, 0,-1, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,-1, 0, 0}, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,-1, 0}, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,-1}, + {-1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, + {-1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0}, + {-1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0}}; + *N = (char*)_N; + Name = "G"; // имя объекта + Grounded_Node = 0; // заземляемый узел + // исходные параметры + for(int i=_N_;i<=_C_;i++){ + R_[i] = MIN; + L_[i] = 0 ; + C_[i] = 0; + Cz_[i] = 0 ; + Gz_[i] = 1/MAX; + } + for(int i=_AB_;i<=_CA_;i++){ + Cm_[i] = 0; + Gm_[i] = 1/MAX; + M_ [i] = 0 ; + } + *R[0] = MIN; // нейтраль заземлена + /*/ большие междуфазные сопротивления + *R[4] = *R[5] = *R[6] = *R[7] = *R[8] = *R[9] = *R[10] = *R[11] = *R[12] = *R[13] = *R[14] = *R[15] = MAX; + // минимальные сопротивления G (необходимы для возможности записи 2 закона Кирхгофа) + *R[0] = *R[1] = *R[2] = *R[3] = MIN;*/ +} +//--------------------------------------------------------------------------- +bool PSource::update_sources(bool force_update){ + if(Ea) *E[1] = (*Ea)(this, TIME); + else *E[1]=0; + if(Eb) *E[2] = (*Eb)(this, TIME); + else *E[2]=0; + if(Ec) *E[3] = (*Ec)(this, TIME); + else *E[3]=0; + return true; +} +//--------------------------------------------------------------------------- +/* Установка человеко-понятных выводов от устройства */ +void PSource::set_pins(){ + Out.add(&X); // указатели на группы элементов + X.Name = "X"; + X[ _N_ ] = set_pin(0); + X[ _A_ ] = set_pin(1); + X[ _B_ ] = set_pin(2); + X[ _C_ ] = set_pin(3); +} +//--------------------------------------------------------------------------- +void PSource::Describe_Fields(){ + PFieldInfo fi; + String name; + // активные сопротивления + for(int i=_N_; i<=_C_; i++){ + if(i==_N_) name = "N"; + else name = (String)((char)('A'+i-_A_)); + fi.Name = "R_[_" + name + "_]"; + fi.Type = "PType"; + fi.ptr = (void*) &R_[i]; + Fields.push_back(fi); + } + // индуктивности + for(int i=_N_; i<=_C_; i++){ + if(i==_N_) name = "N"; + else name = (String)((char)('A'+i-_A_)); + fi.Name = "L_[_" + name + "_]"; + fi.Type = "PType"; + fi.ptr = (void*) &L_[i]; + Fields.push_back(fi); + } + // емкости + for(int i=_N_; i<=_C_; i++){ + if(i==_N_) name = "N"; + else name = (String)((char)('A'+i-_A_)); + fi.Name = "C_[_" + name + "_]"; + fi.Type = "PType"; + fi.ptr = (void*) &C_[i]; + Fields.push_back(fi); + } + // взаимная индуктивность + for(int i=0; i<3; i++){ + switch(i){ + case _AB_: name = "AB"; break; + case _BC_: name = "ВС"; break; + case _CA_: name = "СА"; break; + default: name = ""; + } + fi.Name = "M_[_" + name + "_]"; + fi.Type = "PType"; + fi.ptr = (void*) &M_[i]; + Fields.push_back(fi); + } + // активная проводимость на землю + for(int i=_A_; i<=_C_; i++){ + fi.Name = "Gz_[_" + (String)((char)('A'+i-_A_)) + "_]"; + fi.Type = "PType"; + fi.ptr = (void*) &Gz_[i]; + Fields.push_back(fi); + } + // емкостная проводимость на землю + for(int i=_A_; i<=_C_; i++){ + fi.Name = "Cz_[_" + (String)((char)('A'+i-_A_)) + "_]"; + fi.Type = "PType"; + fi.ptr = (void*) &Cz_[i]; + Fields.push_back(fi); + } + // активная междуфазная проводимость + for(int i=0; i<3; i++){ + switch(i){ + case _AB_: name = "AB"; break; + case _BC_: name = "ВС"; break; + case _CA_: name = "СА"; break; + default: name = ""; + } + fi.Name = "Gm_[_"+ name +"_]"; + fi.Type = "PType"; + fi.ptr = (void*) &Gm_[i]; + Fields.push_back(fi); + } + // емкостная междуфазная проводимость + for(int i=0; i<3; i++){ + switch(i){ + case _AB_: name = "AB"; break; + case _BC_: name = "ВС"; break; + case _CA_: name = "СА"; break; + default: name = ""; + } + fi.Name = "Cm_[_"+ name +"_]"; + fi.Type = "PType"; + fi.ptr = (void*) &Cm_[i]; + Fields.push_back(fi); + } +} +/*/--------------------------------------------------------------------------- +void PSource::R_(PType value){ // установка активных сопротивлений на фазу + *R[1] = value; + *R[2] = value; + *R[3] = value; +} +void PSource::L_(PType value){ // установка индуктивности фазы + *L[1] = value; + *L[2] = value; + *L[3] = value; +} +void PSource::C_(PType value){ // установка умкости фазы + *C[1] = value; + *C[2] = value; + *C[3] = value; +} +void PSource::Gz_(PType value){ // установка активных проводимостей на землю + *R[10] = 1/value; + *R[11] = 1/value; + *R[12] = 1/value; +} +void PSource::Cz_(PType value){ // установка емкостей на землю + *C[13] = value; + *C[14] = value; + *C[15] = value; + // обнуляем активное сопротивление в этих ветвях + if(value!=0) + *R[13] = *R[14] = *R[15] = 0; + else + *R[13] = *R[14] = *R[15] = MAX; +} +void PSource::Gm_(PType value){ // установка активных междуфазных проводимостей + *R[4] = 1/value; + *R[5] = 1/value; + *R[6] = 1/value; +} +void PSource::Cm_(PType value){ // установка междуфазных емкостей + *C[7] = value; + *C[8] = value; + *C[9] = value; + // обнуляем активное сопротивление в этих ветвях + if(value!=0) + *R[7] = *R[8] = *R[9] = 0; + else + *R[7] = *R[8] = *R[9] = MAX; +} +void PSource::Lm_(PType value){ // установка междуфазных взаимоиндуктивностей + mutual_inductance(1, 2, value); + mutual_inductance(1, 3, value); + mutual_inductance(2, 3, value); +}*/ +bool PSource::Mutual_Inductance(PType M_ab, PType M_bc, PType M_ca){// взаимные индуктивности между определенными фазами + mutual_inductance(1, 2, M_ab); + mutual_inductance(2, 3, M_bc); + mutual_inductance(1, 3, M_ca); + return true; +} +bool PSource::Mutual_Conductance(unsigned Phase1, unsigned Phase2, PType Gm, PType Cm){ // проводимости между определенными фазами + PType Rm; // междуфазные сопротивления + if(Gm) Rm = 1/Gm; + else Rm = MAX; + // определяем фазу + unsigned p; + switch (Phase1 + Phase2){ + case (_A_ + _B_): p=0; break; + case (_B_ + _C_): p=1; break; + case (_C_ + _A_): p=2; break; + default: return false; + } + // установка значений + *R[4+p] = Rm; *L[4+p] = 0; *C[4+p] = 0; + if(Cm) {*C[7+p] = Cm; *R[7+p] = 0; *L[7+p] = 0;} + else {*C[7+p] = Cm; *R[7+p] =MAX; *L[7+p] = 0;} + return true; +} +bool PSource::Phase_Params(Phase phase, PType __R, PType __L, PType __C, PType Gz, PType Cz){ // параметры на 1 фазу + // определяем фазу + unsigned p; + switch (phase){ + case _A_: p=0; break; + case _B_: p=1; break; + case _C_: p=2; break; + default: return false; + } + // установка значений + *R[1+p] = __R; + *L[1+p] = __L; + *C[1+p] = __C; + if(Gz) *R[10+p] = 1/Gz; + else *R[10+p] = MAX; + if(Cz) {*C[13+p] = Cz; *R[13+p] = 0; *L[13+p] = 0;} + else {*C[13+p] = Cz; *R[13+p] =MAX; *L[13+p] = 0;} + return true; +} +//--------------------------------------------------------------------------- +bool PSource::accept(){ + bool ret = true; + // фазные параметры + for(int i=_A_; i<=_C_; i++) + ret = ret & Phase_Params((Phase) i, R_[i], L_[i], C_[i], Gz_[i], Cz_[i]); + // параметры нейтрали + *R[0] = R_[_N_]; + *L[0] = L_[_N_]; + *C[0] = C_[_N_]; + // междуфазные индуктивности + ret = ret & Mutual_Inductance(M_[_AB_], M_[_BC_], M_[_CA_]); + // междуфазные проводимости + ret = ret & Mutual_Conductance(_A_, _B_, Gm_[_AB_], Cm_[_AB_]); + ret = ret & Mutual_Conductance(_B_, _C_, Gm_[_BC_], Cm_[_BC_]); + ret = ret & Mutual_Conductance(_C_, _A_, Gm_[_CA_], Cm_[_CA_]); + update_differential_resistance(); + return ret; +} +//--------------------------------------------------------------------------- +void PSource::Save(ostream &stream){ // сохранение параметров объекта в поток + // сначала сохранится базовый класс + sire::Save(stream); + // теперь сохраняем этот класс + for(int i=0; i<4; i++){ + stream << R_[i] << " "; + stream << L_[i] << " "; + stream << C_[i] << " "; + stream << Gz_[i] << " "; + stream << Cz_[i] << " "; + } + for(int i=0; i<3; i++){ + stream << M_[i] << " "; + stream << Gm_[i] << " "; + stream << Cm_[i] << " "; + } + // сохраним параметры источников + sourceParams.Save( stream ); +} +//--------------------------------------------------------------------------- +void PSource::Read(istream &stream){ // загрузка параметров объекта из потока + // сначала читает данные базовый класс + sire::Read(stream); + // теперь читаем этот класс + for(int i=0; i<4; i++){ + stream >> R_[i]; + stream >> L_[i]; + stream >> C_[i]; + stream >> Gz_[i]; + stream >> Cz_[i]; + } + for(int i=0; i<3; i++){ + stream >> M_[i]; + stream >> Gm_[i]; + stream >> Cm_[i]; + } + // читаем параметры источников + sourceParams.Read( stream ); +} +//--------------------------------------------------------------------------- +String PSource::ClassName(){return "PSource";}; // возвращает имя класса +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- + + + + + + + + + + + + + +// Потребитель (глухозаземленный по умолчанию) +PConsumer::PConsumer(){ + Name = "Нагр"; // имя объекта + Grounded_Node = 0; // заземляемый узел + // исходные параметры + for(int i=_N_;i<=_C_;i++){ + R_[i] = MAX; // по умолчанию нагрузка не потребляет + L_[i] = 0 ; + C_[i] = 0 ; + Cz_[i] = 0 ; + Gz_[i] = 1/MAX; + } + for(int i=_AB_;i<=_CA_;i++){ + Cm_[i] = 0; + Gm_[i] = 1/MAX; + M_[i] = 0 ; + } + *R[0] = MIN; // нейтраль заземлена + /*/ большие междуфазные сопротивления + *R[4] = *R[5] = *R[6] = *R[7] = *R[8] = *R[9] = *R[10] = *R[11] = *R[12] = *R[13] = *R[14] = *R[15] = MAX; + // нагрузка заземлена (!=0 для записи 2 закона Кирхгофа для данной ветви) + *R[0] = MIN; + // по умолчанию нагрузка ничего не потребляет + *R[1] = *R[2] = *R[3] = MAX;*/ + // принимаем характеристики + accept(); +} +/*/--------------------------------------------------------------------------- +bool PConsumer::update_sources(bool force_update){ + if(Ea) *E[1] = (*Ea)(TIME); + else *E[1]=0; + if(Eb) *E[2] = (*Eb)(TIME); + else *E[2]=0; + if(Ec) *E[3] = (*Ec)(TIME); + else *E[3]=0; + return true; +}*/ +//--------------------------------------------------------------------------- +/* Установка человеко-понятных выводов от устройства / +void PConsumer::set_pins(){ + Out.add(&X); // указатели на группы элементов + X.Name = "X"; + X[ _N_ ] = set_pin(0); //, 0); + X[ _A_ ] = set_pin(1); //, 1); + X[ _B_ ] = set_pin(2); //, 2); + X[ _C_ ] = set_pin(3); //, 3); +} +//--------------------------------------------------------------------------- +void __fastcall PConsumer::SetR(PType value){ // установка активных сопротивлений на фазу + *R[1] = value; + *R[2] = value; + *R[3] = value; +} +void __fastcall PConsumer::SetL(PType value){ // установка индуктивности фазы + *L[1] = value; + *L[2] = value; + *L[3] = value; +} +void __fastcall PConsumer::SetC(PType value){ // установка умкости фазы + *C[1] = value; + *C[2] = value; + *C[3] = value; +} +void __fastcall PConsumer::SetGz(PType value){ // установка активных проводимостей на землю + *R[10] = 1/value; + *R[11] = 1/value; + *R[12] = 1/value; +} +void __fastcall PConsumer::SetCz(PType value){ // установка емкостей на землю + *C[13] = value; + *C[14] = value; + *C[15] = value; + // обнуляем активное сопротивление в этих ветвях + *R[13] = *R[14] = *R[15] = 0; +} +void __fastcall PConsumer::SetGm(PType value){ // установка активных междуфазных проводимостей + *R[4] = 1/value; + *R[5] = 1/value; + *R[6] = 1/value; +} +void __fastcall PConsumer::SetCm(PType value){ // установка междуфазных емкостей + *C[7] = value; + *C[8] = value; + *C[9] = value; + // обнуляем активное сопротивление в этих ветвях + *R[7] = *R[8] = *R[9] = 0; +} +void __fastcall PConsumer::SetLm(PType value){ // установка междуфазных взаимоиндуктивностей + mutual_inductance(1, 2, value); + mutual_inductance(1, 3, value); + mutual_inductance(2, 3, value); +} +bool PConsumer::Mutual_Inductance(PType M_ab, PType M_bc, PType M_ca){// взаимные индуктивности между определенными фазами + mutual_inductance(1, 2, M_ab); + mutual_inductance(2, 3, M_bc); + mutual_inductance(3, 1, M_ca); + return true; +} +bool PConsumer::Mutual_Conductance(unsigned Phase1, unsigned Phase2, PType Gm, PType Cm){ // проводимости между определенными фазами + PType Rm = 1/Gm; // междуфазные сопротивления + // определяем фазу + unsigned p=0; + switch (Phase1 + Phase2){ + case (_A_ + _B_): p=0; break; + case (_B_ + _C_): p=1; break; + case (_C_ + _A_): p=2; break; + default: return false; + } + // установка значений + *R[4+p] = Rm; + *C[7+p] = Cm; + return true; +} +bool PConsumer::Phase_Params(Phase phase, PType __R, PType __L, PType __C, PType Gz, PType Cz){ // параметры на 1 фазу + // определяем фазу + unsigned p=0; + switch (phase){ + case _A_: p=0; break; + case _B_: p=1; break; + case _C_: p=2; break; + default: return false; + } + // установка значений + *R[1+p] = __R; + *L[1+p] = __L; + *C[1+p] = __C; + *R[10+p] = 1/Gz; + *C[13+p] = Cz; + return true; +}*/ +//--------------------------------------------------------------------------- +/* определение параметров схемы замещения линии по данным нагрузки */ +bool PConsumer::Load(const PType P,const PType Q, const PType Unom, bool Grounding, const PType freq ){ + PType P_1 = P/3; + PType r = Unom*Unom/P_1; + PType Q_1 = Q/3; + PType l=0, c=0; + if(Q_1>0) l = Unom*Unom/(Q_1*2*M_PI*freq); + else c = Q_1/(Unom*Unom*2*M_PI*freq); + PType m=0; + if(!Grounding) // потребительль с изолированной нейтралью + *R[0] = MAX; + else + *R[0] = MIN; + // установка значений + for(int i=_A_;i<=_C_;i++){ + R_[i] = r; // по умолчанию нагрузка не потребляет + L_[i] = l ; + C_[i] = c ; + M_[i] = m ; + Cz_[i] = 0 ; + Gz_[i] = 1/MAX; + } + for(int i=_AB_;i<=_CA_;i++){ + Cm_[i] = 0; + Gm_[i] = 1/MAX; + } + /* + R_( r ); + L_( l ); + C_( c ); + Lm_( m ); + Gm_( 1/MAX ); + Cm_( 0 ); + Gz_( 1/MAX ); + Cz_( 0 ); */ + return true; +} +//--------------------------------------------------------------------------- +String PConsumer::ClassName(){return "PConsumer";}; // возвращает имя класса +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- + + + + + + + + + + + + + + + +// трансформатор однофазные без учета цепи намагничивания +PSingleTransformer ::PSingleTransformer(): + PUnit(6, 6, 1), + X1(2), X2(2){ // указаны 4, но используются только с индексами 1-3, Х1[0] == X1[_N_] не используется + set_pins(); + // заполняем матрицы + char _M[6][6] = {{-1, 0, 0,-1, 0, 0}, + { 1, 0, 0, 0, 0, 0}, + { 0,-1, 0, 0,-1, 0}, + { 0, 1, 0, 0, 0, 0}, + { 0, 0, 1, 1, 1, 1}, + { 0, 0,-1, 0, 0,-1}}; + *M = (char*)_M; + char _N[1][6] = {{0, 0,-1, 0, 0, 1}}; + *N = (char*)_N; + /* зададим трансф с коэф трансформации 1 */ + _U1 = 1; + _U2 = 1; + _S = 1; + _dPk= 0; + _Uk = 10.5; + _dPx= 0; + _Ix = 0.01; + _freq = 50; + // сопротвление утечки обмоток + *R[3] = *R[4] = MAX; + Name = "ОТр"; // имя объекта + Grounded_Node = 4; // заземляемый узел +} +//--------------------------------------------------------------------------- +void PSingleTransformer :: set_pins(){ + X1 [_N_] = set_pin(1); + X1 [_A_] = set_pin(0); + X2 [_N_] = set_pin(3); + X2 [_A_] = set_pin(2); + // имена + X1.Name = "X1"; + X2.Name = "X2"; + // добавим в список групп выводов + Out.add(&X1); + Out.add(&X2); +} +//--------------------------------------------------------------------------- +void PSingleTransformer :: Params(PType U1, PType U2, PType S, // установка параметров + PType dPk, PType Uk, + PType dPx, PType Ix, + PType freq){ + // Примем + PType Km = 1; // коэффициент магнитной связи + _Iu = 1e3; // , А выбираем ток в цепи намагничивания (магнитопроводе) + // заметил: чем больше Iu тем меньше погрешность 2 зак. Кирхгофа для цепи намагничивания + // запомним + _U1 = U1; + _U2 = U2; + _S = S; + _dPk= dPk; + _Uk = Uk; + _dPx= dPx; + _Ix = Ix; + _freq = freq; + + // козффициенты + PType k = U1/U2; // коэффициент трансформации + PType w = 2*freq*M_PI; // угловая частота + + // пошли рассчитывать + // активное сопротивление обмоток + PType R_sum = dPk * pow(U1,2) / pow(S,2); + PType R1 = 0.5 * R_sum; + PType R2 = R1 / pow(k,2); + // величина магнитной связи (при учете приближенного равенства ЭДСxx = Uxx) + PType Xm1 = U1 / _Iu ; + PType Xm2 = U2 / _Iu ; + // ток холостого хода + PType __Ix = Ix/100 * S/U1; // в Амперах + //PType Ru = (dPx - R1 * pow(__Ix,2)) / pow(_Iu,2); + // реактивные потери холостого хода + PType dQ2 = pow(__Ix*U1,2) - pow(dPx,2); + if(dQ2<0){ + err(0, "PSingleTransformer::Params(): параметры трансформатора заданы не верно.Слишком маленький ток х.х. для заданных активн. потерь х.х. Установлено новое значение тока х.х."); + __Ix = dPx/U1; + _Ix = __Ix / (S/U1) * 100; + //Ix = _Ix; + dQ2 = 0; + } + PType dQx = sqrt( dQ2 ); + PType q_xx; // угол между током и напряжением холостого хода + if(dPx) + q_xx = atan(dQx/dPx); + else + q_xx = M_PI/2; + // активное сопротивление цепи намагничивания (учет потерь) + PType Ru = __Ix * Xm1 * cos(q_xx)/_Iu; + PType X_pot = __Ix * Xm1 * sin(q_xx)/_Iu; + // реактивное сопротивление цепи намагничивания (учет потерь) + //PType X_pot = (dQx - X1 * pow(__Ix,2) - 2*Xm1*__Ix*_Iu*sin(atan(dQx/dPx))) / pow(_Iu,2); // определяет реактивные потери в магнитопроводе + // реактивное сопротивление обмоток + PType Z_sum = Uk/100 * pow(U1,2) / S; + PType X_sum2 = pow(Z_sum,2) - pow(R_sum,2); + if(X_sum2<0){ + err(0, "PSingleTransformer::Params(): параметры трансформатора заданы не верно.Слишком маленький ток Uk для заданных активн. потерь к.з. Установлено новое значение Uk"); + _Uk = R_sum * S / pow(U1,2) * 100; + //Uk = _Uk; + //Z_sum = _Uk/100 * pow(U1,2) / S; + X_sum2 = 0; + } + PType X_sum = sqrt( X_sum2 ); + PType X1 = 0.5*X_sum ; + //PType X1 = 0.5 * X_sum + Xm1*(1+k)/2; // хорош на холостой ход + PType X2 = X1 / pow(k,2); + // индуктивность в цепи намагничивания + PType Xu1 = pow(Xm1/Km,2) / X1; // оно скомпенсируется емкостью + PType Xu2 = pow(Xm2/Km,2) / X2; + PType Xu = Xu1 + Xu2; + PType X_Cu = Xu + X_pot; // необходимая емкость + /* + PType Z_sum = Uk/100 * pow(U1,2) / S; + PType X_sum2 = pow(Z_sum,2) - pow(R_sum,2); + if(X_sum2<0){ + err(0, "PSingleTransformer::Params(): параметры трансформатора заданы не верно.Слишком маленький ток Uk для заданных активн. потерь к.з. Установлено новое значение Uk"); + _Uk = R_sum * S / pow(U1,2) * 100; + Uk = _Uk; + Z_sum = _Uk/100 * pow(U1,2) / S; + X_sum2 = 0; + } + PType X_sum = sqrt( X_sum2 ); + PType Zxx = U1 / __Ix; + + Km = sqrt ( (2*Zxx - X_sum)/(2*Zxx - 0.5*X_sum) ); + + PType X1 = Zxx / (1 - 0.5*pow(Km,2)); + Xm1 = (k+1)*(X1 - X_sum/2); // на сколько домножим X1 во столько раз ток Iu будет меньше + + PType Xu = 2 * pow(Xm1,2)/pow(Km,2)/X1 ; // 2*X1 + + PType X2 = X1 / pow(k,2); + Xm2 = Xm1 / k; + + _Iu = U1 / Xm1; + PType Ru = dPx / pow(_Iu,2); + + *R[0] = R1; *L[0] = X1/w; + *R[1] = R2; *L[1] = X2/w; + *R[2] = Ru/2; *L[2] = Xu/w/2; + *R[5] = Ru/2; *L[5] = Xu/w/2; + mutual_inductance(0, 2, Xm1/w); + mutual_inductance(1, 5, Xm2/w); + */ + // устанавливаем параметры + *R[0] = R1; *L[0] = X1/w; + *R[1] = R2; *L[1] = X2/w; + *R[2] = Ru; *L[2] = Xu/w; *C[2] = 1/(X_Cu*w); + *R[5] = 0; *L[5] = 0; + //_Ru_nom = *C[2]; // запоминаем номинальное сопротивление + + mutual_inductance(0, 2, Xm1/w); + mutual_inductance(1, 2, Xm2/w); + update_differential_resistance(); +} +//--------------------------------------------------------------------------- +String PSingleTransformer::ClassName(){return "PSingleTransformer";} // возвращает имя класса + + + + + + + + +//--------------------------------------------------------------------------- +PCurve :: PCurve(){ + Y_X = NULL; + Symmetry = true; + exist = false; +} +//--------------------------------------------------------------------------- +void PCurve :: _set(PType X, PType Y){ + _X.push_back(X); + _Y.push_back(Y); + if(Y<0) Symmetry = false; + if(size() > 0) exist = true; +} +//--------------------------------------------------------------------------- +void PCurve :: clear(){ + _X.clear(); + _Y.clear(); + if(Y_X == NULL) exist = false; // аналитич кривая не задана, и ломаная удалена = График Не Задан +} +//--------------------------------------------------------------------------- +unsigned PCurve :: size(){ + int n = _X.size()-1; + return (n==-1)? 0 : n; +} +//--------------------------------------------------------------------------- +void PCurve :: Point(unsigned Index, PType &X, PType &Y){ + if( Index < _X.size() && Index < _Y.size() ){ + X = _X[Index]; + Y = _Y[Index]; + } +} +//--------------------------------------------------------------------------- +void PCurve :: func( PType (*Func)(PType&) ){ + Y_X = Func; + if(Y_X != NULL) + exist = true; + else if( size() < 1 ) // и функция обнулена и ломоной кривой нет + exist = false; +} +//--------------------------------------------------------------------------- +PType __fastcall PCurve :: X(PType _Y_){ + if (Y_X==NULL){ // если не задана кривая + int sgn = 1; + if( Symmetry ){ // кривая симметрична относительно начала координат + sgn = (_Y_>0)?1:-1; + _Y_ = sgn*_Y_; + } + PType dY, dX; + if(_Y.size() == 0) { + err(0, "PCurve::X(): кривая не задана. вернули значение -1."); + return -1;} + int n=_Y.size(); // число участков + int i; + for(i=0;i<n;i++) + if( _Y_ < _Y[i]) break; + if (i==n || i==0){ // мы попали на последний участок + err(0, "PCurve::X(): кривая не задана для искомого Y="+ FloatToStr(_Y_)+". вернули значение -1."); + return -1; + } + else{ + i--; // участок кривой намагничивания, на которой находится рабочая точка + dY = _Y[i+1] - _Y[i]; // приращение на участке + dX = _X[i+1] - _X[i]; // приращение на участке + } + // считая кривую симметричной относительно начала координат + return sgn*(_X[i] + dX/dY * (_Y_-_Y[i])); + } + else{ + // рассчет по аналитической кривой + // по условия H(B) = 0 + PType _Ymin=0, _Ymax = 1e10; + PType e=1e-3; // допустимые погрешности рассчета + PType a = _Ymin, b = _Ymax, c = _Ymin/2 + _Ymax/2; + PType Y_c; + do{ + Y_c = (*Y_X)(c); + if( (*Y_X)(a)<_Y_ && Y_c>_Y_){ + b = c; + c = (a+b)/2; + } + else if ( Y_c<_Y_ && (*Y_X)(b)>_Y_){ + a = c; + c = (a+b)/2; + } + else{ + err(0,"PCurve :: X(): Не найдено значение X по Y="+FloatToStr(_Y_)+". Не верна аналитическая функция."); + return c; + } + }while(fabs(a - b) > e || fabs(Y_c - _Y_) > e); + return c; // возвращаем значение индукции + } +} +//--------------------------------------------------------------------------- +PType __fastcall PCurve :: Y(PType _X_){ + if(Y_X==NULL){ // если не задана кривая + int sgn = 1; + if( Symmetry ){ // кривая симметрична относительно начала координат + sgn = (_X_>0)?1:-1; + _X_ = sgn*_X_; + } + PType dY, dX; + if(_Y.size() == 0) { + err(0, "PCurve::Y(): кривая не задана. вернули значение -1."); + return -1;} + int n=_X.size(); // число участков + int i; + for(i=0;i<n;i++) + if( _X_ < _X[i]) break; + if (i==n || i==0){ // мы попали на последний участок + err(0, "PCurve::Y(): кривая не задана для искомого X="+FloatToStr(_X_)+". вернули значение -1."); + return -1; + } + else{ + i--; // участок кривой намагничивания, на которой находится рабочая точка + dY = _Y[i+1] - _Y[i]; // приращение на участке + dX = _X[i+1] - _X[i]; // приращение на участке + } + // считая кривую симметричной относительно начала координат + return sgn*(_Y[i] + dY/dX * (_X_-_X[i])); + } + else{ + // рассчет по аналитической кривой + return (*Y_X)(_X_); + } +} +//--------------------------------------------------------------------------- +void PCurve::Save(ostream &stream){ // сохранение параметров объекта в поток + /* кривую заданую функцией можно сохранить как набор точек + и при загрузке получит ломанную кривую, но этот функционал не заложен */ + // сохраняем кривую намагничивания заданную ломанной + stream << _X.size() << " "; + for(int i=0, n=_X.size(); i<n; i++){ + stream << _X[i] << " "; + stream << _Y[i] << " "; + } +} +//--------------------------------------------------------------------------- +void PCurve::Read(istream &stream){ // загрузка параметров объекта из потока + // читаем кривую намагничивания заданную ломанной + int n=0; + stream >> n; + PType X, Y; + for(int i=0; i<n; i++){ + stream >> X; _X.push_back(X); + stream >> Y; _Y.push_back(Y); + } + // если ломоной кривая задана + if( size() > 0 ) exist = true; + //else exist = false; // не факт, т.к. может быть задана аналитическая функция - оставляем как есть +} + + + + + + + + + + + + + + +//--------------------------------------------------------------------------- +void MagnCurve :: set(PType F, PType I){ + _set(F,I); +} +PType __fastcall MagnCurve :: F(PType _I_){ + return X(_I_); +} +PType __fastcall MagnCurve :: I(PType _F_){ + return Y(_F_); +} +//--------------------------------------------------------------------------- +void UICurve :: set(PType I, PType U){ + _set(I,U); +} +PType __fastcall UICurve :: I(PType _U_){ + return X(_U_); +} +PType __fastcall UICurve :: U(PType _I_){ + return Y(_I_); +} + + + + + +//--------------------------------------------------------------------------- +/* Базовый класс для силовых трансформаторов */ +PTransformer::PTransformer(unsigned NumBranches, unsigned NumNodes, unsigned NumCircuit) : + PUnit(NumBranches, NumNodes, NumCircuit){ + Describe_Fields(); // опишем свойства класса + /* зададим трансф с коэф трансформации 1 */ + U1 = 1; + U2 = 1; + S = 1; + dPk= 0; + Uk = 10.5; + dPx= 0; + Ix = MIN; + freq = 50; + F_nom = 0.01; + Name = "Тр"; // имя объекта +} +//--------------------------------------------------------------------------- +void PTransformer::Describe_Fields(){ + PFieldInfo fi; + // мощность + fi.Name = "Мощность"; + fi.Type = "PType"; + fi.ptr = (void*) &S; + Fields.push_back(fi); + // первичное напряжение + fi.Name = "U1"; + fi.Type = "PType"; + fi.ptr = (void*) &U1; + Fields.push_back(fi); + // вторичное напряжение + fi.Name = "U2"; + fi.Type = "PType"; + fi.ptr = (void*) &U2; + Fields.push_back(fi); + // Напряжение Кз + fi.Name = "Напр. к.з."; + fi.Type = "PType"; + fi.ptr = (void*) &Uk; + Fields.push_back(fi); + // Потери Кз + fi.Name = "Акт.потери к.з."; + fi.Type = "PType"; + fi.ptr = (void*) &dPk; + Fields.push_back(fi); + // Ток xx + fi.Name = "Ток x.x."; + fi.Type = "PType"; + fi.ptr = (void*) &Ix; + Fields.push_back(fi); + // Потери xx + fi.Name = "Акт.потери x.x."; + fi.Type = "PType"; + fi.ptr = (void*) &dPx; + Fields.push_back(fi); + // Номинальная частота + fi.Name = "Ном.частота"; + fi.Type = "PType"; + fi.ptr = (void*) &freq; + Fields.push_back(fi); + // Номинальный поток + fi.Name = "Ном.поток"; + fi.Type = "PType"; + fi.ptr = (void*) &F_nom; + Fields.push_back(fi); +} +/*/--------------------------------------------------------------------------- +PType PTransformer :: U1() {return _U1;} // чтение значения напряжения первичнйо обмотки +PType PTransformer :: U2() {return _U2;} +PType PTransformer :: S() {return _S;} +PType PTransformer :: dPk() {return _dPk;} +PType PTransformer :: Uk() {return _Uk;} +PType PTransformer :: dPx() {return _dPx;} +PType PTransformer :: Ix() {return _Ix;} +PType PTransformer :: freq(){return _freq;} +PType PTransformer :: F_nom(){return _F_nom;} +//--------------------------------------------------------------------------- +void PTransformer :: U1(PType value) {_U1 = value;} // установка напряжения +void PTransformer :: U2(PType value) {_U2 = value;} +void PTransformer :: S(PType value) {_S = value;} +void PTransformer :: dPk(PType value) {_dPk = value;} +void PTransformer :: Uk(PType value) {_Uk = value;} +void PTransformer :: dPx(PType value) {_dPx = value;} +void PTransformer :: Ix(PType value) {_Ix = value;} +void PTransformer :: freq(PType value){_freq = value;} +void PTransformer :: F_nom(PType value){_F_nom= value;} */ +//--------------------------------------------------------------------------- +void PTransformer::Save(ostream &stream){ // сохранение параметров объекта в поток + // сначала сохранится базовый класс + sire::Save(stream); + // теперь сохраняем этот класс + stream << n1 << " "; + stream << n2 << " "; + stream << U1 << " "; + stream << U2 << " "; + stream << S << " "; + stream << dPk<< " "; + stream << Uk << " "; + stream << dPx<< " "; + stream << Ix << " "; + stream <<freq<< " "; + stream <<F_nom<< " "; +} +//--------------------------------------------------------------------------- +void PTransformer::Read(istream &stream){ // загрузка параметров объекта из потока + // сначала читает данные базовый класс + sire::Read(stream); + // теперь читаем этот класс + stream >> n1; + stream >> n2 ; + stream >> U1 ; + stream >> U2 ; + stream >> S ; + stream >> dPk; + stream >> Uk ; + stream >> dPx; + stream >> Ix ; + stream >>freq; + stream >>F_nom; +} +//--------------------------------------------------------------------------- +String PTransformer::ClassName(){return "PTransformer";}; // возвращает имя класса + + + + + + + + + +PTransformer_1::PTransformer_1() : + PTransformer(5, 5, 1), + X1(2), X2(2){ // указаны 4, но используются только с индексами 1-3, Х1[0] == X1[_N_] не используется + set_pins(); // установим выводы + Describe_Fields(); // опишем поля + // заполняем матрицы + char _M[5][5] = {{-1, 0, 0,-1, 0}, + { 1, 0, 0, 0, 0}, + { 0,-1, 0, 0,-1}, + { 0, 1, 0, 0, 0}, + { 0, 0, 0, 1, 1}}; + *M = (char*)_M; + char _N[1][5] = {{0, 0, 1, 0, 0}}; + *N = (char*)_N; + //mCurve.set(0,0); + //mCurve.set(1e3,1e6); // линейная кривая намагничивания с насыщением при грамандой индукции + //_Bnom = 1.2; // установка параметров трансформатора для данной номинальной индукции + //Params(_U1,_U2,_S,_dPk,_Uk,_dPx,_Ix,_freq); + // сопротвление утечки обмоток + *R[3] = *R[4] = MAX; + // рассчитаем параметры схемы на основе установленных данных + Name = "ОТр"; // имя объекта + Grounded_Node = 4; // заземляемый узел +} +//--------------------------------------------------------------------------- +void PTransformer_1 :: set_pins(){ + X1 [_N_] = set_pin(1); + X1 [_A_] = set_pin(0); + X2 [_N_] = set_pin(3); + X2 [_A_] = set_pin(2); + // имена + X1.Name = "X1"; + X2.Name = "X2"; + // добавим в список групп выводов + Out.add(&X1); + Out.add(&X2); +} +//--------------------------------------------------------------------------- +void PTransformer_1::Describe_Fields(){ + PFieldInfo fi; + // Кривая намагничивания + fi.Name = "I(Ф)"; + fi.Type = "PCurve"; + fi.ptr = (void*) &mCurve; + Fields.push_back(fi); +} +//--------------------------------------------------------------------------- +bool PTransformer_1 :: accept(){ + if(Ix==0) { + err(0, "PTransformer_1: ток х.х. не может быть равным нулю"); + Ix=MIN; + return false; + } + // коэффициенты + PType k = U1 / U2; // действительный коэффициент трансформации + PType w = 2*freq*M_PI; // угловая частота + + // активное сопротивление обмоток + PType R_sum = dPk * pow(U1,2) / pow(S,2); + PType R1 = 0.5 * R_sum; + PType R2 = R1 / pow(k,2); + // ток холостого хода (в Амперах) + PType __Ix = Ix/100 * S/U1; // в Амперах + // реактивные потери холостого хода + PType dQ2 = pow(__Ix*U1,2) - pow(dPx,2); + if(dQ2<0){ + err(0, "PTransformer_1::accept(): параметры трансформатора заданы не верно.Слишком маленький ток х.х. для заданных активн. потерь х.х."); + return false; + } + PType dQx = sqrt( dQ2 ); + PType q_xx; // угол между током и напряжением холостого хода + if(dPx) q_xx = atan(dQx/dPx); + else q_xx = M_PI/2; + // число витков обмоток + n1 = U1 / (w*F_nom); + n2 = n1 / k; + // сопротивление цепи намагничивания (учет потерь) + PType Zu = __Ix * n1 / F_nom; + PType Ru = Zu * sin(q_xx); + PType Xu = Zu * cos(q_xx); + // реактивное сопротивление обмоток + PType Z_sum = Uk/100 * pow(U1,2) / S; + PType X_sum2 = pow(Z_sum,2) - pow(R_sum,2); + if(X_sum2<0){ + err(0, "PTransformer_1::accept(): параметры трансформатора заданы не верно.Слишком маленький ток Uk для заданных активн. потерь к.з."); + return false; + } + PType X_sum = sqrt( X_sum2 ); + PType dX1 = X_sum / 2; // сопротивление рассеяния первичной обмотки + PType dX2 = dX1 / pow(k,2); // сопротивление рассеяния вторичной обмотки */ + + + // устанавливаем параметры + *R[0] = R1; *L[0] = dX1/w; + *R[1] = R2; *L[1] = dX2/w; + *R[2] = Ru; *L[2] = Xu/w; + magnetic_link(0,2,n1); + magnetic_link(1,2,n2); + update_differential_resistance(); // пересчитываем дифференциальные сопротивления + return true; +} +//--------------------------------------------------------------------------- +bool PTransformer_1 :: update_elements(bool force_update){ + // обновляем параметры схемы в соответствии с кривой намагничивания + if( !mCurve.exist ) // задана ли кривая намагничивания + return false; + else{ + PType Ru; + PType _F = *I[2]; // значение потока + if(!_F) return false; + PType _Ip = mCurve.I(_F); // какой должена быть мгнов. реактивная составляющая тока холостого хода + PType _U = *f[0] - *f[1]; // напряжение на обмотке + PType dRxx = pow(U1,2)/dPx; // коэф. пропорциональности между напряж на обмотке и акт сост тока хх. + PType _Ia = _U / dRxx; // мгновенное активно составл тока хх + PType _I = _Ia + _Ip; // мгнов. значение тока хх + + static PType _F_1 = 0; + PType d_F = (_F - _F_1)/smp; + Ru = (n1*_I - *L[2]*d_F)/_F; // устанавливаем активное сопротивление магнитопровода, которое влияет на потери + if(Ru<0) Ru=0; // сопротивл. не д.б. отриц. - это погрешность расчета + _F_1 = _F; + *R[2] = Ru; + return true; + } +} +//--------------------------------------------------------------------------- +void PTransformer_1 :: R1(PType value){ *R[0] = value; } +void PTransformer_1 :: L1(PType value){ *L[0] = value; } +void PTransformer_1 :: R2(PType value){ *R[1] = value; } +void PTransformer_1 :: L2(PType value){ *L[1] = value; } +void PTransformer_1 :: Gz1(PType value){ *R[3] = 1/value; } +void PTransformer_1 :: Cz1(PType value){ *C[3] = value; } +void PTransformer_1 :: Gz2(PType value){ *R[4] = 1/value; } +void PTransformer_1 :: Cz2(PType value){ *C[4] = value; } +PType PTransformer_1 :: R1() { return *R[0]; } +PType PTransformer_1 :: L1() { return *L[0]; } +PType PTransformer_1 :: R2() { return *R[1]; } +PType PTransformer_1 :: L2() { return *L[1]; } +PType PTransformer_1 :: Gz1() { return 1/(*R[3]); } +PType PTransformer_1 :: Cz1() { return *C[3]; } +PType PTransformer_1 :: Gz2() { return 1/(*R[4]); } +PType PTransformer_1 :: Cz2() { return *C[4]; } +//--------------------------------------------------------------------------- +void PTransformer_1::Save(ostream &stream){ // сохранение параметров объекта в поток + // сначала сохранится базовый класс + sire::Save(stream); + // сохраняем кривую намагничивания + mCurve.Save(stream); +} +//--------------------------------------------------------------------------- +void PTransformer_1::Read(istream &stream){ // загрузка параметров объекта из потока + // сначала читает данные базовый класс + sire::Read(stream); + // теперь читаем этот класс + // читаем кривую намагничивания + mCurve.Read(stream); +} +//--------------------------------------------------------------------------- +String PTransformer_1::ClassName(){return "PTransformer_1";}; // возвращает имя класса + + + + + + + + + + + + + + + + +// трансформатор (по умолчанию трехстрержневой) +PTransformer_3 ::PTransformer_3(): + PTransformer(23, 18, 6), + X1(4), X2(4), X1n(4), X2n(4){ // указаны 4, но используются только с индексами 1-3, Х1[0] == X1[_N_] не используется + set_pins(); // установка выводов + Describe_Fields(); // описываем поля + // заполняем матрицы + char _M[18][23] = {{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0}, + { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0}, + { 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0}, + { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1}, + { 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0}, + { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0}, + { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0}, + { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0}, + { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0,-1, 0, 0,-1, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 1, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, 0, 0,-1, 0,-1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1}}; + + *M = (char*)_M; + char _N[6][23] = {{ 0, 0, 0, 0, 0, 0, 1, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0,-1, 1, 0, 0, 0, 1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, 0,-1, 1, 0, 0, 0, 0, 1,-1, 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 1, 0}, // сопротивление в нейтрали первой обмотки + { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 1}}; // сопротивление в нейтрали второй обмотки + *N = (char*)_N; + mType = Armored; // тип магнитопровода - броневой + Winding_X1 = Winding_X2 = wStar; // схема соединения обмоток - звезда + // крайние стержни отсутствуют (имеют большое сопротивление) + *R[9] = *R[10] = MAX; + // стержни с обмотками и ярма имеют минимальное сопротивление + *R[6] = *R[7] = *R[8] = *R[11] = *R[12] = *R[13] = *R[14] = MIN; + // индуктивность стержней + *L[6] = *L[7] = *L[8] = 0.63; // Генри + // Индуктивность обмоток выводов Х1 + *L[0] = *L[2] = *L[4] = 0.25; + // индуктивность обмоток выводов Х2 (коэффициент трансформации определяется соотношением индуктивностей) + *L[1] = *L[3] = *L[5] = 0.25; + // сопротвление утечки обмоток + *R[15] = *R[16] = *R[17] = *R[18] = *R[19] = *R[20] = MAX; + // сопротивление в нетралях (раззаземлены) + *R[21] = *R[22] = MAX; // это необходимо так как еще не известно связаны ли выводы со стороны нейтрали у обмоток + // соединяем обмотки трансформатора + Link_Windings(); + Name = "Тр"; // имя объекта + Grounded_Node = 17; // заземляемый узел +} +//--------------------------------------------------------------------------- +void PTransformer_3 :: set_pins(){ + X1 [_N_] = set_pin(17); + X1 [_A_] = set_pin(0); + X1 [_B_] = set_pin(4); + X1 [_C_] = set_pin(8); + X1n[_N_] = set_pin(1);// да-да это не опечатка + X1n[_A_] = set_pin(1); + X1n[_B_] = set_pin(5); + X1n[_C_] = set_pin(9); + X2 [_N_] = set_pin(17); + X2 [_A_] = set_pin(2); + X2 [_B_] = set_pin(6); + X2 [_C_] = set_pin(10); + X2n[_N_] = set_pin(3); //да-да это не опечатка + X2n[_A_] = set_pin(3); + X2n[_B_] = set_pin(7); + X2n[_C_] = set_pin(11); + // имена + X1.Name = "X1"; + X2.Name = "X2"; + X1n.Name = "X1n"; + X2n.Name = "X2n"; + // добавим в список групп выводов + Out.add(&X1); + Out.add(&X2); + Out.add(&X1n); + Out.add(&X2n); +} +//--------------------------------------------------------------------------- +void PTransformer_3::Describe_Fields(){ + PFieldInfo fi; + // тип магнитной системы + fi.Name = "Магн.сист."; + fi.Type = "MagnCircuit_Type"; + fi.ptr = (void*) &mType; + Fields.push_back(fi); + // Схема соединения первичной обмотки + fi.Name = "Перв.обм."; + fi.Type = "Winding_Connect"; + fi.ptr = (void*) &Winding_X1; + Fields.push_back(fi); + // Схема соединения вторичной обмотки + fi.Name = "Втор.обм."; + fi.Type = "Winding_Connect"; + fi.ptr = (void*) &Winding_X2; + Fields.push_back(fi); + // Кривая намагничивания + fi.Name = "I(Ф)"; + fi.Type = "PCurve"; + fi.ptr = (void*) &mCurve; + Fields.push_back(fi); +} +//--------------------------------------------------------------------------- +void __fastcall PTransformer_3 :: R1(PType value){ // установка активных сопротивлений на фазу + *R[0] = *R[2] = *R[4] = value; +} +void __fastcall PTransformer_3 :: L1(PType value){ // установка индуктивности фазы + *L[0] = *L[2] = *L[4] = value; +} +void __fastcall PTransformer_3 :: C1(PType value){ // установка емкости фазы + *C[0] = *C[2] = *C[4] = value; +} +void __fastcall PTransformer_3 :: Gz1(PType value){ // установка активных проводимостей на землю + *R[15] = *R[17] = *R[19] = 1/value; +} +void __fastcall PTransformer_3 :: Cz1(PType value){ // установка емкостей на землю + *C[15] = *C[17] = *C[19] = value; +} +PType PTransformer_3 :: R1(Phase ph){ // установка активных сопротивлений на фазу + switch(ph){ + case _A_: return *R[0]; + case _B_: return *R[2]; + case _C_: return *R[4]; + case _N_: return *R[21]; + default: err(0,"PTransformer::R1(): не верно указана фаза"); return null; + } +} +PType PTransformer_3 :: L1(Phase ph){ // установка индуктивности фазы + switch(ph){ + case _A_: return *L[0]; + case _B_: return *L[2]; + case _C_: return *L[4]; + case _N_: return *L[21]; + default: err(0,"PTransformer::R1(): не верно указана фаза"); return null; + } +} +PType PTransformer_3 :: C1(Phase ph){ // установка емкости фазы + switch(ph){ + case _A_: return *C[0]; + case _B_: return *C[2]; + case _C_: return *C[4]; + case _N_: return *C[21]; + default: err(0,"PTransformer::R1(): не верно указана фаза"); return null; + } +} +PType PTransformer_3 :: Gz1(Phase ph){ // установка активных проводимостей на землю + switch(ph){ + case _A_: return 1/(*R[15]); + case _B_: return 1/(*R[17]); + case _C_: return 1/(*R[19]); + default: err(0,"PTransformer::R1(): не верно указана фаза"); return null; + } +} +PType PTransformer_3 :: Cz1(Phase ph){ // установка емкостей на землю + switch(ph){ + case _A_: return *C[15]; + case _B_: return *C[17]; + case _C_: return *C[19]; + default: err(0,"PTransformer::R1(): не верно указана фаза"); return null; + } +} +//--------------------------------------------------------------------------- +void __fastcall PTransformer_3 :: R2(PType value){ // установка активных сопротивлений на фазу + *R[1] = *R[3] = *R[5] = value; +} +void __fastcall PTransformer_3 :: L2(PType value){ // установка индуктивности фазы + *L[1] = *L[3] = *L[5] = value; +} +void __fastcall PTransformer_3 :: C2(PType value){ // установка емкости фазы + *C[1] = *C[3] = *C[5] = value; +} +void __fastcall PTransformer_3 :: Gz2(PType value){ // установка активных проводимостей на землю + *R[16] = *R[18] = *R[20] = 1/value; +} +void __fastcall PTransformer_3 :: Cz2(PType value){ // установка емкостей на землю + *C[16] = *C[18] = *C[20] = value; +} +PType PTransformer_3 :: R2(Phase ph){ // установка активных сопротивлений на фазу + switch(ph){ + case _A_: return *R[1]; + case _B_: return *R[3]; + case _C_: return *R[5]; + case _N_: return *R[22]; + default: err(0,"PTransformer::R1(): не верно указана фаза"); return null; + } +} +PType PTransformer_3 :: L2(Phase ph){ // установка индуктивности фазы + switch(ph){ + case _A_: return *L[1]; + case _B_: return *L[3]; + case _C_: return *L[5]; + case _N_: return *L[22]; + default: err(0,"PTransformer::R1(): не верно указана фаза"); return null; + } +} +PType PTransformer_3 :: C2(Phase ph){ // установка емкости фазы + switch(ph){ + case _A_: return *C[1]; + case _B_: return *C[3]; + case _C_: return *C[5]; + case _N_: return *C[22]; + default: err(0,"PTransformer::R1(): не верно указана фаза"); return null; + } +} +PType PTransformer_3 :: Gz2(Phase ph){ // установка активных проводимостей на землю + switch(ph){ + case _A_: return 1/(*R[16]); + case _B_: return 1/(*R[18]); + case _C_: return 1/(*R[20]); + default: err(0,"PTransformer::R1(): не верно указана фаза"); return null; + } +} +PType PTransformer_3 :: Cz2(Phase ph){ // установка емкостей на землю + switch(ph){ + case _A_: return *C[16]; + case _B_: return *C[18]; + case _C_: return *C[20]; + default: err(0,"PTransformer::R1(): не верно указана фаза"); return null; + } +} +//--------------------------------------------------------------------------- +/* Рассчитываем параметры схемы замещения */ +bool PTransformer_3 :: accept(){ + if(Ix==0) { + err(0, "PTransformer_1: ток х.х. не может быть равным нулю"); + Ix=MIN; + return false; + } + // параметры пресчитанные на фазу + PType U1_f, U2_f, S_f; // номинальные напряжения и мощность трансформатора + PType dPk_f, Uk_f; // данные КЗ + PType dPx_f, Ix_f; // данные холостого хода + // считаем обе обмотки соединенными в звезду + // потом произведем преобразование треугольника в звезду (! не забыть пересчитать число витков) + S_f = S/3; + dPx_f = dPx/3; + dPk_f = dPk/3; + U1_f = U1/sqrt(3); + U2_f = U2/sqrt(3); + + // коэффициенты + PType k = U1_f / U2_f; // действительный коэффициент трансформации + PType w = 2*freq*M_PI; // угловая частота + + // 1. Рассчет параметров на 1 фазу + // активное сопротивление обмоток + PType R_sum = dPk_f * pow(U1_f,2) / pow(S_f,2); + PType R1 = 0.5 * R_sum; + PType R2 = R1 / pow(k,2); + // ток холостого хода (в Амперах) + PType __Ix = Ix/100 * S_f/U1_f; // в Амперах + // реактивные потери холостого хода + PType dQ2_f = pow(__Ix*U1_f,2) - pow(dPx_f,2); + if(dQ2_f<0){ + err(0, "PTransformer_3::accept(): параметры трансформатора заданы не верно.Слишком маленький ток х.х. для заданных активн. потерь х.х."); + return false; + } + PType dQx_f = sqrt( dQ2_f ); + PType q_xx; // угол между током и напряжением холостого хода + if(dPx) q_xx = atan(dQx_f/dPx_f); + else q_xx = M_PI/2; + // число витков обмоток + n1 = U1_f / (w*F_nom); + n2 = n1 / k; + // сопротивление цепи намагничивания (учет потерь) + PType Zu = __Ix * n1 / F_nom; + PType Ru = Zu * sin(q_xx); + PType Xu = Zu * cos(q_xx); + // реактивное сопротивление обмоток + PType Z_sum = Uk/100 * pow(U1_f,2) / S_f; + PType X_sum2 = pow(Z_sum,2) - pow(R_sum,2); + if(X_sum2<0){ + err(0, "PTransformer_3::accept(): параметры трансформатора заданы не верно.Слишком маленький ток Uk для заданных активн. потерь к.з."); + return false; + } + PType X_sum = sqrt( X_sum2 ); + PType dX1 = X_sum / 2; // сопротивление рассеяния первичной обмотки + PType dX2 = dX1 / pow(k,2); // сопротивление рассеяния вторичной обмотки */ + // 2. пересчет обмоток + if( Winding_X1 == wTriangle ){ // если обмотка была соединены в треугольник, то пересчитываем параметры + R1 = 3*R1; + dX1 = 3*dX1; + n1 = n1 * sqrt(3); + } + if( Winding_X2 == wTriangle ){ // если обмотка была соединены в треугольник, то пересчитываем параметры + R2 = 3*R2; + dX2 = 3*dX2; + n2 = n2 * sqrt(3); + } + // 3. пересчет сопротивлений магнитной системы + PType Ru_st, Ru_ya; // магнитные сопротивления стержня и ярма + PType Xu_st, Xu_ya; + if( mType == Three_Rod ){ // если трехстержневой + Ru_st = 0.8 * Ru; + Xu_st = 0.8 * Xu; + Ru_ya = Ru_st / 8; + Xu_ya = Xu_st / 8; + *R[9] = *R[10] = MAX; // сопротивление крайних стержней + } + else if( mType == Armored ){ // если бронированная магнитная система + Ru_st = Ru / 1.223; + Xu_st = Xu / 1.223; + Ru_ya = Ru_st / 8; + Xu_ya = Xu_st / 8; + *R[9] = *R[10] = 8*Ru_st + Ru_ya;// сопротивление крайних стержней + *L[9] = *L[10] = 8*Xu_st + Xu_ya; + } + else{ + err(0,"PTransformer_3::accept(): Тип магнитной системы не известен"); + return false; + } + // устанавливаем параметры + // > первичная обмотка + *R[0] = *R[2] = *R[4] = R1; + *L[0] = *L[2] = *L[4] = dX1/w; + // > вторичная обмотка + *R[1] = *R[3] = *R[5] = R2; + *L[1] = *L[3] = *L[5] = dX2/w; + // > стержни + *R[6] = *R[7] = *R[8] = Ru_st; + *L[6] = *L[7] = *L[8] = Xu_st/w; + // > ярма + *R[11] = *R[12] = *R[13] = *R[14] = Ru_ya; + *L[11] = *L[12] = *L[13] = *L[14] = Xu_ya/w; + // > магнитная связь первичная обмотка + magnetic_link(0,6,n1); + magnetic_link(2,7,n1); + magnetic_link(4,8,n1); + // > магнитная связь вторичная обмотка + magnetic_link(1,6,n2); + magnetic_link(3,7,n2); + magnetic_link(5,8,n2); + // сборка обмоток + if(!Link_Windings()) return false; + update_differential_resistance(); // пересчитываем дифференциальные сопротивления + return true; +} +//--------------------------------------------------------------------------- +/* Пересчет сопротивления цепи намагничивания */ +bool PTransformer_3 :: update_elements(bool force_update){ + // обновляем параметры схемы в соответствии с кривой намагничивания + if( !mCurve.exist ) // задана ли кривая намагничивания + return false; + else{ + #define PT3_FST_Ru 6 // первая по номеру магнитная ветвь + #define PT3_NUM_Ru 9 // число магнитных ветвей + PType _F,Ru; // значение потока и соответствующего ему сопротивления + for(unsigned i= 0; i< PT3_NUM_Ru; i++ ){ + _F = *I[ i + PT3_FST_Ru ]; + if(_F!=0){ + Ru = n1*mCurve.I(_F)/_F; // сопротивления ветвей магнитопроводов + if(Ru>=0) *R[ i + PT3_FST_Ru ] = Ru; // установим сопротивление + } + } + return true; + /*/PType _Ip[ PT3_NUM_Ru ]; // какой должена быть мгнов. реактивная составляющая тока холостого хода + PType _U[3]; // напряжение на питающих обмотках + _U[0] = *f[0] - *f[1]; // фаза А + _U[1] = *f[4] - *f[5]; // фаза В + _U[2] = *f[8] - *f[9]; // фаза С + + PType dRxx = pow(_U1,2)/_dPx; // коэф. пропорциональности между напряж на обмотке и акт сост тока хх. = pow(_U1/sqrt(3),2) / (_dPx/3) + //PType _Ia[3]; // мгновенное активно составл тока хх + PType _I[PT3_NUM_Ru]; // мгнов. значение тока намагничивания в дросселях, намотанных на магнитную ветвь + for(unsigned i=0; i<3; i++ ) + _I[i] = _U[i]/dRxx + mCurve.I(_F[i]); // акт. и реакт составл семмируем + + PType Ru[PT3_NUM_Ru]; + for(unsigned k=0;k< PT3_NUM_Ru;k++) + if(_F[k]!=0) Ru[k] = _n1*mCurve.I(_F[k])/_F[k]; // сопротивления ветвей магнитопроводов + // устанавливаем активное сопротивление магнитопровода, которое влияет на потери + //int k; // номер обрабатываемой ветки + // стержни + //k=0; if(_F[k]!=0) Ru[k] = *R[k+PT3_FST_Ru]+(_n1*_I[k] - _n1*(*I[0]))/_F[k]; // фаза A + //k=0; if(_F[k]!=0) Ru[k] = (_n1*_I[k] - )/_F[k]; + //k=0; if(_F[k]!=0) Ru[k] = (_n1*_I[k] - *L[k+PT3_FST_Ru]*d_F[k])/_F[k]; // фаза A + //k=1; if(_F[k]!=0) Ru[k] = (_n1*_I[k] - *L[k+PT3_FST_Ru]*d_F[k])/_F[k]; // фаза B + //k=2; if(_F[k]!=0) Ru[k] = (_n1*_I[k] - *L[k+PT3_FST_Ru]*d_F[k])/_F[k]; // фаза B + /*if(mType == Armored){ // если броневой магнитопровод + k=3; if(_F[k]!=0) Ru[k] = ( 0 - (*f[13]-*f[12]) - *L[k+PT3_FST_Ru]*d_F[k])/_F[k]; // дросселя нет + k=4; if(_F[k]!=0) Ru[k] = ( 0 - (*f[17]-*f[16]) - *L[k+PT3_FST_Ru]*d_F[k])/_F[k]; + } else + Ru[3] = Ru[4] = 1e100; + // ярма + k=5; if(_F[k]!=0) Ru[k] = ( 0 - (*f[14]-*f[12]) - *L[k+PT3_FST_Ru]*d_F[k])/_F[k]; + k=6; if(_F[k]!=0) Ru[k] = ( 0 - (*f[15]-*f[13]) - *L[k+PT3_FST_Ru]*d_F[k])/_F[k]; + k=7; if(_F[k]!=0) Ru[k] = ( 0 - (*f[16]-*f[14]) - *L[k+PT3_FST_Ru]*d_F[k])/_F[k]; + k=8; if(_F[k]!=0) Ru[k] = ( 0 - (*f[17]-*f[15]) - *L[k+PT3_FST_Ru]*d_F[k])/_F[k]; + */ + } +} +//--------------------------------------------------------------------------- +bool PTransformer_3 :: Link_Windings(){ + // есть вероятность собрать несколько раз + Internal_Links.clear(); + // соединяем первичную обмотку + if( wStar == Winding_X1 ){ // в звезду + Internal_Links.add(X1n[_A_], X1n[_B_]); + Internal_Links.add(X1n[_A_], X1n[_C_]); + }else if( wTriangle == Winding_X1 ){ // в треугольник + Internal_Links.add(X1n[_A_], X1[_B_]); + Internal_Links.add(X1n[_B_], X1[_C_]); + Internal_Links.add(X1n[_C_], X1[_A_]); + }else if( wGroundedStar == Winding_X1 ){// в звезду c заземленным нулем + Internal_Links.add(X1n[_A_], X1n[_B_]); + Internal_Links.add(X1n[_A_], X1n[_C_]); + *R[21] = *L[21] = *C[21] = 0; + }else{ + err(0, "PTransformer_3::Winding_X2(): схема соединений не известна"); + return false; + } + // соединяем вторичную обмотку + if( wStar == Winding_X2 ){ // в звезду + Internal_Links.add(X2n[_A_], X2n[_B_]); + Internal_Links.add(X2n[_A_], X2n[_C_]); + }else if( wTriangle == Winding_X2 ){ // в треугольник + Internal_Links.add(X2n[_A_], X2[_B_]); + Internal_Links.add(X2n[_B_], X2[_C_]); + Internal_Links.add(X2n[_C_], X2[_A_]); + }else if( wGroundedStar == Winding_X2 ){// в звезду c заземленным нулем + Internal_Links.add(X2n[_A_], X2n[_B_]); + Internal_Links.add(X2n[_A_], X2n[_C_]); + *R[22] = *L[22] = *C[22] = 0; + }else{ + err(0, "PTransformer_3::Winding_X2(): схема соединений не известна"); + return false; + } + return true; +} +//--------------------------------------------------------------------------- +void PTransformer_3::Save(ostream &stream){ // сохранение параметров объекта в поток + // сначала сохранится базовый класс + sire::Save(stream); + // теперь сохраняем этот класс + stream << mType << " "; + stream << Winding_X1 << " "; + stream << Winding_X2 << " "; + // сохраняем кривую намагничивания + mCurve.Save(stream); +} +//--------------------------------------------------------------------------- +void PTransformer_3::Read(istream &stream){ // загрузка параметров объекта из потока + // сначала читает данные базовый класс + sire::Read(stream); + // теперь читаем этот класс + int tmp; + stream >> tmp; mType = (MagnCircuit_Type)tmp ; + stream >> tmp; Winding_X1 = (Winding_Connect) tmp; + stream >> tmp; Winding_X2 = (Winding_Connect) tmp; + // читаем кривую намагничивания + mCurve.Read(stream); +} +//--------------------------------------------------------------------------- +String PTransformer_3::ClassName(){return "PTransformer_3";}; // возвращает имя класса +//--------------------------------------------------------------------------- + + + + + + +/* Базовый класс для трансформаторов тока */ +PCurrent_Transformer::PCurrent_Transformer(unsigned NumBranches, unsigned NumNodes, unsigned NumCircuit) : + PUnit(NumBranches, NumNodes, NumCircuit){ + Describe_Fields(); // опишем свойства класса + S = 10; + n1 = 0; n2 = 0; // значение витков вычислится в accept() + I1= 100; I2= 5; + K = 0.5; d = 1; + freq = 50; + Name = "TA"; +} +//--------------------------------------------------------------------------- +void PCurrent_Transformer::Describe_Fields(){ + PFieldInfo fi; + // ном. мощность + fi.Name = "Мощность"; + fi.Type = "PType"; + fi.ptr = (void*) &S; + Fields.push_back(fi); + // первичный ток + fi.Name = "I1"; + fi.Type = "PType"; + fi.ptr = (void*) &I1; + Fields.push_back(fi); + // вторичный ток + fi.Name = "I2"; + fi.Type = "PType"; + fi.ptr = (void*) &I2; + Fields.push_back(fi); + // число витков в первичной обмотке + fi.Name = "n1"; + fi.Type = "PType"; + fi.ptr = (void*) &n1; + Fields.push_back(fi); + // число витков во вторичной обмотке + fi.Name = "n2"; + fi.Type = "PType"; + fi.ptr = (void*) &n2; + Fields.push_back(fi); + // Класс точности + fi.Name = "Класс"; + fi.Type = "PType"; + fi.ptr = (void*) &K; + Fields.push_back(fi); + // Паспортная угловая погрешность + fi.Name = "Угл.погр"; + fi.Type = "PType"; + fi.ptr = (void*) &d; + Fields.push_back(fi); + // Номинальная частота + fi.Name = "Ном.частота"; + fi.Type = "PType"; + fi.ptr = (void*) &freq; + Fields.push_back(fi); + // Кривая намагничивания + fi.Name = "I(Ф)"; + fi.Type = "PCurve"; + fi.ptr = (void*) &mCurve; + Fields.push_back(fi); +} +//--------------------------------------------------------------------------- +void PCurrent_Transformer::Save(ostream &stream){ // сохранение параметров объекта в поток + // сначала сохранится базовый класс + sire::Save(stream); + // теперь сохраняем этот класс + stream << n1 << " "; + stream << n2 << " "; + stream << I1 << " "; + stream << I2 << " "; + stream << S << " "; + stream << K << " "; + stream << d << " "; + stream <<freq<< " "; + stream <<F_nom<< " "; + // сохраняем кривую намагничивания + mCurve.Save(stream); +} +//--------------------------------------------------------------------------- +void PCurrent_Transformer::Read(istream &stream){ // загрузка параметров объекта из потока + // сначала читает данные базовый класс + sire::Read(stream); + // теперь читаем этот класс + stream >> n1 ; + stream >> n2 ; + stream >> I1 ; + stream >> I2 ; + stream >> S ; + stream >> K ; + stream >> d ; + stream >>freq; + stream >>F_nom; + // читаем кривую намагничивания + mCurve.Read(stream); +} +//--------------------------------------------------------------------------- +String PCurrent_Transformer::ClassName(){return "PCurrent_Transformer";}; // возвращает имя класса + + + + + + + +//--------------------------------------------------------------------------- +/* Модель трансформатора тока */ +PCurrent_Transformer_1 :: PCurrent_Transformer_1() : + PCurrent_Transformer(5, 5, 1), + X1(2), X2(2){ + Describe_Fields(); // опишем поля трансформатора тока + set_pins(); // опишем выводы + // заполняем матрицы + char _M[5][5] = {{-1, 0, 0,-1, 0}, + { 1, 0, 0, 0, 0}, + { 0,-1, 0, 0,-1}, + { 0, 1, 0, 0, 0}, + { 0, 0, 0, 1, 1}}; + *M = (char*)_M; + char _N[1][5] = {{0, 0, 1, 0, 0}}; + *N = (char*)_N; + //mCurve.set(0,0); + //mCurve.set(1e3,1e6); // линейная кривая намагничивания с насыщением при грамандой индукции + // рассчитаем параметры схемы на основе установленных данных + R1 = 1e-3; + L1 = 0 ; + R2 = 1e-1; + L2 = 1e-6 ; + *R[2] = MIN; // сопротивление цепи намагничивания + *R[3] = *R[4] = MAX; // сопротвление утечки обмоток + Grounded_Node = 4; // заземляемый узел +} +//--------------------------------------------------------------------------- +void PCurrent_Transformer_1 :: set_pins(){ + X1 [_N_] = set_pin(1); + X1 [_A_] = set_pin(0); + X2 [_N_] = set_pin(3); + X2 [_A_] = set_pin(2); + // имена + X1.Name = "X1"; + X2.Name = "X2"; + // добавим в список групп выводов + Out.add(&X1); + Out.add(&X2); +} +//--------------------------------------------------------------------------- +void PCurrent_Transformer_1::Describe_Fields(){ + PFieldInfo fi; + // акт. сопротивление первичной обм + fi.Name = "R1"; + fi.Type = "PType"; + fi.ptr = (void*) &R1; + Fields.push_back(fi); + // индуктивность первичной обм + fi.Name = "L1"; + fi.Type = "PType"; + fi.ptr = (void*) &L1; + Fields.push_back(fi); + // акт. сопротивление вторичной обм + fi.Name = "R2"; + fi.Type = "PType"; + fi.ptr = (void*) &R2; + Fields.push_back(fi); + // индуктивность вторичной обм + fi.Name = "L2"; + fi.Type = "PType"; + fi.ptr = (void*) &L2; + Fields.push_back(fi); +} +//--------------------------------------------------------------------------- +bool PCurrent_Transformer_1 :: accept(){ + // коэффициенты + PType k = I1 / I2; // действительный коэффициент трансформации + PType w = 2*freq*M_PI; // угловая частота + // если не заданы число обмоток + if(n1==0) n1=1; + if(n2==0) + if(n1!=0) n2=k*n1; + else {n1=1;n2=k*n1;} + + PType _d = d*M_PI/180; // переводим угловую погрешность в радианы + PType a = acos(0.8); // это косинус расчетной номинальной нагрузки + PType psi = atan(K/100/_d)-a; // угол между потоком и током намагничивания + PType _I2 = I1*n1/n2*( cos(_d)-K/100 ); // дествительный ток с учетом погрешности при номинальной загрузке + + PType E2 = S / _I2; // ЭДС во вторичном контуре при номинальной загрузке + F_nom = E2 / (w*n2); // поток, необходимый для обеспечения этого напряжения + // МДС намагничивания + PType F0 = K/100*(I1*n1)/sin(psi+a); + // сопротивление цепи намагничивания (учет потерь) + PType Zu = F0 / F_nom; + PType Ru = Zu * sin(psi); + PType Xu = Zu * cos(psi); + + // цепь намагничивания + *R[2] = Ru; *L[2] = Xu/w; + // обмотки + *R[0] = R1; *L[0] = L1; + *R[1] = R2; *L[1] = L2; + magnetic_link(0,2,n1); + magnetic_link(1,2,n2); + update_differential_resistance(); // пересчитываем дифференциальные сопротивления + return true; +} +//--------------------------------------------------------------------------- +bool PCurrent_Transformer_1:: update_elements(bool force_update){ + // обновляем параметры схемы в соответствии с кривой намагничивания + if( !mCurve.exist ) // задана ли кривая намагничивания + return false; + else{ + PType _F,Ru; // значение потока и соответствующего ему сопротивления + _F = *I[2]; + Ru = n1*mCurve.I(_F)/_F; // сопротивления ветвей магнитопроводов + if(Ru>=0) *R[2] = Ru; // установим сопротивление + return true; + } +} +//--------------------------------------------------------------------------- +void PCurrent_Transformer_1::Save(ostream &stream){ // сохранение параметров объекта в поток + // сначала сохранится базовый класс + sire::Save(stream); + // теперь сохраняем этот класс + stream << R1 << " "; + stream << R2 << " "; + stream << L1 << " "; + stream << L2 << " "; +} +//--------------------------------------------------------------------------- +void PCurrent_Transformer_1::Read(istream &stream){ // загрузка параметров объекта из потока + // сначала читает данные базовый класс + sire::Read(stream); + // теперь читаем этот класс + stream >> R1 ; + stream >> R2 ; + stream >> L1 ; + stream >> L2 ; +} +//--------------------------------------------------------------------------- +String PCurrent_Transformer_1::ClassName(){return "PCurrent_Transformer_1";}; // возвращает имя класса + + + + + + + +//--------------------------------------------------------------------------- +/* Выключатель трехфазный */ +PBreaker::PBreaker(): + PUnit(9, 7, 3), + X1(4), X2(4){ + //установим выводы + set_pins(); + // опишем свойства класса + Describe_Fields(); + // заполняем матрицы + char _M[7][9] = {{ 0, 0, 0, 1, 1, 1, 1, 1, 1}, + {-1, 0, 0,-1, 0, 0, 0, 0, 0}, + { 1, 0, 0, 0,-1, 0, 0, 0, 0}, + { 0,-1, 0, 0, 0,-1, 0, 0, 0}, + { 0, 1, 0, 0, 0, 0,-1, 0, 0}, + { 0, 0,-1, 0, 0, 0, 0,-1, 0}, + { 0, 0, 1, 0, 0, 0, 0, 0,-1}}; + *M = (char*)_M; + char _N[3][9] = {{ 1, 0, 0,-1, 1, 0, 0, 0, 0}, + { 0, 1, 0, 0, 0,-1, 1, 0, 0}, + { 0, 0, 1, 0, 0, 0, 0,-1, 1}}; + *N = (char*)_N; + // максимальное сопротивление в выключенном состоянии + Rmax = MAX; + // сопротивление во включенном состоянии + Rmin = MIN; + // по умолчанию выключен + IsOn = true; + *R[0] = *R[1] = *R[2] = Rmin; + // проводимости на землю максимальны + *R[3] = *R[4] = *R[5] = *R[6] = *R[7] = *R[8] = MAX; + // состояниие отключения (включения) + for(int i=0; i<4;i++){ + T_on[i] = 0; // фаза не в состоянии включения + T_off[i] = 0; // фаза не в состоянии выключения + } + t_on = 0.2; // собственное время включения + t_off = 0.05; // собственное время отключения + t_full_off = 0.08; // полное время отключения + Name = "Q"; +} +//--------------------------------------------------------------------------- +void PBreaker :: set_pins(){ + X1 [_N_] = set_pin(0); + X1 [_A_] = set_pin(1); + X1 [_B_] = set_pin(3); + X1 [_C_] = set_pin(5); + X2 [_N_] = set_pin(0); + X2 [_A_] = set_pin(2); + X2 [_B_] = set_pin(4); + X2 [_C_] = set_pin(6); + // имена + X1.Name = "X1"; + X2.Name = "X2"; + // добавим в список групп выводов + Out.add(&X1); + Out.add(&X2); +} +//--------------------------------------------------------------------------- +void PBreaker::Describe_Fields(){ + PFieldInfo fi; + // сопротивление во включ. состоянии + fi.Name = "Сопрот. вкл"; + fi.Type = "PType"; + fi.ptr = (void*) &Rmin; + Fields.push_back(fi); + // сопротивление в отлюч. состоянии + fi.Name = "Сопрот. откл"; + fi.Type = "PType"; + fi.ptr = (void*) &Rmax; + Fields.push_back(fi); + // собственное время включения + fi.Name = "Время вкл"; + fi.Type = "PType"; + fi.ptr = (void*) &t_on; + Fields.push_back(fi); + // собственное время отключения + fi.Name = "Собст.вр. откл"; + fi.Type = "PType"; + fi.ptr = (void*) &t_off; + Fields.push_back(fi); + // полное время отключения + fi.Name = "Полн.вр. откл"; + fi.Type = "PType"; + fi.ptr = (void*) &t_full_off; + Fields.push_back(fi); + // текущее сопротивление выключателя + fi.Name = "Включен"; + fi.Type = "bool"; + fi.ptr = (void*) &IsOn; + Fields.push_back(fi); +} +//--------------------------------------------------------------------------- +bool PBreaker::on(Phase phase){ + switch (phase){ + case _A_: if(!T_off[_A_] && !T_on[_A_]) {T_on[_A_] = TIME; return true;}; break; // если фаза не в состоянии выключения, то включаем + case _B_: if(!T_off[_B_] && !T_on[_B_]) {T_on[_B_] = TIME; return true;}; break; + case _C_: if(!T_off[_C_] && !T_on[_C_]) {T_on[_C_] = TIME; return true;}; break; + default: return false; + } + return false; +} +//--------------------------------------------------------------------------- +bool PBreaker::off(Phase phase){ + switch (phase){ + case _A_: if(!T_on[_A_] && !T_off[_A_]) {T_off[_A_] = TIME; return true;}; break; // если фаза не в состоянии включения, то выключаем + case _B_: if(!T_on[_B_] && !T_off[_B_]) {T_off[_B_] = TIME; return true;}; break; + case _C_: if(!T_on[_C_] && !T_off[_C_]) {T_off[_C_] = TIME; return true;}; break; + default: return false; + } + return false; +} +//--------------------------------------------------------------------------- +bool PBreaker::on(){ + bool a,b,c; + a = on(_A_); + b = on(_B_); + c = on(_C_); + return a && b && c; +} +//--------------------------------------------------------------------------- +bool PBreaker::off(){ + bool a,b,c; + a = off(_A_); + b = off(_B_); + c = off(_C_); + return a && b && c; +} +//--------------------------------------------------------------------------- +bool PBreaker::accept(){ + if(IsOn) + *R[0] = *R[1] = *R[2] = Rmin; + else + *R[0] = *R[1] = *R[2] = Rmax; + update_differential_resistance(); // пересчитываем дифференциальные сопротивления + return true; +} +//--------------------------------------------------------------------------- +bool PBreaker::update_elements(bool force_update){ + bool ret = false; + static PType I1[4]={0,0,0,0}; + for(int i=_A_; i<=_C_; i++){ + // если фаза в процессе включения + if(T_on[i]){ + // считаем, что включение происходит без дуги + if( (TIME-T_on[i])>t_on) { + *R[i-_A_]=Rmin; + T_on[i] = 0; + ret = true; + } + } + // если фаза в процессе выключения + else if(T_off[i]){ + // момент полного гашения дуги + if( (TIME-T_off[i])>t_full_off && I1[i-_A_]*(*I[i-_A_])<0 ) { + *R[i-_A_]=Rmax; + T_off[i] = 0; + ret = true; + } + // определяем момент начала расхождения контактов + else if( (TIME-T_off[i])>t_off) { + /*/ считаем, что сопротивление изменяется по линейному закону + PType dR = (Rmax-Rmin)/((t_full_off-t_off)/smp); + *R[i-_A_] += dR; + if(*R[i-_A_]>Rmax) *R[i-_A_]=Rmax; */ + // учитываем сопротивление дуги + *R[i-_A_] = fabs(11/(*I[i-_A_])); + ret = true; + } + I1[i-_A_] = *I[i-_A_]; // сохраняем текущее значение + } + } + return ret; +} +//--------------------------------------------------------------------------- +void PBreaker::Save(ostream &stream){ // сохранение параметров объекта в поток + // сначала сохранится базовый класс + sire::Save(stream); + // теперь сохраняем этот класс + stream << Rmax << " "; + stream << Rmin << " "; + stream << t_on << " "; + stream << t_off << " "; + stream << t_full_off << " "; + // сохраняем текущие сопротивления в фазах - грязный хук для интерфейса + stream << IsOn << " "; + +} +//--------------------------------------------------------------------------- +void PBreaker::Read(istream &stream){ // загрузка параметров объекта из потока + // сначала читает данные базовый класс + sire::Read(stream); + // теперь читаем этот класс + stream >> Rmax ; + stream >> Rmin ; + stream >> t_on ; + stream >> t_off ; + stream >> t_full_off ; + // читаем сопротивления в фазах - грязный хук для интерфейса + stream >> IsOn; +} +//--------------------------------------------------------------------------- +String PBreaker::ClassName(){return "PBreaker";}; // возвращает имя класса + + + + + + + + + + + + + +/* Описатель свойств классаов */ +PFieldInfo::PFieldInfo(){ + ptr = NULL; + Type = "PType"; + Mode = rw; // режим чтения записи +} +//--------------------------------------------------------------------------- +String PFieldInfo::Value(){ + if(!ptr) return ""; + if (Type == "String") + return *(String*)ptr; + else if(Type == "PType") + return FloatToStr(*(PType*)ptr); + else if(Type == "int") + return IntToStr(*(int*)ptr); + else if(Type == "MagnCircuit_Type"){ + if (*(MagnCircuit_Type*)ptr == Three_Rod) return "Three_Rod"; + else if(*(MagnCircuit_Type*)ptr == Armored) return "Armored"; + else return "Unknown"; + } + else if(Type == "Winding_Connect"){ + if (*(Winding_Connect*)ptr == wStar) return "wStar"; + else if(*(Winding_Connect*)ptr == wTriangle) return "wTriangle"; + else if(*(Winding_Connect*)ptr == wGroundedStar) return "wGroundedStar"; + else return "Unknown"; + } + else if(Type == "bool"){ + switch(*(bool*)ptr){ + case true: return "true"; + default: return "false"; + } + } + else if(Type == "PCurve"){ + String val = ""; + PCurve *obj = (PCurve*)ptr; + unsigned lineNum = obj->size(); + if( lineNum>0 ){ + // сформируем строку + for(int i=0, n=lineNum+1; i<n; i++){ + PType X=0, Y=0; + obj->Point(i, X, Y); + val += "(" + FloatToStr(X) + ";" + FloatToStr(Y) + ")"; + if( (i+1)<n ) val += " "; + } + return val; + } + else // ломаная не задана + return ""; + } + else if(Type == "Pins_List"){ + if(dynamic_cast<PGrid*>((PElement*)ptr)) return ((PGrid*)ptr)->getOuts(); + else if(dynamic_cast<PSubGrid*>((PElement*)ptr)) return ((PSubGrid*)ptr)->getOuts(); + } + return ""; +} +//--------------------------------------------------------------------------- +void PFieldInfo::Value(String newVal){ + if( Mode== ro) return; + if(!ptr) return; + if (Type == "String") + *(String*)ptr = newVal; + else if(Type == "PType"){ + if(!TryStrToFloat(newVal, *(PType*)ptr)) + err(1, "PFieldInfo: Недопустимый символ при преобразовании строки в число"); + } + else if(Type == "int"){ + if(!TryStrToInt(newVal, *(int*)ptr)) + err(1, "PFieldInfo: Недопустимый символ при преобразовании строки в число"); + } + else if(Type == "MagnCircuit_Type"){ + if ( newVal == "Three_Rod") *(MagnCircuit_Type*)ptr = Three_Rod; + else if( newVal == "Armored") *(MagnCircuit_Type*)ptr = Armored; + else *(MagnCircuit_Type*)ptr = Armored; + } + else if(Type == "Winding_Connect"){ + if ( newVal == "wStar") *(Winding_Connect*)ptr = wStar; + else if( newVal == "wTriangle") *(Winding_Connect*)ptr = wTriangle; + else if( newVal == "wGroundedStar") *(Winding_Connect*)ptr = wGroundedStar; + else *(Winding_Connect*)ptr = wStar; + } + else if(Type == "bool"){ + if ( newVal == "true") *(bool*)ptr = true; + else *(bool*)ptr = false; + } + else if(Type == "PCurve"){ + PCurve *obj = (PCurve*)ptr; + if( newVal != "" ){ + vector<String> Point; // будет содержать строки X;Y + // найдем все подстроки "X;Y", которые разделены пробелами + unsigned pos; + // возможно было более одного пробела в начале + int numSpace, m; + for(numSpace=1, m=newVal.Length(); numSpace<=m; numSpace++) if(newVal[numSpace]!=' ') break; + newVal = newVal.SubString(numSpace, newVal.Length() - numSpace + 1); + pos = newVal.Pos(" "); + while( pos ){ + Point.push_back( newVal.SubString(2,pos-3) ); + newVal = newVal.SubString(pos+1, newVal.Length()-pos); + // возможно было более одного пробела + for(numSpace=1, m=newVal.Length(); numSpace<=m; numSpace++) if(newVal[numSpace]!=' ') break; + newVal = newVal.SubString(numSpace, newVal.Length() - numSpace + 1); + pos = newVal.Pos(" "); + } + Point.push_back( newVal.SubString(2,newVal.Length()-2) ); + // вычислим значения X, Y и сохраним в объекте точку + obj->clear(); + PType X, Y; + for(int i=0, n=Point.size(); i<n; i++){ + pos = Point[i].Pos(";"); + if( pos ){ + X=0; Y=0; + TryStrToFloat( Point[i].SubString(1, pos-1) , X ); + TryStrToFloat( Point[i].SubString(pos+1, Point[i].Length()-pos), Y ); + //String f = Point[i].SubString(pos+1, Point[i].Length()-pos); + obj->_set(X, Y); + } + } + } + else // строка пустая + obj->clear(); // удаляем ломанную + } + else if(Type == "Pins_List"){ + if(dynamic_cast<PGrid*>((PElement*)ptr)) return ((PGrid*)ptr)->setOuts( newVal ); + else if(dynamic_cast<PSubGrid*>((PElement*)ptr)) return ((PSubGrid*)ptr)->setOuts( newVal ); + } +} +//--------------------------------------------------------------------------- +char *StringForSave(String *s){ + if(*s=="") *s = "_"; + for(int i=1,n=(*s).Length(); i<=n; i++ ) + if((*s)[i]==' ') + (*s)[i]='_'; + return (*s).c_str(); +} +//--------------------------------------------------------------------------- +char *StringForSave(char *s){ + for(int i=0; s[i] && i<1024; i++ ) + if(s[i]==' ') + s[i]='_'; + return s; +} +//--------------------------------------------------------------------------- +void SaveObj(PElement *Obj, ostream &stream){ + String cname = Obj->ClassName(); + stream << StringForSave(&cname) << " "; // имя класса + if(Obj->ClassName() == "PLine") stream << ((PLine*)Obj)->Cells() << " "; + // сохраняем данные объекта + Obj->Save( stream ); +} +//--------------------------------------------------------------------------- +PElement* CreateObj(istream &stream){ + PElement *Obj; + char cname[1024]; + stream >> cname; + String ClassName = cname; // имя класса + if(ClassName == "PLine"){ + unsigned cells; + stream >> cells; + if(cells<1) cells = 1; + Obj = new PLine(cells); + } + else if ( ClassName == "PSource" ) Obj = new PSource() ; + else if ( ClassName == "PConsumer" ) Obj = new PConsumer() ; + else if ( ClassName == "PTransformer_1" ) Obj = new PTransformer_1() ; + else if ( ClassName == "PTransformer_3" ) Obj = new PTransformer_3() ; + else if ( ClassName == "PCurrent_Transformer_1" )Obj = new PCurrent_Transformer_1() ; + else if ( ClassName == "PBreaker" ) Obj = new PBreaker() ; + else if ( ClassName == "PGrid" ) Obj = new PGrid() ; + else if ( ClassName == "PSubGrid" ) Obj = new PSubGrid() ; + else if ( ClassName == "NULL" ) Obj = NULL; + else Obj = NULL; + // читаем данные объекта + if(Obj) Obj->Read(stream); + return Obj; +} +//--------------------------------------------------------------------------- +// Params - параметры используемые при создании объекта +PElement* CreateObj(String ClassName, vector<void*> Params){ + PElement *Obj; + if(ClassName == "PLine" && Params.size()>0){ + int cells = *(unsigned*)Params[0]; + if( cells < 1 ) cells = 1; + Obj = new PLine(cells) ; + } + else if ( ClassName == "PSource" ) Obj = new PSource() ; + else if ( ClassName == "PConsumer" ) Obj = new PConsumer() ; + else if ( ClassName == "PTransformer_1" ) Obj = new PTransformer_1() ; + else if ( ClassName == "PTransformer_3" ) Obj = new PTransformer_3() ; + else if ( ClassName == "PCurrent_Transformer_1" )Obj = new PCurrent_Transformer_1() ; + else if ( ClassName == "PBreaker" ) Obj = new PBreaker() ; + else if ( ClassName == "PGrid" ) Obj = new PGrid() ; + else if ( ClassName == "PSubGrid" ) Obj = new PSubGrid() ; + else if ( ClassName == "NULL" ) Obj = NULL; + else Obj = NULL; + return Obj; +} + diff --git a/model.h b/model.h new file mode 100644 index 0000000..ad90091 --- /dev/null +++ b/model.h @@ -0,0 +1,811 @@ +//--------------------------------------------------------------------------- +#ifndef modelH +#define modelH +#include "Matrix.h" +#include <mem.h> +#include <math.h> +#include <vector.h> +#include <system.hpp> +#include "Dynamic_Array.h" +#include <string.h> +#include <SysUtils.hpp> +#include <fstream> + +//using namespace std; +extern double smp; // время между пересчетами цепи +extern double TIME; // текущее время +extern void err(unsigned, String); +//--------------------------------------------------------------------------- +typedef long double PType; // тип результата вычислений +//--------------------------------------------------------------------------- +class PPin; +class Pins; +class PElement; +class Pair_Pin; +class Pins_Link; +class PCurve; +class PElement; +class PGrid; +//--------------------------------------------------------------------------- +// экспортируемые функции +char *StringForSave(String *s); // преобразование строки для вывода в поток +char *StringForSave(char *s); // преобразование строки для вывода в поток +void SaveObj(PElement *Obj, ostream &stream); // сохранение объекта в поток +PElement* CreateObj(istream &stream); // создание объекта по данным из потока +PElement* CreateObj(String ClassName, vector<void*> Params);// создать модель по имени класса и переданным параметрам, которые передаются в конструктор модели +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Обозначения фаз */ +enum Phase {_N_, _A_, _B_, _C_}; +enum interPhase {_AB_, _BC_, _CA_}; +//--------------------------------------------------------------------------- +/* Типы трансформаторов */ +enum Transf_Type { +}; +//--------------------------------------------------------------------------- +/* Типы магнитопроводов */ +enum MagnCircuit_Type { + Three_Rod = 0, // трехстержневой + Armored = 1 // броневой +}; +//--------------------------------------------------------------------------- +/* Схемы соединения обмоток */ +enum Winding_Connect{ + wStar = 0, // в звезду + wTriangle = 1, // в треугольник + wGroundedStar = 2 // звезда с заземленной нейтралью +}; +//--------------------------------------------------------------------------- +/* Power Object List - содержит список всех созданных объектов */ +class PObjectList{ + vector<PElement*> Obj; + public: + ~PObjectList(); + void Add (PElement* obj); + bool Delete (PElement* obj); + PElement* Find (String Name); // возвращает объект по имени или (если объект не найден)NULL + PPin* FindPin(String Name, unsigned pin); // найти вывод объекта (из списка его выводов), заданного именем и номером узла +}; +//--------------------------------------------------------------------------- +/* Список всех групп выводов - содержит указатели на группы выводов */ +class Pins_List{ + private: + vector<Pins*> _Pins; // указатель на группы выводов + public: + void add(Pins* X); // сохранили группу выводов + Pins& operator[](unsigned int i); // вернули группу выводов + unsigned Count(); // возвращаем число групп выводов + void Clear(); // очистить список + void Delete(Pins* pins); // удалить группу выводов + +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Модель дросселя - Power Throttle*/ +class Throttle{ + public: + unsigned EBranch; // номер электрической ветви + unsigned MBranch; // номер магнитной ветви + int Windings; // число витков + PElement *Obj; // указатель на электрический объект, с которым связываем +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +enum rwMode{ro, rw}; // режим доступа +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Класс содержит информацию о свойстве объекта, который могжет быть +отредактировн */ +class PFieldInfo{ + public: + PFieldInfo(); + String Name; // имя свойства + String Description; // описание поля + String Value(); // возвращаем значение в виде строки + void Value(String newVal); // установим новое значение + String Type; // тип + rwMode Mode; // режим чтения записи {ro, rw} + void *ptr; // указатель на свойство +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Класс для указания способа соединения элементов */ +class Pins_Link{ + vector<Pair_Pin> Link; + public: + void add(PPin &First, PPin &Second); // добавить связь + void add(Pins& First, Pins& Second); // добавить пофазную связь + void add(Pins_Link obj); // добавить связи из объекта obj в этот объект + void clear(); // очистка + Pair_Pin& operator[](const unsigned int i); + //Pins_Link operator=(const Pins_Link &Obj); + unsigned __fastcall Number(); // число связей +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Базовый класс для всех моделей - Power Element*/ +class PElement{ + private: + void Describe_Fields(); // метод который описывает поля этого класса + protected: + unsigned u; // число узлов + unsigned v; // число ветвей + unsigned k; // число контуров + Dynamic_Array<PType> _Lm; // вектор взаимоиндуктивностей ветвей _Lm[] + public: + Matrix<char> *M; // первая матрица инцеденций + Matrix<char> *N; // вторая матрица инцеденций + const PType null; // переменная всегда равная нулю (нужна для создания указателя, указывающего на нулевой элемент) + const PType MIN; // минимально возможное значение (число значащих цифр для PType 15. Для погрешности в 5 знаке порядок MIN и MAX не должен отличаться побее чем в 10 раз) + const PType MAX; // максимально возможное значение (для погрешности в допустимых пределах) + unsigned Grounded_Node; // заземляемый узел (должен быть 1) + PType **R; // значения сопротивлений в ветвях *R[] + PType **L; // значения индуктивностей в ветвях *L[] + PType **C; // значения емкостей в ветвях *C[] + PType ***Lm; // массив взаимоиндуктивностей ветвей Lm[][] + Throttle **D; // магнитные связи между ветвями + PType **E; // вектор-матрица ЭДС в ветвях (E<0 если Е и ток ветви противоположны, напряжение на конденсаторе всегда q/C<0) + PType **J; // вектор-матрица задающих токов в узлах (источники тока) + PType **U_C; // напряжений на емкостях в ветвях (начальные условия) + PType **U_L; // напряжений на индуктивностях в ветвях (начальные условия) + PType **U_Lm; // напряжений на взаимоиндуктивностях в ветвях (начальные условия) + PType **U_D; // напряжения на дроселлях + PType **Z; // массив дифференциальных сопротивлений ветвей + PType **I; // указатели на рассчитанние значения токов + PType **f; // потенциалы узлов + PElement(); + PElement(unsigned NumBranches, unsigned NumNodes, unsigned NumCircuit); + PElement(PElement *obj); + ~PElement(); + virtual bool update_sources(bool force_update=false){return false;}; // обновляем мгновенные значения токов и напряжений на выходах источников (true-обновились, false-остались прежними) + virtual bool update_elements(bool force_update=false){return false;}; // учет нелинейных элементов, обновляем начения падений напряжений в ветвях (из-за изменения R,L,C) (true-обновились, false-остались прежними) + unsigned __fastcall Branches(); + unsigned __fastcall Nodes(); + unsigned __fastcall Circuit(); + //__property unsigned Branches = { read=GetBranches }; + //__property unsigned Nodes = { read=GetNodes }; + //__property unsigned Circuit = { read=GetCircuit };// матрица-вектор напряжений в ветвях + PPin set_pin(unsigned Node); // установка узла в качестве вывода + String Name; // имя объекта + void update_differential_resistance(); // установка дифференциальных сопротивлений в ветвяx + virtual void mutual_inductance(unsigned branch_1, unsigned branch_2, const PType &value); // установка взаимной индуктивности + virtual void magnetic_link(unsigned Electric_Branch, unsigned Magnetic_Branch, unsigned Windings); // установка магнитной связи + Pins_List Out; // список групп выводов + virtual bool accept(); // рассчитать параметры схемы замещения в соответствии с измененными исходными данными + vector<PFieldInfo> Fields; + virtual void Save(ostream &stream); // сохранение параметров объекта в поток + virtual void Read(istream &stream); // загрузка параметров объекта из потока + virtual String ClassName(); // возвращает имя класса + void* Owner; // владелец этого объекта. Он ответственен за удаление этого объекта + Pins_Link Internal_Links; // соединения внутри объекта, меняющиется в зависимости от настройки элемента + PElement* Grid; // в какую сеть входит данный элемент. Если NULL - элемент вернего уровня + String GridName(); // полное имя сети, в которую входит объект + String FullName(); // имя объекта с учетом всех подсетей, в которые он входит +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Класс предоставляющий доступ к выводам от блоков - Power Pin*/ +class PPin{ + private: + friend PPin PElement::set_pin(unsigned Node); // установка узла и ветки в качестве вывода + protected: + PElement* obj; // к какому элементу относимся + unsigned node; // номер выходного узла + //unsigned branch; // номер выходной ветки + public: + PElement* __fastcall Obj(); + unsigned __fastcall Node(); + //__property unsigned Branch = { read=GetBranch }; + PType __fastcall f(); // потенциал + PType __fastcall I(); // выходной ток + void Save(ostream &stream); // сохранить информацию о выводе + void Read(istream &stream); // прочитать информацию о выводе +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Пара выводов */ +class Pair_Pin{ + public: + PPin* First; + PPin* Second; +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Группа выводов - содержит объекты-выводы */ +class Pins{ + private: + PPin* _Pin; // массив выводов + public: + Pins(unsigned Number); + Pins(Pins& obj); + const unsigned Count; + PPin& operator[](unsigned int i); + Pins operator=(Pins &op2); + ~Pins(); + String Name; +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Класс на основе которого выводятся классы КОНЕЧНЫХ (более не разложимых на части) силовых установок */ +class PUnit : public PElement{ + private: + typedef PElement sire; // определяем из какого класса выведены + void Describe_Fields(); // метод который описывает поля этого класса + protected: + PType *_R; // значения сопротивлений в ветвях + PType *_L; // значения индуктивностей в ветвях + PType *_C; // значения емкостей в ветвях + PType *_E; // вектор-матрица ЭДС в ветвях (E<0 если Е и ток ветви противоположны, напряжение на конденсаторе всегда q/C<0) + PType *_J; // вектор-матрица задающих токов в узлах (источники тока) + PType *_U_C; // напряжений на емкостях в ветвях (начальные условия) + PType *_U_L; // напряжений на индуктивностях в ветвях (начальные условия) + PType *_U_Lm; // напряжений на обузловленные взаимоиндуктивностями в ветвях (начальные условия) + PType *_U_D; // напряжения на дроселлях + PType *_Z; // массив дифференциальных сопротивлений + PType *_I; // расчитанные значения токов + PType *_f; // потенциалы узлов + ~PUnit(); + PUnit(PUnit *obj); + PUnit(unsigned NumBranches, unsigned NumNodes, unsigned NumCircuit); + public: + // взаимные индуктивности между определенными фазами + //virtual bool Mutual_Inductance(PType M_ab, PType M_bc, PType M_ca)=0; + // проводимости между определенными фазами + //virtual bool Mutual_Conductance(unsigned Phase1, unsigned Phase2, PType Gm, PType Cm) = 0; + // параметры на 1 фазу + //virtual bool Phase_Params(Phase phase, PType __R, PType __L, PType __C, PType Gz, PType Cz) = 0; + //Pins_Link Internal_Links; // соединения внутри объекта, меняющиется в зависимости от настройки элемента + virtual String ClassName(); // возвращает имя класса +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Модель линии электропередач - Transmission Power Line */ +class PLine: public PUnit{ + private: + typedef PUnit sire; // определяем из какого класса выведены + unsigned z; // число звеньев в модели + void set_pins(); // установка соответствия внутренней нумерации ветвей И человекопонятной нумерацией + void Describe_Fields(); // метод который описывает поля этого класса + Pins* GetPins_Group(unsigned Index); // возврат указателя на группу выводов + /*void setR_ (PType value); // установка активных сопротивлений на фазу + void setL_ (PType value); // установка индуктивности фазы + void setC_ (PType value); // установка умкости фазы + void setGz_(PType value); // установка активных проводимостей на землю + void setCz_(PType value); // установка емкостей на землю + void setGm_(PType value); // установка активных междуфазных проводимостей + void setCm_(PType value); // установка междуфазных емкостей + void setLm_(PType value); // установка междуфазных взаимоиндуктивностей + // удельные параметры + void setR0 (PType value); // установка активных сопротивлений на фазу + void setL0 (PType value); // установка индуктивности фазы + void setC0 (PType value); // установка умкости фазы + void setGz0(PType value); // установка активных проводимостей на землю + void setCz0(PType value); // установка емкостей на землю + void setGm0(PType value); // установка активных междуфазных проводимостей + void setCm0(PType value); // установка междуфазных емкостей + void setLm0(PType value); // установка междуфазных взаимоиндуктивностей */ + // взаимные индуктивности между определенными фазами + bool Mutual_Inductance(PType M_ab, PType M_bc, PType M_ca); + bool Mutual_Inductance_0(PType M0_ab, PType M0_bc, PType M0_ca); + // проводимости между определенными фазами + bool Mutual_Conductance(unsigned Phase1, unsigned Phase2, PType Gm, PType Cm); + bool Mutual_Conductance_0(Phase Phase1, Phase Phase2, PType Gm0, PType Cm0); + // параметры на 1 фазу + bool Phase_Params(Phase phase, PType __R, PType __L, PType __C, PType Gz, PType Cz); + bool Phase_Params_0(Phase phase, PType L0, PType R0, PType Gz0, PType Cz0); + public: + Pins X1; // выводы 1ого конца линии (1 группа выводов) + Pins X2; // выводы 2ого конца линии (2 группа выводов) + PLine(unsigned Num_Of_Cells=1); + PLine(PLine &ob); + ~PLine(); + PLine operator=(PLine &op2); + PType length; // длинна линии + PType R0[4]; + PType L0[4]; + PType C0[4]; + PType Gz0[4]; + PType Cz0[4]; + PType Gm0[3]; + PType Cm0[3]; + PType M0[3]; + // расчет параметров по специальной методике + bool set_params(const PType _L0, const PType _R0, const PType _M0, + const PType dP_f, const PType dQ_f, const PType U_n_f, const PType U_k_f, + const PType dP, const PType dQ, const PType U_n, const PType U_k, + const PType freq=50 ); + unsigned Cells(); // возвращает число звеньев + virtual bool accept(); // рассчитать параметры схемы замещения в соответствии с измененными исходными данными + virtual void Save(ostream &stream); // сохранение параметров объекта в поток + virtual void Read(istream &stream); // загрузка параметров объекта из потока + virtual String ClassName(); // возвращает имя класса +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Хранит информацию для рассчета ЭДС указанной функцией */ +class Source_Params{ + public: + String Type; // способ рассчета + vector<PType> Field; // Параметры рассчета разбиты по символу ":" + void Change(String description); // добавим значение + String Get(); + void Save(ostream &stream); // сохранить объект + void Read(istream &stream); // прочитать объект +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +class PSource : public PUnit{ + private: + typedef PUnit sire; // определяем из какого класса выведены + void set_pins(); // установка соответствия внутренней нумерации ветвей И человекопонятной нумерацией + void Describe_Fields(); // метод который описывает поля этого класса + // взаимные индуктивности между определенными фазами + bool Mutual_Inductance(PType M_ab, PType M_bc, PType M_ca); + // проводимости между определенными фазами + bool Mutual_Conductance(unsigned Phase1, unsigned Phase2, PType Gm, PType Cm); + // параметры на 1 фазу + bool Phase_Params(Phase phase, PType __R, PType __L, PType __C, PType Gz, PType Cz); + /*/ установка параметров на все 3 фазы + void R_(PType value); // установка активных сопротивлений на фазу + void L_(PType value); // установка индуктивности фазы + void C_(PType value); // установка умкости фазы + void Gz_(PType value); // установка активных проводимостей на землю + void Cz_(PType value); // установка емкостей на землю + void Gm_(PType value); // установка активных междуфазных проводимостей + void Cm_(PType value); // установка междуфазных емкостей + void Lm_(PType value); // установка междуфазных взаимоиндуктивностей */ + public: + Pins X; // выводы генератора + PSource(); + PType (*Ea)(PElement* Sender, double &time); + PType (*Eb)(PElement* Sender, double &time); + PType (*Ec)(PElement* Sender, double &time); + Source_Params sourceParams; // информация для рассчета ЭДС + PType R_[4]; + PType L_[4]; + PType C_[4]; + PType Gz_[4]; + PType Cz_[4]; + PType Gm_[3]; + PType Cm_[3]; + PType M_ [3]; + bool update_sources(bool force_update=false); + virtual bool accept(); // рассчитать параметры схемы замещения в соответствии с измененными исходными данными + virtual void Save(ostream &stream); // сохранение параметров объекта в поток + virtual void Read(istream &stream); // загрузка параметров объекта из потока + virtual String ClassName(); // возвращает имя класса +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Потребитель - Power Consumer */ +class PConsumer : public PSource{ + private: + typedef PSource sire; // определяем из какого класса выведены + public: + PConsumer(); + bool Load(const PType P,const PType Q, const PType Unom, bool Grounding, const PType freq ); + /*private: + PType (*Ea)(double &time); + PType (*Eb)(double &time); + PType (*Ec)(double &time); + void set_pins(); // установка соответствия внутренней нумерации ветвей И человекопонятной нумерацией + void __fastcall SetR(PType value); // установка активных сопротивлений на фазу + void __fastcall SetL(PType value); // установка индуктивности фазы + void __fastcall SetC(PType value); // установка емкости фазы + void __fastcall SetGz(PType value); // установка активных проводимостей на землю + void __fastcall SetCz(PType value); // установка емкостей на землю + void __fastcall SetGm(PType value); // установка активных междуфазных проводимостей + void __fastcall SetCm(PType value); // установка междуфазных емкостей + void __fastcall SetLm(PType value); // установка междуфазных взаимоиндуктивностей + public: + Pins X; // выводы потребителя + PConsumer(); + virtual bool update_sources(bool force_update=false); + bool Load(const PType P,const PType Q, const PType Unom, bool Grounding, const PType freq ); + // установка параметров на все 3 фазы + __property PType R_ = { write=SetR }; + __property PType L_ = { write=SetL }; + __property PType C_ = { write=SetC }; + // установка параметров на все 3 маждуфазные проводимости + __property PType Gz = { write=SetGz }; + __property PType Cz = { write=SetCz }; + __property PType Gm = { write=SetGm }; + __property PType Cm = { write=SetCm }; + // установка взаимоиндуктивности на все 3 провода + __property PType Lm_ = { write=SetLm }; + // взаимные индуктивности между определенными фазами + bool Mutual_Inductance(PType M_ab, PType M_bc, PType M_ca); + // проводимости между определенными фазами + bool Mutual_Conductance(unsigned Phase1, unsigned Phase2, PType Gm, PType Cm); + // параметры на 1 фазу + bool Phase_Params(Phase phase, PType __R, PType __L, PType __C, PType Gz, PType Cz); + */ + virtual String ClassName(); // возвращает имя класса +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Класс-контейнер для задания кривых - Power curve */ +class PCurve{ + private: + vector<PType> _X; + vector<PType> _Y; + bool Symmetry; // 4 квадрант графика зеркален первому квадранту относительно начала координат + friend void PFieldInfo::Value(String newVal); // необходимо из PFieldInfo получать доступ к private членам этого класса + protected: + void _set(PType X, PType Y); + PType __fastcall X(PType _Y_); + PType __fastcall Y(PType _X_); + PType (*Y_X)(PType&); // указатель на внешнюю функцию рассчета кривой намагничивания + // в форме H=f(B) + public: + PCurve(); + void clear(); // очищаем ломанную + unsigned size(); // число участков (только если задано ломаная) + void Point(unsigned Index, PType &X, PType &Y); // вернет контрольные точки ломанной + bool exist; // кривая задана (существует)? + void func( PType (*Func)(PType&) ); // установить функцию для рассчета кривой + virtual void Save(ostream &stream); // сохранение параметров объекта в поток + virtual void Read(istream &stream); // загрузка параметров объекта из потока +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Класс-обертка для кривой намагничивания (Вебер-Амперная характеристика) - magnetization curve */ +class MagnCurve: public PCurve{ + public: + void set(PType F, PType I); + /*PType (__fastcall PCurve::* B)(PType H); // указатель на функцию поиска индукции + PType (__fastcall PCurve::* H)(PType B); // указатель на функцию поиска напряженности*/ + PType __fastcall F(PType _I_); // + PType __fastcall I(PType _F_); +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Класс-обертка для Вольт-Амперной характеристики - U, I curve */ +class UICurve: public PCurve{ + public: + void set(PType I, PType U); + PType __fastcall U(PType _I_); + PType __fastcall I(PType _U_); +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Расчетная модель однофазного трансформатора +без учета кривой намагничивания - Power Single Transformer */ +class PSingleTransformer : public PUnit{ + typedef PUnit sire; // определяем из какого класса выведены + typedef PUnit sire; // определяем из какого класса выведены + void set_pins(); + PType _U1, _U2, _S; // номинальные напряжения и мощность трансформатора + PType _dPk, _Uk; // данные КЗ + PType _dPx, _Ix; // данные холостого хода + PType _Iu; // ток цепи намагничивания на холостом ходу + PType _freq; // номинальная частота + public: + PSingleTransformer(); + Pins X1, X2; // группы выводов + void Params(PType U1, PType U2, PType S, // установка параметров + PType dPk, PType Uk, + PType dPx, PType Ix, + PType freq=50); + virtual String ClassName(); // возвращает имя класса +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Базовый класс для трансформаторов */ +class PTransformer : public PUnit{ + private: + typedef PUnit sire; // определяем из какого класса выведены + void Describe_Fields(); // метод который описывает поля этого класса + protected: + PTransformer(unsigned NumBranches, unsigned NumNodes, unsigned NumCircuit); // объект нельзя создать напрямую, т.к. конструктор protected-член + public: + PType n1, n2; // число витков обмоток + PType U1, U2, S; // номинальные напряжения и мощность трансформатора + PType dPk, Uk; // данные КЗ + PType dPx, Ix; // данные холостого хода + PType freq; // номинальная частота + PType F_nom; // магнитный поток на холостом ходу + virtual void Save(ostream &stream); // сохранение параметров объекта в поток + virtual void Read(istream &stream); // загрузка параметров объекта из потока + virtual String ClassName(); // возвращает имя класса +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Расчетная модель однофазного трансформатора +возможен учет кривой намагничивания - Power Saturable Transformer 1 phase */ +class PTransformer_1 : public PTransformer{ + typedef PTransformer sire; // определяем из какого класса выведены + void set_pins(); + void Describe_Fields(); // метод который описывает поля этого класса + public: + PTransformer_1(); + Pins X1, X2; // группы выводов + MagnCurve mCurve; // задаем кривую намагничивания + virtual bool accept(); // рассчет параметров схемы + virtual bool update_elements(bool force_update=false); + void R1(PType value); // установка активных сопротивлений на фазу + void L1(PType value); // установка сопротивление рассеивания фазы + void R2(PType value); // установка активных сопротивлений на фазу + void L2(PType value); // установка сопротивление рассеивания фазы + PType R1(); + PType L1(); // сопротивление рассеяния ! (не полное инд сопрот. обмотки, а только рассеяние) + PType R2(); + PType L2(); + void Gz1(PType value); // установка активных проводимостей на землю + void Cz1(PType value); // установка емкостей на землю + PType Gz1(); // чтение активных проводимостей на землю + PType Cz1(); // чтение емкостей на землю + void Gz2(PType value); // установка активных проводимостей на землю + void Cz2(PType value); // установка емкостей на землю + PType Gz2(); // чтение активных проводимостей на землю + PType Cz2(); // чтение емкостей на землю + virtual void Save(ostream &stream); // сохранение параметров объекта в поток + virtual void Read(istream &stream); // загрузка параметров объекта из потока + virtual String ClassName(); // возвращает имя класса +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +// Расчетная модель трансформатора - Power Transformer +class PTransformer_3 : public PTransformer{ + private: + typedef PTransformer sire; // определяем из какого класса выведены + void set_pins(); // установка соответствия внутренней нумерации ветвей И человекопонятной нумерацией + bool Link_Windings(); // сборка обмоток в звезду(треугольник) + void Describe_Fields(); // метод который описывает поля этого класса + public: + PTransformer_3(); + Pins X1, X2; // группы выводов + Pins X1n, X2n; // Выводы со стороны нейтрали + MagnCircuit_Type mType;// тип магнитопровода + MagnCurve mCurve; // задаем кривую намагничивания + virtual bool accept(); // рассчет параметров схемы + virtual bool update_elements(bool force_update=false); + Winding_Connect Winding_X1, Winding_X2; // схема соединения обмоток + // на 1 обмотку + void __fastcall R1(PType value); // установка активных сопротивлений на фазу + void __fastcall L1(PType value); // установка индуктивности фазы + void __fastcall C1(PType value); // установка емкости фазы + void __fastcall Gz1(PType value); // установка активных проводимостей на землю + void __fastcall Cz1(PType value); // установка емкостей на землю + PType R1(Phase ph); // чтение активных сопротивлений на фазу + PType L1(Phase ph); // чтение сопротивление рассеивания фазы + PType C1(Phase ph); // чтение емкости фазы + PType Gz1(Phase ph); // чтение активных проводимостей на землю + PType Cz1(Phase ph); // чтение емкостей на землю + // на 2 обмотку + void __fastcall R2(PType value); // установка активных сопротивлений на фазу + void __fastcall L2(PType value); // установка индуктивности фазы + void __fastcall C2(PType value); // установка умкости фазы + void __fastcall Gz2(PType value); // установка активных проводимостей на землю + void __fastcall Cz2(PType value); // установка емкостей на землю + PType R2(Phase ph); // чтение активных сопротивлений на фазу + PType L2(Phase ph); // чтение сопротивление рассеивания фазы + PType C2(Phase ph); // чтение емкости фазы + PType Gz2(Phase ph); // чтение активных проводимостей на землю + PType Cz2(Phase ph); // чтение емкостей на землю + virtual void Save(ostream &stream); // сохранение параметров объекта в поток + virtual void Read(istream &stream); // загрузка параметров объекта из потока + virtual String ClassName(); // возвращает имя класса +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Базовая модель трансформаторов тока +возможен учет кривой намагничивания - Power Current Transformer */ +class PCurrent_Transformer : public PUnit{ + private: + typedef PUnit sire; // определяем из какого класса выведены + void Describe_Fields(); // метод который описывает поля этого класса + protected: + PCurrent_Transformer(unsigned NumBranches, unsigned NumNodes, unsigned NumCircuit); + PType F_nom; // магнитный поток + public: + PType S; // номинальная мощность + PType I1, I2; // номинальные токи первичной и вторичной обмоток + PType n1, n2; // число витков обмоток + PType K; // класс точности, в % (токовая погрешность) + PType d; // угловая погрешность, градусы + PType freq; // номинальная частота + MagnCurve mCurve; // задаем кривую намагничивания + virtual void Save(ostream &stream); // сохранение параметров объекта в поток + virtual void Read(istream &stream); // загрузка параметров объекта из потока + virtual String ClassName(); // возвращает имя класса +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Расчетная модель однофазного трансформатора тока +возможен учет кривой намагничивания - Power Current Transformer 1 phase */ +class PCurrent_Transformer_1 : public PCurrent_Transformer{ + private: + typedef PCurrent_Transformer sire; // определяем из какого класса выведены + void set_pins(); // установка соответствия внутренней нумерации ветвей И человекопонятной нумерацией + void Describe_Fields(); // метод который описывает поля этого класса + public: + Pins X1, X2; // группы выводов + PType R1, L1; // сопротивления первичной обмотки + PType R2, L2; // сопротивления вторичной обмотки + PCurrent_Transformer_1(); + virtual bool accept(); // рассчет параметров схемы + virtual bool update_elements(bool force_update=false); + virtual void Save(ostream &stream); // сохранение параметров объекта в поток + virtual void Read(istream &stream); // загрузка параметров объекта из потока + virtual String ClassName(); // возвращает имя класса +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Трехфазный выключатель - Power Breaker */ +class PBreaker : public PUnit{ + private: + typedef PUnit sire; // определяем из какого класса выведены + void set_pins(); // установка соответствия внутренней нумерации ветвей И человекопонятной нумерацией + void Describe_Fields(); // метод который описывает поля этого класса + PType T_on[4], T_off[4];// момент подачи сигнала на включение (выключение) + public: + PType Rmax; // сопротивление в фазе в отключенном состоянии + PType Rmin; // в фазе вo включенном состоянии + PType t_on; // собственное время включения + PType t_off; // собственное время отключения + PType t_full_off; // полное время отключения + bool IsOn; // текущее состояние (true - включен) + Pins X1, X2; // выводы для выключателя + PBreaker(); + bool on(Phase phase); // включить фазу + bool off(Phase phase); // отключить фазу + bool on(); // одновременно включить все фазы + bool off(); // одновременно отключить все фазы + virtual bool accept(); // рассчет параметров схемы + virtual bool update_elements(bool force_update=false); + virtual void Save(ostream &stream); // сохранение параметров объекта в поток + virtual void Read(istream &stream); // загрузка параметров объекта из потока + virtual String ClassName(); // возвращает имя класса +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Расчетная модель подсети - Power SubGrid */ +class PSubGrid : public PElement{ + private: + typedef PElement sire; // определяем из какого класса выведены + vector<PElement*> Element; // список элементов + void Describe_Fields(); // опишем поля + void LinksForSubGrid(PSubGrid *grid, Pins_Link &Link); // векурсивный возврат связей (с учетом связей во вложенных подсетях) для указанной сети + public: + PSubGrid(); // функция-пустышка, просто обнуляет указатели. Используется в производных классах + //~SubPGrid(); + PElement* __fastcall Unit(int Index); + unsigned __fastcall num_Units(); + PElement* obj_from_name(String Name); // возвращает объект по имени + void setOuts (String strOut); // переназначение групп выводов + String getOuts(); // получение групп выводов + bool Change( Pins_Link &InLink, + vector<PSubGrid*> SubGrids); // установить описание сети на основе соединения объектов и передачи списка подсетей + virtual bool accept(){return true;}; // рассчет параметров схемы + Pins_Link Links(); // возвращает все связи внутри себя. включая связи подсетей + // (Internal_Links включает связи внутри сети без связей в подсетях этой сети) + virtual void Save(ostream &stream); // сохранение параметров объекта в поток + virtual void Read(istream &stream); // загрузка параметров объекта из потока + virtual String ClassName(); // возвращает имя класса +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Расчетная модель электрической сети - Power Grid */ +class PGrid : public PElement{ + private: + typedef PElement sire; // определяем из какого класса выведены + void Describe_Fields(); // метод который описывает поля этого класса + void set_pins(PElement* Obj, Pins* pins); // установка соответствия внутренней нумерации ветвей И человекопонятной нумерацией + PType *_J; // вектор-матрица задающих токов в узлах (источники тока) + Matrix<PType> *A; // матрица из уравнения A*I=B + PType *B; // матрица из уравнения A*I=B + Matrix<PType> *F; // Матрица для нахождения потенциалов узлов f = F*( I*Z - U_L + U_C - U_Lm ) + PElement **Element; // указатели на элементы используемые в PGrid + unsigned numElement; // число элементов + unsigned numLinks; // число связей, использованных при создании сети (сеобходимо для сохранения) + unsigned *Links; // связи, использованные при создании сети (необходимо для сохранения) + unsigned **Branch; // таблица соответствий номеров вервей в результирующей матрице и [№_блока][№_ветви] = №_ветви_результ_матрицы, переданных блоков (==-1 - нет соответствия) + unsigned **Node; // таблица соответствий номеров узлов в результирующей матрице и [№_блока][№_узла]=№_узла_результ_матрицы, переданных блоков (==-1 - нет соответствия) + PType *U; // разность потенциалов по концам ветви (учет падений напряжений и ЭДС) + PType *_U_Lm2; // падения напряжений на взаимоиндуктивнотях от текущего тока + PType **U_Lm2; // падения напряжений на взаимоиндуктивнотях от текущего тока + PType *_I2; // предшествующие значения тока + void linked_nodes(const unsigned numLink, const unsigned Link[][2][2], bool link_use[],const unsigned i_node,const unsigned obj,const unsigned node);//, unsigned &tmp); + unsigned __fastcall Node_From_LocalNode(unsigned Obj, unsigned LocalNode); + unsigned __fastcall Branch_From_LocalBranch(unsigned Obj, unsigned LocalBranch); + unsigned ObjNum_From_Object(PElement *obj); + unsigned __fastcall Node_From_LocalNode(PElement* Obj, unsigned LocalNode); + unsigned __fastcall Branch_From_LocalBranch(PElement* Obj, unsigned LocalBranch); + bool Link_Elements(unsigned num, PElement *Block[], unsigned numLink,unsigned Link[][2][2]); // создание сети из подэлементов и указания связанных узлов + void Update_Equation(); + virtual bool update_sources(bool force_update=false); + virtual bool update_elements(bool force_update=false); + bool BuildOK; // установится в false, если сеть создана с ошибками + public: + PGrid(Pins_Link Link); // сеть создается из группы объектов + PGrid(PUnit *obj); // сеть создается из одного объекта + PGrid(); // функция-пустышка, просто обнуляет указатели. Используется в производных классах + ~PGrid(); + bool Make_Equation(); // если PGrid конечна ярассчетная сеть, создаем уравнения для рассчета + void calc(); + //__property PElement* Unit[int Index]={read=GetUnit}; + //__property unsigned num_Units = { read=Get_num_Units }; + PElement* __fastcall Unit(int Index); + unsigned __fastcall num_Units(); + PElement* obj_from_name(String Name); // возвращает объект по имени + void setOuts (String strOut); // переназначение групп выводов + String getOuts(); // получение групп выводов + virtual bool accept(){return true;}; // рассчет параметров схемы + virtual void Save(ostream &stream); // сохранение параметров объекта в поток + virtual void Read(istream &stream); // загрузка параметров объекта из потока + virtual String ClassName(); // возвращает имя класса +}; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +/* Тестовая модель А */ +class tstA: public PUnit{ +private: + /*virtual void __fastcall SetR(PType value); // установка активных сопротивлений на фазу + virtual void __fastcall SetL(PType value); // установка индуктивности фазы + virtual void __fastcall SetC(PType value); // установка умкости фазы + virtual void __fastcall SetGz(PType value); // установка активных проводимостей на землю + virtual void __fastcall SetCz(PType value); // установка емкостей на землю + virtual void __fastcall SetGm(PType value); // установка активных междуфазных проводимостей + virtual void __fastcall SetCm(PType value); // установка междуфазных емкостей + virtual void __fastcall SetLm(PType value); // установка междуфазных взаимоиндуктивностей + virtual bool Mutual_Inductance(PType M_ab, PType M_bc, PType M_ca); + virtual bool Mutual_Conductance(unsigned Phase1, unsigned Phase2, PType Gm, PType Cm); + virtual bool Phase_Params(Phase phase, PType __R, PType __L, PType __C, PType Gz, PType Cz);*/ + //MCircuit *_Magn; // магнитопровода +public: + tstA(); + ~tstA(); + Pins X; + UICurve BAX; + //PGrid *Magn; // магнитная цепь + virtual bool update_sources(bool force_update=false); + virtual bool update_elements(bool force_update=false); +}; +/* Тестовая модель В */ +class tstB: public PUnit{ +private: + virtual void __fastcall SetR(PType value); // установка активных сопротивлений на фазу + virtual void __fastcall SetL(PType value); // установка индуктивности фазы + virtual void __fastcall SetC(PType value); // установка умкости фазы + virtual void __fastcall SetGz(PType value); // установка активных проводимостей на землю + virtual void __fastcall SetCz(PType value); // установка емкостей на землю + virtual void __fastcall SetGm(PType value); // установка активных междуфазных проводимостей + virtual void __fastcall SetCm(PType value); // установка междуфазных емкостей + virtual void __fastcall SetLm(PType value); // установка междуфазных взаимоиндуктивностей + virtual bool Mutual_Inductance(PType M_ab, PType M_bc, PType M_ca); + virtual bool Mutual_Conductance(unsigned Phase1, unsigned Phase2, PType Gm, PType Cm); + virtual bool Phase_Params(Phase phase, PType __R, PType __L, PType __C, PType Gz, PType Cz); +public: + tstB(); + Pins X; + virtual bool update_sources(bool force_update=false); + virtual bool update_elements(bool force_update=false); +}; +#endif diff --git a/model.obj b/model.obj new file mode 100644 index 0000000..114ed57 Binary files /dev/null and b/model.obj differ diff --git a/tmp/dsp.cpp b/tmp/dsp.cpp new file mode 100644 index 0000000..ad41f94 --- /dev/null +++ b/tmp/dsp.cpp @@ -0,0 +1,33 @@ +//--------------------------------------------------------------------------- + +#include <vcl.h> +#pragma hdrstop +//--------------------------------------------------------------------------- +USEFORM("main.cpp", Form1); +//--------------------------------------------------------------------------- +WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) +{ + try + { + Application->Initialize(); + Application->CreateForm(__classid(TForm1), &Form1); + Application->Run(); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + catch (...) + { + try + { + throw Exception(""); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + } + return 0; +} +//--------------------------------------------------------------------------- diff --git a/tmp/dsp.drc b/tmp/dsp.drc new file mode 100644 index 0000000..1986363 --- /dev/null +++ b/tmp/dsp.drc @@ -0,0 +1,415 @@ +/* + Generated by the Borland C++ Incremental Linker + because -GD was supplied to the linker. + + It contains compiler-generated resource bound to the executable. + If it is empty, no compiler-generated resources were bound to the + produced executable. +*/ + +#define Consts_SmkcAlt 65328 +#define Consts_SInvalidClipFmt 65329 +#define Consts_SIconToClipboard 65330 +#define Consts_SCannotOpenClipboard 65331 +#define Consts_SDuplicateMenus 65332 +#define Consts_SDockedCtlNeedsName 65333 +#define Consts_SDockTreeRemoveError 65334 +#define Consts_SDockZoneNotFound 65335 +#define Consts_SDockZoneHasNoCtl 65336 +#define Consts_SmkcTab 65344 +#define Consts_SmkcEsc 65345 +#define Consts_SmkcEnter 65346 +#define Consts_SmkcSpace 65347 +#define Consts_SmkcPgUp 65348 +#define Consts_SmkcPgDn 65349 +#define Consts_SmkcEnd 65350 +#define Consts_SmkcHome 65351 +#define Consts_SmkcLeft 65352 +#define Consts_SmkcUp 65353 +#define Consts_SmkcRight 65354 +#define Consts_SmkcDown 65355 +#define Consts_SmkcIns 65356 +#define Consts_SmkcDel 65357 +#define Consts_SmkcShift 65358 +#define Consts_SmkcCtrl 65359 +#define Consts_SMsgDlgWarning 65360 +#define Consts_SMsgDlgError 65361 +#define Consts_SMsgDlgInformation 65362 +#define Consts_SMsgDlgConfirm 65363 +#define Consts_SMsgDlgYes 65364 +#define Consts_SMsgDlgNo 65365 +#define Consts_SMsgDlgOK 65366 +#define Consts_SMsgDlgCancel 65367 +#define Consts_SMsgDlgHelp 65368 +#define Consts_SMsgDlgAbort 65369 +#define Consts_SMsgDlgRetry 65370 +#define Consts_SMsgDlgIgnore 65371 +#define Consts_SMsgDlgAll 65372 +#define Consts_SMsgDlgNoToAll 65373 +#define Consts_SMsgDlgYesToAll 65374 +#define Consts_SmkcBkSp 65375 +#define Consts_SVisibleChanged 65376 +#define Consts_SCannotShowModal 65377 +#define Consts_SMenuIndexError 65378 +#define Consts_SMenuReinserted 65379 +#define Consts_SMenuNotFound 65380 +#define Consts_SNoTimers 65381 +#define Consts_SGroupIndexTooLow 65382 +#define Consts_SNoMDIForm 65383 +#define Consts_SControlParentSetToSelf 65384 +#define Consts_SCannotDragForm 65385 +#define Consts_SVMetafiles 65386 +#define Consts_SVEnhMetafiles 65387 +#define Consts_SVIcons 65388 +#define Consts_SVBitmaps 65389 +#define Consts_SMaskErr 65390 +#define Consts_SMaskEditErr 65391 +#define Consts_SInvalidIcon 65392 +#define Consts_SInvalidMetafile 65393 +#define Consts_SChangeIconSize 65394 +#define Consts_SUnknownClipboardFormat 65395 +#define Consts_SOutOfResources 65396 +#define Consts_SNoCanvasHandle 65397 +#define Consts_SInvalidImageSize 65398 +#define Consts_SInvalidImageList 65399 +#define Consts_SImageIndexError 65400 +#define Consts_SImageReadFail 65401 +#define Consts_SImageWriteFail 65402 +#define Consts_SWindowDCError 65403 +#define Consts_SWindowClass 65404 +#define Consts_SCannotFocus 65405 +#define Consts_SParentRequired 65406 +#define Consts_SMDIChildNotVisible 65407 +#define Sysconst_SLongMonthNameDec 65408 +#define Sysconst_SShortDayNameSun 65409 +#define Sysconst_SShortDayNameMon 65410 +#define Sysconst_SShortDayNameTue 65411 +#define Sysconst_SShortDayNameWed 65412 +#define Sysconst_SShortDayNameThu 65413 +#define Sysconst_SShortDayNameFri 65414 +#define Sysconst_SShortDayNameSat 65415 +#define Sysconst_SLongDayNameSun 65416 +#define Sysconst_SLongDayNameMon 65417 +#define Sysconst_SLongDayNameTue 65418 +#define Sysconst_SLongDayNameWed 65419 +#define Sysconst_SLongDayNameThu 65420 +#define Sysconst_SLongDayNameFri 65421 +#define Sysconst_SLongDayNameSat 65422 +#define Consts_SInvalidBitmap 65423 +#define Sysconst_SShortMonthNameAug 65424 +#define Sysconst_SShortMonthNameSep 65425 +#define Sysconst_SShortMonthNameOct 65426 +#define Sysconst_SShortMonthNameNov 65427 +#define Sysconst_SShortMonthNameDec 65428 +#define Sysconst_SLongMonthNameJan 65429 +#define Sysconst_SLongMonthNameFeb 65430 +#define Sysconst_SLongMonthNameMar 65431 +#define Sysconst_SLongMonthNameApr 65432 +#define Sysconst_SLongMonthNameMay 65433 +#define Sysconst_SLongMonthNameJun 65434 +#define Sysconst_SLongMonthNameJul 65435 +#define Sysconst_SLongMonthNameAug 65436 +#define Sysconst_SLongMonthNameSep 65437 +#define Sysconst_SLongMonthNameOct 65438 +#define Sysconst_SLongMonthNameNov 65439 +#define Sysconst_SExternalException 65440 +#define Sysconst_SAssertionFailed 65441 +#define Sysconst_SIntfCastError 65442 +#define Sysconst_SSafecallException 65443 +#define Sysconst_SAssertError 65444 +#define Sysconst_SAbstractError 65445 +#define Sysconst_SModuleAccessViolation 65446 +#define Sysconst_SOSError 65447 +#define Sysconst_SUnkOSError 65448 +#define Sysconst_SShortMonthNameJan 65449 +#define Sysconst_SShortMonthNameFeb 65450 +#define Sysconst_SShortMonthNameMar 65451 +#define Sysconst_SShortMonthNameApr 65452 +#define Sysconst_SShortMonthNameMay 65453 +#define Sysconst_SShortMonthNameJun 65454 +#define Sysconst_SShortMonthNameJul 65455 +#define Sysconst_SReadAccess 65456 +#define Sysconst_SWriteAccess 65457 +#define Sysconst_SVarArrayCreate 65458 +#define Sysconst_SVarArrayBounds 65459 +#define Sysconst_SVarArrayLocked 65460 +#define Sysconst_SInvalidVarCast 65461 +#define Sysconst_SInvalidVarOp 65462 +#define Sysconst_SInvalidVarOpWithHResult 65463 +#define Sysconst_SVarNotArray 65464 +#define Sysconst_SVarTypeCouldNotConvert 65465 +#define Sysconst_SVarTypeConvertOverflow 65466 +#define Sysconst_SVarOverflow 65467 +#define Sysconst_SVarInvalid 65468 +#define Sysconst_SVarBadType 65469 +#define Sysconst_SVarNotImplemented 65470 +#define Sysconst_SVarUnexpected 65471 +#define Sysconst_SIntOverflow 65472 +#define Sysconst_SInvalidOp 65473 +#define Sysconst_SZeroDivide 65474 +#define Sysconst_SOverflow 65475 +#define Sysconst_SUnderflow 65476 +#define Sysconst_SInvalidPointer 65477 +#define Sysconst_SInvalidCast 65478 +#define Sysconst_SAccessViolation 65479 +#define Sysconst_SStackOverflow 65480 +#define Sysconst_SControlC 65481 +#define Sysconst_SPrivilege 65482 +#define Sysconst_SException 65483 +#define Sysconst_SExceptTitle 65484 +#define Sysconst_SInvalidFormat 65485 +#define Sysconst_SArgumentMissing 65486 +#define Sysconst_SDispatchError 65487 +#define Rtlconsts_SUnknownProperty 65488 +#define Rtlconsts_SWriteError 65489 +#define Sysconst_SInvalidInteger 65490 +#define Sysconst_SInvalidCurrency 65491 +#define Sysconst_SInvalidDateTimeFloat 65492 +#define Sysconst_SOutOfMemory 65493 +#define Sysconst_SInOutError 65494 +#define Sysconst_SFileNotFound 65495 +#define Sysconst_SInvalidFilename 65496 +#define Sysconst_STooManyOpenFiles 65497 +#define Sysconst_SAccessDenied 65498 +#define Sysconst_SEndOfFile 65499 +#define Sysconst_SDiskFull 65500 +#define Sysconst_SInvalidInput 65501 +#define Sysconst_SDivByZero 65502 +#define Sysconst_SRangeError 65503 +#define Rtlconsts_SInvalidImage 65504 +#define Rtlconsts_SInvalidName 65505 +#define Rtlconsts_SInvalidProperty 65506 +#define Rtlconsts_SInvalidPropertyPath 65507 +#define Rtlconsts_SInvalidPropertyValue 65508 +#define Rtlconsts_SListCapacityError 65509 +#define Rtlconsts_SListCountError 65510 +#define Rtlconsts_SListIndexError 65511 +#define Rtlconsts_SMemoryStreamError 65512 +#define Rtlconsts_SPropertyException 65513 +#define Rtlconsts_SReadError 65514 +#define Rtlconsts_SReadOnlyProperty 65515 +#define Rtlconsts_SResNotFound 65516 +#define Rtlconsts_SSeekNotImplemented 65517 +#define Rtlconsts_SSortedListError 65518 +#define Rtlconsts_SUnknownGroup 65519 +#define HelpIntfs_16398 65520 +#define HelpIntfs_16400 65521 +#define HelpIntfs_16402 65522 +#define HelpIntfs_16404 65523 +#define Rtlconsts_SAncestorNotFound 65524 +#define Rtlconsts_SAssignError 65525 +#define Rtlconsts_SBitsIndexError 65526 +#define Rtlconsts_SCantWriteResourceStreamError 65527 +#define Rtlconsts_SCheckSynchronizeError 65528 +#define Rtlconsts_SClassNotFound 65529 +#define Rtlconsts_SDuplicateClass 65530 +#define Rtlconsts_SDuplicateItem 65531 +#define Rtlconsts_SDuplicateName 65532 +#define Rtlconsts_SDuplicateString 65533 +#define Rtlconsts_SFCreateError 65534 +#define Rtlconsts_SFOpenError 65535 +STRINGTABLE +BEGIN + Consts_SmkcAlt, "Alt+" + Consts_SInvalidClipFmt, "Invalid clipboard format" + Consts_SIconToClipboard, "Clipboard does not support Icons" + Consts_SCannotOpenClipboard, "Cannot open clipboard" + Consts_SDuplicateMenus, "Menu '%s' is already being used by another form" + Consts_SDockedCtlNeedsName, "Docked control must have a name" + Consts_SDockTreeRemoveError, "Error removing control from dock tree" + Consts_SDockZoneNotFound, " - Dock zone not found" + Consts_SDockZoneHasNoCtl, " - Dock zone has no control" + Consts_SmkcTab, "Tab" + Consts_SmkcEsc, "Esc" + Consts_SmkcEnter, "Enter" + Consts_SmkcSpace, "Space" + Consts_SmkcPgUp, "PgUp" + Consts_SmkcPgDn, "PgDn" + Consts_SmkcEnd, "End" + Consts_SmkcHome, "Home" + Consts_SmkcLeft, "Left" + Consts_SmkcUp, "Up" + Consts_SmkcRight, "Right" + Consts_SmkcDown, "Down" + Consts_SmkcIns, "Ins" + Consts_SmkcDel, "Del" + Consts_SmkcShift, "Shift+" + Consts_SmkcCtrl, "Ctrl+" + Consts_SMsgDlgWarning, "Warning" + Consts_SMsgDlgError, "Error" + Consts_SMsgDlgInformation, "Information" + Consts_SMsgDlgConfirm, "Confirm" + Consts_SMsgDlgYes, "&Yes" + Consts_SMsgDlgNo, "&No" + Consts_SMsgDlgOK, "OK" + Consts_SMsgDlgCancel, "Cancel" + Consts_SMsgDlgHelp, "&Help" + Consts_SMsgDlgAbort, "&Abort" + Consts_SMsgDlgRetry, "&Retry" + Consts_SMsgDlgIgnore, "&Ignore" + Consts_SMsgDlgAll, "&All" + Consts_SMsgDlgNoToAll, "N&o to All" + Consts_SMsgDlgYesToAll, "Yes to &All" + Consts_SmkcBkSp, "BkSp" + Consts_SVisibleChanged, "Cannot change Visible in OnShow or OnHide" + Consts_SCannotShowModal, "Cannot make a visible window modal" + Consts_SMenuIndexError, "Menu index out of range" + Consts_SMenuReinserted, "Menu inserted twice" + Consts_SMenuNotFound, "Sub-menu is not in menu" + Consts_SNoTimers, "Not enough timers available" + Consts_SGroupIndexTooLow, "GroupIndex cannot be less than a previous menu item's GroupIndex" + Consts_SNoMDIForm, "Cannot create form. No MDI forms are currently active" + Consts_SControlParentSetToSelf, "A control cannot have itself as its parent" + Consts_SCannotDragForm, "Cannot drag a form" + Consts_SVMetafiles, "Metafiles" + Consts_SVEnhMetafiles, "Enhanced Metafiles" + Consts_SVIcons, "Icons" + Consts_SVBitmaps, "Bitmaps" + Consts_SMaskErr, "Invalid input value" + Consts_SMaskEditErr, "Invalid input value. Use escape key to abandon changes" + Consts_SInvalidIcon, "Icon image is not valid" + Consts_SInvalidMetafile, "Metafile is not valid" + Consts_SChangeIconSize, "Cannot change the size of an icon" + Consts_SUnknownClipboardFormat, "Unsupported clipboard format" + Consts_SOutOfResources, "Out of system resources" + Consts_SNoCanvasHandle, "Canvas does not allow drawing" + Consts_SInvalidImageSize, "Invalid image size" + Consts_SInvalidImageList, "Invalid ImageList" + Consts_SImageIndexError, "Invalid ImageList Index" + Consts_SImageReadFail, "Failed to read ImageList data from stream" + Consts_SImageWriteFail, "Failed to write ImageList data to stream" + Consts_SWindowDCError, "Error creating window device context" + Consts_SWindowClass, "Error creating window class" + Consts_SCannotFocus, "Cannot focus a disabled or invisible window" + Consts_SParentRequired, "Control '%s' has no parent window" + Consts_SMDIChildNotVisible, "Cannot hide an MDI Child Form" + Sysconst_SLongMonthNameDec, "December" + Sysconst_SShortDayNameSun, "Sun" + Sysconst_SShortDayNameMon, "Mon" + Sysconst_SShortDayNameTue, "Tue" + Sysconst_SShortDayNameWed, "Wed" + Sysconst_SShortDayNameThu, "Thu" + Sysconst_SShortDayNameFri, "Fri" + Sysconst_SShortDayNameSat, "Sat" + Sysconst_SLongDayNameSun, "Sunday" + Sysconst_SLongDayNameMon, "Monday" + Sysconst_SLongDayNameTue, "Tuesday" + Sysconst_SLongDayNameWed, "Wednesday" + Sysconst_SLongDayNameThu, "Thursday" + Sysconst_SLongDayNameFri, "Friday" + Sysconst_SLongDayNameSat, "Saturday" + Consts_SInvalidBitmap, "Bitmap image is not valid" + Sysconst_SShortMonthNameAug, "Aug" + Sysconst_SShortMonthNameSep, "Sep" + Sysconst_SShortMonthNameOct, "Oct" + Sysconst_SShortMonthNameNov, "Nov" + Sysconst_SShortMonthNameDec, "Dec" + Sysconst_SLongMonthNameJan, "January" + Sysconst_SLongMonthNameFeb, "February" + Sysconst_SLongMonthNameMar, "March" + Sysconst_SLongMonthNameApr, "April" + Sysconst_SLongMonthNameMay, "May" + Sysconst_SLongMonthNameJun, "June" + Sysconst_SLongMonthNameJul, "July" + Sysconst_SLongMonthNameAug, "August" + Sysconst_SLongMonthNameSep, "September" + Sysconst_SLongMonthNameOct, "October" + Sysconst_SLongMonthNameNov, "November" + Sysconst_SExternalException, "External exception %x" + Sysconst_SAssertionFailed, "Assertion failed" + Sysconst_SIntfCastError, "Interface not supported" + Sysconst_SSafecallException, "Exception in safecall method" + Sysconst_SAssertError, "%s (%s, line %d)" + Sysconst_SAbstractError, "Abstract Error" + Sysconst_SModuleAccessViolation, "Access violation at address %p in module '%s'. %s of address %p" + Sysconst_SOSError, "System Error. Code: %d.\r\n%s" + Sysconst_SUnkOSError, "A call to an OS function failed" + Sysconst_SShortMonthNameJan, "Jan" + Sysconst_SShortMonthNameFeb, "Feb" + Sysconst_SShortMonthNameMar, "Mar" + Sysconst_SShortMonthNameApr, "Apr" + Sysconst_SShortMonthNameMay, "May" + Sysconst_SShortMonthNameJun, "Jun" + Sysconst_SShortMonthNameJul, "Jul" + Sysconst_SReadAccess, "Read" + Sysconst_SWriteAccess, "Write" + Sysconst_SVarArrayCreate, "Error creating variant array" + Sysconst_SVarArrayBounds, "Variant array index out of bounds" + Sysconst_SVarArrayLocked, "Variant array is locked" + Sysconst_SInvalidVarCast, "Invalid variant type conversion" + Sysconst_SInvalidVarOp, "Invalid variant operation" + Sysconst_SInvalidVarOpWithHResult, "Invalid variant operation ($%.8x)" + Sysconst_SVarNotArray, "Variant is not an array" + Sysconst_SVarTypeCouldNotConvert, "Could not convert variant of type (%s) into type (%s)" + Sysconst_SVarTypeConvertOverflow, "Overflow while converting variant of type (%s) into type (%s)" + Sysconst_SVarOverflow, "Variant overflow" + Sysconst_SVarInvalid, "Invalid argument" + Sysconst_SVarBadType, "Invalid variant type" + Sysconst_SVarNotImplemented, "Operation not supported" + Sysconst_SVarUnexpected, "Unexpected variant error" + Sysconst_SIntOverflow, "Integer overflow" + Sysconst_SInvalidOp, "Invalid floating point operation" + Sysconst_SZeroDivide, "Floating point division by zero" + Sysconst_SOverflow, "Floating point overflow" + Sysconst_SUnderflow, "Floating point underflow" + Sysconst_SInvalidPointer, "Invalid pointer operation" + Sysconst_SInvalidCast, "Invalid class typecast" + Sysconst_SAccessViolation, "Access violation at address %p. %s of address %p" + Sysconst_SStackOverflow, "Stack overflow" + Sysconst_SControlC, "Control-C hit" + Sysconst_SPrivilege, "Privileged instruction" + Sysconst_SException, "Exception %s in module %s at %p.\r\n%s%s\r\n" + Sysconst_SExceptTitle, "Application Error" + Sysconst_SInvalidFormat, "Format '%s' invalid or incompatible with argument" + Sysconst_SArgumentMissing, "No argument for format '%s'" + Sysconst_SDispatchError, "Variant method calls not supported" + Rtlconsts_SUnknownProperty, "Property %s does not exist" + Rtlconsts_SWriteError, "Stream write error" + Sysconst_SInvalidInteger, "'%s' is not a valid integer value" + Sysconst_SInvalidCurrency, "'%s' is not a valid currency value" + Sysconst_SInvalidDateTimeFloat, "'%g' is not a valid date and time" + Sysconst_SOutOfMemory, "Out of memory" + Sysconst_SInOutError, "I/O error %d" + Sysconst_SFileNotFound, "File not found" + Sysconst_SInvalidFilename, "Invalid filename" + Sysconst_STooManyOpenFiles, "Too many open files" + Sysconst_SAccessDenied, "File access denied" + Sysconst_SEndOfFile, "Read beyond end of file" + Sysconst_SDiskFull, "Disk full" + Sysconst_SInvalidInput, "Invalid numeric input" + Sysconst_SDivByZero, "Division by zero" + Sysconst_SRangeError, "Range check error" + Rtlconsts_SInvalidImage, "Invalid stream format" + Rtlconsts_SInvalidName, "''%s'' is not a valid component name" + Rtlconsts_SInvalidProperty, "Invalid property value" + Rtlconsts_SInvalidPropertyPath, "Invalid property path" + Rtlconsts_SInvalidPropertyValue, "Invalid property value" + Rtlconsts_SListCapacityError, "List capacity out of bounds (%d)" + Rtlconsts_SListCountError, "List count out of bounds (%d)" + Rtlconsts_SListIndexError, "List index out of bounds (%d)" + Rtlconsts_SMemoryStreamError, "Out of memory while expanding memory stream" + Rtlconsts_SPropertyException, "Error reading %s%s%s: %s" + Rtlconsts_SReadError, "Stream read error" + Rtlconsts_SReadOnlyProperty, "Property is read-only" + Rtlconsts_SResNotFound, "Resource %s not found" + Rtlconsts_SSeekNotImplemented, "%s.Seek not implemented" + Rtlconsts_SSortedListError, "Operation not allowed on sorted list" + Rtlconsts_SUnknownGroup, "%s not in a class registration group" + HelpIntfs_16398, "Unable to find a Table of Contents" + HelpIntfs_16400, "No help found for %s" + HelpIntfs_16402, "No context-sensitive help installed" + HelpIntfs_16404, "No topic-based help system installed" + Rtlconsts_SAncestorNotFound, "Ancestor for '%s' not found" + Rtlconsts_SAssignError, "Cannot assign a %s to a %s" + Rtlconsts_SBitsIndexError, "Bits index out of range" + Rtlconsts_SCantWriteResourceStreamError, "Can't write to a read-only resource stream" + Rtlconsts_SCheckSynchronizeError, "CheckSynchronize called from thread $%x, which is NOT the main thread" + Rtlconsts_SClassNotFound, "Class %s not found" + Rtlconsts_SDuplicateClass, "A class named %s already exists" + Rtlconsts_SDuplicateItem, "List does not allow duplicates ($0%x)" + Rtlconsts_SDuplicateName, "A component named %s already exists" + Rtlconsts_SDuplicateString, "String list does not allow duplicates" + Rtlconsts_SFCreateError, "Cannot create file %s" + Rtlconsts_SFOpenError, "Cannot open file %s" +END + diff --git a/tmp/dsp.res b/tmp/dsp.res new file mode 100644 index 0000000..5809813 Binary files /dev/null and b/tmp/dsp.res differ diff --git a/tmp/measuring_transformer.cpp b/tmp/measuring_transformer.cpp new file mode 100644 index 0000000..6e99443 --- /dev/null +++ b/tmp/measuring_transformer.cpp @@ -0,0 +1,12 @@ +//--------------------------------------------------------------------------- + +#pragma hdrstop +#include "measuring_transformer.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +void Current_Transformer::get(double *value){ + value[0] = (*fa)(TIME); + value[1] = (*fb)(TIME); + value[2] = (*fc)(TIME); +}; diff --git a/tmp/measuring_transformer.h b/tmp/measuring_transformer.h new file mode 100644 index 0000000..5510154 --- /dev/null +++ b/tmp/measuring_transformer.h @@ -0,0 +1,22 @@ +//--------------------------------------------------------------------------- +#ifndef measuring_transformerH +#define measuring_transformerH +#include <math.h> +extern double T; +extern const double w; +extern double TIME; +//--------------------------------------------------------------------------- +class Meas_Transformer{ + //далее она должна сама опознавать величину тока в зависимости от точки установки + //должны задаваться кривая намагничивания и коэф трансформации + public: + virtual void get(double *value) = 0; + double (*fa)(double &time); + double (*fb)(double &time); + double (*fc)(double &time); +}; +class Current_Transformer: public Meas_Transformer{ + public: + void get(double *value); +}; +#endif diff --git a/tmp/tmp.txt b/tmp/tmp.txt new file mode 100644 index 0000000..650cb27 --- /dev/null +++ b/tmp/tmp.txt @@ -0,0 +1,205 @@ +//--------------------------------------------------------------------------- + +#include <vcl.h> +#pragma hdrstop + +#include "Scope.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma resource "*.dfm" +TfrmScope *frmScope; +extern double TIME; +Graphics::TBitmap *out = new Graphics::TBitmap(); +Types::TRect Rect; // eaeiai ?acia?a i?yiioaieuiee canvas +// i?aaaeuiua cia?aiey a?aoeea +double Xmax=0.01; +double Xmin=0; +double Ymax=5; +double Ymin=-5; +int Can_Width=1024; +int Can_Height=1024; +vector<double> X; +vector<double> Y; +double *Signal=NULL; // auaiaeiue neaiae +double *SignalBase=NULL; // ioiineoaeuii eaeiai neaiaea +const double CurrentBase=0;// aaciaue o?iaaiu aey oiea = 0 +double Grid_Step; // naoea a?aoeea. oaa +unsigned NumScreens=0; // ?enei io?eniaaiiuo ye?aiia +//--------------------------------------------------------------------------- +double scale_X(double x) + { frmScope->Scroll->Max = x/(Xmax-Xmin)*100; return (out->Width*(x/(Xmax-Xmin) - frmScope->Scroll->Position/100)); } +double scale_Y(double y) + { return out->Height/2 - out->Height*y/(Ymax-Ymin); } +//--------------------------------------------------------------------------- +// Ie?oaeaiea e aee?aeoaio n caaaiiui eiee?anoaii ciaeia iinea caiyoie. +// value - ie?oaeyaiia cia?aiea +// digits - eiee?anoai ciaeia iinea caiyoie +double RoundTo(double value, int digits) { + double temp = pow10(digits-1); + return (floor(value*temp)+0.5)/temp; +} +//--------------------------------------------------------------------------- +// i?enoea iiey aey a?aoeea +void Graph_Clear(Graphics::TBitmap *gr, double from_x=Xmin){ + if(gr->Width <= 0 || gr->Height<=0) return; + // i?euaai + gr->Canvas->Rectangle(0,0,gr->Width+1,gr->Height+1); + // auaia naoee + unsigned step = Grid_Step; // oaa naoee + unsigned From_X = scale_X(from_x); // aaa ia?aei ii O ii ieenaeai + TColor PenColor = gr->Canvas->Pen->Color; + int PenWidth = gr->Canvas->Pen->Width; + gr->Canvas->Pen->Color=(TColor)RGB(128,128,128); //Caaaai oaao ia?a + gr->Canvas->Pen->Width=1; //Caaaai oe?eio ia?a + for(int w= -From_X; w<gr->Width; w=w+step){ + gr->Canvas->MoveTo(w, 0); + gr->Canvas->LineTo(w, gr->Height); + gr->Canvas->TextOutA(w+2,gr->Height-16, FloatToStr(RoundTo(from_x+Xmin+(Xmax-Xmin)*((double)w/gr->Width),4)).c_str()); + } + for(int h=0;h<gr->Height; h=h+step){ + gr->Canvas->MoveTo(0, h); + gr->Canvas->LineTo(gr->Width, h); + gr->Canvas->TextOutA(2,h-14, FloatToStr(RoundTo(Ymin+(Ymax-Ymin)*((double)h)/gr->Height,4)).c_str()); + } + // ainnoaiaaeeaaai ia?aiao?u ia?a + gr->Canvas->Pen->Color=PenColor; //Caaaai oaao ia?a + gr->Canvas->Pen->Width=PenWidth; //Caaaai oe?eio ia?a +} +//--------------------------------------------------------------------------- +__fastcall TfrmScope::TfrmScope(TComponent* Owner) + : TForm(Owner) +{ + //Caaaai oaao ia?a + out->Canvas->Pen->Color=(TColor)RGB(0,0,0); + //Caaaai oe?eio ia?a + out->Canvas->Pen->Width=1; + // Oaao eenoe + out->Canvas->Brush->Color=clBtnFace; + //Oaao oaenoa + out->Canvas->Font->Color=clGrayText; + //?acia? o?eooa a oi?eao + out->Canvas->Font->Size=8; + //Noeeu o?eooa + TFontStyles tFontStyle; + //Ca?a?eiooue, iaeeiiiue, ?e?iue, iia?aieiooue + //tFontStyle << fsStrikeOut << fsItalic << fsBold << fsUnderline; + //tFontStyle << fsBold; + out->Canvas->Font->Style =tFontStyle; + //Eiy o?eooa + out->Canvas->Font->Name="Times"; + // naoea a?aoeea. oaa + Grid_Step=50; + Scroll->Min = 0; + Scroll->Max = 0; + frmScope = this; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::TimerTimer(TObject *Sender) +{ + X.push_back(TIME); + Y.push_back(*Signal); + Scroll->Position = Scroll->Max-50; + ScrollChange(Timer); + double x= scale_X(TIME); + double y= scale_Y(*Signal - *SignalBase); + out->Canvas->LineTo(x, y); + Graph->Canvas -> CopyRect(::Rect, out -> Canvas, ::Rect); +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::btnStartClick(TObject *Sender) +{ + if(rbCurrent->Checked){ // ia?eai oie + if(!TryStrToInt(cmbBranches->Text,NULL) ) {ShowMessage("Ia aa?iue iiia? aaoee");return;} + Signal = obj->I[StrToInt(cmbBranches->Text)]; // a?aoee ?aai no?iei + SignalBase = (double*)&CurrentBase; + } + else if(rbVoltage){ // Iai?y?aiea + if(!TryStrToInt(cmbPot1->Text,NULL) || !TryStrToInt(cmbPot2->Text,NULL) ) {ShowMessage("Ia aa?iue iiia? ocea");return;} + Signal = obj->f[StrToInt(cmbPot1->Text)]; + SignalBase = obj->f[StrToInt(cmbPot2->Text)]; + } + // auaia naoee + Graph_Clear(out); + //Ii?ii ia?aianoeou ia?i a enoiaio? oi?eo oae + double x= scale_X(TIME); + double y= scale_Y(*Signal - *SignalBase); + out->Canvas->MoveTo(x,y); + Timer->Enabled=true; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::btnPauseClick(TObject *Sender) +{ + Timer->Enabled=false; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::FormResize(TObject *Sender) +{ + bool tmr=Timer->Enabled; + Timer->Enabled=false; + Graph->Top=0; Graph->Left=0; + Graph->Height=Height-pnlControl->Height-47; + Graph->Width=Width-9; + pnlControl->Left=0; + pnlControl->Width=Width-9; + pnlControl->Top=Height-pnlControl->Height-35; + Scroll->Width=Width; + Scroll->Top=Height-pnlControl->Height-47; + out->Width = Graph->Width; + out->Height = Graph->Height; + ::Rect.left=scale_X(Scroll->Position*(Xmax-Xmin)/100); + ::Rect.bottom=0; + ::Rect.right=::Rect.left+out->Width; + ::Rect.top=out->Height; + // auaia naoee + Graph_Clear(out,Scroll->Position*(Xmax-Xmin)/100); + //onoaiaaeeaaai ia?i + if(Signal){ + double x= scale_X(TIME); + double y= scale_Y(*Signal - *SignalBase); + out->Canvas->MoveTo(x,y); + } + Timer->Enabled=tmr; +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::btnStopClick(TObject *Sender) +{ + Timer->Enabled=false; + X.clear(); + Y.clear(); +} +//--------------------------------------------------------------------------- +void __fastcall TfrmScope::FormPaint(TObject *Sender) +{ + Graph->Canvas -> CopyRect(::Rect, out -> Canvas, ::Rect); // auaiaei a?aoee +} +//--------------------------------------------------------------------------- + +void __fastcall TfrmScope::pnlControlResize(TObject *Sender) +{ + btnStop->Left = pnlControl->Width-btnStop->Width-5; + btnPause->Left = pnlControl->Width-btnStop->Width-btnPause->Width-5; + btnStart->Left = pnlControl->Width-btnStop->Width-btnPause->Width-btnStart->Width-5; +} +//--------------------------------------------------------------------------- + +void __fastcall TfrmScope::FormHide(TObject *Sender) +{ + frmScope->~TfrmScope(); +} +//--------------------------------------------------------------------------- + +void __fastcall TfrmScope::ScrollChange(TObject *Sender) +{ + Graph_Clear(out, Scroll->Position*(Xmax-Xmin)/100); + ::Rect.left=scale_X(Scroll->Position*(Xmax-Xmin)/100); + ::Rect.bottom=0; + ::Rect.right=::Rect.left+out->Width; + ::Rect.top=out->Height; + //onoaiaaeeaaai ia?i + if(Signal){ + double x= scale_X(TIME); + double y= scale_Y(*Signal - *SignalBase); + out->Canvas->MoveTo(x,y); + } +} +//--------------------------------------------------------------------------- diff --git "a/tmp/\320\232\320\276\320\277\320\270\321\217 bpr.bpr" "b/tmp/\320\232\320\276\320\277\320\270\321\217 bpr.bpr" new file mode 100644 index 0000000..37017de --- /dev/null +++ "b/tmp/\320\232\320\276\320\277\320\270\321\217 bpr.bpr" @@ -0,0 +1,160 @@ +<?xml version='1.0' encoding='utf-8' ?> +<!-- C++Builder XML Project --> +<PROJECT> + <MACROS> + <VERSION value="BCB.06.00"/> + <PROJECT value="bpr.exe"/> + <OBJFILES value="bpr.obj dft.obj dsp.obj matrix.obj measuring_transformer.obj main.obj + model.obj Vector.obj Scope.obj PNGImage\pngimage.obj Dynamic_Array.obj + Components\Base\PBase.obj"/> + <RESFILES value="bpr.res"/> + <IDLFILES value=""/> + <IDLGENFILES value=""/> + <DEFFILE value=""/> + <RESDEPEN value="$(RESFILES) main.dfm Scope.dfm"/> + <LIBFILES value=""/> + <LIBRARIES value="bcb2kaxserver.lib indy.lib dbxcds.lib dclocx.lib soaprtl.lib bcbie.lib + nmfast.lib dbexpress.lib inetdbxpress.lib inetdbbde.lib bcbsmp.lib + dsnapcon.lib dsnapcrba.lib visualdbclx.lib teeqr.lib dss.lib tee.lib + teedb.lib teeui.lib qrpt.lib bdecds.lib cds.lib ibxpress.lib vcldbx.lib + bdertl.lib adortl.lib vcldb.lib rtl.lib vcl.lib"/> + <SPARELIBS value="vcl.lib rtl.lib vcldb.lib adortl.lib bdertl.lib vcldbx.lib ibxpress.lib + cds.lib bdecds.lib qrpt.lib teeui.lib teedb.lib tee.lib dss.lib teeqr.lib + visualdbclx.lib dsnapcrba.lib dsnapcon.lib bcbsmp.lib inetdbbde.lib + inetdbxpress.lib dbexpress.lib nmfast.lib bcbie.lib soaprtl.lib dclocx.lib + dbxcds.lib indy.lib bcb2kaxserver.lib"/> + <PACKAGES value="vcl.bpi rtl.bpi bcb2kaxserver.bpi bcbie.bpi inet.bpi inetdb.bpi dbrtl.bpi + dsnap.bpi bdertl.bpi vclx.bpi vcldb.bpi vcldbx.bpi adortl.bpi bcbsmp.bpi + bdecds.bpi cds.bpi visualclx.bpi visualdbclx.bpi dbexpress.bpi dbxcds.bpi + dss.bpi teeui.bpi teedb.bpi tee.bpi ibxpress.bpi indy.bpi dsnapcrba.bpi + dsnapcon.bpi vclie.bpi xmlrtl.bpi inetdbbde.bpi inetdbxpress.bpi + nmfast.bpi dclocx.bpi qrpt.bpi soaprtl.bpi teeqr.bpi webdsnap.bpi websnap.bpi"/> + <PATHCPP value=".;Components\Base"/> + <PATHPAS value=".;PNGImage"/> + <PATHRC value=".;"/> + <PATHASM value=".;"/> + <DEBUGLIBPATH value="$(BCB)\lib\debug"/> + <RELEASELIBPATH value="$(BCB)\lib\release"/> + <LINKER value="ilink32"/> + <USERDEFINES value="_DEBUG"/> + <SYSDEFINES value="NO_STRICT"/> + <MAINSOURCE value="bpr.cpp"/> + <INCLUDEPATH value="Components\Base;PNGImage;"C:\Documents and Settings\vananiev.MERANETWORKS\Desktop\PNGImage";$(BCB)\include;$(BCB)\include\vcl"/> + <LIBPATH value="Components\Base;PNGImage;"C:\Documents and Settings\vananiev.MERANETWORKS\Desktop\PNGImage";$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib"/> + <WARNINGS value="-w-par"/> + <OTHERFILES value=""/> + </MACROS> + <OPTIONS> + <IDLCFLAGS value="-IComponents\Base -IPNGImage + -I"C:\Documents and Settings\vananiev.MERANETWORKS\Desktop\PNGImage" + -I$(BCB)\include -I$(BCB)\include\vcl -src_suffix cpp -D_DEBUG -boa"/> + <CFLAG1 value="-Od -H=$(BCB)\lib\vcl60.csm -Hc -Vx -Ve -X- -r- -a8 -b- -k -y -v -vi- -c + -tW -tWM"/> + <PFLAGS value="-$YD -$W -$O- -$A8 -v -JPHNE -M"/> + <RFLAGS value=""/> + <AFLAGS value="/mx /w2 /zi"/> + <LFLAGS value="-D"" -H:0x1000000 -Hc:0x1000000 -Sc:0x100000 -aa -Tpe -x -Gn -v"/> + <OTHERFILES value=""/> + </OPTIONS> + <LINKER> + <ALLOBJ value="c0w32.obj sysinit.obj $(OBJFILES)"/> + <ALLRES value="$(RESFILES)"/> + <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib"/> + <OTHERFILES value=""/> + </LINKER> + <FILELIST> + <FILE FILENAME="bpr.res" FORMNAME="" UNITNAME="bpr.res" CONTAINERID="ResTool" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="bpr.cpp" FORMNAME="" UNITNAME="bpr" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="dft.cpp" FORMNAME="" UNITNAME="dft" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="dsp.cpp" FORMNAME="" UNITNAME="dsp" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="matrix.cpp" FORMNAME="" UNITNAME="matrix" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="measuring_transformer.cpp" FORMNAME="" UNITNAME="measuring_transformer" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="main.cpp" FORMNAME="frmMain" UNITNAME="main" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="model.cpp" FORMNAME="" UNITNAME="model" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="bpr.todo" FORMNAME="" UNITNAME="bpr.todo" CONTAINERID="ToDo" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="Vector.cpp" FORMNAME="" UNITNAME="Vector" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="Scope.cpp" FORMNAME="frmScope" UNITNAME="Scope" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="PNGImage\pngimage.pas" FORMNAME="" UNITNAME="pngimage" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="Dynamic_Array.cpp" FORMNAME="" UNITNAME="Dynamic_Array" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="Components\Base\PBase.cpp" FORMNAME="" UNITNAME="PBase" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + </FILELIST> + <BUILDTOOLS> + </BUILDTOOLS> + + <IDEOPTIONS> +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1049 +CodePage=1251 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=PNGImage;C:\Documents and Settings\vananiev.MERANETWORKS\Desktop\PNGImage;$(BCB)\include;$(BCB)\include\vcl +Item1=$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=2 +Item0=PNGImage;C:\Documents and Settings\vananiev.MERANETWORKS\Desktop\PNGImage;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib +Item1=$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=1 +Item0=_DEBUG + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=1 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + </IDEOPTIONS> +</PROJECT> \ No newline at end of file