diff --git a/forms/mainwindow.ui b/forms/mainwindow.ui index f439fd44327c4c357cc97e2357ffd88b65c83828..9fbee040e233a1dc71980b849550367b3dc7ed30 100644 --- a/forms/mainwindow.ui +++ b/forms/mainwindow.ui @@ -631,7 +631,7 @@ <string>Gather Room Type Data</string> </property> <property name="visible"> - <bool>false</bool> + <bool>true</bool> </property> </action> </widget> diff --git a/jpseditor.pro.user b/jpseditor.pro.user index 66275b866855237ee285ed95a07f457806444f29..85856d4318764085478a1ae0eef4e9988d95d7ae 100644 --- a/jpseditor.pro.user +++ b/jpseditor.pro.user @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE QtCreatorProject> -<!-- Written by QtCreator 3.6.1, 2017-08-22T14:49:38. --> +<!-- Written by QtCreator 3.6.1, 2017-09-05T11:35:16. --> <qtcreator> <data> <variable>EnvironmentId</variable> diff --git a/src/AutomaticRoomIdentification/roomdefinition.cpp b/src/AutomaticRoomIdentification/roomdefinition.cpp index e20bc0706cfa11bb4805ddebd47388b8f4485fe6..efeebace1d9bbc38d06ebbb75eac80b656dc72a6 100644 --- a/src/AutomaticRoomIdentification/roomdefinition.cpp +++ b/src/AutomaticRoomIdentification/roomdefinition.cpp @@ -40,6 +40,8 @@ void RoomDefinition::SetUpRoomsAndDoors() line.p2().y()}; floorPlan.push_back(lineasVector2); } + if (floorPlan.empty()) + return; //std::cout << "Starting" << std::endl; std::vector<std::list<double>> roomList = getRooms(floorPlan); @@ -85,7 +87,7 @@ void RoomDefinition::SetUpRoomsAndDoors() RemoveRoomsWithoutDoors(); // set contigous ids after removing outside - int idCounter=0; + int idCounter=1; for (jpsRoom* room:_dManager->get_roomlist()) { room->set_id(idCounter); @@ -104,8 +106,6 @@ void RoomDefinition::SetUpRoomsAndDoors() } } - - } void RoomDefinition::RemoveOutside() diff --git a/src/AutomaticRoomIdentification/roomidentification.cpp b/src/AutomaticRoomIdentification/roomidentification.cpp index 0302d18f1b44d85d1c9d425b6821170937c9befa..06995d78ef699bebd325dd68ab81585e710d0974 100644 --- a/src/AutomaticRoomIdentification/roomidentification.cpp +++ b/src/AutomaticRoomIdentification/roomidentification.cpp @@ -5,8 +5,10 @@ #include <QFileDialog> #include <QTextStream> #include <numeric> +#include <iostream> #include <cmath> + RoomIdentification::RoomIdentification() { @@ -19,13 +21,14 @@ RoomIdentification::RoomIdentification(const QList<jpsRoom *> &rooms):_rooms(roo void RoomIdentification::IdentifyRooms() { + for (jpsRoom * room:_rooms) { if (room->GetArea()==0.0) room->IdentifyInnerOuter(); - double area= room->GetArea(); - QRectF bBox = room->CalculateBoundingBox(); - double ratioBBoxArea=(bBox.width()*bBox.height())/area; + double area = room->GetArea(); + QRectF bBox = room->CalculateBoundingBox(); + double ratioBBoxArea= (bBox.width()*bBox.height())/area; double ratioBBox=0.0; if (bBox.width()<bBox.height()) ratioBBox=bBox.width()/bBox.height(); @@ -57,12 +60,21 @@ void RoomIdentification::IdentifyRooms() diffNumDoors=std::fabs(numberDoors-_circRoom._meanNumDoors); penalty_circ+=diffNumDoors/_circRoom._stdNumDoors; - - if (penalty_circ>penalty_common) + // add 2.3 to penalty_circ to increase accuracy of correct declaration. The value has been found by trial + if (2.3+penalty_circ>penalty_common) + { room->set_type("Office"); + //std::cout << "Office" << std::endl; + //std::cout << "Circ " << penalty_circ << std::endl; + //std::cout << "Common " << penalty_common << std::endl; + } else + { + //std::cout << "Corridor" << std::endl; room->set_type("Corridor"); + } + } } @@ -93,8 +105,9 @@ void RoomIdentification::GatherData() QString type = room->get_type(); + std::ofstream data; - std::string filename = "./Roomtypedata/roomtypedata.txt"; + std::string filename = "roomtypedata.txt"; data.open(filename , std::ofstream::out | std::ofstream::app); data << type.toStdString() << ";" << std::to_string(area) << ";" << std::to_string((bBox.width()*bBox.height())/area) << ";" << std::to_string(ratioBBox) << ";" @@ -108,7 +121,7 @@ void RoomIdentification::GatherData() void RoomIdentification::LoadDataFile() { - QString fileName="./Roomtypedata/roomtypedata.txt"; + QString fileName="roomtypedata.txt"; QFile file(fileName); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) diff --git a/src/datamanager.cpp b/src/datamanager.cpp index 8b6a32e88c64a46e37bf85c6ad478039afcba25b..cd61947eb57fddd92b3b4bb89a4d74ee6e3eeb51 100644 --- a/src/datamanager.cpp +++ b/src/datamanager.cpp @@ -40,7 +40,7 @@ jpsDatamanager::jpsDatamanager(QWidget *parent, jpsGraphicsView *view) { parent_widget=parent; _mView=view; - room_id_counter=0; + room_id_counter=1; obs_id_counter=0; //_frameRate=0; _landmarkCounter=0; @@ -720,76 +720,34 @@ QString jpsDatamanager::RoomIDHLine(jpsLineItem *lineItem) void jpsDatamanager::writeRooms(QXmlStreamWriter *stream, QList<jpsLineItem *> &lines) { - dtrace(" Enter jpsDatamanager::writeRooms"); - ///rooms - stream->writeStartElement("room"); - stream->writeAttribute("id","0"); - stream->writeAttribute("caption","hall"); - for (int i=0; i<roomlist.size(); i++) + dtrace(" Enter jpsDatamanager::writeRooms"); + // stairs + for (jpsRoom* room:roomlist) { - stream->writeStartElement("subroom"); - stream->writeAttribute("id",QString::number(roomlist[i]->get_id())); // @todo: - // does - // not - // work - // with - // files - // having - // more - // than - // two rooms - stream->writeAttribute("caption",roomlist[i]->get_name()); - stream->writeAttribute("class",roomlist[i]->get_type()); - roomlist[i]->correctPlaneCoefficients(); - stream->writeAttribute("A_x",QString::number(roomlist[i]->get_ax())); - stream->writeAttribute("B_y",QString::number(roomlist[i]->get_by())); - stream->writeAttribute("C_z",QString::number(roomlist[i]->get_cz())); - //walls - QList<jpsLineItem* > wallList=roomlist[i]->get_listWalls(); - for (int j=0; j<wallList.size(); j++) + if (room->get_type()=="Stair") { - stream->writeStartElement("polygon"); - stream->writeAttribute("caption","wall"); - - stream->writeStartElement("vertex"); - stream->writeAttribute("px",QString::number(wallList[j]->get_line()->line().x1())); - stream->writeAttribute("py",QString::number(wallList[j]->get_line()->line().y1())); - stream->writeEndElement(); //vertex - - stream->writeStartElement("vertex"); - stream->writeAttribute("px",QString::number(wallList[j]->get_line()->line().x2())); - stream->writeAttribute("py",QString::number(wallList[j]->get_line()->line().y2())); - stream->writeEndElement(); //vertex - - stream->writeEndElement(); //polygon - + stream->writeStartElement("room"); + stream->writeAttribute("id",QString::number(room->get_id())); + stream->writeAttribute("caption","stair"); + writeSubRoom(stream,room,lines); + stream->writeStartElement("crossings"); + stream->writeEndElement();//crossings + stream->writeEndElement();//room } + } + //rooms + stream->writeStartElement("room"); + stream->writeAttribute("id","0"); + stream->writeAttribute("caption","floor"); - for (int k=0; k<obstaclelist.size(); k++) + for (int i=0; i<roomlist.size(); i++) + { + if (roomlist[i]->get_type()!="Stair") { - if (roomlist[i]==obstaclelist[k]->get_room()) - { - writeObstacles(stream ,obstaclelist[k],lines); - } + writeSubRoom(stream,roomlist[i],lines); } - // if stair write up and down - if (roomlist[i]->get_type() == "stair"){ - // <up> - stream->writeStartElement("up"); - stream->writeAttribute("px",QString::number( roomlist[i]->get_up().x() )); - stream->writeAttribute("py",QString::number( roomlist[i]->get_up().y() )); - stream->writeEndElement(); - // </up> - // <down> - stream->writeStartElement("down"); - stream->writeAttribute("px",QString::number( roomlist[i]->get_down().x() )); - stream->writeAttribute("py",QString::number( roomlist[i]->get_down().y() )); - stream->writeEndElement(); - // </down> - } - stream->writeEndElement();//subroom }// for i @@ -802,6 +760,66 @@ void jpsDatamanager::writeRooms(QXmlStreamWriter *stream, QList<jpsLineItem *> & dtrace(" Leave jpsDatamanager::writeRooms"); } +void jpsDatamanager::writeSubRoom(QXmlStreamWriter *stream, jpsRoom *room, QList<jpsLineItem *> &lines) +{ + stream->writeStartElement("subroom"); + stream->writeAttribute("id",QString::number(room->get_id())); + stream->writeAttribute("caption",room->get_name()); + stream->writeAttribute("class",room->get_type()); + room->correctPlaneCoefficients(); + stream->writeAttribute("A_x",QString::number(room->get_ax())); + stream->writeAttribute("B_y",QString::number(room->get_by())); + stream->writeAttribute("C_z",QString::number(room->get_cz())); + //walls + QList<jpsLineItem* > wallList=room->get_listWalls(); + for (int j=0; j<wallList.size(); ++j) + { + stream->writeStartElement("polygon"); + stream->writeAttribute("caption","wall"); + + stream->writeStartElement("vertex"); + stream->writeAttribute("px",QString::number(wallList[j]->get_line()->line().x1())); + stream->writeAttribute("py",QString::number(wallList[j]->get_line()->line().y1())); + stream->writeEndElement(); //vertex + + stream->writeStartElement("vertex"); + stream->writeAttribute("px",QString::number(wallList[j]->get_line()->line().x2())); + stream->writeAttribute("py",QString::number(wallList[j]->get_line()->line().y2())); + stream->writeEndElement(); //vertex + + stream->writeEndElement(); //polygon + + //remove wall from lines + lines.removeOne(wallList[j]); + + } + + + for (int k=0; k<obstaclelist.size(); k++) + { + if (room==obstaclelist[k]->get_room()) + { + writeObstacles(stream ,obstaclelist[k],lines); + } + } + // if stair write up and down + if (room->get_type() == "Stair"){ + // <up> + stream->writeStartElement("up"); + stream->writeAttribute("px",QString::number( room->get_up().x() )); + stream->writeAttribute("py",QString::number( room->get_up().y() )); + stream->writeEndElement(); + // </up> + // <down> + stream->writeStartElement("down"); + stream->writeAttribute("px",QString::number( room->get_down().x() )); + stream->writeAttribute("py",QString::number( room->get_down().y() )); + stream->writeEndElement(); + // </down> + } + stream->writeEndElement();//subroom +} + void jpsDatamanager::AutoSaveRooms(QXmlStreamWriter *stream, QList<jpsLineItem *> &lines) { dtrace("Enter jpsDatamanager::AutoSaveRooms"); @@ -863,10 +881,10 @@ void jpsDatamanager::AutoSaveRooms(QXmlStreamWriter *stream, QList<jpsLineItem * stream->writeEndElement();//subroom } - /// Not assigned lines + // Not assigned lines writeNotAssignedWalls(stream,lines); - ///Crossings + //Crossings writeCrossings(stream,lines); writeNotAssignedDoors(stream,lines); stream->writeEndElement();//crossings @@ -881,7 +899,7 @@ void jpsDatamanager::writeCrossings(QXmlStreamWriter *stream, QList<jpsLineItem stream->writeStartElement("crossings"); for (int i=0; i<crossingList.size(); i++) { - if (crossingList[i]->IsExit()==false) + if (crossingList[i]->IsExit()==false && crossingList[i]->get_roomList()[0]->get_type()!="Stair" && crossingList[i]->get_roomList()[1]->get_type()!="Stair") { stream->writeStartElement("crossing"); stream->writeAttribute("id",QString::number(i)); @@ -907,7 +925,16 @@ void jpsDatamanager::writeCrossings(QXmlStreamWriter *stream, QList<jpsLineItem else { this->new_exit(crossingList[i]->get_cLine()); - exitList.back()->add_rooms(crossingList[i]->get_roomList()[0]); + if (crossingList[i]->get_roomList().size()>1) + { + // mention stair id first + if (crossingList[i]->get_roomList()[0]->get_type()=="Stair") + exitList.back()->set_rooms(crossingList[i]->get_roomList()[0], crossingList[i]->get_roomList()[1]); + else + exitList.back()->set_rooms(crossingList[i]->get_roomList()[1], crossingList[i]->get_roomList()[0]); + } + else + exitList.back()->set_rooms(crossingList[i]->get_roomList()[0]); } lines.removeOne(crossingList[i]->get_cLine()); } @@ -917,17 +944,41 @@ void jpsDatamanager::writeCrossings(QXmlStreamWriter *stream, QList<jpsLineItem void jpsDatamanager::writeTransitions(QXmlStreamWriter *stream, QList<jpsLineItem *> &lines) { dtrace("Enter jpsDatamanager::writeTransitions"); - for (int i=0; i<exitList.size(); i++) + for (int i=0; i<exitList.size(); ++i) { stream->writeStartElement("transition"); stream->writeAttribute("id",QString::number(i)); stream->writeAttribute("caption","NaN"); stream->writeAttribute("type","NaN"); - stream->writeAttribute("room1_id","0"); - stream->writeAttribute("subroom1_id",QString::number(exitList[i]->get_roomList()[0]->get_id())); - stream->writeAttribute("room2_id","-1"); - stream->writeAttribute("subroom2_id","-1"); + // transition to stair + if (exitList[i]->get_roomList().size()==1 && exitList[i]->get_roomList()[0]->get_type()=="Stair") + { + //stair id + stream->writeAttribute("room1_id",QString::number(exitList[i]->get_roomList()[0]->get_id())); + stream->writeAttribute("subroom1_id",QString::number(exitList[i]->get_roomList()[0]->get_id())); + //floor id + stream->writeAttribute("room2_id","-1"); + stream->writeAttribute("subroom2_id","-1"); + } + else if (exitList[i]->get_roomList().size()==2) + { + //stair id + stream->writeAttribute("room1_id",QString::number(exitList[i]->get_roomList()[0]->get_id())); + stream->writeAttribute("subroom1_id",QString::number(exitList[i]->get_roomList()[0]->get_id())); + //floor id + stream->writeAttribute("room2_id","0"); + stream->writeAttribute("subroom2_id",QString::number(exitList[i]->get_roomList()[1]->get_id())); + } + else + { + //floor id + stream->writeAttribute("room1_id","0"); + stream->writeAttribute("subroom1_id",QString::number(exitList[i]->get_roomList()[0]->get_id())); + //outside + stream->writeAttribute("room2_id","-1"); + stream->writeAttribute("subroom2_id","-1"); + } stream->writeStartElement("vertex"); stream->writeAttribute("px",QString::number(exitList[i]->get_cLine()->get_line()->line().x1())); stream->writeAttribute("py",QString::number(exitList[i]->get_cLine()->get_line()->line().y1())); diff --git a/src/datamanager.h b/src/datamanager.h index dbde33ac5e94acebb1548e33a00dd89201c71567..f8209fa66fa47646b835e0c8085896b3380e3590 100644 --- a/src/datamanager.h +++ b/src/datamanager.h @@ -136,6 +136,7 @@ public: void writeHLines(QXmlStreamWriter *stream, QList<jpsLineItem* >& hLines); QString RoomIDHLine(jpsLineItem* lineItem); void writeRooms(QXmlStreamWriter *stream, QList<jpsLineItem* >& lines); + void writeSubRoom(QXmlStreamWriter *stream, jpsRoom* room, QList<jpsLineItem* >& lines); void AutoSaveRooms(QXmlStreamWriter *stream, QList<jpsLineItem* >& lines); void writeCrossings(QXmlStreamWriter *stream, QList<jpsLineItem* >& lines); void writeTransitions(QXmlStreamWriter *stream, QList<jpsLineItem* >& lines); diff --git a/src/jpsexit.cpp b/src/jpsexit.cpp index 7e60f21d0a9d812dde7adab74aa88f34575e4c0e..d87a71baf4941ad48c7f168dda1cab7947701e0a 100644 --- a/src/jpsexit.cpp +++ b/src/jpsexit.cpp @@ -76,7 +76,7 @@ void jpsExit::set_type(QString type) _type=type; } -void jpsExit::add_rooms(jpsRoom *room1, jpsRoom *room2) +void jpsExit::set_rooms(jpsRoom *room1, jpsRoom *room2) { roomList.clear(); roomList.push_back(room1); diff --git a/src/jpsexit.h b/src/jpsexit.h index f8ab0f33d485675b96a09a6a324677e4e04c0146..2945066c6a7bb0e19d926e2000c47b0de5b0aea9 100644 --- a/src/jpsexit.h +++ b/src/jpsexit.h @@ -44,7 +44,7 @@ public: int get_id(); void set_id(int id); void set_type(QString type); - void add_rooms(jpsRoom* room1, jpsRoom* room2=0L); + void set_rooms(jpsRoom* room1, jpsRoom* room2=nullptr); private: QList<jpsRoom *> roomList; diff --git a/src/mainWindow.cpp b/src/mainWindow.cpp index 57a2cd1c7ea5bbfc8527b57d6ba84184129c10b4..0190065e2a66e82293e003bcb8a036a2c07febcd 100644 --- a/src/mainWindow.cpp +++ b/src/mainWindow.cpp @@ -403,11 +403,11 @@ void MWindow::saveFile(){ if (fileName.isEmpty()) return; QFile file(fileName); - QString fileNameLines=fileName.split(".").first()+"_lines.xml"; + //QString fileNameLines=fileName.split(".").first()+"_lines.xml"; - QFile LinesFile(fileNameLines); - if (LinesFile.open(QIODevice::WriteOnly|QIODevice::Text)) - dmanager->writeLineItems(LinesFile); + //QFile LinesFile(fileNameLines); + //if (LinesFile.open(QIODevice::WriteOnly|QIODevice::Text)) + // dmanager->writeLineItems(LinesFile); if(file.open(QIODevice::WriteOnly|QIODevice::Text)) { diff --git a/src/roomwidget.cpp b/src/roomwidget.cpp index a8fc05f069376c6cdf9bad93e39aa070c3bef2c4..222bdea2fb205f2c545cd33c599133ef9a9b80c0 100644 --- a/src/roomwidget.cpp +++ b/src/roomwidget.cpp @@ -1019,14 +1019,6 @@ void roomWidget::ChangeRoomType() void roomWidget::StartAutoDef() { - //for (jpsRoom* room:datamanager->get_roomlist()) - //{ - // room->IdentifyInnerOuter(); - // room->CalculateBoundingBox(); - // room->GatherData(); -// - //} - _roomDef = new RoomDefinition(graphview->get_line_vector(),datamanager); _roomDef->SetUpRoomsAndDoors(); @@ -1034,10 +1026,10 @@ void roomWidget::StartAutoDef() _roomDef=nullptr; - //RoomIdentification roomIdent(datamanager->get_roomlist()); - //roomIdent.LoadDataFile(); - //roomIdent.CalcMeansAndStds(); - //roomIdent.IdentifyRooms(); + RoomIdentification roomIdent(datamanager->get_roomlist()); + roomIdent.LoadDataFile(); + roomIdent.CalcMeansAndStds(); + roomIdent.IdentifyRooms();