print.as 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. //overhangs : quick set/unset like the one in prusalicer
  2. int s_overhangs_get()
  3. {
  4. if (is_enabled("overhangs_width")) {
  5. float width = get_float("overhangs_width");
  6. bool percent = is_percent("overhangs_width");
  7. if((percent && width > 50.f) || ((!percent) && width > 0.2f)) return 1;
  8. }
  9. if (!is_enabled("overhangs_width_speed") || get_float("overhangs_width_speed") == 0) {
  10. return 0;
  11. }
  12. return -1;
  13. }
  14. void s_overhangs_set(bool is_set)
  15. {
  16. if (is_set) {
  17. if (!is_enabled("overhangs_width")) {
  18. set_enabled("overhangs_width", true);
  19. }
  20. if (!is_enabled("overhangs_width_speed")) {
  21. set_enabled("overhangs_width_speed", true);
  22. }
  23. if (get_float("overhangs_width") == 0) {
  24. float width = get_float("overhangs_width");
  25. bool percent = is_percent("overhangs_width");
  26. if((percent && width < 50.f) || ((!percent) && width < 0.2f))
  27. set_percent("overhangs_width", 75.f);
  28. }
  29. if (get_float("overhangs_width_speed") == 0) {
  30. set_percent("overhangs_width_speed", 55.f);
  31. }
  32. } else {
  33. set_enabled("overhangs_width", false);
  34. set_enabled("overhangs_width_speed", false);
  35. }
  36. }
  37. // "not thick bridge" like in prusaslicer
  38. float compute_overlap()
  39. {
  40. float height = get_float("layer_height");
  41. float width = get_computed_float("solid_infill_extrusion_width");
  42. if(height <= 0) return 1;
  43. if(width <= 0) return 1;
  44. float solid_spacing = (width - height * 0.215);
  45. float solid_flow = height * solid_spacing;
  46. float bridge_spacing = sqrt(solid_flow*1.2739);
  47. float round_val = floor((bridge_spacing / solid_spacing) * 1000. + 0.5) / 1000.;
  48. return round_val;
  49. }
  50. int s_not_thick_bridge_get()
  51. {
  52. bool is_set = false;
  53. get_custom_bool(0,"not_thick_bridge", is_set);
  54. if(is_set){
  55. //set other vars
  56. ask_for_refresh();
  57. return 1;
  58. }
  59. return 0;
  60. }
  61. void s_not_thick_bridge_reset()
  62. {
  63. set_custom_string(0,"not_thick_bridge", "");
  64. back_initial_value("bridge_type");
  65. back_initial_value("bridge_overlap");
  66. back_initial_value("bridge_overlap_min");
  67. }
  68. void s_not_thick_bridge_set(bool set)
  69. {
  70. bool var_set = false;
  71. get_custom_bool(0,"not_thick_bridge", var_set);
  72. if (var_set != set) {
  73. set_custom_bool(0,"not_thick_bridge", set);
  74. }
  75. if (set) {
  76. if (get_int("bridge_type") != 3) // current flow
  77. set_int("bridge_type", 3);
  78. float overlap = compute_overlap();
  79. set_float("bridge_overlap", overlap);
  80. set_float("bridge_overlap_min", overlap);
  81. } else if (var_set != set) {
  82. back_initial_value("bridge_type");
  83. back_initial_value("bridge_overlap");
  84. back_initial_value("bridge_overlap_min");
  85. }
  86. }
  87. // seam position
  88. // spRandom [spNearest] spAligned spRear [spCustom] spCost
  89. // ("Cost-based") ("Random") ("Aligned") ("Rear")
  90. // -> Corners Nearest Random Aligned Rear Custom
  91. // spRandom spAllRandom [spNearest] spAligned spExtrAligned spRear [spCustom] spCost
  92. // ("Cost-based") ("Scattered") ("Random") ("Aligned") ("Contiguous") ("Rear")
  93. // -> Corners Nearest Scattered Random Aligned Contiguous Rear Custom
  94. float user_angle = 0;
  95. float user_travel = 0;
  96. int s_seam_position_get(string &out get_val)
  97. {
  98. int pos = get_int("seam_position");
  99. string seam_pos;
  100. get_string("seam_position", seam_pos);
  101. if(pos < 7){
  102. if (pos == 0) return 2;// Scattered
  103. if (pos == 1) return 3;// Random
  104. return pos + 1;
  105. } else {
  106. float angle = get_float("seam_angle_cost");
  107. float travel = get_float("seam_travel_cost");
  108. if(angle >= 1. && travel <= 0.8) return 0; //corner
  109. if(angle <= 1. && travel >= 1.0) return 1; //nearest
  110. user_angle = angle;
  111. user_travel = travel;
  112. }
  113. return 7;
  114. }
  115. void s_seam_position_set(string &in set_val, int idx)
  116. {
  117. if (idx == 2 ) {
  118. set_int("seam_position", 0); // Scattered
  119. } else if (idx == 3) {
  120. set_int("seam_position", 1); // Random
  121. } else if (idx == 4) {
  122. set_int("seam_position", 3); // Aligned
  123. } else if (idx == 5) {
  124. set_int("seam_position", 4); // Contiguous
  125. } else if (idx == 6) {
  126. set_int("seam_position", 5); // Rear
  127. } else if (idx <= 1) {
  128. set_int("seam_position", 7);
  129. if (idx == 0) { //corner
  130. set_percent("seam_angle_cost", 120);
  131. set_percent("seam_travel_cost", 40);
  132. } else { // == 1 // nearest
  133. set_percent("seam_angle_cost", 80);
  134. set_percent("seam_travel_cost", 100);
  135. }
  136. } else {
  137. set_int("seam_position", 7); // custom
  138. if(user_angle > 0 || user_travel > 0){
  139. set_percent("seam_angle_cost", user_angle);
  140. set_percent("seam_travel_cost", user_travel);
  141. } else {
  142. back_initial_value("seam_angle_cost");
  143. back_initial_value("seam_travel_cost");
  144. }
  145. }
  146. }
  147. bool s_seam_position_is_enabled()
  148. {
  149. return get_int("perimeters") > 0;
  150. }
  151. // s_wall_thickness
  152. // set the perimeter_spacing & external_perimeter_spacing
  153. // as m * 2 perimeter_spacing + n * 2 * external_perimeter_spacing = o * s_wall_thickness
  154. float s_wall_thickness_get()
  155. {
  156. int nb_peri = 2;
  157. if (!get_custom_int(0,"wall_thickness_lines", nb_peri)) nb_peri = 2;
  158. float ps = get_computed_float("perimeter_extrusion_spacing");
  159. float eps = get_computed_float("external_perimeter_extrusion_spacing");
  160. //print("s_wall_thickness_get "+ps+" "+eps+" *"+nb_peri+"\n");
  161. if (nb_peri == 0) return 0; // fake 'disable'
  162. if (nb_peri < 2) nb_peri = 2; // too thin value
  163. if( eps > 100000) return 0;
  164. if( ps > 100000) return 0;
  165. return eps * 2 + (nb_peri-2) * ps;
  166. }
  167. void s_wall_thickness_set(float new_val)
  168. {
  169. float diameter = get_float("nozzle_diameter");
  170. float nb = new_val / diameter;
  171. int int_nb = int(floor(nb+0.1));
  172. //print("float "+nb+" cast into "+int_nb+"\n");
  173. if (int_nb > 1 && int_nb < 4) {
  174. float ext_spacing = new_val / int_nb;
  175. set_float("external_perimeter_extrusion_spacing", ext_spacing);
  176. set_float("perimeter_extrusion_spacing", ext_spacing);
  177. set_custom_int(0,"wall_thickness_lines", int_nb);
  178. } else if(int_nb > 3) {
  179. //try with thin external
  180. float ext_spacing = diameter;
  181. float spacing = (new_val - ext_spacing * 2) / (int_nb - 2);
  182. if (spacing > diameter * 1.5) {
  183. // too different, get back to same value
  184. ext_spacing = new_val / int_nb;
  185. spacing = ext_spacing;
  186. }
  187. set_float("external_perimeter_extrusion_spacing", ext_spacing);
  188. set_float("perimeter_extrusion_spacing", spacing);
  189. set_custom_int(0,"wall_thickness_lines", int_nb);
  190. } else if(new_val == 0) {
  191. // fake 'disable' to not confuse people susi#2700
  192. set_custom_int(0,"wall_thickness_lines", 0);
  193. back_initial_value("external_perimeter_extrusion_spacing");
  194. back_initial_value("perimeter_extrusion_spacing");
  195. } else {
  196. back_custom_initial_value(0,"wall_thickness_lines");
  197. back_initial_value("external_perimeter_extrusion_spacing");
  198. back_initial_value("perimeter_extrusion_spacing");
  199. // refresh the displayed value to a valid one
  200. ask_for_refresh();
  201. }
  202. // ask_for_refresh();
  203. }
  204. // quick settings brim
  205. float last_brim_val = 5;
  206. int s_brim_get()
  207. {
  208. float bw = get_float("brim_width");
  209. if (bw > 0) {
  210. last_brim_val = bw;
  211. return 1;
  212. }
  213. return 0;
  214. }
  215. void s_brim_set(bool new_val)
  216. {
  217. if(new_val) {
  218. float bw = get_float("brim_width");
  219. set_float("brim_width", last_brim_val);
  220. } else {
  221. set_float("brim_width", 0);
  222. }
  223. }
  224. // quick settings support
  225. int s_support_fff_get(string &out get_val)
  226. {
  227. bool support_material = get_bool("support_material");
  228. if (!support_material) { // None
  229. return 0;
  230. }
  231. bool support_material_auto = get_bool("support_material_auto");
  232. if (!support_material_auto) { // For support enforcers only
  233. return 2;
  234. }
  235. bool support_material_buildplate_only = get_bool("support_material_buildplate_only");
  236. if (support_material_buildplate_only) { // Support on build plate only
  237. return 1;
  238. }
  239. // everywhere
  240. return 3;
  241. }
  242. void s_support_fff_set(string &in new_val, int idx)
  243. {
  244. if(idx == 0) { // None
  245. back_initial_value("support_material_buildplate_only");
  246. back_initial_value("support_material_auto");
  247. set_bool("support_material", false);
  248. } else if(idx == 1) { // Support on build plate only
  249. set_bool("support_material_buildplate_only", true);
  250. set_bool("support_material_auto", true);
  251. set_bool("support_material", true);
  252. } else if(idx == 2) { // For support enforcers only
  253. set_bool("support_material_buildplate_only", false);
  254. set_bool("support_material_auto", false);
  255. set_bool("support_material", true);
  256. } else if(idx == 3) { // everywhere
  257. set_bool("support_material_buildplate_only", false);
  258. set_bool("support_material_auto", true);
  259. set_bool("support_material", true);
  260. }
  261. }
  262. //TODO to replicate prusa:
  263. // brim_type
  264. // cooling
  265. // xy compensation (both)
  266. //test:
  267. // setting:script:bool:easy:depends$enforce_full_fill_volume:label$fullfill-lol:s_fullfill
  268. // setting:script:int:easy:depends$perimeters:label$perimeters-lol:s_perimeter
  269. // setting:script:float:easy:depends$top_solid_min_thickness:label$thickness-lol:s_thickness
  270. // setting:script:percent:easy:depends$bridge_flow_ratio:label$bridgeflow-lol:s_bridgeflow
  271. // setting:script:string:easy:depends$notes:label$notes-lol:s_notes
  272. // setting:script:enum$b$bof$m$mouaif:easy:depends$no_perimeter_unsupported_algo:label$noperi-lol:s_noperi
  273. int s_fullfill_get()
  274. {
  275. if (get_bool("enforce_full_fill_volume")) return 1;
  276. return 0;
  277. }
  278. void s_fullfill_set(bool set)
  279. {
  280. set_bool("enforce_full_fill_volume", set);
  281. }
  282. int s_perimeter_get()
  283. {
  284. return get_int("perimeters");
  285. }
  286. void s_perimeter_set(int set)
  287. {
  288. set_int("perimeters", set);
  289. }
  290. float s_thickness_get()
  291. {
  292. return get_float("top_solid_min_thickness");
  293. }
  294. void s_thickness_set(float set)
  295. {
  296. set_float("top_solid_min_thickness", set);
  297. }
  298. float s_bridgeflow_get()
  299. {
  300. return get_float("bridge_flow_ratio");
  301. }
  302. void s_bridgeflow_set(float set)
  303. {
  304. set_percent("bridge_flow_ratio", set);
  305. }
  306. void s_notes_get(string &out get_val)
  307. {
  308. get_string("notes", get_val);
  309. }
  310. void s_notes_set(string &out set_val)
  311. {
  312. set_string("notes", set_val);
  313. }
  314. int s_noperi_get(string &out get_val)
  315. {
  316. return get_int("no_perimeter_unsupported_algo") == 0 ? 0 : 1;
  317. }
  318. void s_noperi_set(string &out set_val, int idx)
  319. {
  320. //set_int("no_perimeter_unsupported_algo", idx == 0 ? 0 : 3);
  321. if (idx == 0) set_int("no_perimeter_unsupported_algo",0);
  322. else set_string("no_perimeter_unsupported_algo", "filled");
  323. }