|
static void | create_plotter_border (_switch &a_parent, float a_w, float a_h) |
|
static void | set_plotter_layout (separator &a_sep, size_t a_index, bool a_configure, unsigned int a_cols, unsigned int a_rows, float a_ww_wc, float a_wh_wc, const std::vector< vec2f > &a_origins, const std::vector< vec2f > &a_sizes, float a_scale) |
|
Definition at line 16 of file plots.
◆ plots() [1/2]
◆ ~plots()
virtual tools::sg::plots::~plots |
( |
| ) |
|
|
inlinevirtual |
◆ plots() [2/2]
tools::sg::plots::plots |
( |
const plots & |
a_from | ) |
|
|
inline |
◆ adjust_scales()
void tools::sg::plots::adjust_scales |
( |
float |
a_plotter_scale = 1 | ) |
|
|
inline |
Definition at line 592 of file plots.
603 float cooking = 1.2f;
605 float wfac = (rw_wc/ww_wc)*cooking;
606 float hfac = (rh_wc/wh_wc)*cooking;
608 float label_cooking = 1.6f;
612 float title_cooking = 1.1f;
618 for(
size_t index=0;index<_number;index++) {
619 separator*
sep = (separator*)
m_sep[index];
620 plotter* _plotter = (plotter*)(*
sep)[PLOTTER()];
622 _plotter->left_margin = _plotter->left_margin * wfac;
623 _plotter->right_margin = _plotter->right_margin * wfac;
624 _plotter->bottom_margin = _plotter->bottom_margin * hfac;
625 _plotter->top_margin = _plotter->top_margin * hfac;
627 _plotter->x_axis().tick_length = _plotter->x_axis().tick_length * wfac;
628 _plotter->y_axis().tick_length = _plotter->y_axis().tick_length * hfac;
630 _plotter->title_to_axis = _plotter->title_to_axis * hfac;
631 _plotter->title_height = _plotter->title_height * hfac * title_cooking;
633 _plotter->x_axis().label_height = _plotter->x_axis().label_height * hfac * label_cooking;
634 _plotter->y_axis().label_height = _plotter->y_axis().label_height * hfac * label_cooking;
◆ adjust_size()
void tools::sg::plots::adjust_size |
( |
unsigned int |
a_ww, |
|
|
unsigned int |
a_wh |
|
) |
| |
|
inline |
Definition at line 271 of file plots.
272 if(!a_ww||!a_wh)
return;
273 float aspect = float(a_ww)/float(a_wh);
◆ bbox()
virtual void tools::sg::plots::bbox |
( |
bbox_action & |
a_action | ) |
|
|
inlinevirtual |
◆ clear()
void tools::sg::plots::clear |
( |
| ) |
|
|
inline |
Definition at line 291 of file plots.
294 for(
size_t index=0;index<_number;index++) {
295 separator*
sep = (separator*)
m_sep[index];
296 plotter* _plotter = (plotter*)(*
sep)[PLOTTER()];
300 separator*
sep = (*it).m_sep;
301 plotter* _plotter = (plotter*)(*
sep)[PLOTTER()];
◆ clear_sg()
void tools::sg::plots::clear_sg |
( |
| ) |
|
|
inline |
◆ configure_extras_PAW()
void tools::sg::plots::configure_extras_PAW |
( |
unsigned int |
a_ww, |
|
|
unsigned int |
a_wh |
|
) |
| |
|
inline |
Definition at line 770 of file plots.
775 float wvp = float(a_ww);
776 float hvp = float(a_wh);
780 const extra& _extra = *it;
782 unsigned int _cols = _extra.m_cols;
783 unsigned int _rows = _extra.m_rows;
784 if((!_cols)||(!_rows))
continue;
789 if((wdata<=0)||(hdata<=0))
continue;
791 unsigned int iregion = _extra.m_index;
792 unsigned int row = iregion/_cols;
793 unsigned int col = iregion - row * _cols;
795 float wr,hr,x,y,lm,rm,bm,tm;
797 lm = rm = bm = tm = 0;
813 }
else if(col==(_cols-1)) {
820 x = wrl + (col-1) * wri;
840 }
else if(row==(_rows-1)) {
857 separator*
sep = _extra.m_sep;
858 plotter* _plotter = (plotter*)(*
sep)[PLOTTER()];
861 _plotter->left_margin = lm;
862 _plotter->right_margin = rm;
865 _plotter->top_margin = tm;
866 _plotter->bottom_margin = bm;
◆ configure_grid_PAW()
void tools::sg::plots::configure_grid_PAW |
( |
unsigned int |
a_ww, |
|
|
unsigned int |
a_wh |
|
) |
| |
|
inline |
Definition at line 639 of file plots.
644 float wvp = float(a_ww);
645 float hvp = float(a_wh);
650 if((!_cols)||(!_rows))
return;
655 if((wdata<=0)||(hdata<=0))
return;
680 unsigned int _num =
number();
681 for(
unsigned int iregion=0;iregion<_num;iregion++) {
683 unsigned int row = iregion/_cols;
684 unsigned int col = iregion - row * _cols;
686 float wr,hr,x,y,lm,rm,bm,tm;
688 lm = rm = bm = tm = 0;
704 }
else if(col==(_cols-1)) {
711 x = wrl + (col-1) * wri;
731 }
else if(row==(_rows-1)) {
746 m_sizes.push_back(vec2f(wr,hr));
748 separator*
sep = (separator*)
m_sep[iregion];
749 plotter* _plotter = (plotter*)(*
sep)[PLOTTER()];
752 _plotter->left_margin = lm;
753 _plotter->right_margin = rm;
756 _plotter->top_margin = tm;
757 _plotter->bottom_margin = bm;
◆ configure_PAW()
void tools::sg::plots::configure_PAW |
( |
unsigned int |
a_ww, |
|
|
unsigned int |
a_wh |
|
) |
| |
|
inline |
◆ copy_plotters()
bool tools::sg::plots::copy_plotters |
( |
const plots & |
a_from | ) |
|
|
inlineprotected |
Definition at line 995 of file plots.
999 for(
size_t index=0;index<_number;index++) {
1000 separator* _from_sep = (separator*)a_from.m_sep[index];
1001 matrix* _from_matrix = (matrix*)(*_from_sep)[MATRIX()];
1003 plotter* _from_plotter = (plotter*)(*_from_sep)[PLOTTER()];
1005 separator* _sep = (separator*)
m_sep[index];
1006 matrix* _matrix = (matrix*)(*_sep)[MATRIX()];
1007 plotter* _plotter = (plotter*)(*_sep)[PLOTTER()];
1009 _matrix->operator=(*_from_matrix);
1010 _plotter->operator=(*_from_plotter);
1015 for(
size_t index=0;index<_number;index++) {
1016 separator* _from_sep = (separator*)a_from.m_extras_sep[index];
1017 matrix* _from_matrix = (matrix*)(*_from_sep)[MATRIX()];
1018 plotter* _from_plotter = (plotter*)(*_from_sep)[PLOTTER()];
1021 matrix* _matrix = (matrix*)(*_sep)[MATRIX()];
1022 plotter* _plotter = (plotter*)(*_sep)[PLOTTER()];
1024 _matrix->operator=(*_from_matrix);
1025 _plotter->operator=(*_from_plotter);
◆ create_extra_plotter()
plotter* tools::sg::plots::create_extra_plotter |
( |
unsigned int |
a_cols, |
|
|
unsigned int |
a_rows, |
|
|
unsigned int |
a_index |
|
) |
| |
|
inline |
Definition at line 894 of file plots.
899 m_extras.push_back(extra(a_cols,a_rows,a_index));
902 return (plotter*)(*sep)[PLOTTER()];
◆ create_plotter_border()
static void tools::sg::plots::create_plotter_border |
( |
_switch & |
a_parent, |
|
|
float |
a_w, |
|
|
float |
a_h |
|
) |
| |
|
inlinestaticprotected |
Definition at line 1031 of file plots.
1034 group*
sep =
new group;
1037 a_parent.add(
new group());
1039 rgba* mat =
new rgba();
1040 mat->color = colorf_red();
1043 draw_style* ds =
new draw_style;
1048 vertices* vtxs =
new vertices;
1052 float dw = a_w*0.5f;
1053 float dh = a_h*0.5f;
1054 vtxs->add(-dw,-dh,0);
1055 vtxs->add( dw,-dh,0);
1056 vtxs->add( dw, dh,0);
1057 vtxs->add(-dw, dh,0);
1058 vtxs->add(-dw,-dh,0);
◆ current_index()
unsigned int tools::sg::plots::current_index |
( |
| ) |
const |
|
inline |
◆ current_plotter()
plotter& tools::sg::plots::current_plotter |
( |
| ) |
|
|
inline |
Definition at line 390 of file plots.
393 return *((plotter*)(*
sep)[PLOTTER()]);
◆ current_to_one()
void tools::sg::plots::current_to_one |
( |
| ) |
|
|
inline |
◆ delete_extras()
void tools::sg::plots::delete_extras |
( |
| ) |
|
|
inline |
◆ event()
virtual void tools::sg::plots::event |
( |
event_action & |
a_action | ) |
|
|
inlinevirtual |
◆ find_plotter()
plotter* tools::sg::plots::find_plotter |
( |
unsigned int |
a_index | ) |
|
|
inline |
Definition at line 395 of file plots.
398 separator*
sep = (separator*)
m_sep[a_index];
399 return (plotter*)(*sep)[PLOTTER()];
◆ has_data()
bool tools::sg::plots::has_data |
( |
| ) |
|
|
inline |
Definition at line 306 of file plots.
309 for(
size_t index=0;index<_number;index++) {
310 separator*
sep = (separator*)
m_sep[index];
311 plotter* _plotter = (plotter*)(*
sep)[PLOTTER()];
312 if(_plotter->plottables().size())
return true;
315 separator*
sep = (*it).m_sep;
316 plotter* _plotter = (plotter*)(*
sep)[PLOTTER()];
317 if(_plotter->plottables().size())
return true;
◆ init_sg()
void tools::sg::plots::init_sg |
( |
| ) |
|
|
inline |
◆ last_extra_plotter()
plotter* tools::sg::plots::last_extra_plotter |
( |
| ) |
const |
|
inline |
Definition at line 904 of file plots.
907 return (plotter*)(*sep)[PLOTTER()];
◆ next()
void tools::sg::plots::next |
( |
| ) |
|
|
inline |
◆ node_desc_fields()
virtual const desc_fields& tools::sg::plots::node_desc_fields |
( |
| ) |
const |
|
inlinevirtual |
Reimplemented from tools::sg::node.
Definition at line 41 of file plots.
43 static const desc_fields s_v(parent::node_desc_fields(),18,
◆ number()
unsigned int tools::sg::plots::number |
( |
| ) |
const |
|
inline |
◆ operator=()
plots& tools::sg::plots::operator= |
( |
const plots & |
a_from | ) |
|
|
inline |
Definition at line 227 of file plots.
228 parent::operator=(a_from);
229 if(&a_from==
this)
return *
this;
231 width = a_from.width;
◆ pick()
virtual void tools::sg::plots::pick |
( |
pick_action & |
a_action | ) |
|
|
inlinevirtual |
◆ plotters()
void tools::sg::plots::plotters |
( |
std::vector< plotter * > & |
a_vec | ) |
|
|
inline |
Definition at line 510 of file plots.
514 for(
size_t index=0;index<_number;index++) {
515 separator*
sep = (separator*)
m_sep[index];
516 plotter* _plotter = (plotter*)(*
sep)[PLOTTER()];
517 a_vec.push_back(_plotter);
◆ render()
virtual void tools::sg::plots::render |
( |
render_action & |
a_action | ) |
|
|
inlinevirtual |
◆ search()
virtual void tools::sg::plots::search |
( |
search_action & |
a_action | ) |
|
|
inlinevirtual |
Reimplemented from tools::sg::node.
Definition at line 131 of file plots.
133 parent::search(a_action);
134 if(a_action.done())
return;
135 if(a_action.do_path()) a_action.path_push(
this);
137 if(a_action.done())
return;
138 if(a_action.do_path()) a_action.path_pop();
◆ set_current()
bool tools::sg::plots::set_current |
( |
plotter * |
a_plotter | ) |
|
|
inline |
Definition at line 356 of file plots.
359 for(
size_t index=0;index<_number;index++) {
360 separator*
sep = (separator*)
m_sep[index];
361 plotter* _plotter = (plotter*)(*
sep)[PLOTTER()];
362 if(_plotter==a_plotter) {
◆ set_current_plotter()
bool tools::sg::plots::set_current_plotter |
( |
unsigned int |
a_index | ) |
|
|
inline |
◆ set_grids_visibility()
void tools::sg::plots::set_grids_visibility |
( |
bool |
a_visible = false | ) |
|
|
inline |
Definition at line 581 of file plots.
584 for(
size_t index=0;index<_number;index++) {
585 separator*
sep = (separator*)
m_sep[index];
586 plotter* _plotter = (plotter*)(*
sep)[PLOTTER()];
587 _plotter->grid_style().visible = a_visible;
◆ set_line_width()
void tools::sg::plots::set_line_width |
( |
float |
a_line_width | ) |
|
|
inline |
Definition at line 524 of file plots.
527 for(
size_t index=0;index<_number;index++) {
528 separator*
sep = (separator*)
m_sep[index];
529 plotter* _plotter = (plotter*)(*
sep)[PLOTTER()];
531 _plotter->bins_style(0).line_width = a_line_width;
532 _plotter->inner_frame_style().line_width = a_line_width;
533 _plotter->grid_style().line_width = a_line_width;
534 _plotter->x_axis().line_style().width = a_line_width;
535 _plotter->x_axis().ticks_style().width = a_line_width;
536 _plotter->y_axis().line_style().width = a_line_width;
537 _plotter->y_axis().ticks_style().width = a_line_width;
538 _plotter->z_axis().line_style().width = a_line_width;
539 _plotter->z_axis().ticks_style().width = a_line_width;
540 _plotter->colormap_axis().line_style().width = a_line_width;
541 _plotter->colormap_axis().ticks_style().width = a_line_width;
544 _plotter->title_style().line_width = a_line_width;
545 _plotter->infos_style().line_width = a_line_width;
546 _plotter->title_box_style().line_width = a_line_width;
548 _plotter->x_axis().labels_style().line_width = a_line_width;
549 _plotter->x_axis().mag_style().line_width = a_line_width;
550 _plotter->x_axis().title_style().line_width = a_line_width;
552 _plotter->y_axis().labels_style().line_width = a_line_width;
553 _plotter->y_axis().mag_style().line_width = a_line_width;
554 _plotter->y_axis().title_style().line_width = a_line_width;
556 _plotter->z_axis().labels_style().line_width = a_line_width;
557 _plotter->z_axis().mag_style().line_width = a_line_width;
558 _plotter->z_axis().title_style().line_width = a_line_width;
560 _plotter->colormap_axis().labels_style().line_width = a_line_width;
561 _plotter->colormap_axis().mag_style().line_width = a_line_width;
562 _plotter->colormap_axis().title_style().line_width = a_line_width;
◆ set_plotter_layout()
static void tools::sg::plots::set_plotter_layout |
( |
separator & |
a_sep, |
|
|
size_t |
a_index, |
|
|
bool |
a_configure, |
|
|
unsigned int |
a_cols, |
|
|
unsigned int |
a_rows, |
|
|
float |
a_ww_wc, |
|
|
float |
a_wh_wc, |
|
|
const std::vector< vec2f > & |
a_origins, |
|
|
const std::vector< vec2f > & |
a_sizes, |
|
|
float |
a_scale |
|
) |
| |
|
inlinestaticprotected |
Definition at line 1252 of file plots.
1256 size_t row = a_index/a_cols;
1257 size_t col = a_index-a_cols*row;
1259 float rw_wc = a_ww_wc/a_cols;
1260 float rh_wc = a_wh_wc/a_rows;
1262 matrix* _matrix = (matrix*)(a_sep)[MATRIX()];
1263 plotter* _plotter = (plotter*)(a_sep)[PLOTTER()];
1266 _plotter->width = a_sizes[a_index].x();
1267 _plotter->height = a_sizes[a_index].y();
1268 float x = -a_ww_wc*0.5f + a_origins[a_index].x() + _plotter->width*0.5f;
1269 float y = -a_wh_wc*0.5f + a_origins[a_index].y() + _plotter->height*0.5f;
1270 _matrix->set_translate(x,y,0);
1272 float x = -a_ww_wc*0.5f + col * rw_wc + rw_wc * 0.5f;
1273 float y = a_wh_wc*0.5f - row * rh_wc - rh_wc * 0.5f;
1274 _matrix->set_translate(x,y,0);
1276 _matrix->mul_scale(a_scale,a_scale,1);
1278 {_switch* _border = (_switch*)(a_sep)[BORDER()];
1285 _plotter->depth =
min_of(rw_wc,rh_wc);
1292 _plotter->depth = rh_wc;
1298 _plotter->width = rw_wc;
1299 _plotter->height = rh_wc;
1301 if((rw_wc/rh_wc)>=1.0f) {
1302 _plotter->width = rh_wc;
1303 _plotter->height = rh_wc;
1305 _plotter->width = rw_wc;
1306 _plotter->height = rw_wc;
◆ set_regions()
void tools::sg::plots::set_regions |
( |
unsigned int |
a_cols = 1 , |
|
|
unsigned int |
a_rows = 1 , |
|
|
bool |
a_transfer = false |
|
) |
| |
|
inline |
Definition at line 447 of file plots.
450 std::vector<ptbs_t> ptbss;
451 std::vector<prims_t> primss;
452 std::vector<todels_t> tdlss;
453 std::vector<plotter> pls;
459 pls.resize(oldn,plotter(
m_ttf));
460 for(
unsigned int index=0;index<oldn;index++) {
462 p->transfer_plottables(ptbss[index]);
463 p->transfer_primitives(primss[index]);
464 p->transfer_todels(tdlss[index]);
469 cols = a_cols?a_cols:1;
470 rows = a_rows?a_rows:1;
478 for(
unsigned int index=0;index<num;index++) {
480 p->copy_style(pls[index]);
482 {
const ptbs_t& ptbs = ptbss[index];
484 {
const prims_t& prims = primss[index];
486 {
const todels_t& todels = tdlss[index];
◆ touch_plotters()
void tools::sg::plots::touch_plotters |
( |
| ) |
|
|
inline |
Definition at line 322 of file plots.
325 for(
size_t index=0;index<_number;index++) {
326 separator*
sep = (separator*)
m_sep[index];
327 plotter* _plotter = (plotter*)(*
sep)[PLOTTER()];
331 separator*
sep = (*it).m_sep;
332 plotter* _plotter = (plotter*)(*
sep)[PLOTTER()];
◆ touched()
virtual bool tools::sg::plots::touched |
( |
| ) |
|
|
inlinevirtual |
Reimplemented from tools::sg::node.
Definition at line 65 of file plots.
66 if(parent::touched())
return true;
◆ ttf()
◆ update_border()
void tools::sg::plots::update_border |
( |
| ) |
|
|
inlineprotected |
Definition at line 1075 of file plots.
1089 matrix* _m =
new matrix;
1102 {separator*
sep =
new separator;
1105 float wba =
width+2*bw;
1108 float y =
height*0.5f+bh*0.5f;
1110 matrix* _m =
new matrix;
1111 _m->set_translate(x,y,zz);
1114 back_area* b =
new back_area;
1115 b->border_visible =
false;
1122 {separator*
sep =
new separator;
1125 float wba =
width+2*bw;
1128 float y = -
height*0.5f-bh*0.5f;
1130 matrix* _m =
new matrix;
1131 _m->set_translate(x,y,zz);
1134 back_area* b =
new back_area;
1135 b->border_visible =
false;
1142 {separator*
sep =
new separator;
1147 float x = -
width*0.5f-bw*0.5f;
1150 matrix* _m =
new matrix;
1151 _m->set_translate(x,y,zz);
1154 back_area* b =
new back_area;
1155 b->border_visible =
false;
1162 {separator*
sep =
new separator;
1167 float x =
width*0.5f+bw*0.5f;
1170 matrix* _m =
new matrix;
1171 _m->set_translate(x,y,zz);
1174 back_area* b =
new back_area;
1175 b->border_visible =
false;
◆ update_current_border()
void tools::sg::plots::update_current_border |
( |
| ) |
|
|
inlineprotected |
Definition at line 1061 of file plots.
1063 for(
size_t index=0;index<_number;index++) {
1064 separator*
sep = (separator*)
m_sep[index];
1065 _switch* _border = (_switch*)(*
sep)[BORDER()];
◆ update_extras()
void tools::sg::plots::update_extras |
( |
| ) |
|
|
inlineprotected |
Definition at line 1204 of file plots.
1208 separator*
sep =
new separator;
1212 sep->add(
new sg::matrix);
1219 _switch* border =
new _switch;
1233 float ww_wc =
width;
1241 const extra& _extra = *it;
1242 unsigned int index = _extra.m_index;
1245 separator*
sep = _extra.m_sep;
◆ update_if_touched()
void tools::sg::plots::update_if_touched |
( |
| ) |
|
|
inlineprotected |
◆ update_sg()
void tools::sg::plots::update_sg |
( |
| ) |
|
|
inlineprotected |
Definition at line 932 of file plots.
941 unsigned int index = 0;
942 for(
unsigned int irow=0;irow<
rows;irow++) {
943 for(
unsigned int icol=0;icol<
cols;icol++) {
944 separator*
sep =
new separator;
947 sep->add(
new sg::matrix);
954 _switch* border =
new _switch;
975 bool configure = (
m_origins.size()==_number)&&(
m_sizes.size()==_number)?
true:
false;
985 for(
size_t index=0;index<_number;index++) {
986 separator*
sep = (separator*)
m_sep[index];
◆ write()
virtual bool tools::sg::plots::write |
( |
write_action & |
a_action | ) |
|
|
inlinevirtual |
◆ border_color
Definition at line 31 of file plots.
◆ border_height
sf<float> tools::sg::plots::border_height |
Definition at line 28 of file plots.
◆ border_scale
sf<float> tools::sg::plots::border_scale |
Definition at line 30 of file plots.
◆ border_visible
sf<bool> tools::sg::plots::border_visible |
Definition at line 26 of file plots.
◆ border_width
sf<float> tools::sg::plots::border_width |
Definition at line 27 of file plots.
◆ border_z
sf<float> tools::sg::plots::border_z |
Definition at line 29 of file plots.
◆ bottom_margin
sf<float> tools::sg::plots::bottom_margin |
Definition at line 37 of file plots.
◆ cols
sf<unsigned int> tools::sg::plots::cols |
Definition at line 21 of file plots.
◆ height
sf<float> tools::sg::plots::height |
Definition at line 20 of file plots.
◆ horizontal_spacing
sf<float> tools::sg::plots::horizontal_spacing |
Definition at line 38 of file plots.
◆ left_margin
sf<float> tools::sg::plots::left_margin |
Definition at line 34 of file plots.
◆ m_border_sep
◆ m_current
unsigned int tools::sg::plots::m_current |
|
protected |
◆ m_extras
std::vector<extra> tools::sg::plots::m_extras |
|
protected |
◆ m_extras_origins
std::vector<vec2f> tools::sg::plots::m_extras_origins |
|
protected |
◆ m_extras_sep
◆ m_extras_sizes
std::vector<vec2f> tools::sg::plots::m_extras_sizes |
|
protected |
◆ m_group
group tools::sg::plots::m_group |
|
protected |
◆ m_old_cols
unsigned int tools::sg::plots::m_old_cols |
|
protected |
◆ m_old_rows
unsigned int tools::sg::plots::m_old_rows |
|
protected |
◆ m_origins
std::vector<vec2f> tools::sg::plots::m_origins |
|
protected |
◆ m_sep
◆ m_sizes
std::vector<vec2f> tools::sg::plots::m_sizes |
|
protected |
◆ m_ttf
◆ plotter_scale
sf<float> tools::sg::plots::plotter_scale |
Definition at line 24 of file plots.
◆ right_margin
sf<float> tools::sg::plots::right_margin |
Definition at line 35 of file plots.
◆ rows
sf<unsigned int> tools::sg::plots::rows |
Definition at line 22 of file plots.
◆ top_margin
sf<float> tools::sg::plots::top_margin |
Definition at line 36 of file plots.
◆ vertical_spacing
sf<float> tools::sg::plots::vertical_spacing |
Definition at line 39 of file plots.
◆ view_border
sf<bool> tools::sg::plots::view_border |
Definition at line 23 of file plots.
◆ width
sf<float> tools::sg::plots::width |
Definition at line 19 of file plots.
The documentation for this class was generated from the following file:
- /Users/barrand/private/dev/softinex/g4tools/g4tools/tools/sg/plots
#define tools_vforit(a__T, a__v, a__it)
#define TOOLS_FIELD_DESC_NODE_CLASS(a__class)
#define tools_vforcit(a__T, a__v, a__it)
#define TOOLS_ARG_FIELD_DESC(a__field)