mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-10-15 01:54:14 +02:00
Merge pull request #1478 from ispyisail/feature/svg-picture-limit
Add an SVG export option to store pictures smaller
This commit is contained in:
@@ -283,7 +283,8 @@ int exportPdf(QETProject &project, const QString &output,
|
||||
}
|
||||
|
||||
int exportImages(QETProject &project, const QString &format,
|
||||
const QString &out_dir, bool showTerminals = false)
|
||||
const QString &out_dir, bool showTerminals = false,
|
||||
bool svgSmallPictures = false)
|
||||
{
|
||||
const QList<Diagram *> diagrams = project.diagrams();
|
||||
if (diagrams.isEmpty()) {
|
||||
@@ -306,8 +307,10 @@ int exportImages(QETProject &project, const QString &format,
|
||||
gen.setViewBox(QRect(0, 0, r.width(), r.height()));
|
||||
gen.setTitle(diagram->title());
|
||||
QPainter painter(&gen);
|
||||
diagram->setSmallPictures(svgSmallPictures);
|
||||
renderDiagram(diagram, painter, QRectF(QPointF(0, 0), r.size()),
|
||||
showTerminals);
|
||||
diagram->setSmallPictures(false);
|
||||
painter.end();
|
||||
} else { // png
|
||||
QImage image(r.size(), QImage::Format_ARGB32);
|
||||
@@ -1014,6 +1017,7 @@ int run(const QStringList &args)
|
||||
const bool showTerminals = filtered.removeAll("--show-terminals") > 0;
|
||||
const bool dxfBlocks = filtered.removeAll("--dxf-blocks") > 0;
|
||||
const bool dxfAttributes = filtered.removeAll("--dxf-attributes") > 0;
|
||||
const bool svgSmallPictures = filtered.removeAll("--svg-small-pictures") > 0;
|
||||
// --no-slaves and --no-junctions leave rows out of --export-bom.
|
||||
const bool includeSlaves = filtered.removeAll("--no-slaves") == 0;
|
||||
const bool includeJunctions = filtered.removeAll("--no-junctions") == 0;
|
||||
@@ -1085,7 +1089,8 @@ int run(const QStringList &args)
|
||||
return resaveProject(project, output);
|
||||
if (format == "settb")
|
||||
return setTitleBlock(project, output, rest.mid(2));
|
||||
return exportImages(project, format, output, showTerminals);
|
||||
return exportImages(project, format, output, showTerminals,
|
||||
svgSmallPictures);
|
||||
}
|
||||
|
||||
} // namespace CLIExport
|
||||
|
||||
@@ -44,7 +44,7 @@ namespace CLIExport {
|
||||
Usage:
|
||||
qelectrotech --export-pdf <project.qet> <output.pdf> [--show-terminals]
|
||||
qelectrotech --export-png <project.qet> <output_dir> [--show-terminals]
|
||||
qelectrotech --export-svg <project.qet> <output_dir> [--show-terminals]
|
||||
qelectrotech --export-svg <project.qet> <output_dir> [--show-terminals] [--svg-small-pictures]
|
||||
qelectrotech --export-dxf <project.qet> <output_dir> [--show-terminals] [--dxf-blocks] [--dxf-attributes]
|
||||
qelectrotech --export-cables <project.qet> <output.csv>
|
||||
qelectrotech --export-wires <project.qet> <output.csv>
|
||||
@@ -71,6 +71,9 @@ namespace CLIExport {
|
||||
--dxf-attributes: as --dxf-blocks, and a symbol's texts (its label,
|
||||
function...) are attributes of its INSERT. LibreCAD does not
|
||||
show attributes.
|
||||
--svg-small-pictures: in an SVG, each picture at most four times the
|
||||
size it is drawn at instead of its full resolution: a much
|
||||
smaller file, still sharp when printed.
|
||||
cables: wiring list (one row per conductor) as CSV.
|
||||
wires: list of distinct wire numbers as CSV.
|
||||
bom: bill of materials (one row per element) as CSV.
|
||||
|
||||
@@ -133,6 +133,7 @@ class Diagram : public QGraphicsScene
|
||||
bool draw_terminals_;
|
||||
bool draw_terminal_names_;
|
||||
bool draw_colored_conductors_;
|
||||
bool m_small_pictures = false;
|
||||
|
||||
QString m_conductors_autonum_name;
|
||||
DiagramEventInterface *m_event_interface;
|
||||
@@ -284,6 +285,11 @@ class Diagram : public QGraphicsScene
|
||||
void setDrawTerminalNames(bool);
|
||||
bool drawColoredConductors() const;
|
||||
void setDrawColoredConductors(bool);
|
||||
/// While true, pictures draw a copy of a few times the size
|
||||
/// they are drawn at, not their full resolution (SVG export,
|
||||
/// ExportProperties::svg_small_pictures)
|
||||
bool smallPictures() const {return m_small_pictures;}
|
||||
void setSmallPictures(bool small) {m_small_pictures = small;}
|
||||
|
||||
QString title() const;
|
||||
bool toPaintDevice(QPaintDevice &, int = -1, int = -1,
|
||||
|
||||
@@ -417,12 +417,14 @@ void ExportDialog::generateSvg(
|
||||
|
||||
// genere une QPicture a partir du schema
|
||||
QPicture picture;
|
||||
diagram -> setSmallPictures(epw -> exportProperties().svg_small_pictures);
|
||||
diagram -> toPaintDevice(
|
||||
picture,
|
||||
width,
|
||||
height,
|
||||
keep_aspect_ratio ? Qt::KeepAspectRatio : Qt::IgnoreAspectRatio
|
||||
);
|
||||
diagram -> setSmallPictures(false);
|
||||
|
||||
// "joue" la QPicture sur un QSvgGenerator
|
||||
QSvgGenerator svg_engine;
|
||||
|
||||
@@ -39,6 +39,7 @@ ExportProperties::ExportProperties() :
|
||||
draw_colored_conductors(true),
|
||||
dxf_blocks(false),
|
||||
dxf_attributes(false),
|
||||
svg_small_pictures(false),
|
||||
exported_area(QET::BorderArea)
|
||||
{
|
||||
}
|
||||
@@ -83,6 +84,8 @@ void ExportProperties::toSettings(QSettings &settings,
|
||||
dxf_blocks);
|
||||
settings.setValue(prefix % "dxfattributes",
|
||||
dxf_attributes);
|
||||
settings.setValue(prefix % "svgsmallpictures",
|
||||
svg_small_pictures);
|
||||
settings.setValue(prefix % "area",
|
||||
QET::diagramAreaToString(exported_area));
|
||||
}
|
||||
@@ -125,6 +128,8 @@ void ExportProperties::fromSettings(QSettings &settings,
|
||||
false).toBool();
|
||||
dxf_attributes = settings.value(prefix % "dxfattributes",
|
||||
false).toBool();
|
||||
svg_small_pictures = settings.value(prefix % "svgsmallpictures",
|
||||
false).toBool();
|
||||
|
||||
exported_area = QET::diagramAreaFromString(
|
||||
settings.value(
|
||||
|
||||
@@ -52,6 +52,7 @@ class ExportProperties {
|
||||
bool draw_colored_conductors; ///< Whether to render conductors colors
|
||||
bool dxf_blocks; ///< DXF: each symbol as a block, placed with an INSERT
|
||||
bool dxf_attributes; ///< DXF, with dxf_blocks: a symbol's texts as attributes of its INSERT
|
||||
bool svg_small_pictures; ///< SVG: pictures at most 4x the size they are drawn, not full resolution
|
||||
QET::DiagramArea exported_area; ///< Area of diagrams to be rendered
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -68,6 +68,7 @@ ExportProperties ExportPropertiesWidget::exportProperties() const
|
||||
export_properties.draw_colored_conductors = draw_colored_conductors -> isChecked();
|
||||
export_properties.dxf_blocks = dxf_blocks -> isChecked();
|
||||
export_properties.dxf_attributes = dxf_attributes -> isChecked();
|
||||
export_properties.svg_small_pictures = svg_small_pictures -> isChecked();
|
||||
export_properties.exported_area = export_border -> isChecked() ? QET::BorderArea : QET::ElementsArea;
|
||||
|
||||
return(export_properties);
|
||||
@@ -94,6 +95,7 @@ void ExportPropertiesWidget::setExportProperties(const ExportProperties &export_
|
||||
dxf_blocks -> setChecked(export_properties.dxf_blocks);
|
||||
dxf_attributes -> setChecked(export_properties.dxf_attributes);
|
||||
dxf_attributes -> setEnabled(export_properties.dxf_blocks);
|
||||
svg_small_pictures -> setChecked(export_properties.svg_small_pictures);
|
||||
|
||||
if (export_properties.exported_area == QET::BorderArea) {
|
||||
export_border -> setChecked(true);
|
||||
@@ -125,6 +127,7 @@ void ExportPropertiesWidget::setPrintingMode(bool mode) {
|
||||
export_border -> setVisible(!mode);
|
||||
export_elements -> setVisible(!mode);
|
||||
draw_bg_transparent -> setVisible(!mode);
|
||||
svg_small_pictures -> setVisible(!mode);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -235,6 +238,11 @@ void ExportPropertiesWidget::build()
|
||||
dxf_attributes -> setToolTip(tr("A symbol's texts (label, function...) become attributes of its block. LibreCAD does not show attributes."));
|
||||
optionshlayout -> addWidget(dxf_attributes, 5, 1);
|
||||
connect(dxf_blocks, &QCheckBox::toggled, dxf_attributes, &QCheckBox::setEnabled);
|
||||
|
||||
// pictures not at full resolution in an SVG: a much smaller file
|
||||
svg_small_pictures = new QCheckBox(tr("SVG: smaller pictures"), groupbox_options);
|
||||
svg_small_pictures -> setToolTip(tr("Pictures are stored at four times the size they have on the folio instead of their full resolution: a much smaller file, still sharp when printed"));
|
||||
optionshlayout -> addWidget(svg_small_pictures, 5, 0);
|
||||
|
||||
vboxLayout -> addWidget(groupbox_options);
|
||||
|
||||
@@ -252,6 +260,7 @@ void ExportPropertiesWidget::build()
|
||||
setTabOrder(draw_colored_conductors, draw_bg_transparent);
|
||||
setTabOrder(draw_bg_transparent, dxf_blocks);
|
||||
setTabOrder(dxf_blocks, dxf_attributes);
|
||||
setTabOrder(draw_bg_transparent, svg_small_pictures);
|
||||
|
||||
// connexion du bouton permettant le choix du repertoire
|
||||
connect(button_browse, &QPushButton::released, this, &ExportPropertiesWidget::slot_chooseADirectory);
|
||||
@@ -269,6 +278,7 @@ void ExportPropertiesWidget::build()
|
||||
connect(draw_colored_conductors, &QCheckBox::stateChanged, this, &ExportPropertiesWidget::optionChanged);
|
||||
connect(dxf_blocks, &QCheckBox::stateChanged, this, &ExportPropertiesWidget::optionChanged);
|
||||
connect(dxf_attributes, &QCheckBox::stateChanged, this, &ExportPropertiesWidget::optionChanged);
|
||||
connect(svg_small_pictures, &QCheckBox::stateChanged, this, &ExportPropertiesWidget::optionChanged);
|
||||
#else
|
||||
connect(draw_grid, &QCheckBox::checkStateChanged, this, &ExportPropertiesWidget::optionChanged);
|
||||
connect(draw_border, &QCheckBox::checkStateChanged, this, &ExportPropertiesWidget::optionChanged);
|
||||
@@ -279,5 +289,6 @@ void ExportPropertiesWidget::build()
|
||||
connect(draw_colored_conductors, &QCheckBox::checkStateChanged, this, &ExportPropertiesWidget::optionChanged);
|
||||
connect(dxf_blocks, &QCheckBox::checkStateChanged, this, &ExportPropertiesWidget::optionChanged);
|
||||
connect(dxf_attributes, &QCheckBox::checkStateChanged, this, &ExportPropertiesWidget::optionChanged);
|
||||
connect(svg_small_pictures, &QCheckBox::checkStateChanged, this, &ExportPropertiesWidget::optionChanged);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -67,6 +67,7 @@ class ExportPropertiesWidget : public QWidget {
|
||||
QCheckBox *draw_colored_conductors;
|
||||
QCheckBox *dxf_blocks;
|
||||
QCheckBox *dxf_attributes;
|
||||
QCheckBox *svg_small_pictures;
|
||||
QRadioButton *export_border;
|
||||
QRadioButton *export_elements;
|
||||
QButtonGroup *exported_content_choices;
|
||||
|
||||
@@ -167,7 +167,28 @@ void DiagramImageItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *
|
||||
return;
|
||||
}
|
||||
|
||||
DarkImageRendering::paintPixmap(painter, pixmap_, m_adapt_to_dark_theme);
|
||||
// SVG export with smaller pictures: a copy four times the size the
|
||||
// picture is drawn at, when that is smaller than the picture. An
|
||||
// SVG stores what it is given, so a photo shown at a tenth of its
|
||||
// size would otherwise be written whole.
|
||||
const QTransform world = painter -> worldTransform();
|
||||
const qreal drawn_scale = std::sqrt(std::abs(world.determinant()));
|
||||
const QSize small_size = (QSizeF(pixmap_.size()) * drawn_scale * 4).toSize();
|
||||
if (diagram() && diagram() -> smallPictures() && !pixmap_.isNull()
|
||||
&& small_size.width() < pixmap_.width()
|
||||
&& small_size.height() < pixmap_.height()
|
||||
&& !small_size.isEmpty())
|
||||
{
|
||||
const QPixmap small = pixmap_.scaled(small_size, Qt::IgnoreAspectRatio,
|
||||
Qt::SmoothTransformation);
|
||||
painter -> save();
|
||||
painter -> scale(qreal(pixmap_.width()) / small.width(),
|
||||
qreal(pixmap_.height()) / small.height());
|
||||
DarkImageRendering::paintPixmap(painter, small, m_adapt_to_dark_theme);
|
||||
painter -> restore();
|
||||
}
|
||||
else
|
||||
DarkImageRendering::paintPixmap(painter, pixmap_, m_adapt_to_dark_theme);
|
||||
|
||||
Q_UNUSED(option); Q_UNUSED(widget);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user