Пример #1
0
//描画
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);
        }
    }
}
Пример #2
0
//描画イベント
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);
    }
}