File indexing completed on 2024-05-12 04:06:21

0001 /*
0002     SPDX-FileCopyrightText: 2010 Johannes Loehnert <loehnert.kde@gmx.net>
0003     Based on the Jigsaw slicer by:
0004     SPDX-FileCopyrightText: 2009 Stefan Majewsky <majewsky@gmx.net>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "slicer-goldberg.h"
0010 
0011 #include <KLocalizedString>
0012 #include <KPluginFactory>
0013 
0014 #include "goldberg-engine.h"
0015 #include "grid.h"
0016 #include "utilities.h"
0017 
0018 K_PLUGIN_CLASS_WITH_JSON(GoldbergSlicer, "palapeli_goldbergslicer.json")
0019 
0020 GoldbergSlicer::GoldbergSlicer(QObject* parent, const QVariantList& args)
0021             : Pala::Slicer(parent, args) {
0022 
0023     Pala::IntegerProperty* prop;
0024     Pala::StringProperty* sprop;
0025     Pala::BooleanProperty* bprop;
0026 
0027     m_qvoronoi_available = IrregularMode::checkForQVoronoi();
0028 
0029     Pala::SlicerMode* presetMode = nullptr;
0030     addMode(presetMode = new PresetMode);
0031     addMode(new RectMode);
0032     addMode(new CairoMode);
0033     addMode(new HexMode);
0034     addMode(new RotrexMode);
0035     Pala::SlicerMode* irregularMode = nullptr;
0036     if (m_qvoronoi_available)
0037         addMode(irregularMode = new IrregularMode);
0038 
0039     prop = new Pala::IntegerProperty(i18n("Approx. piece count"));
0040     prop->setRange(2, 2000);
0041     prop->setDefaultValue(30);
0042     prop->setRepresentation(Pala::IntegerProperty::SpinBox);
0043     addProperty("020_PieceCount", prop);
0044     
0045     sprop = new Pala::StringProperty(i18n("Quick preset"));
0046     QVariantList choices;
0047     choices << i18nc("Puzzle shape preset", "Ordinary");
0048     choices << i18nc("Puzzle shape preset", "Very regular");
0049     choices << i18nc("Puzzle shape preset", "Very diverse");
0050     choices << i18nc("Puzzle shape preset", "Large plugs");
0051     sprop->setChoices(choices);
0052     sprop->setDefaultValue(QLatin1String(""));
0053     sprop->setEnabled(false);
0054     presetMode->setPropertyEnabled("025_QuickPreset", true);
0055     addProperty("025_QuickPreset", sprop);
0056 
0057     prop = new Pala::IntegerProperty(i18n("Flipped edge percentage"));
0058     prop->setRange(0, 100);
0059     prop->setDefaultValue(10);
0060     prop->setRepresentation(Pala::IntegerProperty::Slider);
0061     presetMode->setPropertyEnabled("030_FlipThreshold", false);
0062     addProperty("030_FlipThreshold", prop);
0063 
0064     prop = new Pala::IntegerProperty(i18n("Edge curviness"));
0065     prop->setRange(-100, 100);
0066     prop->setDefaultValue(-50);
0067     prop->setRepresentation(Pala::IntegerProperty::Slider);
0068     addProperty("040_EdgeCurviness", prop);
0069 
0070     prop = new Pala::IntegerProperty(i18n("Plug size"));
0071     prop->setRange(-50, 50);
0072     prop->setDefaultValue(0);
0073     prop->setRepresentation(Pala::IntegerProperty::Slider);
0074     presetMode->setPropertyEnabled("050_PlugSize", false);
0075     addProperty("050_PlugSize", prop);
0076 
0077     prop = new Pala::IntegerProperty(i18n("Diversity of curviness"));
0078     prop->setRange(25, 100);
0079     prop->setDefaultValue(50);
0080     prop->setRepresentation(Pala::IntegerProperty::Slider);
0081     presetMode->setPropertyEnabled("055_SigmaCurviness", false);
0082     addProperty("055_SigmaCurviness", prop);
0083 
0084     prop = new Pala::IntegerProperty(i18n("Diversity of plug position"));
0085     prop->setRange(20, 100);
0086     prop->setDefaultValue(35);
0087     prop->setRepresentation(Pala::IntegerProperty::Slider);
0088     presetMode->setPropertyEnabled("056_SigmaBasepos", false);
0089     addProperty("056_SigmaBasepos", prop);
0090  
0091     prop = new Pala::IntegerProperty(i18n("Diversity of plugs"));
0092     prop->setRange(25, 100);
0093     prop->setDefaultValue(50);
0094     prop->setRepresentation(Pala::IntegerProperty::Slider);
0095     presetMode->setPropertyEnabled("057_SigmaPlugs", false);
0096     addProperty("057_SigmaPlugs", prop);
0097 
0098     prop = new Pala::IntegerProperty(i18n("Diversity of piece size"));
0099     prop->setRange(0, 30);
0100     prop->setDefaultValue(15);
0101     prop->setRepresentation(Pala::IntegerProperty::Slider);
0102     prop->setEnabled(false);
0103     if (irregularMode)
0104         irregularMode->setPropertyEnabled("058_IrrPieceSizeDiversity", true);
0105     addProperty("058_IrrPieceSizeDiversity", prop);
0106 
0107     bprop = new Pala::BooleanProperty(i18n("Dump grid image"));
0108     bprop->setDefaultValue(false);
0109     presetMode->setPropertyEnabled("070_DumpGrid", false);
0110     addProperty("070_DumpGrid", bprop);
0111 
0112  }
0113 
0114 bool GoldbergSlicer::run(Pala::SlicerJob* job) {
0115     //read job
0116 
0117     GoldbergEngine engine = GoldbergEngine(job);
0118 
0119     int piece_count = job->argument("020_PieceCount").toInt();
0120     engine.m_quickpreset = 0;
0121     // FIXME: this is not pretty :-/
0122     QString qptext = job->argument("025_QuickPreset").toString();
0123     // ordinary == 0 == default
0124     if (qptext == i18nc("Puzzle shape preset", "Very regular")) engine.m_quickpreset = 1;
0125     if (qptext == i18nc("Puzzle shape preset", "Very diverse")) engine.m_quickpreset = 2;
0126     if (qptext == i18nc("Puzzle shape preset", "Large plugs")) engine.m_quickpreset = 3;
0127     
0128     engine.m_flip_threshold = job->argument("030_FlipThreshold").toInt();
0129     engine.m_edge_curviness = job->argument("040_EdgeCurviness").toInt();
0130     engine.m_plug_size = 1 + 0.01*job->argument("050_PlugSize").toInt();
0131     engine.m_sigma_curviness = 0.01*job->argument("055_SigmaCurviness").toInt();
0132     engine.m_sigma_basepos = 0.01*job->argument("056_SigmaBasepos").toInt();
0133     engine.m_sigma_plugs = 0.01*job->argument("057_SigmaPlugs").toInt();
0134     engine.m_irregular_relaxation_steps = 30 - job->argument("058_IrrPieceSizeDiversity").toInt();
0135 
0136     // square the sigmas, so that lower values are more stretched out on the slider
0137     engine.m_sigma_curviness *= engine.m_sigma_curviness;
0138     engine.m_sigma_basepos *= engine.m_sigma_basepos;
0139     engine.m_sigma_plugs *= engine.m_sigma_plugs;
0140 
0141     // outline rendering now done by palapeli itself. Outline option was removed.
0142     engine.m_outlines = false;
0143 
0144     engine.set_dump_grid(job->argument("070_DumpGrid").toBool());
0145 
0146     engine.m_alternate_flip = (engine.m_flip_threshold > 50);
0147     if (engine.m_alternate_flip) engine.m_flip_threshold = 100-engine.m_flip_threshold;
0148 
0149     //determine selected mode, and call grid generation algorithm
0150     const GoldbergMode* mode = static_cast<const GoldbergMode*>(job->mode());
0151     if (!mode)
0152         return false;
0153     mode->generateGrid(&engine, piece_count);
0154 
0155     engine.dump_grid_image();
0156 
0157     return true;
0158 }
0159 
0160 #include "moc_slicer-goldberg.cpp"
0161 #include "slicer-goldberg.moc"