Exemplo n.º 1
0
void flowwidget::LoadXML(std::istream &data) {
    QXmlSimpleReader qxsr;
    qxsr.setContentHandler(XMLHandlr);
    qxsr.setErrorHandler(XMLHandlr);

    QIODevice* iodev = new IOStreamBridge(data);
    if (qxsr.parse(QXmlInputSource(iodev))) {
        std::cerr << "[FlowWidget] Recentering nodes and adjusting scale." << std::endl;
        double GenMinimumX = std::numeric_limits<double>::max();
        double GenExtremeX = std::numeric_limits<double>::min();
        double GenMinimumY = std::numeric_limits<double>::max();
        double GenExtremeY = std::numeric_limits<double>::min();
        std::for_each(XMLHandlr->OrphanNodes.begin(), XMLHandlr->OrphanNodes.end(),
                      [&](std::pair<std::string, FlowNode> nodepair) {
            NodeSize ns = getNodeSize(QFont("sans-serif", BaseFontSize*nodepair.second.FontSizeMult), QFont("sans-serif", BaseFontSize*nodepair.second.FontSizeMult*1.5), nodepair.second);
            if (nodepair.second.CenterPosX - double(ns.Width/2) < GenMinimumX)
                GenMinimumX = nodepair.second.CenterPosX - double(ns.Width/2);
            if (nodepair.second.CenterPosX + double(ns.Width/2) > GenExtremeX)
                GenExtremeX = nodepair.second.CenterPosX + double(ns.Width/2);
            if (nodepair.second.CenterPosY - double(ns.Height/2) < GenMinimumY)
                GenMinimumY = nodepair.second.CenterPosY - double(ns.Height/2);
            if (nodepair.second.CenterPosY + double(ns.Height/2) > GenExtremeY)
                GenExtremeY = nodepair.second.CenterPosY + double(ns.Height/2);
        });

        QLineF XLine(QPointF(GenMinimumX, 0), QPointF(GenExtremeX, 0));
        QLineF YLine(QPointF(GenMinimumY, 0), QPointF(GenExtremeY, 0));
        if (XLine.length() > YLine.length()) {
            PermaScale = 1.0/XLine.length();
        } else {
            PermaScale = 1.0/YLine.length();
        }

        double NewCenterX = (GenMinimumX + GenExtremeX) / 2.0;
        double NewCenterY = (GenMinimumY + GenExtremeY) / 2.0;
        std::cerr << "[FlowWidget] Nodes are off by X " << -NewCenterX << ", Y " << -NewCenterY <<
                     ", deducted from XMin " << GenMinimumX << ", XMax " << GenExtremeX <<
                     ", YMin " << GenMinimumY << ", YMax" << GenExtremeY << std::endl;
        for (auto itr = XMLHandlr->OrphanNodes.begin(); itr != XMLHandlr->OrphanNodes.end(); itr++) {
            itr->second.CenterPosX -= NewCenterX;
            itr->second.CenterPosY -= NewCenterY;
        }
        std::cerr << "[FlowWidget] Recentered nodes. Ready!" << std::endl;
    } else {
        std::cerr << "[FlowWidget] Error loading XML." << std::endl;
    }
}
Exemplo n.º 2
0
XLine operator*( const XTransform &tx, const XLine &line )
{
    return XLine( tx * line.position(), tx.linear() * line.direction(), XLine::PointAndDirection );
}