//描画 void MapFrame::paint(QPainter* pp) { Map* pMap = app.getMap(); QRect rectSource, rectDest; double viewBackMagni; MAP_INTSECMAP_IT imi; Intsec* pIntsec; stringstream ss; int viewX, viewY; MAP_ROADMAP_IT rmi; Road* pRoad; DrawLineType drawLineType; //塗りつぶし、ドラッグ画面用 pp->fillRect(0, 0, width(), height(), Qt::gray); //背景描画 if (app.getBackImage() && !_backPixmap.isNull()) { viewBackMagni = app.getBackMagni() * app.getViewMagni(); // view / back rectDest.setCoords(0, 0, width(), height()); rectSource.setLeft( (int)((double)(app.getViewMapX() - app.getBackMapX()) / app.getBackMagni())); rectSource.setBottom(_backPixmap.size().height() - (int)((double)(app.getViewMapY() - app.getBackMapY()) / app.getBackMagni())); rectSource.setRight( rectSource.left() + (int)((double)width() / viewBackMagni)); rectSource.setTop( rectSource.bottom() - (int)((double)height() / viewBackMagni)); pp->drawPixmap(rectDest, _backPixmap, rectSource); } //全単路描画 pMap = app.getMap(); pRoad = pMap->nextRoad(&rmi, true); while (pRoad != NULL) { if (pRoad->getRoadId() == _roadIdSelect) { if (_dragType == roadRepl) { // qDebug("MapFrame::paint drag road replace selected"); drawLineType = selectedDark; } else drawLineType = selected; } else drawLineType = normal; if (_dragType == intsec) { // qDebug("MapFrame::paint drag intsec road"); if (pRoad->getIntsec(ROAD_IT_SMALL)->getIntsecId() == _intsecIdDrag || pRoad->getIntsec(ROAD_IT_LARGE)->getIntsecId() == _intsecIdDrag ) { // qDebug("MapFrame::paint drag intsec road selected"); drawLineType = selectedDark; } } // qDebug("MapFrame::paint road (%d,%d) drag %d lineType:%d", // pRoad->getIntsec(ROAD_IT_SMALL)->getIntsecId(), // pRoad->getIntsec(ROAD_IT_LARGE)->getIntsecId(), _intsecIdDrag, drawLineType); if (isViewArea(pRoad->getIntsec(ROAD_IT_SMALL)) || isViewArea(pRoad->getIntsec(ROAD_IT_LARGE))) drawLine(pp, getViewX(pRoad->getIntsec(ROAD_IT_SMALL)->getMapPosX()), getViewY(pRoad->getIntsec(ROAD_IT_SMALL)->getMapPosY()), getViewX(pRoad->getIntsec(ROAD_IT_LARGE)->getMapPosX()), getViewY(pRoad->getIntsec(ROAD_IT_LARGE)->getMapPosY()), drawLineType, pRoad->isLaneOver4(), pRoad->isError()); pRoad = pMap->nextRoad(&rmi); } //交差点ID描画、広域表示では点描画 if (app.getShowId()) { pIntsec = pMap->nextIntsec(&imi, true); while (pIntsec != NULL) { if (isViewArea(pIntsec)) { if (app.getMainWindow()->getEditMode() != MainWindow::large) { ss.str(""); ss << pIntsec->getIntsecId(); viewX = getViewX(pIntsec->getMapPosX()) + INTSEC_LABELSIZE_H + 2; viewY = getViewY(pIntsec->getMapPosY()) + INTSEC_LABELSIZE_H + 2; pp->setPen(QColor("#FFFFFF")); pp->drawText(viewX - 1, viewY + 1, ss.str().c_str()); pp->drawText(viewX - 1, viewY - 1, ss.str().c_str()); pp->drawText(viewX + 1, viewY - 1, ss.str().c_str()); pp->drawText(viewX + 1, viewY + 1, ss.str().c_str()); pp->setPen(QColor("#0000FF")); pp->drawText(viewX, viewY, ss.str().c_str()); } else { viewX = getViewX(pIntsec->getMapPosX()) - 2; viewY = getViewY(pIntsec->getMapPosY()) - 2; QString colorName; if (pIntsec->getIntsecId() == _intsecIdSelect) { if (pIntsec->isError()) colorName = "#FF00FF"; else colorName = "#0000FF"; } else { if (pIntsec->isError()) colorName = "#FF0000"; else colorName = "#000000"; } //何故かこうしないと描けない QBrush brush(QColor(colorName.toStdString().c_str())); pp->setPen(QColor(colorName)); pp->fillRect(viewX, viewY, 4, 4, brush); pp->drawRect(viewX, viewY, 4, 4); } } pIntsec = pMap->nextIntsec(&imi); } } }
//描画イベント void MapFrame::paintEvent(QPaintEvent*) { QPainter painter(this), painterDRP; Map* pMap = app.getMap(); int intsecIdCon; Intsec* pIntsec; Intsec* pIntsecCon; Road* pRoad; INTSEC_ROADMAP_IT irmi; // qDebug("MapFrame::paintEvent (%d,%d)-(%d,%d)", // event->rect().right(), event->rect().top(), event->rect().left(), event->rect().bottom()); // qDebug("MapFrame::paintEvent back pixmap (%d,%d)-%d", // _backPixmap.size().width(), _backPixmap.size().height(), _backPixmap.isNull()); //交差点ドラッグなら接続単路を書く、単路ドラッグならドラッグ線を描く、他はそのまま描画 // 通常画面を全体画像に入れてその上にドラッグ線を描く、そうでないと数が多い時に非常に遅い if (_dragType == intsec || _dragType == road || _dragType == roadRepl) { // qDebug("MapFrame::paintEvent _dragWholePixmap (%d,%d)-%d", // _dragWholePixmap.width(), _dragWholePixmap.height(), _dragWholePixmap.isNull()); if (_dragWholePixmap.isNull()) { // qDebug("MapFrame::paintEvent create whole pixmap"); _dragWholePixmap = QPixmap(width(), height()); painterDRP.begin(&_dragWholePixmap); paint(&painterDRP); painterDRP.end(); } painter.drawPixmap(0, 0, width(), height(), _dragWholePixmap); if (_dragType == intsec) { // qDebug("MapFrame::paintEvent drag intsec %d", _intsecIdDrag); pIntsec = pMap->getIntsec(_intsecIdDrag); Q_ASSERT(pIntsec != NULL); pRoad = pIntsec->nextRoad(&irmi, true, &intsecIdCon); while (pRoad != NULL) { // qDebug("MapFrame::paintEvent drag intsec road %d-%d", _intsecIdDrag, intsecIdCon); pIntsecCon = pMap->getIntsec(intsecIdCon); Q_ASSERT(pIntsecCon != NULL); drawLine(&painter, _dragRoadX, _dragRoadY, getViewX(pIntsecCon->getMapPosX()), getViewY(pIntsecCon->getMapPosY()), selected, pRoad->isLaneOver4(), pRoad->isError()); pRoad = pIntsec->nextRoad(&irmi, false, &intsecIdCon); } } else if (_dragType == road) { // qDebug("MapFrame::paintEvent road line (%d, %d)-(%d, %d)", // _dragRoadX, _dragRoadY, _dragRoadConX, _dragRoadConY); drawLine(&painter, _dragRoadX, _dragRoadY, _dragRoadConX, _dragRoadConY, selected, !app.getMainWindow()->isLane2()); } else if (_dragType == roadRepl) { pRoad = pMap->getRoad(_intsecIdDrag, _intsecIdReplCon); // qDebug("MapFrame::paintEvent road repl %d-%d", _intsecIdDrag, _intsecIdReplCon); if (pRoad != NULL) { // qDebug("MapFrame::paintEvent road repl line (%d, %d)-(%d, %d)", // _dragRoadX, _dragRoadY, _dragRoadConX, _dragRoadConY); drawLine(&painter, _dragRoadX, _dragRoadY, _dragRoadConX, _dragRoadConY, selected, pRoad->isLaneOver4(), pRoad->isError()); } else { // qDebug("MapFrame::paintEvent road repl null line (%d, %d)-(%d, %d)", // _dragRoadX, _dragRoadY, _dragRoadConX, _dragRoadConY); drawLine(&painter, _dragRoadX, _dragRoadY, _dragRoadConX, _dragRoadConY, selected); //最後に一瞬だけある } } } else { // qDebug("MapFrame::paintEvent normal"); paint(&painter); } }