package ONO::FW::Edu::Apps::Modules::MathHousesIMG;
################################################################################
# COPYRIGHT / LICENSE #
################################################################################
#
# This file is part of the ONO Software Project.
#
# Copyright (C) 2022-2026 Jos Kirps and The Joopita Project [ASBL]
# Copyright (C) 2011-2022 Jos Kirps and Joopita Research ASBL
# Copyright (C) 2006-2011 Jos Kirps and The Joopita Project
# Copyright (C) 2001-2006 Jos Kirps and The WobbleWolf Project
#
# This file, as well as many other parts of the ONO Software Project or
# related elements, are FREE SOFTWARE available under the ARTISTIC LICENSE 2.0.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# For the full license, see /ono/osr/license/LICENSE.txt, or write to
# jos_AT_kirps_DOT_com or contact_AT_joopita_DOT_com.
#
################################################################################
# END OF COPYRIGHT / LICENSE, HERE COMES THE CODE ... #
################################################################################
#: This module is a front end application module wrapper that has been
#: created for the Morzino Project (morzino.com) and that has been released
#: as Open Source software.
#:
#: Note that this is NOT a self-contained application, it is only a wrapper
#: that makes heavy use of the ONO Perl Framework application engine.
use strict;
use ONO::FW::Edu::Apps::ToolBox;
use ONO::FW::Edu::Apps::Modules::WorksheetMaker::Input;
use ONO::Lib::Data::Color;
use ONO::Lib::PDF::Draw;
use ONO::Lib::PDF::ToolBox;
use ONO::Lib::PDF::Elements::Brick;
use ONO::Lib::PDF::Elements::Dice;
use ONO::Lib::PDF::Elements::Sticker;
use ONO::Lib::UI::Sticker;
use ONO::FW::Apps::Core;
use ONO::FW::Apps::Core::Graphics;
use ONO::FW::Edu::Apps::Modules::MathRods;
use ONO::FW::Edu::Apps::Modules::Money;
use ONO::Lib::Parser;
use ONO::IO;
use ONO::FW::Apps::PDF;
use ONO::FW::Apps::ToolBox;
use ONO::FW::Edu::Apps::Modules::MathCount;
sub learn {
my (
$self,
$option,
$vars_ref,
$HTTP,
$BASE,
) = @_;
################################################################
# INIT - BEGIN
################################################################
my (
$db,
$community,
$action_url,
$form,
$format,
$canvas,
$pdfkey,
$sec,$min,$hour,
$mday,$mon,$year,
$wday,$yday,$timestamp,
$lang,
$BLK_ref,
$vars_ref,
) = ONO::FW::Apps::Core->init($vars_ref);
my %vars = %$vars_ref;
my %BLK = %$BLK_ref;
my $app = "houses";
ONO::FW::Apps::Core->now("",$app,$vars{'app_lang'});
my $WEB;
my @txt = (
"display sum (roof)",
);
if ($vars{'app_lang'} eq "de") {
@txt = (
"Summe anzeigen (Dach)",
);
}
if ($vars{'app_lang'} eq "lu") {
@txt = (
"Total uweisen (Daach)",
);
}
if ($vars{'app_lang'} eq "fr") {
@txt = (
"afficher la somme (toit)",
);
}
$WEB .= ONO::FW::Apps::Core->output_paper_save($pdfkey,$BLK_ref,\%vars,$HTTP,$BASE,"$year$mon$mday");
if (ONO::FW::Apps::Core->running(\%vars,$db)) {
$WEB .= ONO::FW::Apps::Core->blockbackbutton($BASE,$vars_ref);
($vars{'app_input_range_from'},$vars{'app_input_range_to'}) = ONO::FW::Apps::Core->range_check(50,100,$vars{'app_input_range_from'},$vars{'app_input_range_to'});
#############################################################
# WORKSHEET MAKER
#############################################################
if ($vars{'output_worksheet_maker'}) {
$vars_ref = ONO::FW::Edu::Apps::Modules::WorksheetMaker::Input->vars(\%vars);
%vars = %$vars_ref;
}
#############################################################
# PDF + ONLINE
#############################################################
my ($types_ref,$types_num) = ONO::FW::Edu::Apps::Modules::MathCount->types_detect(\%vars);
my @types = @$types_ref;
my @colors = ONO::Lib::Data::Color->rainbow("10");
if ($vars{'output_paper'} || $vars{'output_web'}) {
my @defs = ONO::FW::Apps::Core::Graphics->image_ids();
my $defs_num = @defs;
my $defs_ref = \@defs;
my $OPTS = ONO::FW::Apps::Core->headers_options($BLK_ref,$vars_ref);
if ($vars{'output_paper'}) {
$WEB = ONO::FW::Apps::Core->output_paper($pdfkey,\%BLK,\%vars,$HTTP,$BASE);
ONO::FW::Apps::PDF->new("$BASE/pdf/pdf-$pdfkey.pdf","",$format);
}
my $question_number = $vars{'output_web_question_number'};
foreach my $copy (ONO::FW::Apps::Core->unique_copies($vars{'app_input_print_options_unique_copies'})) {
if ($vars{'output_web'}) {
if ($vars{'output_web_next_question'}) {
foreach my $key (keys %vars) {
if ($key =~ /^output_web_cache_/) {
$vars{$key} = "";
}
}
$vars{'output_web_answer'} = "";
}
$WEB .= qq~<$form>~;
$WEB .= ONO::FW::Apps::Core->question_progress($vars{'app_input_number_of_questions'},$question_number);
$WEB .= ONO::FW::Apps::Core->stats("",$BLK_ref,"ctTmWvV");
}
if ($vars{'output_paper'}) {
if ($copy > 1) {
ONO::FW::Apps::PDF->page("",$format);
}
ONO::FW::Apps::Core->headers(\%vars,$format);
ONO::FW::Apps::PDF->title($vars{'app_input_print_options_title'},$OPTS,$vars{'app_input_print_options_code'},$format);
ONO::FW::Apps::Core->unique_copies_info($canvas,$copy,$vars_ref);
ONO::FW::Apps::Core::Graphics->pdf_draw_item_numbers($canvas,-2,0,1,4,"HLV",$vars_ref);
# ONO::Lib::PDF::ToolBox->canvas_test($canvas);
}
my (@corr_cache,$corr_counter,@corr_pdf,%used,$HTML);
my $HTML_WIDTH = 522;
my $HTML_INPUT;
my ($pdf_x,$pdf_y) = (5,0);
my ($max_x,$max_y) = (1,1);
if ($vars{'output_paper'}) {
($max_x,$max_y) = (3,4);
}
for (my $y = 0; $y < $max_y; $y++) {
for (my $x = 0; $x < $max_x; $x++) {
my $num = $vars{'output_web_cache_num'};
my $type = $vars{'output_web_cache_type'};
my $exercise = "houses";
if ($vars{'app_input_execise_draw'}) {
$exercise = "draw";
if ($vars{'app_input_execise_houses'} && int(rand(100)) > 50) {
$exercise = "houses";
}
}
if (!$num || $type eq "" || $vars{'output_web_next_question'}) {
$type = $types[int(rand($types_num))];
my $whilecounter;
while ($whilecounter < 32 && $used{"type_$type"}) {
$whilecounter++;
$type = $types[int(rand($types_num))];
}
if ($vars{'app_input_range_mode'} eq "list") {
my @opts;
foreach my $opt (split(/\,/,",$vars{'app_input_range_list'},")) {
$opt =~ s~[^0-9]~~g;
if ($opt > 0 && $opt < 21) {
@opts = (@opts,$opt);
}
}
my $opts_num = @opts;
$num = $opts[int(rand($opts_num))];
while ($whilecounter < 64 && $used{"num_$num"}) {
$whilecounter++;
$num = $opts[int(rand($opts_num))];
}
} else {
$num = ONO::FW::Apps::Core->random_number(1,$vars{'app_input_range_to'},1,20,\%vars);
while ($whilecounter < 64 && ($used{"num_$num"} || $num < 2 || ($num < 3 && int(rand(100) > 50)) || ($num < 4 && int(rand(100) > 75)))) {
$whilecounter++;
$num = ONO::FW::Apps::Core->random_number(1,$vars{'app_input_range_to'},1,20,\%vars);
}
}
if (!$num) {
$num = 10;
}
my $num1 = ONO::FW::Apps::Core->random_number(1,$num,1,20,\%vars);
while ($whilecounter < 92 && $used{"num1_$num1"}) {
$whilecounter++;
$num1 = ONO::FW::Apps::Core->random_number(1,$num,1,20,\%vars);
}
my $num2 = $num - $num1;
$used{"type_$type"}++;
$used{"num_$num"}++;
$used{"num1_$num1"}++;
# draw house
my $roof_num;
if ($vars{'app_input_display_num_sum'}) {
$roof_num = $num;
}
ONO::FW::Apps::Core::Graphics->pdf_draw_house($canvas,$x*60+5,$y*47.5+2.5,"2:2",$roof_num,"+",0,0,"i");
# draw numbers
my ($left,$right) = &left_right("",$vars{'app_input_display_num_subs'});
if ($left) {
ONO::Lib::PDF::Draw->text($canvas,$x*60+16.5,$y*47.5+40.5,$num1,"c");
}
if ($right) {
ONO::Lib::PDF::Draw->text($canvas,$x*60+38.5,$y*47.5+40.5,$num2,"c");
}
# draw images
my ($left,$right) = &left_right("",$vars{'app_input_display_images'});
my ($c1,$c2,$c3) = (50+int(rand(150)),50+int(rand(150)),50+int(rand(150)));
if ($left) {
&draw_images("",$canvas,$x*60+6.5,$y*47.5+20,$type,$num1,"0:$c1:$c2:$c3",\@colors);
}
if ($right) {
&draw_images("",$canvas,$x*60+28.5,$y*47.5+20,$type,$num2,"0:$c1:$c2:$c3",\@colors);
}
# used cache
$used{"num_$num"}++;
$corr_cache[$corr_counter] = "$num\^$type\^$exercise\^$num1\^$num2\^";
$corr_counter++;
}
my $pos_x = 5;
my $pos_y = 5;
# web end:
if ($vars{'output_web'}) {
my ($stat_correct,$stat_wrong,$stat_todo_total) = (1,1,1);
if ($vars{'output_web_answer'}) {
$vars{'output_web_answer_status'} = 2;
if ($vars{'output_web_answer'} == $num) {
$vars{'output_web_answer_status'} = 1;
} else {
$vars{'output_web_mistakes'}++;
}
}
my $INPUT = ONO::FW::Apps::Core->input_vars(\%vars);
$WEB .= qq~ <div class="abs" style="top:0px;left:0px;width:920px;padding-top:40px">
<div class="inline auto" style="width:${HTML_WIDTH}px">
<div class="inline">$HTML</div>
</div>
</div>
$INPUT
<input type="hidden" name="output_web_cache_type" value="$type">
<input type="hidden" name="output_web_cache_num" value="$num">
$HTML_INPUT
<div class="abs" style="bottom:5px;left:0px;width:920px">
<div class="inline auto">
~;
$WEB = ONO::FW::Apps::Core->stats_replace($WEB,$question_number,$stat_wrong,$stat_todo_total,$vars{'output_web_mistakes'});
$WEB .= ONO::FW::Apps::Core->check_single(
"",
"",
100,
3,
$BLK_ref,
\%vars,
"CnmMS",
$num,
);
$WEB .= qq~ </div>
</div>
</form>
~;
}
$pdf_x = $pdf_x + 57.5;
}
$pdf_x = 5;
$pdf_y = $pdf_y + 47.5;
}
if ($vars{'output_paper'} && ONO::FW::Apps::Core->print_corrections("$BASE/pdf/pdf-$pdfkey-corr.pdf","",$format,$vars_ref)) {
ONO::FW::Apps::Core->headers(\%vars,$format,"c");
ONO::FW::Apps::PDF->title($BLK{'Corrections'},$OPTS,$vars{'app_input_print_options_code'},$format);
ONO::FW::Apps::Core->unique_copies_info($canvas,$copy,$vars_ref);
ONO::FW::Apps::Core::Graphics->pdf_draw_item_numbers($canvas,-2,0,1,4,"CHLV",$vars_ref);
# ONO::Lib::PDF::ToolBox->canvas_test($canvas);
my $corr_counter;
my ($pdf_x,$pdf_y) = (5,0);
for (my $y = 0; $y < 4; $y++) {
for (my $x = 0; $x < 3; $x++) {
my @corr = split(/\^/,$corr_cache[$corr_counter]);
ONO::FW::Apps::Core::Graphics->pdf_draw_house($canvas,$x*60+5,$y*47.5+2.5,"2:2",$corr[0],"+",0,1,"i");
# draw images
&draw_images("",$canvas,$x*60+6.5,$y*47.5+20,$corr[1],$corr[3],"0:111:111:111",\@colors,"C");
&draw_images("",$canvas,$x*60+28.5,$y*47.5+20,$corr[1],$corr[4],"0:111:111:111",\@colors,"C");
# draw numbers
ONO::Lib::PDF::Draw->text($canvas,$x*60+16.5,$y*47.5+40.5,$corr[3],"c");
ONO::Lib::PDF::Draw->text($canvas,$x*60+38.5,$y*47.5+40.5,$corr[4],"c");
$corr_counter++;
$pdf_x = $pdf_x + 57.5;
}
foreach my $corr (@corr_pdf) {
my @cp = split(/\^/,$corr);
if ($cp[0] eq "circle") {
ONO::Lib::PDF::Draw->circle($canvas,$cp[1],$cp[2],$cp[3],$cp[4],"0:111:111:111","0:111:111:111");
}
if ($cp[0] eq "brick") {
ONO::Lib::PDF::Elements::Brick->brick($canvas,$cp[1],$cp[2],$cp[3],$cp[4],$cp[5],$cp[6],"0:111:111:111");
}
if ($cp[0] eq "dice" || $cp[0] eq "dices") {
ONO::Lib::PDF::Elements::Dice->dice($canvas,$cp[1],$cp[2],$cp[3],$cp[4],"","0:111:111:111");
}
if ($cp[0] eq "stickers") {
ONO::Lib::PDF::Elements::Sticker->sticker($canvas,$cp[1],$cp[2],$cp[4],$cp[4],$cp[3],"","bcsW");
}
if ($cp[0] eq "image") {
ONO::Lib::PDF::Draw->image($canvas,$cp[1],$cp[2],$cp[3],$cp[4],$cp[5],$cp[6],$cp[7]);
}
}
$pdf_x = 5;
$pdf_y = $pdf_y + 47.5;
}
}
}
if ($vars{'output_paper'}) {
ONO::FW::Apps::PDF->end;
}
}
if ($vars{'output_web'}) {
ONO::FW::Apps::Core->varstore($vars{'username'},$vars{'virclass'},$vars{'anonymous'},\%vars);
}
} else {
#############################################################
# EXERCISE SETUP
#############################################################
# "screen:320:50:40::math_houses_img_screenshot_1.jpg",
$WEB .= ONO::FW::Apps::Core->infopics(
"sheet:168:190:140:15:math_houses_img_sheet_1.jpg",
"sheet:168:40:150:-10:math_houses_img_sheet_2.jpg",
);
my @opts = ONO::FW::Edu::Apps::Modules::MathCount->opts($BLK_ref);
my $type_found = ONO::FW::Edu::Apps::Modules::MathCount->type_found(\%vars,$BLK_ref);
if (!$type_found) {
$vars{"app_input_type_dots"} = 1;
$vars{"app_input_type_rods"} = 1;
$vars{"app_input_type_dices"} = 1;
$vars{"app_input_type_images"} = 1;
}
my ($CUSTOM,$SCRIPT_END) = ONO::FW::Edu::Apps::Modules::MathCount->type_select(\%vars,$BLK_ref);
my ($SCRIPT,%OPTS,%CUSTOM);
if (!$vars{'output_paper'} && !$vars{'app_input_display_num_sum'} && !$vars{'app_input_display_num_subs'} && !$vars{'app_input_display_images'}) {
$vars{'app_input_display_num_sum'} = 1;
$vars{'app_input_display_num_subs'} = "random";
$vars{'app_input_display_images'} = "random";
}
foreach my $opt ('num_subs','images') {
foreach my $opt2 (
"none^$BLK{'none'}",
"left^$BLK{'left'}",
"right^$BLK{'right'}",
"random^$BLK{'random'} ($BLK{'left'}/$BLK{'right'})",
) {
my @op = split(/\^/,$opt2);
my $sel;
if ($vars{"app_input_display_$opt"} eq $op[0]) {
$sel = " selected";
}
$OPTS{$opt} .= qq~<option value="$op[0]"$sel>$op[1]</option>~;
}
$CUSTOM{$opt} = qq~<div class="select"><select name="app_input_display_$opt">$OPTS{$opt}</select></div>~;
}
my $CONF .= ONO::FW::Apps::ToolBox->conf_input("range", $BLK_ref,\%vars,"",1,10,20,"F");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"S","","display_num_sum",$vars{'app_input_display_num_sum'},qq~<div class="lh100">$txt[0]</div>~);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"",$BLK{'numbers'},$CUSTOM{'num_subs'});
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"",$BLK{'images'},$CUSTOM{'images'});
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"","",$CUSTOM);
$WEB .= ONO::FW::Apps::Core->conf_box(
$db,
$community,
$app,
$form,
"",
$action_url,
$CONF,
$lang,
$BLK_ref,
\%vars,
"p-ncbdi-CDI-u-N",
);
$SCRIPT .= ONO::FW::Edu::Apps::Modules::MathCount->script();
$WEB .= qq~$SCRIPT$SCRIPT_END~;
if ($vars{'app_input_currency'}) {
$WEB .= qq~<script>use_box_select('$vars{'app_input_currency'}')</script>~;
}
if (!$vars{'exercise'}) {
$WEB .= ONO::FW::Apps::Core->info_display(
ONO::FW::Apps::Core->info("info_print",$vars{'app_lang'}),
ONO::FW::Apps::Core->info("info_indiv_diff", $vars{'app_lang'}),
);
}
}
my ($status,$WEB) = ONO::Lib::Parser->parse($WEB,$vars_ref);
$WEB .= ONO::FW::Apps::Core->vardump($vars_ref);
$WEB = ONO::FW::Edu::Apps::ToolBox->apps_gate($WEB,$vars_ref);
return $WEB;
}
sub draw_images {
my (
$self,
$canvas,
$pdf_x,
$pdf_y,
$type,
$num,
$color,
$colors_ref,
$switches,
) = @_;
# -C corrections
if (ONO::IO->devstation) {
# ONO::Lib::PDF::Draw->rect($canvas,$pdf_x,$pdf_y,$pdf_x+19.5,$pdf_y+13.5);
}
my @colors = @$colors_ref;
my $counter;
if ($type eq "dots" || $type eq "dotsr") {
for (my $y = 0; $y < 4; $y++) {
for (my $x = 0; $x < 5; $x++) {
if ($counter < $num) {
my $color2 = ONO::Lib::PDF::Draw->color_calc($color,20-int(rand(40)));
if ($type eq "dotsr") {
my ($rand1,$rand2) = (int(rand(10))/10,int(rand(10))/10);
ONO::Lib::PDF::Draw->circle($canvas,$pdf_x+$x*4+1.75+$rand1-0.5,$pdf_y+$y*3.5+1.5+$rand2-0.5,1.25,0,$color2,$color);
} else {
ONO::Lib::PDF::Draw->circle($canvas,$pdf_x+$x*4+1.75,$pdf_y+$y*3.5+1.5,1.5,0,$color2,$color);
}
}
$counter++;
}
}
}
if ($type eq "rods") {
my $rest = $num;
for (my $y = 0; $y < 4; $y++) {
if ($rest > 0) {
my $brick = 5;
my $color = $colors[$brick-1];
if ($rest < 5) {
$brick = $rest;
}
if ($switches =~ /C/) {
$color = "0:222:222:222";
}
ONO::Lib::PDF::Elements::Brick->brick($canvas,$pdf_x+1,$pdf_y+$y*3.4-0.25,$brick,1,3.5,1,$color);
$rest = $rest - 5;
}
}
}
if ($type eq "dices") {
my $color = "0:111:111:111";
if ($switches !~ /C/) {
$color = "";
}
if ($num < 7) {
ONO::Lib::PDF::Elements::Dice->dice($canvas,$pdf_x+4,$pdf_y+0.5,$num,12,"",$color);
} else {
if ($num < 13) {
ONO::Lib::PDF::Elements::Dice->dice($canvas,$pdf_x+2,$pdf_y+0.5,6,8,"",$color);
ONO::Lib::PDF::Elements::Dice->dice($canvas,$pdf_x+9,$pdf_y+4.5,$num-6,8,"",$color);
} else {
if ($num < 19) {
ONO::Lib::PDF::Elements::Dice->dice($canvas,$pdf_x+2,$pdf_y+0.5,6,6.5,"",$color);
ONO::Lib::PDF::Elements::Dice->dice($canvas,$pdf_x+6,$pdf_y+6,6,6.5,"",$color);
ONO::Lib::PDF::Elements::Dice->dice($canvas,$pdf_x+11.5,$pdf_y+2.5,$num-12,6.5,"",$color);
} else {
ONO::Lib::PDF::Elements::Dice->dice($canvas,$pdf_x+2,$pdf_y+0.5,6,6,"",$color);
ONO::Lib::PDF::Elements::Dice->dice($canvas,$pdf_x+9.5,$pdf_y+1.5,6,6,"",$color);
ONO::Lib::PDF::Elements::Dice->dice($canvas,$pdf_x+4.5,$pdf_y+6,6,6,"",$color);
ONO::Lib::PDF::Elements::Dice->dice($canvas,$pdf_x+11.5,$pdf_y+6.5,$num-18,6,"",$color);
}
}
}
}
}
sub left_right {
my ($left,$right) = (0,0);
if ($_[1] eq "left" || $_[1] eq "all") {
$left = 1;
}
if ($_[1] eq "right" || $_[1] eq "all") {
$right = 1;
}
if ($_[1] eq "random") {
if (int(rand(100)) > 49) {
$left = 1;
} else {
$right = 1;
}
}
return ($left,$right);
}
###################################################################
#### THAT'S IT :-D
###################################################################
1;
__END__