bool GeoMapEditor::addMouseObject( // пытаемся добавить новый объект вытянув или кликнув мышкой cv::Rect& rect, // note: in-out -- подкручиваем ректангл по законам первого рождения для данного объекта int flags ) { if (objType() == "AGM_Segm") { Point xyTL = rect.tl(); Point xyBR = rect.br(); GeoSheet& sh = gm.sheets[ cur_sheet ]; Point2d enTL = sh.xy2en( xyTL ); Point2d enBR = sh.xy2en( xyBR ); AGM_Segm* ps = new AGM_Segm(enTL, enBR); gm.objects.push_back(cv::Ptr<AGM_Segm>(ps)); } else { Point xy = center( rect ); GeoSheet& sh = gm.sheets[ cur_sheet ]; Point2d en = sh.xy2en( xy ); AGM_Point* pp = new AGM_Point( en ); gm.objects.push_back(cv::Ptr<AGM_Point>(pp)); } return true; };
void GeoMapEditor::update_title() { if (gm.sheets.size() > 0 && cur_sheet>=0) { string text = format("Map [%d(%s)/%d] type=%s location=Nord:%f East:%f", cur_sheet+1, gm.sheets[cur_sheet].sheet_name.c_str(), gm.sheets.size(), objType().c_str(), // type location.y, location.x // location ); //format("Map: %s [#%d of %d, %d msec]; type=%s objects on frame=%d sensitivity=%f tracking=%s", //video_file_name.c_str(), //iframe, frames, frame_time, objType().c_str(), numobj, frameProc.sensitivity, tracking_object? "ON" : "OFF" ); set_window_text( title.c_str(), text.c_str() ); } }
/* * objAt() returns the x,y position of the upper right hand corner of the * object. */ int objAt(void* obj, int* x, int* y) { *x = *y = 0; if (obj == 0) { errno = EINVAL; return -1; } if (objType(obj) != O_BUTTON) { *x = OBJ(obj)->x; *y = OBJ(obj)->y; } return 0; } /* objAt */
int FrInteger::compare(const FrObject *obj) const { if (!obj) return 1 ; // anything is greater than NIL / empty-list if (!obj->numberp()) return -1 ; // sort all non-numbers after numbers else if (objType() < obj->objType()) return -((FrNumber*)obj)->compare(this) ; else { long diff = intValue() - ((FrNumber*)obj)->intValue() ; if (diff < 0) return -1 ; else if (diff > 0) return +1 ; else return 0 ; } }
bool GeoMapEditor::addMouseObject( // пытаемся добавить новый объект вытянув или кликнув мышкой std::vector< cv::Point >& pts, // note: in-out -- подкручиваем точки по законам первого рождения для данного объекта int flags ) { if (objType() == "AGM_Segm" && pts.size() > 1) { Point xyStart = pts[0]; Point xyEnd = pts[1]; GeoSheet& sh = gm.sheets[ cur_sheet ]; Point2d enStart = sh.xy2en( xyStart ); Point2d enEnd = sh.xy2en( xyEnd ); AGM_Segm* ps = new AGM_Segm(enStart, enEnd); gm.objects.push_back(cv::Ptr<AGM_Segm>(ps)); return true; } return __false("GeoMapEditor::addMouseObject(std::vector< cv::Point >& pts) not implemented"); };
/* * drawList() draws a listbox */ void drawList(void *o, void* w) { Obj *obj = OBJ(o); int start, rc, idx; WINDOW *win = Window(w); int x = WX(w), y = WY(w); int currentitem = -1; if (obj == 0 || objType(obj) != O_LIST) return; rc = _nd_drawObjCommon(obj, w); _nd_adjustXY(rc, obj, &x, &y); start = obj->item.list.topy; if ((rc & DREW_A_BOX) && obj->width > 3) { if (start > 0) { setcolor(win, WIDGET_COLOR); mvwaddstr(win, y-1, x+obj->width-3, "(-)"); } if (start+obj->depth < obj->item.list.nritems) { setcolor(win, WIDGET_COLOR); mvwaddstr(win, y+obj->depth, x+obj->width-3, "(+)"); } } setcolor(win, WINDOW_COLOR); for (idx = start; idx-start < obj->depth; idx++) { if ((obj->item.list.cury == idx) && (IS_CURRENT(obj) || (obj->flags & ALWAYS_HIGHLIT))) currentitem = idx; else drawListElement(obj,win,idx,y,x,start); } if (currentitem >= 0) drawListElement(obj,win,currentitem,y,x,start); } /* drawList */
/* * drawButton() draws a button. */ void drawButton(void *obj, void *w) { int highlight = 0; int boxcolor; int objcolor; WINDOW* win = Window(w); int x = WX(w), y = WY(w); if (obj == 0 || objType(obj) != O_BUTTON) return; x += OBJ(obj)->dtx; y += OBJ(obj)->dty; boxcolor = IS_CURRENT(obj) ? ACTIVE_COLOR : WINDOW_COLOR; objcolor = BUTTON_COLOR | (OBJ_READONLY(obj) ? READONLY_COLOR : 0); wmove(win, y, x-1); setcolor(win, boxcolor); waddch(win, '['); highlight = (OBJ(obj)->content && *((int*)(OBJ(obj)->content)) != 0); getyx(win,y,x); if (OBJ(obj)->flags & OBJ_CLICKED) { setcolor(win, PRESSED_COLOR); waddstr(win, OBJ(obj)->title); } else { setcolor(win, IS_CURRENT(obj) ? (objcolor|CURRENT_COLOR) : objcolor); waddstr(win,OBJ(obj)->title); } setcolor(win, boxcolor); waddch(win, ']'); wmove(win,y,x); } /* drawButton */
//----------------------------------------------------------------------------- StatusCode RootHistCnv::RConverter::createAddress(DataObject* pObj, TDirectory* pDir, TObject* pTObj, IOpaqueAddress*& refpAddr) //----------------------------------------------------------------------------- { // Get address again....it does not change IRegistry* pReg = pObj->registry(); if ( 0 != pReg ) { refpAddr = pReg->address(); if ( 0 == refpAddr ) { refpAddr = new RootObjAddress(repSvcType(), objType(), pReg->name(), "", (unsigned long)(pDir), (unsigned long)(pTObj), pTObj); return StatusCode::SUCCESS; } } return StatusCode::FAILURE; }
// this implementation will be re-coded. void CircuitDomDocumentExporter::exportCircuitTo(Circuit * _circuit, QIODevice * _device) { if (_circuit && _device){ QDomDocument doc; QDomElement rootElement = doc.createElement("xml"); QDomElement circuitElement = doc.createElement("circuit"); QDomElement circuitUUIDElement = doc.createElement("uuid"); circuitUUIDElement.appendChild(doc.createCDATASection(_circuit->getUUID())); circuitElement.appendChild(circuitUUIDElement); for (QMap<QString, Circuit::Object*>::const_iterator iter = _circuit->getObjectMap().begin(); iter != _circuit->getObjectMap().end(); ++iter) { Circuit::Object* obj = *iter; QDomElement circuitObjectElement = doc.createElement("object"); QDomElement circuitObjectUUIDElement = doc.createElement("uuid"); QDomElement circuitObjectTypeElement = doc.createElement("type"); circuitObjectUUIDElement.appendChild(doc.createCDATASection(obj->getUUID())); circuitObjectElement.appendChild(circuitObjectUUIDElement); circuitObjectElement.appendChild(circuitObjectTypeElement); QString objType("OBJECT"); if (obj->getType() == Circuit::Object::NODE) { objType = "NODE"; Circuit::Node* node = static_cast<Circuit::Node*>(obj); //coordinate QDomElement circuitNodeXElement = doc.createElement("x"); QDomElement circuitNodeYElement = doc.createElement("y"); QDomElement circuitNodeZElement = doc.createElement("z"); circuitNodeXElement.appendChild(doc.createCDATASection(QString("%1").arg(node->getX()))); circuitNodeYElement.appendChild(doc.createCDATASection(QString("%1").arg(node->getY()))); circuitNodeZElement.appendChild(doc.createCDATASection(QString("%1").arg(node->getZ()))); circuitObjectElement.appendChild(circuitNodeXElement); circuitObjectElement.appendChild(circuitNodeYElement); circuitObjectElement.appendChild(circuitNodeZElement); //connections QDomElement circuitNodeConnectionsElement = doc.createElement("connections"); for(QList<QString>::const_iterator iter = node->connectionList().begin();iter != node->connectionList().end();++iter) { QDomElement circuitNodeConnectionsUUIDElement = doc.createElement("uuid"); circuitNodeConnectionsUUIDElement.appendChild(doc.createCDATASection(*iter)); circuitNodeConnectionsElement.appendChild(circuitNodeConnectionsUUIDElement); } circuitObjectElement.appendChild(circuitNodeConnectionsElement); } if (obj->getType() == Circuit::Object::ELEMENT) { objType = "ELEMENT"; Circuit::Element* element = static_cast<Circuit::Element*>(obj); //coordinate QDomElement circuitElementXElement = doc.createElement("x"); QDomElement circuitElementYElement = doc.createElement("y"); QDomElement circuitElementZElement = doc.createElement("z"); circuitElementXElement.appendChild(doc.createCDATASection(QString("%1").arg(element->getX()))); circuitElementYElement.appendChild(doc.createCDATASection(QString("%1").arg(element->getY()))); circuitElementZElement.appendChild(doc.createCDATASection(QString("%1").arg(element->getZ()))); circuitObjectElement.appendChild(circuitElementXElement); circuitObjectElement.appendChild(circuitElementYElement); circuitObjectElement.appendChild(circuitElementZElement); //connections QDomElement circuitElementConnectionsElement = doc.createElement("connections"); for(QList<QString>::const_iterator iter = element->connectionList().begin();iter != element->connectionList().end();++iter) { QDomElement circuitElementConnectionsUUIDElement = doc.createElement("uuid"); circuitElementConnectionsUUIDElement.appendChild(doc.createCDATASection(*iter)); circuitElementConnectionsElement.appendChild(circuitElementConnectionsUUIDElement); } circuitObjectElement.appendChild(circuitElementConnectionsElement); } if (obj->getType() == Circuit::Object::CONNECTION) { objType = "CONNECTION"; Circuit::Connection* connection = static_cast<Circuit::Connection*>(obj); //objects QDomElement circuitConnectionObjectsElement = doc.createElement("objects"); for(QList<QString>::const_iterator iter = connection->objectList().begin();iter != connection->objectList().end();++iter) { QDomElement circuitConnectionObjectsUUIDElement = doc.createElement("uuid"); circuitConnectionObjectsUUIDElement.appendChild(doc.createCDATASection(*iter)); circuitConnectionObjectsElement.appendChild(circuitConnectionObjectsUUIDElement); } circuitObjectElement.appendChild(circuitConnectionObjectsElement); } circuitObjectTypeElement.appendChild(doc.createCDATASection(objType)); circuitElement.appendChild(circuitObjectElement); } rootElement.appendChild(circuitElement); doc.appendChild(rootElement); QTextStream out(_device); out << doc; } }
/* * _nd_drawObjCommon() draws the common parts of string, menu, list, and text * objects. It returns a bitmap of what it drew: * * rc & DREW_TITLE -- drew a title * rc & DREW_PREFIX -- drew a prefix * rc & DREW_SUFFIX -- drew a suffix * rc & DREW_A_BOX -- drew a little box around where the data * is supposed to go. * */ int _nd_drawObjCommon(void *o, void* w) { Obj *obj = OBJ(o); int preflen; /* length of any prefix */ int sufflen; /* length of any suffix */ int status = 0; int boxcolor, objcolor; WINDOW *win = Window(w); int x = WX(w), y = WY(w); if (obj == 0) return 0; ADJUSTXY(obj, x, y); /* If we're part of a widget, we either return DREW_A_BOX if we've * got an (ignored) prefix or suffix or 0. */ if (obj->parent != 0 && (obj->flags & OBJ_DRAW) == 0) return (obj->prefix || obj->suffix) ? DREW_A_BOX : 0; /* otherwise we draw like mad */ boxcolor = IS_CURRENT(o) ? ACTIVE_COLOR : WINDOW_COLOR; objcolor = WINDOW_COLOR | (OBJ_READONLY(o) ? READONLY_COLOR : 0); preflen = obj->prefix ? strlen(obj->prefix) : 0; sufflen = obj->suffix ? strlen(obj->suffix) : 0; setcolor(win, objcolor); /* print any title */ if (obj->title) { /* If we have a prefix or suffix, the data will be boxed, so * don't forget to adjust the title position to account for * the box frame. */ if (obj->prefix || obj->suffix) wmove(win, y, x+preflen+1); else wmove(win, y, x); waddstr(win, obj->title); status |= DREW_TITLE; y++; } /* print a box around the data field, if needed */ if (obj->prefix || obj->suffix || objType(obj) == O_TEXT) { drawbox(win, y, x+preflen, obj->depth+2, obj->width+2, 0, boxcolor, boxcolor); status |= DREW_A_BOX; y++; } setcolor(win, objcolor); /* print any prefix */ if (obj->prefix) { wmove(win, y, x); status |= DREW_PREFIX; waddstr(win, obj->prefix); } /* print any suffix */ if (obj->suffix) { wmove(win, y, x+preflen+2+obj->width); waddstr(win, obj->suffix); status |= DREW_SUFFIX; } return status; } /* _nd_drawObjCommon */
int GeoMapEditor::processMouseEvent(int event, int x, int y, int flags) { //switch (mouseScenario) //{ //} //cout << "event=" << event << " coords=" << x << " " << y << " flags=" << flags << endl; string objtype = objType(); // тип объекта, с которым работаем bool object_poligonal = (objtype == "AGM_Segm" ); ///bool object_segment_based = (objtype == "AFO_Segm"); // либо производные двух точечные отрезкообразные cv::Point curPoint(x,y); int max_poly_points=1000; if (objtype == "AGM_Segm") max_poly_points=2; //cout << "GeoMap:objtype" << objtype << endl; switch (event) { case CV_EVENT_LBUTTONDOWN : // =1,0, case CV_EVENT_RBUTTONDOWN : // =1,0, if (object_poligonal) { if ( rubbering_pts.size() == 0 ) // первая точка { rubbering_pts.push_back(curPoint); rubbering_pts.push_back(curPoint); // создали вырожденный первый сегмент, вторую точку будем корректировать на mousemove rubbering_mode = RUBBERING_SEGMENT; } else // if (rubbering_pts.size()>=2 && // если последний сегмент не вырожденный -- начнем новый // l2norm( rubbering_pts[rubbering_pts.size()-2], rubbering_pts[rubbering_pts.size()-1] ) >= 25 ) { rubbering_pts.push_back(curPoint); rubbering_mode = RUBBERING_SEGMENT; } } else { rubbering_pts.clear(); rubbering_pts.push_back(curPoint); rubbering_pts.push_back(curPoint); // создали вырожденный ректангл rubbering_mode = RUBBERING_RECTANGLE; // пока так, грубо. } rubber_by_left_button = (event == CV_EVENT_LBUTTONDOWN); return finishMouseEvent(); case CV_EVENT_MOUSEMOVE : // =0, if (rubbering_mode == RUBBERING_NOTHING) break; if (rubbering_mode == RUBBERING_RECTANGLE) { assert(rubbering_pts.size() == 2); rubbering_pts[1] = curPoint; // обновили точку return finishMouseEvent(); } if (rubbering_mode == RUBBERING_SEGMENT) { assert(rubbering_pts.size() >=2); ////if (rubbering_pts.size() == 2) rubbering_pts.back() = curPoint; // обновили точку return finishMouseEvent(); } // if (rubbering_mode == RUBBERING_POLYGON) // уже вытянута часть многоугольника, и мы свободно водим мышкой планируя начать вытягивать следующее ребро многоугольника // { // assert(rubbering_pts.size() >=2); // // ничего не делаем, пока выбор пользователя не понятен и отрисовка не меняется // //return 0; // rubbering_pts.back() = curPoint; // return finishMouseEvent(); // } //case CV_EVENT_RBUTTONDOWN : // =2, //case CV_EVENT_MBUTTONDOWN : // =3, case CV_EVENT_LBUTTONUP : // =4, case CV_EVENT_RBUTTONUP : // =4, if (rubbering_mode == RUBBERING_NOTHING) break; if (rubbering_mode == RUBBERING_RECTANGLE) { assert(rubbering_pts.size() == 2); rubbering_pts[1] = curPoint; // скорректировали cv::Rect rect(rubbering_pts[0], rubbering_pts[1]); //cout << "rect.x =" << rect.x << " rect.y =" << rect.y; //cout << "rect.width =" << rect.width << " rect.height =" << rect.height << endl; int flags = ADD_OBJECT_RECT | (rubber_by_left_button ? ADD_OBJECT_MOUSE_LEFT : ADD_OBJECT_MOUSE_RIGHT); rubbering_mode = RUBBERING_NOTHING; rubbering_pts.clear(); return addMouseObject(rect, flags); } if (rubbering_mode == RUBBERING_SEGMENT) { assert(rubbering_pts.size() >= 2); rubbering_pts.back() = curPoint; // if ( l2norm( rubbering_pts[0], curPoint) < 100 // замкнули или просто клик был. конец банкета // //////|| // ////// (object_segment_based && rubbering_pts.size() == 2 ) // || rubbering_pts.size() == max_poly_points+1 // ) // { // if (rubbering_pts.size() > 2) // rubbering_pts.back() = rubbering_pts[0]; // скорректировали последнюю точку прилепив к начальной // int flags = ADD_OBJECT_RECT | (rubber_by_left_button ? ADD_OBJECT_MOUSE_LEFT : ADD_OBJECT_MOUSE_RIGHT); // if (l2norm( rubbering_pts[rubbering_pts.size()-2], rubbering_pts[rubbering_pts.size()-1] ) < 25) // { // удаляем последнее ребро если оно вырожденное // rubbering_pts[rubbering_pts.size()-2] = rubbering_pts[0]; // rubbering_pts.pop_back(); // } // rubbering_mode = RUBBERING_NOTHING; // int res = addMouseObject(rubbering_pts, flags); // rubbering_pts.clear(); // return res; // } rubbering_mode = RUBBERING_NOTHING; int res = addMouseObject(rubbering_pts, flags); rubbering_pts.clear(); return res; // } // не замкнулись, продолжаем, надо перерисовать // rubbering_pts.back() = curPoint; // rubbering_mode = RUBBERING_POLYGON; // return finishMouseEvent(); } break; //case CV_EVENT_RBUTTONUP : // =5, //case CV_EVENT_MBUTTONUP : // =6, //case CV_EVENT_LBUTTONDBLCLK : // =7, //case CV_EVENT_RBUTTONDBLCLK : // =8, //case CV_EVENT_MBUTTONDBLCLK : // =9 } return finishMouseEvent(); }