диссертация модальная логика
.pdf-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}
//перерасчитываем абсолютное центральное приращение