reference/ocr-new/tcl_interface.cc
changeset 0 6b8091ca909a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/reference/ocr-new/tcl_interface.cc	Thu May 18 23:12:51 2006 +0200
@@ -0,0 +1,619 @@
+#include <tcl.h>
+#include <tk.h>
+#include <stdlib.h>
+#include <string.h>
+#include "link.h"
+#include "tcl_interface.h"
+#include "stdio.h"
+#include "Page.h"
+
+extern Page* global_page;
+extern Page* active_page;
+extern Page* zoned_page;
+
+extern Tcl_Interp* TCL_ip;
+extern Tk_Window main_window;
+extern double SCALE_FACTOR;
+extern int DISPLAY_SPELLING_MISTAKES;
+extern TclMode mode;
+static int page_currently_open = 0;
+
+Component * curCompSelected;
+Component * prevCompSelected;
+
+
+
+void scale(int& coordinate)
+{
+  coordinate = (int)(coordinate * SCALE_FACTOR);
+}
+
+void scale(int& coordinate, double scaleFactor)
+{
+ coordinate = (int)(coordinate * scaleFactor);
+}
+
+int error(char* s)
+{
+/* would like to make this take var num args */
+  printf("Error: %s", s);
+}
+
+int quit_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  printf("Thank you for using OCRchie.\n");
+  exit(0);
+}
+
+int get_linenum_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  // argv[1] - x coord   argv[2] - y coord
+  global_page->get_linenum(atoi (argv[1]), atoi (argv[2]));
+  return TCL_OK;
+}
+
+int add_equation_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  // argv[1]  starting line of equation, [2] startcol [3] endline [4] endcol
+  global_page->addEquation(atoi (argv[1]), atoi (argv[2]), atoi(argv[3]), 
+			   atoi(argv[4]));
+  return TCL_OK;
+}
+
+int delete_equation_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  global_page->deleteEquation(atoi(argv[1]), atoi(argv[2]));
+  return TCL_OK;
+
+}
+
+int auto_zone_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  ((ZonedPage *) global_page)->autoZone(atoi(argv[1]), atoi(argv[2]));
+  return TCL_OK;
+}
+
+int add_zone_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  // first we need to unscale from scaled immage
+  int ulx = (int)(atof(argv[1])/ZONING_SCALE_FACTOR);
+  int uly = (int)(atof(argv[2])/ZONING_SCALE_FACTOR);
+  int lrx = (int)(atof(argv[3])/ZONING_SCALE_FACTOR);
+  int lry = (int)(atof(argv[4])/ZONING_SCALE_FACTOR);
+ 
+ Point ul = Point(ulx,uly);
+ Point lr = Point(lrx, lry);
+ 
+ if ( ul != lr)
+   {
+     Zone * newzone = new Zone(ul,lr);
+     newzone->buildPage((ZonedPage *) global_page);
+     ((ZonedPage *)global_page)->zones()->Append(newzone);
+   }
+  
+  return TCL_OK;
+
+}
+
+
+int remove_zone_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  int x =  (int)(atof(argv[1])/ZONING_SCALE_FACTOR);
+  int y =  (int)(atof(argv[2])/ZONING_SCALE_FACTOR);
+
+  Zones * z = ((ZonedPage *) global_page)->zones();
+  
+  z->removeElement(z->findZone(x,y));
+  return TCL_OK;
+}
+
+int select_comp_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  prevCompSelected = curCompSelected;
+  //argv[1] is x coord argv[2] is y
+  curCompSelected = global_page->compAt(Point(atoi(argv[1]), atoi(argv[2])));
+  if (curCompSelected == NULL) 
+    {
+      docommand("set validComponent 0");
+    }
+  else
+    {
+      docommand("set validComponent 1");
+      docommand("set curCompId %s",curCompSelected->fasciiId);
+      docommand("puts \"curCompId: $curCompId\"");
+    }
+  return TCL_OK;
+}
+
+int join_comp_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  if (prevCompSelected != NULL && curCompSelected != NULL &&
+      prevCompSelected != curCompSelected && 
+      global_page->get_linenum(prevCompSelected) == 
+      global_page->get_linenum(curCompSelected))
+    {
+      global_page->join(prevCompSelected,curCompSelected);
+      printf("Joined. cur %u prev %u \n", (long) curCompSelected,
+	   (long) prevCompSelected);
+
+      prevCompSelected = NULL;
+      curCompSelected = NULL;
+    }
+  else
+    printf("not Joined. cur %u prev %u\n", (long) curCompSelected,
+	   (long) prevCompSelected);
+  {
+      prevCompSelected = NULL;
+      curCompSelected = NULL;
+  }
+
+  return TCL_OK;
+}
+
+int learn_comp_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+
+{
+  learn(curCompSelected, argv[1], 256);
+  return TCL_OK;	
+}
+int split_comp_horiz_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  global_page->thinnestHorizontalSplit(curCompSelected);
+
+  return TCL_OK;
+}
+
+int get_skew_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  get_skew(global_page->rmap());
+  return TCL_OK;
+}
+
+int deskew_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  if(DESKEW_METHOD != -1)
+    {
+      if(global_page->deskew(DESKEW_METHOD))
+	global_page->rmap()->display_intervals("black");
+      return TCL_OK;
+    }
+  else
+    return TCL_OK;
+}
+
+int display_intervals_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  if (ac == 1)
+    global_page->rmap()->display_intervals("black");
+  else
+    global_page->rmap()->display_intervals(argv[1], atof(argv[2]), "black");
+  return TCL_OK;
+}
+
+int page_open_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  mode = REGULAR;
+  if(ac != 2)
+    return TCL_ERROR;
+  printf("Opening %s\n", argv[1]);
+  if(page_currently_open == 1)
+    {
+      /* should print some message about closing the current one first */
+      return TCL_OK;
+    }
+  global_page = new ZonedPage;
+  if(global_page->readMap(argv[1]) != VALID)
+    interp->result = "0";
+  else
+    {
+         interp->result = "1";
+    }
+  active_page = global_page;
+  page_currently_open = 1;
+  return TCL_OK;
+}
+
+int zoned_page_open_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  mode = ZONING;
+  if(ac != 2)
+    return TCL_ERROR;
+  printf("Opening %s\n", argv[1]);
+  if(page_currently_open == 1)
+    {
+      /* should print some message about closing the current one first */
+      return TCL_OK;
+    }
+  global_page = new ZonedPage;
+  if(global_page->readMap(argv[1]) != VALID)
+    interp->result = "0";
+  else
+    {
+         interp->result = "1";
+    }
+  zoned_page = global_page;
+  page_currently_open = 1;
+  return TCL_OK;
+}
+
+
+int extract_comp_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+ global_page->extractComponents(MinHorizSeparation);
+ return TCL_OK;
+
+}
+
+int get_page_height_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  sprintf(interp->result, "%d", global_page->get_height());
+  /*  printf("Interpereter height = %s\n", interp->result); */
+  return TCL_OK;
+}
+
+int get_page_width_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  sprintf(interp->result, "%d",  global_page->get_width());
+  /* printf("Interpereter width = %s\n", interp->result); */
+  return TCL_OK;
+}
+
+int zoom_in_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  if(ac == 1)
+    {
+      SCALE_FACTOR = SCALE_FACTOR * 2;
+      global_page->rmap()->display_intervals("black");
+    }
+  else
+    {
+      //argv[1] window argv[2] scalefactor
+      global_page->rmap()->display_intervals(argv[1], atof(argv[2]),"black");
+    }
+  return TCL_OK;
+}
+
+int zoom_out_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  if (ac == 1)
+    {
+      SCALE_FACTOR = SCALE_FACTOR * 0.5;
+      global_page->rmap()->display_intervals("black");
+    }
+  else
+      global_page->rmap()->display_intervals(argv[1], atof(argv[2]),"black");
+
+  return TCL_OK;
+}
+
+int deallocate_page_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  if(page_currently_open == 0)
+    return TCL_OK;  /* don't do anything if their isn't anything open */
+  delete global_page;
+  page_currently_open = 0;
+  return TCL_OK;
+}
+
+int learn_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  // argv1 is tif argv2 is txt and argv3 is a bool for word synchronization
+  printf("Learning from %s and %s sych %d\n", argv[1], argv[2], atoi(argv[3]));
+  learn(argv[1], argv[2], atoi(argv[3]));
+  return TCL_OK;
+}
+
+int learn_page_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  // argv1 is txt and argv2 is a bool for word synchronization
+  printf("Learning from %s and %s sych %d\n", argv[1], argv[2], atoi(argv[3]));
+  learn(global_page, argv[1], atoi(argv[2]));
+  return TCL_OK;
+}
+
+int learn_data_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  printf("Learning data from %s\n", argv[1]);
+  readLearnedGroups(argv[1]);
+  return TCL_OK;
+}
+
+int write_word_pos_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  global_page->writeWordPos(argv[1]);
+  return TCL_OK;
+}
+
+int write_wordbox_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  // arguments are output file, x offset,  y offset and WbxEquationsOnly variable
+  global_page->writeWordbox(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]));
+  return TCL_OK;
+}
+
+int write_equations_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  // arguments are output file, linenumber offset
+  global_page->writeEquations(argv[1], atoi(argv[2]));
+  return TCL_OK;
+}
+
+int write_learned_chars_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  writeLearnedGroups(argv[1]);
+  return TCL_OK;
+}
+  
+int find_lines_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  deskew_cmd(clientData, interp, ac, argv);
+  /*  printf("Calling setlines\n"); */
+  global_page->setLines();
+  return TCL_OK;
+}
+
+
+int recognize_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+
+{
+  /* just in case someone has left something sitting around */
+  docommand(".main_window.edit_window.text_part delete 1.0 end");
+  docommand("set COLORED_WORDS {}");
+   /* printf("Calling extractComponents\n"); */
+  if(global_page->components() == NULL) 
+    global_page->extractComponents(MinHorizSeparation);
+  /* printf("Calling recognize\n"); */
+  global_page->recognize();
+  /* printf("Calling extractwords\n"); */
+  global_page->extractWords();
+  if(SPELLCHECK)
+    {
+      /* printf("Spellchecking\n"); */
+      global_page->spellcheck();
+    }	     
+  /* printf("Calling sendwordstotcl\n"); */
+  global_page->send_words_to_tcl();
+  return TCL_OK;
+}
+
+int find_lines_and_recognize_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+
+{
+  /* just in case someone has left something sitting around */
+  docommand(".main_window.edit_window.text_part delete 1.0 end");
+  docommand("set COLORED_WORDS {}");
+  /* printf("Calling deskew\n"); */
+  deskew_cmd(clientData, interp, ac, argv);
+  /*  printf("Calling setlines\n"); */
+  global_page->setLines();
+  /* printf("Calling extractComponents\n"); */
+  global_page->extractComponents(MinHorizSeparation);
+  /* printf("Calling recognize\n"); */
+  global_page->recognize();
+  /* printf("Calling extractwords\n"); */
+  global_page->extractWords();
+  if(SPELLCHECK)
+    {
+      /* printf("Spellchecking\n"); */
+      global_page->spellcheck();
+    }	     
+  /* printf("Calling sendwordstotcl\n"); */
+  global_page->send_words_to_tcl();
+  return TCL_OK;
+}
+
+
+int switch_to_active_page_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  if (active_page != NULL)
+    global_page = active_page;
+  return TCL_OK;
+}
+
+int switch_to_zoned_page_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+  if (zoned_page != NULL)
+    global_page = zoned_page;
+  return TCL_OK;
+}
+
+int set_active_page_cmd(ClientData clientData, Tcl_Interp *interp, int ac, char** argv)
+{
+
+  int x = atoi(argv[1]);
+  int y = atoi(argv[2]);
+  active_page = ((ZonedPage *) zoned_page)->activate(x,y);
+  if (active_page != NULL)
+    {
+      docommand(".main_window.edit_window.text_part delete 1.0 end");
+      docommand("set COLORED_WORDS {}");
+      docommand("focus .main_window.display");
+      docommand("grab current .main_window.display");
+      global_page = active_page;
+      docommand("DISPLAY_INTERVALS .main_window.display.work_space $SCALE_FACTOR");
+      docommand("FIND_LINES");
+      docommand("grab release .main_window.display"); 
+      docommand("zone_message \"Active Zone at (%d,%d)\"", x, y);
+    }
+  else
+    {
+      docommand("zone_message \"No zone found here\"");
+    }
+  return TCL_OK;
+
+}
+
+
+static int
+vdocommand1(char* s)
+{
+/* final function called to do a tcl docommand */
+  int code;
+
+  code = Tcl_Eval(TCL_ip, s);      
+  if (code == TCL_ERROR)
+    error(TCL_ip->result);
+  return code;
+}
+
+void update()
+{
+  Tk_DoOneEvent(TK_ALL_EVENTS);   
+}
+
+static int
+vdocommand(int record, char* fmt, va_list args)
+{
+/* helper for docommand */
+  char buf[4097];
+  int code;
+
+  vsprintf(buf, fmt, args);
+  if (strchr(buf, '\?'))
+    error("Huh?");
+  code = vdocommand1(buf);
+  return code;
+}
+
+
+int
+docommand(char* fmt, ...)
+{
+/* do a tcl command, var number of args */
+  va_list args;
+
+  va_start(args, fmt);
+  vdocommand(0, fmt, args);
+  va_end(args);
+}
+
+static int
+vset_status1(char* s)
+{
+/* final function called to do a tcl docommand */
+  int code;
+
+	code = Tcl_Eval(TCL_ip, s);      
+	if (code == TCL_ERROR)
+	  error(TCL_ip->result);
+	return code;
+}
+
+static int
+vset_status(int record, char* fmt, va_list args)
+{
+/* helper for docommand */
+  char buf[4097];
+  char newbuf[4097];
+  int code;
+
+  vsprintf(buf, fmt, args);
+  sprintf(newbuf, ".main_window.button_bar.msg configure -text \"%s\"", buf); 
+  if (strchr(buf, '\?'))
+    error("Huh?");
+  code = vset_status1(newbuf);
+  return code;
+}
+
+int set_status(char* fmt, ...)
+{
+  va_list args;
+
+  va_start(args, fmt);
+  vset_status(0, fmt, args);
+  va_end(args);
+  docommand("update");
+}
+     
+int mispelled(char* word)
+{
+  int result = docommand("spellcheck %s", word);
+  /*  printf("call to spellcheck %s returned %s\n", word, TCL_ip->result); */
+  if(!(strcmp("MISPELLED", TCL_ip->result)))    
+    return 1;
+  else 
+    return 0;
+}
+
+
+
+int initialize_interpreter()
+{
+  TCL_ip = Tcl_CreateInterp();
+  Tcl_Init(TCL_ip);
+
+}
+
+
+int load_user_interface()
+{
+  main_window = Tk_CreateMainWindow(TCL_ip, NULL, "OCRchie", "OCRchie");
+  Tk_Init(TCL_ip);
+  Tk_MapWindow(main_window);  
+  docommand("source new_ui.tcl");
+}
+
+int initialize_command_procs()
+{
+  Tcl_CreateCommand(TCL_ip, "page_open", page_open_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "zoned_page_open", zoned_page_open_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+Tcl_CreateCommand(TCL_ip, "EXTRACT_COMP", extract_comp_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "get_page_height", get_page_height_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "get_page_width", get_page_width_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "LEARN", learn_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "LEARN_PAGE", learn_page_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "LEARN_DATA", learn_data_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "WRITE_WORD_POS", write_word_pos_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "WRITE_WORDBOX", write_wordbox_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "WRITE_EQUATIONS", write_equations_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+
+  Tcl_CreateCommand(TCL_ip, "WRITE_LEARNED_CHARS", write_learned_chars_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "FIND_LINES_AND_RECOGNIZE", find_lines_and_recognize_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "FIND_LINES", find_lines_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+Tcl_CreateCommand(TCL_ip, "RECOGNIZE", recognize_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+Tcl_CreateCommand(TCL_ip, "SELECT_COMP", select_comp_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+Tcl_CreateCommand(TCL_ip, "JOIN_COMP", join_comp_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+Tcl_CreateCommand(TCL_ip, "LEARN_COMP", learn_comp_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+
+Tcl_CreateCommand(TCL_ip, "SPLIT_COMP_HORIZ", split_comp_horiz_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "GET_SKEW", get_skew_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "DESKEW", deskew_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "DISPLAY_INTERVALS", display_intervals_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "QUIT", quit_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "ZOOM_IN", zoom_in_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "ZOOM_OUT", zoom_out_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "DEALLOCATE_PAGE", deallocate_page_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "GET_LINENUM",get_linenum_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "ADD_EQUATION",add_equation_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "DELETE_EQUATION",delete_equation_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "AUTO_ZONE",auto_zone_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "ADD_ZONE",add_zone_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+ Tcl_CreateCommand(TCL_ip, "REMOVE_ZONE",remove_zone_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+
+  Tcl_CreateCommand(TCL_ip, "SWITCH_TO_ACTIVE_PAGE",switch_to_active_page_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+  Tcl_CreateCommand(TCL_ip, "SWITCH_TO_ZONED_PAGE",switch_to_zoned_page_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+
+ Tcl_CreateCommand(TCL_ip, "SET_ACTIVE_PAGE",set_active_page_cmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
+ 
+
+  printf("Done initializing new tcl commands\n");
+}
+
+int initialize_link_vars()
+{
+  init_link_vars();  /* what a nice name */
+  docommand("source link_vars.tcl");
+  printf("Done initializing link variables\n");
+}
+
+
+
+
+
+
+
+
+
+
+
+