From e9b990a2e314b223e34bc2f9a6d46b09639bdfd2 Mon Sep 17 00:00:00 2001 From: Nexusnui <131207888+Nexusnui@users.noreply.github.com> Date: Tue, 24 Oct 2023 21:02:53 +0200 Subject: [PATCH 01/17] moved color check to new brickcolor.py -added brickcolor.py -moved color check from app.py to brickcolor.py --- app/app.py | 32 ++++++-------------------------- app/brickcolor.py | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 26 deletions(-) create mode 100644 app/brickcolor.py diff --git a/app/app.py b/app/app.py index 89a1db6..2340bb4 100644 --- a/app/app.py +++ b/app/app.py @@ -1,4 +1,5 @@ from stlToDat import stlToDat +from brickcolor import isBrickColor import customtkinter from tkinter import messagebox as tkMessageBox import os @@ -81,6 +82,10 @@ def convertFile(self): color_code = "16" if self.color_toggle_Var.get() == "on": color_code = self.color_code_Var.get() + color_check = isBrickColor(color_code) + if not color_check[0]: + tkMessageBox.showwarning(color_check[1], color_check[2]) + return if not os.path.isfile(input_file_path): tkMessageBox.showwarning("invalid input file", f"'{input_file_path}' is not a valid input file") @@ -92,32 +97,7 @@ def convertFile(self): tkMessageBox.showwarning("invalid output directory", f"'{os.path.dirname(output_file_path)}' is not a valid output directory") return - elif len(color_code) < 1: - tkMessageBox.showwarning("No Color Code", "Apply Checkbox was toggled, but no color code provided") - return - elif not color_code.startswith("0x2"): - if not color_code.isdigit(): - tkMessageBox.showwarning("Invalid Color Code", - "The provided color code is not a number.\n " - "Use a code from the LDraw Colour Definition Reference.\n" - "If you wanted to use a Direct/HTML color the format is 0x2RRGGBB " - "(R,B and G are hexadecimal).") - return - elif color_code.startswith("0x2"): - if len(color_code) > 9: - tkMessageBox.showwarning("Invalid Color Code", - "The provided color seems to be a Direct/HTML color but is to long.") - return - elif len(color_code) < 9: - tkMessageBox.showwarning("Invalid Color Code", - "The provided color seems to be a Direct/HTML color but is to short.") - return - for i in range(2, 9): - if color_code[i] not in ["A", "B", "C", "D", "E", "F"] and not color_code[i].isdigit(): - tkMessageBox.showwarning("Invalid Color Code", - f"The provided color seems to be a Direct/HTML color, but contains a invalid charcter at position: {i-2} - '{color_code[i]}'.\n" - f"Valid characters are 0-9 and A-F(uppercase)") - return + number_triangles = stlToDat(input_file_path, output_file_path, color_code) tkMessageBox.showwarning('Converted File', f'stl file converted to "{output_file_path}"\n' f'Part contains {number_triangles} triangles.') diff --git a/app/brickcolor.py b/app/brickcolor.py new file mode 100644 index 0000000..d0ae717 --- /dev/null +++ b/app/brickcolor.py @@ -0,0 +1,24 @@ +def isBrickColor(color_code: str): + if len(color_code) < 1: + return False, "No Color Code", "Apply Checkbox was toggled, but no color code provided" + elif not color_code.startswith("0x2"): + if not color_code.isdigit(): + return (False, "Invalid Color Code", + f"The provided color code '{color_code}' is not a number.\n " + f"Use a code from the LDraw Colour Definition Reference.\n" + f"If you wanted to use a Direct/HTML color the format is 0x2RRGGBB " + f"(R,B and G are hexadecimal).") + elif color_code.startswith("0x2"): + if len(color_code) > 9: + return (False, "Invalid Color Code", + f"The provided color '{color_code}' seems to be a Direct/HTML color but is to long.") + elif len(color_code) < 9: + return (False, "Invalid Color Code", + f"The provided color '{color_code}' seems to be a Direct/HTML color but is to short.") + for i in range(2, 9): + if color_code[i] not in ["A", "B", "C", "D", "E", "F"] and not color_code[i].isdigit(): + return (False, "Invalid Color Code", + f"The provided color '{color_code}' seems to be a Direct/HTML color, " + f"but contains a invalid charcter at position: {i - 2} - '{color_code[i]}'.\n" + f"Valid characters are 0-9 and A-F(uppercase)") + return (True,) \ No newline at end of file From 096a1aca2bded1fa815814f0eeaf3588e6ae4b85 Mon Sep 17 00:00:00 2001 From: Nexusnui <131207888+Nexusnui@users.noreply.github.com> Date: Wed, 25 Oct 2023 00:09:29 +0200 Subject: [PATCH 02/17] brickcolor class and csv -added brickcolor class -added csv with color values --- app/BrickColors.csv | 205 ++++++++++++++++++++++++++++++++++++++++++++ app/brickcolor.py | 19 +++- 2 files changed, 223 insertions(+), 1 deletion(-) create mode 100644 app/BrickColors.csv diff --git a/app/BrickColors.csv b/app/BrickColors.csv new file mode 100644 index 0000000..a10925f --- /dev/null +++ b/app/BrickColors.csv @@ -0,0 +1,205 @@ +LDrawName;LDrawID;Value;Edge;Alpha;Luminance;Material;LegoName;LegoID +Black;0;#1B2A34;#808080;;;;Black;26 +Blue;1;#1E5AA8;#333333;;;;Bright Blue;23 +Green;2;#00852B;#333333;;;;Dark Green;28 +Dark_Turquoise;3;#069D9F;#333333;;;;Bright Bluish Green;107 +Red;4;#B40000;#333333;;;;Bright Red;21 +Dark_Pink;5;#D3359D;#333333;;;;Medium Reddish Violet / Bright Purple;22 / 221 +Brown;6;#543324;#1E1E1E;;;;Earth Orange;25 +Light_Grey;7;#8A928D;#333333;;;;Grey;2 +Dark_Grey;8;#545955;#333333;;;;Dark Grey;27 +Light_Blue;9;#97CBD9;#333333;;;;Light Blue;45 +Bright_Green;10;#58AB41;#333333;;;;Bright Green;37 +Light_Turquoise;11;#00AAA4;#333333;;;;Medium Bluish Green;116 +Salmon;12;#F06D61;#333333;;;;Medium Red;101 +Pink;13;#F6A9BB;#333333;;;;Light Reddish Violet;9 +Yellow;14;#FAC80A;#333333;;;;Bright Yellow;24 +White;15;#F4F4F4;#333333;;;;White;1 +Light_Green;17;#ADD9A8;#333333;;;;Light Green;6 +Light_Yellow;18;#FFD67F;#333333;;;;Light Yellow;3 +Tan;19;#B0A06F;#333333;;;;Brick Yellow;5 +Light_Violet;20;#AFBED6;#333333;;;;Light Bluish Violet;39 +Purple;22;#671F81;#333333;;;;Bright Violet;104 +Dark_Blue_Violet;23;#0E3E9A;#333333;;;;Dark Royal Blue;196 +Orange;25;#D67923;#333333;;;;Bright Orange;106 +Magenta;26;#901F76;#333333;;;;Bright Reddish Violet;124 +Lime;27;#A5CA18;#333333;;;;Bright Yellowish Green;119 +Dark_Tan;28;#897D62;#333333;;;;Sand Yellow;138 +Bright_Pink;29;#FF9ECD;#333333;;;;Light Purple;222 +Medium_Lavender;30;#A06EB9;#333333;;;;Medium Lavender;324 +Lavender;31;#CDA4DE;#333333;;;;Lavender;325 +Very_Light_Orange;68;#FDC383;#333333;;;;Light Yellowish Orange;36 +Bright_Reddish_Lilac;69;#8A12A8;#333333;;;;Bright Reddish Lilac;198 +Reddish_Brown;70;#5F3109;#808080;;;;Reddish Brown;192 +Light_Bluish_Grey;71;#969696;#333333;;;;Medium Stone Grey;194 +Dark_Bluish_Grey;72;#646464;#333333;;;;Dark Stone Grey;199 +Medium_Blue;73;#7396C8;#333333;;;;Medium Blue;102 +Medium_Green;74;#7FC475;#333333;;;;Medium Green;29 +Light_Pink;77;#FECCCF;#333333;;;;Light Pink;223 +Light_Nougat;78;#FFC995;#333333;;;;Light Nougat;283 +Medium_Nougat;84;#AA7D55;#333333;;;;Medium Nougat;312 +Medium_Lilac;85;#441A91;#333333;;;;Medium Lilac;268 +Medium_Brown;86;#7B5D41;#333333;;;;Brown;217 +Blue_Violet;89;#1C58A7;#333333;;;;Medium Royal Blue;195 +Nougat;92;#BB805A;#333333;;;;Nougat;18 +Light_Salmon;100;#F9B7A5;#333333;;;;Light Red;100 +Violet;110;#26469A;#333333;;;;Bright Bluish Violet;110 +Medium_Violet;112;#4861AC;#333333;;;;Medium Bluish Violet;112 +Medium_Lime;115;#B7D425;#333333;;;;Medium Yellowish Green;115 +Aqua;118;#9CD6CC;#333333;;;;Light Bluish Green;118 +Light_Lime;120;#DEEA92;#333333;;;;Light Yellowish Green;120 +Light_Orange;125;#F9A777;#333333;;;;Light Orange;125 +Dark_Nougat;128;#AD6140;#333333;;;;Dark Nougat;128 +Very_Light_Bluish_Grey;151;#C8C8C8;#333333;;;;Light Stone Grey;208 +Bright_Light_Orange;191;#FCAC00;#333333;;;;Flame Yellowish Orange;191 +Bright_Light_Blue;212;#9DC3F7;#333333;;;;Light Royal Blue;212 +Rust;216;#872B17;#333333;;;;Rust;216 +Reddish_Lilac;218;#8E5597;#333333;;;;Reddish Lilac;218 +Lilac;219;#564E9D;#333333;;;;Lilac;219 +Bright_Light_Yellow;226;#FFEC6C;#333333;;;;Cool Yellow;226 +Sky_Blue;232;#77C9D8;#333333;;;;Dove Blue;232 +Dark_Blue;272;#19325A;#333333;;;;Earth Blue;140 +Dark_Green;288;#00451A;#808080;;;;Earth Green;141 +Flamingo_Pink;295;#FF94C2;#333333;;;;Flamingo Pink;295 +Dark_Brown;308;#352100;#808080;;;;Dark Brown;308 +Maersk_Blue;313;#ABD9FF;#333333;;;;Pastel Blue;11 +Dark_Red;320;#720012;#333333;;;;New Dark Red;154 +Dark_Azure;321;#469BC3;#333333;;;;Dark Azur;321 +Medium_Azure;322;#68C3E2;#333333;;;;Medium Azur;322 +Light_Aqua;323;#D3F2EA;#333333;;;;Aqua;323 +Yellowish_Green;326;#E2F99A;#333333;;;;Spring Yellowish Green;326 +Olive_Green;330;#77774E;#333333;;;;Olive Green;330 +Sand_Red;335;#88605E;#333333;;;;Sand Red;153 +Medium_Dark_Pink;351;#F785B1;#333333;;;;Pink;16 +Coral;353;#FF6D77;#333333;;;;Vibrant Coral;353 +Earth_Orange;366;#D86D2C;#333333;;;;Light Orange Brown;12 +Vibrant_Yellow;368;#EDFF21;#333333;;;;Vibrant Yellow;368 +Medium_Brown;370;#755945;#333333;;;;Medium Brown;370 +Sand_Purple;373;#75657D;#333333;;;;Sand Violet;136 +Sand_Green;378;#708E7C;#333333;;;;Sand Green;151 +Sand_Blue;379;#70819A;#333333;;;;Sand Blue;135 +Fabuland_Brown;450;#D27744;#333333;;;;Brick Red;4 +Medium_Orange;462;#F58624;#333333;;;;Bright Yellowish Orange;105 +Dark_Orange;484;#91501C;#333333;;;;Dark Orange;38 +Very_Light_Grey;503;#BCB4A5;#333333;;;;Light Grey;103 +Light_Orange_Brown;507;#FA9C1C;#333333;;;;Light Orange Brown;12 +Fabuland_Red;508;#FF8014;#333333;;;;Red Orange;13 +Fabuland_Orange;509;#CF8A47;#333333;;;;Light Brown;19 +Fabuland_Pastel_Green;510;#78FC78;#333333;;;;Pastel Green;14 +Trans_Dark_Blue;33;#0020A0;#000B38;128;;;Transparent Blue;43 +Trans_Green;34;#237841;#174F2B;128;;;Transparent Green;48 +Trans_Bright_Green;35;#56E646;#27AF18;128;;;Transparent Bright Green;311 +Trans_Red;36;#C91A09;#660D05;128;;;Transparent Red;41 +Trans_Dark_Pink;37;#DF6695;#B9275F;128;;;Transparent Medium Reddish Violet;113 +Trans_Neon_Orange;38;#FF800D;#A85100;128;;;Transparent Fluorescent Reddish Orange;47 +Trans_Very_Light_Blue;39;#C1DFF0;#6FB4DC;128;;;Transparent Light Bluish Green;229 +Trans_Black;40;#635F52;#2A2823;128;;;Transparent Brown;111 +Trans_Medium_Blue;41;#559AB7;#326276;128;;;Transparent Fluorescent Blue;143 +Trans_Neon_Green;42;#C0FF00;#739900;128;;;Transparent Fluorescent Green;49 +Trans_Light_Blue;43;#AEE9EF;#59D1DE;128;;;Transparent Light Blue;42 +Trans_Bright_Reddish_Lilac;44;#96709F;#5F4365;128;;;Transparent Bright Reddish Lilac;236 +Trans_Pink;45;#FC97AC;#F9345B;128;;;Transparent Bright Pink;230 +Trans_Yellow;46;#F5CD2F;#B49208;128;;;Transparent Yellow;44 +Trans_Clear;47;#FCFCFC;#C9C9C9;128;;;Transparent;40 +Trans_Purple;52;#A5A5CB;#6464A6;128;;;Transparent Bright Bluish Violet;126 +Trans_Neon_Yellow;54;#DAB000;#755E00;128;;;Transparent Fluorescent Yellow;157 +Trans_Orange;57;#F08F1C;#9E5C0A;128;;;Trans Bright Orange;182 +Trans_Bright_Light_Green;227;#B5D96C;#86B22E;128;;;Transparent Bright Yellowish Green;227 +Trans_Bright_Light_Orange;231;#FCB76D;#FA860A;128;;;Transparent Flame Yellowish Orange;231 +Trans_Fire_Yellow;234;#FBE890;#F7D22B;128;;;Transparent Fire Yellow;234 +Trans_Reddish_Lilac;284;#C281A5;#944771;128;;;Transparent Reddish Lilac;284 +Trans_Light_Green;285;#7DC291;#46955D;128;;;Transparent Light Green;285 +Trans_Light_Blue_Violet;293;#6BABE4;#247BC6;128;;;Transparent Light Royal Blue;293 +Chrome_Antique_Brass;60;#645A4C;#665B4D;;;CHROME;; +Chrome_Blue;61;#6C96BF;#3D638A;;;CHROME;; +Chrome_Green;62;#3CB371;#226741;;;CHROME;; +Chrome_Pink;63;#AA4D8E;#632C52;;;CHROME;; +Chrome_Black;64;#1B2A34;#3D5F76;;;CHROME;; +Chrome_Gold;334;#DFC176;#C2982E;;;CHROME;Metalized Gold;310 +Chrome_Silver;383;#CECECE;#9C9C9C;;;CHROME;Metalized Silver;309 +Metallic_Black;83;#0A1327;#333333;;;PEARLESCENT;Metallic Black;149 +Copper;134;#764D3B;#333333;;;PEARLESCENT;Copper;139 +Pearl_Light_Grey;135;#A0A0A0;#333333;;;PEARLESCENT;Cool Silver / Silver / Silver Metallic;296 / 131 / 315 +Metallic_Blue;137;#5B7590;#333333;;;PEARLESCENT;Sand Blue Metallic;145 +Pearl_Light_Gold;142;#DEAC66;#333333;;;PEARLESCENT;Gold;127 +Pearl_Dark_Grey;148;#484D48;#333333;;;PEARLESCENT;Metallic Dark Grey;148 +Pearl_Very_Light_Grey;150;#989B99;#333333;;;PEARLESCENT;Metallic Light Grey;150 +Flat_Dark_Gold;178;#83724F;#333333;;;PEARLESCENT;Metallic Sand Yellow;147 +Flat_Silver;179;#898788;#333333;;;PEARLESCENT;Silver Flip-flop;179 +Pearl_White;183;#F6F2DF;#333333;;;PEARLESCENT;Metallic White;183 +Metallic_Bright_Red;184;#D60026;#333333;;;PEARLESCENT;Metallic Bright Red;184 +Metallic_Bright_Blue;185;#0059A3;#333333;;;PEARLESCENT;Metallic Bright Blue;185 +Metallic_Dark_Green;186;#008E3C;#333333;;;PEARLESCENT;Metallic Dark Green;186 +Reddish_Gold;189;#AC8247;#333333;;;PEARLESCENT;Reddish Gold;189 +Lemon_Metallic;200;#708224;#333333;;;PEARLESCENT;Lemon Metallic;200 +Pearl_Gold;297;#AA7F2E;#333333;;;PEARLESCENT;Warm Gold;297 +Metallic_Silver;80;#767676;#333333;;;METAL;Cool Silver Drum Lacq / Silver Ink;298 / 336 +Metallic_Green;81;#C2C06F;#333333;;;METAL;; +Metallic_Gold;82;#DBAC34;#333333;;;METAL;Warm Gold Drum Lacq / Gold Ink;299 / 335 +Metallic_Dark_Grey;87;#3E3C39;#333333;;;METAL;Titanium;337 +Metallic_Copper;300;#C27F53;#333333;;;METAL;Copper Drum Lacq / Copper Ink;300 / 334 +Metallic_Light_Blue;10045;#97CBD9;#333333;;;METAL;; +Metallic_Pink;10046;#AD659A;#333333;;;METAL;; +Metallic_Light_Pink;10049;#FECCCF;#333333;;;METAL;; +Milky_White;79;#EEEEEE;#BABABA;240;;;Nature;20 +Glow_In_Dark_Opaque;21;#E0FFB0;#B8FF4D;240;15;;Phosphorescent Green;294 +Glow_In_Dark_Trans;294;#BDC6AD;#8D9D72;240;15;;Phosphorescent White;50 +Glow_In_Dark_White;329;#F5F3D7;#E0DA85;240;15;;White Glow;329 +Glitter_Trans_Dark_Pink;114;#DF6695;#B9275F;128;;MATERIAL GLITTER VALUE #B92790 FRACTION 0.17 VFRACTION 0.2 SIZE 1;Transparent Medium Reddish-Violet w. Glitter 2%;114 +Glitter_Trans_Clear;117;#EEEEEE;#BABABA;128;;MATERIAL GLITTER VALUE #FFFFFF FRACTION 0.08 VFRACTION 0.1 SIZE 1;Transparent Glitter;117 +Glitter_Trans_Purple;129;#640061;#000000;128;;MATERIAL GLITTER VALUE #8F00CC FRACTION 0.03 VFRACTION 0.4 SIZE 1;Transparent Bright Bluish Violet w. Glitter 2%;129 +Glitter_Trans_Light_Blue;302;#AEE9EF;#59D1DE;128;;MATERIAL GLITTER VALUE #59DEBF FRACTION 0.17 VFRACTION 0.2 SIZE 1;Transparent Light Blue with Glitter 2%;302 +Glitter_Trans_Neon_Green;339;#C0FF00;#739900;128;;MATERIAL GLITTER VALUE #998C00 FRACTION 0.17 VFRACTION 0.2 SIZE 1;Transparent Fluorescent Green with Glitter 2%;339 +Glitter_Trans_Orange;341;#F08F1C;#9E5C0A;128;;MATERIAL GLITTER VALUE #9E2A0A FRACTION 0.17 VFRACTION 0.2 SIZE 1;Transparent Bright Orange with Glitter 2%;341 +Opal_Trans_Clear;360;#FCFCFC;#C9C9C9;240;5;MATERIAL GLITTER VALUE #FFFFFF FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Clear Opal;360 +Opal_Trans_Light_Blue;362;#AEE9EF;#59D1DE;200;5;MATERIAL GLITTER VALUE #59DEBF FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Blue Opal;362 +Opal_Trans_Black;363;#635F52;#2A2823;200;5;MATERIAL GLITTER VALUE #292522 FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Brown Opal;363 +Opal_Trans_Dark_Pink;364;#DF6695;#B9275F;200;5;MATERIAL GLITTER VALUE #B92790 FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Medium Reddish Violet Opal;364 +Opal_Trans_Purple;365;#671F81;#441456;200;5;MATERIAL GLITTER VALUE #2F1456 FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Violet Opal;365 +Opal_Trans_Green;367;#237841;#174F2B;200;5;MATERIAL GLITTER VALUE #0B270B FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Green Opal;367 +Glitter_Trans_Bright_Green;10351;#56E646;#27AF18;128;;MATERIAL GLITTER VALUE #59AF18 FRACTION 0.17 VFRACTION 0.2 SIZE 1;Transparent Bright Green with Glitter 2%;351 +Opal_Trans_Dark_Blue;10366;#0020A0;#000B38;200;5;MATERIAL GLITTER VALUE #001D38 FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Blue Opal;366 +Speckle_Black_Copper;75;#000000;#AB6038;;;MATERIAL SPECKLE VALUE #AB6038 FRACTION 0.4 MINSIZE 1 MAXSIZE 3;; +Speckle_Dark_Bluish_Grey_Silver;76;#635F61;#898788;;;MATERIAL SPECKLE VALUE #898788 FRACTION 0.4 MINSIZE 1 MAXSIZE 3;; +Speckle_Black_Silver;132;#000000;#898788;;;MATERIAL SPECKLE VALUE #898788 FRACTION 0.4 MINSIZE 1 MAXSIZE 3;Black Glitter;132 +Speckle_Black_Gold;133;#000000;#DBAC34;;;MATERIAL SPECKLE VALUE #DBAC34 FRACTION 0.4 MINSIZE 1 MAXSIZE 3;; +Rubber_Yellow;65;#FAC80A;#333333;;;RUBBER;; +Rubber_Black;256;#1B2A34;#808080;;;RUBBER;; +Rubber_Blue;273;#1E5AA8;#333333;;;RUBBER;; +Rubber_Red;324;#B40000;#333333;;;RUBBER;; +Rubber_Orange;350;#D67923;#333333;;;RUBBER;; +Rubber_Light_Grey;375;#8A928D;#333333;;;RUBBER;; +Rubber_Dark_Blue;406;#19325A;#333333;;;RUBBER;; +Rubber_Purple;449;#671F81;#333333;;;RUBBER;; +Rubber_Lime;490;#A5CA18;#333333;;;RUBBER;; +Rubber_Light_Bluish_Grey;496;#969696;#333333;;;RUBBER;; +Rubber_Flat_Silver;504;#898788;#333333;;;RUBBER;; +Rubber_White;511;#F4F4F4;#333333;;;RUBBER;; +Rubber_Green;10002;#00852B;#333333;;;RUBBER;; +Rubber_Bright_Green;10010;#58AB41;#333333;;;RUBBER;; +Rubber_Magenta;10026;#901F76;#333333;;;RUBBER;; +Rubber_Medium_Lavender;10030;#A06EB9;#333333;;;RUBBER;; +Rubber_Lavender;10031;#CDA4DE;#333333;;;RUBBER;; +Rubber_Reddish_Brown;10070;#5F3109;#808080;;;RUBBER;; +Rubber_Medium_Blue;10073;#7396C8;#333333;;;RUBBER;; +Rubber_Light_Nougat;10078;#FFC995;#333333;;;RUBBER;; +Rubber_Bright_Light_Yellow;10226;#FFEC6C;#333333;;;RUBBER;; +Rubber_Dark_Brown;10308;#352100;#808080;;;RUBBER;; +Rubber_Dark_Red;10320;#720012;#333333;;;RUBBER;; +Rubber_Dark_Azure;10321;#469BC3;#333333;;;RUBBER;; +Rubber_Medium_Azure;10322;#68C3E2;#333333;;;RUBBER;; +Rubber_Light_Aqua;10323;#D3F2EA;#333333;;;RUBBER;; +Rubber_Sand_Green;10378;#708E7C;#333333;;;RUBBER;; +Rubber_Dark_Orange;10484;#91501C;#333333;;;RUBBER;; +Rubber_Trans_Yellow;66;#F5CD2F;#B49208;128;;RUBBER;; +Rubber_Trans_Clear;67;#FCFCFC;#C9C9C9;128;;RUBBER;; +Rubber_Trans_Bright_Green;10035;#56E646;#27AF18;128;;RUBBER;; +Rubber_Trans_Red;10036;#C91A09;#660D05;128;;RUBBER;; +Rubber_Trans_Light_Blue;10043;#AEE9EF;#59D1DE;128;;RUBBER;; +Main_Colour;16;#FFFF80;#333333;;;;; +Edge_Colour;24;#7F7F7F;#333333;;;;; +Trans_Black_IR_Lens;32;#000000;#333333;210;;;Black IR;109 +Magnet;493;#656761;#333333;;;METAL;; +Electric_Contact_Alloy;494;#D0D0D0;#333333;;;METAL;; +Electric_Contact_Copper;495;#AE7A59;#333333;;;METAL;; +Trans_Sticker;10047;#FFFFFF;#FFFFFF;16;;;; diff --git a/app/brickcolor.py b/app/brickcolor.py index d0ae717..6b22842 100644 --- a/app/brickcolor.py +++ b/app/brickcolor.py @@ -21,4 +21,21 @@ def isBrickColor(color_code: str): f"The provided color '{color_code}' seems to be a Direct/HTML color, " f"but contains a invalid charcter at position: {i - 2} - '{color_code[i]}'.\n" f"Valid characters are 0-9 and A-F(uppercase)") - return (True,) \ No newline at end of file + return (True,) + +class brickcolor: + def __init__(self, color_code: str): + if not isBrickColor(color_code)[0]: + return None + self.color_code = color_code + if color_code.startswith("0x2"): + self.color_type = "Direct" + else: + self.color_type = "LDraw" + + def getRGB(self): + if self.color_type == "Direct": + return self.color_code[2:] + else: + #Todo: Load Value from file + return None From 087431915ed652505d8c0872be4ad79faa1a1bb4 Mon Sep 17 00:00:00 2001 From: Nexusnui <131207888+Nexusnui@users.noreply.github.com> Date: Wed, 25 Oct 2023 11:28:12 +0200 Subject: [PATCH 03/17] Category in csv, load values from csv -added category column in BrickColors.csv -load values from csv if color type is LDraw -reformatted brickcolor.py --- app/BrickColors.csv | 410 ++++++++++++++++++++++---------------------- app/brickcolor.py | 73 ++++++-- 2 files changed, 263 insertions(+), 220 deletions(-) diff --git a/app/BrickColors.csv b/app/BrickColors.csv index a10925f..a59c5f2 100644 --- a/app/BrickColors.csv +++ b/app/BrickColors.csv @@ -1,205 +1,205 @@ -LDrawName;LDrawID;Value;Edge;Alpha;Luminance;Material;LegoName;LegoID -Black;0;#1B2A34;#808080;;;;Black;26 -Blue;1;#1E5AA8;#333333;;;;Bright Blue;23 -Green;2;#00852B;#333333;;;;Dark Green;28 -Dark_Turquoise;3;#069D9F;#333333;;;;Bright Bluish Green;107 -Red;4;#B40000;#333333;;;;Bright Red;21 -Dark_Pink;5;#D3359D;#333333;;;;Medium Reddish Violet / Bright Purple;22 / 221 -Brown;6;#543324;#1E1E1E;;;;Earth Orange;25 -Light_Grey;7;#8A928D;#333333;;;;Grey;2 -Dark_Grey;8;#545955;#333333;;;;Dark Grey;27 -Light_Blue;9;#97CBD9;#333333;;;;Light Blue;45 -Bright_Green;10;#58AB41;#333333;;;;Bright Green;37 -Light_Turquoise;11;#00AAA4;#333333;;;;Medium Bluish Green;116 -Salmon;12;#F06D61;#333333;;;;Medium Red;101 -Pink;13;#F6A9BB;#333333;;;;Light Reddish Violet;9 -Yellow;14;#FAC80A;#333333;;;;Bright Yellow;24 -White;15;#F4F4F4;#333333;;;;White;1 -Light_Green;17;#ADD9A8;#333333;;;;Light Green;6 -Light_Yellow;18;#FFD67F;#333333;;;;Light Yellow;3 -Tan;19;#B0A06F;#333333;;;;Brick Yellow;5 -Light_Violet;20;#AFBED6;#333333;;;;Light Bluish Violet;39 -Purple;22;#671F81;#333333;;;;Bright Violet;104 -Dark_Blue_Violet;23;#0E3E9A;#333333;;;;Dark Royal Blue;196 -Orange;25;#D67923;#333333;;;;Bright Orange;106 -Magenta;26;#901F76;#333333;;;;Bright Reddish Violet;124 -Lime;27;#A5CA18;#333333;;;;Bright Yellowish Green;119 -Dark_Tan;28;#897D62;#333333;;;;Sand Yellow;138 -Bright_Pink;29;#FF9ECD;#333333;;;;Light Purple;222 -Medium_Lavender;30;#A06EB9;#333333;;;;Medium Lavender;324 -Lavender;31;#CDA4DE;#333333;;;;Lavender;325 -Very_Light_Orange;68;#FDC383;#333333;;;;Light Yellowish Orange;36 -Bright_Reddish_Lilac;69;#8A12A8;#333333;;;;Bright Reddish Lilac;198 -Reddish_Brown;70;#5F3109;#808080;;;;Reddish Brown;192 -Light_Bluish_Grey;71;#969696;#333333;;;;Medium Stone Grey;194 -Dark_Bluish_Grey;72;#646464;#333333;;;;Dark Stone Grey;199 -Medium_Blue;73;#7396C8;#333333;;;;Medium Blue;102 -Medium_Green;74;#7FC475;#333333;;;;Medium Green;29 -Light_Pink;77;#FECCCF;#333333;;;;Light Pink;223 -Light_Nougat;78;#FFC995;#333333;;;;Light Nougat;283 -Medium_Nougat;84;#AA7D55;#333333;;;;Medium Nougat;312 -Medium_Lilac;85;#441A91;#333333;;;;Medium Lilac;268 -Medium_Brown;86;#7B5D41;#333333;;;;Brown;217 -Blue_Violet;89;#1C58A7;#333333;;;;Medium Royal Blue;195 -Nougat;92;#BB805A;#333333;;;;Nougat;18 -Light_Salmon;100;#F9B7A5;#333333;;;;Light Red;100 -Violet;110;#26469A;#333333;;;;Bright Bluish Violet;110 -Medium_Violet;112;#4861AC;#333333;;;;Medium Bluish Violet;112 -Medium_Lime;115;#B7D425;#333333;;;;Medium Yellowish Green;115 -Aqua;118;#9CD6CC;#333333;;;;Light Bluish Green;118 -Light_Lime;120;#DEEA92;#333333;;;;Light Yellowish Green;120 -Light_Orange;125;#F9A777;#333333;;;;Light Orange;125 -Dark_Nougat;128;#AD6140;#333333;;;;Dark Nougat;128 -Very_Light_Bluish_Grey;151;#C8C8C8;#333333;;;;Light Stone Grey;208 -Bright_Light_Orange;191;#FCAC00;#333333;;;;Flame Yellowish Orange;191 -Bright_Light_Blue;212;#9DC3F7;#333333;;;;Light Royal Blue;212 -Rust;216;#872B17;#333333;;;;Rust;216 -Reddish_Lilac;218;#8E5597;#333333;;;;Reddish Lilac;218 -Lilac;219;#564E9D;#333333;;;;Lilac;219 -Bright_Light_Yellow;226;#FFEC6C;#333333;;;;Cool Yellow;226 -Sky_Blue;232;#77C9D8;#333333;;;;Dove Blue;232 -Dark_Blue;272;#19325A;#333333;;;;Earth Blue;140 -Dark_Green;288;#00451A;#808080;;;;Earth Green;141 -Flamingo_Pink;295;#FF94C2;#333333;;;;Flamingo Pink;295 -Dark_Brown;308;#352100;#808080;;;;Dark Brown;308 -Maersk_Blue;313;#ABD9FF;#333333;;;;Pastel Blue;11 -Dark_Red;320;#720012;#333333;;;;New Dark Red;154 -Dark_Azure;321;#469BC3;#333333;;;;Dark Azur;321 -Medium_Azure;322;#68C3E2;#333333;;;;Medium Azur;322 -Light_Aqua;323;#D3F2EA;#333333;;;;Aqua;323 -Yellowish_Green;326;#E2F99A;#333333;;;;Spring Yellowish Green;326 -Olive_Green;330;#77774E;#333333;;;;Olive Green;330 -Sand_Red;335;#88605E;#333333;;;;Sand Red;153 -Medium_Dark_Pink;351;#F785B1;#333333;;;;Pink;16 -Coral;353;#FF6D77;#333333;;;;Vibrant Coral;353 -Earth_Orange;366;#D86D2C;#333333;;;;Light Orange Brown;12 -Vibrant_Yellow;368;#EDFF21;#333333;;;;Vibrant Yellow;368 -Medium_Brown;370;#755945;#333333;;;;Medium Brown;370 -Sand_Purple;373;#75657D;#333333;;;;Sand Violet;136 -Sand_Green;378;#708E7C;#333333;;;;Sand Green;151 -Sand_Blue;379;#70819A;#333333;;;;Sand Blue;135 -Fabuland_Brown;450;#D27744;#333333;;;;Brick Red;4 -Medium_Orange;462;#F58624;#333333;;;;Bright Yellowish Orange;105 -Dark_Orange;484;#91501C;#333333;;;;Dark Orange;38 -Very_Light_Grey;503;#BCB4A5;#333333;;;;Light Grey;103 -Light_Orange_Brown;507;#FA9C1C;#333333;;;;Light Orange Brown;12 -Fabuland_Red;508;#FF8014;#333333;;;;Red Orange;13 -Fabuland_Orange;509;#CF8A47;#333333;;;;Light Brown;19 -Fabuland_Pastel_Green;510;#78FC78;#333333;;;;Pastel Green;14 -Trans_Dark_Blue;33;#0020A0;#000B38;128;;;Transparent Blue;43 -Trans_Green;34;#237841;#174F2B;128;;;Transparent Green;48 -Trans_Bright_Green;35;#56E646;#27AF18;128;;;Transparent Bright Green;311 -Trans_Red;36;#C91A09;#660D05;128;;;Transparent Red;41 -Trans_Dark_Pink;37;#DF6695;#B9275F;128;;;Transparent Medium Reddish Violet;113 -Trans_Neon_Orange;38;#FF800D;#A85100;128;;;Transparent Fluorescent Reddish Orange;47 -Trans_Very_Light_Blue;39;#C1DFF0;#6FB4DC;128;;;Transparent Light Bluish Green;229 -Trans_Black;40;#635F52;#2A2823;128;;;Transparent Brown;111 -Trans_Medium_Blue;41;#559AB7;#326276;128;;;Transparent Fluorescent Blue;143 -Trans_Neon_Green;42;#C0FF00;#739900;128;;;Transparent Fluorescent Green;49 -Trans_Light_Blue;43;#AEE9EF;#59D1DE;128;;;Transparent Light Blue;42 -Trans_Bright_Reddish_Lilac;44;#96709F;#5F4365;128;;;Transparent Bright Reddish Lilac;236 -Trans_Pink;45;#FC97AC;#F9345B;128;;;Transparent Bright Pink;230 -Trans_Yellow;46;#F5CD2F;#B49208;128;;;Transparent Yellow;44 -Trans_Clear;47;#FCFCFC;#C9C9C9;128;;;Transparent;40 -Trans_Purple;52;#A5A5CB;#6464A6;128;;;Transparent Bright Bluish Violet;126 -Trans_Neon_Yellow;54;#DAB000;#755E00;128;;;Transparent Fluorescent Yellow;157 -Trans_Orange;57;#F08F1C;#9E5C0A;128;;;Trans Bright Orange;182 -Trans_Bright_Light_Green;227;#B5D96C;#86B22E;128;;;Transparent Bright Yellowish Green;227 -Trans_Bright_Light_Orange;231;#FCB76D;#FA860A;128;;;Transparent Flame Yellowish Orange;231 -Trans_Fire_Yellow;234;#FBE890;#F7D22B;128;;;Transparent Fire Yellow;234 -Trans_Reddish_Lilac;284;#C281A5;#944771;128;;;Transparent Reddish Lilac;284 -Trans_Light_Green;285;#7DC291;#46955D;128;;;Transparent Light Green;285 -Trans_Light_Blue_Violet;293;#6BABE4;#247BC6;128;;;Transparent Light Royal Blue;293 -Chrome_Antique_Brass;60;#645A4C;#665B4D;;;CHROME;; -Chrome_Blue;61;#6C96BF;#3D638A;;;CHROME;; -Chrome_Green;62;#3CB371;#226741;;;CHROME;; -Chrome_Pink;63;#AA4D8E;#632C52;;;CHROME;; -Chrome_Black;64;#1B2A34;#3D5F76;;;CHROME;; -Chrome_Gold;334;#DFC176;#C2982E;;;CHROME;Metalized Gold;310 -Chrome_Silver;383;#CECECE;#9C9C9C;;;CHROME;Metalized Silver;309 -Metallic_Black;83;#0A1327;#333333;;;PEARLESCENT;Metallic Black;149 -Copper;134;#764D3B;#333333;;;PEARLESCENT;Copper;139 -Pearl_Light_Grey;135;#A0A0A0;#333333;;;PEARLESCENT;Cool Silver / Silver / Silver Metallic;296 / 131 / 315 -Metallic_Blue;137;#5B7590;#333333;;;PEARLESCENT;Sand Blue Metallic;145 -Pearl_Light_Gold;142;#DEAC66;#333333;;;PEARLESCENT;Gold;127 -Pearl_Dark_Grey;148;#484D48;#333333;;;PEARLESCENT;Metallic Dark Grey;148 -Pearl_Very_Light_Grey;150;#989B99;#333333;;;PEARLESCENT;Metallic Light Grey;150 -Flat_Dark_Gold;178;#83724F;#333333;;;PEARLESCENT;Metallic Sand Yellow;147 -Flat_Silver;179;#898788;#333333;;;PEARLESCENT;Silver Flip-flop;179 -Pearl_White;183;#F6F2DF;#333333;;;PEARLESCENT;Metallic White;183 -Metallic_Bright_Red;184;#D60026;#333333;;;PEARLESCENT;Metallic Bright Red;184 -Metallic_Bright_Blue;185;#0059A3;#333333;;;PEARLESCENT;Metallic Bright Blue;185 -Metallic_Dark_Green;186;#008E3C;#333333;;;PEARLESCENT;Metallic Dark Green;186 -Reddish_Gold;189;#AC8247;#333333;;;PEARLESCENT;Reddish Gold;189 -Lemon_Metallic;200;#708224;#333333;;;PEARLESCENT;Lemon Metallic;200 -Pearl_Gold;297;#AA7F2E;#333333;;;PEARLESCENT;Warm Gold;297 -Metallic_Silver;80;#767676;#333333;;;METAL;Cool Silver Drum Lacq / Silver Ink;298 / 336 -Metallic_Green;81;#C2C06F;#333333;;;METAL;; -Metallic_Gold;82;#DBAC34;#333333;;;METAL;Warm Gold Drum Lacq / Gold Ink;299 / 335 -Metallic_Dark_Grey;87;#3E3C39;#333333;;;METAL;Titanium;337 -Metallic_Copper;300;#C27F53;#333333;;;METAL;Copper Drum Lacq / Copper Ink;300 / 334 -Metallic_Light_Blue;10045;#97CBD9;#333333;;;METAL;; -Metallic_Pink;10046;#AD659A;#333333;;;METAL;; -Metallic_Light_Pink;10049;#FECCCF;#333333;;;METAL;; -Milky_White;79;#EEEEEE;#BABABA;240;;;Nature;20 -Glow_In_Dark_Opaque;21;#E0FFB0;#B8FF4D;240;15;;Phosphorescent Green;294 -Glow_In_Dark_Trans;294;#BDC6AD;#8D9D72;240;15;;Phosphorescent White;50 -Glow_In_Dark_White;329;#F5F3D7;#E0DA85;240;15;;White Glow;329 -Glitter_Trans_Dark_Pink;114;#DF6695;#B9275F;128;;MATERIAL GLITTER VALUE #B92790 FRACTION 0.17 VFRACTION 0.2 SIZE 1;Transparent Medium Reddish-Violet w. Glitter 2%;114 -Glitter_Trans_Clear;117;#EEEEEE;#BABABA;128;;MATERIAL GLITTER VALUE #FFFFFF FRACTION 0.08 VFRACTION 0.1 SIZE 1;Transparent Glitter;117 -Glitter_Trans_Purple;129;#640061;#000000;128;;MATERIAL GLITTER VALUE #8F00CC FRACTION 0.03 VFRACTION 0.4 SIZE 1;Transparent Bright Bluish Violet w. Glitter 2%;129 -Glitter_Trans_Light_Blue;302;#AEE9EF;#59D1DE;128;;MATERIAL GLITTER VALUE #59DEBF FRACTION 0.17 VFRACTION 0.2 SIZE 1;Transparent Light Blue with Glitter 2%;302 -Glitter_Trans_Neon_Green;339;#C0FF00;#739900;128;;MATERIAL GLITTER VALUE #998C00 FRACTION 0.17 VFRACTION 0.2 SIZE 1;Transparent Fluorescent Green with Glitter 2%;339 -Glitter_Trans_Orange;341;#F08F1C;#9E5C0A;128;;MATERIAL GLITTER VALUE #9E2A0A FRACTION 0.17 VFRACTION 0.2 SIZE 1;Transparent Bright Orange with Glitter 2%;341 -Opal_Trans_Clear;360;#FCFCFC;#C9C9C9;240;5;MATERIAL GLITTER VALUE #FFFFFF FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Clear Opal;360 -Opal_Trans_Light_Blue;362;#AEE9EF;#59D1DE;200;5;MATERIAL GLITTER VALUE #59DEBF FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Blue Opal;362 -Opal_Trans_Black;363;#635F52;#2A2823;200;5;MATERIAL GLITTER VALUE #292522 FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Brown Opal;363 -Opal_Trans_Dark_Pink;364;#DF6695;#B9275F;200;5;MATERIAL GLITTER VALUE #B92790 FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Medium Reddish Violet Opal;364 -Opal_Trans_Purple;365;#671F81;#441456;200;5;MATERIAL GLITTER VALUE #2F1456 FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Violet Opal;365 -Opal_Trans_Green;367;#237841;#174F2B;200;5;MATERIAL GLITTER VALUE #0B270B FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Green Opal;367 -Glitter_Trans_Bright_Green;10351;#56E646;#27AF18;128;;MATERIAL GLITTER VALUE #59AF18 FRACTION 0.17 VFRACTION 0.2 SIZE 1;Transparent Bright Green with Glitter 2%;351 -Opal_Trans_Dark_Blue;10366;#0020A0;#000B38;200;5;MATERIAL GLITTER VALUE #001D38 FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Blue Opal;366 -Speckle_Black_Copper;75;#000000;#AB6038;;;MATERIAL SPECKLE VALUE #AB6038 FRACTION 0.4 MINSIZE 1 MAXSIZE 3;; -Speckle_Dark_Bluish_Grey_Silver;76;#635F61;#898788;;;MATERIAL SPECKLE VALUE #898788 FRACTION 0.4 MINSIZE 1 MAXSIZE 3;; -Speckle_Black_Silver;132;#000000;#898788;;;MATERIAL SPECKLE VALUE #898788 FRACTION 0.4 MINSIZE 1 MAXSIZE 3;Black Glitter;132 -Speckle_Black_Gold;133;#000000;#DBAC34;;;MATERIAL SPECKLE VALUE #DBAC34 FRACTION 0.4 MINSIZE 1 MAXSIZE 3;; -Rubber_Yellow;65;#FAC80A;#333333;;;RUBBER;; -Rubber_Black;256;#1B2A34;#808080;;;RUBBER;; -Rubber_Blue;273;#1E5AA8;#333333;;;RUBBER;; -Rubber_Red;324;#B40000;#333333;;;RUBBER;; -Rubber_Orange;350;#D67923;#333333;;;RUBBER;; -Rubber_Light_Grey;375;#8A928D;#333333;;;RUBBER;; -Rubber_Dark_Blue;406;#19325A;#333333;;;RUBBER;; -Rubber_Purple;449;#671F81;#333333;;;RUBBER;; -Rubber_Lime;490;#A5CA18;#333333;;;RUBBER;; -Rubber_Light_Bluish_Grey;496;#969696;#333333;;;RUBBER;; -Rubber_Flat_Silver;504;#898788;#333333;;;RUBBER;; -Rubber_White;511;#F4F4F4;#333333;;;RUBBER;; -Rubber_Green;10002;#00852B;#333333;;;RUBBER;; -Rubber_Bright_Green;10010;#58AB41;#333333;;;RUBBER;; -Rubber_Magenta;10026;#901F76;#333333;;;RUBBER;; -Rubber_Medium_Lavender;10030;#A06EB9;#333333;;;RUBBER;; -Rubber_Lavender;10031;#CDA4DE;#333333;;;RUBBER;; -Rubber_Reddish_Brown;10070;#5F3109;#808080;;;RUBBER;; -Rubber_Medium_Blue;10073;#7396C8;#333333;;;RUBBER;; -Rubber_Light_Nougat;10078;#FFC995;#333333;;;RUBBER;; -Rubber_Bright_Light_Yellow;10226;#FFEC6C;#333333;;;RUBBER;; -Rubber_Dark_Brown;10308;#352100;#808080;;;RUBBER;; -Rubber_Dark_Red;10320;#720012;#333333;;;RUBBER;; -Rubber_Dark_Azure;10321;#469BC3;#333333;;;RUBBER;; -Rubber_Medium_Azure;10322;#68C3E2;#333333;;;RUBBER;; -Rubber_Light_Aqua;10323;#D3F2EA;#333333;;;RUBBER;; -Rubber_Sand_Green;10378;#708E7C;#333333;;;RUBBER;; -Rubber_Dark_Orange;10484;#91501C;#333333;;;RUBBER;; -Rubber_Trans_Yellow;66;#F5CD2F;#B49208;128;;RUBBER;; -Rubber_Trans_Clear;67;#FCFCFC;#C9C9C9;128;;RUBBER;; -Rubber_Trans_Bright_Green;10035;#56E646;#27AF18;128;;RUBBER;; -Rubber_Trans_Red;10036;#C91A09;#660D05;128;;RUBBER;; -Rubber_Trans_Light_Blue;10043;#AEE9EF;#59D1DE;128;;RUBBER;; -Main_Colour;16;#FFFF80;#333333;;;;; -Edge_Colour;24;#7F7F7F;#333333;;;;; -Trans_Black_IR_Lens;32;#000000;#333333;210;;;Black IR;109 -Magnet;493;#656761;#333333;;;METAL;; -Electric_Contact_Alloy;494;#D0D0D0;#333333;;;METAL;; -Electric_Contact_Copper;495;#AE7A59;#333333;;;METAL;; -Trans_Sticker;10047;#FFFFFF;#FFFFFF;16;;;; +LDrawName;LDrawID;Value;Edge;Alpha;Luminance;Material;LegoName;LegoID;Category +Black;0;#1B2A34;#808080;;;;Black;26;LDraw Solid Colours +Blue;1;#1E5AA8;#333333;;;;Bright Blue;23;LDraw Solid Colours +Green;2;#00852B;#333333;;;;Dark Green;28;LDraw Solid Colours +Dark_Turquoise;3;#069D9F;#333333;;;;Bright Bluish Green;107;LDraw Solid Colours +Red;4;#B40000;#333333;;;;Bright Red;21;LDraw Solid Colours +Dark_Pink;5;#D3359D;#333333;;;;Medium Reddish Violet / Bright Purple;22 / 221;LDraw Solid Colours +Brown;6;#543324;#1E1E1E;;;;Earth Orange;25;LDraw Solid Colours +Light_Grey;7;#8A928D;#333333;;;;Grey;2;LDraw Solid Colours +Dark_Grey;8;#545955;#333333;;;;Dark Grey;27;LDraw Solid Colours +Light_Blue;9;#97CBD9;#333333;;;;Light Blue;45;LDraw Solid Colours +Bright_Green;10;#58AB41;#333333;;;;Bright Green;37;LDraw Solid Colours +Light_Turquoise;11;#00AAA4;#333333;;;;Medium Bluish Green;116;LDraw Solid Colours +Salmon;12;#F06D61;#333333;;;;Medium Red;101;LDraw Solid Colours +Pink;13;#F6A9BB;#333333;;;;Light Reddish Violet;9;LDraw Solid Colours +Yellow;14;#FAC80A;#333333;;;;Bright Yellow;24;LDraw Solid Colours +White;15;#F4F4F4;#333333;;;;White;1;LDraw Solid Colours +Light_Green;17;#ADD9A8;#333333;;;;Light Green;6;LDraw Solid Colours +Light_Yellow;18;#FFD67F;#333333;;;;Light Yellow;3;LDraw Solid Colours +Tan;19;#B0A06F;#333333;;;;Brick Yellow;5;LDraw Solid Colours +Light_Violet;20;#AFBED6;#333333;;;;Light Bluish Violet;39;LDraw Solid Colours +Purple;22;#671F81;#333333;;;;Bright Violet;104;LDraw Solid Colours +Dark_Blue_Violet;23;#0E3E9A;#333333;;;;Dark Royal Blue;196;LDraw Solid Colours +Orange;25;#D67923;#333333;;;;Bright Orange;106;LDraw Solid Colours +Magenta;26;#901F76;#333333;;;;Bright Reddish Violet;124;LDraw Solid Colours +Lime;27;#A5CA18;#333333;;;;Bright Yellowish Green;119;LDraw Solid Colours +Dark_Tan;28;#897D62;#333333;;;;Sand Yellow;138;LDraw Solid Colours +Bright_Pink;29;#FF9ECD;#333333;;;;Light Purple;222;LDraw Solid Colours +Medium_Lavender;30;#A06EB9;#333333;;;;Medium Lavender;324;LDraw Solid Colours +Lavender;31;#CDA4DE;#333333;;;;Lavender;325;LDraw Solid Colours +Very_Light_Orange;68;#FDC383;#333333;;;;Light Yellowish Orange;36;LDraw Solid Colours +Bright_Reddish_Lilac;69;#8A12A8;#333333;;;;Bright Reddish Lilac;198;LDraw Solid Colours +Reddish_Brown;70;#5F3109;#808080;;;;Reddish Brown;192;LDraw Solid Colours +Light_Bluish_Grey;71;#969696;#333333;;;;Medium Stone Grey;194;LDraw Solid Colours +Dark_Bluish_Grey;72;#646464;#333333;;;;Dark Stone Grey;199;LDraw Solid Colours +Medium_Blue;73;#7396C8;#333333;;;;Medium Blue;102;LDraw Solid Colours +Medium_Green;74;#7FC475;#333333;;;;Medium Green;29;LDraw Solid Colours +Light_Pink;77;#FECCCF;#333333;;;;Light Pink;223;LDraw Solid Colours +Light_Nougat;78;#FFC995;#333333;;;;Light Nougat;283;LDraw Solid Colours +Medium_Nougat;84;#AA7D55;#333333;;;;Medium Nougat;312;LDraw Solid Colours +Medium_Lilac;85;#441A91;#333333;;;;Medium Lilac;268;LDraw Solid Colours +Medium_Brown;86;#7B5D41;#333333;;;;Brown;217;LDraw Solid Colours +Blue_Violet;89;#1C58A7;#333333;;;;Medium Royal Blue;195;LDraw Solid Colours +Nougat;92;#BB805A;#333333;;;;Nougat;18;LDraw Solid Colours +Light_Salmon;100;#F9B7A5;#333333;;;;Light Red;100;LDraw Solid Colours +Violet;110;#26469A;#333333;;;;Bright Bluish Violet;110;LDraw Solid Colours +Medium_Violet;112;#4861AC;#333333;;;;Medium Bluish Violet;112;LDraw Solid Colours +Medium_Lime;115;#B7D425;#333333;;;;Medium Yellowish Green;115;LDraw Solid Colours +Aqua;118;#9CD6CC;#333333;;;;Light Bluish Green;118;LDraw Solid Colours +Light_Lime;120;#DEEA92;#333333;;;;Light Yellowish Green;120;LDraw Solid Colours +Light_Orange;125;#F9A777;#333333;;;;Light Orange;125;LDraw Solid Colours +Dark_Nougat;128;#AD6140;#333333;;;;Dark Nougat;128;LDraw Solid Colours +Very_Light_Bluish_Grey;151;#C8C8C8;#333333;;;;Light Stone Grey;208;LDraw Solid Colours +Bright_Light_Orange;191;#FCAC00;#333333;;;;Flame Yellowish Orange;191;LDraw Solid Colours +Bright_Light_Blue;212;#9DC3F7;#333333;;;;Light Royal Blue;212;LDraw Solid Colours +Rust;216;#872B17;#333333;;;;Rust;216;LDraw Solid Colours +Reddish_Lilac;218;#8E5597;#333333;;;;Reddish Lilac;218;LDraw Solid Colours +Lilac;219;#564E9D;#333333;;;;Lilac;219;LDraw Solid Colours +Bright_Light_Yellow;226;#FFEC6C;#333333;;;;Cool Yellow;226;LDraw Solid Colours +Sky_Blue;232;#77C9D8;#333333;;;;Dove Blue;232;LDraw Solid Colours +Dark_Blue;272;#19325A;#333333;;;;Earth Blue;140;LDraw Solid Colours +Dark_Green;288;#00451A;#808080;;;;Earth Green;141;LDraw Solid Colours +Flamingo_Pink;295;#FF94C2;#333333;;;;Flamingo Pink;295;LDraw Solid Colours +Dark_Brown;308;#352100;#808080;;;;Dark Brown;308;LDraw Solid Colours +Maersk_Blue;313;#ABD9FF;#333333;;;;Pastel Blue;11;LDraw Solid Colours +Dark_Red;320;#720012;#333333;;;;New Dark Red;154;LDraw Solid Colours +Dark_Azure;321;#469BC3;#333333;;;;Dark Azur;321;LDraw Solid Colours +Medium_Azure;322;#68C3E2;#333333;;;;Medium Azur;322;LDraw Solid Colours +Light_Aqua;323;#D3F2EA;#333333;;;;Aqua;323;LDraw Solid Colours +Yellowish_Green;326;#E2F99A;#333333;;;;Spring Yellowish Green;326;LDraw Solid Colours +Olive_Green;330;#77774E;#333333;;;;Olive Green;330;LDraw Solid Colours +Sand_Red;335;#88605E;#333333;;;;Sand Red;153;LDraw Solid Colours +Medium_Dark_Pink;351;#F785B1;#333333;;;;Pink;16;LDraw Solid Colours +Coral;353;#FF6D77;#333333;;;;Vibrant Coral;353;LDraw Solid Colours +Earth_Orange;366;#D86D2C;#333333;;;;Light Orange Brown;12;LDraw Solid Colours +Vibrant_Yellow;368;#EDFF21;#333333;;;;Vibrant Yellow;368;LDraw Solid Colours +Medium_Brown;370;#755945;#333333;;;;Medium Brown;370;LDraw Solid Colours +Sand_Purple;373;#75657D;#333333;;;;Sand Violet;136;LDraw Solid Colours +Sand_Green;378;#708E7C;#333333;;;;Sand Green;151;LDraw Solid Colours +Sand_Blue;379;#70819A;#333333;;;;Sand Blue;135;LDraw Solid Colours +Fabuland_Brown;450;#D27744;#333333;;;;Brick Red;4;LDraw Solid Colours +Medium_Orange;462;#F58624;#333333;;;;Bright Yellowish Orange;105;LDraw Solid Colours +Dark_Orange;484;#91501C;#333333;;;;Dark Orange;38;LDraw Solid Colours +Very_Light_Grey;503;#BCB4A5;#333333;;;;Light Grey;103;LDraw Solid Colours +Light_Orange_Brown;507;#FA9C1C;#333333;;;;Light Orange Brown;12;LDraw Solid Colours +Fabuland_Red;508;#FF8014;#333333;;;;Red Orange;13;LDraw Solid Colours +Fabuland_Orange;509;#CF8A47;#333333;;;;Light Brown;19;LDraw Solid Colours +Fabuland_Pastel_Green;510;#78FC78;#333333;;;;Pastel Green;14;LDraw Solid Colours +Trans_Dark_Blue;33;#0020A0;#000B38;128;;;Transparent Blue;43;LDraw Transparent Colours +Trans_Green;34;#237841;#174F2B;128;;;Transparent Green;48;LDraw Transparent Colours +Trans_Bright_Green;35;#56E646;#27AF18;128;;;Transparent Bright Green;311;LDraw Transparent Colours +Trans_Red;36;#C91A09;#660D05;128;;;Transparent Red;41;LDraw Transparent Colours +Trans_Dark_Pink;37;#DF6695;#B9275F;128;;;Transparent Medium Reddish Violet;113;LDraw Transparent Colours +Trans_Neon_Orange;38;#FF800D;#A85100;128;;;Transparent Fluorescent Reddish Orange;47;LDraw Transparent Colours +Trans_Very_Light_Blue;39;#C1DFF0;#6FB4DC;128;;;Transparent Light Bluish Green;229;LDraw Transparent Colours +Trans_Black;40;#635F52;#2A2823;128;;;Transparent Brown;111;LDraw Transparent Colours +Trans_Medium_Blue;41;#559AB7;#326276;128;;;Transparent Fluorescent Blue;143;LDraw Transparent Colours +Trans_Neon_Green;42;#C0FF00;#739900;128;;;Transparent Fluorescent Green;49;LDraw Transparent Colours +Trans_Light_Blue;43;#AEE9EF;#59D1DE;128;;;Transparent Light Blue;42;LDraw Transparent Colours +Trans_Bright_Reddish_Lilac;44;#96709F;#5F4365;128;;;Transparent Bright Reddish Lilac;236;LDraw Transparent Colours +Trans_Pink;45;#FC97AC;#F9345B;128;;;Transparent Bright Pink;230;LDraw Transparent Colours +Trans_Yellow;46;#F5CD2F;#B49208;128;;;Transparent Yellow;44;LDraw Transparent Colours +Trans_Clear;47;#FCFCFC;#C9C9C9;128;;;Transparent;40;LDraw Transparent Colours +Trans_Purple;52;#A5A5CB;#6464A6;128;;;Transparent Bright Bluish Violet;126;LDraw Transparent Colours +Trans_Neon_Yellow;54;#DAB000;#755E00;128;;;Transparent Fluorescent Yellow;157;LDraw Transparent Colours +Trans_Orange;57;#F08F1C;#9E5C0A;128;;;Trans Bright Orange;182;LDraw Transparent Colours +Trans_Bright_Light_Green;227;#B5D96C;#86B22E;128;;;Transparent Bright Yellowish Green;227;LDraw Transparent Colours +Trans_Bright_Light_Orange;231;#FCB76D;#FA860A;128;;;Transparent Flame Yellowish Orange;231;LDraw Transparent Colours +Trans_Fire_Yellow;234;#FBE890;#F7D22B;128;;;Transparent Fire Yellow;234;LDraw Transparent Colours +Trans_Reddish_Lilac;284;#C281A5;#944771;128;;;Transparent Reddish Lilac;284;LDraw Transparent Colours +Trans_Light_Green;285;#7DC291;#46955D;128;;;Transparent Light Green;285;LDraw Transparent Colours +Trans_Light_Blue_Violet;293;#6BABE4;#247BC6;128;;;Transparent Light Royal Blue;293;LDraw Transparent Colours +Chrome_Antique_Brass;60;#645A4C;#665B4D;;;CHROME;;;LDraw Chrome Plated Colours +Chrome_Blue;61;#6C96BF;#3D638A;;;CHROME;;;LDraw Chrome Plated Colours +Chrome_Green;62;#3CB371;#226741;;;CHROME;;;LDraw Chrome Plated Colours +Chrome_Pink;63;#AA4D8E;#632C52;;;CHROME;;;LDraw Chrome Plated Colours +Chrome_Black;64;#1B2A34;#3D5F76;;;CHROME;;;LDraw Chrome Plated Colours +Chrome_Gold;334;#DFC176;#C2982E;;;CHROME;Metalized Gold;310;LDraw Chrome Plated Colours +Chrome_Silver;383;#CECECE;#9C9C9C;;;CHROME;Metalized Silver;309;LDraw Chrome Plated Colours +Metallic_Black;83;#0A1327;#333333;;;PEARLESCENT;Metallic Black;149;LDraw Pearlescent Plastic Colours +Copper;134;#764D3B;#333333;;;PEARLESCENT;Copper;139;LDraw Pearlescent Plastic Colours +Pearl_Light_Grey;135;#A0A0A0;#333333;;;PEARLESCENT;Cool Silver / Silver / Silver Metallic;296 / 131 / 315;LDraw Pearlescent Plastic Colours +Metallic_Blue;137;#5B7590;#333333;;;PEARLESCENT;Sand Blue Metallic;145;LDraw Pearlescent Plastic Colours +Pearl_Light_Gold;142;#DEAC66;#333333;;;PEARLESCENT;Gold;127;LDraw Pearlescent Plastic Colours +Pearl_Dark_Grey;148;#484D48;#333333;;;PEARLESCENT;Metallic Dark Grey;148;LDraw Pearlescent Plastic Colours +Pearl_Very_Light_Grey;150;#989B99;#333333;;;PEARLESCENT;Metallic Light Grey;150;LDraw Pearlescent Plastic Colours +Flat_Dark_Gold;178;#83724F;#333333;;;PEARLESCENT;Metallic Sand Yellow;147;LDraw Pearlescent Plastic Colours +Flat_Silver;179;#898788;#333333;;;PEARLESCENT;Silver Flip-flop;179;LDraw Pearlescent Plastic Colours +Pearl_White;183;#F6F2DF;#333333;;;PEARLESCENT;Metallic White;183;LDraw Pearlescent Plastic Colours +Metallic_Bright_Red;184;#D60026;#333333;;;PEARLESCENT;Metallic Bright Red;184;LDraw Pearlescent Plastic Colours +Metallic_Bright_Blue;185;#0059A3;#333333;;;PEARLESCENT;Metallic Bright Blue;185;LDraw Pearlescent Plastic Colours +Metallic_Dark_Green;186;#008E3C;#333333;;;PEARLESCENT;Metallic Dark Green;186;LDraw Pearlescent Plastic Colours +Reddish_Gold;189;#AC8247;#333333;;;PEARLESCENT;Reddish Gold;189;LDraw Pearlescent Plastic Colours +Lemon_Metallic;200;#708224;#333333;;;PEARLESCENT;Lemon Metallic;200;LDraw Pearlescent Plastic Colours +Pearl_Gold;297;#AA7F2E;#333333;;;PEARLESCENT;Warm Gold;297;LDraw Pearlescent Plastic Colours +Metallic_Silver;80;#767676;#333333;;;METAL;Cool Silver Drum Lacq / Silver Ink;298 / 336;LDraw Metallic Paint Colours +Metallic_Green;81;#C2C06F;#333333;;;METAL;;;LDraw Metallic Paint Colours +Metallic_Gold;82;#DBAC34;#333333;;;METAL;Warm Gold Drum Lacq / Gold Ink;299 / 335;LDraw Metallic Paint Colours +Metallic_Dark_Grey;87;#3E3C39;#333333;;;METAL;Titanium;337;LDraw Metallic Paint Colours +Metallic_Copper;300;#C27F53;#333333;;;METAL;Copper Drum Lacq / Copper Ink;300 / 334;LDraw Metallic Paint Colours +Metallic_Light_Blue;10045;#97CBD9;#333333;;;METAL;;;LDraw Metallic Paint Colours +Metallic_Pink;10046;#AD659A;#333333;;;METAL;;;LDraw Metallic Paint Colours +Metallic_Light_Pink;10049;#FECCCF;#333333;;;METAL;;;LDraw Metallic Paint Colours +Milky_White;79;#EEEEEE;#BABABA;240;;;Nature;20;LDraw Milky Colours +Glow_In_Dark_Opaque;21;#E0FFB0;#B8FF4D;240;15;;Phosphorescent Green;294;LDraw Milky Colours +Glow_In_Dark_Trans;294;#BDC6AD;#8D9D72;240;15;;Phosphorescent White;50;LDraw Milky Colours +Glow_In_Dark_White;329;#F5F3D7;#E0DA85;240;15;;White Glow;329;LDraw Milky Colours +Glitter_Trans_Dark_Pink;114;#DF6695;#B9275F;128;;MATERIAL GLITTER VALUE #B92790 FRACTION 0.17 VFRACTION 0.2 SIZE 1;Transparent Medium Reddish-Violet w. Glitter 2%;114;LDraw Glitter Colours +Glitter_Trans_Clear;117;#EEEEEE;#BABABA;128;;MATERIAL GLITTER VALUE #FFFFFF FRACTION 0.08 VFRACTION 0.1 SIZE 1;Transparent Glitter;117;LDraw Glitter Colours +Glitter_Trans_Purple;129;#640061;#000000;128;;MATERIAL GLITTER VALUE #8F00CC FRACTION 0.03 VFRACTION 0.4 SIZE 1;Transparent Bright Bluish Violet w. Glitter 2%;129;LDraw Glitter Colours +Glitter_Trans_Light_Blue;302;#AEE9EF;#59D1DE;128;;MATERIAL GLITTER VALUE #59DEBF FRACTION 0.17 VFRACTION 0.2 SIZE 1;Transparent Light Blue with Glitter 2%;302;LDraw Glitter Colours +Glitter_Trans_Neon_Green;339;#C0FF00;#739900;128;;MATERIAL GLITTER VALUE #998C00 FRACTION 0.17 VFRACTION 0.2 SIZE 1;Transparent Fluorescent Green with Glitter 2%;339;LDraw Glitter Colours +Glitter_Trans_Orange;341;#F08F1C;#9E5C0A;128;;MATERIAL GLITTER VALUE #9E2A0A FRACTION 0.17 VFRACTION 0.2 SIZE 1;Transparent Bright Orange with Glitter 2%;341;LDraw Glitter Colours +Opal_Trans_Clear;360;#FCFCFC;#C9C9C9;240;5;MATERIAL GLITTER VALUE #FFFFFF FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Clear Opal;360;LDraw Glitter Colours +Opal_Trans_Light_Blue;362;#AEE9EF;#59D1DE;200;5;MATERIAL GLITTER VALUE #59DEBF FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Blue Opal;362;LDraw Glitter Colours +Opal_Trans_Black;363;#635F52;#2A2823;200;5;MATERIAL GLITTER VALUE #292522 FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Brown Opal;363;LDraw Glitter Colours +Opal_Trans_Dark_Pink;364;#DF6695;#B9275F;200;5;MATERIAL GLITTER VALUE #B92790 FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Medium Reddish Violet Opal;364;LDraw Glitter Colours +Opal_Trans_Purple;365;#671F81;#441456;200;5;MATERIAL GLITTER VALUE #2F1456 FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Violet Opal;365;LDraw Glitter Colours +Opal_Trans_Green;367;#237841;#174F2B;200;5;MATERIAL GLITTER VALUE #0B270B FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Green Opal;367;LDraw Glitter Colours +Glitter_Trans_Bright_Green;10351;#56E646;#27AF18;128;;MATERIAL GLITTER VALUE #59AF18 FRACTION 0.17 VFRACTION 0.2 SIZE 1;Transparent Bright Green with Glitter 2%;351;LDraw Glitter Colours +Opal_Trans_Dark_Blue;10366;#0020A0;#000B38;200;5;MATERIAL GLITTER VALUE #001D38 FRACTION 0.8 VFRACTION 0.6 MINSIZE 0.02 MAXSIZE 0.1;Transparent Blue Opal;366;LDraw Glitter Colours +Speckle_Black_Copper;75;#000000;#AB6038;;;MATERIAL SPECKLE VALUE #AB6038 FRACTION 0.4 MINSIZE 1 MAXSIZE 3;;;LDraw Speckle Colours +Speckle_Dark_Bluish_Grey_Silver;76;#635F61;#898788;;;MATERIAL SPECKLE VALUE #898788 FRACTION 0.4 MINSIZE 1 MAXSIZE 3;;;LDraw Speckle Colours +Speckle_Black_Silver;132;#000000;#898788;;;MATERIAL SPECKLE VALUE #898788 FRACTION 0.4 MINSIZE 1 MAXSIZE 3;Black Glitter;132;LDraw Speckle Colours +Speckle_Black_Gold;133;#000000;#DBAC34;;;MATERIAL SPECKLE VALUE #DBAC34 FRACTION 0.4 MINSIZE 1 MAXSIZE 3;;;LDraw Speckle Colours +Rubber_Yellow;65;#FAC80A;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Black;256;#1B2A34;#808080;;;RUBBER;;;LDraw Rubber Colours +Rubber_Blue;273;#1E5AA8;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Red;324;#B40000;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Orange;350;#D67923;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Light_Grey;375;#8A928D;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Dark_Blue;406;#19325A;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Purple;449;#671F81;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Lime;490;#A5CA18;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Light_Bluish_Grey;496;#969696;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Flat_Silver;504;#898788;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_White;511;#F4F4F4;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Green;10002;#00852B;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Bright_Green;10010;#58AB41;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Magenta;10026;#901F76;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Medium_Lavender;10030;#A06EB9;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Lavender;10031;#CDA4DE;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Reddish_Brown;10070;#5F3109;#808080;;;RUBBER;;;LDraw Rubber Colours +Rubber_Medium_Blue;10073;#7396C8;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Light_Nougat;10078;#FFC995;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Bright_Light_Yellow;10226;#FFEC6C;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Dark_Brown;10308;#352100;#808080;;;RUBBER;;;LDraw Rubber Colours +Rubber_Dark_Red;10320;#720012;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Dark_Azure;10321;#469BC3;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Medium_Azure;10322;#68C3E2;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Light_Aqua;10323;#D3F2EA;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Sand_Green;10378;#708E7C;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Dark_Orange;10484;#91501C;#333333;;;RUBBER;;;LDraw Rubber Colours +Rubber_Trans_Yellow;66;#F5CD2F;#B49208;128;;RUBBER;;;LDraw Transparent Rubber Colours +Rubber_Trans_Clear;67;#FCFCFC;#C9C9C9;128;;RUBBER;;;LDraw Transparent Rubber Colours +Rubber_Trans_Bright_Green;10035;#56E646;#27AF18;128;;RUBBER;;;LDraw Transparent Rubber Colours +Rubber_Trans_Red;10036;#C91A09;#660D05;128;;RUBBER;;;LDraw Transparent Rubber Colours +Rubber_Trans_Light_Blue;10043;#AEE9EF;#59D1DE;128;;RUBBER;;;LDraw Transparent Rubber Colours +Main_Colour;16;#FFFF80;#333333;;;;;;LDraw Internal Common Material Colours +Edge_Colour;24;#7F7F7F;#333333;;;;;;LDraw Internal Common Material Colours +Trans_Black_IR_Lens;32;#000000;#333333;210;;;Black IR;109;LDraw Internal Common Material Colours +Magnet;493;#656761;#333333;;;METAL;;;LDraw Internal Common Material Colours +Electric_Contact_Alloy;494;#D0D0D0;#333333;;;METAL;;;LDraw Internal Common Material Colours +Electric_Contact_Copper;495;#AE7A59;#333333;;;METAL;;;LDraw Internal Common Material Colours +Trans_Sticker;10047;#FFFFFF;#FFFFFF;16;;;;;LDraw Internal Common Material Colours diff --git a/app/brickcolor.py b/app/brickcolor.py index 6b22842..11f9f02 100644 --- a/app/brickcolor.py +++ b/app/brickcolor.py @@ -4,38 +4,81 @@ def isBrickColor(color_code: str): elif not color_code.startswith("0x2"): if not color_code.isdigit(): return (False, "Invalid Color Code", - f"The provided color code '{color_code}' is not a number.\n " - f"Use a code from the LDraw Colour Definition Reference.\n" - f"If you wanted to use a Direct/HTML color the format is 0x2RRGGBB " - f"(R,B and G are hexadecimal).") + f"The provided color code '{color_code}' is not a number.\n " + f"Use a code from the LDraw Colour Definition Reference.\n" + f"If you wanted to use a Direct/HTML color the format is 0x2RRGGBB " + f"(R,B and G are hexadecimal).") elif color_code.startswith("0x2"): if len(color_code) > 9: return (False, "Invalid Color Code", - f"The provided color '{color_code}' seems to be a Direct/HTML color but is to long.") + f"The provided color '{color_code}' seems to be a Direct/HTML color but is to long.") elif len(color_code) < 9: return (False, "Invalid Color Code", - f"The provided color '{color_code}' seems to be a Direct/HTML color but is to short.") + f"The provided color '{color_code}' seems to be a Direct/HTML color but is to short.") for i in range(2, 9): if color_code[i] not in ["A", "B", "C", "D", "E", "F"] and not color_code[i].isdigit(): return (False, "Invalid Color Code", - f"The provided color '{color_code}' seems to be a Direct/HTML color, " - f"but contains a invalid charcter at position: {i - 2} - '{color_code[i]}'.\n" - f"Valid characters are 0-9 and A-F(uppercase)") - return (True,) + f"The provided color '{color_code}' seems to be a Direct/HTML color, " + f"but contains a invalid charcter at position: {i - 2} - '{color_code[i]}'.\n" + f"Valid characters are 0-9 and A-F(uppercase)") + return True, + class brickcolor: - def __init__(self, color_code: str): + def __new__(cls, color_code: str): if not isBrickColor(color_code)[0]: return None + instance = super().__new__(cls) + return instance + + def __init__(self, color_code: str): self.color_code = color_code if color_code.startswith("0x2"): self.color_type = "Direct" + self.rgb_values = f"#{self.color_code[2:]}" else: self.color_type = "LDraw" + self.ldrawname, _, \ + self.rgb_values, \ + self.rgb_edge, \ + self.alpha, \ + self.luminance, \ + self.material, \ + self.legoname, \ + self.legoid, \ + self.category = colorInfoById(self.color_code) - def getRGB(self): + def __str__(self): if self.color_type == "Direct": - return self.color_code[2:] + return f"Direct Color: {self.color_code}" else: - #Todo: Load Value from file - return None + if self.ldrawname is not None: + return f"LDraw Color {self.color_code}: {self.ldrawname}, {self.rgb_values}" + else: + return f"Unknown LDraw Color {self.color_code}" + + def __repr__(self): + return f"brickcolor({self.color_code})" + + +def colorInfoById(id: str): + found_color = [None]*10 + with open("BrickColors.csv", "r", encoding="utf-8") as source: + # skip row with column names + source.readline() + for line in source: + values = line.split(";") + if values[1] == id: + for i in range(len(values)): + # replace empty values with None + if len(values[i]) == 0: + values[i] = None + found_color = values + break + + return found_color + + +testcolor = brickcolor("0x2F0000") + +print(testcolor) From fc605b4b315fb76d6f9ce2bbfa60aeb210ada5ed Mon Sep 17 00:00:00 2001 From: Nexusnui <131207888+Nexusnui@users.noreply.github.com> Date: Wed, 25 Oct 2023 11:32:42 +0200 Subject: [PATCH 04/17] code cleanup -reformatted app.py and stlToDat.py -removed unnecessary brackets in stlToDat.py --- app/app.py | 7 ++++--- app/stlToDat.py | 28 +++++++++++++++------------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/app/app.py b/app/app.py index 2340bb4..425d318 100644 --- a/app/app.py +++ b/app/app.py @@ -6,6 +6,7 @@ os.chdir(os.path.dirname(__file__)) + class App(customtkinter.CTk): def __init__(self): super().__init__() @@ -47,13 +48,12 @@ def __init__(self): self.output_file_label.grid(sticky="ew", columnspan=2, row=5, column=0) self.output_file_button = customtkinter.CTkButton(self.main_frame, text="Select Output File", - command=self.set_output_file) + command=self.set_output_file) self.output_file_button.grid(sticky="ew", row=5, column=2) self.convertFileButton = customtkinter.CTkButton(self.main_frame, text="convert file", command=self.convertFile) self.convertFileButton.grid(sticky="ew", row=6, column=1) - def get_input_file(self): input_file_path = customtkinter.filedialog.askopenfilename(filetypes=[('stl files', '*.stl')]) @@ -102,6 +102,7 @@ def convertFile(self): tkMessageBox.showwarning('Converted File', f'stl file converted to "{output_file_path}"\n' f'Part contains {number_triangles} triangles.') + if __name__ == "__main__": app = App() - app.mainloop() \ No newline at end of file + app.mainloop() diff --git a/app/stlToDat.py b/app/stlToDat.py index 3cb74d6..cafec01 100644 --- a/app/stlToDat.py +++ b/app/stlToDat.py @@ -7,11 +7,12 @@ import os import sys -#install "numpy-stl" not "stl" +# install "numpy-stl" not "stl" from stl import mesh -def stlToDat(input_filename:str, output_filename:str, colour:str= "16"): - mm_to_ldu = 1.0/0.4 + +def stlToDat(input_filename: str, output_filename: str, colour: str = "16"): + mm_to_ldu = 1.0 / 0.4 inputMesh = mesh.Mesh.from_file(input_filename) inputMesh.x *= mm_to_ldu @@ -19,25 +20,26 @@ def stlToDat(input_filename:str, output_filename:str, colour:str= "16"): inputMesh.z *= mm_to_ldu with open(output_filename, "w", encoding="utf-8") as fp_out: - #0: Comment or META command the first 0 line is alway the filename + # 0: Comment or META command the first 0 line is alway the filename fp_out.write(f"0 FILE {os.path.basename(output_filename)}\n") fp_out.write("0 !LDRAW_ORG Unofficial_part\n") - #Todo: Add License Meta command to file + # Todo: Add License Meta command to file fp_out.write("0 BFC CERTIFY CCW\n") for index, triangle in enumerate(inputMesh): # 3:filled triangle, 16:Default color fp_out.write(f"3 {colour} {' '.join(map(lambda a: str(a), triangle))}\n") - #return number of triangles + # return number of triangles return len(inputMesh) + if __name__ == '__main__': print(sys.argv) arg_len = len(sys.argv) - if (arg_len < 2 or arg_len in [3,5]): + if arg_len < 2 or arg_len in [3, 5]: print("usage: [optional]-o [optional]-c ") exit() @@ -45,16 +47,16 @@ def stlToDat(input_filename:str, output_filename:str, colour:str= "16"): output_filename = os.path.splitext(sys.argv[1])[0] + ".dat" colour = "16" - if (arg_len > 2): - if (sys.argv[2] == "-o"): + if arg_len > 2: + if sys.argv[2] == "-o": output_filename = sys.argv[3] - elif (sys.argv[2] == "-c"): + elif sys.argv[2] == "-c": colour = sys.argv[3] - if (arg_len > 4): - if (sys.argv[4] == "-o"): + if arg_len > 4: + if sys.argv[4] == "-o": output_filename = sys.argv[5] - elif (sys.argv[4] == "-c"): + elif sys.argv[4] == "-c": colour = sys.argv[5] print(f"Part contains {stlToDat(input_filename, output_filename, colour)} triangles.") From 9cb07f12a63b0d5f63a1b1db444dc023ccab3ef6 Mon Sep 17 00:00:00 2001 From: Nexusnui <131207888+Nexusnui@users.noreply.github.com> Date: Wed, 25 Oct 2023 20:39:19 +0200 Subject: [PATCH 05/17] get complementary color -added function for calculating complementary color --- app/brickcolor.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/brickcolor.py b/app/brickcolor.py index 11f9f02..f054fa8 100644 --- a/app/brickcolor.py +++ b/app/brickcolor.py @@ -79,6 +79,9 @@ def colorInfoById(id: str): return found_color -testcolor = brickcolor("0x2F0000") +def getComplementaryColor(rgb_values): + red = '%02X' % (255 - int(rgb_values[1:3], 16)) + green = '%02X' % (255 - int(rgb_values[3:5], 16)) + blue = '%02X' % (255 - int(rgb_values[5:7], 16)) -print(testcolor) + return f"#{''.join([red, green, blue])}" From d1f34962d76f9b03b16703aec5feb70870256aa9 Mon Sep 17 00:00:00 2001 From: Nexusnui <131207888+Nexusnui@users.noreply.github.com> Date: Wed, 25 Oct 2023 20:42:17 +0200 Subject: [PATCH 06/17] minor name changes --- app/brickcolor.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/brickcolor.py b/app/brickcolor.py index f054fa8..dc3b2bc 100644 --- a/app/brickcolor.py +++ b/app/brickcolor.py @@ -46,7 +46,7 @@ def __init__(self, color_code: str): self.material, \ self.legoname, \ self.legoid, \ - self.category = colorInfoById(self.color_code) + self.category = getColorInfoById(self.color_code) def __str__(self): if self.color_type == "Direct": @@ -61,7 +61,7 @@ def __repr__(self): return f"brickcolor({self.color_code})" -def colorInfoById(id: str): +def getColorInfoById(id: str): found_color = [None]*10 with open("BrickColors.csv", "r", encoding="utf-8") as source: # skip row with column names @@ -79,7 +79,7 @@ def colorInfoById(id: str): return found_color -def getComplementaryColor(rgb_values): +def getComplementaryColor(rgb_values: str): red = '%02X' % (255 - int(rgb_values[1:3], 16)) green = '%02X' % (255 - int(rgb_values[3:5], 16)) blue = '%02X' % (255 - int(rgb_values[5:7], 16)) From 61299fd169e90d77baf1693c32232ffb97107a44 Mon Sep 17 00:00:00 2001 From: Nexusnui <131207888+Nexusnui@users.noreply.github.com> Date: Thu, 26 Oct 2023 16:35:44 +0200 Subject: [PATCH 07/17] Edge Color for Direct Color set edge color to complementary color --- app/brickcolor.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app/brickcolor.py b/app/brickcolor.py index dc3b2bc..3782ca2 100644 --- a/app/brickcolor.py +++ b/app/brickcolor.py @@ -36,6 +36,7 @@ def __init__(self, color_code: str): if color_code.startswith("0x2"): self.color_type = "Direct" self.rgb_values = f"#{self.color_code[2:]}" + self.rgb_edge = getComplementaryColor(self.rgb_values) else: self.color_type = "LDraw" self.ldrawname, _, \ From 167f374e3f60e73c8ebe57d5144bfac6c74cff56 Mon Sep 17 00:00:00 2001 From: Nexusnui <131207888+Nexusnui@users.noreply.github.com> Date: Thu, 26 Oct 2023 16:46:22 +0200 Subject: [PATCH 08/17] Add color preview to GUI A color preview was added under the color input. It alwasy display the color that is applied to the model. --- app/app.py | 43 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/app/app.py b/app/app.py index 425d318..d119458 100644 --- a/app/app.py +++ b/app/app.py @@ -1,5 +1,5 @@ from stlToDat import stlToDat -from brickcolor import isBrickColor +from brickcolor import isBrickColor, brickcolor import customtkinter from tkinter import messagebox as tkMessageBox import os @@ -10,7 +10,7 @@ class App(customtkinter.CTk): def __init__(self): super().__init__() - self.geometry("400x220") + self.geometry("400x250") self.iconbitmap("../icons/stlToLDraw_icon.ico") self.title("stl to LDraw dat file") self.grid_columnconfigure(0, weight=1) @@ -26,6 +26,9 @@ def __init__(self): self.color_code_Var = customtkinter.StringVar() self.color_toggle_Var = customtkinter.StringVar(value="off") + self.color_code_Var.trace("w", self.updateColorPreview) + self.color_toggle_Var.trace("w", self.updateColorPreview) + customtkinter.CTkLabel(self.main_frame, text="Input File:").grid(sticky="w", columnspan=2, row=0, column=0) self.input_file_path_label = customtkinter.CTkEntry(self.main_frame, textvariable=self.input_file_Var) self.input_file_path_label.grid(sticky="we", columnspan=2, row=1, column=0) @@ -43,16 +46,22 @@ def __init__(self): offvalue="off") self.color_toggle_checkbox.grid(sticky="ew", columnspan=2, row=3, column=2) - customtkinter.CTkLabel(self.main_frame, text="Output File:").grid(sticky="w", columnspan=2, row=4, column=0) + customtkinter.CTkLabel(self.main_frame, text="Color Preview:").grid(sticky="w", columnspan=1, + row=4, column=0) + self.color_preview = customtkinter.CTkLabel(self.main_frame, text="Main_Colour", text_color="#333333", + fg_color="#FFFF80", padx=3, corner_radius=5) + self.color_preview.grid(sticky="w", columnspan=2, row=4, column=1) + + customtkinter.CTkLabel(self.main_frame, text="Output File:").grid(sticky="w", columnspan=2, row=6, column=0) self.output_file_label = customtkinter.CTkEntry(self.main_frame, textvariable=self.output_file_Var) - self.output_file_label.grid(sticky="ew", columnspan=2, row=5, column=0) + self.output_file_label.grid(sticky="ew", columnspan=2, row=7, column=0) self.output_file_button = customtkinter.CTkButton(self.main_frame, text="Select Output File", command=self.set_output_file) - self.output_file_button.grid(sticky="ew", row=5, column=2) + self.output_file_button.grid(sticky="ew", row=7, column=2) self.convertFileButton = customtkinter.CTkButton(self.main_frame, text="convert file", command=self.convertFile) - self.convertFileButton.grid(sticky="ew", row=6, column=1) + self.convertFileButton.grid(sticky="ew", row=8, column=1) def get_input_file(self): input_file_path = customtkinter.filedialog.askopenfilename(filetypes=[('stl files', '*.stl')]) @@ -76,6 +85,28 @@ def set_output_file(self): if len(output_file_path) > 0: self.output_file_Var.set(output_file_path) + def updateColorPreview(self, *args): + set_color = brickcolor("16") + if self.color_toggle_Var.get() == "on": + set_color = brickcolor(self.color_code_Var.get()) + if set_color is not None: + if set_color.color_type == "LDraw" and set_color.ldrawname is not None: + self.color_preview.configure(text=set_color.ldrawname, text_color=set_color.rgb_edge, + fg_color=set_color.rgb_values) + return + elif set_color.color_type == "Direct": + self.color_preview.configure(text=set_color.color_code, text_color=set_color.rgb_edge, + fg_color=set_color.rgb_values) + return + else: + self.color_preview.configure(text="Unknown or invalid color", text_color="#FFFFFF", + fg_color="#000000") + elif len(self.color_code_Var.get()) == 0: + self.color_preview.configure(text="", fg_color="transparent") + return + else: + self.color_preview.configure(text="Unknown or invalid color", text_color="#FFFFFF", fg_color="#000000") + def convertFile(self): input_file_path = self.input_file_Var.get() output_file_path = self.output_file_Var.get() From c741bb4f3dce171ed1e54164cb3826ccc4164624 Mon Sep 17 00:00:00 2001 From: Nexusnui <131207888+Nexusnui@users.noreply.github.com> Date: Thu, 26 Oct 2023 16:50:37 +0200 Subject: [PATCH 09/17] direct color code fix corrected color code stored in direct color --- app/brickcolor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/brickcolor.py b/app/brickcolor.py index 3782ca2..b68193e 100644 --- a/app/brickcolor.py +++ b/app/brickcolor.py @@ -35,7 +35,7 @@ def __init__(self, color_code: str): self.color_code = color_code if color_code.startswith("0x2"): self.color_type = "Direct" - self.rgb_values = f"#{self.color_code[2:]}" + self.rgb_values = f"#{self.color_code[3:]}" self.rgb_edge = getComplementaryColor(self.rgb_values) else: self.color_type = "LDraw" From 7a85ce4409b9ce6e4488ba120a7a84d6fcfbe247 Mon Sep 17 00:00:00 2001 From: Nexusnui <131207888+Nexusnui@users.noreply.github.com> Date: Thu, 26 Oct 2023 16:56:34 +0200 Subject: [PATCH 10/17] Small Fixes -corrected window size -corected rows for items -display hexcolor with "#" instead of the color code for direct colors --- app/app.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/app.py b/app/app.py index d119458..6e89166 100644 --- a/app/app.py +++ b/app/app.py @@ -10,7 +10,7 @@ class App(customtkinter.CTk): def __init__(self): super().__init__() - self.geometry("400x250") + self.geometry("400x240") self.iconbitmap("../icons/stlToLDraw_icon.ico") self.title("stl to LDraw dat file") self.grid_columnconfigure(0, weight=1) @@ -52,16 +52,16 @@ def __init__(self): fg_color="#FFFF80", padx=3, corner_radius=5) self.color_preview.grid(sticky="w", columnspan=2, row=4, column=1) - customtkinter.CTkLabel(self.main_frame, text="Output File:").grid(sticky="w", columnspan=2, row=6, column=0) + customtkinter.CTkLabel(self.main_frame, text="Output File:").grid(sticky="w", columnspan=2, row=5, column=0) self.output_file_label = customtkinter.CTkEntry(self.main_frame, textvariable=self.output_file_Var) - self.output_file_label.grid(sticky="ew", columnspan=2, row=7, column=0) + self.output_file_label.grid(sticky="ew", columnspan=2, row=6, column=0) self.output_file_button = customtkinter.CTkButton(self.main_frame, text="Select Output File", command=self.set_output_file) - self.output_file_button.grid(sticky="ew", row=7, column=2) + self.output_file_button.grid(sticky="ew", row=6, column=2) self.convertFileButton = customtkinter.CTkButton(self.main_frame, text="convert file", command=self.convertFile) - self.convertFileButton.grid(sticky="ew", row=8, column=1) + self.convertFileButton.grid(sticky="ew", row=7, column=1) def get_input_file(self): input_file_path = customtkinter.filedialog.askopenfilename(filetypes=[('stl files', '*.stl')]) @@ -95,7 +95,7 @@ def updateColorPreview(self, *args): fg_color=set_color.rgb_values) return elif set_color.color_type == "Direct": - self.color_preview.configure(text=set_color.color_code, text_color=set_color.rgb_edge, + self.color_preview.configure(text=set_color.rgb_values, text_color=set_color.rgb_edge, fg_color=set_color.rgb_values) return else: From df1df559087a753f00674c713b968ba09713a7c3 Mon Sep 17 00:00:00 2001 From: Nexusnui <131207888+Nexusnui@users.noreply.github.com> Date: Thu, 26 Oct 2023 17:08:09 +0200 Subject: [PATCH 11/17] Update GUI screenshot updated the screenshot of the gui to the new version --- graphical_userinterface.png | Bin 30957 -> 34423 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/graphical_userinterface.png b/graphical_userinterface.png index da9d9e0354587e16379317b82fc5e9faafaede93..e363fc3a46ad498e9b4170832d1fe1665f4b4c7f 100644 GIT binary patch literal 34423 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

a@r8FPY%Znw*N@l|eVLXHQpincnHNM{A(UO|b!o zBCYResKqn9CXU8FRV92pW6q?o{qVNA>)Oy~FL^v6m)TY1!Z8y{jYPN*S}lHNk}0y7 zyPiKtO9pd8%{yM?xkVf8=R|nb+k2RGy)EkYbzPpgTTloo6=RMk`c%Z4Z@KU=|&JBSbCaIYpuK)hs=q zl$6%`056o5_PGJC$MoQWanF?P*9A5#oy$qLqe^%+UewVkf&tboy zrMscUCv!_LT-%n`-m>w+vRi6&3vAQfiwD`{OYNtMA{Pm_SiPBMy^3mTJ*zAlDd(a- za-o)b9Hn%&(?oSOBe|1PtqmJ?njI!enot4 zUX29N&2T4)Pg3x>ZOJ_$6j|3@2N*)$pG-MAVAd(?2>WtK&5E^l%@l9Xu4*goH~UP~CvFvF5mC7N&BHZkyHheHl>JYC?<1iBu*gY<(I8TS)n)M-tLJ5O{9yi*qp$kOOAF|vMJzusxub}EQJgW-BuT+f)4q#*K43 zSZktm(TEIYR~5J!aEu!%^8SnfGTXJsIS1!EH-XEqhRx3)O$u92Yz;jsrv~L!Ej%#_e=iPSzD6}XH%d@P5@b!o9Y|Hc zD^pElul>)`49|165m8rOMv_evdIeTL#C{GG^_L|O=bh27H@z(G2=^{8AkgyF@GWbP zs12fKL%lv}kMJj{qS1=V89fZsdr)t+=e{eaxpJjZ1`Tc8HG1q3dU%VBzWcRTvwY2> z+2k@;sPjv6EMiMH_=eBdow3jp9-zCT|G;Da0!iXr-yQp!rmKaXIj>s8dU-?+HtMr5 z(~30d85BJ%Cw7jaM*6opQG3r*hj_P+aryj`5BH0uHk?$YbDb^~Y~9cN6e;TUEOh?O z%NEDSS*b$~$8wP9jwMQpol{W>Az!_1f_=m{(L6BG8cKmtSjyPiW{exA3C|-LG@R@R z>Yc0b$}djYwBDs(F8;wQG2pz`q+PkGvFS_hrjSsX*jUyT+DIFF&3xf-!gQhqVHBh&({Ac8wO^tInDTsM?Y@4(@C1XUs9l)h_D+<}N^fYTuhn3T(7G&&zYgAK}JGQ|7GLDJT&h&>%e0MQgpk=m%LVkqRiW*0O0x zVWJcbzgTG)%dXZ%F8y-+G{ibku8PpqaN=we(DXiQVu_{1CAsl8&8HcRNoC{IJ+)+n zkA_EmBPz9>520Td>=r-OKIUn7u)*Mih(tU-gfz@A6~z)5jBNV)BFfy`ikoIi-Di8t z+apkO?f?^ruB~EB_#kg3ZG?cH6XF}A&rDDx^bmmJrHBIJf57I39wIN;Q z<+&Bc#2@IpZ3zt_A8@J2{ihaME)ld5v0F#IHU)rFis}d~$PS7RU>n4UI&SVoZE>UK7CkMNrGLxW)TK~O!O3- zDawO0?nqyI862KAl$DZm95Q4OpX-)fe%`vlGqT<5H0Uh~{diVZBbxN1G{=Y=O}b=k znw9hq&4j34Ca?&`P9Epc5^P$bFT?gS;(W{sOUHNj0<#{@IJ|-p^@=PB9IE@pM<|3P zj?>EK=daK|ibK@edl-H?M`L+(jn%ST`LaH?(SU8ow{-=S8iOh{f^A~`f}SST!*MFR zXnqjYw*%i1@5ez>GQMG&ew`lwyqC<5p=v2sH2@b9%f-`rld3RDnmJp?nrjg$Wu@%A zRZ#NQ%}6%B2DQ}cXbRDF!XG*1kJhcoFDJv{xDMpSPq_$u38TNPvJ`y8WpVnAWw6K} z`$vV4K_RjNvUV8UvD~n=|1r6c*@@THuW430095+XQfZNI<6X%j{%cVxOzi*-t471k zLCR1XGX@s(Yz0?RzmXw8(6EfnH2q0b!5H4)^7*Ip+bP#Rx^=zc>TOZ;m9J{!gS%

*S_qqAqV&|3W4}QQ7^{0Oesh_-s&JFD`4k~!< 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 literal 30957 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 From cc255a7234b779defa1cd7de70e3ae8c85565c4b Mon Sep 17 00:00:00 2001 From: Nexusnui <131207888+Nexusnui@users.noreply.github.com> Date: Thu, 26 Oct 2023 17:36:48 +0200 Subject: [PATCH 12/17] Complementary Text Color for Preview complementary text color instead of edge color for LDraw colors --- app/app.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/app.py b/app/app.py index 6e89166..2d8cb3d 100644 --- a/app/app.py +++ b/app/app.py @@ -1,5 +1,5 @@ from stlToDat import stlToDat -from brickcolor import isBrickColor, brickcolor +from brickcolor import isBrickColor, brickcolor, getComplementaryColor import customtkinter from tkinter import messagebox as tkMessageBox import os @@ -48,8 +48,8 @@ def __init__(self): customtkinter.CTkLabel(self.main_frame, text="Color Preview:").grid(sticky="w", columnspan=1, row=4, column=0) - self.color_preview = customtkinter.CTkLabel(self.main_frame, text="Main_Colour", text_color="#333333", - fg_color="#FFFF80", padx=3, corner_radius=5) + self.color_preview = customtkinter.CTkLabel(self.main_frame, text="Main_Colour", text_color="#00008F", + fg_color="#FFFF80", padx=3, corner_radius=6) self.color_preview.grid(sticky="w", columnspan=2, row=4, column=1) customtkinter.CTkLabel(self.main_frame, text="Output File:").grid(sticky="w", columnspan=2, row=5, column=0) @@ -91,7 +91,8 @@ def updateColorPreview(self, *args): set_color = brickcolor(self.color_code_Var.get()) if set_color is not None: if set_color.color_type == "LDraw" and set_color.ldrawname is not None: - self.color_preview.configure(text=set_color.ldrawname, text_color=set_color.rgb_edge, + text_color = getComplementaryColor(set_color.rgb_values) + self.color_preview.configure(text=set_color.ldrawname, text_color=text_color, fg_color=set_color.rgb_values) return elif set_color.color_type == "Direct": From 98a24e3a3bce05eab1f392a4f8618dd2da292c2c Mon Sep 17 00:00:00 2001 From: Nexusnui <131207888+Nexusnui@users.noreply.github.com> Date: Thu, 26 Oct 2023 18:01:29 +0200 Subject: [PATCH 13/17] change constrast behavior -added contrast function -replaced previous uses of complementary function with contrast function --- app/app.py | 4 ++-- app/brickcolor.py | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/app/app.py b/app/app.py index 2d8cb3d..d2caa6c 100644 --- a/app/app.py +++ b/app/app.py @@ -1,5 +1,5 @@ from stlToDat import stlToDat -from brickcolor import isBrickColor, brickcolor, getComplementaryColor +from brickcolor import isBrickColor, brickcolor, getContrastColor import customtkinter from tkinter import messagebox as tkMessageBox import os @@ -91,7 +91,7 @@ def updateColorPreview(self, *args): set_color = brickcolor(self.color_code_Var.get()) if set_color is not None: if set_color.color_type == "LDraw" and set_color.ldrawname is not None: - text_color = getComplementaryColor(set_color.rgb_values) + text_color = getContrastColor(set_color.rgb_values) self.color_preview.configure(text=set_color.ldrawname, text_color=text_color, fg_color=set_color.rgb_values) return diff --git a/app/brickcolor.py b/app/brickcolor.py index b68193e..6717822 100644 --- a/app/brickcolor.py +++ b/app/brickcolor.py @@ -36,7 +36,7 @@ def __init__(self, color_code: str): if color_code.startswith("0x2"): self.color_type = "Direct" self.rgb_values = f"#{self.color_code[3:]}" - self.rgb_edge = getComplementaryColor(self.rgb_values) + self.rgb_edge = getContrastColor(self.rgb_values) else: self.color_type = "LDraw" self.ldrawname, _, \ @@ -63,7 +63,7 @@ def __repr__(self): def getColorInfoById(id: str): - found_color = [None]*10 + found_color = [None] * 10 with open("BrickColors.csv", "r", encoding="utf-8") as source: # skip row with column names source.readline() @@ -79,6 +79,20 @@ def getColorInfoById(id: str): return found_color +def getContrastColor(rgb_values: str): + red = hex_switch(rgb_values[1:3]) + green = hex_switch(rgb_values[3:5]) + blue = hex_switch(rgb_values[5:7]) + + return f"#{''.join([red, green, blue])}" + + +def hex_switch(hex_val: str): + if int(hex_val, 16) < 128: + return "FF" + else: + return "00" + def getComplementaryColor(rgb_values: str): red = '%02X' % (255 - int(rgb_values[1:3], 16)) From 79fbcc81b9ead38bee7c67a8b6a086b834cc84a7 Mon Sep 17 00:00:00 2001 From: Nexusnui <131207888+Nexusnui@users.noreply.github.com> Date: Thu, 26 Oct 2023 18:05:22 +0200 Subject: [PATCH 14/17] consistent function naming --- app/app.py | 16 ++++++++-------- app/brickcolor.py | 14 +++++++------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/app.py b/app/app.py index d2caa6c..4625fdd 100644 --- a/app/app.py +++ b/app/app.py @@ -1,5 +1,5 @@ from stlToDat import stlToDat -from brickcolor import isBrickColor, brickcolor, getContrastColor +from brickcolor import is_brickcolor, brickcolor, get_contrast_color import customtkinter from tkinter import messagebox as tkMessageBox import os @@ -26,8 +26,8 @@ def __init__(self): self.color_code_Var = customtkinter.StringVar() self.color_toggle_Var = customtkinter.StringVar(value="off") - self.color_code_Var.trace("w", self.updateColorPreview) - self.color_toggle_Var.trace("w", self.updateColorPreview) + self.color_code_Var.trace("w", self.update_color_preview) + self.color_toggle_Var.trace("w", self.update_color_preview) customtkinter.CTkLabel(self.main_frame, text="Input File:").grid(sticky="w", columnspan=2, row=0, column=0) self.input_file_path_label = customtkinter.CTkEntry(self.main_frame, textvariable=self.input_file_Var) @@ -60,7 +60,7 @@ def __init__(self): command=self.set_output_file) self.output_file_button.grid(sticky="ew", row=6, column=2) - self.convertFileButton = customtkinter.CTkButton(self.main_frame, text="convert file", command=self.convertFile) + self.convertFileButton = customtkinter.CTkButton(self.main_frame, text="convert file", command=self.convert_file) self.convertFileButton.grid(sticky="ew", row=7, column=1) def get_input_file(self): @@ -85,13 +85,13 @@ def set_output_file(self): if len(output_file_path) > 0: self.output_file_Var.set(output_file_path) - def updateColorPreview(self, *args): + def update_color_preview(self, *args): set_color = brickcolor("16") if self.color_toggle_Var.get() == "on": set_color = brickcolor(self.color_code_Var.get()) if set_color is not None: if set_color.color_type == "LDraw" and set_color.ldrawname is not None: - text_color = getContrastColor(set_color.rgb_values) + text_color = get_contrast_color(set_color.rgb_values) self.color_preview.configure(text=set_color.ldrawname, text_color=text_color, fg_color=set_color.rgb_values) return @@ -108,13 +108,13 @@ def updateColorPreview(self, *args): else: self.color_preview.configure(text="Unknown or invalid color", text_color="#FFFFFF", fg_color="#000000") - def convertFile(self): + def convert_file(self): input_file_path = self.input_file_Var.get() output_file_path = self.output_file_Var.get() color_code = "16" if self.color_toggle_Var.get() == "on": color_code = self.color_code_Var.get() - color_check = isBrickColor(color_code) + color_check = is_brickcolor(color_code) if not color_check[0]: tkMessageBox.showwarning(color_check[1], color_check[2]) return diff --git a/app/brickcolor.py b/app/brickcolor.py index 6717822..183f8a4 100644 --- a/app/brickcolor.py +++ b/app/brickcolor.py @@ -1,4 +1,4 @@ -def isBrickColor(color_code: str): +def is_brickcolor(color_code: str): if len(color_code) < 1: return False, "No Color Code", "Apply Checkbox was toggled, but no color code provided" elif not color_code.startswith("0x2"): @@ -26,7 +26,7 @@ def isBrickColor(color_code: str): class brickcolor: def __new__(cls, color_code: str): - if not isBrickColor(color_code)[0]: + if not is_brickcolor(color_code)[0]: return None instance = super().__new__(cls) return instance @@ -36,7 +36,7 @@ def __init__(self, color_code: str): if color_code.startswith("0x2"): self.color_type = "Direct" self.rgb_values = f"#{self.color_code[3:]}" - self.rgb_edge = getContrastColor(self.rgb_values) + self.rgb_edge = get_contrast_color(self.rgb_values) else: self.color_type = "LDraw" self.ldrawname, _, \ @@ -47,7 +47,7 @@ def __init__(self, color_code: str): self.material, \ self.legoname, \ self.legoid, \ - self.category = getColorInfoById(self.color_code) + self.category = get_color_info_by_id(self.color_code) def __str__(self): if self.color_type == "Direct": @@ -62,7 +62,7 @@ def __repr__(self): return f"brickcolor({self.color_code})" -def getColorInfoById(id: str): +def get_color_info_by_id(id: str): found_color = [None] * 10 with open("BrickColors.csv", "r", encoding="utf-8") as source: # skip row with column names @@ -79,7 +79,7 @@ def getColorInfoById(id: str): return found_color -def getContrastColor(rgb_values: str): +def get_contrast_color(rgb_values: str): red = hex_switch(rgb_values[1:3]) green = hex_switch(rgb_values[3:5]) blue = hex_switch(rgb_values[5:7]) @@ -94,7 +94,7 @@ def hex_switch(hex_val: str): return "00" -def getComplementaryColor(rgb_values: str): +def get_complementary_color(rgb_values: str): red = '%02X' % (255 - int(rgb_values[1:3], 16)) green = '%02X' % (255 - int(rgb_values[3:5], 16)) blue = '%02X' % (255 - int(rgb_values[5:7], 16)) From 9cfa2f43370a112bf82e3faa3ea2034af70ecd39 Mon Sep 17 00:00:00 2001 From: Nexusnui <131207888+Nexusnui@users.noreply.github.com> Date: Thu, 26 Oct 2023 18:53:15 +0200 Subject: [PATCH 15/17] color preview text contrast screenshot --- graphical_userinterface.png | Bin 34423 -> 34556 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/graphical_userinterface.png b/graphical_userinterface.png index e363fc3a46ad498e9b4170832d1fe1665f4b4c7f..c1bdf35d52303b80a5326ead974a56cb04572b2c 100644 GIT binary patch literal 34556 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 literal 34423 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

a@r8FPY%Znw*N@l|eVLXHQpincnHNM{A(UO|b!o zBCYResKqn9CXU8FRV92pW6q?o{qVNA>)Oy~FL^v6m)TY1!Z8y{jYPN*S}lHNk}0y7 zyPiKtO9pd8%{yM?xkVf8=R|nb+k2RGy)EkYbzPpgTTloo6=RMk`c%Z4Z@KU=|&JBSbCaIYpuK)hs=q zl$6%`056o5_PGJC$MoQWanF?P*9A5#oy$qLqe^%+UewVkf&tboy zrMscUCv!_LT-%n`-m>w+vRi6&3vAQfiwD`{OYNtMA{Pm_SiPBMy^3mTJ*zAlDd(a- za-o)b9Hn%&(?oSOBe|1PtqmJ?njI!enot4 zUX29N&2T4)Pg3x>ZOJ_$6j|3@2N*)$pG-MAVAd(?2>WtK&5E^l%@l9Xu4*goH~UP~CvFvF5mC7N&BHZkyHheHl>JYC?<1iBu*gY<(I8TS)n)M-tLJ5O{9yi*qp$kOOAF|vMJzusxub}EQJgW-BuT+f)4q#*K43 zSZktm(TEIYR~5J!aEu!%^8SnfGTXJsIS1!EH-XEqhRx3)O$u92Yz;jsrv~L!Ej%#_e=iPSzD6}XH%d@P5@b!o9Y|Hc zD^pElul>)`49|165m8rOMv_evdIeTL#C{GG^_L|O=bh27H@z(G2=^{8AkgyF@GWbP zs12fKL%lv}kMJj{qS1=V89fZsdr)t+=e{eaxpJjZ1`Tc8HG1q3dU%VBzWcRTvwY2> z+2k@;sPjv6EMiMH_=eBdow3jp9-zCT|G;Da0!iXr-yQp!rmKaXIj>s8dU-?+HtMr5 z(~30d85BJ%Cw7jaM*6opQG3r*hj_P+aryj`5BH0uHk?$YbDb^~Y~9cN6e;TUEOh?O z%NEDSS*b$~$8wP9jwMQpol{W>Az!_1f_=m{(L6BG8cKmtSjyPiW{exA3C|-LG@R@R z>Yc0b$}djYwBDs(F8;wQG2pz`q+PkGvFS_hrjSsX*jUyT+DIFF&3xf-!gQhqVHBh&({Ac8wO^tInDTsM?Y@4(@C1XUs9l)h_D+<}N^fYTuhn3T(7G&&zYgAK}JGQ|7GLDJT&h&>%e0MQgpk=m%LVkqRiW*0O0x zVWJcbzgTG)%dXZ%F8y-+G{ibku8PpqaN=we(DXiQVu_{1CAsl8&8HcRNoC{IJ+)+n zkA_EmBPz9>520Td>=r-OKIUn7u)*Mih(tU-gfz@A6~z)5jBNV)BFfy`ikoIi-Di8t z+apkO?f?^ruB~EB_#kg3ZG?cH6XF}A&rDDx^bmmJrHBIJf57I39wIN;Q z<+&Bc#2@IpZ3zt_A8@J2{ihaME)ld5v0F#IHU)rFis}d~$PS7RU>n4UI&SVoZE>UK7CkMNrGLxW)TK~O!O3- zDawO0?nqyI862KAl$DZm95Q4OpX-)fe%`vlGqT<5H0Uh~{diVZBbxN1G{=Y=O}b=k znw9hq&4j34Ca?&`P9Epc5^P$bFT?gS;(W{sOUHNj0<#{@IJ|-p^@=PB9IE@pM<|3P zj?>EK=daK|ibK@edl-H?M`L+(jn%ST`LaH?(SU8ow{-=S8iOh{f^A~`f}SST!*MFR zXnqjYw*%i1@5ez>GQMG&ew`lwyqC<5p=v2sH2@b9%f-`rld3RDnmJp?nrjg$Wu@%A zRZ#NQ%}6%B2DQ}cXbRDF!XG*1kJhcoFDJv{xDMpSPq_$u38TNPvJ`y8WpVnAWw6K} z`$vV4K_RjNvUV8UvD~n=|1r6c*@@THuW430095+XQfZNI<6X%j{%cVxOzi*-t471k zLCR1XGX@s(Yz0?RzmXw8(6EfnH2q0b!5H4)^7*Ip+bP#Rx^=zc>TOZ;m9J{!gS%

*S_qqAqV&|3W4}QQ7^{0Oesh_-s&JFD`4k~!< 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 From 31a71dd6754ece2d08b3110c7ec8a3931aa955ca Mon Sep 17 00:00:00 2001 From: Nexusnui <131207888+Nexusnui@users.noreply.github.com> Date: Sat, 28 Oct 2023 12:42:38 +0200 Subject: [PATCH 16/17] Change Contrast Function -Contrast function now returns either black or white -updated GUI screenshot --- app/brickcolor.py | 17 ++++++----------- graphical_userinterface.png | Bin 34556 -> 34526 bytes 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/app/brickcolor.py b/app/brickcolor.py index 183f8a4..4bc06f2 100644 --- a/app/brickcolor.py +++ b/app/brickcolor.py @@ -80,18 +80,13 @@ def get_color_info_by_id(id: str): return found_color def get_contrast_color(rgb_values: str): - red = hex_switch(rgb_values[1:3]) - green = hex_switch(rgb_values[3:5]) - blue = hex_switch(rgb_values[5:7]) - - return f"#{''.join([red, green, blue])}" - - -def hex_switch(hex_val: str): - if int(hex_val, 16) < 128: - return "FF" + r = 0 if int(rgb_values[1:3], 16) < 128 else 1 + g = 0 if int(rgb_values[3:5], 16) < 128 else 1 + b = 0 if int(rgb_values[5:7], 16) < 128 else 1 + if r+g+b < 2: + return "#FFFFFF" else: - return "00" + return "#000000" def get_complementary_color(rgb_values: str): diff --git a/graphical_userinterface.png b/graphical_userinterface.png index c1bdf35d52303b80a5326ead974a56cb04572b2c..a9be42b882c70053fcdd89312edd86d83bfed687 100644 GIT binary patch literal 34526 zcmeFZbzD{7(=d7f329WiK|ty5Zly~=x;qbXXpja$P$_AVlJ4%7mhSHEL*IS;et-4e z=kvMmbMJfqd(KDQXYak%teII;Yi5q&%8D`=s6?nB5D4RqtfVRk1m6Mz!Ofr`0Z%^Z zs&N9BE>CqW7gZy73P)!Lb1Pdj3KtJYGYT_^l{p9mnYB|E!|b3yZ#at(qU?N)F`Q|` zaDeRf0RQxNqWM#SC>@@cdPh^KWTYuHebqMk*)d{2)$QNC;+tKTXNN4;hG#XLk7;L_ zswK8#Fco`Tt_9}TX;=9m?r?lG;rdxy{_x~lFi2RXWEkZq&J#Ck8PPKvmHc`Z%?8Wh zn>VT7icKDc`|alhcy6&0SxjTtD1<>bV&Z!tY!U}uwzCvj5{X}?#UBo=sC+<|tnU%v z#ge)K>Vm8!B$VGsNc@8!fQ%HMSRvUC0b6Ux&>XIN%eFzkZ)Ii3!&?D7F6gx)loalNpD)qLJ<#lD)N!x}`%GJTeLJ10mJZ@KQr@T;{-as4JXQ89#s)1nmwE1d_NHu~M!JEn{ zWhX?cQB1JGYA59?T%wTbb>~*+7bGs(yI$9s4W1#hP{cGscIPCIRqQgYL!-J-?JnhT zi!kblpDN8U?%FGjUD`!lTDeLO?S?8kea@-$A794Dh!atnawA4>%`Np*F9^fk4Y$Tk zUQFq<&eQD-7US{3htvc_?iJG>!6gW^Zhv7W{7ikFAEf#eB9i4m52CISH5^RU*&@ls z5{)*m@}(a6Nc%!R_(%)-iEi0Y`Jg^I$;RESEGOMz9vQNqm9O4ifaOwChK z-Ne(zgwK>pL>N^N!VdtjGjlPbfY{mEgZUvsRDa;|1K(kfS*R%f3~{j$qS8`OrjT%O zHlyHV=457Nl7d*du~P}7QV2Smn)9nlO8*T4xD%qXba8RyXJK)7cV~9zV0Lh}U}59q z<6~iEXJKb&0!A=_J?veKAWZgPY8Z&WU`U#QO`NS9U924JDPS;-j2&EEgs7;1_Z0uY z&(2Xn;h*5`!GCiB;0FuD$dQGOnU%%Pj^*EHfL)~A03d%O^k2>Zs{?wU6k?LU^3d845G&lxZlSXkLP{+R_Z z`#(mySegHeS^t3>?9Cr?{v8ou`aj|R$LN31{%0^SN&*n@^Q1Wn;V&#a{L>pH}+r`BYP7w z7$^WZvlRfxoSTz}-I$w`$()0Sm5I}shmXnFgvW@<%*>dVhmV(?hnt7<-#{oiTLDsO zWc%+}!9bY;pv*WqxlK&iIRG30L^w@(d6@W2O?a8ixlD{WI5>=1IobZg#?*vg+QHe* z2-r?5J0lA-7Ds!FKWo4k&M&6?Mu>`?ne|^!lx>Y%%z+7j4p`ZnI=F-X^-A5!&P>h4 z2*yt~Za!X4UVv^+Ha2cPF8+a zP6k$Xe%5~*?_g?W?(zRL8m2xJf`4tgtQ8no-{a4tzjR8?%;~SYziw@<{wNa##UHic zH!}H)1hA2tndu)q0a$;%GO;wWw=e_j$KL|`kLOnZg)kVinsBjl8yPWi7;*42adMb) zF&Xn3n*rZ=IQiH(OwG)U{uk(A2Xhy9BWE))3xJORuK)r4!z+qce{a?6|HQ`K(hRl_ z0Lz%zSegEfWmGJG6Uzd#82_MFkmdiz55YeJ{>{Vy^Zt4Um@dE)vi#E&{>?9#(fR-J z^Y=dd|F{AG`hOPrZ}Ink*!4f``fqXIzcu)Or0aj!_21&ae{1mnNZ0={cA@_3FlA;B zL_qGqQK>M@OU_=&u9dA+pOG1u5h$ zR1(xzPg)hyJU}1{&>KlHb;#`gf}i?V*F}*BI@VY8uU_SKw1TL^tjyw3zWcj7hHe%w zsHfy9?bA(F>1xhi^wtR29`RPX|6T|fi?^@YsK3;{`|9IjV&kA=l_{n2q-x;pb3zp) zX-QF0)>wnH`?YU2iAy4e{%~oZ!2ERP#py?T;%R4TQ@1{KZHke2Ouyxm*b&px(vFXh z{Tmtt!eAe1IX^!UPcN_0xw%LI_rvA8>ofc6$+CJ;Ny*ML4vQgghtu^wTRke^5yy#%!)V4J%h zpPk*l266K6WR;YBDw6tZppp_+V^b4ltSqb5?;l8PcWJS*FD)G$dJg7lX5PYva59Ib z*6Zu*CvsZ-R$73|d{qm~-oX6x>aen=1^|Wy!}RvMR3xYW2#x%oH)P@3Q$D}Gz6Q0v z9)xX$<@~dX;?A+L=O6$}A!t!uoyi%C!>VSBHSsyE=i^G`q8}6vwAk>YO_L{}rW}xO&^ZN)h;*4Ljn;w-b$8e-Pp{o{Xz)KvTQFyu9RRg2IdHEvV0X9kqh$k6O|L z2swh%iHV!A2|eVl^i8txXXk|2O!O1lxb+i{LQ3qdrxE^;B|&AbcO~Y~Hn?D&)N#He zgy(m8%AO(v8A@TUtU=qr|LkYS1v$DW;1T4E#Qz8*A;f-U#T}sZz0cz$lTxIJyQ>F5 z_Z%Esys{jfRqv%;rNWd|J)ke4Q2~(`!Si0=yolFNuhWXZ%4A2TNoUgBwKNw+rrW zCEz8WD@tJH;NV~rk-G!@QzNa&Y8yB$45m|lP6DG zB`mC$i_xH&1f;B?VRpsuTu0KMz|v#zc%#Wp;oqNNQ+k}{1>)iHzCEbnPH1_2xOE!- zfLMFnfyE5Qlt68Xiu!_s=caR2!J9e*9v*as=p1R-96vDfa2VAP+v)ib{OWuGDs|aW zeS(aPb*x00M8FcYVtp#i=~5t*OBW z?4I$OmCx0JyCWFfA%unp@}B@PA}x_K>vy_ip1){tfnFT5k_6!qc@p#3LuMFVS!GiC zr*xAfZWl5`m;C)f5DyQGy0#yxuV-gxbvNPNTwRkeoB^|;Rc`tek6AY?EsYF`%Ps~3 z1x3`tB3B|n+tz}L>KlZU2(y-l7D?X*PD=zjJ0>CcIppgrhb8WTp&EOS-CtxW*+m6d zlpM4tir^U4d`UAi8j-SRI5?xFPnKc00hlg7+#Zp0wBZvN50|LVB4+_p`RY$~`X@+8 zRE&)1X!y+I7Z1BwB+1-%M4Q9uSRh`=F$E}dikFk~g|Dw~jOn}jWfNCfYWJMsz&I9`*pas#*X;9;S9ICDKcy?1*R`+WNMH`}G9 ztP4U$cE>5%uEICl)S<|4BYIvf;**k+0`pAXpaO1W2ZT;=32N{>CUu5hTpV<-_uVV! z=NNZ?Bn#{z#PUqmCkspPLI8=IPwV^c{LTjKg{Y1Waj|Y4Jm~o9ss~U{IMCqW;A{qS za6&?YeUgAX3EIw7v7UsD4MTf-JNm9|*8zgKP^mh-l%{5ay$E2UnLSU0v}&4JjfbBE$htw!6CvLUHX>&3`dEI$HmJD<_8*5N-+P1c_|b zok`q|RH&F3r+cw7vhV$kYe5e~LO%{EDF(>W(o)pHf#v11r+7^7O;5hffExiXH>wv| zUCmutUA-%wM-xBk^c5N)`bc(hcGl4zjK*g6>%|bexTNG76=*n3h`7Rh$Yp0)VEq^k zq?U6o&P?8fbKKU}w!OX0y3>Vg!xi_I=IdLU$wF-e7M2n*WQ?*y zI3y$=XDTd+gA7DOL|gz}*dHDq#sYMfJNMOdIZk>828?Qe$TH(D)QY`na3d}*ZoSR; z?5y>a4{M_9$7?9m@Zs*-{3sFznU|MfYdD?!!~rqPa-WT-<5LrC|G6nJY(RK{4*i44 z%%t9-B))TVLMoa(xPZaWs8EAX+8>Is@tv!`8ChIFwnW+0s>HBvSvK8qr`Gjt+-m(di-vG@ej zyNPl5Oh;2Q6p*O9bvhBk38J?EJ1eWIw9(m8Q&R!&L2!~mJt>yVKv=5&VHvP?!Quh0 z)pA+^UXziL)gNrzSX;AiucQjNGXo0icsS3;s9THu@bCb5p+pV~%*Mt>Wi>UE3oVP` zG`ovh#=%;{qmyW)la4ke-_z%j{qo7&QIF2ga7Gg`ns2z8SBF8}7K2A$Ux#d9s^wxf z-L=&wOieyt1f1Lm5E(8n8^XY!Z4Jxl=`Dm!sl49}AhQF6t^U{!t8DWfRcuC976O3y z_U z;CjiuFAz!?kPUNbt95FEM9x)I^e~4nZ0;Z?GAVpuB*2)ot#(Digb!dDuvf_ysPa#Y z9e(l>45Segf)rDDjg&pHpFcNwM!UDWi;aU500`;Y;X=dl>1lhF&6GMrhH89#p^x3!7DgM2R-ddT5V zd_N{1KC&#lXkIL~!%sgnPX})et@u4``Hf6WWbd7jytcEmJHEK6g1R=;)UXD2$xc$S z=r?NdpbRhG-$0=m6%}JYHYev1!~yRPn27*@F@TZCDkzYvS&Sm)0Srj1@td#%ETtMy z;?N7q)2l1;-@tB_4S4`I{Vw5iSXj5u@dQ?D{3aZkoy6{Ss=yWI&F#X-^mg#|nZR<+ zU2F`fG8Ck4=*G-8nYs>h=fn1PS?H+zpAJR17=-z zcGw6;a#Zt=MVv4~EQ+Qy5op(?Z0p?|W)?_BM87$QGnwe)F~9+9WbFl zQ~(&*K)|j5GAWy_3PdO04q}^p@A*Fj2Ci&vg#s!=+&DEm8v$&2Lk=%O5TAQj64kpB z{i5Wpss4VstCcoLHL^^!X1=;{-)9=Y=Y)la2S`%2UF=OA@K?84+uBO%>5&4^V!wVh zbu@VL)Z z3j=&9|6X!cYnT4cI|ZE`fPxk%5VcD^CC^!)rM>3tR^f+y}75knPM+01^lY*nqeMcEn5+_NkvaWsD-lJ;62hFdpt#N@!FyWGUY6!gkbjZ=c?EwSO|9pwIYcOnuw%WyVeq`GcXadh-K11`yvSvdwg?dQ}S=WVUHCH7fr( zRef8*Z*4fbS*_a&LMDK8K1CQ3H1}7QFv-$nkn>}+)?r#E1>_4<6z|Kc0 z(##10ukU~u5{Q=qj`xPlDPX6X@DD40UK99+!$$qTy+}S=c$9r3tA%T$!8w0IkDWEy zQD6k9ptn$6d+swaiCPzu>;jZrfG9#4nTQ+Q3b|SoZMmcO-^jScywySmeOM10qHkSP zh?U@n7W`yak59-f*S{5SdJDaVMD0~NItyPO_DQ?M=n`mYmOPtfV}%a4ogz`c*$egvnn2cPLxpO*T1*RkD|(x0wCrj& zYBWR%OGR+Xr|`}Nk~kxR1iTm{KgCmWaAU?WU}F*>?Z%oP3ASK{ONNnv)L*f%;hV=P zPauqn&0=Bf@6Z4!5y`DgiE(LWN~e%2X%X88CT>kJuf!lfB}Y}gN)iA0MVJ#N5~Et^ zEzkQ(&l#V?Zl<5ML@48LUywefCmC4Dih*gHZd;zvI@N1R#bgW{>6%6NX%guqH)R7` z*B210Lq=`EIs4ClEM(^)Slu8HBg!U+RA+s?8Y-eKk42S=VVgEVlfBSAUh`OxG zU!DxUCFvms;@Lhph+%JUZ_5R+pN%LA3HZ|_BxKn%gI@J>vg~4uF3WF-%92(gxO)M? z(WC`y6tb4H6RP7!KH@`s7=^#=mfw3?esXd`1gdpA_|`^zTI!LwLk@Cxf1nnVlq}9_ zX(8uHPR^)zp7Gq)tHtyQh|F|KC>;%>eNS+B6x>q76s&dJQ&6*2{6&a2OGp_!K3@DP}cKvyI`2a>&uK>~v?>;V1DC zUmx=L49NhNgtv_L0>XP>+h}+q)EYw@u|a5^b^I&>F68QD%5h*dBE0v`lsH~I zYM7m8wS(vZo|j%d7KN{PSxX_xWJ*@oZ^BdXT9Q8gmrKh_OJ2R`_D@$UT2aAvi8J1T z_3*im<>VXLT$hjb+Pt(>&Kirdieasf?^*H7wO4IYl{NKx9+?WHN29_g$yD#QE|E(~ zQlZdKW)MHY^v8XayKDTFm>Jz;{>6DGJgM1qDs#C^QRE1Fm(wYW>5ikHnkSQyZ1p0) zF|4^jgg@8`<8y2~et)f`3@#eMEsFtA7TzSc-8;Yu9Mlfy?Kb4FCFl1|O+bA;j#BO< zlH4GDqU}}6_crI&a2f<+C;Xw3KTU#bmw3n9G+ThS+PLy)(CCS;` zt|Uh{4l=E1q>M!Gk&6Z6TB4eZ7N-&2I*s^_S!iP<&dC`!IEaoLW$=9M@d z6BT)C5PLHm+vgZ*VJIvG@~E0>)wl}%8ub0565!79(bxS&IAk-QvoJEEZL?7mF1bZ# z^N84Ki6DD%Id=BZGMz5gr18W%0^55+V`mJC-tfu}=uuxL3ee32ut!St8z^sp4UrVu!xx>ilMam^Sn6Cq}bQ>BNu5Or#!X z@JSL8$T;S6v7pIYGvbw9K17UvUGA8Vf?QP|H&pR4#J0#tu62D!5#&M>jr{!* z@YfgD71J)?pZoKqMSLl5l6A}?5}7-3f5}f2Pv}cJ*!&c`xvNMtv+LU|(bx26{QKGc z&q&CWse+KW6w?iBN(L{LHJ3lm4zWs7L!w@Y`XCOa6qh=Z8?%w2 zrv?|W*7iY0Qaf&I3WRnYw~P3DPgN=(u#Gg~aJ~qGk<&fO+Oe?ptwY(N z#E&9pRPbBJ-E(fnsLzzv!SLkYNW&~VxEzeW!d^%fl+^-rJM z9IO6VOH^HX>F3HwG(MY&u-L~L0E@ch5wiI2htWH5&13a3(s)Z)sVpD6yMaI0LqKI zUx7g_{1_LSg)CZXfhO5Byg5AVdiW_t-V?;%(n7L9Ln$uyQTpDKTaY!Wl~3k@@0rj? z#xRGxI_6zu3iP{lJm!K#9#&6d#E7ae9QG@fjj=6~ z$Rtgxo96tdzp7UWB_FDVRCKa1O4T7jiPFlf=Y^t{jAz3pAol3QG|a)u7G&NLQp6X{zSW>lzD2@iCf(+**&|9imj*2NVqaHiVB>JfBLye68y z1X)mkp`4m&YZXE-M{_7?6AMYLz1zXk)2p7CO9@VE{uAF7o|s%g|BZ^x)og>pHaVtL zUJsS<$1@3ppAK3(*Iu^FrnG7S9@N+2yp1pT@L7Z?rDBW3G^6b;+@3s`1oQYSdf)A6 zH;gBDdFH4dJJ6z&q+{yr*u;blX;MMa2V z?j@n*``&z{p8@mL*CMSCTYdz0{_RFWnidx?1lD|$EQMMm)B+2#Y2vr!a9dETRa93T zhjkrGk42_FR_myJXmqC!B750HRte4Rg!8GBrg_5Uc@fVb@8vgvJm|}`zx{wbMb=&o z68-kstP0Pibn8_!v#o*OvdLkLoI28i^lo4dIrrwEVbMQ&0p4EOAnPJg%d!pBR4z=( z3XSNz{^3^WwK}sx_=7iSiCX3;Qp}(xwq7Kx`!g{H^uWsua@Khfu-FR|9hS+A^&{`sdI{3NZ50WD0m&Zh=)@QMfh24%haqnHm$`x^^BWs?M!^HN!`2teIxq{ylkUm z#B#H|CN|fKcNNFPjo10l9!Vyu&qD-TAF?Bv_306UiXOmj=Ra^uvS*7}KxA>` zXL;bXzZNJP{x*1gcfLh}S4QtT5c_k8?jh?BZlZ##LRM14ks&=Tx=5))WAft3+V-PS zio?j*dV7=82MVHZyTllI4{`{Lp~qEseuCWi<-N$qTS1t2`<8Sd@?MLlMjQEnLa0@X zXLOaEk}gEoHb$9{+nfz?TanYV?;^8@dH5cz7T%h{hZtxy5ruuWLY~#S4$M-f&}SaF z%qZV-D(n!X+nM-1Ra&JE8Moa()smDV6k_Y27c9O}nkL%0$Ep^xzFawI*J_NVdcOI< zBxK~{5jw20PwEnD!}%@5Wq2~qz)iv+S;xI~To7y5_5Mwnv@`{A{m;agjo zq5TNswdMr-Hz_@-=+d5}oZ^NnIg4pOns~lpDf=dPyxZ{m2(I>Y;X#1sOte0sk)o;% z7+C;sVBD1p@4^4DW8$|D6dOA&vC5TrvTp#xP;ITEhMV7~p3Cb>X)7gsP$nm)UB$`t9q%_^y z0-W?#udbOlGY#~ZrJaK9$*-!a1RCD#qU5OeD<4NyqYsycE=zr5k5_b%tGGV1wX2&V zA$dgC&ydm|+lO4fF)3HS=Bp>w>DdDuwN~Kg1B9{E zD8xRrP1MJ+c|OIhde_N&cASn9{nF1l`|UckZ88B+M!TboH&|ccPYRyll(6c`q&!aD z2<9XBB~EQLML@nR(C%(3a`{gCLo4~#_^jb5eCv24bhFWRdW7+YS)3dO@ChsEsz`{W~9TyUT8kA;mh|KP5Yf_q~D+vA(OQ ztLMDfRnY8Q8Gfod2B$gu`X@-#$H~wwFyJD7StQCLFp;V2jHR$GJw0ZYq;+H4?L2`e zEtrbRDEv}oaOy-!b6@YHck4O{H6GKbaLV`RTmTOu?dv8D8&!U~$HN6!RG@ zxF0SfoDC)FH64lan^5%0cE~`dz;*Ec%+I>;)m|to_5{hbqQP-lswtGta=2t=9Jk?d zgumKvYtYpj7Hj{omv|y5woCvGQ(8G_^QwABO+P6Db3}3nP0<-ycdC7>eYoX z8;T{G*#GYCqT~jtMPSydbn!@Wpz9E~U4rN>*_hWzAa`Oui`(>JpNortXTQjW7D?KB zzT;Aq6)k}ir%WTg@?u-+Q@F2<*qB`WCw`%3h6#2^TX{>(v}*ob8HKxWjGvywi&P`g z%$|K6EMElgzTM*gu{V%ru%=%*Rm#Odo}NmEf~{)Dw4K!M-FR1PHMl%c&%g4ir5+PO zd*r*$?QAaBPsR~laE}JRc zvE$vCVzsG-#!bbI+XyfnVwF^6Qw`qj%1dunj@K?C7YdVI}I)jZHEINFHbx$&NOv$ zl4}M{O6nPYN6sX%O5W1;=H!iDMG!@neO)xqqgGBTVLP`>jY(E)cs(-HC{XiEv4Xj z@flAhDm*YHuB5|2o`~;5cvxYO!9fd7{qdZ47S2Ht4+h?8jBG|&;-{pC z2U|8EhovD#nVGmjZg}eHwWq+jWErG$PYB`ED9a4%4U$pAo!=b>v3}d#Kh2KRay&AY zPvssoL^NngI=)Emi>C&#|LwYk$!t)ccRO>xAKH3q@O?OR?Om8Gv9|*c+9P+^qap!| z}34xYZP(;WrD}oYvp=J%-$VDzc@Z`f&S+XT{ezcg1ECPtfns20%j+ z=+D%N0#eCufiK@2I9KoLN|>0}obIk-#{Cd$9`v~hMxU%tE}^}-*F5HZsNV7VXEt#r z&g>K$I(Q!1IrbdLQ3Cx>CXqnJKWx;JbHtK!`(Q_GZ_qqXqbj;cM1=4jj3>rnMbCLi z=1-hkOGo5xq&bFF^B|mY%RNub(t4m8JF@{a3)zJNIYJ-8lwaO2nQ-mf&WJ; zOn+CV{(=?u&r67uvvBlRpvZDhh+<&_lQzEK&gI-N^!`V^uy`_U)~e{=?jzFf|D>AY~m*% zGpMC|TyXGD$MafL5QWZl?=*QHH_mVpkTmb+>N`GKW&QQ50*91A1}H^bzO#`~2Y77S z1-HSc)ua@VvhN~^94_?HQ%p`%m~yJ=M=?u>4Bwoxu288KG)H1Oj+RHy59NrEF(Hux z{ha>s_pavcug{t>?ldHZbAKNvGqR><*~5NPr4Q;W=;bhf0?5 zgcZXf?s5KcGWxv!D@ykU6^ANb*@|Y6PTB&WFftubz>JlmW}leRh^w|xw$Cw8ZYJ}( zLNOYU1d!bC!~5XSgc`Sj5V*q*)M6CNeL({BjTXOe3BrTo#3{<}(oi>OG~NwUsx#Y4 z6qVy7{47w`bs^~LuF$m{mO`-zK|tWRB4OvnPey8BviXBr^A5I~S$LafgCel?S124p zTGpSMR(&f2nc?_=3Q4=a95_Ju72H#jA2PshugFRp)BR$o0EdU)(-N55l+dI{Min>fr;_Z=S_qmpy;$6{j8KeN4^t7GAhWLXpxI(se&h4~qZSeWF!q82#`vyz0nl|Gv zsX6MD0NKt0C6$Rcd7NB!v^Uk>;@Z|diyk4$UTZpliR5O~g9P&~ntaPQB!3jphFP9q z>F~=$diSH}yJ3OiI6u9rP^;)cF%rciXuoFDntz?LgT!}&6;C_DkU$!Pr6FxUE)W8{ z&k;yLuOh3hkP&~y*83hD+xM&LH1zUC?qvw}xTG$uF29kx_2_!FuemdkEK)ditAhv> z-(F~Hp46lRg0|ug2?`D7ZC1Siep9>@Vv9_cq3m6W4#G~QK%y@z%tSYvYmuZumt*<- ztWxNU3>MbfOo@~(qhV3ycZdPpIEX@Xnt*k4z^<)pi0>KYY_#5ONoZ|!_Wi5OpUD2$ zL8YAmz#^>TW>^xaLw$s@N=mE*tY#{s33&q%5|!M_ue-`aPFYkwc8J2tU*yuyFtfDq zQ+_FPQz@YpNEKz5%oNxtV~OS*^u3GTuGT$B(NLb4_HjpBZ?VVHyf z^KM77`<;gYYSNuOGpN*8{mLab&&)JIq5-)T148e#Q?$i(<_fTX5p||@u4b9_evFdP zWmneCDnhJg`x3DI^DScMuPULQcg^gd!X!V7hb?Lz_*8;};KhclZRzZ722waE&|TJ! zIDnO+e4$nMxV74S*W$-q0yGovJI&hUp`<9bW#O@TaXoDr7MlBnidtwC>Up?T95D=X z(c-D`m`TN3(~ZZSQ?W_3_|bD2_8PYn4ONRhHwCrUQ=`0Konp74z@2Q36~k!KKt!M} zY1vME`EBV3=}db@`Kb?P@bfZ7EuTBI(B}Fn1rJ(3eUt?xp@vYEcbF8HM(Zy-`S5xR zT14vx>5?$y3%DKUXMKpUs>d9toiY*z1Kfw^;|o&HT07X0tgG$Hn#f@uA@*qtj!l_S zi&nLANaH~uu{y1s7ug$}?zsshYnuQj?xBozv6tu(krFP9Bq^(fs9xY8vG?Vb@cUd( z1A&U?3BT%~AdUjbJdGTKsABnw=ZY~Fk2-Jdup2SoA8J;S@jK0viz{|wW;}e6FVE`x z_*aE$-Fx0QwfV)$zSWQXff8Z{^GvuSj^~&?iqfDa!Hyfr))jLwU~u-~YN~BABdmob!MYt2=O}^EWc@V!_AV)ae*v z`T>UIcmC8?1dxmm#r_(>fy7ZmnhlGwg}jm$xXZHfsJou`ZmOB=Q$r;OsdY@60$aPO zy+Sb*11q*}q-Q-AZlq0XYUG-`#b79{T{zM&e~sv+1enTJYad=?e3mfZ5vhyXpcHJs zG_>b`C(>XSgY}&EwJ9Es$f&&Rb*dtZ!GAWq zKug^;5v=;fX^)76RNwmi?}{wSe^rtF-!87={O8F3h${ax#*CGVoqjJ$ixsdW?fP&q3?^(vua@|UN^d)PR!{lL#oLLc|}j+2BDwuXHM zktktdYw#6|5l|SVO5mC4M?*W*`xv>DUQwT7?#q6&#rVPex4PxL5U6J5T6#?3KVv8y zmS?dAp-UcT_^md-UVI4#et)83;1vh^p-Gl`PK${5y*W`Mx9cqD08nL3VA12mXhNIH zWN~EUJp7EqCmfY5z)5!4`oiEmw7XrQ8J%ousO_NLq7fp=ED00?{VqucSZ`zyLGQmM z6LW}0F+_^ z-+S|$(&m=k|G~yhL3^4s?dw`b52NBU4D3x1Q4X}bYJWtiFkQ>ia)P> z;R6@T>@@)VJMx5Sql?-(?$~Dk9dSP?Oy))gv^z~+es6=tp0HnO_-q~%g#U>UX+s{~ zj6pvBFBRE8{Ya+iA3Hr>-CsezK6nYTKig865BayoqDH3PE{x$U2Uxw9r5mKYRxuC- zE$#kQ9w8}srcU%7-Yn*qe@Hvi^m{|!;1P|zllA9iTJ&Fb^lf;3u!G5uI?9Oj<$+TJ z-)k(S)$nX~`Ohf#vIR%UfvGeJGNwy!1QaPb@I*Z@-#Lg3M2d0Nukhd`v2;&YnR-u> z*+&0HE4Stvzho?UmjwqhWtYuTE#srd>tCD+YgE-&2EY>TlsW4iBl)dq5Sz#J>PfRZo4Xg&EVb^`hf{F86kGyQd3EkI^q6DXQ7 zICgJ3iyz-Jg0n7`(Gb%-#JArFpAFg2Zea8{V_9C|exyKTd4+?6Q35a+@@jl|xymo4 zB>+otJi7Pc%d=GwC=U4-2sHZC#zQ4cn(i)Q0~07IoIEX%>t?}kx0Ns|zVI{zi4wq@ zfik+e;_9wSmcJ2!Oi{j`eE={$#@X|}(BN^Sx-G$%-ULyxAG~vuAm@xv0XK z^Me?}n}WuX7iHM~M8*CjfJ@!f#I`V+F2f7!6&-p|YahcDxKQM9qaA1poD#LguO=Xl#;tvZ^K_Ig}l{~oKcf!U#5oOc1 zBr{*4w<&-oFM14AJN>rP0hIjL&YeFS9jf-P;c9 z$szq}Axcu2>&GlzCHio%C1a35m**Y7l(|7&AlrplW2%nv zh>lm)Iai|>AVp#Cji~R7J#ig=SmuiK8@2ScTAF z)r-={3;z&u$Z2e?U(FI%VqQmWNFUhj<^Q#CtNfH8PPlYEpxYKo`o2%BBR|W0iqB1T z?zVvuF7w@oBb|D>UMG9N8kHMJuL_bpC@^9^(&Dj*@GtF_ABogF@g1WjY`je1*u^P4 zn<#%rYgp9S8vm^TkDPfU#T7HFaDIEb6a0E9w29FpLxmL@s$1v@{9jL?((^7rjHJM5 zeWlDt;6emPpw^6$)=GIKs@Z{==LI7`N*kz zwGfSVJqEGuq=%G2oDzKQNTQd!EvIhYMah3@^inJwn-5U(k4o8DZ1}!FN%CFf3I|S7 zx^0JQ-pP!PbW=q(o#SQ~0b^Vj)w?n*%_vWMSFF~&7UR3Q5DT{m@KXnvKmIOuy@jO! zG0q<_Y}N-sr=%*J3`SgDd@YdQ^@dyi)KeTi1h@B=47GG)CKV4UOv1d(IsF4vyGXs=qQPKOo~@1qSpzR$SzcLVDf9d_+{lxB7gL~>SCU}Jq%p( zPv}4wLmnGyb3%)~aVjb6~2d+~9v0wdG7BlE6lS8^zTPxZMP2K?wnTcef>IZdzGDv^9-QKT8A~&~fYY4`*1X092ZL1N} z3m9f6m(tIVOVdk|Z)mK0gopt`;p^b-`_$o4BK&CLzq*y0)uH^On* zhbf?c;&L*2L-^OCF5n{Zj9DB3<-2nUf3f%l`GFI#upN11$<9|_w3_A~HX>_SDgb$r z5{T8S94ot@YfuC_0;?-{5&+K5&d)pnLRWF7V``5c*QQqL2k5Gkg10QP9GT_$n`ziP zgtW(H#xxzA4}e=MXG?kMJ?1Hi05B$<2J27v*Sa-dGUx2KiunL^_6 z+}N1Oarb^5cm@Xa^BsaY@!kB`7(&er$FZgJ0-Oe!f`(&(NJpg1I{iw`UJp6O;_+qD z(4SQ68c+YyI@gIq;_VF9%Ba)A#fPH<^V;bK z%mdEp+q?1Wm{)q>nfJ4GO%((5CvDGwwQ}NqyaZT zHuZZ;OL`HoY0TL`qvaqE5utaurSi-8MP6Z zk{B9Bx^oEWk{pH}h8lPe-{0@v_ul)yf86=woX?!S&&##s|NDN`9k7BY_p`buX8>a8o5km;V(bfAesG5+<~#1ksMcXT@hAHy$G3+l6H3A( zcK~TwO?(-Wto{c}>e_%7$an{u{*T*_e~{r9|9NBjugmR!>?V1J7)Y0YhDc3Z&K$Xv zJ%4iq`A=Y0H8S;ONY@Ya13A3v(>9#lFPLQ{A}f>F}hPgx2BGR4Uv(@(Gsp$krw ziCmAOhK`?OlVxKY5%aAC+eH5vx7Z zaM!4x;59UHtKm|@{CQ_KR*Qx=F3W|)YUHfP_j)E^t;FrVo>fmLY(VJ)t7-?#330mT zjoRD2Kp~y5)E7(=M4H(isMtO>Y>=SZOr>i?XUWn}ywZfv$eMLHX5S%}yj|4#&ir}D z?zj4*dRVScS&h$!YWnB(M&$DWswlb_3ZY=)+~XfQu)|Waw}<8rK?@!J>D#NKz%dH+ z&;97BC2a{oajUtDnxvg8L$;1_*p1VuDWD4#hdBs!?{pG%00wtG z8<*V`UZ;e|&JVXmKJKfXcADDx(XmpSHlMcwJzYei4L-$q&#-z`qrw$MG2vvpnNd%F z2HBC0_PU)Trq3>wYnHr42Z?YoK#N88T+S6i^#KV1>&iSgD-%xhrw!~=Pv8!)zdrC7 zkB&Jcw|z6^d1pSg!Iil_#ic0VS`2i;yA3DMS6wp`j^JHZVlpZj#}DzJb^Zmt10E#L zo7zo4rjh_b;rvjrA0KP5-B$4qp3kEfvb?W1J|`A?Ql%|I5Gd&~`v>Ar+rSDSlz5;j zg49PfHc!ZKL9B6!8naVwk$bROZ1Ja$*n+&|z`UtO-qADy)PReZ|r(FQS{A*e~!QCIlupnyPnQ7@Wi;cbxHSx6Ev zuO^o|6fZj76VPX`UCAumN^;+5lrDjlQ~^v883oMn|LZr?f_|-v zelP%s#ZV9jH<)I9^j|T!!|J~t`?}Sqn_Rt@c-y7S+->H%!D*Z|^?&JwxtX|TqxJ;0 z)raLDnigEX6o^z^8gjO1%m=A(oULfHJuZCG>{F#qo(7pFhyuO#7Gk%PyIvt>eP18} zZzl_a$O-!5vIN1t=v|jU^YKP)FegScaoa~OGJa$asChVfontTgaNLJZ%-@m)A>{-Y zgT#HuK;O@E59N(SUSy~Y+L`|4Ur~V!pQ9O#0 z*Z1&tHbjII*teUqHpKpH`B`UZB9i$k*ZqMHq)NLVG+B)41oL58uFQM{( zdkIw**5i2Nes5aa{tht@bl({7#IH^Fy(-guWXGcY_!Z09U#)~hjA(j3t_hwHN}q>C z->SC{lad`gmhL&=@)n2+9Q%@iI7Qli6G`xMr0m!cV>@=2rJL}eDw(L|W7f95wr2^U zC5?n5zAd(pNHT|0WD`Xlb3beY9m=(gk$xpxnj~lgy|$t7D-o^3Rmv40XYX46lJL;r z_kBWMDsdxt@RSU<@sQpslYa1={YmRI-A%z~-D|DiMb~eyCI0pyolmLh02qwS&(5FS zsHIZkTz7f%E0=}+AlJA~;p5$~D1a<|g7E46iWA=$`QDlICt)MxMD?xaonzG##Rs8n zJUE4yhz~!iUu+$yKkwrwYyg;&H*t1kk+LrdXfz1jb!vQ$4(0+J{9(7c*J`DQs$ql< zv9I%KqDvhlIB6+~pdDnGaSbh0yj{5yq{gk~7c5ho!)H#bZ~;7Fb#s$K7!5ev$dAsC z*6Hu1pjQ;IE0O~XxI1fYrj=JniUI^H^IHsIFLMAL_qL+h{Cud!KA>r|R@A8ifhAxA zdw$WvXlqA7yGk3tYx7^uOGpJ87e)f3Ij;O!+B2O~M%J1&!g4fiHgWxj8^%yaa^_JP zmw&-y@D7NmC+pDNa z1A;Ij#fSHg^ZBlCGSlDMA$~djy~I1aYvCsZP;E_CTCEDiPR%ii8!)Db-)b~ji);_C z3E>FXJx<}S&+ol{$B`x>{Be}JTXqoea$`E}BBi4CQ7K)#BF3z*tJ9|YZs+K~cGSg) z+08qr`>FX`L)g{rd^2i=87{KCp80+7*VE^8PhwpjlM}7ut6TKxe2Y%{{a%FV*{+0H z^t*&-3uX@X=){J?ra_V`Yoan4!0brh{@5@AVXnKY3K-5v41#Z z^9*5}mC9x_M(*>bq-REB*2!Sv7cIDZ3`+Y^@tq<)595iOuf?7mdQ>>#`=$SF0l_Pc zx0D!P+tRP6<7pCFzXaHhC}cVmd-jA{STE$0*!wySXTmUD@hn9Oo!fn_rM?)o7E4}D z2ag$alys#S(0n^MCcNP)=M>fP+!4x5TlW)z`xFev@hoktEU5B>Qf}nXu%Rbj2s@LN z`OYTe5rpuYK50f7OBlU8HChn!nU7|h_d(QnTzzHngfl3)u#WQbBN$pi=I1+S%+R*J zb{cHv?t%B?3aWNLcKOS`QIXw!&=}Fe)%A2+;krS^(zGC60(#rqdxe0jCaJ~td& zSDal|Ql);{2+S=X@86PRl#IE^x8XKb38T1g&M<7iZJrn%ZWfPClGrx&ApfQU{lgEf zRXYEevi%a44+rP5EJwIxF7GcvRp%dqvQS{7sqHCb&!;zfs~j}A&-38fc%#-8QJO1d zl9qKH2D+ICH!YLb!vPkGhlKsU$bu2L$243hj!!*ospweOql5REZx+xMbT3msQ^77L zV&m7RH`*IVJ4wJ!rxFPZ1p>}CWEb2>Rb6qteId6zKN01L3(oKhJxqKT_-UuUjdb;> z0cpr>C z>)67jZM(|Rs#i23{WOirj$>>{JS;~8`&jK|pDj2TXhDWs3J=sTMROR*QFAx9 z7rjj}oQ%4}B!G$g-MW=uL^P7W`$f|AN4VCcpfgGKjDHK6qE9OSI(C$0nQEz#(|7eETee@iJh>47Q<}T%cQ9)ki&$%OWDUSSR9;7s~S4xlhL1qP0WU1!hCrpm8QxT zXT2|5-EMG6Y;QXLRBFGEct+w!KHqBd@Zu(DP6h-L?Llc+m`Ur_nzo)%)oW>T6BYJg z`8HUzYQ0CrdL)qStTMup+1xsOU`=n6AcchQ0!gpHSG&@#^E5|okqmGlQp<5SBTWPP zXYrY)CtA;8jU8#D?Y7gzR&AwYu9@ll8S|W%pS*vu7Sm}_9}Fu`BuYQJOomv`c+wXq zzu9+-Cyh||tV8+y@;|>4Ko2E@4AeIo<{`z*ynj9Y{6D@{&gXV;uNc$vyh-s~n9NA! z7MQ&6(J2sb9{EMkg8tFX?9hGm=XVWgV_9qXn<%vP_X5+G+XR$7$4x2x)w&)_jnvmp*kcBKd>9 zb|*%dyafxy00q5%ef^78-oFp62K9o68aj_0zkaL!M%G4lUv5!xiVP&@hw+KFk$-yo ztSVj=BmpH=dI%ioCvl7mT%)h=i5?sqg<$-)!2mLH$xRy2VSy?ifM_qeX^)l!jX{UH zccpmz^lC&Qm@)(ttG*Mj2goaN947f`>Pl_cZ0&3N&O&Cy3<&h~FIiyU?WMTdx+d^2 z|EPq=Tio%Vw-vZi@>e!_aQ>eUu#jKPPYj>ZQ8jFx?zna=K5+7O!v@1>uE#(XGG2 z%sa}AsbzD&u9HrKeU+&8%ODO?@4pFip0D*1fk~P$hXrOSHL`NY+9RozeiX(c6r*sFpFm|KqK=TCru1zu9;_%YbN$z^V+zA$Mn2hJKrBT z*Pe}*Jpl@J6T2K-uptND!!sD(P%Zo+Bd?(4q;QTcKBJmV5T(7{DRUCggSCE;i(I0# zD2Fw3a*koj<5lZn4uZi*i6f5Ix#4{>x^!8G{^c@lBf~;$FgPN>H3AO|HXGC}v~y@+ z8ZY*Qg>!Pr!+6*uWbi?tPtPcpVAd{el4{^M7nP>G!vc88ykVZ}8>|#j)udOvdy`Ed z%we&G1_}6pP*i*hRA)Za*_6#kD{P=Mlb3GtWZTh-4QcHdX=^wA(0ue%M?@<}K;Lb?w10nNISbNkB4(Wg~!jZNOwOqx}YL%u(y`HMMc=BG$4 z8mArb>e=$9Ju;#Wi*62e9VYwDC>J$TF%t}qLt-YHOcqt_*=-U6fjbUg*FuecUj?(( z3bDy5D1RuKYz}j{FFfiXH^IxH1Ez3kS*L3hQfO=y7rZmZlMFGr!3?LaO+nL2`!9wVb zs`UZgy0|K~QtnoIgKl7WR)c+>P$3O3!}uud`X}Y?Q3&tIo+%W7u2KPdpakcp9gfe zAX(DZH|FId;5;nE{Ds?Snk?t9{h#HBItS9C6Xw?Al$z8iRs({K(aCpK41++aDq65x zrtGJ37$-_OIbV~i3e=A5*`&Nm<+idNYh!G~a&IjUU55kfk5dW9_$7l+ryn4UjMySS zNA^kKfXu)(oAE?9N41*}5Fbo5cjHy_D<~+qxw#)^+}oSZkc}!`EQ#^OriXX>^2gX3Rr*%W@s4wep9?#zrcz%h6hQo9B;E20^}b?h1u#CdjO5?H-;-r)xs$VtQvc|V{~~U;3xAwlaKB=k=rmhk26DL2#NWx{ z|BrP2x6%O;|C`YLACJjhez-vb*gex^qJF~0K6et6kmMH?G3Q``wz+^K^mezm$N2f} zw+A+~W+_L4&#teIr~GE_yFP|0QH{ULW8M|}EkQIjUQu+GI)UUQL0|NSUe*o)I^*9} zl&<%eYuhr6_}Q#JKHee^0$oO)ow*sDO1u5_+$qHu+0R>8M88cadTTH`Hs5NA5RzSb&7i8oinhdD3*-ynN!-BI?ZuJX%Mu z)Nxs7UJ}?xHEQ|+9AgwH{KItNci{c9hmS$G z{goHgtMC1S@hCUzB;omrQjb7mOb{OaX0)j7pVtrq8u?G4bF)_2^YkuM*lkWTAV)x0 zq*}j#+kdF#|2{&pn3VcdFXo=H8YL9)2f{CV(3i1R8aMCZNzS^1lDOUVF76zeq?lXjy@v~WLPQU3h;bwX#E*}+hQeHirO=JN-bqG$?P+aENs8Wm zCMXMT`cDV-9dpqGtqr9Q_KsBv7IQqMe_433$`meR3uSR^fxe1VFWwWPPL|dcZA}ZE zDK~{?^;{AjjGq<`b=9kJR=BBX^>TXXjFSA}fgc44?VluuE3`IDtV3eKg%>9{yll>) z35g<%t`~F1i}qzErHLi&t-jYcetz3g#^Vmhrqw?NIP(HRk4%RK$I0ZD`vv{c0pypEbGFslu1h9Gquv=f%?H zQ7h=;N9Z50ZJxPIJnZjNk$he;wr;pcx$A1WE<;tTI6+MEO70Pw5LUx0uckh=y6>7! z&ipN;H&0WAB~eb=5UnhFvrbd|#fS34vg{nFlz6YVp7DC!ZVme-?@E~K+lNabG;c6JyE)Y6>Z zapcwHHL;qlXLEu zntad>JW)HYy*zrWR4tg9RS@fadMy)$C~vo5;xGN;P^~3y|JeTcxeM9xQDA8AgI37K zH(OxHN9z<_uxw;^vnScOJo~;On$<_4y5-c0fz4E4c{6R7Vs;`bz_Lx=*yFQqkz%A@ zrjyJuquSJ)D;(J&%((@@rueuGr=EiMRe+|9w-Wm*n$*wLDoSFdQ{t@D&D}!XuAYZ% z`6^Fmy)GPjfw-`XIqwO;V`Y9gl3b{IgN!tDb@(4<{{>vS|w?76fdanev!V@?K z$6G$`bOkK$^zYJ+PR&^iKikmkN}6%7U)~)1nJac_cDFV^OnjVc^YeF0CDPE8cs0$vU!m_ z%K|tQ!5;qhVE6R2ur@!h@BFa7E)ftd(q8tZnH*R@gXYxMgi4^4y#$QZNMTJcHE_6C z-g+RO!mpW+Q1vLNDvNvyPcLwa_C{7&w*yLoBN8R^T#xrNUj9X-s6xAtK*Th@2zG`2p&x$(W zAK?^^qJP$FRjo8$_B1MQ>I7FsJ|^aT4k6?^K`xc_DK%$<@xT%Z=mi>DjVZ`T=Kjp9 zLDic-gc-tg?4Rs8l5Rz_seOx=*^@85EyX45*?ouEB6X3hZacmLr}`BrG=^e3xPT1j!$ zG(<5pVtjH|(5p3dk+X@YhMK6@jbD`&y69*>BO~g#O3ldcvuTm%6pfBvEH0Bjx0^o(dv?g03FNH@ zKZ&BJ&(ImJXBQ&ZCf#dAU}m>0xX6=xsSM5d_B-ZguNKH>Z50l~8#Pyl zhqNjNIu$tHF{fj@MzxfLR>N0tDIvl`Zhre65Bd*G`P)W!7Cu##OM^h9rgt#{Dhf4? zU&h4Z*iLkdvL4xXX4i!g?(3=c5{wx})V)mi`W&QyKh@0C{eUlX>R_rgyn-f!d-UUI zGLJ=e56zo7`}z@rhke;p`4(~duRo}ptV7I?9+y`Y99`zgL)bA`-D=hWh2p&^v(wA$ zuN*m@*K0GJc0b;g_ao~h8qk}Z)g}yrwW!}#h%d!1x`DNuBzZf5iPoCl=d~F;G?^(> z^pNSD{t$u}&f7kvc^_E>M+7Q=u^!T8z<*+r*lQZve9B=Ley1q@$p4e^XjfTk{F+>C zbAZMLBEu_PSYzM6O#@!I!qKGhT|c?`%6{FS!)vd;O`nldgCd?a5l44l#71ISCW_-e zk^{|N(^?8W^93Bw@sa1N-JO3D85oI)vG;H(_IY)qD6ib9&Ks)c4Kz9;V|+7Fi4pG{ zk}x?AwA2RJ?I$Fc>Afv9C;R4jZAMfahH1O)TO!}uk$qmSe?6+m#NW)=CZpzncklEP zpEkX0vUoz&uqMw1U!X;=-_(5j5xbJtaXyZn(DZ_i^iW0-BFv)5N9RX^@?phG-N5#} zUS)3vUHo{2crFn*j(XXQgkuujV0UmtCdS&`cX+JL%edZJdBV9jvb6Y9#nU%owPpdQ*HupGHDZqm zM9X^#8vTu5GE(#_{0>my@pAhbSw0R&dHnJnP@(0;bddGKT=8P=o$zfq^QoJo&3-EM z1gA<^!&fj~@01Hao=U8|y0a$-b9q#LDsYFZy1U0_Y0pE{1Io1?plL=)W+Ae*&D6%4 zE~EXmxQZJ6sr7qPW<{O*cHjiJkpC9DuMMJRV1&;`$*aZrlX2ylFP>Y*aWSkt2JMYCzVx z?PpW=D{R9RVyIg~T+GI?- zdp^JN^O*T(lMvZ-NgE#>j?(hBhFB-hcW~o*c@>kBsoBggQhKLcgUU0+{2GpmmW#I( zYr=2BOEc8=vrP>C5@j2jSddhxEaWatmh``K4UB4!wWpZ`{zIPio!iB=PdWz*sWibpUXCSB%byeId^X=Lu5+%1;lBi_8=9NA4>}hJ*X^hrrm4v1vvW%PRF8X z^hKJ4_LN19c5ku6#wy2M-GcdDq%vy6&o6V{Xh*$ASyF0kG^BFjDE4iU&{pjpQ#b0v zSP#zTbR@;8eU|l4+Q`M%wRfeXtgRX5lq?Zz(+l-Su#-5r;~pUFQjIo4TSjcIza^qa zPuN(pR|@x!RQh4p<OHE%JW*hlq{zz;4@~Immf0cl)eqx>Ot*ZLx1LT77HyKz z;HTs!=qlJfc zp0b1Gezg@df8Bqt5VJ2|R^yb3FV1=78!oKPM)94ytqZ;D%qS1Co_G+ii*|ZvOSZaD z|Ft*sCN6_}Yg5Vk%Z}ITL5u$SS}9tEV}fDk+}rLz)JF0531&yx7cno|o+M#j@0>ad z6&^CYXyW+`?xxnw@C-+#LtSg+P?d+>C?Badb0#8sQGc)9{H4ZOjdpW|#E&MLM8wwc z$ao93Fq!AC}N8z|rEZ8Z0>(pxOCJcD578 zJEW74`3m@!b)Xz;4Ja%%?zh;&GhKLn?xrXzCH^ zTf5OfZ&J^%SE2D~&&)|+3xwHb;x{;wn+WK5B;&t;QDT3T2MTpPr{aBW8b1DK ziS0F>R#%|6R5QjsAJqHiQN#fOG+jlNP>|@2hM2HniC}JvU){H7*OaK<#LH8WP@vLm)6Xsq=w zswaZd{`NJWSjIL0TIMwf_coz@*L(1!jc&oeL5G>ADR*ETYEIjz(TW53mI?lRtq5paLDts?QsfG^YEEz7N;2i4 z@Q!1OkQrq7L%-yM#yX2UwR$>w2Uc?jal-8AWt&7-Bgai#dbhcx@IhmR`d5QSr-dq` zLbs7(t$Hb!1WkgWj%=WzF4UmbdTYB^=HbH19*y|K%uK}-7652HLqcpW&j|`!siVY> zDnoB}aWL*>ZC7%zUH;KR_4?R-M34KI0L6vW*Awvq`6rf^Du8ln0*@~j&HKiUtSr|L zNTzP^Ffg&Qi_RQ)YL8G9PN$v+{)7L)Ltgq+|39$v3!MKQ>|D@*jip~b|37i(Ew`UP ze;P2|ag4tuqLY%g#a8gP9g4O=m`1-ys6Y>~`Z+HFXa97arsQ)`S1H){0E}C&s8Frm zXv>|-ebuY;SJI3s)6roxEW7K0_pt#$6szq&0A|{+?J19C38whv{d2duQ0LEw?tuah zDY-7=&-UUO+Cbr`!1OeN+r?R zo9R3E?|pT@=VQ?Xe0}myf<*s;0nx*Ipe1?$%{Pwr`4!O=MhjXIy?0lP;ImcwNB>Uy zA3W-RVPrpjB3F0_q7|@$y*Uj7)~gKi!*jK(wFB37B6ROIYS#1XghbEO%B>&K+z|#6 zxAH#DwW7j3=eYp72!}=}sfJdRlyysH-SNwy%jWxN1GjL7;IlThY$|q+TOK|o=*KkH z)aMji7Y+bE9V`X~VMWwh39=dqzuRzr`qq2xyN6PIUY)t`3TLC8^Y$Gzdg`g+he7+X z9RHxLnH}Qgf+^|+aPnDqw8mG-zyZ$J(Gf~xoVaSdywlH%7=!nChrMcYw9MGsZ8>M> zQ;_C6RtJdk*~iu+%nrAj?CG)Do;w`9f?9s)zTiCogCL>T^C|(r$nl9Pv8SRo z-a7M&b$>j{b<%Q;lnI% zoF*dfA8s?@*E@SHu2bZZ1G@_AtLn!zS6rhORWawfyLzdvIR!dQb3@p3&wG|Fnv>F3 z!Hou~ooG+qVe5v;h*Y8xR}9dLZ$RS_MgW`cve`%YY15I`!Fp;fqQWvKI1{G)I96z>CA z^Tc>Po?DW&)J+L%7{iR$HT{Zzw11Pg^KJO?)?Z6tV>Ue`ubON@A~;>d(VQNo43|Hd zD>UzwD|hvpkVVca0{URV!9eBVD12?{yQ=}{YY5QSk0mYyi>u|UX`EGj7>myitq^vx z#FUi>QOJcQ(WCghxn02jubf;IWEKqS_6862!DR#rqn5A$ zAz#{lheS*=GZI&s#GnT9{2&jGe)p!A-NRyFVfguQNfG`TMMX(FTO;*DQ~}hG40KB4 z;tj$|1NL}$Ez)+1vDSJmvBuDo$$wxzQUEn9rqrBzsX6(6a?&NSf?$M$V3;GYyUZqJ zyrr9)r?T{KQ$BPtHNef_&i3OI?K8^UzYh^5d$u(IVnS&^Q(rmue;M zolV8*tM$T@;;L-1(d*(?#xEUO%Zsp5`{|#vM=92BzK8qAD+AfB`IwIVD*;{xpfS|= z78&`M=R(WY3^fEduHmB$?mN{0MPsAnKAjhuA~EldKXKgHq0^Ug>d^ZfycW+rT*N#d zHRUxFHIEcTs$e3U?pjNNvl^>twwk-v<(oG+o{#1En?LhKb}xi@z-FljDvn?ymFAAmt1 zNa`@OB`hp^Ld|oP*waH!qAyrmKWS!Glb|c=MJuzh>C?7RGu+LpUnlNJ`%N4symjrW z(t$PzoEKz~;j2*$M(<5UvyMYDc?L7mS@kZZ;yD%L4e(np)E<^rOP?=E?KXix?YY3% zQiTMw#i0hCnYdQ}A)hriF^zq9mcs328yF>3cj>ZqR$a%Rz`t~=5L6ZC&?Rsh(AboM zF1r=)BvCEKv( zNB8fng~qVF*NjNeQzZ8=B*u*lv`(wa@BgDQ>gZ(s^RpwM+8S5<_c6)8=gdLJ$9k4+ z`o^~&VSSCpW4yneNaIICGdUJTP_o|U16k&kr0R4~mpvt92|aNB{nfkGy_T&6UEqRN zl=i==$`NCyXa2`N{=mzc&Q>uetmGWeD`&8OMLO-xyoJ zgSU4xgH>NNozxvoi3yH}%PhBes)Km|Dl-RAgI_WF2V8R<78)e~(I@RO*EbuS{xJ-A zG-7E*z#E?=s+|^rs8YMkGq&WwcXG?Lcq92sAiN(5KqP<2m3eY!()5@)S0+Nu#icgp zL}6lMFfmc*Rsw~6mq6SZOyExH!D-ai@@n8R7>JqU9!}2ncBaxu8;JZC1C&4lN=8Oj zxY`*E2LcY1l$3-zaX5X@)Fg2|*;K0EyZg`W$}&SdAVBF|A~=tEG{VWrNhl{L#|4P! z=6lpl)&zw6i2J|FYz_BT6SM+}x@AV10M0w8;y} z`r$s1Ig{UdlG%du2SBD%iF!@4FGn1sq)G{XA-jM$gxi-$c$4G$5Br4%IvXimHR`}Mh#2lyX6O1}5w<1&?orBRhz&N=rGui4q{c9MXYoR`z}ZPG44ua0f` pqLDLAJ{QN;K-40twj1;<=J>|4omQz-Ch(IWd1+;-inpJ>{U0UH4!8gS delta 30744 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 Date: Sat, 28 Oct 2023 13:14:18 +0200 Subject: [PATCH 17/17] consistent naming -change camelcase to snake case for all variable and function names -changed "color" to "colour" where possible to be consistent with LDraw documentation -updadet GUI screenshot --- app/{BrickColors.csv => BrickColours.csv} | 0 app/app.py | 88 ++++++++++---------- app/brickcolour.py | 97 ++++++++++++++++++++++ app/stlToDat.py | 18 ++-- graphical_userinterface.png | Bin 34526 -> 34693 bytes 5 files changed, 150 insertions(+), 53 deletions(-) rename app/{BrickColors.csv => BrickColours.csv} (100%) create mode 100644 app/brickcolour.py diff --git a/app/BrickColors.csv b/app/BrickColours.csv similarity index 100% rename from app/BrickColors.csv rename to app/BrickColours.csv diff --git a/app/app.py b/app/app.py index 4625fdd..4fff130 100644 --- a/app/app.py +++ b/app/app.py @@ -1,5 +1,5 @@ -from stlToDat import stlToDat -from brickcolor import is_brickcolor, brickcolor, get_contrast_color +from stlToDat import stl_to_dat +from brickcolour import is_brickcolour, brickcolour, get_contrast_colour import customtkinter from tkinter import messagebox as tkMessageBox import os @@ -23,11 +23,11 @@ def __init__(self): self.input_file_Var = customtkinter.StringVar() self.output_file_Var = customtkinter.StringVar() - self.color_code_Var = customtkinter.StringVar() - self.color_toggle_Var = customtkinter.StringVar(value="off") + self.colour_code_Var = customtkinter.StringVar() + self.colour_toggle_Var = customtkinter.StringVar(value="off") - self.color_code_Var.trace("w", self.update_color_preview) - self.color_toggle_Var.trace("w", self.update_color_preview) + self.colour_code_Var.trace("w", self.update_colour_preview) + self.colour_toggle_Var.trace("w", self.update_colour_preview) customtkinter.CTkLabel(self.main_frame, text="Input File:").grid(sticky="w", columnspan=2, row=0, column=0) self.input_file_path_label = customtkinter.CTkEntry(self.main_frame, textvariable=self.input_file_Var) @@ -37,20 +37,20 @@ def __init__(self): command=self.get_input_file) self.load_file_button.grid(sticky="ew", row=1, column=2) - customtkinter.CTkLabel(self.main_frame, text="LDraw Color Code:").grid(sticky="w", columnspan=2, + customtkinter.CTkLabel(self.main_frame, text="LDraw Colour Code:").grid(sticky="w", columnspan=2, row=2, column=0) - self.color_code_label = customtkinter.CTkEntry(self.main_frame, textvariable=self.color_code_Var) - self.color_code_label.grid(sticky="ew", columnspan=2, row=3, column=0) - self.color_toggle_checkbox = customtkinter.CTkCheckBox(self.main_frame, text="Apply", - variable=self.color_toggle_Var, onvalue="on", - offvalue="off") - self.color_toggle_checkbox.grid(sticky="ew", columnspan=2, row=3, column=2) - - customtkinter.CTkLabel(self.main_frame, text="Color Preview:").grid(sticky="w", columnspan=1, + self.colour_code_label = customtkinter.CTkEntry(self.main_frame, textvariable=self.colour_code_Var) + self.colour_code_label.grid(sticky="ew", columnspan=2, row=3, column=0) + self.colour_toggle_checkbox = customtkinter.CTkCheckBox(self.main_frame, text="Apply", + variable=self.colour_toggle_Var, onvalue="on", + offvalue="off") + self.colour_toggle_checkbox.grid(sticky="ew", columnspan=2, row=3, column=2) + + customtkinter.CTkLabel(self.main_frame, text="Colour Preview:").grid(sticky="w", columnspan=1, row=4, column=0) - self.color_preview = customtkinter.CTkLabel(self.main_frame, text="Main_Colour", text_color="#00008F", - fg_color="#FFFF80", padx=3, corner_radius=6) - self.color_preview.grid(sticky="w", columnspan=2, row=4, column=1) + self.colour_preview = customtkinter.CTkLabel(self.main_frame, text="Main_Colour", text_color="#00008F", + fg_color="#FFFF80", padx=3, corner_radius=6) + self.colour_preview.grid(sticky="w", columnspan=2, row=4, column=1) customtkinter.CTkLabel(self.main_frame, text="Output File:").grid(sticky="w", columnspan=2, row=5, column=0) self.output_file_label = customtkinter.CTkEntry(self.main_frame, textvariable=self.output_file_Var) @@ -60,8 +60,8 @@ def __init__(self): command=self.set_output_file) self.output_file_button.grid(sticky="ew", row=6, column=2) - self.convertFileButton = customtkinter.CTkButton(self.main_frame, text="convert file", command=self.convert_file) - self.convertFileButton.grid(sticky="ew", row=7, column=1) + self.convert_file_button = customtkinter.CTkButton(self.main_frame, text="convert file", command=self.convert_file) + self.convert_file_button.grid(sticky="ew", row=7, column=1) def get_input_file(self): input_file_path = customtkinter.filedialog.askopenfilename(filetypes=[('stl files', '*.stl')]) @@ -85,38 +85,38 @@ def set_output_file(self): if len(output_file_path) > 0: self.output_file_Var.set(output_file_path) - def update_color_preview(self, *args): - set_color = brickcolor("16") - if self.color_toggle_Var.get() == "on": - set_color = brickcolor(self.color_code_Var.get()) - if set_color is not None: - if set_color.color_type == "LDraw" and set_color.ldrawname is not None: - text_color = get_contrast_color(set_color.rgb_values) - self.color_preview.configure(text=set_color.ldrawname, text_color=text_color, - fg_color=set_color.rgb_values) + def update_colour_preview(self, *args): + set_colour = brickcolour("16") + if self.colour_toggle_Var.get() == "on": + set_colour = brickcolour(self.colour_code_Var.get()) + if set_colour is not None: + if set_colour.colour_type == "LDraw" and set_colour.ldrawname is not None: + text_colour = get_contrast_colour(set_colour.rgb_values) + self.colour_preview.configure(text=set_colour.ldrawname, text_color=text_colour, + fg_color=set_colour.rgb_values) return - elif set_color.color_type == "Direct": - self.color_preview.configure(text=set_color.rgb_values, text_color=set_color.rgb_edge, - fg_color=set_color.rgb_values) + elif set_colour.colour_type == "Direct": + self.colour_preview.configure(text=set_colour.rgb_values, text_color=set_colour.rgb_edge, + fg_color=set_colour.rgb_values) return else: - self.color_preview.configure(text="Unknown or invalid color", text_color="#FFFFFF", - fg_color="#000000") - elif len(self.color_code_Var.get()) == 0: - self.color_preview.configure(text="", fg_color="transparent") + self.colour_preview.configure(text="Unknown or invalid colour", text_color="#FFFFFF", + fg_color="#000000") + elif len(self.colour_code_Var.get()) == 0: + self.colour_preview.configure(text="", fg_color="transparent") return else: - self.color_preview.configure(text="Unknown or invalid color", text_color="#FFFFFF", fg_color="#000000") + self.colour_preview.configure(text="Unknown or invalid colour", text_color="#FFFFFF", fg_color="#000000") def convert_file(self): input_file_path = self.input_file_Var.get() output_file_path = self.output_file_Var.get() - color_code = "16" - if self.color_toggle_Var.get() == "on": - color_code = self.color_code_Var.get() - color_check = is_brickcolor(color_code) - if not color_check[0]: - tkMessageBox.showwarning(color_check[1], color_check[2]) + colour_code = "16" + if self.colour_toggle_Var.get() == "on": + colour_code = self.colour_code_Var.get() + colour_check = is_brickcolour(colour_code) + if not colour_check[0]: + tkMessageBox.showwarning(colour_check[1], colour_check[2]) return if not os.path.isfile(input_file_path): @@ -130,7 +130,7 @@ def convert_file(self): f"'{os.path.dirname(output_file_path)}' is not a valid output directory") return - number_triangles = stlToDat(input_file_path, output_file_path, color_code) + number_triangles = stl_to_dat(input_file_path, output_file_path, colour_code) tkMessageBox.showwarning('Converted File', f'stl file converted to "{output_file_path}"\n' f'Part contains {number_triangles} triangles.') diff --git a/app/brickcolour.py b/app/brickcolour.py new file mode 100644 index 0000000..5c9cfa0 --- /dev/null +++ b/app/brickcolour.py @@ -0,0 +1,97 @@ +def is_brickcolour(colour_code: str): + if len(colour_code) < 1: + return False, "No Colour Code", "Apply Checkbox was toggled, but no colour code provided" + elif not colour_code.startswith("0x2"): + if not colour_code.isdigit(): + return (False, "Invalid Colour Code", + f"The provided colour code '{colour_code}' is not a number.\n " + f"Use a code from the LDraw Colour Definition Reference.\n" + f"If you wanted to use a Direct/HTML colour the format is 0x2RRGGBB " + f"(R,B and G are hexadecimal).") + elif colour_code.startswith("0x2"): + if len(colour_code) > 9: + return (False, "Invalid Colour Code", + f"The provided colour '{colour_code}' seems to be a Direct/HTML colour but is to long.") + elif len(colour_code) < 9: + return (False, "Invalid Colour Code", + f"The provided colour '{colour_code}' seems to be a Direct/HTML colour but is to short.") + for i in range(2, 9): + if colour_code[i] not in ["A", "B", "C", "D", "E", "F"] and not colour_code[i].isdigit(): + return (False, "Invalid Colour Code", + f"The provided colour '{colour_code}' seems to be a Direct/HTML colour, " + f"but contains a invalid charcter at position: {i - 2} - '{colour_code[i]}'.\n" + f"Valid characters are 0-9 and A-F(uppercase)") + return True, + + +class brickcolour: + def __new__(cls, colour_code: str): + if not is_brickcolour(colour_code)[0]: + return None + instance = super().__new__(cls) + return instance + + def __init__(self, colour_code: str): + self.colour_code = colour_code + if colour_code.startswith("0x2"): + self.colour_type = "Direct" + self.rgb_values = f"#{self.colour_code[3:]}" + self.rgb_edge = get_contrast_colour(self.rgb_values) + else: + self.colour_type = "LDraw" + self.ldrawname, _, \ + self.rgb_values, \ + self.rgb_edge, \ + self.alpha, \ + self.luminance, \ + self.material, \ + self.legoname, \ + self.legoid, \ + self.category = get_colour_info_by_id(self.colour_code) + + def __str__(self): + if self.colour_type == "Direct": + return f"Direct Colour: {self.colour_code}" + else: + if self.ldrawname is not None: + return f"LDraw Colour {self.colour_code}: {self.ldrawname}, {self.rgb_values}" + else: + return f"Unknown LDraw Colour {self.colour_code}" + + def __repr__(self): + return f"brickcolour({self.colour_code})" + + +def get_colour_info_by_id(id: str): + found_colour = [None] * 10 + with open("BrickColours.csv", "r", encoding="utf-8") as source: + # skip row with column names + source.readline() + for line in source: + values = line.split(";") + if values[1] == id: + for i in range(len(values)): + # replace empty values with None + if len(values[i]) == 0: + values[i] = None + found_colour = values + break + + return found_colour + +def get_contrast_colour(rgb_values: str): + r = 0 if int(rgb_values[1:3], 16) < 128 else 1 + g = 0 if int(rgb_values[3:5], 16) < 128 else 1 + b = 0 if int(rgb_values[5:7], 16) < 128 else 1 + if r+g+b < 2: + return "#FFFFFF" + else: + return "#000000" + + +def get_complementary_colour(rgb_values: str): + red = '%02X' % (255 - int(rgb_values[1:3], 16)) + green = '%02X' % (255 - int(rgb_values[3:5], 16)) + blue = '%02X' % (255 - int(rgb_values[5:7], 16)) + + return f"#{''.join([red, green, blue])}" diff --git a/app/stlToDat.py b/app/stlToDat.py index cafec01..0fc61c7 100644 --- a/app/stlToDat.py +++ b/app/stlToDat.py @@ -11,13 +11,13 @@ from stl import mesh -def stlToDat(input_filename: str, output_filename: str, colour: str = "16"): +def stl_to_dat(input_filename: str, output_filename: str, colour: str = "16"): mm_to_ldu = 1.0 / 0.4 - inputMesh = mesh.Mesh.from_file(input_filename) + input_mesh = mesh.Mesh.from_file(input_filename) - inputMesh.x *= mm_to_ldu - inputMesh.y *= mm_to_ldu - inputMesh.z *= mm_to_ldu + input_mesh.x *= mm_to_ldu + input_mesh.y *= mm_to_ldu + input_mesh.z *= mm_to_ldu with open(output_filename, "w", encoding="utf-8") as fp_out: # 0: Comment or META command the first 0 line is alway the filename @@ -26,12 +26,12 @@ def stlToDat(input_filename: str, output_filename: str, colour: str = "16"): # Todo: Add License Meta command to file fp_out.write("0 BFC CERTIFY CCW\n") - for index, triangle in enumerate(inputMesh): - # 3:filled triangle, 16:Default color + for index, triangle in enumerate(input_mesh): + # 3:filled triangle, 16:Default colour fp_out.write(f"3 {colour} {' '.join(map(lambda a: str(a), triangle))}\n") # return number of triangles - return len(inputMesh) + return len(input_mesh) if __name__ == '__main__': @@ -59,4 +59,4 @@ def stlToDat(input_filename: str, output_filename: str, colour: str = "16"): elif sys.argv[4] == "-c": colour = sys.argv[5] - print(f"Part contains {stlToDat(input_filename, output_filename, colour)} triangles.") + print(f"Part contains {stl_to_dat(input_filename, output_filename, colour)} triangles.") diff --git a/graphical_userinterface.png b/graphical_userinterface.png index a9be42b882c70053fcdd89312edd86d83bfed687..e73e639ed83eccc9633b421bc372af33bf23376a 100644 GIT binary patch literal 34693 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 literal 34526 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