Moravské přístroje, a. s., zdroj: https://www.mii.cz/art?id=1165&lang=405, vytištěno: 03.11.2025 8:24:42
Hlavní stránka▹Produkty▹Programový systém Control Web▹Články | 18.7.2024 |
|---|
| Pomocí přístroje drawing a OCL skriptovacího jazyka si ho můžete vytvořit. |
|
V následujícím textu si ukážeme, jak naprogramovat nový přístroj pomocí nativních procedur přístroje drawing. Ve vytvářené aplikaci potřebujeme například víceúrovňový indikátor Požadovaný vzhled přístroje Do aplikace vložíme přístroj drawing, který nabízí řadu nativních procedur pro vytvoření kresby. Budeme předpokládat, že přístroj bude použit jako vzor (template) a bude ho tedy možné parametrizovat. Nastavení parametrů bude možné definovat v uživatelsky definované proceduře Init() a v proceduře CreateSelf() vytvoříme pomocí nativních procedur přístroje drawing vlastní vzhled přístroje. Obě tyto procedury budou volány z procedury OnStartup(). const
MAX_LEVELS = 5;
end_const;
static
OrgDim : real;
OrgValY : real;
NoOfLevels : cardinal {init_value = 5};
Levels : array[ 1..MAX_LEVELS ] of real {init_value = 20,30,70,80};
Colors : array[ 1..MAX_LEVELS ] of longcard {init_value = val( '0000FF', 16 ),val( '00FFFF', 16 ),val( '00FF00', 16 ),val( '00FFFF', 16 ),val( '0000FF', 16 )};
Reflection : boolean {init_value = true};
RangeFrom : real;
RangeTo : real {init_value = 100};
Value : real;
end_static;
V proceduře Init() nastavíme přístroji potřebné parametry tak, aby vyhovovaly konkrétní instanci přístroje. procedure Init(); begin // Init parameters here // -------------------- NoOfLevels = 5; Levels[ 1 ] = 20; Levels[ 2 ] = 30; Levels[ 3 ] = 70; Levels[ 4 ] = 80; Reflection = true; RangeFrom = 0; RangeTo = 100; Value = 0; Colors[ 1 ] = system.ColorNameToColor( 'lred' ); Colors[ 2 ] = system.ColorNameToColor( 'lyellow' ); Colors[ 3 ] = system.ColorNameToColor( 'lgreen' ); Colors[ 4 ] = system.ColorNameToColor( 'lyellow' ); Colors[ 5 ] = system.ColorNameToColor( 'lred' ); end_procedure; V proceduře CreateSelf() definujeme vzhled přístroje pomocí nativních procedur přístroje drawing. procedure CreateSelf();
var
c : cardinal;
s : string;
begin
s = 'Meter';
CreateGroup( '', s );
SetObjectSize( '', 100, 100 );
s = 'Levels';
CreateGroup( 'Meter', s );
s = 'Reflection';
CreateGroup( 'Meter', s );
s = 'Value';
CreateGroup( 'Meter', s );
s = 'Line1';
CreateLine( 'Meter.Value', s, 0, 48, 45, 50 );
s = 'Line2';
CreateLine( 'Meter.Value', s, 0, 52, 45, 50 );
s = 'Line3';
CreateLine( 'Meter.Value', s, 0, 49, 40, 50 );
s = 'Line4';
CreateLine( 'Meter.Value', s, 0, 50, 40, 50 );
s = 'Line5';
CreateLine( 'Meter.Value', s, 0, 51, 40, 50 );
SetStrokeColorType( 'Meter.Value.Line*', 1 );
SetStrokeWidth( 'Meter.Value.Line*', 1 );
SetStrokeStyle( 'Meter.Value.Line*', 'full' );
SetStrokeColor( 'Meter.Value.Line*', 0, 0, 0, 1 );
if Reflection then
s = 'Reflection1';
CreateRect( 'Meter.Reflection', s, 0, 0, 100, 100, 0, 0 );
SetStrokeColorType( 'Meter.Reflection.Reflection1', 0 );
SetFillColorType( 'Meter.Reflection.Reflection1', 2 );
SetFillGradientColor( 'Meter.Reflection.Reflection1', 1, 0.509, 0.509, 0.509, 0.403 );
SetFillGradientOffset( 'Meter.Reflection.Reflection1', 1, 0 );
SetFillGradientColor( 'Meter.Reflection.Reflection1', 2, 1.0, 1.0, 1.0, 0.525 );
SetFillGradientOffset( 'Meter.Reflection.Reflection1', 2, 0.5 );
SetFillGradientColor( 'Meter.Reflection.Reflection1', 3, 0.619, 0.619, 0.619, 0.411 );
SetFillGradientOffset( 'Meter.Reflection.Reflection1', 3, 1.0 );
end;
// Create levels
NoOfLevels = min2( NoOfLevels, MAX_LEVELS );
for c = NoOfLevels to 1 by -1 do
s = 'Level' + c:s;
CreateRect( 'Meter.Levels', s, 0, (NoOfLevels - c) * (100 / NoOfLevels), 100, 100 / NoOfLevels, 0, 0 );
SetStrokeColorType( 'Meter.Levels.' + s, 0 );
SetFillColor( 'Meter.Levels.' + s, Colors[ c ] );
end;
SetZoomMode( 1 );
end_procedure;
Inicializaci a vytvoření přístroje vyvoláme z událostní procedury OnStartup(), které se volá jako první po spuštění aplikace. procedure OnStartup();
var
c : cardinal;
x, y, w, d : real;
begin
Init();
CreateSelf();
if not GetObjectRect( 'Meter', x, y, w, OrgDim ) then
system.DebugOutput( 'ERROR: ' + GetName() + ' Meter group not found!');
system.StopApplication();
end;
if not GetObjectRect( 'Meter.Value', x, y, w, d ) then
system.DebugOutput( 'ERROR: ' + GetName() + ' Meter.Value group not found!');
system.StopApplication();
end;
OrgValY = y + d / 2;
SetValueColor( GetColor( 'Meter.Value' ) );
for c = 1 to NoOfLevels do
SetFillColor( 'Meter.Levels.Level' + c:s, Colors[ c ] );
end; (* for *)
SetLevels( Levels );
SetValue( Value );
end_procedure;
Dále do přístroje doplníme procedury pro nastavení zobrazované hodnoty, rozsahu, nastavení pásem a barev. procedure SetValue( V : real );
var
y : real;
begin
Value = V;
y = (RangeTo - V) * OrgDim/(RangeTo - RangeFrom) - OrgValY;
TransformReset( 'Meter.Value' );
TransformTranslate( 'Meter.Value', 0, y );
Paint();
if PBox <> null then
PBox->SetColor( 'interior', GetLevelColorByValue( Value ) );
end;
end_procedure;
procedure SetRange( From, To : real );
begin
RangeFrom = From;
RangeTo = To;
SetLevels( Levels );
end_procedure;
procedure SetLevels( L : array of real );
var
c : cardinal;
d : real;
begin
for c = 1 to NoOfLevels - 1 do
d = (L[ c ] - RangeFrom) * OrgDim / (abs(RangeTo) + abs(RangeFrom));
SetRectParameters( 'Meter.Levels.Level' + c:s, 0, OrgDim - d, 100, d, 0, 0 );
end;
d = (RangeTo - RangeFrom) * OrgDim / (abs(RangeTo) + abs(RangeFrom));
SetRectParameters( 'Meter.Levels.Level' + NoOfLevels:s, 0, OrgDim - d, 100, d, 0, 0 );
SetValue( Value );
end_procedure;
procedure SetValueColor( RGB : longcard );
begin
SetFillColor( 'Meter.Value', RGB );
Paint();
end_procedure;
procedure SetLevelColor( Level : shortcard; RGB : longcard );
begin
if (Level > 0) and (Level <= NoOfLevels) then
SetFillColor( 'Meter.Levels.Level' + Level:s, RGB );
Paint();
end;
end_procedure;
procedure GetLevelColorByValue( Value : real ): longcard;
var
c : cardinal;
begin
for c := 1 to NoOfLevels - 1 do
if Value <= Levels[ c ] then
return Colors[ c ];
end;
end;
return Colors[ NoOfLevels ];
end_procedure;
Pokud bude přístroj časován, pak můžeme proceduru pro nastavení hodnoty SetValue() volat z procedury OnActivate(). Případně můžeme volat tuto proceduru z kódu jiné procedury. procedure OnActivate(); begin SetValue( expr ); // expr <= value to be displayed end_procedure; Celá ukázková aplikace je ke stažení zde. |