Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
P
proview
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Esteban Blanc
proview
Commits
c98ed0cc
Commit
c98ed0cc
authored
Nov 21, 2012
by
Claes Sjofors
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Ge axis dynamic implemeted
parent
0f2786af
Changes
22
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
1861 additions
and
856 deletions
+1861
-856
xtt/lib/ge/src/ge_attrnav.cpp
xtt/lib/ge/src/ge_attrnav.cpp
+97
-97
xtt/lib/ge/src/ge_dyn.cpp
xtt/lib/ge/src/ge_dyn.cpp
+742
-379
xtt/lib/ge/src/ge_dyn.h
xtt/lib/ge/src/ge_dyn.h
+245
-178
xtt/lib/ge/src/ge_graph.cpp
xtt/lib/ge/src/ge_graph.cpp
+159
-72
xtt/lib/ge/src/ge_graph.h
xtt/lib/ge/src/ge_graph.h
+7
-5
xtt/lib/ge/src/ge_graph_command.cpp
xtt/lib/ge/src/ge_graph_command.cpp
+2
-2
xtt/lib/ge/src/ge_graph_javabean.cpp
xtt/lib/ge/src/ge_graph_javabean.cpp
+46
-38
xtt/lib/ge/src/ge_graph_object.cpp
xtt/lib/ge/src/ge_graph_object.cpp
+3
-3
xtt/lib/ge/src/ge_subgraphs.cpp
xtt/lib/ge/src/ge_subgraphs.cpp
+4
-2
xtt/lib/ge/src/pwr_ge_setup.dat
xtt/lib/ge/src/pwr_ge_setup.dat
+2
-0
xtt/lib/glow/src/glow.h
xtt/lib/glow/src/glow.h
+15
-7
xtt/lib/glow/src/glow_growapi.cpp
xtt/lib/glow/src/glow_growapi.cpp
+56
-29
xtt/lib/glow/src/glow_growapi.h
xtt/lib/glow/src/glow_growapi.h
+20
-9
xtt/lib/glow/src/glow_growaxis.cpp
xtt/lib/glow/src/glow_growaxis.cpp
+206
-12
xtt/lib/glow/src/glow_growaxis.h
xtt/lib/glow/src/glow_growaxis.h
+16
-0
xtt/lib/glow/src/glow_growaxisarc.cpp
xtt/lib/glow/src/glow_growaxisarc.cpp
+192
-4
xtt/lib/glow/src/glow_growaxisarc.h
xtt/lib/glow/src/glow_growaxisarc.h
+16
-0
xtt/lib/glow/src/glow_growctx.cpp
xtt/lib/glow/src/glow_growctx.cpp
+13
-7
xtt/lib/glow/src/glow_growctx.h
xtt/lib/glow/src/glow_growctx.h
+5
-3
xtt/lib/glow/src/glow_grownode.cpp
xtt/lib/glow/src/glow_grownode.cpp
+1
-1
xtt/lib/glow/src/glow_nodeclass.cpp
xtt/lib/glow/src/glow_nodeclass.cpp
+10
-6
xtt/lib/glow/src/glow_nodeclass.h
xtt/lib/glow/src/glow_nodeclass.h
+4
-2
No files found.
xtt/lib/ge/src/ge_attrnav.cpp
View file @
c98ed0cc
This diff is collapsed.
Click to expand it.
xtt/lib/ge/src/ge_dyn.cpp
View file @
c98ed0cc
This diff is collapsed.
Click to expand it.
xtt/lib/ge/src/ge_dyn.h
View file @
c98ed0cc
This diff is collapsed.
Click to expand it.
xtt/lib/ge/src/ge_graph.cpp
View file @
c98ed0cc
This diff is collapsed.
Click to expand it.
xtt/lib/ge/src/ge_graph.h
View file @
c98ed0cc
...
...
@@ -90,9 +90,9 @@
//! Type of attributes. Should not collide with glow_eType
typedef
enum
{
ge_eAttrType_DynType
=
glow_eType_DynType
,
//!< DynType.
ge_eAttrType_DynType
1
=
glow_eType_DynType1
,
//!< DynType.
ge_eAttrType_DynTypeTone
=
1001
,
//!< DynType with color tone.
ge_eAttrType_ActionType
=
glow_eType_ActionType
,
//!< ActionType.
ge_eAttrType_ActionType
1
=
glow_eType_ActionType1
,
//!< ActionType.
ge_eAttrType_AnimSequence
=
1003
,
//!< Animation sequence.
ge_eAttrType_LimitType
=
1004
,
//!< Limit type (Gt or Lt).
ge_eAttrType_InstanceMask
=
1005
,
//!< Instance mask.
...
...
@@ -100,7 +100,9 @@ typedef enum {
ge_eAttrType_Dyn
=
1007
,
//!< Dynamic data.
ge_eAttrType_ScaleType
=
1008
,
//!< Scale type.
ge_eAttrType_CurveDataType
=
1009
,
//!< Data type for XY_Curve.
ge_eAttrType_OptionMenuType
=
1010
//!< OptionMenu type.
ge_eAttrType_OptionMenuType
=
1010
,
//!< OptionMenu type.
ge_eAttrType_DynType2
=
glow_eType_DynType2
,
//!< DynType mask 2.
ge_eAttrType_ActionType2
=
glow_eType_ActionType2
,
//!< ActionType mask 2.
}
ge_eAttrType
;
//! Graph mode.
...
...
@@ -1293,8 +1295,8 @@ class Graph {
\param x x coordinate for object.
\param y y coordinate for object.
*/
void
create_axis
(
grow_tObject
*
object
,
double
x
,
double
y
);
void
create_axisarc
(
grow_tObject
*
object
,
double
x
,
double
y
);
void
create_axis
(
grow_tObject
*
object
,
double
x
,
double
y
,
int
dynamic
);
void
create_axisarc
(
grow_tObject
*
object
,
double
x
,
double
y
,
int
dynamic
);
void
create_pie
(
grow_tObject
*
object
,
double
x
,
double
y
);
void
create_barchart
(
grow_tObject
*
object
,
double
x
,
double
y
);
...
...
xtt/lib/ge/src/ge_graph_command.cpp
View file @
c98ed0cc
...
...
@@ -1030,7 +1030,7 @@ static int graph_set_func( void *client_data,
{
case
glow_eType_Int
:
case
glow_eType_TraceColor
:
case
glow_eType_DynType
:
case
glow_eType_DynType
1
:
case
glow_eType_Access
:
case
glow_eType_Boolean
:
case
glow_eType_Direction
:
...
...
@@ -1218,7 +1218,7 @@ static int graph_set_func( void *client_data,
{
case
glow_eType_Int
:
case
glow_eType_TraceColor
:
case
glow_eType_DynType
:
case
glow_eType_DynType
1
:
case
glow_eType_Access
:
case
glow_eType_Boolean
:
case
glow_eType_Direction
:
...
...
xtt/lib/ge/src/ge_graph_javabean.cpp
View file @
c98ed0cc
...
...
@@ -69,8 +69,10 @@ int Graph::export_javabean( char *filename, char *bean_name)
char
beaninfo_filename
[
120
];
char
*
s
;
double
x0
,
x1
,
y0
,
y1
;
int
trace_type
;
int
dyn_action_type
;
int
trace_type1
;
int
trace_type2
;
int
dyn_action_type1
;
int
dyn_action_type2
;
glow_eDrawType
trace_color
;
glow_eDrawType
trace_color2
;
char
low_bean_name
[
80
];
...
...
@@ -80,10 +82,10 @@ int Graph::export_javabean( char *filename, char *bean_name)
cdh_ToLower
(
low_bean_name
,
bean_name
);
grow_GetSubGraphDynType
(
grow
->
ctx
,
&
trace_type
,
&
dyn_action_type
);
grow_GetSubGraphDynType
(
grow
->
ctx
,
&
trace_type
1
,
&
trace_type2
,
&
dyn_action_type1
,
&
dyn_action_type2
);
grow_GetSubGraphTraceColor
(
grow
->
ctx
,
&
trace_color
,
&
trace_color2
);
if
(
grow_IsSlider
(
grow
->
ctx
))
trace_type
=
graph_eTrace_Slider
;
trace_type
1
=
graph_eTrace_Slider
;
grow_GetSubgraphAnnotNumbers
(
grow
->
ctx
,
&
numbers
,
&
annot_cnt
);
...
...
@@ -96,7 +98,7 @@ int Graph::export_javabean( char *filename, char *bean_name)
}
fp
.
open
(
fname
);
switch
(
trace_type
)
switch
(
trace_type
1
)
{
case
graph_eTrace_SetDig
:
case
graph_eTrace_ResetDig
:
...
...
@@ -126,7 +128,7 @@ int Graph::export_javabean( char *filename, char *bean_name)
" Dimension size;"
<<
endl
<<
" Object root;"
<<
endl
<<
" JopEngine en;"
<<
endl
;
switch
(
trace_type
)
switch
(
trace_type
1
)
{
case
graph_eTrace_SetDig
:
case
graph_eTrace_SetDigWithTone
:
...
...
@@ -282,7 +284,7 @@ endl <<
fp
<<
" public Dimension getPreferredSize() { return size;}"
<<
endl
<<
" public Dimension getMinimumSize() { return size;}"
<<
endl
;
switch
(
trace_type
)
switch
(
trace_type
1
)
{
case
graph_eTrace_SetDig
:
case
graph_eTrace_ResetDig
:
...
...
@@ -376,7 +378,7 @@ endl <<
" }"
<<
endl
<<
" valueTextOld = valueText;"
<<
endl
<<
" }"
<<
endl
;
switch
(
trace_type
)
switch
(
trace_type
1
)
{
case
graph_eTrace_SetDig
:
case
graph_eTrace_ResetDig
:
...
...
@@ -521,7 +523,7 @@ endl <<
" public Dimension getPreferredSize() { return size;}"
<<
endl
<<
" public Dimension getMinimumSize() { return size;}"
<<
endl
;
switch
(
trace_type
)
switch
(
trace_type
1
)
{
case
graph_eTrace_DigWithError
:
{
...
...
@@ -968,7 +970,7 @@ endl <<
" _rotate.setDisplayName(
\"
rotate
\"
);"
<<
endl
<<
" _rotate.setShortDescription(
\"
rotate
\"
);"
<<
endl
;
switch
(
trace_type
)
switch
(
trace_type
1
)
{
case
graph_eTrace_SetDig
:
case
graph_eTrace_ResetDig
:
...
...
@@ -1386,20 +1388,22 @@ int Graph::export_gejava_nodeclass( ofstream& fp, grow_tNodeClass nodeclass)
{
char
bean_name
[
40
];
double
x0
,
x1
,
y0
,
y1
;
int
dyn_type
;
int
dyn_action_type
;
int
dyn_type1
;
int
dyn_type2
;
int
dyn_action_type1
;
int
dyn_action_type2
;
int
pages
;
grow_tObject
*
objectlist
,
*
object_p
;
int
object_cnt
;
int
i
;
grow_GetNodeClassJavaName
(
nodeclass
,
bean_name
);
grow_GetNodeClassDynType
(
nodeclass
,
&
dyn_type
,
&
dyn_action_type
);
grow_GetNodeClassDynType
(
nodeclass
,
&
dyn_type
1
,
&
dyn_type2
,
&
dyn_action_type1
,
&
dyn_action_type2
);
grow_MeasureNodeClassJavaBean
(
nodeclass
,
&
x1
,
&
x0
,
&
y1
,
&
y0
);
pages
=
grow_GetNodeClassPages
(
nodeclass
);
if
(
dyn_action_type
&
ge_mActionType
_ValueInput
)
{
if
(
dyn_action_type
1
&
ge_mActionType1
_ValueInput
)
{
glow_eDrawType
annot_background
=
(
glow_eDrawType
)
31
;
grow_GetNodeClassAnnotBackground
(
nodeclass
,
&
annot_background
);
...
...
@@ -2034,8 +2038,10 @@ int Graph::export_gejava( char *filename, char *bean_name, int applet, int html)
int
Graph
::
export_ObjectTraceAttr
(
ofstream
&
fp
,
grow_tObject
object
,
int
cnt
)
{
int
dyn_type
;
int
dyn_action_type
;
int
dyn_type1
;
int
dyn_type2
;
int
dyn_action_type1
;
int
dyn_action_type2
;
glow_sTraceData
*
trace_data
;
glow_eDrawType
trace_color
;
glow_eDrawType
trace_color2
;
...
...
@@ -2055,9 +2061,9 @@ int Graph::export_ObjectTraceAttr( ofstream& fp, grow_tObject object, int cnt)
sprintf
(
&
var_name
[
strlen
(
var_name
)],
"%d"
,
cnt
);
// todo
dyn_type
=
(
graph_eTrace
)
trace_data
->
attr_type
;
if
(
dyn_type
==
graph_eTrace_Inherit
)
grow_GetObjectClassDynType
(
object
,
&
dyn_type
,
&
dyn_action_type
);
dyn_type
1
=
(
graph_eTrace
)
trace_data
->
attr_type
;
if
(
dyn_type
1
==
graph_eTrace_Inherit
)
grow_GetObjectClassDynType
(
object
,
&
dyn_type
1
,
&
dyn_type2
,
&
dyn_action_type1
,
&
dyn_action_type2
);
trace_color
=
trace_data
->
color
;
if
(
trace_color
==
glow_eDrawType_Inherit
)
...
...
@@ -2067,10 +2073,10 @@ int Graph::export_ObjectTraceAttr( ofstream& fp, grow_tObject object, int cnt)
grow_GetObjectClassTraceColor
(
object
,
&
color
,
&
trace_color2
);
// dyn_type No equals Inherit from class
if
(
dyn_type
==
graph_eTrace_No
)
dyn_type
=
graph_eTrace_Inherit
;
if
(
dyn_type
1
==
graph_eTrace_No
)
dyn_type
1
=
graph_eTrace_Inherit
;
switch
(
dyn_type
)
switch
(
dyn_type
1
)
{
case
graph_eTrace_Dig
:
case
graph_eTrace_DigWithCommand
:
...
...
@@ -2207,12 +2213,14 @@ int Graph::export_GejavaObjectTraceAttr( ofstream& fp, grow_tObject object, int
int
*
numbers
;
char
annot_str
[
200
];
GeDyn
*
dyn
;
int
dyn_type
;
int
dyn_action_type
;
int
dyn_type1
;
int
dyn_type2
;
int
dyn_action_type1
;
int
dyn_action_type2
;
grow_GetUserData
(
object
,
(
void
**
)
&
dyn
);
grow_GetObjectClassJavaName
(
object
,
class_name
);
grow_GetObjectClassDynType
(
object
,
&
dyn_type
,
&
dyn_action_type
);
grow_GetObjectClassDynType
(
object
,
&
dyn_type
1
,
&
dyn_type2
,
&
dyn_action_type1
,
&
dyn_action_type2
);
strcpy
(
var_name
,
class_name
);
var_name
[
0
]
=
_tolower
(
var_name
[
0
]);
...
...
@@ -2229,7 +2237,7 @@ int Graph::export_GejavaObjectTraceAttr( ofstream& fp, grow_tObject object, int
fp
<<
" "
<<
var_name
<<
".setAnnot"
<<
numbers
[
i
]
<<
"(
\"
"
<<
annot_str
<<
"
\"
);"
<<
endl
;
}
if
(
dyn_action_type
&
ge_mActionType
_ValueInput
)
{
if
(
dyn_action_type
1
&
ge_mActionType1
_ValueInput
)
{
// Set text size of GeTextField
double
tsize
;
int
sts
;
...
...
@@ -2275,7 +2283,7 @@ int Graph::export_BarTraceAttr( ofstream& fp, grow_tObject object, int cnt)
sprintf
(
&
var_name
[
strlen
(
var_name
)],
"%d"
,
cnt
);
for
(
GeDynElem
*
elem
=
dyn
->
elements
;
elem
;
elem
=
elem
->
next
)
{
if
(
elem
->
dyn_type
==
ge_mDynType
_Bar
)
{
if
(
elem
->
dyn_type
1
==
ge_mDynType1
_Bar
)
{
if
(
strcmp
(
((
GeBar
*
)
elem
)
->
attribute
,
""
)
!=
0
)
fp
<<
" "
<<
var_name
<<
".setPwrAttribute(
\"
"
<<
((
GeBar
*
)
elem
)
->
attribute
<<
"
\"
);"
<<
endl
;
...
...
@@ -2288,9 +2296,9 @@ int Graph::export_BarTraceAttr( ofstream& fp, grow_tObject object, int cnt)
}
break
;
}
if
(
dyn
->
total_action_type
&
~
ge_mActionType
_Inherit
)
{
if
(
dyn
->
total_action_type
1
&
~
ge_mActionType1
_Inherit
)
{
fp
<<
" "
<<
var_name
<<
".dd.setActionType("
<<
(
int
)
dyn
->
total_action_type
<<
");"
<<
endl
<<
" "
<<
var_name
<<
".dd.setActionType("
<<
(
int
)
dyn
->
total_action_type
1
<<
");"
<<
endl
<<
" "
<<
var_name
<<
".dd.setAccess("
<<
(
int
)
dyn
->
access
<<
");"
<<
endl
;
dyn
->
export_java
(
object
,
fp
,
var_name
);
...
...
@@ -2313,7 +2321,7 @@ int Graph::export_TrendTraceAttr( ofstream& fp, grow_tObject object, int cnt)
for
(
GeDynElem
*
elem
=
dyn
->
elements
;
elem
;
elem
=
elem
->
next
)
{
if
(
elem
->
dyn_type
==
ge_mDynType
_Trend
)
{
if
(
elem
->
dyn_type
1
==
ge_mDynType1
_Trend
)
{
if
(
strcmp
(
((
GeTrend
*
)
elem
)
->
attribute1
,
""
)
!=
0
)
fp
<<
" "
<<
var_name
<<
".setPwrAttribute1(
\"
"
<<
((
GeTrend
*
)
elem
)
->
attribute1
<<
"
\"
);"
<<
endl
;
...
...
@@ -2335,9 +2343,9 @@ int Graph::export_TrendTraceAttr( ofstream& fp, grow_tObject object, int cnt)
}
break
;
}
if
(
dyn
->
total_action_type
&
~
ge_mActionType
_Inherit
)
{
if
(
dyn
->
total_action_type
1
&
~
ge_mActionType1
_Inherit
)
{
fp
<<
" "
<<
var_name
<<
".dd.setActionType("
<<
(
int
)
dyn
->
total_action_type
<<
");"
<<
endl
<<
" "
<<
var_name
<<
".dd.setActionType("
<<
(
int
)
dyn
->
total_action_type
1
<<
");"
<<
endl
<<
" "
<<
var_name
<<
".dd.setAccess("
<<
(
int
)
dyn
->
access
<<
");"
<<
endl
;
dyn
->
export_java
(
object
,
fp
,
var_name
);
...
...
@@ -2359,7 +2367,7 @@ int Graph::export_PieTraceAttr( ofstream& fp, grow_tObject object, int cnt)
sprintf
(
&
var_name
[
strlen
(
var_name
)],
"%d"
,
cnt
);
for
(
GeDynElem
*
elem
=
dyn
->
elements
;
elem
;
elem
=
elem
->
next
)
{
if
(
elem
->
dyn_type
==
ge_mDynType
_Pie
)
{
if
(
elem
->
dyn_type
1
==
ge_mDynType1
_Pie
)
{
fp
<<
" "
<<
var_name
<<
".setPwrAttribute(new String[]{"
;
...
...
@@ -2376,9 +2384,9 @@ int Graph::export_PieTraceAttr( ofstream& fp, grow_tObject object, int cnt)
}
break
;
}
if
(
dyn
->
total_action_type
&
~
ge_mActionType
_Inherit
)
{
if
(
dyn
->
total_action_type
1
&
~
ge_mActionType1
_Inherit
)
{
fp
<<
" "
<<
var_name
<<
".dd.setActionType("
<<
(
int
)
dyn
->
total_action_type
<<
");"
<<
endl
<<
" "
<<
var_name
<<
".dd.setActionType("
<<
(
int
)
dyn
->
total_action_type
1
<<
");"
<<
endl
<<
" "
<<
var_name
<<
".dd.setAccess("
<<
(
int
)
dyn
->
access
<<
");"
<<
endl
;
dyn
->
export_java
(
object
,
fp
,
var_name
);
...
...
@@ -2400,7 +2408,7 @@ int Graph::export_BarChartTraceAttr( ofstream& fp, grow_tObject object, int cnt)
sprintf
(
&
var_name
[
strlen
(
var_name
)],
"%d"
,
cnt
);
for
(
GeDynElem
*
elem
=
dyn
->
elements
;
elem
;
elem
=
elem
->
next
)
{
if
(
elem
->
dyn_type
==
ge_mDynType
_BarChart
)
{
if
(
elem
->
dyn_type
1
==
ge_mDynType1
_BarChart
)
{
fp
<<
" "
<<
var_name
<<
".setPwrAttribute(new String[]{"
;
...
...
@@ -2416,9 +2424,9 @@ int Graph::export_BarChartTraceAttr( ofstream& fp, grow_tObject object, int cnt)
}
break
;
}
if
(
dyn
->
total_action_type
&
~
ge_mActionType
_Inherit
)
{
if
(
dyn
->
total_action_type
1
&
~
ge_mActionType1
_Inherit
)
{
fp
<<
" "
<<
var_name
<<
".dd.setActionType("
<<
(
int
)
dyn
->
total_action_type
<<
");"
<<
endl
<<
" "
<<
var_name
<<
".dd.setActionType("
<<
(
int
)
dyn
->
total_action_type
1
<<
");"
<<
endl
<<
" "
<<
var_name
<<
".dd.setAccess("
<<
(
int
)
dyn
->
access
<<
");"
<<
endl
;
dyn
->
export_java
(
object
,
fp
,
var_name
);
...
...
xtt/lib/ge/src/ge_graph_object.cpp
View file @
c98ed0cc
...
...
@@ -1315,7 +1315,7 @@ static int graph_object_collect_build( Graph *graph, pwr_sAttrRef *attrref)
dyn
=
new
GeDyn
(
graph
);
grow_SetUserData
(
scantime_button
,
(
void
*
)
dyn
);
dyn
->
set_dyn
(
ge_mDynType
_Value
,
ge_mActionType_ValueInput
);
dyn
->
set_dyn
(
ge_mDynType
1_Value
,
ge_mDynType2_No
,
ge_mActionType1_ValueInput
,
ge_mActionType2_No
);
dyn
->
update_elements
();
dyn
->
set_access
(
(
glow_mAccess
)
65535
);
dyn
->
set_attribute
(
scantime_button
,
"$local.ScanTime##Float32"
,
0
);
...
...
@@ -1336,7 +1336,7 @@ static int graph_object_collect_build( Graph *graph, pwr_sAttrRef *attrref)
grow_SetSelectOrigColorTone
(
graph
->
grow
->
ctx
,
glow_eDrawTone_Gray
);
grow_SelectRemove
(
graph
->
grow
->
ctx
,
hold_button
);
dyn
->
set_dyn
(
ge_mDynType
_No
,
ge_mActionType_SetDig
);
dyn
->
set_dyn
(
ge_mDynType
1_No
,
ge_mDynType2_No
,
ge_mActionType1_SetDig
,
ge_mActionType2_No
);
dyn
->
update_elements
();
dyn
->
set_access
(
(
glow_mAccess
)
65535
);
dyn
->
set_attribute
(
hold_button
,
"$local.TrendHold##Boolean"
,
0
);
...
...
@@ -1373,7 +1373,7 @@ static int graph_object_collect_build( Graph *graph, pwr_sAttrRef *attrref)
glow_eDrawType_Color40
,
NULL
,
&
od
->
trend_objects
[
od
->
trend_cnt
]);
dyn
=
new
GeDyn
(
graph
);
dyn
->
dyn_type
=
ge_mDynType
_Trend
;
dyn
->
dyn_type
1
=
ge_mDynType1
_Trend
;
dyn
->
update_elements
();
grow_SetUserData
(
od
->
trend_objects
[
od
->
trend_cnt
],
(
void
*
)
dyn
);
...
...
xtt/lib/ge/src/ge_subgraphs.cpp
View file @
c98ed0cc
...
...
@@ -672,10 +672,12 @@ int SubGraphs::edit_attributes( void *object)
Attr
*
attr
;
subgraphs_tAttr
attrlist_p
;
int
trace_type
;
int
dyn_action_type
;
int
dyn_type2
;
int
dyn_action_type1
;
int
dyn_action_type2
;
grow_GetObjectAttrInfo
(
(
grow_tObject
)
object
,
NULL
,
&
grow_info
,
&
grow_info_cnt
);
grow_GetNodeClassDynType
(
object
,
&
trace_type
,
&
dyn_
action_type
);
grow_GetNodeClassDynType
(
object
,
&
trace_type
,
&
dyn_
type2
,
&
dyn_action_type1
,
&
dyn_action_type2
);
grow_info_p
=
grow_info
;
for
(
i
=
0
;
i
<
grow_info_cnt
;
i
++
)
...
...
xtt/lib/ge/src/pwr_ge_setup.dat
View file @
c98ed0cc
...
...
@@ -21,7 +21,9 @@ menu Analog
subgraph XYCurve pwr_xycurve.component 25
subgraph Bar pwr_bar.component 26
subgraph Axis pwr_axis.component 27
subgraph DynamicAxis pwr_dynamicaxis.component 27
subgraph AxisArc pwr_axisarc.component 250
subgraph DynamicAxisArc pwr_dynamicaxisarc.component 250
subgraph Pie pwr_pie.component 6
subgraph BarChart pwr_barchart.component 25
}
...
...
xtt/lib/glow/src/glow.h
View file @
c98ed0cc
...
...
@@ -82,8 +82,8 @@ typedef enum {
glow_eType_Int
,
//!< Type is an integer
glow_eType_Double
,
//!< Type is a double
glow_eType_String
,
//!< Type is a string
glow_eType_DynType
,
//!< Type of dynamics
glow_eType_ActionType
,
//!< Type of action
glow_eType_DynType
1
,
//!< Type of dynamics mask 1
glow_eType_ActionType
1
,
//!< Type of action mask 1
glow_eType_Direction
,
//!< Type is glow_eDirection
glow_eType_Color
,
//!< Type is a drawtype (glow_eDrawType)
glow_eType_Tone
,
//!< Type is a colortone ( glow_eDrawTone)
...
...
@@ -99,7 +99,9 @@ typedef enum {
glow_eType_Font
,
//!< Type is glow_eFont
glow_eType_Gradient
,
//!< Type is glow_eGradient
glow_eType_HotIndication
,
//!< Type is glow_eHotIndication
glow_eType_AnnotType
//!< Type is glow_eAnnotType
glow_eType_AnnotType
,
//!< Type is glow_eAnnotType
glow_eType_DynType2
,
//!< Type of dynamics mask 2
glow_eType_ActionType2
//!< Type of action mask 2
}
glow_eType
;
//! Type of Ctx class
...
...
@@ -1130,7 +1132,7 @@ typedef enum {
glow_eSave_NodeClass_arg_cnt
=
305
,
glow_eSave_NodeClass_argname
=
306
,
glow_eSave_NodeClass_argtype
=
307
,
glow_eSave_NodeClass_dyn_type
=
308
,
glow_eSave_NodeClass_dyn_type
1
=
308
,
glow_eSave_NodeClass_dyn_color1
=
309
,
glow_eSave_NodeClass_no_con_obstacle
=
310
,
glow_eSave_NodeClass_slider
=
311
,
...
...
@@ -1143,7 +1145,7 @@ typedef enum {
glow_eSave_NodeClass_y1
=
318
,
glow_eSave_NodeClass_x0
=
319
,
glow_eSave_NodeClass_x1
=
320
,
glow_eSave_NodeClass_dyn_action_type
=
321
,
glow_eSave_NodeClass_dyn_action_type
1
=
321
,
glow_eSave_NodeClass_dyn_color3
=
322
,
glow_eSave_NodeClass_dyn_color4
=
323
,
glow_eSave_NodeClass_dyn_attr1
=
324
,
...
...
@@ -1152,6 +1154,8 @@ typedef enum {
glow_eSave_NodeClass_dyn_attr4
=
327
,
glow_eSave_NodeClass_input_focus_mark
=
328
,
glow_eSave_NodeClass_userdata_cb
=
329
,
glow_eSave_NodeClass_dyn_type2
=
330
,
glow_eSave_NodeClass_dyn_action_type2
=
331
,
glow_eSave_ConClass_cc_name
=
400
,
glow_eSave_ConClass_con_type
=
401
,
glow_eSave_ConClass_corner
=
402
,
...
...
@@ -1324,7 +1328,7 @@ typedef enum {
glow_eSave_GrowCtx_y1
=
2212
,
glow_eSave_GrowCtx_path_cnt
=
2213
,
glow_eSave_GrowCtx_path
=
2214
,
glow_eSave_GrowCtx_dyn_type
=
2215
,
glow_eSave_GrowCtx_dyn_type
1
=
2215
,
glow_eSave_GrowCtx_dyn_color1
=
2216
,
glow_eSave_GrowCtx_no_con_obstacle
=
2217
,
glow_eSave_GrowCtx_slider
=
2218
,
...
...
@@ -1345,7 +1349,7 @@ typedef enum {
glow_eSave_GrowCtx_cycle
=
2233
,
glow_eSave_GrowCtx_mb3_action
=
2234
,
glow_eSave_GrowCtx_translate_on
=
2235
,
glow_eSave_GrowCtx_dyn_action_type
=
2236
,
glow_eSave_GrowCtx_dyn_action_type
1
=
2236
,
glow_eSave_GrowCtx_dyn_color3
=
2237
,
glow_eSave_GrowCtx_dyn_color4
=
2238
,
glow_eSave_GrowCtx_dyn_attr1
=
2239
,
...
...
@@ -1355,6 +1359,8 @@ typedef enum {
glow_eSave_GrowCtx_input_focus_mark
=
2243
,
glow_eSave_GrowCtx_userdata_cb
=
2244
,
glow_eSave_GrowCtx_bitmap_fonts
=
2245
,
glow_eSave_GrowCtx_dyn_type2
=
2246
,
glow_eSave_GrowCtx_dyn_action_type2
=
2247
,
glow_eSave_GrowSubAnnot_x_right
=
2300
,
glow_eSave_GrowSubAnnot_x_left
=
2301
,
glow_eSave_GrowSubAnnot_y_high
=
2302
,
...
...
@@ -1567,6 +1573,7 @@ typedef enum {
glow_eSave_GrowAxis_text_size
=
3707
,
glow_eSave_GrowAxis_text_drawtype
=
3708
,
glow_eSave_GrowAxis_text_color_drawtype
=
3709
,
glow_eSave_GrowAxis_userdata_cb
=
3710
,
glow_eSave_GrowRectRounded_x_right
=
3800
,
glow_eSave_GrowRectRounded_x_left
=
3801
,
glow_eSave_GrowRectRounded_y_high
=
3802
,
...
...
@@ -1758,6 +1765,7 @@ typedef enum {
glow_eSave_GrowAxisArc_text_size
=
4408
,
glow_eSave_GrowAxisArc_text_drawtype
=
4409
,
glow_eSave_GrowAxisArc_text_color_drawtype
=
4410
,
glow_eSave_GrowAxisArc_userdata_cb
=
4411
,
glow_eSave_GrowPie_arc_part
=
4500
,
glow_eSave_GrowPie_sectors
=
4501
,
glow_eSave_GrowPie_min_value
=
4502
,
...
...
xtt/lib/glow/src/glow_growapi.cpp
View file @
c98ed0cc
...
...
@@ -2954,15 +2954,20 @@ int grow_GetObjectAttrInfo( grow_tObject object, char *transtab,
attrinfo
[
i
].
type
=
glow_eType_Int
;
attrinfo
[
i
++
].
size
=
sizeof
(
op
->
dyn_attr
[
0
]);
strcpy
(
attrinfo
[
i
].
name
,
"DynType"
);
attrinfo
[
i
].
value_p
=
&
op
->
dyn_type
;
attrinfo
[
i
].
type
=
glow_eType_DynType
;
attrinfo
[
i
++
].
size
=
sizeof
(
op
->
dyn_type
);
strcpy
(
attrinfo
[
i
].
name
,
"DynType
1
"
);
attrinfo
[
i
].
value_p
=
&
op
->
dyn_type
1
;
attrinfo
[
i
].
type
=
glow_eType_DynType
1
;
attrinfo
[
i
++
].
size
=
sizeof
(
op
->
dyn_type
1
);
strcpy
(
attrinfo
[
i
].
name
,
"Action"
);
attrinfo
[
i
].
value_p
=
&
op
->
dyn_action_type
;
attrinfo
[
i
].
type
=
glow_eType_ActionType
;
attrinfo
[
i
++
].
size
=
sizeof
(
op
->
dyn_action_type
);
strcpy
(
attrinfo
[
i
].
name
,
"DynType2"
);
attrinfo
[
i
].
value_p
=
&
op
->
dyn_type2
;
attrinfo
[
i
].
type
=
glow_eType_DynType2
;
attrinfo
[
i
++
].
size
=
sizeof
(
op
->
dyn_type2
);
strcpy
(
attrinfo
[
i
].
name
,
"Action1"
);
attrinfo
[
i
].
value_p
=
&
op
->
dyn_action_type1
;
attrinfo
[
i
].
type
=
glow_eType_ActionType1
;
attrinfo
[
i
++
].
size
=
sizeof
(
op
->
dyn_action_type1
);
strcpy
(
attrinfo
[
i
].
name
,
"Cycle"
);
attrinfo
[
i
].
value_p
=
&
op
->
cycle
;
...
...
@@ -3000,17 +3005,23 @@ int grow_GetSubGraphAttrInfo( grow_tCtx ctx, char *transtab, grow_sAttrInfo **in
i
=
0
;
if
(
(
name
=
growapi_translate
(
transtab
,
"DynType"
)))
{
if
(
(
name
=
growapi_translate
(
transtab
,
"DynType1"
)))
{
strcpy
(
attrinfo
[
i
].
name
,
name
);
attrinfo
[
i
].
value_p
=
&
ctx
->
dyn_type1
;
attrinfo
[
i
].
type
=
glow_eType_DynType1
;
attrinfo
[
i
++
].
size
=
sizeof
(
ctx
->
dyn_type1
);
}
if
(
(
name
=
growapi_translate
(
transtab
,
"DynType2"
)))
{
strcpy
(
attrinfo
[
i
].
name
,
name
);
attrinfo
[
i
].
value_p
=
&
ctx
->
dyn_type
;
attrinfo
[
i
].
type
=
glow_eType_DynType
;
attrinfo
[
i
++
].
size
=
sizeof
(
ctx
->
dyn_type
);
attrinfo
[
i
].
value_p
=
&
ctx
->
dyn_type
2
;
attrinfo
[
i
].
type
=
glow_eType_DynType
2
;
attrinfo
[
i
++
].
size
=
sizeof
(
ctx
->
dyn_type
2
);
}
if
(
(
name
=
growapi_translate
(
transtab
,
"DynActionType"
)))
{
if
(
(
name
=
growapi_translate
(
transtab
,
"DynActionType
1
"
)))
{
strcpy
(
attrinfo
[
i
].
name
,
name
);
attrinfo
[
i
].
value_p
=
&
ctx
->
dyn_action_type
;
attrinfo
[
i
].
type
=
glow_eType_ActionType
;
attrinfo
[
i
++
].
size
=
sizeof
(
ctx
->
dyn_action_type
);
attrinfo
[
i
].
value_p
=
&
ctx
->
dyn_action_type
1
;
attrinfo
[
i
].
type
=
glow_eType_ActionType
1
;
attrinfo
[
i
++
].
size
=
sizeof
(
ctx
->
dyn_action_type
1
);
}
if
(
(
name
=
growapi_translate
(
transtab
,
"DynColor1"
)))
{
strcpy
(
attrinfo
[
i
].
name
,
name
);
...
...
@@ -4218,20 +4229,24 @@ void grow_SetPath( grow_tCtx ctx, int path_cnt, const char *path)
ctx
->
set_path
(
path_cnt
,
path
);
}
void
grow_GetObjectClassDynType
(
grow_tObject
object
,
int
*
dyn_type
,
int
*
dyn_action_type
)
void
grow_GetObjectClassDynType
(
grow_tObject
object
,
int
*
dyn_type
1
,
int
*
dyn_type2
,
int
*
dyn_action_type1
,
int
*
dyn_action_type2
)
{
if
(
((
GlowArrayElem
*
)
object
)
->
type
()
==
glow_eObjectType_GrowNode
||
((
GlowArrayElem
*
)
object
)
->
type
()
==
glow_eObjectType_GrowSlider
||
((
GlowArrayElem
*
)
object
)
->
type
()
==
glow_eObjectType_GrowGroup
)
{
GlowNodeClass
*
base_nc
=
((
GrowNode
*
)
object
)
->
nc
->
get_base_nc
();
*
dyn_type
=
base_nc
->
dyn_type
;
*
dyn_action_type
=
base_nc
->
dyn_action_type
;
*
dyn_type1
=
base_nc
->
dyn_type1
;
*
dyn_type2
=
base_nc
->
dyn_type2
;
*
dyn_action_type1
=
base_nc
->
dyn_action_type1
;
*
dyn_action_type2
=
base_nc
->
dyn_action_type2
;
}
else
{
*
dyn_type
=
0
;
*
dyn_action_type
=
0
;
*
dyn_type1
=
0
;
*
dyn_type2
=
0
;
*
dyn_action_type1
=
0
;
*
dyn_action_type2
=
0
;
}
}
...
...
@@ -4241,12 +4256,14 @@ void grow_GetObjectClassCycle( grow_tObject object, glow_eCycle *cycle)
*
cycle
=
base_nc
->
cycle
;
}
void
grow_GetNodeClassDynType
(
grow_tNodeClass
nodeclass
,
int
*
dyn_type
,
int
*
dyn_action_type
)
void
grow_GetNodeClassDynType
(
grow_tNodeClass
nodeclass
,
int
*
dyn_type
1
,
int
*
dyn_type2
,
int
*
dyn_action_type1
,
int
*
dyn_action_type2
)
{
GlowNodeClass
*
base_nc
=
((
GlowNodeClass
*
)
nodeclass
)
->
get_base_nc
();
*
dyn_type
=
base_nc
->
dyn_type
;
*
dyn_action_type
=
base_nc
->
dyn_action_type
;
*
dyn_type1
=
base_nc
->
dyn_type1
;
*
dyn_type2
=
base_nc
->
dyn_type2
;
*
dyn_action_type1
=
base_nc
->
dyn_action_type1
;
*
dyn_action_type2
=
base_nc
->
dyn_action_type2
;
}
void
grow_GetObjectClassUserData
(
grow_tObject
object
,
void
**
user_data
)
...
...
@@ -4255,10 +4272,12 @@ void grow_GetObjectClassUserData( grow_tObject object, void **user_data)
base_nc
->
get_user_data
(
user_data
);
}
void
grow_GetSubGraphDynType
(
grow_tCtx
ctx
,
int
*
dyn_type
,
int
*
dyn_action_type
)
void
grow_GetSubGraphDynType
(
grow_tCtx
ctx
,
int
*
dyn_type
1
,
int
*
dyn_type2
,
int
*
dyn_action_type1
,
int
*
dyn_action_type2
)
{
*
dyn_type
=
ctx
->
dyn_type
;
*
dyn_action_type
=
ctx
->
dyn_action_type
;
*
dyn_type1
=
ctx
->
dyn_type1
;
*
dyn_type2
=
ctx
->
dyn_type2
;
*
dyn_action_type1
=
ctx
->
dyn_action_type1
;
*
dyn_action_type2
=
ctx
->
dyn_action_type2
;
}
void
grow_GetSubGraphTraceColor
(
grow_tCtx
ctx
,
glow_eDrawType
*
color
,
...
...
@@ -4558,6 +4577,14 @@ void grow_SetAxisConf( grow_tObject object, double max_val, double min_val,
long_quot
,
value_quot
,
rot
,
format
);
}
void
grow_SetAxisRange
(
grow_tObject
object
,
double
minval
,
double
maxval
)
{
if
(
((
GlowArrayElem
*
)
object
)
->
type
()
==
glow_eObjectType_GrowAxis
)
((
GrowAxis
*
)
object
)
->
set_range
(
minval
,
maxval
);
else
if
(
((
GlowArrayElem
*
)
object
)
->
type
()
==
glow_eObjectType_GrowAxisArc
)
((
GrowAxisArc
*
)
object
)
->
set_range
(
minval
,
maxval
);
}
void
grow_SetModified
(
grow_tCtx
ctx
,
int
modified
)
{
ctx
->
set_modified
(
modified
);
...
...
xtt/lib/glow/src/glow_growapi.h
View file @
c98ed0cc
...
...
@@ -1892,10 +1892,13 @@ extern "C" {
//! Get dyntype and actiontype for the nodeclass of an object.
/*!
\param object Object.
\param dyn_type Dyntype of the object's nodeclass.
\param dyn_action_type Actiontype of the object's nodeclass.
\param dyn_type1 Dyntype of the object's nodeclass mask 1.
\param dyn_type2 Dyntype of the object's nodeclass mask 2.
\param dyn_action_type1 Actiontype of the object's nodeclass mask 1.
\param dyn_action_type2 Actiontype of the object's nodeclass mask 2.
*/
void
grow_GetObjectClassDynType
(
grow_tObject
object
,
int
*
dyn_type
,
int
*
dyn_action_type
);
void
grow_GetObjectClassDynType
(
grow_tObject
object
,
int
*
dyn_type1
,
int
*
dyn_type2
,
int
*
dyn_action_type1
,
int
*
dyn_action_type2
);
//! Get cycle for the nodeclass of an object.
/*!
...
...
@@ -1914,18 +1917,23 @@ extern "C" {
//! Get nodeclass dyntype and actiontype.
/*!
\param nodeclass Nodeclass.
\param dyn_type Dyntype of the nodeclass.
\param dyn_action_type Actiontype of the nodeclass.
\param dyn_type1 Dyntype of the nodeclass mask 1.
\param dyn_type2 Dyntype of the nodeclass mask 2.
\param dyn_action_type1 Actiontype of the nodeclass mask 1.
\param dyn_action_type2 Actiontype of the nodeclass mask 2.
*/
void
grow_GetNodeClassDynType
(
grow_tNodeClass
nodeclass
,
int
*
dyn_type
,
int
*
dyn_action_type
);
void
grow_GetNodeClassDynType
(
grow_tNodeClass
nodeclass
,
int
*
dyn_type1
,
int
*
dyn_type2
,
int
*
dyn_action_type1
,
int
*
dyn_action_type2
);
//! Get the dyntype and actiontype of a grow subgraph context.
/*!
\param ctx Grow subgraph context.
\param dyn_type Dyntype of the subgraph context.
\param dyn_action_type Actiontype of the subgraph context.
\param dyn_type1 Dyntype of the subgraph context.
\param dyn_type2 Dyntype of the subgraph context.
\param dyn_action_type1 Actiontype of the subgraph context.
\param dyn_action_type2 Actiontype of the subgraph context.
*/
void
grow_GetSubGraphDynType
(
grow_tCtx
ctx
,
int
*
dyn_type
,
int
*
dyn_action_type
);
void
grow_GetSubGraphDynType
(
grow_tCtx
ctx
,
int
*
dyn_type
1
,
int
*
dyn_type2
,
int
*
dyn_action_type1
,
int
*
dyn_action_type2
);
//! Get the dynamic colors of a grow subgraph context.
/*!
...
...
@@ -2322,6 +2330,9 @@ extern "C" {
int
no_of_lines
,
int
long_quot
,
int
value_quot
,
double
rot
,
const
char
*
format
);
void
grow_SetAxisRange
(
grow_tObject
object
,
double
minval
,
double
maxval
);
//! Set that graph is modified or not since last save.
/*!
\param ctx Grow context.
...
...
xtt/lib/glow/src/glow_growaxis.cpp
View file @
c98ed0cc
...
...
@@ -52,6 +52,15 @@
# define nearbyint rint
#endif
typedef
struct
{
int
lines
;
int
longq
;
int
vvalq
;
int
hvalq
;
char
format
[
10
];
}
sRange
;
GrowAxis
::
GrowAxis
(
GrowCtx
*
glow_ctx
,
const
char
*
name
,
double
x1
,
double
y1
,
double
x2
,
double
y2
,
glow_eDrawType
border_d_type
,
int
line_w
,
int
t_size
,
glow_eDrawType
t_drawtype
,
...
...
@@ -104,6 +113,10 @@ void GrowAxis::save( ofstream& fp, glow_eSaveMode mode)
fp
<<
int
(
glow_eSave_GrowAxis_text_size
)
<<
FSPACE
<<
text_size
<<
endl
;
fp
<<
int
(
glow_eSave_GrowAxis_text_drawtype
)
<<
FSPACE
<<
int
(
text_drawtype
)
<<
endl
;
fp
<<
int
(
glow_eSave_GrowAxis_text_color_drawtype
)
<<
FSPACE
<<
int
(
text_color_drawtype
)
<<
endl
;
if
(
user_data
&&
ctx
->
userdata_save_callback
)
{
fp
<<
int
(
glow_eSave_GrowAxis_userdata_cb
)
<<
endl
;
(
ctx
->
userdata_save_callback
)(
&
fp
,
this
,
glow_eUserdataCbType_Node
);
}
fp
<<
int
(
glow_eSave_End
)
<<
endl
;
}
...
...
@@ -140,6 +153,10 @@ void GrowAxis::open( ifstream& fp)
case
glow_eSave_GrowAxis_text_size
:
fp
>>
text_size
;
break
;
case
glow_eSave_GrowAxis_text_drawtype
:
fp
>>
tmp
;
text_drawtype
=
(
glow_eDrawType
)
tmp
;
break
;
case
glow_eSave_GrowAxis_text_color_drawtype
:
fp
>>
tmp
;
text_color_drawtype
=
(
glow_eDrawType
)
tmp
;
break
;
case
glow_eSave_GrowAxis_userdata_cb
:
if
(
ctx
->
userdata_open_callback
)
(
ctx
->
userdata_open_callback
)(
&
fp
,
this
,
glow_eUserdataCbType_Node
);
break
;
case
glow_eSave_End
:
end_found
=
1
;
break
;
default:
cout
<<
"GrowAxis:open syntax error"
<<
endl
;
...
...
@@ -501,6 +518,7 @@ void GrowAxis::erase( GlowWind *w, GlowTransform *t, int hot, void *node)
return
;
hot
=
0
;
}
int
hotw
=
2
;
int
x1
,
y1
,
x2
,
y2
,
ll_x
,
ll_y
,
ur_x
,
ur_y
;
if
(
!
t
)
{
...
...
@@ -516,10 +534,10 @@ void GrowAxis::erase( GlowWind *w, GlowTransform *t, int hot, void *node)
y2
=
int
(
trf
.
y
(
t
,
ur
.
x
,
ur
.
y
)
*
w
->
zoom_factor_y
)
-
w
->
offset_y
;
}
ll_x
=
min
(
x1
,
x2
);
ur_x
=
max
(
x1
,
x2
);
ll_y
=
min
(
y1
,
y2
);
ur_y
=
max
(
y1
,
y2
);
ll_x
=
min
(
x1
,
x2
)
-
hotw
;
ur_x
=
max
(
x1
,
x2
)
+
hotw
;
ll_y
=
min
(
y1
,
y2
)
-
hotw
;
ur_y
=
max
(
y1
,
y2
)
+
hotw
;
w
->
set_draw_buffer_only
();
ctx
->
gdraw
->
fill_rect
(
w
,
ll_x
,
ll_y
,
ur_x
-
ll_x
,
ur_y
-
ll_y
,
glow_eDrawType_LineErase
);
...
...
@@ -611,11 +629,154 @@ void GrowAxis::set_textbold( int bold)
draw
();
}
void
GrowAxis
::
set_range
(
double
min
,
double
max
)
void
GrowAxis
::
set_range
(
double
min
val
,
double
maxval
)
{
max_value
=
max
;
min_value
=
min
;
static
sRange
rdata
[
2
][
25
]
=
{
{{
26
,
5
,
5
,
10
,
"%3.1f"
},
// 1
{
21
,
5
,
5
,
10
,
"%3.1f"
},
// 2
{
31
,
5
,
10
,
10
,
"%3.1f"
},
// 3
{
41
,
5
,
10
,
20
,
"%3.1f"
},
// 4
{
26
,
5
,
5
,
10
,
"%1.0f"
},
// 5
{
31
,
5
,
10
,
10
,
"%1.0f"
},
// 6
{
36
,
5
,
10
,
10
,
"%1.0f"
},
// 7
{
17
,
2
,
4
,
4
,
"%1.0f"
},
// 8
{
19
,
2
,
4
,
4
,
"%1.0f"
},
// 9
{
21
,
2
,
4
,
8
,
"%2.0f"
},
// 10
{
23
,
2
,
4
,
8
,
"%2.0f"
},
// 11
{
13
,
4
,
4
,
4
,
"%2.0f"
},
// 12
{
14
,
4
,
4
,
4
,
"%2.0f"
},
// 13
{
15
,
4
,
4
,
4
,
"%2.0f"
},
// 14
{
16
,
5
,
5
,
5
,
"%2.0f"
},
// 15
{
17
,
5
,
5
,
5
,
"%2.0f"
},
// 16
{
18
,
5
,
5
,
5
,
"%2.0f"
},
// 17
{
19
,
5
,
5
,
5
,
"%2.0f"
},
// 18
{
20
,
5
,
5
,
5
,
"%2.0f"
},
// 19
{
21
,
5
,
5
,
5
,
"%2.0f"
},
// 20
{
22
,
5
,
5
,
5
,
"%2.0f"
},
// 21
{
23
,
5
,
5
,
5
,
"%2.0f"
},
// 22
{
24
,
5
,
5
,
5
,
"%2.0f"
},
// 23
{
25
,
5
,
5
,
5
,
"%2.0f"
},
// 24
{
26
,
5
,
5
,
10
,
"%2.0f"
}},
// 25
{{
101
,
5
,
10
,
20
,
"%3.1f"
},
// 1
{
101
,
5
,
10
,
20
,
"%3.1f"
},
// 2
{
61
,
10
,
10
,
20
,
"%3.1f"
},
// 3
{
81
,
10
,
10
,
20
,
"%3.1f"
},
// 4
{
101
,
10
,
20
,
20
,
"%1.0f"
},
// 5
{
61
,
5
,
10
,
20
,
"%1.0f"
},
// 6
{
71
,
5
,
10
,
20
,
"%1.0f"
},
// 7
{
81
,
5
,
10
,
20
,
"%1.0f"
},
// 8
{
91
,
5
,
10
,
20
,
"%1.0f"
},
// 9
{
101
,
5
,
10
,
20
,
"%2.0f"
},
// 10
{
56
,
5
,
5
,
5
,
"%2.0f"
},
// 11
{
61
,
5
,
10
,
10
,
"%2.0f"
},
// 12
{
66
,
5
,
10
,
20
,
"%2.0f"
},
// 13
{
71
,
5
,
10
,
20
,
"%2.0f"
},
// 14
{
76
,
5
,
10
,
20
,
"%2.0f"
},
// 15
{
81
,
5
,
10
,
20
,
"%2.0f"
},
// 16
{
86
,
5
,
10
,
20
,
"%2.0f"
},
// 17
{
91
,
5
,
10
,
20
,
"%2.0f"
},
// 18
{
96
,
5
,
10
,
20
,
"%2.0f"
},
// 19
{
101
,
5
,
10
,
25
,
"%2.0f"
},
// 20
{
43
,
2
,
6
,
6
,
"%2.0f"
},
// 21
{
45
,
2
,
4
,
8
,
"%2.0f"
},
// 22
{
47
,
2
,
4
,
8
,
"%2.0f"
},
// 23
{
49
,
2
,
4
,
8
,
"%2.0f"
},
// 24
{
26
,
5
,
5
,
5
,
"%2.0f"
}}};
// 25
erase
(
&
ctx
->
mw
);
erase
(
&
ctx
->
navw
);
max_value
=
maxval
;
min_value
=
minval
;
GlowWind
*
w
=
&
ctx
->
mw
;
// double tsize = w->zoom_factor_y / w->base_zoom_factor * (8+2*text_size);
int
x1
=
int
(
trf
.
x
(
ll
.
x
,
ll
.
y
)
*
w
->
zoom_factor_x
)
-
w
->
offset_x
;
int
y1
=
int
(
trf
.
y
(
ll
.
x
,
ll
.
y
)
*
w
->
zoom_factor_y
)
-
w
->
offset_y
;
int
x2
=
int
(
trf
.
x
(
ur
.
x
,
ur
.
y
)
*
w
->
zoom_factor_x
)
-
w
->
offset_x
;
int
y2
=
int
(
trf
.
y
(
ur
.
x
,
ur
.
y
)
*
w
->
zoom_factor_y
)
-
w
->
offset_y
;
double
rotation
=
(
trf
.
rot
()
/
360
-
floor
(
trf
.
rot
()
/
360
))
*
360
;
int
len
;
int
lix
;
int
di
;
int
horizontal
=
(
rotation
<
45
||
(
rotation
>
135
&&
rotation
<
225
)
||
rotation
>
315
)
?
0
:
1
;
if
(
horizontal
)
len
=
abs
(
x2
-
x1
);
else
len
=
abs
(
y2
-
y1
);
if
(
len
<
150
)
lix
=
0
;
else
lix
=
1
;
double
d
=
fabs
(
maxval
-
minval
);
if
(
d
<
5
)
d
=
1000
*
d
;
di
=
(
int
)
(
d
+
0.5
);
while
(
di
>=
25
)
di
/=
10
;
if
(
di
>
0
&&
di
<=
25
)
{
lines
=
rdata
[
lix
][
di
-
1
].
lines
;
longquotient
=
rdata
[
lix
][
di
-
1
].
longq
;
if
(
horizontal
)
valuequotient
=
rdata
[
lix
][
di
-
1
].
hvalq
;
else
valuequotient
=
rdata
[
lix
][
di
-
1
].
vvalq
;
}
double
m
=
max
(
fabs
(
maxval
),
fabs
(
minval
));
switch
(
lix
)
{
case
0
:
{
if
(
m
<
0.01
)
strcpy
(
format
,
"%g"
);
else
if
(
m
<
0.1
)
strcpy
(
format
,
"%5.3f"
);
else
if
(
m
<
1
)
strcpy
(
format
,
"%4.2f"
);
else
if
(
m
<
3
)
strcpy
(
format
,
"%3.1f"
);
else
if
(
m
<=
20
)
strcpy
(
format
,
"%2.0f"
);
else
if
(
m
<=
200
)
strcpy
(
format
,
"%3.0f"
);
else
if
(
m
<
2000
)
strcpy
(
format
,
"%4.0f"
);
else
if
(
m
<
20000
)
strcpy
(
format
,
"%5.0f"
);
else
strcpy
(
format
,
"%g"
);
break
;
}
case
1
:
{
if
(
m
<
0.01
)
strcpy
(
format
,
"%g"
);
else
if
(
m
<
0.1
)
strcpy
(
format
,
"%5.3f"
);
else
if
(
m
<
1
)
strcpy
(
format
,
"%4.2f"
);
else
if
(
m
<=
4
)
strcpy
(
format
,
"%3.1f"
);
else
if
(
m
<=
20
)
strcpy
(
format
,
"%2.0f"
);
else
if
(
m
<=
200
)
strcpy
(
format
,
"%3.0f"
);
else
if
(
m
<
2000
)
strcpy
(
format
,
"%4.0f"
);
else
if
(
m
<
20000
)
strcpy
(
format
,
"%5.0f"
);
else
strcpy
(
format
,
"%g"
);
break
;
}
default:
;
}
configure
();
draw
();
}
void
GrowAxis
::
export_javabean
(
GlowTransform
*
t
,
void
*
node
,
...
...
@@ -732,6 +893,32 @@ void GrowAxis::export_javabean( GlowTransform *t, void *node,
pass
,
shape_cnt
,
node_cnt
,
fp
);
}
void
GrowAxis
::
trace_scan
()
{
if
(
!
trace
.
p
)
return
;
if
(
ctx
->
trace_scan_func
)
{
ctx
->
trace_scan_func
(
(
void
*
)
this
,
trace
.
p
);
return
;
}
}
int
GrowAxis
::
trace_init
()
{
int
sts
;
sts
=
ctx
->
trace_connect_func
(
(
void
*
)
this
,
&
trace
);
return
sts
;
}
void
GrowAxis
::
trace_close
()
{
if
(
trace
.
p
)
ctx
->
trace_disconnect_func
(
(
void
*
)
this
);
}
void
GrowAxis
::
set_conf
(
double
max_val
,
double
min_val
,
int
no_of_lines
,
int
long_quot
,
int
value_quot
,
double
rot
,
const
char
*
value_format
)
{
...
...
@@ -753,9 +940,13 @@ void GrowAxis::set_axis_info( glow_sAxisInfo *info)
{
max_value
=
info
->
max_value
;
min_value
=
info
->
min_value
;
if
(
info
->
lines
)
lines
=
info
->
lines
;
if
(
info
->
longquotient
)
longquotient
=
info
->
longquotient
;
if
(
info
->
valuequotient
)
valuequotient
=
info
->
valuequotient
;
if
(
strcmp
(
info
->
format
,
""
)
!=
0
)
strcpy
(
format
,
info
->
format
);
}
...
...
@@ -806,8 +997,11 @@ void GrowAxis::format_text( char *text, char *fmt, double value)
timstr
[
16
]
=
0
;
strcpy
(
text
,
timstr
);
}
else
else
{
if
(
fabs
(
value
)
<
FLT_EPSILON
)
value
=
0
;
sprintf
(
text
,
fmt
,
value
);
}
}
void
GrowAxis
::
convert
(
glow_eConvert
version
)
...
...
xtt/lib/glow/src/glow_growaxis.h
View file @
c98ed0cc
...
...
@@ -141,6 +141,7 @@ class GrowAxis : public GrowRect {
int
valuequotient
;
//!< Quotient of lines that displays a value.
double
increment
;
//!< Value difference between two lines.
char
format
[
20
];
//!< Format of displayed values.
GlowTraceData
trace
;
//!< Obsolete
//! Erase the object.
/*!
...
...
@@ -224,6 +225,21 @@ class GrowAxis : public GrowRect {
void
set_conf
(
double
max_val
,
double
min_val
,
int
no_of_lines
,
int
long_quot
,
int
value_quot
,
double
rot
,
const
char
*
format
);
//! Scan trace
/*! Calls the trace scan callback for the object.
*/
void
trace_scan
();
//! Init trace
/*! Calls the trace connect callback for the object.
*/
int
trace_init
();
//! Close trace
/*! Calls the trace disconnect callback for the object.
*/
void
trace_close
();
//! Conversion between different versions of Glow
/*!
\param version Version to convert to.
...
...
xtt/lib/glow/src/glow_growaxisarc.cpp
View file @
c98ed0cc
This diff is collapsed.
Click to expand it.
xtt/lib/glow/src/glow_growaxisarc.h
View file @
c98ed0cc
...
...
@@ -141,6 +141,7 @@ class GrowAxisArc : public GrowArc {
int
valuequotient
;
//!< Quotient of lines that displays a value.
double
increment
;
//!< Value difference between two lines.
char
format
[
20
];
//!< Format of displayed values.
GlowTraceData
trace
;
//!< Obsolete
//! Erase the object.
/*!
...
...
@@ -224,6 +225,21 @@ class GrowAxisArc : public GrowArc {
void
set_conf
(
double
max_val
,
double
min_val
,
int
no_of_lines
,
int
long_quot
,
int
value_quot
,
double
rot
,
const
char
*
format
);
//! Scan trace
/*! Calls the trace scan callback for the object.
*/
void
trace_scan
();
//! Init trace
/*! Calls the trace connect callback for the object.
*/
int
trace_init
();
//! Close trace
/*! Calls the trace disconnect callback for the object.
*/
void
trace_close
();
//! Conversion between different versions of Glow
/*!
\param version Version to convert to.
...
...
xtt/lib/glow/src/glow_growctx.cpp
View file @
c98ed0cc
...
...
@@ -1932,8 +1932,10 @@ void GrowCtx::save_grow( ofstream& fp, glow_eSaveMode mode)
fp
<<
int
(
glow_eSave_GrowCtx_path
)
<<
endl
;
for
(
i
=
0
;
i
<
path_cnt
;
i
++
)
fp
<<
path
[
i
]
<<
endl
;
fp
<<
int
(
glow_eSave_GrowCtx_dyn_type
)
<<
FSPACE
<<
dyn_type
<<
endl
;
fp
<<
int
(
glow_eSave_GrowCtx_dyn_action_type
)
<<
FSPACE
<<
dyn_action_type
<<
endl
;
fp
<<
int
(
glow_eSave_GrowCtx_dyn_type1
)
<<
FSPACE
<<
dyn_type1
<<
endl
;
fp
<<
int
(
glow_eSave_GrowCtx_dyn_type2
)
<<
FSPACE
<<
dyn_type2
<<
endl
;
fp
<<
int
(
glow_eSave_GrowCtx_dyn_action_type1
)
<<
FSPACE
<<
dyn_action_type1
<<
endl
;
fp
<<
int
(
glow_eSave_GrowCtx_dyn_action_type2
)
<<
FSPACE
<<
dyn_action_type2
<<
endl
;
fp
<<
int
(
glow_eSave_GrowCtx_dyn_color1
)
<<
FSPACE
<<
int
(
dyn_color
[
0
])
<<
endl
;
fp
<<
int
(
glow_eSave_GrowCtx_dyn_color2
)
<<
FSPACE
<<
int
(
dyn_color
[
1
])
<<
endl
;
fp
<<
int
(
glow_eSave_GrowCtx_dyn_color3
)
<<
FSPACE
<<
int
(
dyn_color
[
2
])
<<
endl
;
...
...
@@ -2096,8 +2098,10 @@ void GrowCtx::open_grow( ifstream& fp)
fp
.
getline
(
path
[
i
],
sizeof
(
path
[
0
]));
}
break
;
case
glow_eSave_GrowCtx_dyn_type
:
fp
>>
dyn_type
;
break
;
case
glow_eSave_GrowCtx_dyn_action_type
:
fp
>>
dyn_action_type
;
break
;
case
glow_eSave_GrowCtx_dyn_type1
:
fp
>>
dyn_type1
;
break
;
case
glow_eSave_GrowCtx_dyn_type2
:
fp
>>
dyn_type2
;
break
;
case
glow_eSave_GrowCtx_dyn_action_type1
:
fp
>>
dyn_action_type1
;
break
;
case
glow_eSave_GrowCtx_dyn_action_type2
:
fp
>>
dyn_action_type2
;
break
;
case
glow_eSave_GrowCtx_dyn_color1
:
fp
>>
tmp
;
dyn_color
[
0
]
=
(
glow_eDrawType
)
tmp
;
...
...
@@ -2246,8 +2250,10 @@ int GrowCtx::save_subgraph( char *filename, glow_eSaveMode mode)
}
fp
<<
"
\"
"
<<
endl
;
}
fp
<<
int
(
glow_eSave_NodeClass_dyn_type
)
<<
FSPACE
<<
dyn_type
<<
endl
;
fp
<<
int
(
glow_eSave_NodeClass_dyn_action_type
)
<<
FSPACE
<<
dyn_action_type
<<
endl
;
fp
<<
int
(
glow_eSave_NodeClass_dyn_type1
)
<<
FSPACE
<<
dyn_type1
<<
endl
;
fp
<<
int
(
glow_eSave_NodeClass_dyn_type2
)
<<
FSPACE
<<
dyn_type2
<<
endl
;
fp
<<
int
(
glow_eSave_NodeClass_dyn_action_type1
)
<<
FSPACE
<<
dyn_action_type1
<<
endl
;
fp
<<
int
(
glow_eSave_NodeClass_dyn_action_type2
)
<<
FSPACE
<<
dyn_action_type2
<<
endl
;
fp
<<
int
(
glow_eSave_NodeClass_dyn_color1
)
<<
FSPACE
<<
int
(
dyn_color
[
0
])
<<
endl
;
fp
<<
int
(
glow_eSave_NodeClass_dyn_color2
)
<<
FSPACE
<<
int
(
dyn_color
[
1
])
<<
endl
;
fp
<<
int
(
glow_eSave_NodeClass_dyn_color3
)
<<
FSPACE
<<
int
(
dyn_color
[
2
])
<<
endl
;
...
...
@@ -4009,7 +4015,7 @@ void GrowCtx::convert( glow_eConvert version)
// Conversion of colors
background_color
=
GlowColor
::
convert
(
version
,
background_color
);
set_background
(
background_color
);
if
(
dyn_type
==
3
||
dyn_type
==
4
||
dyn_type
==
12
)
{
if
(
dyn_type
1
==
3
||
dyn_type1
==
4
||
dyn_type1
==
12
)
{
if
(
(
glow_eDrawTone
)
dyn_color
[
0
]
==
glow_eDrawTone_YellowGreen
)
dyn_color
[
0
]
=
(
glow_eDrawType
)
glow_eDrawTone_Yellow
;
if
(
(
glow_eDrawTone
)
dyn_color
[
1
]
==
glow_eDrawTone_YellowGreen
)
...
...
xtt/lib/glow/src/glow_growctx.h
View file @
c98ed0cc
...
...
@@ -86,7 +86,7 @@ class GrowCtx : public GlowCtx {
background_color
(
glow_eDrawType_LineErase
),
highlight_disabled
(
0
),
dynamic
(
0
),
dynamicsize
(
0
),
arg_cnt
(
0
),
x0
(
0
),
y0
(
0
),
x1
(
0
),
y1
(
0
),
path_cnt
(
0
),
dyn_type
(
0
),
dyn_action_type
(
0
),
dyn_type
1
(
0
),
dyn_type2
(
0
),
dyn_action_type1
(
0
),
dyn_action_type2
(
0
),
no_con_obstacle
(
0
),
slider
(
0
),
slider_cursor_offset
(
0
),
move_restriction
(
glow_eMoveRestriction_No
),
restriction_max_limit
(
0
),
restriction_min_limit
(
0
),
restriction_object
(
0
),
subgraph
(
0
),
...
...
@@ -888,8 +888,10 @@ class GrowCtx : public GlowCtx {
double
y1
;
//!< High border of graph.
int
path_cnt
;
//!< Number of paths in searchpath
char
path
[
10
][
80
];
//!< Search paths where subgraphs and imagefiles are searched for.
int
dyn_type
;
//!< Dyntype for a subgraph.
int
dyn_action_type
;
//!< Action type for a subgraph.
int
dyn_type1
;
//!< Dyntype for a subgraph mask 1.
int
dyn_type2
;
//!< Dyntype for a subgraph mask 2.
int
dyn_action_type1
;
//!< Action type for a subgraph mask 1.
int
dyn_action_type2
;
//!< Action type for a subgraph mask 2.
glow_eDrawType
dyn_color
[
4
];
//!< Dynamic colors for a subgraph.
int
dyn_attr
[
4
];
//!< Dynamic attributes for a subgraph.
int
no_con_obstacle
;
//!< Subgraph is not an obstacle for a connection.
...
...
xtt/lib/glow/src/glow_grownode.cpp
View file @
c98ed0cc
...
...
@@ -1793,7 +1793,7 @@ int GrowNode::get_background_object_limits(GlowTransform *t,
{
int
dyn_type
;
GlowNodeClass
*
base_nc
=
nc
->
get_base_nc
();
dyn_type
=
base_nc
->
dyn_type
;
dyn_type
=
base_nc
->
dyn_type
1
;
if
(
!
(
(
int
)
type
&
dyn_type
))
return
0
;
...
...
xtt/lib/glow/src/glow_nodeclass.cpp
View file @
c98ed0cc
...
...
@@ -52,7 +52,7 @@
GlowNodeClass
::
GlowNodeClass
(
GrowCtx
*
glow_ctx
,
const
char
*
name
,
glow_eNodeGroup
grp
)
:
ctx
(
glow_ctx
),
a
(
10
,
10
),
group
(
grp
),
dynamic
(
0
),
dynamicsize
(
0
),
arg_cnt
(
0
),
nc_extern
(
0
),
dyn_type
(
0
),
dyn_action_type
(
0
),
arg_cnt
(
0
),
nc_extern
(
0
),
dyn_type
1
(
0
),
dyn_type2
(
0
),
dyn_action_type1
(
0
),
dyn_action_type2
(
0
),
no_con_obstacle
(
0
),
slider
(
0
),
animation_count
(
1
),
y0
(
0
),
y1
(
0
),
x0
(
0
),
x1
(
0
),
next_nc
(
0
),
prev_nc
(
0
),
cycle
(
glow_eCycle_Slow
),
user_data
(
0
)
...
...
@@ -141,8 +141,10 @@ void GlowNodeClass::save( ofstream& fp, glow_eSaveMode mode)
fp
<<
int
(
glow_eSave_NodeClass_argtype
)
<<
endl
;
for
(
i
=
0
;
i
<
arg_cnt
;
i
++
)
fp
<<
argtype
[
i
]
<<
endl
;
fp
<<
int
(
glow_eSave_NodeClass_dyn_type
)
<<
FSPACE
<<
dyn_type
<<
endl
;
fp
<<
int
(
glow_eSave_NodeClass_dyn_action_type
)
<<
FSPACE
<<
dyn_action_type
<<
endl
;
fp
<<
int
(
glow_eSave_NodeClass_dyn_type1
)
<<
FSPACE
<<
dyn_type1
<<
endl
;
fp
<<
int
(
glow_eSave_NodeClass_dyn_type2
)
<<
FSPACE
<<
dyn_type2
<<
endl
;
fp
<<
int
(
glow_eSave_NodeClass_dyn_action_type1
)
<<
FSPACE
<<
dyn_action_type1
<<
endl
;
fp
<<
int
(
glow_eSave_NodeClass_dyn_action_type2
)
<<
FSPACE
<<
dyn_action_type2
<<
endl
;
fp
<<
int
(
glow_eSave_NodeClass_dyn_color1
)
<<
FSPACE
<<
int
(
dyn_color
[
0
])
<<
endl
;
fp
<<
int
(
glow_eSave_NodeClass_dyn_color2
)
<<
FSPACE
<<
int
(
dyn_color
[
1
])
<<
endl
;
fp
<<
int
(
glow_eSave_NodeClass_dyn_color3
)
<<
FSPACE
<<
int
(
dyn_color
[
2
])
<<
endl
;
...
...
@@ -232,8 +234,10 @@ void GlowNodeClass::open( ifstream& fp)
for
(
i
=
0
;
i
<
arg_cnt
;
i
++
)
fp
>>
argtype
[
i
];
break
;
case
glow_eSave_NodeClass_dyn_type
:
fp
>>
dyn_type
;
break
;
case
glow_eSave_NodeClass_dyn_action_type
:
fp
>>
dyn_action_type
;
break
;
case
glow_eSave_NodeClass_dyn_type1
:
fp
>>
dyn_type1
;
break
;
case
glow_eSave_NodeClass_dyn_type2
:
fp
>>
dyn_type2
;
break
;
case
glow_eSave_NodeClass_dyn_action_type1
:
fp
>>
dyn_action_type1
;
break
;
case
glow_eSave_NodeClass_dyn_action_type2
:
fp
>>
dyn_action_type2
;
break
;
case
glow_eSave_NodeClass_dyn_color1
:
fp
>>
tmp
;
dyn_color
[
0
]
=
(
glow_eDrawType
)
tmp
;
...
...
@@ -724,7 +728,7 @@ void GlowNodeClass::get_origo( GlowTransform *t, double *x,
void
GlowNodeClass
::
convert
(
glow_eConvert
version
)
{
a
.
convert
(
version
);
if
(
dyn_type
==
3
||
dyn_type
==
4
||
dyn_type
==
12
)
{
if
(
dyn_type
1
==
3
||
dyn_type1
==
4
||
dyn_type1
==
12
)
{
if
(
(
glow_eDrawTone
)
dyn_color
[
0
]
==
glow_eDrawTone_YellowGreen
)
dyn_color
[
0
]
=
(
glow_eDrawType
)
glow_eDrawTone_Yellow
;
if
(
(
glow_eDrawTone
)
dyn_color
[
1
]
==
glow_eDrawTone_YellowGreen
)
...
...
xtt/lib/glow/src/glow_nodeclass.h
View file @
c98ed0cc
...
...
@@ -398,8 +398,10 @@ class GlowNodeClass : public GlowArrayElem {
char
argname
[
20
][
32
];
//!< Arguments to dynamic code.
int
argtype
[
20
];
//!< Type of arguments to dynamic code.
int
nc_extern
;
//!< Nodeclass is extern, i.e loaded from pwsg file.
int
dyn_type
;
//!< Dynamic type.
int
dyn_action_type
;
//!< Action type.
int
dyn_type1
;
//!< Dynamic type mask 1.
int
dyn_type2
;
//!< Dynamic type mask 2.
int
dyn_action_type1
;
//!< Action type mask 1.
int
dyn_action_type2
;
//!< Action type mask 2.
glow_eDrawType
dyn_color
[
4
];
//!< Dynamic colors.
int
dyn_attr
[
4
];
//!< Dynamic attributes.
int
no_con_obstacle
;
//!< Node of this nodeclass are not obstacles for routed connections.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment