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"