Commit fae2fb3f authored by Claes Sjofors's avatar Claes Sjofors

Ge, parent attributes for hierarchy graphs with -<

parent fdb53010
...@@ -358,6 +358,20 @@ public class Graph implements GraphIfc, GrowApplIfc { ...@@ -358,6 +358,20 @@ public class Graph implements GraphIfc, GrowApplIfc {
else else
break; break;
} }
for ( int i = 0; i < 4; i++) {
// Remove segment name before
if ( (idx = str.indexOf("-<")) != -1) {
String rest = str.substring( idx + 2);
int idx2 = str.lastIndexOf( '-', idx - 2);
if ( idx2 != -1)
str = str.substring( 0, idx2) + rest;
else
break;
}
else
break;
}
pname.tname = new String(str); pname.tname = new String(str);
......
...@@ -2952,8 +2952,7 @@ Window displays a separate graph in a specified area in another graph. The graph ...@@ -2952,8 +2952,7 @@ Window displays a separate graph in a specified area in another graph. The graph
with or without scrollbars. with or without scrollbars.
<h2>Limitations <h2>Limitations
Connections within the window object are scaled properly. Connections within the window object are not scaled properly.
In object graphs, $object only works in two levels of window objects.
<h2>Attributes <h2>Attributes
<b>Attribute <t><t>Description <b>Attribute <t><t>Description
...@@ -2976,7 +2975,6 @@ and when that folder is activated, the stated graph is displayed in the window. ...@@ -2976,7 +2975,6 @@ and when that folder is activated, the stated graph is displayed in the window.
<h2>Limitations <h2>Limitations
Sliders within the window object are disabled. Sliders within the window object are disabled.
You can not state an hierarchy or class object. You can not state an hierarchy or class object.
In object graphs, $object only works in two levels of window objects.
<h2>Attributes <h2>Attributes
<b>Attribute <t><t>Description <b>Attribute <t><t>Description
...@@ -3211,6 +3209,167 @@ page, when the value is changed to 0, the animation is run back to the first pag ...@@ -3211,6 +3209,167 @@ page, when the value is changed to 0, the animation is run back to the first pag
there. there.
</topic> </topic>
<topic>geref_databaseconnection
Database connection
Subgraphs are connected to attributes in the database which makes it possible to change
color or shape of an object when an attribute value is changed. For example the dynamic
DigColor has the property Attribute, where the database attribute that affects the color
is specified.
The attribute specification consists of the attribute name type, for example
<c>H1-H2-Start.ActualValue##Boolean
Usually the attribute is inserted by selecting the attribute in the database navigator, and
clicking on the attribute property in the object editor with Ctrl+Double click. If only
one attribute is present you can click directly on the subgraph with Ctrl+Double click.
<b>Invert signal
A signal is inverted by placing an exclamation mark in front of the attribute name.
Only attributes of type Boolean can be inverted. Inverted signal can only be used
in dynamics, not in actions.
<c>!H1-H2-Start.ActualValue##Boolean
The exclamation mark will invert the signal before it is used in the dynamics.
<b>Object and hierarchy graphs
When drawing object graphs, the instance object or hierarchy object is denoted by the
string $object. For example if the attribute
<c>$object.ActualValue##Float32
occurs in an object graph, and the object graph is opened for the object H1-H2-Temperature,
$object is replace by the instance object name and the connection will be made to
<c>H1-H2-Temperature.ActualValue##Float32
$object is also used in hierarchy graphs in a similar way.
<c>$object-Temperature.ActualValue##Float32
with the hierarchy object H1-H2 will give
<c>H1-H2-Temperatyre.ActualValue##Float32
<b>Parent object
The parent object to the $object can be referenced with '.<' or '-<'. These operators will
remove the last attribute or the last object to the closest preceding '.' or '-'.
H1-H2-<.Description will be H1.Description. If you have an hierarchy graph for H1-H2, the
description in the parent object H1 can be displayed with
<c>$object-<.Description##String80
For attribute objects, where attribute names is removed instead, '.<' is used.
H1-Plates.Data.<.Temperature will be H1-Plates.Temperature. Thus in the object graph for
Data the Temperature attribute in parent object Plates can be displayed by
<c>$object.<.Temperature##Float32
<b>Attribute references
If an object contains attributes of type AttrRef of Objid, values in the objects that
these attribute points at, can be displayed with the &() syntax.
<c>&(H1-H2-Motor.Object).ActualValue##Float32
means that H1-H2-Motor.Object contains a pointer to an object, and it is to the
ActualValue attribute of this object the connection is made.
The connection is made when the graph is opened, and if the pointer in H1-H2-Motor.Object
is changed, the connection will not be automatically changed. The dynamic DigSwap though
can be used to reconnect all connections in a graph.
<b>Variable array index
Array indexes can be specified with attributes of type Int32 or UInt32. In
<c>H1-H2-Array[&(H1-H2-CurrentIndex.ActualValue)].Value##Float32
H1-H2-CurrentIndex.ActualValue is an Int32 attribute, and the value of this attribute
will be fetched and inserted as array index.
The index is evaluated when the graph is opened and if the index value is changed, the
connection will not be automatically changed. The dynamic DigSwap though can be used to
reconnect all connections in a graph.
<b>Node object
$node will be replaced by the node object. This can for example be used to reference
XttGraph objects where the same graph are used on different nodes. For example
<c>$node-Graphs-Overview
will work for any node that has an XttGraph object named Overview under a Graph
hierarchy under the node object.
<b>Local database
Local variables in a graph can be used to communicate between objects in a graph. They
are specified with the prefix $local. followed by a varable name and variable type, eg
<c>$local.HoldTrend##Boolean
A local variable can for example be used to hold a trend by beeing used in Trend.HoldAttr.
With a toggle button that uses the same local variable in ToggleDig.Attribute, trend hold
can be turned on and off by pressing the button.
Local variables though are not implemented for all types of dynamics and actions.
<b>Arrays
In some dynamic types as Table and XYCurve whole arrays are connected. The syntax to
connect an array is 'attributename'##'type'#'length', for example
<c>H1-H2-A1.Value##Float32#100
where 100 is the number of elements in the array.
<b>Array elements
To connect an element in an array, the syntax is 'attributename'##'type'#'length'['index'], eg
<c>H1-H2-A1.Value##Float32#100[2]
<b>Attribute types
The type of the attribute is specified after the attribute name. The following types are
supported
##Boolean
##Float32
##Float64
##Char
##Int8
##Int16
##Int32
##Int64
##UInt8
##UInt16
##UInt32
##UInt64
##Objid
##Time
##DeltaTime
##Status
##NetStatus
##Enum
##Mask
##DataRef
##String
##Bit
<b>String type
The String type should be followed by the size of the string, eg ##String80.
<b>Bit type
The bit type makes it possible to connect to an individual bit in a mask or integer attribute.
The syntax is ##Bit#'size'['bitnumber'] or ##Bit['bitnumber'].
Size is the number of bits in the mask, and bitnumber the number where the first bit has
number 0.
Example
<c>H1-H2-Mode.ActualValue##Bit[2]
</topic>
<topic>geref_dynamic <topic>geref_dynamic
Dynamics Dynamics
...@@ -3982,6 +4141,32 @@ With the command ...@@ -3982,6 +4141,32 @@ With the command
the object graph is opened for the object in the first element. It is also the object graph is opened for the object in the first element. It is also
possible to state double steps of attribute references with the syntax possible to state double steps of attribute references with the syntax
'&(&(attribute-reference))'. '&(&(attribute-reference))'.
<b>Array index replacement
An Int32 or UInt32 attribute can be used as array index with the
syntax [&(integer-attribute)]. With the command
<c>> open graph /class /instance=H1-Plates[&(H1-CurrentIndex.ActualValue)]
the index array of H1-Plates will be fetched from the current value of
H1-CurrentIndex.ActualValue.
<b>Parent object references
The .< syntax will remove the preceding attribute in an attribute name.
H1-Plates.Data.<.CurrentIndex will result in H1-Plates.CurrentIndex.
This can be used in object graphs in combination with $object. For example
<c>> open graph /class /instance=$object.<
will open the object graph for the object the contains the current object.
The -< syntax is similar but works for object hierarchies. H1-Pumps-P1<-
will result in H1-Pumps. This makes it possible to address parent objects
in hierarchy graphs. For example
<c>> open graph /class /instance=$object-<
will open the object graph for the parent object.
</topic> </topic>
<topic>GeDynCommandDoubleClick <style>function <topic>GeDynCommandDoubleClick <style>function
...@@ -4662,27 +4847,8 @@ the select the desired attribute. ...@@ -4662,27 +4847,8 @@ the select the desired attribute.
You can also select the object in the configurator. You can also select the object in the configurator.
<h2>Suffix <h2>Suffix
To the signal name, a suffix should be added, that tells the type of the attribute. To the signal name, a suffix should be added, that tells the type of the attribute. Some
For some types of dynamics, where the type is obvious, it might work without suffix. common types are ##Boolean, ##Float32, ##Int32, ##UInt32 and ##String80.
The following types of suffix can be stated:
##BOOLEAN
##FLOAT32
##FLOAT64
##CHAR
##INT8
##INT16
##INT32
##UINT8
##UINT16
##UINT32
##OBJID
##STRING
##TIME
##DELTATIME
##ATTRREF
If the attribute is a string or an array, the size should also be stated.
<h1>Graph attributes <h1>Graph attributes
Under File in the menu you find 'Graph attributes' and here you can enter attributes for the Under File in the menu you find 'Graph attributes' and here you can enter attributes for the
......
...@@ -2932,7 +2932,6 @@ med eller utan skroll-lister. ...@@ -2932,7 +2932,6 @@ med eller utan skroll-lister.
<h2>Begränsningar <h2>Begränsningar
Kopplingar i fönstret skalas inte på rätt sätt. Kopplingar i fönstret skalas inte på rätt sätt.
I objektsbilder fungerar $object endast i två nivåer av windowobjekt.
<h2>Attribut <h2>Attribut
<b>Attribut <t><t>Beskrivning <b>Attribut <t><t>Beskrivning
...@@ -2954,7 +2953,6 @@ och n ...@@ -2954,7 +2953,6 @@ och n
<h2>Begränsningar <h2>Begränsningar
Kopplingar i fönstret skalas inte på rätt sätt. Kopplingar i fönstret skalas inte på rätt sätt.
I objektsbilder fungerar $object endast i två nivåer av windowobjekt.
<h2>Attribut <h2>Attribut
<b>Attribut <t><t>Beskrivning <b>Attribut <t><t>Beskrivning
...@@ -3187,6 +3185,166 @@ till 1 animeras fr ...@@ -3187,6 +3185,166 @@ till 1 animeras fr
första sidan. första sidan.
</topic> </topic>
<topic>geref_databaseconnection
Koppling till databas
Subgrafer kopplas till attribut i databasen vilket gör det möjligt att ändra färg och
på objekt när attributvärden ändras. Till exempel har dynamiken DigColor egenskapen
Attribute där det attribut i databasen som ska påverka färgen specificeras.
Specifikationen av ett attribut består av attributets namn och typ, till exempel
<c>H1-H2-Start.ActualValue##Boolean
Vanligtvis läggs attributet in genom att välja ut attributet i navigatorn för databasen, och
klicka på attribut-fältet i objektseditorn med Ctrl+dubbelklick. Om det endast finns
ett attribut i subgrafen kan man klicka direkt på subgrafen med Ctrl+dubbelklick.
<b>Invertera en signal
En signal inverteras genom att ett utropstecken placeras framför attributnamnet.
Endast attribut av typen Boolean kan inverteras. Invertering kan användas i dynamik
men inte i aktioner.
<c>!H1-H2-Start.ActualValue##Boolean
Utropstecknet i exemplet ovan anger att signalvärdet kommer att inverteras innan det används
i dynamiken.
<b>Objekt- och hierarkigrafer
När man ritar objektgrafer anges instans-objektet med strängen $object.
Om till exempel attributet
<c>$object.ActualValue##Float32
förekommer i en objektsgraf, och objektgrafen öppnas för objektet H1-H2-Temperature, kommer
$object att ersättas av instansobjektet och kopplingen kommer att göras till
<c>H1-H2-Temperature.ActualValue##Float32
$object används även i hierarkigrafer på motsvarande sätt.
<c>$object-Temperature.ActualValue##Float32
med hierarki-objektet H1-H2 kommer att ge
<c>H1-H2-Temperatyre.ActualValue##Float32
<b>Förälderobjekt
Förälderobjektet till $object kan refereras med '.<' eller '-<'. Dessa operatorer kommer
att ta bort sista attributet eller sista objektet till närmast föregående '.' eller '-'.
H1-H2-<.Description kommer att bli H1.Description. Om man har en hierarkigraf för H1-H2 kan
beskrivningen för förälderobjektet H1 visas med
<c>$object-<.Description##String80
För attributobjekt, där attributnamn tas bort istället, används '.<'.
H1-Plates.Data.<.Temperature kommer att bli H1-Plates.Temperature. I objektgrafen för Data kan
Temperatur-attributet i förälderobjektet Plates visas med
<c>$object.<.Temperature##Float32
<b>Attributreferenser
Om ett objekt innehåller attribut av typen AttrRef eller Objid kan värden in de objekt
som dessa attribute pekar på visas med &() syntax.
<c>&(H1-H2-Motor.Object).ActualValue##Float32
betyder att H1-H2-Motor.Object innehåller en pekare till ett objekt, och det är till
ActualValue attributet i detta objekt kopplingen kommer att göras.
Kopplingen görs när grafen öppnas, och om pekaren in H1-H2-Motor.Object ändras, kommer
kopplingen inte automatiskt att ändras. Dynamiken DigSwap kan dock användas för att
koppla om alla kopplingar i en graf.
<b>Variabelt vektorindex
Vektorindex kan specificeras med attribut av typen Int32 eller UInt32. I
<c>H1-H2-Array[&(H1-H2-CurrentIndex.ActualValue)].Value##Float32
är H1-H2-CurrnetIndex.ActualValue ett integer-attribut, och värdet av detta attribut kommer
att hämtas och läggas in som vektorindex.
Indexet evalueras när grafen öppnas och om indexvärdet ändras kommer inte kopplingen
automatiskt att ändras. Dynamiken DigSwap kan dock användas för att koppla om alla
kopplingar i en graf.
<b>Nodobjekt
$node kommer att bytas ut mot nodobjektet. Detta kan till exempel användas för att
referera XttGraph-objekt där samma graf änvänds i olika noder. Till exempel
<c>$node-Graphs-Overview
kommer att fungera för alla noder som har ett XttGraph objekt med namnet Overview under
en Graph hierarki under nodobjektet.
<b>Lokal databas
Lokala variabler i en graf kan användas för att kommunicera mellan objekt i en graf.
De specificeras med prefixet $local. följt av variabelnamn och variabeltyp, t ex
<c>$local.HoldTrend##Boolean
En lokal variabel kan till exempel användas för att frysa en trendkurva genom att denna
anges i Trend.HoldAttr. Med en toggle-knapp som har samma lokala variabel i
ToggleDig.Attribute, kan frysningen slås på och av genom att trycka på knappen.
Lokala variabler är dock inte implementerat för alla typer av dynamik och aktioner.
<b>Vektorer
En del dynamiktyper som Table och XYCurve kopplas till hela vektorer i databasen. Syntaxen
för att koppla en hel vektor är 'attributename'##'type'#'length', till exempel
<c>H1-H2-A1.Value##Float32#100
där 100 är antalet element i vektorn.
<b>Vektorelement
För att koppla ett element i en vektor, är syntaxen 'attributename'##'type'#'length'['index'],
t ex
<c>H1-H2-A1.Value##Float32#100[2]
<b>Attribut typ
Typen för att attribut specificeras efter attributnamnet. Följande typer supportas
##Boolean
##Float32
##Float64
##Char
##Int8
##Int16
##Int32
##Int64
##UInt8
##UInt16
##UInt32
##UInt64
##Objid
##Time
##DeltaTime
##Status
##NetStatus
##Enum
##Mask
##DataRef
##String
##Bit
<b>String
String ska föjas av storleken på strängen, t ex ##String80
<b>Bit
Bit-typen gör det möjligt att koppla en individuell bit i en mask eller ett heltalsattribut.
Syntaxen är ##Bit#'size'['bitnumber'] eller ##Bit['bitnumber'].
size är antalet bitar i masken, och bitnumber är bitnumret som räknas från 0 för första
biten.
Exempel
<c>H1-H2-Mode.ActualValue##Bit[2]
</topic>
<topic>geref_dynamic <topic>geref_dynamic
Dynamik Dynamik
...@@ -3930,6 +4088,31 @@ Med kommandot ...@@ -3930,6 +4088,31 @@ Med kommandot
öppnas objektgrafen för objektet i första elementet. Man kan även ange dubbla led av öppnas objektgrafen för objektet i första elementet. Man kan även ange dubbla led av
attributreferenser med syntaxen &(&(attribut-referens)). attributreferenser med syntaxen &(&(attribut-referens)).
<b>Array index replacement
Ett Int32 eller UInt32 attribut can användas för vektor index med syntaxen
[&(integer-attribute)]. Med kommandot
<c>> open graph /class /instance=H1-Plates[&(H1-CurrentIndex.ActualValue)]
kommer element indexet för H1-Plates att hämtas från det aktuella värdet
av H1-CurrentIndex.ActualValue.
<b>Parent object references
Med .< tas det föregående attributet bort i ett attributnamn.
H1-Plates.Data.<.CurrentIndex kommer att resultera i H1-Plates.CurrentIndex.
Detta kan användas i objektsbilder i kombination med $object. Till exempel
<c>> open graph /class /instance=$object.<
kommer att öppna objektsbilden för objektet som innehåller det aktuella objektet.
-< syntaxen är likartad och används för objektshierarkier.
H1-Pumps-P1<- kommer att resultera i H1-Pumps. Det gör det möjligt att adressera
förälderobjekt i hierarkibilder. Till exempel
<c>> open graph /class /instance=$object-<
kommer att öppna objektsbilden för förälderobjektet.
</topic> </topic>
<topic>GeDynCommandDoubleClick <style>function <topic>GeDynCommandDoubleClick <style>function
......
...@@ -4499,6 +4499,7 @@ void Graph::get_command( char *in, char *out, GeDyn *dyn) ...@@ -4499,6 +4499,7 @@ void Graph::get_command( char *in, char *out, GeDyn *dyn)
char *s, *t0; char *s, *t0;
char *s0 = in; char *s0 = in;
char str[500]; char str[500];
bool object_found = false;
pwr_tAName oname[4]; pwr_tAName oname[4];
if ( grow->stack_cnt == 0) { if ( grow->stack_cnt == 0) {
...@@ -4556,6 +4557,7 @@ void Graph::get_command( char *in, char *out, GeDyn *dyn) ...@@ -4556,6 +4557,7 @@ void Graph::get_command( char *in, char *out, GeDyn *dyn)
t0 = out; t0 = out;
while ( (s = strstr( s0, "$object"))) { while ( (s = strstr( s0, "$object"))) {
int idx; int idx;
object_found = true;
char *sidx = s + strlen("$object"); char *sidx = s + strlen("$object");
switch ( *sidx) { switch ( *sidx) {
case '2': case '2':
...@@ -4702,6 +4704,74 @@ void Graph::get_command( char *in, char *out, GeDyn *dyn) ...@@ -4702,6 +4704,74 @@ void Graph::get_command( char *in, char *out, GeDyn *dyn)
strcpy( start, str); strcpy( start, str);
} }
} }
// Translate index variable
for ( int i = 0; i < 2; i++) {
if ( (s = strstr( out, "[&("))) {
int idx;
pwr_tAName iname, rest;
pwr_tStatus sts;
int len;
char *s1;
s++;
strcpy( iname, s+2);
s1 = strchr( iname, ')');
strncpy( rest, s1+1, sizeof(rest));
if ( s1) {
*s1 = 0;
sts = gdh_GetObjectInfo( iname, &idx, sizeof(idx));
if ( ODD(sts) && idx >= 0 && idx <= 100) {
len = sprintf( s, "%d", idx);
strcpy( s + len, rest);
}
}
else
break;
}
else
break;
}
if ( object_found) {
for ( int i = 0; i < 4; i++) {
// Remove attribute before
if ( (s = strstr( out, ".<"))) {
pwr_tAName rest;
strcpy( rest, s + 2);
for ( s--; s >= out; s--) {
if ( *s == '.') {
strcpy( s, rest);
break;
}
}
}
else
break;
if ( s == out)
break;
}
for ( int i = 0; i < 4; i++) {
// Remove segment name before
if ( (s = strstr( out, "-<"))) {
pwr_tAName rest;
strcpy( rest, s + 2);
for ( s--; s >= out; s--) {
if ( *s == '-') {
strcpy( s, rest);
break;
}
}
}
else
break;
if ( s == out)
break;
}
}
} }
graph_eDatabase Graph::parse_attr_name( char *name, char *parsed_name, graph_eDatabase Graph::parse_attr_name( char *name, char *parsed_name,
...@@ -4912,6 +4982,25 @@ graph_eDatabase Graph::parse_attr_name( char *name, char *parsed_name, ...@@ -4912,6 +4982,25 @@ graph_eDatabase Graph::parse_attr_name( char *name, char *parsed_name,
break; break;
} }
for ( int i = 0; i < 4; i++) {
// Remove segment name before
if ( (s = strstr( str, "-<"))) {
pwr_tAName rest;
strcpy( rest, s + 2);
for ( s--; s >= str; s--) {
if ( *s == '-') {
strcpy( s, rest);
break;
}
}
}
else
break;
if ( s == str)
break;
}
if ( ((s = strstr( str, "$node")) || (s = strstr( str, "$NODE"))) && if ( ((s = strstr( str, "$node")) || (s = strstr( str, "$NODE"))) &&
mode != graph_eMode_Development) { mode != graph_eMode_Development) {
char nodename[80]; char nodename[80];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment