Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

диссертация модальная логика

.pdf
Скачиваний:
17
Добавлен:
25.03.2016
Размер:
8.07 Mб
Скачать

-341 -

Приложение 1

HalfCyl: integer;

PRC, qweMas: array [1..12] of real;

TempStr, qweStr, ResultStr: string;

begin

//запоминаем значения количества оборотов MaxVal:=seMaxOb.Value; MinVal:=seMinOb.Value; StepVal:=seStepOb.Value;

//формируем список рассматриваемых сил ListOfForce.Items.Clear;

NewNode:=ListOfForce.Items.Add(nil,'Cилы, действующие в КШМ.'); ListOfForce.Items,AddChild(NewNode,

'Р,кН - Сумарная сила, действующая вдоль оси цилиндра'); ListOfForce.Items.AddChild(NewNode,

'N,KH - Боковая (нормальная) сила давления поршня на стенку цилиндра'); ListOfForce.Items.AddChild(NewNode,

'S,KH - Сила, действующая вдоль шатуна'); ListOfForce.Items.AddChild(NewNode,

'К,кН - Радиальная сила, действующая по оси кривошипа'); ListOfForce.Items.AddChild(NewNode,

'Т,кН - Касательная (тангенциальная) сила'); NewNode:=ListOfForce.Items.Add(nil,'Kpyтящий момент двигателя.'); for i:=l to NumbCyl do ListOfForce.Items.AddChild(NewNode, 'M'+inttostr(i)+'4,H*M - Крутящий момент '+inttostr(i)+'-ro цилиндра'); ListOfForce.Items.AddChild(NewNode,

'Mk,H*M - Сумарный крутящий момент двигателя'); NewNode:=ListOfForce.Items.Add(nil,

'Набегающие моменты.'); fori:=l toKKRdo ListOfForce.Items.AddChild(NewNode,

'M'^-inttostr(i)+'шш,H*м - Набегающий момент на '+ inttostr(i)+'-ю шатунную шейку');

fori:=2toKKR+l do ListOfForce.Items.AddChild(NewNode,

'M'+inttostr(i)+'кщ,H*м - Набегающий момент на '+ inttostr(i)+'-ю коренную шейку');

NewNode:=ListOfForce.Items.Add(nil,'Harpy3Ka на шатунные шейки.'); ListOfForce.Itenis.AddChild(NewNode,

-342 - Приложение 1

'Кшш,кН - Суммарная нагрузка на шатунную шейку от всех шатунов'); NumbOfSh:=0;

ifNumbRad>l then begin HaIfCyl:=round(NumbCyl/2);

for i:=l to HalfCyl do qweMas[i]:=UgolVs[HalfCyl+i]-UgolVs[i]; PRC[1]:=1;

j:=2;

u:=2;

while j<=HalfCyl do begin i:=l;

while i<=(j-l) do begin

if qweMas[i]=qweMas[j] then begin PRC[j]:=i;

break; end; {if} inc(i);

end; {while}

if i=j then begin PRC[j]:=u; u:=u+l;

end;

j:=i+i; end; {while}

for j:=l to HalfCyl do begin for i:=l to HalfCyl do

if PRC[i]=j then begin TempStr:=";

for qwel:=l to HalfCyl do

if PRC[qweI]=j then TempStr:=TempStr+inttostr(qweI); qweStr:=";

for qwel:=l to length(TempStr) do qweStr:=qweStr+TempStr[qweI]+','; delete(qweStr,length(qweStr),l);

Яе8и1г81г:='Кшш'+Тетр81г+',кН'+' - Нагрузка на '+qweStr;

if length(qweStr)=l then ResuhStr:=ResultStr+' шатунную шейку.' else ResuhStr:=ResultStr+' шатунные шейки.';

ListOfForce.Items.AddChi]d(NewNode,ResultStr);

inc(NumbOfSh);

break; end; {if} end; {for}

-343 -

Приложение 1

end; {ifNumbRad>l} NewNode:=ListOfForce.Items.Add(ni],

'Полярные диаграммы и диаграммы износа для шш.'); ListOfForce.Items.AddChild(NewNode,'H3Hoc шатунной шейки (шш)'); NewNode:=ListOfForce.Items.Add(nil,'Нагрузка на коренные шейки.'); if NumbRad=] then NumbOfK:=NumbCyl+l

else NumbOfK:=round(NumbCyl/2)+l;

for i:=l to NumbOfK do ListOfForce.Items.AddChild(NewNode, 'RKm'+inttostr(i)+',KH'+' - Нагрузка на'+

inttostr(i)+'-ro коренную шейку'); NewNode:=ListOfForce.Items.Add(nil,

'Полярные диаграммы и диаграммы износа для кш.'); for i:=l to NumbOfK do ListOfForce.Items.AddChild(NewNode,

'Износ '+inttostr(i)+'-oft коренной шейки (Km'+inttostr(i)+')');

end;

procedure TNewPatt.ListOfForceDbICIick(Sender: TObject); var

NameOfForce, IndexStr: string; begin

with ListOfForce.Selected do

if (ListOfForce.Selectedonil)and(Parentonil) then begin IndexStr:='['+inttostr(Parent.Index+l)+',4-inttostr(Index+l)+']'; if posC - ',Text)oO

then NameOflForce:=copy(Text,l,pos(' - ',Text)-l) else NameOfForce:=copy(Text,pos('(',Text)+1,

pos(')',Text)-pos('(',Text)-l); lbSelForce.Items.Add(NameOfForce+' 4-IndexStr); seNOfColChange(nil);

end; {if} end;

procedure TNewPatt.lbSelForceDblClick(Sender: TObject); var

i: byte; begin

for i:=0 to lbSelForce.Items.Count-1 do if lbSelForce.Selected[i]=true then begin IbSelForce. Items.Delete(i);

-344-

Приложение1

seNOfColChange(nil);

break; end; {if} end;

procedure TNewPatt.btClearClick(Sender: TObject); begin

IbSelForce.Items.Clear;

end;

procedure TNewPatt.ButOkCIick(Sender: TObject); begin

if seMaxOb.Value<seMinOb.VaIue then begin Beep;

ShowMessage('Mинимaльнoe значение обротов должно быть меньше, чем максимальное значение!!!'); seMaxOb.Value:=MaxVal;

seMinOb.Value:=MinVal;

seStepOb.Value:=StepVal;

ModalResult:=mrNone; end; {if}

end;

procedure TNewPatt.seNOfColChange(Sender; TObject); var

qwe: real; begin

qwe:=lbSelForce.Items.Count/seNOfCol.Value; iffi:ac(qwe)=0then lbNOfRow.Caption:=inttostr(trunc(qwe))

else lbNOfRow.Caption:=inttostr(trunc(qwe)+l);

end;

procedure TNewPatt.cbDraftClick(Sender: TObject); begin

btDraft.Enabled-cbDraft.Checked; end;

procedure TNewPatt.btDraftClick(Sender: TObject); begin

DraftP.ShowModal;

end;

- 345 -

npHJio>KeHne 1

end.

unit DForce;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons;

type PPoint2D='"TPoint;

PPomt3D=^Point3D;

Point3D=record

X,Y,Z: real;

end;

TVector=record A,B,C: real; end;

TP!ane=record Norm: TVector; D: real;

end;

TAngel=record SinAng: extended; CosAng: extended; end;

TAngel3D=record OXAng: TAngel; OYAng: TAngel; OZAng: TAngel; end;

PPlane='^Plane;

-346-

Приложение 1

Plane=record

Pts: array [1 ..4] of word; ClnTColor;

end;

PArray2D=^Array2D;

Array2D=array [1..1] of PPoint2D;

PArray3D=''Array3D;

Array3D=array [1..1] ofPPoint3D;

PArrayPH'^ArrayPl;

ArrayPl=array [1..1] of PPlane;

TSysKoord=record

 

Base3D: Point3D;

// базовая точка привязки паттерна

AxisX,AxisY,AxisZ: TVector; // вектора осей координат

MasX,MasY,MasZ: real;

// расчитываемые множители масштабов

UserMasX,UserMasY,UserMasZ: real; // пользоват. множители масштабов

BaseSK: TVector;

// вектор смешения точки отсчета с.к.

An-Pnts: array [1..12] of Point3D;

end;

 

TGabarit=record

 

KoofX, KoofY: real;

// коэффициенты перевода от абс. к отн.

MaxX,MaxY,MaxZ: real;

MinX,MinY,MinZ; real;

MaxGab: real;

// максимальный габарит изображения на экране

Centr3D: Point3D;

// центральная точка

AbsolX,AbsolY: real; // приращение в абсолютном пространстве

OtnosX,OtnosY: integer; // приращение в относительном пространстве end;

TForce = class(TForm) OutSpace: TShape; Panell: TPanel; Splitterl:TSplitter; LabelPrtp: TLabel; sbVar: TStatusBar; sbUp; TSpeedButton;

- J 4 / -

Приложение 1

sbDown: TSpeedButton; sbLeft: TSpeedButton; sbRight: TSpeedButton; sbPo: TSpeedButton; sbPro: TSpeedButton;

procedure FormClose(Sender; TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject);

procedure RotLeftCiic]c(Sender: TObject); procedure FormPaint(Sender: TObject); procedure RotRightClick(Sender: TObject); procedure RotUpClick(Sender: TObject); procedure RotDownClick(Sender: TObject); procedure RotProClick(Sender: TObject); procedure RotPoCIick(Sender: TObject); procedure FormResize(Sender: TObject); private

{Private declarations}

function DisplayPoint3D(InPoint:Point3D):TPoint;

function CalculClrKvadr(NumbKvadr,NumbFrm: integer): TColor;

public

{Public declarations} ArrayBase: PArray3D; ArrayScreen: PArray2D; ArrayPlane: PArrayPl; Taktnost: byte;

NODC: integer;

NBeg, NEnd, NStep: integer; DCyl; real;

NOfZ: integer; NOfPoints: integer; NOfPlanes: word; SourceFile: string; Precis: byte; ColorStyle: integer; Light: TVector; Gabarit: TGabarit; SKoord: TSysKoord; RotAng: TAngeBD;

-348 -

Приложение 1

NamePrtp: string;

NameOfForce: string;

EdinOfForce: string;

procedure FreeMemory; procedure GetArray3D;

procedure RotateBase(Ax: ciiar; Angle: TAngel; RotDir: boolean); procedure CalculGabarit;

procedure CreateArrayScreen; procedure CalculArray2D; procedure CreateArrayPlane; end;

const

PoleKoof=10; // коэффициент, влияющий на размер поля вывода

var

Force: TForce;

implementation

uses MainUnit, Tools;

{$R *.DFM}

procedure TForce.FormClose(Sender: TObject; var Action: TCloseAction); var

faSource: file of Point3D; i: word;

begin

//отменяем, если диаграмма используется в качестве прототипа for i:=0 to (MainForm.MDlChildCount-1) do

if (MainForm.MDlChildren[i] is TForce) and ((MainForm.MDlChildren[i] as TForce).NamePrtp=Caption)

then begin

(MainForm.MDlChildren[i] as TForce),NamePrtp:=";

if (MainForm.MDlChildren[i] as TForce).ArrayBaseOnil then MainForm.MDIChildren[i].Repaint;

end;

//освобождаем занимаемую под данными память

- 349-

Приложение 1

FreeMemory;

//форму закрываем полностью Action:=caFree;

//уничтожаем файл-ресурс точек assignfile(faSource,SourceFile); erase(faSource);

end;

procedure TForce.FonnCreate(Sender: TObject); begin

NamePrtp:=";

Precis:=10;

ColorStyle:=0;

RotAng.OXAng:=GradToSiCo(10);

RotAng.OYAng:=GradToSiCo(l 0);

RotAng.OZAng:=GradToSiCo(10);

witli SKoord do begin UserMasX:=l; UserMasY:=l; UserMasZ:=l;

end; {with}

with Light do begin A:=I;

B:=l;

C:=l;

end;

end; {procedure FormCreate}

procedure TForce.RotateBase(Ax: char; Angle: TAngel; RotDir: boolean); // врахцение Maccima трехмерных точек

var

i: integer; begin

// делаем поворот массива трехмерных точек {$R-}

fori:=l to NOfPoints do

with ArrayBase''[i]^ do begin

- 350 -

Приложение 1

case Ах of 'x','X':Rotate2D(Y,Z,Angle,RotDir); y/Y': Rotate2D(X,Z,Angle,RotDir); •z','Z':Rotate2D(X,Y,Angle,RotDir); end; {case}

end; {with} {$R+}

//делаем поворот осей, центральной точки и начала координат with Gabarit,SKoord do begin

case Ax of 'xVX': begm

for i:=l to 12 do

Rotate2D(ArrPnts[i].Y,ArrPnts[i] .Z, Angle,RotDir); Rotate2D(Base3D.Y,Base3D.Z,Angle,RotDir); Rotate2D(Centr3D.Y,Centr3D.Z,AngIe,RotDir); Rotate2D(AxisX.B,AxisX.C,Angle,RotDir); Rotate2D(AxisY.B,AxisY.C,Angle,RotDir); Rotate2D(AxisZ.B,AxisZ.C,Angle,RotDir);

end;

y , Y ' : begin

for i:=l to 12 do

Rotate2D(ArrPnts[i] .X,ArrPnts[i] .Z, Angle,RotDir); Rotate2D(Base3D.X,Base3D.Z,Angle,RotDir); Rotate2D(Centr3D.X,Centr3D.Z,Angle,RotDir); Rotate2D(AxisX.A,AxisX.C,Angle,RotDir); Rotate2D(AxisY.A,AxisY.C,Angle,RotDir); Rotate2D(AxisZ.A,AxisZ.C,Angle,RotDir);

end; 'z','Z': begin

for i:=l to 12 do Rotate2D(ArrPnts[i].X,ArrPnts[i].Y,Angle,RotDir);

Rotate2D(Base3D.X,Base3D.Y,Angle,RotDir);

Rotate2D(Centr3D.X,Centr3D.Y,Angle,RotDir);

Rotate2D(AxisX.A,AxisX.B,Angle,RotDir);

Rotate2D(AxisY.A,AxisY.B,Angle,RotDir);

Rotate2D(AxisZ.A,AxisZ.B,Angle,RotDir);

end; end; {case} end; {with}

//перерасчитываем абсолютное центральное приращение