setids.cpp 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. #include "setids.h"
  2. #include "ui_setids.h"
  3. #include "object.h"
  4. #include <QMouseEvent>
  5. #include <QPainter>
  6. #include <QInputDialog>
  7. SetIds::SetIds(Sequenz *s, QWidget *parent) :
  8. QDialog(parent),
  9. ui(new Ui::SetIds)
  10. {
  11. ui->setupUi(this);
  12. this->s = s;
  13. m = new SetIdsModel();
  14. m->id = -1;
  15. SetIdsView *v1 = new SetIdsView( s, m, 0, ui->v1 );
  16. SetIdsView *v2 = new SetIdsView( s, m, 1, ui->v2 );
  17. SetIdsView *v3 = new SetIdsView( s, m, 2, ui->v3 );
  18. SetIdsView *v4 = new SetIdsView( s, m, 3, ui->v4 );
  19. SetIdsView *v5 = new SetIdsView( s, m, 4, ui->v5 );
  20. SetIdsView *v6 = new SetIdsView( s, m, 5, ui->v6 );
  21. SetIdsView *v7 = new SetIdsView( s, m, 6, ui->v7 );
  22. SetIdsView *v8 = new SetIdsView( s, m, 7, ui->v8 );
  23. SetIdsView *v9 = new SetIdsView( s, m, 8, ui->v9 );
  24. views.append( v1 );
  25. views.append( v2 );
  26. views.append( v3 );
  27. views.append( v4 );
  28. views.append( v5 );
  29. views.append( v6 );
  30. views.append( v7 );
  31. views.append( v8 );
  32. views.append( v9 );
  33. m->addView( v1 );
  34. m->addView( v2 );
  35. m->addView( v3 );
  36. m->addView( v4 );
  37. m->addView( v5 );
  38. m->addView( v6 );
  39. m->addView( v7 );
  40. m->addView( v8 );
  41. m->addView( v9 );
  42. }
  43. SetIds::~SetIds()
  44. {
  45. delete ui;
  46. for( auto i : views )
  47. delete (SetIdsView*)i;
  48. delete m;
  49. }
  50. // Die Ids sollen nicht gespeichert werden
  51. void SetIds::on_abbrechen_clicked()
  52. {
  53. close();
  54. }
  55. // Es sollen weitere Bilder geladen werden
  56. void SetIds::on_weiter_clicked()
  57. {
  58. int index = m->list.count() - 3;
  59. if( !s->getFrame( index ) )
  60. return;
  61. m->removeViews();
  62. for( auto i : views )
  63. delete (SetIdsView*)i;
  64. views.clear();
  65. SetIdsView *v1 = new SetIdsView( s, m, index, ui->v1 );
  66. SetIdsView *v2 = new SetIdsView( s, m, index + 1, ui->v2 );
  67. SetIdsView *v3 = new SetIdsView( s, m, index + 2, ui->v3 );
  68. SetIdsView *v4 = new SetIdsView( s, m, index + 3, ui->v4 );
  69. SetIdsView *v5 = new SetIdsView( s, m, index + 4, ui->v5 );
  70. SetIdsView *v6 = new SetIdsView( s, m, index + 5, ui->v6 );
  71. SetIdsView *v7 = new SetIdsView( s, m, index + 6, ui->v7 );
  72. SetIdsView *v8 = new SetIdsView( s, m, index + 7, ui->v8 );
  73. SetIdsView *v9 = new SetIdsView( s, m, index + 8, ui->v9 );
  74. views.append( v1 );
  75. views.append( v2 );
  76. views.append( v3 );
  77. views.append( v4 );
  78. views.append( v5 );
  79. views.append( v6 );
  80. views.append( v7 );
  81. views.append( v8 );
  82. views.append( v9 );
  83. m->addView( v1 );
  84. m->addView( v2 );
  85. m->addView( v3 );
  86. m->addView( v4 );
  87. m->addView( v5 );
  88. m->addView( v6 );
  89. m->addView( v7 );
  90. m->addView( v8 );
  91. m->addView( v9 );
  92. }
  93. // Die Ids sollen gespeichert werden
  94. void SetIds::on_speichern_clicked()
  95. {
  96. int i = 0;
  97. for( ObjectPolygon p : m->list )
  98. {
  99. if( p.isNull() )
  100. {
  101. i++;
  102. continue;
  103. }
  104. p->setId( QString::number( m->id ) );
  105. s->getFrame( i++ )->setNeedSave();
  106. s->addObjectName( QString::number( m->id ) );
  107. }
  108. this->close();
  109. }
  110. // Inhalt der SetIdsView Klasse
  111. //------------------------------
  112. // Transformiert einen Punkt von Bildkoordinaten nach Bildschirmkoordinaten
  113. QPoint SetIdsView::translate(QPoint p)
  114. {
  115. return QPoint( (int)(p.x() * xScaleFactor), (int)(p.y() * yScaleFactor) );
  116. }
  117. // Transformiert ein Polygon von Bildkoordinaten nach Bildschirmkoordinaten
  118. QPolygon SetIdsView::translatePolygon(QPolygon p)
  119. {
  120. QPolygon result;
  121. for( auto point = p.begin(); point != p.end(); point++ )
  122. result.append( translate( *point ) );
  123. return result;
  124. }
  125. // Transformiert einen Punkt von Bildschirmkoordinaten nach Bildkoordinaten
  126. QPoint SetIdsView::inverseTranslate(QPoint p)
  127. {
  128. return QPoint( (int)(p.x() / xScaleFactor), (int)(p.y() / yScaleFactor) );
  129. }
  130. QPointF centerOfPolygon( QPolygon p ); // siehe arbeitsview.cpp
  131. // Zeichnet die View neu
  132. void SetIdsView::paintEvent(QPaintEvent *e)
  133. {
  134. QPainter painter( this );
  135. if( f )
  136. {
  137. QImage img = f->getImage();
  138. xScaleFactor = width() / (float)img.width();
  139. yScaleFactor = height() / (float)img.height();
  140. // Zeichne Hintergrund Bild
  141. painter.drawImage( QRect( QPoint( 0, 0 ), translate( QPoint( img.width(), img.height() ) ) ), img );
  142. QList<ObjectPolygon> objects = f->getObjects();
  143. QPen white( QColor( 255, 255, 255 ), 2 ); // Erstellt Stifte zum Zeichnen
  144. QPen white1( QColor( 255, 255, 255 ), 1 );
  145. QPen lightGreen( QColor( 100, 255, 100 ), 2 );
  146. QPen green( QColor( 0, 255, 0 ), 2 );
  147. QPen red( QColor( 255, 0, 0 ), 2 );
  148. QBrush blackBrush( QColor( 0, 0, 0 ), Qt::SolidPattern );
  149. for( ObjectPolygon o : objects )
  150. { // Schleife durch alle Objekte des Bildes
  151. if( o->isSelected() )
  152. {
  153. painter.setPen( white );
  154. int pIndex;
  155. if( o == f->getObjectAt( mousePos, pIndex ) )
  156. painter.setPen( lightGreen );
  157. if( ( o->getId() == QString::number( m->id ) || o == m->list.at( i ) ) && m->id != -1 )
  158. painter.setPen( green );
  159. if( o->getId() == QString::number( m->id ) && o != m->list.at( i ) && m->id != -1 )
  160. painter.setPen( red );
  161. pIndex = 0;
  162. for( QPolygon pol : o->getPolygonList() )
  163. { // Schleife durch alle Polygone des Bildes
  164. QBrush tmpB = painter.brush();
  165. painter.drawPolygon( translatePolygon( pol ) ); // Zeichne Polygon
  166. QPen tmpPen = painter.pen();
  167. painter.setPen( white1 );
  168. QFont f = painter.font();
  169. f.setPointSize( 12 );
  170. QPainterPath tPath;
  171. QString id = o->getId();
  172. if( o == m->list.at( i ) )
  173. {
  174. id = QString::number( m->id );
  175. }
  176. tPath.addText( centerOfPolygon( translatePolygon( pol ) ), f, id );
  177. painter.setBrush( blackBrush );
  178. painter.drawPath( tPath );
  179. painter.setBrush(tmpB);
  180. painter.setPen( tmpPen );
  181. pIndex++;
  182. }
  183. }
  184. }
  185. painter.setPen( red );
  186. if( i - 1 >= 0 && !m->set.at( i ) && !m->list.at( i - 1 ).isNull() )
  187. {
  188. QPoint mid = m->list.at( i - 1 )->getBoundingBox().center();
  189. int index;
  190. ObjectPolygon p = f->getObjectAt( mid, index );
  191. if( !p.isNull() && p->isSelected() )
  192. {
  193. m->list.replace( i, p );
  194. m->notifyViews();
  195. }
  196. else
  197. painter.drawEllipse( translate(mid), 5, 5 );
  198. }
  199. }
  200. }
  201. SetIdsView::SetIdsView(Sequenz *s, SetIdsModel *m, int i, QWidget *parent)
  202. : QWidget( parent )
  203. {
  204. this->f = s->getFrame( i );
  205. this->s = s;
  206. this->m = m;
  207. this->i = i;
  208. parent->layout()->addWidget( this );
  209. this->setMouseTracking( true );
  210. if( m->list.count() <= i )
  211. {
  212. m->list.append( ObjectPolygon() );
  213. m->set.append( 0 );
  214. }
  215. }
  216. SetIdsView::~SetIdsView()
  217. {
  218. ((QWidget*)this->parent())->layout()->removeWidget( this );
  219. }
  220. // Verarbeitet Maus Events und wählt das richtige Objekt aus
  221. void SetIdsView::mouseReleaseEvent(QMouseEvent *e)
  222. {
  223. if( !f )
  224. return;
  225. if( e->button() == Qt::LeftButton )
  226. { // Wäjlt ein Objekt aus, welches die Id zugewiesen bekommen soll
  227. int index;
  228. ObjectPolygon p = f->getObjectAt( mousePos, index );
  229. if( p.isNull() || !p->isSelected() )
  230. return;
  231. if( p->getId() == "-1" && m->id == -1 )
  232. {
  233. bool ok;
  234. int max = s->getMaxObjectId() + 1;
  235. int id = QInputDialog::getInt( this, "ID", "Gebe die neue ID ein", max, 0, max, 1, &ok );
  236. if( ok )
  237. {
  238. m->id = id;
  239. m->list.replace( i, p );
  240. m->set.replace( i, 1 );
  241. }
  242. }
  243. else if( m->id != -1 )
  244. {
  245. m->list.replace( i, p );
  246. m->set.replace( i, 1 );
  247. }
  248. else
  249. {
  250. m->id = p->getId().toInt();
  251. m->set.replace( i, 1 );
  252. m->list.replace( i, p );
  253. }
  254. }
  255. if( e->button() == Qt::RightButton )
  256. { // Lege Fest, dass für dieses Bild kein Objekt mit der Id versehen werden soll
  257. m->list.replace( i, ObjectPolygon() );
  258. m->set.replace( i, 1 );
  259. }
  260. m->notifyViews();
  261. }
  262. // Übernimmt die neue Maus Position
  263. void SetIdsView::mouseMoveEvent(QMouseEvent *e)
  264. {
  265. mousePos = inverseTranslate( e->pos() );
  266. update();
  267. }