00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "area.h"
00037 #include <cmath>
00038 #include "values.h"
00039 #include <cstdio>
00040 #include <vector>
00041 #include <exception>
00042
00043 #include <gtk-2.0/gdk/gdk.h>
00044 #define MOBILE_NODES
00045 #define FIXED_ENVIRONMENT
00046 #define ARROW_ONLY_ON_LAST
00047
00048 #include "pthread.h"
00049 #define WAIT(p) pthread_mutex_lock(p)
00050 #define SIGNAL(p) pthread_mutex_unlock(p)
00051
00052 #define X_BORDER 10
00053 #define Y_BORDER 10
00054
00055 class area* area_c_wrapper;
00056
00057 bool area::on_area_button_press_event(GdkEventButton *ev){
00058
00059
00060
00061
00062 double w_height=this->get_height()-2*Y_BORDER;
00063 yClick= - (min_x + ( ev->x - (double) X_BORDER ) / scalex);
00064 xClick= min_y - ( ev->y - w_height - (double) Y_BORDER) /scaley;
00065
00066 sem_post(&clickSem);
00067 return 0;
00068 }
00069
00070 void area::waitClick(double &x, double &y){
00071 sem_wait(&clickSem);
00072 if (interrupted){
00073 interrupted=false;
00074 throw 0;
00075 }
00076 x=xClick;
00077 y=yClick;
00078 }
00079
00080 void area::waitClickInterrupt(){
00081 interrupted=true;
00082 sem_post(&clickSem);
00083 }
00084
00085 bool area::on_area_button_release_event(GdkEventButton *ev){
00086 return 0;
00087 }
00088
00089 bool area::on_area_expose_event(GdkEventExpose *ev){
00090 return 0;
00091 }
00092
00093 int area::get_selected(){
00094 return painted;
00095 }
00096
00097 bool area::on_area_motion_notify_event(GdkEventMotion *ev){
00098 WAIT(&sem);
00099 if (selected==-1){
00100 for (unsigned i=0;i<roboVec.size();i++){
00101 double x_rob=roboVec.at(i).x_draw;
00102 double y_rob=roboVec.at(i).y_draw;
00103 if (selected==-1 && sqrt( (x_rob-ev->x)*(x_rob-ev->x) + (y_rob-ev->y)*(y_rob-ev->y) ) < 20){
00104 roboVec.at(i).has_mouse_over=1;
00105 selected=i;
00106 painted=i;
00107 } else roboVec.at(i).has_mouse_over=0;
00108 }
00109 }
00110 if (!(ev->state & 256)) {
00111 selected=-1;
00112 SIGNAL(&sem);
00113 return true;
00114 }
00115 #ifdef MOBILE_NODES
00116 if (selected!=-1){
00117 #ifdef FIXED_ENVIRONMENT
00118 if (ev->x+X_BORDER>this->get_width() || ev->y+Y_BORDER>this->get_height()
00119 || ev->x < X_BORDER || ev->y < Y_BORDER) {
00120 SIGNAL(&sem);
00121 return true;
00122 }
00123 #endif
00124 double x=(min_x*scalex + ev->x - X_BORDER)/scalex;
00125 double y=(min_y*scaley - ev->y - Y_BORDER + this->get_height())/scaley;
00126 roboVec.at(selected).x=x;
00127 roboVec.at(selected).y=y;
00128 }
00129 #endif
00130 compute_environment();
00131 SIGNAL(&sem);
00132 return true;
00133 }
00134
00135
00136 bool area::timer_callback(){
00137 return 1;
00138 }
00139
00140 area::area(): DrawingArea(){
00141
00142 pthread_mutex_init(&sem, NULL);
00143 sem_init(&clickSem,1,0);
00144
00145 maximumNumOfPoints=360;
00146 fixed_scale=-1;
00147 snap_id=0;
00148 has_bg_image=false;
00149 join_points=false;
00150 marginSetted=false;
00151 Glib::RefPtr<Gdk::Colormap> colormap = get_default_colormap ();
00152 cols[0] = Gdk::Color("black");
00153 cols[2] = Gdk::Color("red");
00154 cols[3] = Gdk::Color("green");
00155 cols[1] = Gdk::Color("orange");
00156 cols[4] = Gdk::Color("blue");
00157 cols[5] = Gdk::Color("violet");
00158 for (unsigned i=0;i<6;i++){
00159 colormap->alloc_color(cols[i]);
00160 }
00161 this->set_events(
00162 Gdk::BUTTON_PRESS_MASK |
00163 Gdk::BUTTON_RELEASE_MASK |
00164 Gdk::POINTER_MOTION_MASK);
00165
00166
00167 painted=selected=-1;
00168 area_c_wrapper=this;
00169 this->signal_size_allocate().connect(sigc::mem_fun(*this, &area::on_size_alloc));
00170
00171 this->signal_button_press_event().connect(sigc::mem_fun(*this, &area::on_area_button_press_event));
00172 timesnr_12 = new Pango::FontDescription("Times new roman 9");
00173 timesnr_8 = new Pango::FontDescription("Times new roman 7");
00174 maintain_aspect_ratio=true;
00175 interrupted=false;
00176 }
00177 int area::getRobotId(std::string name){
00178 return roboMap[name];
00179 }
00180
00181 int area::addRobot(std::string name){
00182 WAIT(&sem);
00183 Robot r;
00184 r.x=0;
00185 r.y=0;
00186 r.a=0;
00187 r.col=0;
00188 r.name=name;
00189 roboVec.push_back(r);
00190 compute_environment();
00191 int id=roboVec.size() - 1;
00192 roboMap[name]=id;
00193 SIGNAL(&sem);
00194 return (id);
00195 }
00196
00197 void area::on_size_alloc(Gtk::Allocation &al){
00198 WAIT(&sem);
00199 compute_environment();
00200 SIGNAL(&sem);
00201 }
00202
00203 void area::addPoint(double x, double y, int color, int with_respect_to_robot){
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216 addGridPoint(x,y,0.0,color,with_respect_to_robot);
00217 }
00218
00219 void area::addGridPoint(double x, double y, double cell_size, int color, int with_respect_to_robot){
00220 WAIT(&sem);
00221 Point p;
00222 p.col=color;
00223 p.cell_size=cell_size;
00224 if (cell_size>0){
00225 p.x=round(x/cell_size)*cell_size;
00226 p.y=round(y/cell_size)*cell_size;
00227 }else{
00228 p.x=x;
00229 p.y=y;
00230 }
00231 for (unsigned i=0;i<pointVec.size();i++){
00232 if (pointVec[i].x==p.x && pointVec[i].y==p.y){
00233 SIGNAL(&sem);
00234 return;
00235 }
00236 }
00237 pointVec.push_back(p);
00238 if (pointVec.size()>maximumNumOfPoints) pointVec.erase(pointVec.begin());
00239 compute_environment();
00240 SIGNAL(&sem);
00241 }
00242
00243 void addLine(double x1, double y1, double x2, double y2, int color){
00244
00245 }
00246
00247 void area::addGoal(int r1, double x2, double y2, int color,int arrow){
00248 WAIT(&sem);
00249 Goal g;
00250 g.x=x2;
00251 g.y=y2;
00252 g.r1=r1;
00253 g.col=color;
00254 goalVec.push_back(g);
00255 compute_environment();
00256 SIGNAL(&sem);
00257 }
00258
00259 void area::addPoint(double y, int color){
00260 WAIT(&sem);
00261 Point p;
00262 p.col=color;
00263 p.y=y;
00264 p.x=pointVec.size();
00265 pointVec.push_back(p);
00266 if (pointVec.size()>maximumNumOfPoints) {
00267 pointVec.erase(pointVec.begin());
00268 for (unsigned i=0;i<pointVec.size();i++){
00269 pointVec[i].x=i;
00270 }
00271 }
00272 compute_environment();
00273 SIGNAL(&sem);
00274 }
00275
00276 void area::setMaximumNumOfPoints(int n){
00277 maximumNumOfPoints=n;
00278 }
00279
00280 void area::addLink(int r1, int r2, int arrow, int color, float value, int set){
00281 WAIT(&sem);
00282 #ifdef ARROW_ONLY_ON_LAST
00283 for (unsigned i=0;i<linkVec[set].size();i++) linkVec[set].at(i).arrow=0;
00284 #endif
00285 Link l;
00286 l.r1=r1;
00287 l.r2=r2;
00288 l.col=color;
00289 l.arrow=arrow;
00290 l.has_value=true;
00291 l.value=value;
00292 linkVec[set].push_back(l);
00293 SIGNAL(&sem);
00294 }
00295
00296 void area::addLink(int r1, int r2, int arrow, int color, int set){
00297 WAIT(&sem);
00298 #ifdef ARROW_ONLY_ON_LAST
00299 for (unsigned i=0;i<linkVec[set].size();i++) linkVec[set].at(i).arrow=0;
00300 #endif
00301 Link l;
00302 l.r1=r1;
00303 l.r2=r2;
00304 l.col=color;
00305 l.arrow=arrow;
00306 l.has_value=false;
00307 linkVec[set].push_back(l);
00308 SIGNAL(&sem);
00309 }
00310
00311 int area::addRobot(){
00312 WAIT(&sem);
00313 Robot r;
00314 r.x=0;
00315 r.y=0;
00316 r.a=0;
00317 r.name.assign("");
00318 r.col=0;
00319 roboVec.push_back(r);
00320 compute_environment();
00321 SIGNAL(&sem);
00322 return (roboVec.size() - 1);
00323 }
00324 int area::getNumOfRobots(){
00325 return roboVec.size();
00326 }
00327
00328 void area::setRobotPose(int id, double x0, double y0, double ang, int col=0){
00329 WAIT(&sem);
00330 roboVec.at(id).x=x0;
00331 roboVec.at(id).y=y0;
00332 roboVec.at(id).a=ang;
00333 roboVec.at(id).col=col;
00334 compute_environment();
00335 SIGNAL(&sem);
00336 }
00337
00338 int area::getRobotPose(int id, double* x0, double* y0, double* ang){
00339 WAIT(&sem);
00340 if (id >= 0 && (unsigned) id < roboVec.size()){
00341 *x0=roboVec.at(id).x;
00342 *y0=roboVec.at(id).y;
00343 *ang=roboVec.at(id).a;
00344 SIGNAL(&sem);
00345 return id;
00346 }
00347 SIGNAL(&sem);
00348 return -1;
00349 }
00350
00351 void area::draw_robot(double x, double y, double a, int col,int mouse_over, double scale=0.1){
00352 static const double ROBOT [2][7] = {{-312.5, 312.5, 312.5, -312.5, 312.5, -312.5, -312.5},
00353 { 250, 250, -250, -250, 0, 250, -250}};
00354 int robotX[7];
00355 int robotY[7];
00356 double s = sin(a+M_PI/2);
00357 double c = cos(a+M_PI/2);
00358 if (scale>0.05) scale=0.05;
00359 if (scale<0.001) scale=0.001;
00360 for (unsigned i = 0; i < 7; i++){
00361 robotX[i] = (int) rint(ROBOT[0][i] * c * scale + ROBOT[1][i] * s * scale);
00362 robotY[i] = (int) rint(ROBOT[1][i] * c * scale - ROBOT[0][i] * s * scale);
00363 }
00364
00365 mouse_over=0;
00366 if (mouse_over==1) gc->set_foreground(cols[2]);
00367 else gc->set_foreground(cols[col]);
00368
00369 for (unsigned i=0;i<6;i++){
00370 window->draw_line(gc, (int)x+robotX[i], (int)y+robotY[i],(int)x+robotX[i+1], (int)y+robotY[i+1]);
00371 }
00372 }
00373
00374 void area::draw_triangle(double x, double y, double a, int col, double scale){
00375 static const double TRIANGLE [2][4] = {{-100.5, 100.5, 0.0, -100.5}, {0.0,0.0,100.5, 0.0 } };
00376 int triangleX[4];
00377 int triangleY[4];
00378 double s = sin(a+M_PI/2);
00379 double c = cos(a+M_PI/2);
00380 if (scale>0.1) scale=0.1;
00381 if (scale<0.01) scale=0.01;
00382
00383 for (unsigned i = 0; i < 4; i++){
00384 triangleX[i] = (int) rint(TRIANGLE[0][i] * c * scale + TRIANGLE[1][i] * s * scale);
00385 triangleY[i] = (int) rint(TRIANGLE[1][i] * c * scale - TRIANGLE[0][i] * s * scale);
00386 }
00387 gc->set_foreground(cols[col]);
00388 for (unsigned i=0;i<3;i++){
00389 window->draw_line(gc, (int)x+triangleX[i], (int)y+triangleY[i],(int)x+triangleX[i+1], (int)y+triangleY[i+1]);
00390 }
00391 }
00392 void area::setMaintainAspectRatio(bool val){
00393 maintain_aspect_ratio=val;
00394 }
00395
00396 void area::clearLinks(int set){
00397 WAIT(&sem);
00398 linkVec[set].clear();
00399 SIGNAL(&sem);
00400 }
00401
00402 void area::clearRobots(){
00403 WAIT(&sem);
00404 roboVec.clear();
00405 roboMap.clear();
00406 SIGNAL(&sem);
00407 }
00408 void area::clearPoints(){
00409 WAIT(&sem);
00410 pointVec.clear();
00411 SIGNAL(&sem);
00412 }
00413 void area::on_realize(){
00414 WAIT(&sem);
00415 Gtk::DrawingArea::on_realize();
00416 window = get_window();
00417 gc = Gdk::GC::create(window);
00418 window->clear();
00419 initialized=1;
00420 SIGNAL(&sem);
00421 }
00422 void area::setMargins(double maxx,double maxy, double minx, double miny){
00423 marginSetted=true;
00424 canvas_maxx=maxx;
00425 canvas_maxy=maxy;
00426 canvas_minx=minx;
00427 canvas_miny=miny;
00428 }
00429
00430 void area::compute_environment(){
00431 double width=0, height=0;
00432 max_x = -2^30; max_y= -2^30; min_x=2^30; min_y=2^30;
00433 for (unsigned i=0;i< roboVec.size();i++){
00434 max_x= roboVec.at(i).x>max_x+25? roboVec.at(i).x+25:max_x;
00435 max_y= roboVec.at(i).y>max_y+25? roboVec.at(i).y+25:max_y;
00436 min_y= roboVec.at(i).y<min_y-25? roboVec.at(i).y:min_y-25;
00437 min_x= roboVec.at(i).x<min_x-25? roboVec.at(i).x:min_x-25;
00438 }
00439 for (unsigned i=0;i< pointVec.size();i++){
00440 max_x= pointVec.at(i).x>max_x? pointVec.at(i).x:max_x;
00441 max_y= pointVec.at(i).y>max_y? pointVec.at(i).y:max_y;
00442 min_y= pointVec.at(i).y<min_y? pointVec.at(i).y:min_y;
00443 min_x= pointVec.at(i).x<min_x? pointVec.at(i).x:min_x;
00444 }
00445 for (unsigned i=0;i< goalVec.size();i++){
00446 max_x= goalVec.at(i).x>max_x? goalVec.at(i).x:max_x;
00447 max_y= goalVec.at(i).y>max_y? goalVec.at(i).y:max_y;
00448 min_y= goalVec.at(i).y<min_y? goalVec.at(i).y:min_y;
00449 min_x= goalVec.at(i).x<min_x? goalVec.at(i).x:min_x;
00450 }
00451
00452 if (marginSetted){
00453 if (max_x < canvas_maxx) {
00454 max_x = canvas_maxx;
00455 }
00456 if (max_y < canvas_maxy) {
00457 max_y = canvas_maxy;
00458 }
00459 if (min_x > canvas_minx) {
00460 min_x = canvas_minx;
00461 }
00462 if (min_y > canvas_miny) {
00463 min_y = canvas_miny;
00464 }
00465 }
00466
00467 width=fabs(max_x-min_x);
00468 height=fabs(max_y-min_y);
00469
00470 double w_width=this->get_width()-2*X_BORDER;
00471 double w_height=this->get_height()-2*Y_BORDER;
00472 double r1=w_width/width;
00473 double r2=w_height/height;
00474
00475 if (maintain_aspect_ratio){
00476 scalex = scaley = r1<r2?r1:r2;
00477 }else{
00478 scalex=r1;
00479 scaley=r2;
00480 }
00481
00482 for (unsigned i=0;i< roboVec.size();i++){
00483 roboVec.at(i).x_draw= X_BORDER + (int) ((roboVec.at(i).x - min_x)*scalex);
00484 roboVec.at(i).y_draw= (int) w_height + Y_BORDER - (int) ((roboVec.at(i).y - min_y)*scaley);
00485 }
00486 for (unsigned i=0;i< pointVec.size();i++){
00487 pointVec.at(i).x_draw= X_BORDER + (int) ((pointVec.at(i).x - min_x)*scalex);
00488 pointVec.at(i).y_draw= (int) w_height + Y_BORDER - (int) ((pointVec.at(i).y - min_y)*scaley);
00489 }
00490
00491 for (unsigned i=0;i< imgVec.size();i++){
00492 imgVec.at(i).x_draw= X_BORDER + (int) ((imgVec.at(i).x - min_x)*scalex);
00493 imgVec.at(i).y_draw= (int) w_height + Y_BORDER - (int) ((imgVec.at(i).y - min_y)*scaley);
00494
00495 double actx=imgVec.at(i).sizex*scalex*0.020;
00496
00497
00498 if (imgVec.at(i).sizex!=0 && actx!=0 ){
00499 imgVec.at(i).scale=actx/imgVec.at(i).sizex;
00500 } else{
00501 imgVec.at(i).scale=1;
00502 }
00503 }
00504
00505 for (unsigned i=0;i< goalVec.size();i++){
00506 goalVec.at(i).x_draw= X_BORDER + (int) ((goalVec.at(i).x - min_x)*scalex);
00507 goalVec.at(i).y_draw= (int) w_height + Y_BORDER - (int) ((goalVec.at(i).y - min_y)*scaley);
00508 }
00509 zoom=sqrt(w_width*w_height/(2500*width*height));
00510 }
00511
00512 void area::setJoinPoints(bool n){
00513 join_points=n;
00514 }
00515
00516 void area::setBackGroundImage(std::string s){
00517 bg_image = Gdk::Pixbuf::create_from_file(s.c_str());
00518 has_bg_image=true;
00519 }
00520
00521 int area::addImage(std::string s, double x, double y, double scale, std::string s1){
00522 WAIT(&sem);
00523 Img m;
00524 m.scale_type=0;
00525 m.filename.assign(s.c_str());
00526 m.text.assign(s1);
00527 m.x=x;
00528 m.y=y;
00529 m.scale=scale;
00530
00531 m.pixbuf = Gdk::Pixbuf::create_from_file(s.c_str());
00532
00533 imgVec.push_back(m);
00534 compute_environment();
00535 SIGNAL(&sem);
00536 return imgVec.size()-1;
00537
00538 }
00539
00540 int area::addImage(std::string s, double x, double y, double scale){
00541 return addImage(s,x,y,scale,"");
00542 }
00543
00544 int area::addImage(std::string s, double x, double y, double sizex, double sizey, std::string s1){
00545 WAIT(&sem);
00546 Img m;
00547 m.scale_type=1;
00548 m.filename.assign(s.c_str());
00549 m.text.assign(s1);
00550 m.x=x;
00551 m.y=y;
00552 m.sizex=sizex;
00553 m.sizey=sizey;
00554
00555 m.pixbuf = Gdk::Pixbuf::create_from_file(s.c_str());
00556
00557 imgVec.push_back(m);
00558 compute_environment();
00559 SIGNAL(&sem);
00560 return imgVec.size()-1;
00561 }
00562
00563
00564 void area::paint(){
00565 WAIT(&sem);
00566 get_window()->clear();
00567 Glib::RefPtr<Pango::Layout> layout = create_pango_layout("");
00568 layout->set_font_description(*timesnr_12);
00569 char tmp[64];
00570
00571
00572 if (has_bg_image){
00573
00574 Glib::RefPtr<Gdk::Pixbuf> image2 = bg_image->scale_simple(get_width(),get_height(),Gdk::INTERP_NEAREST);
00575 image2->render_to_drawable(get_window(),
00576 get_style()->get_black_gc(),
00577 0, 0, 0, 0, image2->get_width(),
00578 image2->get_height(),
00579 Gdk::RGB_DITHER_NONE,0, 0);
00580 }
00581
00582 for (unsigned i=0;i< imgVec.size();i++){
00583 double scale=imgVec.at(i).scale;
00584 Glib::RefPtr<Gdk::Pixbuf> image4 ;
00585 try{
00586 image4 = imgVec.at(i).pixbuf->scale_simple((int)(imgVec.at(i).pixbuf->get_width()*scale)+1,
00587 (int)(imgVec.at(i).pixbuf->get_height()*scale)+1,Gdk::INTERP_NEAREST);
00588
00589 image4->render_to_drawable(get_window(),
00590 get_style()->get_black_gc(),
00591 0, 0, imgVec.at(i).x_draw-image4->get_width(), imgVec.at(i).y_draw - image4->get_height(), image4->get_width(),
00592 image4->get_height(),
00593 Gdk::RGB_DITHER_NONE,0, 0);
00594 } catch(...){
00595
00596 }
00597 layout->set_font_description(*timesnr_8);
00598 sprintf(tmp,"%s",imgVec.at(i).text.c_str());
00599 layout->set_markup(tmp);
00600 int y_txt=imgVec.at(i).y_draw;
00601 int x_txt=imgVec.at(i).x_draw - image4->get_width()-5;
00602 get_window()->draw_layout(Gdk::GC::create(get_window()),x_txt,y_txt, layout);
00603
00604 }
00605
00606 for (unsigned i=0;i< goalVec.size();i++){
00607 gc->set_foreground(cols[goalVec.at(i).col]);
00608 window->draw_line(gc, roboVec.at(goalVec.at(i).r1).x_draw, roboVec.at(goalVec.at(i).r1).y_draw,
00609 goalVec.at(i).x_draw,goalVec.at(i).y_draw);
00610 sprintf(tmp,"(%3.1f,%3.1f)",goalVec.at(i).x,goalVec.at(i).y);
00611 layout->set_markup(tmp);
00612 get_window()->draw_layout(Gdk::GC::create(get_window()),goalVec.at(i).x_draw-50,goalVec.at(i).y_draw-20, layout);
00613 layout->set_markup("*");
00614 get_window()->draw_layout(Gdk::GC::create(get_window()),goalVec.at(i).x_draw,goalVec.at(i).y_draw-5, layout);
00615
00616
00617
00618 }
00619
00620 for (unsigned i=0;i< roboVec.size();i++){
00621
00622
00623 draw_robot(roboVec.at(i).x_draw,roboVec.at(i).y_draw,roboVec.at(i).a,
00624 roboVec.at(i).col,roboVec.at(i).has_mouse_over,0.025);
00625
00626
00627 sprintf(tmp,"%s",roboVec.at(i).name.c_str());
00628
00629 layout->set_markup(tmp);
00630
00631 get_window()->draw_layout(Gdk::GC::create(get_window()),roboVec.at(i).x_draw-20,roboVec.at(i).y_draw+7, layout);
00632 }
00633
00634 for (int set = 0; set < LINK_SETS; set++) {
00635 for (unsigned i = 0; i < linkVec[set].size(); i++) {
00636 gc->set_foreground(cols[linkVec[set].at(i).col]);
00637 window->draw_line(gc, roboVec.at(linkVec[set].at(i).r1).x_draw,
00638 roboVec.at(linkVec[set].at(i).r1).y_draw, roboVec.at(
00639 linkVec[set].at(i).r2).x_draw, roboVec.at(
00640 linkVec[set].at(i).r2).y_draw);
00641 int disp=0;
00642 if (linkVec[set].at(i).r2 > linkVec[set].at(i).r1){
00643 disp = 5;
00644 }else{
00645 disp = -5;
00646 }
00647
00648 int x_text = roboVec.at(linkVec[set].at(i).r1).x_draw
00649 + (roboVec.at(linkVec[set].at(i).r2).x_draw - roboVec.at(
00650 linkVec[set].at(i).r1).x_draw) / 2;
00651 int y_text = roboVec.at(linkVec[set].at(i).r1).y_draw
00652 + (roboVec.at(linkVec[set].at(i).r2).y_draw - roboVec.at(
00653 linkVec[set].at(i).r1).y_draw) / 2;
00654 if (linkVec[set].at(i).has_value){
00655 sprintf(tmp, "%3.1f", linkVec[set].at(i).value);
00656 layout->set_markup(tmp);
00657 get_window()->draw_layout(Gdk::GC::create(get_window()), x_text+disp,
00658 y_text+disp, layout);
00659 }
00660
00661
00662
00663
00664
00665
00666
00667 double ac1 = roboVec.at(linkVec[set].at(i).r2).x_draw - roboVec.at(
00668 linkVec[set].at(i).r1).x_draw;
00669 double ac2 = roboVec.at(linkVec[set].at(i).r2).y_draw - roboVec.at(
00670 linkVec[set].at(i).r1).y_draw;
00671
00672
00673 double ang = atan2(ac2, ac1);
00674
00675 double d1 = -15*cos(ang);
00676 double d2 = -15*sin(ang);
00677
00678 if (linkVec[set].at(i).arrow) {
00679 draw_triangle(roboVec.at(linkVec[set].at(i).r2).x_draw+d1,
00680 roboVec.at(linkVec[set].at(i).r2).y_draw+d2, -ang,
00681 linkVec[set].at(i).col, 10);
00682 }
00683 }
00684 }
00685 gc->set_foreground(cols[2]);
00686 for (unsigned i=0;i< pointVec.size();i++){
00687 Point p;
00688 p=pointVec.at(i);
00689 if (join_points) {
00690 Point p1;
00691 if (i!=0) p1=pointVec.at(i-1);
00692 else p1=p;
00693 window->draw_line(gc, p.x_draw, p.y_draw, p1.x_draw,p1.y_draw);
00694 }else{
00695 window->draw_point(gc,p.x_draw,p.y_draw);
00696 window->draw_point(gc,p.x_draw,p.y_draw-1);
00697 window->draw_point(gc,p.x_draw,p.y_draw+1);
00698 window->draw_point(gc,p.x_draw+1,p.y_draw);
00699 window->draw_point(gc,p.x_draw-1,p.y_draw);
00700 }
00701 }
00702 SIGNAL(&sem);
00703 }
00704
00705
00706 void area::grabSnapshot(){
00707 WAIT(&sem);
00708 Glib::RefPtr<Gdk::Drawable> drwbl = this->get_window();
00709 Glib::RefPtr<Gdk::Pixbuf> pxb;
00710 pxb = Gdk::Pixbuf::create(drwbl, drwbl->get_colormap(), 0, 0, 0, 0,
00711 this->get_width(), this->get_height());
00712 char name[256];
00713 sprintf(name, "snapshot_%04d.png", snap_id);
00714 try {
00715 pxb->save(name, "png");
00716 snap_id++;
00717 } catch (Glib::Exception &e) {
00718
00719 }
00720 SIGNAL(&sem);
00721
00722 }
00723
00724 void area::clearGoals(){
00725 WAIT(&sem);
00726 goalVec.clear();
00727 SIGNAL(&sem);
00728 }
00729 #include <gdk/gdk.h>
00730
00731 bool area::on_expose_event(GdkEventExpose* e){
00732 paint();
00733 return true;
00734 }
00735
00736 void area::setRobotColor(int idx, int c){
00737 roboVec.at(idx).col=c;
00738 }
00739