void GroundPlaneGenerator::scanImage(QImage & image, double bWidth, double bHeight, double pixelFactor, double res, const QString & colorString, bool makeConnector, bool makeOffset, QSizeF minAreaInches, double minDimensionInches, QPointF polygonOffset) { QList<QRect> rects; scanLines(image, bWidth, bHeight, rects); QList< QList<int> * > pieces; splitScanLines(rects, pieces); foreach (QList<int> * piece, pieces) { QList<QPolygon> polygons; QList<QRect> newRects; foreach (int i, *piece) { QRect r = rects.at(i); newRects.append(QRect(r.x() * pixelFactor, r.y() * pixelFactor, (r.width() * pixelFactor) + 1, pixelFactor + 1)); // + 1 is for off-by-one converting rects to polys } // note: there is always one joinScanLines(newRects, polygons); QPointF offset; QString pSvg = makePolySvg(polygons, res, bWidth, bHeight, pixelFactor, colorString, makeConnector, makeOffset ? &offset : NULL, minAreaInches, minDimensionInches, polygonOffset); if (pSvg.isEmpty()) continue; m_newSVGs.append(pSvg); if (makeOffset) { offset *= FSvgRenderer::printerScale(); m_newOffsets.append(offset); // offset now in pixels } /* QFile file4("testPoly.svg"); file4.open(QIODevice::WriteOnly); QTextStream out4(&file4); out4 << pSvg; file4.close(); */ }
QImage * GroundPlaneGenerator::generateGroundPlaneAux(const QString & boardSvg, QSizeF boardImageSize, const QString & svg, QSizeF copperImageSize, QStringList & exceptions, QGraphicsItem * board, double res, double & bWidth, double & bHeight, double blurBy) { QByteArray boardByteArray; QString tempColor("#ffffff"); if (!SvgFileSplitter::changeColors(boardSvg, tempColor, exceptions, boardByteArray)) { return NULL; } /* QFile file0("testGroundFillBoard.svg"); file0.open(QIODevice::WriteOnly); QTextStream out0(&file0); out0 << boardByteArray; file0.close(); */ QByteArray copperByteArray; if (!SvgFileSplitter::changeStrokeWidth(svg, 50, false, copperByteArray)) { return NULL; } /* QFile file1("testGroundFillCopper.svg"); file1.open(QIODevice::WriteOnly); QTextStream out1(&file1); out1 << copperByteArray; file1.close(); */ double svgWidth = res * qMax(boardImageSize.width(), copperImageSize.width()) / FSvgRenderer::printerScale(); double svgHeight = res * qMax(boardImageSize.height(), copperImageSize.height()) / FSvgRenderer::printerScale(); QRectF br = board->sceneBoundingRect(); bWidth = res * br.width() / FSvgRenderer::printerScale(); bHeight = res * br.height() / FSvgRenderer::printerScale(); QImage * image = new QImage(qMax(svgWidth, bWidth), qMax(svgHeight, bHeight), QImage::Format_Mono); // image->setDotsPerMeterX(res * GraphicsUtils::InchesPerMeter); image->setDotsPerMeterY(res * GraphicsUtils::InchesPerMeter); image->fill(0x0); QSvgRenderer renderer(boardByteArray); QPainter painter; painter.begin(image); painter.setRenderHint(QPainter::Antialiasing, false); renderer.render(&painter, QRectF(0, 0, res * boardImageSize.width() / FSvgRenderer::printerScale(), res * boardImageSize.height() / FSvgRenderer::printerScale())); painter.end(); #ifndef QT_NO_DEBUG image->save("testGroundFillBoard.png"); #endif for (double m = 0; m < .004; m += (1.0 / res)) { QList<QPoint> points; collectBorderPoints(*image, points); #ifndef QT_NO_DEBUG // for debugging double pixelFactor = GraphicsUtils::StandardFritzingDPI / res; QPolygon polygon; foreach(QPoint p, points) { polygon.append(QPoint(p.x() * pixelFactor, p.y() * pixelFactor)); } QList<QPolygon> polygons; polygons.append(polygon); QPointF offset; QString pSvg = makePolySvg(polygons, res, bWidth, bHeight, pixelFactor, "#ffffff", "debug", false, NULL, QSizeF(0,0), 0, QPointF(0, 0)); #endif foreach (QPoint p, points) image->setPixel(p, 0); }