* ENH: Show Recent File Image Keep Scale Change-Id: Ib8a6cf916eaee8e353bf858bc4f2ea503705809e * FIX: wipetower position problem jira: STUDIO-4914 Change-Id: I7b05d3c53931ed8ce3d4603ff21ee6ef675611e5 * FIX: dailytips adapts screen scale jira: STUDIO-5019 STUDIO-5026 STUDIO-5027 STUDIO-5028 STUDIO-5025 Change-Id: I63d3af1870218ba8e0f048a6ef03fb29fabe27cb * FIX: generate process preset based on template Jira: XXXX Change-Id: I50adf0790dc239307d236a4cebece860ef6beb16 Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * FIX: object list plate name edit Change-Id: I61d3dcd7d9598d759a3a0b44cc77d2af2adca25a Jira: STUDIO-4937 * ENH:no longer checking nozzle type jira:[for nozzle type check] Change-Id: I0e88445a264f21b0c11519e9a22a165d05611d14 * ENH: improve first layer tree support First layer support can't be top interface, and min brim width of auto mode should be larger than 0. Jira: STUDIO-5010 Change-Id: I02f8b017b535f8a47965387e8679f692b1966e04 (cherry picked from commit 3e7d54abe352e8ab5f9d6492b5a86a96f9067f94) * ENH: version: bumped to 1.8 JIRA: no jira Change-Id: I50903098b59f1dd9a6b6cf7656cec7d388f3ff17 * ENH:try again after subscription failure jira:[Try again after subscription failure] Change-Id: Ibfb1e8e26eb166d786a372632a86ef98030db034 * ENH:display msg dialog once jira:[for http error msg] Change-Id: I12e9c155fdb567cac99c35b6feeef650269ba75d * ENH:remove config.json file Change-Id: Idfcf3a63fefe968e88153c26fb691fd05cd83dc4 * ENH:add protection in threads jira:[for random crash] Change-Id: I6286012dd77abccba461f7cd72a6fc531a84c95f * FIX: add protection for get_model_task_thread thread Jira: XXXX Change-Id: I3cbc17d181a0e13c658f31eaeb6a4df878e6df41 Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * FIX: delete all compatible presets when delete third printer Jira: XXXX Change-Id: I1a294402627e7ab7a8c6701f20679b3d04aff059 Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * ci: update build version to 01.08.00.51 Change-Id: I20a01adacbdb5fe69c106b9efd029f7308136e10 * ENH: default open support_interface_not_for_body jira:[NEW] Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I48e084deb18633f9ec47a8ec4ec643163bf66318 * ENH:modified text with too low version jira:[for low version] Change-Id: I862a0defda976a35f326a8805e002330f2ed7fdf * NEW:update printer config file version Change-Id: I9a46b29b03beb67a3da0b8f76d8b5c4b3c482928 * FIX:The plane should rotate around the world coordinate system Jira: STUDIO-5054 Change-Id: I16e484b38d79cabd9473acf1abf3c5c6b0adc4c6 * ENH:translate for limit file size and so on Jira: STUDIO-5007 Change-Id: I2c279eb690841aa51cd8128f8028266cbc17e977 * ENH:use on_render_rotate_gizmos() replace GLGizmoRotate3D::on_render() Jira: STUDIO-4227 Change-Id: If9b9ea5596e59472d5fa87ac56aeb7f6ecc65643 * FIX: some mistakes in filament profiles jira:[NEW] Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: Ibe7f3650f2d9cf47561dd5f2ec591a5f6c553503 * FIX: fix shard_ptr is null Change-Id: I0187cf64ffbb08a2265a11900b5c865e9ac9678f * FIX:N1 printer image in dark mode JIRA:STUDIO-4057 Change-Id: I22c001d96839daf213d5096f6ff6e3d6398fa8c4 * FIX: create printer issue Jira: 5034 5059 5053 5034 create printer but filament is repeat 5039 create successful dialog remove to center 5053 create existing printer copywriting adjustments and preset updates Delete printer secondary confirmation dialog Change-Id: Ifb3822d1e168459d2af11e02b31ecaf3719d338a Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * ENH:just don't check the nozzle diameter jira:[for nozzle check] Change-Id: I678e7d62832eaa14b9be47d6dce70f29ebd601f6 * NEW:p1 and x1 series added motor noise calibration JIRA: 5085 Change-Id: Id73cc2d34b6130f215d81ffcdc39ba6b241445bf * ci: update build version to 01.08.00.52 Change-Id: I93d800b413f2751d132fac53fbd9b191603d0352 * FIX: ObjectSetting changed when search plate JIRA: STUDIO-5095 Signed-off-by: Kunlong Ma <kunlong.ma@bambulab.com> Change-Id: I39b1ad997d51ac4224ff5ad2b3555f56da4bd911 * FIX: invalid support params in 3rd party profiles Many params are not right.Just use default jira:[NEW] Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I5c4a1e8b046940e174f5681a79031b5f20fcafc5 * ENH: update A1 mini start gcode Change x-axis freq sweep amp 5->10 jira:[NEW] Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I2e731cc6392c0204d5e4467bf4b933ab233bc157 * FIX: [STUDIO-4946] use utf8 path to create sub process Change-Id: I5873c114e8cd36978a7d50bf13c3aa7bf8b740ca Jira: STUDIO-4946 * FIX: fix a plate state not correct issue JIRA: no-jira the object and instance states lost after undo Change-Id: I527df9a7d426d994501a4ed5bbb198c7bbac810b * FIX: some translation Jira: 5096 5089 5036 5004 Change-Id: I4f1bd6e352b11451f5caf02cbc4eeb31dfa03eee Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * FIX: [STUDIO-4935] plate name edit in object list Change-Id: I271fa217281d0c7ceca61166497136628a66681e Jira: STUDIO-4935 * FIX: take custom root as AMS sync candicate Change-Id: I9c71babcd74238d1533b15d77a978b19997c70c0 Jira: none * FIX: modify some default support params in code 1. Modify default values of some supports params, so 3rd party profiles are easier to setup. 3. Fix a bug that organic support may cause crash. Jira: none Change-Id: Icae348d8fe5985f4287404e96089198a499283f2 (cherry picked from commit 8889cfc703b72e142f288e525b89c87619f2213c) * FIX: do not generate sheath for normal support Jira: none Change-Id: I8f3f3e39171055f8d18c06ceee8e245594273238 (cherry picked from commit 93bc7ecf4346f179f502bebc3cf47b0030b56e2c) * FIX: push_notification on GUI thread Change-Id: Iaec347f5684fe0f65d6418759518189b67033c42 Jira: STUDIO-5106 * ENH: CLI: add some params to support more functions 1. uptodate_filaments to support update the original filaments to newest config 2. allow_rotations/avoid_extrusion_cali_region for auto-arrange 3. skip_modified_gcodes to support skip modified gcodes JIRA: STUDIO-5112 Change-Id: I95c09af1b5462cce3bf27aea32228d6d1d1d201d * FIX: missed manually entered values for secondary processing Jira: STUDIO-4964 Change-Id: I5cf0da1ae77cccd34de05b4a0318a751ac9f6753 * FIX: Z hop is still enabled when upper boundary is zero. Jira: STUDIO-4893 Signed-off-by: wenjie.guo <wenjie.guo@bambulab.com> Change-Id: I5f46a02e1fbb15ff43e253e3a184aa6cc38e7598 * ENH: update default filaments for Bambu printers jira:[NEW] Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: Ic6380f39e546854ad0b7dc36929a8605c9ab3acc * ENH: dailytips modification 1. modify closing behavior 2. dailytips can adjust self size according to the canvas size. And also adjust GodeViewer legend window size 3. fix a button text encoding bug 4. support vertical/horizontal layout(horizontal layout currently not used) jira: new Change-Id: I8e0b6e85c455d0608d7388fb441829c1991ad01f * FIX: [4857 5097] export list and del preset two confirm issue Jira: 4857 5097 Change-Id: If7cc4967a663f575527a227e9c4ac31e0491930c * FIX: UUID conflict issue when referencing volume Jira: XXXX 3mf file standard Change-Id: I953a87294684ea85d03a95e7d2843c096904aeae Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * FIX: [4483 5003 5109] create printer and edit filament issue Jira: 4483 5003 5109 4483 dialog blink 5003 preset list too long 5109 encode Change-Id: I190e12272ca09f36b841f2f85a6cf60f2c2614bd Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * FIX: cloud use presets limit notify Change-Id: I6cc7b4e560cb83db0fc30921633b10531957128e Jira: STUDIO-5091, STUDIO-5104 * FIX: do user preset sync later on startup Change-Id: I0653a0438477b1c803ce1cddc66ef47f95616dae Jira: STUDIO-5106 * FIX: linux: pressing enter in height range will crash jira: STUDIO-4391 Change-Id: I6bf990951d1456f5b2605b8d62a05bceb3cc4c10 * FIX: failed to limit the max width of DropDown Jira: STUDIO-4503 Signed-off-by: wenjie.guo <wenjie.guo@bambulab.com> Change-Id: Id9352d16f4bc016daade72a9c8d3d90164a1cb3d * FIX: not jump to preview after first wizard Change-Id: I8c94d66a91aa15a7874441a300b40438638bd33b Jira: STUDIO-5018 * ENH: CLI: clear custom gcodes when skip_modified_gcodes JIRA: STUDIO-5112 Change-Id: I2e7346d2ac57519029a4e80e5492c34d3d91ed77 * FIX: [4492 4851 4883 5121] create printer issue Jira: 4492 4851 4883 5121 Change-Id: If252b5f30be0403f79410aa8c00fc14b066d5bbd Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * ENH: add 'edit preset' and 'delete preset' btn for each preset Jira: 5200 5113 Change-Id: I208ad63eb4b895306fa76db424da2e1df10a582e Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * FIX: add skip label before tool change Jira: 5074 github: 2776 Signed-off-by: qing.zhang <qing.zhang@bambulab.com> Change-Id: Icaafd3b45da1e78c1a82e7d17d7505d9439b9100 * FIX:Network test dark mode adaptation JIRA:STUDIO-2468 Change-Id: I20cb7f1fd8eca3ce852acb563c1cc87978e216dc * FIX:n1 external feed prompt pop-up without retry button JIRA: STUDIO-4696 Change-Id: I31069c72e29d3398469d71cdbc2a344a5430fc2c * FIX: not show device page when switch printer preset Change-Id: I00d8524625a4682b6a39876ddb66bf8bd928dbef Jira: none * ENH: Check the nozzle diameter when sending calibration Jira: 4977 Change-Id: Iabbba44583bbd9fbaaa889ca546ee0ccbb2aa77f * FIX: Generate UUID from objectID and volumeIndex Jira: XXXX Change-Id: I65147ef9b695f8af8de260d722e604b0e0bab563 Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * FIX: disable filament_typep Jira: XXXX Change-Id: Ib605b33e4474525fbe49e70596fc09aa356f478a Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * ci: update build version to 01.08.00.53 Change-Id: I1d574fa2cf2a4d0eb63a38eb8ced7587d06a4272 * ENH: refine display logic of param 1. Refine the display logic of "support_interface_not_for_body".Only toggle if support_filament is default and support_interface_filament is specified jira:[NEW] Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: Ia2af030c4531ad6b04a198bfe8a1677b3d20a800 * FIX: user preset sync token Change-Id: Id2aa865b778ee9ac4cfddb68ceef0374507b519b Jira: none * FIX: Bitmap cache not take effect Change-Id: I972098fdbda0b4542c6c759a8f5e1f0f2a30852b Jira: STUDIO-4991 * NEW: Open HotModel Link With GetParam-From bambustudio JIRA: NO JIRA Change-Id: I4ac49bac5ee0c50988c76a38b00b7ba7dc3201f5 * NEW:AmsMaterialsSetting Support for user-preset JIRA: STUDIO-5135 Change-Id: If848047cd5dbd059d440de30989c505c361305a7 * FIX: upload custom root preset fail Change-Id: I621c8d542dd604b07cc5df63d97d7a31558d3aba Jira: none * FIX: show custom filament in AMS filament list Change-Id: I79b9f8f2f08db8c52bbed76f1ea133baff383c00 Jira: none * FIX: dailytips window and gcodeviwer legend window size issue reset to original logic of dailytips and legend window size jira: new Change-Id: Iacb016bb222ba3f87317cfbe1f2b003802d773a5 * ENH: add text translation jira: new Change-Id: I780cfb8a0a64d806b5e0a414b6598e3b7bdf52dc * FIX: Delete and search object outside the plate JIRA: 1. STUDIO-5132 Deleting object outside the plate will crash 2. STUDIO-5146 The search function cannot search for object outside the plate Signed-off-by: Kunlong Ma <kunlong.ma@bambulab.com> Change-Id: I84cb3fe990a9c2a182e7434c262466a70545280e * FIX: [5149 5142 5141 5140 5136] create printer and filament issue Jira: 5149 5142 5141 5140 5136 5149 process preset name can not show all 5142 improt configs combobox not update 5141 disable modify filament_vendor 5140 disable input Bambu and Generic vendor 5136 preset list window adjust Change-Id: I111a23996146cc16cc7f533c8616d50223d34c40 Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * ci: update build version to 01.08.00.54 Change-Id: Ifd69c01a82f627a9c6cf4fe0d48a759563ee90e7 * FIX: print model from sdcard with p1p Change-Id: If85383ba762022ead3dd754ae02a08817b891114 Jira: none * FIX: dailytips text translation jira: STUDIO-2556 Change-Id: If44e503615b09ee1692f42ba1f998918ec5bd691 * FIX: clone shortcut key conflict with quit in macos jira: STUDIO-5166 Change-Id: I548f275bb68d3b0e6bb3cfad6fe93df09d507da3 * FIX:User preset material settings dependent on firmware JIRA: 5167 Change-Id: I82cf26848594b01155883ad0aa2e9ee77d371fb2 * ENH:update the description of nozzle detection Change-Id: Id27b25c69dc11fcf66fc82053af705906ae8c370 * FIX: [5159 5165 5171 5172] create printer and filament issue Jira: 5159 5165 5171 5172 5159 create printer dialog no refresh 5165 create printer 2 step dialog no refersh 5171 change font 5172 edit filament dialog darkUI issue input special character is prohibited '/' in preset name translate to '-' update printer combobox Change-Id: I5fa27836dab7f604f1a065c65efa099c7a2f0f96 Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * ci: update build version to 01.08.00.55 Change-Id: If1865d561cf274719204662314de163497759e89 * FIX:fix GLmodel deconstruction causing section not to be rendered Jira: STUDIO-5156 Change-Id: Ibb2f459920989ee54f7b827352dc8893424b4de6 * FIX: missing unlock cause device or resource busy Change-Id: I87563312ea9c6ce4e4e471da7ce7a02b53b64762 * FIX: some translation Change-Id: I9758cbc758030b5a3945697a50ca4898af9fcb1b * ci: update build version to 01.08.00.56 Change-Id: Id5ee53dd2ebb0b37b6927dc58b3cca94a1f66a83 * ENH: remove PLA GLOW in A1 mini jira:[NEW] Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: Id99c1bbd4248e28df9150a85eecec831f6f32856 * ci: update build version to 01.08.00.57 Change-Id: Ib4dfa60f097128b76b95bb14ca04978619021b56 * Allow line width of nozzle diameter * 2.5 As it were, 1 mm would be disallowed but 0.99 would be allowed for 0.4 nozzle. 1 mm is the sane maximum and 0.99 is unnecessary tedious to write. * Russian translation update Russian translation Bambu Studio_v1.8.0 Beta * FIX: scale problem in needs_retraction jira:[NEW] Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: Idfbe954b22fa6aa5769c55e46874fa6a80ecbf45 (cherry picked from commit 4e853f50b748e3af11e2d64862b6ee557fda361b) * ENH: CLI: support load_assemble_list JIRA: STUDIO-4848 Change-Id: Ife11533740988331ea71eac86c370e625970cb8b * FIX: align to Y not working This is a bug introduced in 7fbb650 when solving jira STUDIO-4695. Now we use a more decent way to solve it. Change-Id: I92deffcb9fe53e8a24c93fe973446ae37df07375 (cherry picked from commit bd98430dbd15eb6c9bb4b447990e0dcf8a50eef0) * ENH: Add buried points for cut and meshboolean JIRA: NONE Signed-off-by: Kunlong Ma <kunlong.ma@bambulab.com> Change-Id: I67ce498d0c335dd7a8582f56b880c2c8314f8541 * FIX: 5092 edit filament add scrolled window Jira: 5092 Change-Id: I53ae996b04e4e2f1b1ddce6a858d505001b11615 Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * FIX: can not select user preset when create filament Jira: XXXX github: 1936 and fix add preset for printer dialog can not show selected printer Change-Id: Id4308c6bdca17d52d4aa321db359941aa87e0e45 Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * ENH: template filament don't be show in filament list and sort Jira: 5160 5179 Change-Id: I56a7e1897e1ef3c061dc66d318896413ca25b76b Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * FIX: [5174] export configs dialog issue filament name too long to can not show all Jira: 5174 Change-Id: I92018c9d7f86009b78b533592d899b4b5d78c3c8 Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * ENH: add filament Bambu TPU 95A HF 1.As title jira:[NEW] Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I752ec43da6297a6c172679997ce68f2318a7b8fb * ENH: modify some params with filaments 1.Modify the PEI bed temperature of PLA Basic, Matte, and Tough to 65 in A1 mini. Set the bed temperature for the first layer of Bambu PETG-CF to 65 and 70 for the other layers jira:[NEW] Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: Ia902bbb7f824082d5346709d781cac64296f47a8 * ENH: add more status during printing JIRA: STUDIO-5195 Change-Id: I85b3107839c6e2fdecbc10d90a876463e284468c Signed-off-by: Stone Li <stone.li@bambulab.com> * FIX:cut imgui has overlapping rendering on Apple Jira: STUDIO-5150 Change-Id: I7969e19dc189cd617026a183067dad628208955c * FIX:not TakeSnapshot for m_start_dragging_m Jira: STUDIO-5176 Change-Id: Ia03e3e2c2664dbdcffa19ec8d0fa97dfd95e6d35 * FIX: rendered color changes Jira: STUDIO-4956 during the drag processin connectors editing state Change-Id: I3027176ea9f93a9ba9d6a2052f41aaa4adef79f1 * FIX: merge the patch from Prusa Thanks for PrusaSlicer and YuSanka Jira:STUDIO-5175 commit 510d59687b3b19c4a0f4e6540620d0694dd1b7ac Author: YuSanka <yusanka@gmail.com> Date: Thu Oct 5 14:13:14 2023 +0200 Follow-up 1b451cdf: Fixed #11415 - Connectors disappear when slicing => only when using multiple cut planes AND excluding parts Change-Id: I9ccd5b85f482d723d21fccf5e104c9e0a9cc4849 * FIX:Press ESC directly to exit after entering the profile rendering rendering is not normal,Code from PrusaSlicer,thanks for PrusaSlicer and enricoturri1966 commit a078627552f54497ed0518dc7bc349d243576d19 Author: enricoturri1966 <enricoturri@seznam.cz> Date: Mon Jan 30 14:00:02 2023 +0100 Follow-up of 1218103fd620b319c56fd08116f81b581c537188 - Fixed gizmo missbehavior when closing a gizmo by resetting the selection clicking on the scene Jira: STUDIO-5164 Change-Id: I261da9dba2a5ac37f3e263c175fbccd80d8045bd * FIX: correct the strings and move create printer dialog center Jira: 5221 5183 Change-Id: Ida4eba63f0e962ffcc8000fcc04cf20849577217 Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * ENH: CLI: skip layer height limit validate when slicing for existing models JIRA: no jira Change-Id: I1444a28b500ca7d08ed2606eecfa5cfaf261105e * ENH:update the translation of auto refill jira:[for translation] Change-Id: Iaa7b4f3d7cd88c8b4f69a3db721ebd8ca8986eea * FIX: icon issue for copying Jira: STUDIO-4168 Icon issue when filling bed with copies Change-Id: I61a03ecae02b75602c236ed2810e9c9cfe5a19f9 (cherry picked from commit b5079f8a2e79f19f65803f23ef4fd83aff17c84a) * ENH: update some filament params 1. Modify texture bed temp to 65 2. Modify max-v-speed for ABS 3. Modify some params in Generic PA 4. Modify PLA,PVA params jira:[NEW] Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I42584a6015b8526f6bbb93024316968198bd76ce * FIX: 3770 printable checkbox incorrect display in darkUI Jira: 3770 Change-Id: I97f67d7a0ffc41f6ee625abeecc52ee4e73cf318 * FIX:Display garbled code in AmsMaterialsSetting pop-up Change-Id: I50531e939afa7715ae376bac47172ccf7b248114 * ENH:Modifying the Line Color of Transparent Materials JIRA: STUDIO-4311,5088,4983 Change-Id: I9e63413dc9cd7d523f0f7f1a2e32c4537a84467a * FIX: crash when async delete printer file Change-Id: I92c5e812d04da263338fb0eea2fd7583cf9ecde0 Jira: STUDIO-5222 * FIX: 3733 backup time not effective Jira: 3733 Change-Id: I50c2ce156fcbd0a17aa8a6777bce04aa6093c830 Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * FIX: enable edit and delete preset btn and fix issue Jira: XXXX Change-Id: I724d7236b28fcc4746698f094531948a8fbb5d93 Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * FIX:send print job,file name displays error JIRA:3137 Change-Id: I1c113025d274a13fba1b845a58aada14058fadd4 * FIX: skip hold user preset from sync Change-Id: I2252246e19bd80903ad82170782ea49535d30d05 Jira: STUDIO-5185 * FIX: 5115 translations Jira: 5115 Change-Id: I21b03bdd4d28c0bb097226143177e763cf8c777f Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * FIX: add link for ironing parameter Change-Id: I451f5549db3ac2205aa5703a2e5edc831e946af8 * FIX: scale problem in lift type decide 1. Scale the travel threshhold jira:[NEW] Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: Ib594d640fe63b0919bc9318af88577513f7dbf30 * ENH: add small perimeter speed and threshold The original param is added by Prusa. Thanks orca for adding threshold. 1. Re add small perimeter speed and threhold. github: #2221 Change-Id: I35b269b26f085d80f0edca28650bb21fc04898d7 * FIX: modify the picture of pa manual cali Jira: STUDIO-5102 Change-Id: Id87898959ad4461b7bd2505b159271f2aa589c36 * FIX: Filament preset is the same with the first one Jira: STUDIO-4519 Filament preset is the same wit the first one, it should align with the last one. Signed-off-by: wenjie.guo <wenjie.guo@bambulab.com> Change-Id: I304d0ff0fbc1c8948d410ea552e4d42b6a4e8fd9 * FIX: scoreDailog dark mode issue Jira: 4570 Change-Id: I8be97b306a1494f73e3bba678ecc864e7ff88ca3 * FIX: CLI: fix the slicing issue while only one object with multicolor using seq-print JIRA: no-jira Change-Id: Iea2d23ff8e484bf2fd58aa2f596a8e4e4292fe39 * ENH: open support wall count for normal support 1. open support wall count for normal support Enabling this option makes normal support stronger and gives better overhang quality, but also more difficult to removal. Jira: STUDIO-5192 2. fix a bug where tree support (hybrid style) may get overlapped extrusions near the walls. 3. fix a bug where raft layers can't be 1 in tree support Jira: STUDIO-5261 Change-Id: Iadc0c67a9b50b5b221c8e83d5aa22ed282018cf8 (cherry picked from commit c0bb0084e386cb70ed6e16edf93190e4b38f5b90) * FIX: compiling error on linux jira: none Change-Id: I1a4563503b5ddf74a1979cc0cee7a15b8aced904 (cherry picked from commit de52c6ca62c9f3a6314ddf5a856c1d8534329886) * ENH: add translation for small perimeter jira:[NEW] Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I95013649e4e0c07c0f04b89a91488814c8d228cc * FIX: clone shortcut key issue on macos jira: STUDIO-5166 Change-Id: I1967da1d443ed43bd750dad8e11560688d7bd533 * FIX: custom gcode window cannot paste/ navigate jira: STUDIO-5208、STUDIO-5070 Change-Id: I4ecb9d06cf5db0ae53a4678181aae9298bac106b * ENH: modify dailytips collapse & expand interaction jira: STUDIO-5209、STUDIO-5210 Change-Id: Ifb0b998e5004d4b49390ba5a250eaf4743bf3471 * ENH:Add shortcut keys and lists for objects search JIRA: STUDIO-5157 STUDIO-5158 STUDIO-5240 Signed-off-by: Kunlong Ma <kunlong.ma@bambulab.com> Change-Id: Ic7cfaaa9b4bb8a85208bafab7fe3bafdb78f0045 * FIX:Re-calculate button with White Box displayed in dark mode JIRA: STUDIO-5098 Signed-off-by: Kunlong Ma <kunlong.ma@bambulab.com> Change-Id: I07cc6c72d5dbd03b72573cd27dd5938bb0e6a29a * NEW: display plate index when printing a task JIRA: STUDIO-2689 display on the thumbnail of the current task Change-Id: I5f1f46c56e9d1e9120a66d491551908dfad099d6 Signed-off-by: Stone Li <stone.li@bambulab.com> * ENH:fixed incorrect path prefix jira:[for file path prefix] Change-Id: Ie9e3999f02b78272e528ceceb479e746d46a7e6c * FIX: thumbnail is not clear in dark mode JIRA: STUDIO-5087 Change-Id: Ie86493ed71b5554095927f061509a1f551758b61 Signed-off-by: wenjie.guo <wenjie.guo@bambulab.com> * FIX: translation Jira: XXXX Change-Id: Id03f0d704aa852632a907ea628d1277400112062 Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * ENH: first nozzle change to 0.4 and nozzle change to mm Jira: XXXX Change-Id: I14defd36442dbd7008e46782b08415b6244224f1 Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * ENH:editing_window_width's value is small on the laptop Jira: STUDIO-5238 STUDIO-5265 apply_selected_connectors should check_and_update_connectors_state Change-Id: I8c2c1c920cc4d197d1908815a3e62f4962335451 * FIX: fix new_bed_shape's calculation process Jira: STUDIO-5122 Change-Id: I5f3e6a301a297123af28692c90bef6759f425b06 * ENH:update some translations jira:[STUDIO-5262] Change-Id: Idb1d3586888043ac325f272bc7a2b788adb3e9e5 * FIX: edit text command resets object settings Jira: STUDIO-4655 Signed-off-by: wenjie.guo <wenjie.guo@bambulab.com> Change-Id: Iac25c4e40f1d0d32e6d1f40e62226cc22bc96042 * ci: update build version to 01.08.00.58 Change-Id: Iacfec02aa50c617e4c9fe566319b07b30d47dce1 * FIX: remove GetUserAgent Change-Id: I92886e1f0dcb091109231a10da8c19d51178e13b Jira: STUDIO-5205 * FIX: nozzle_diameter_map data structure adjustment Change-Id: Ifb724afc0fcf974e6d331e73ecac723107a102cf * ENH:add _A and _B for perform_with_groove Jira: STUDIO-5267 Change-Id: Iee3310dfa1cd8e6680310f0af0eff5c817490813 * ENH:is_equal for min_z and max_z Jira: STUDIO-5267 Change-Id: I9493883d8be9d44e26ddc9afe62b7e9eb09c5052 * ci: update build version to 01.08.00.59 Change-Id: Ie8ed29ccf5d6c94594eb2ab8b717416fbeace3bd * FIX:Image display unclear in light mode JIRA:5161 Change-Id: I134cc64a2af0dfff60c47d0ff09d78d9c0f86b3f * FIX:fix bugs of non manifold edge Jira: STUDIO-5267 Change-Id: I8ac9a2cf96da0bc07ee00b309e65611b92fd174d * ENH:nozzle type detection jira:[STUDIO-5246] Change-Id: Ic41a2161a0e41d23f56af93ad8ec34cc83ada0e3 * ENH: upadte P1S start gcode 1.turn on MC board fan by default on P1S jira:[NEW] Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I5b2f7868e350942fb8b7baf7d429e22a0987184a (cherry picked from commit e866a575b6b7d9552f7412f84272f4b48dfc3961) * ENH: improve support style's tooltip jira: none Change-Id: I8ee858d7052f04ce7ea6b226a500c7d1bf8a482f (cherry picked from commit 665f31c4fcde22bd894cbb4a5fb160635947f2a4) * ENH: set layer range error to warning 1. If layer range exceeds maximum/minimum layer range in printer settings,pop up a window to warn jira:[NEW] Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I0304ee790e557ecf967f355c171993d1f51b5057 * ENH: CLI: remove the warning of layer height JIRA: no jira Change-Id: Idaceee4f52611479fc3f4238d016d891b4dc8cd1 * FIX: the word search is not translated Jira: STUDIO-5224 The world search in the device panel is not translated. Signed-off-by: wenjie.guo <wenjie.guo@bambulab.com> Change-Id: Ia3d651c2159a3aad94e10cd0a6da98848f53ee2a (cherry picked from commit 4a46a0a4750d82d49c9523f4b668a1a00c41ed83) * FIX: Bitmap will flash when sending printing task Jira: STUDIO-5278 Signed-off-by: wenjie.guo <wenjie.guo@bambulab.com> Change-Id: Ib0c8710b8d5d6b98fad043c950f054aa35bea965 * ENH:display the euler angle of rotation plane Jira: STUDIO-5268 Change-Id: I6b7b431931d60f1a9a832908400417781798c472 * ci: update build version to 01.08.00.60 Change-Id: I1c15b5c6437554c43327cd6b537f7a5860dba5a0 * ENH:cancel EnterReturnsTrue for imgui in cut Jira: STUDIO-5269 Change-Id: I2832e1dccaf9755448debe7b2bd56426f90dfe0d * ci: update build version to 01.08.00.61 Change-Id: Ib03e664a20990322c788686550c491d0139d8237 * FIX: some translation problems jira:[NEW] Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: If9f2af53b4f0bfa9469e84bcba68cc182df4a473 * add: Ukrainian lang support for 1.8 * fix linux * fix some string and colors * fix linux build error 2 * fix .gitignore * FIX: calibration selected preset is null in some case jira: STUDIO-5258 Change-Id: Iee63593c5f833c5a43e3b1d1c9ddb82f8c69569a * FIX: create filament issue Jira: 5296 5297 5295 5302 5311 5276 5296 create filament: list has same printer 5297 create filament: filament combobox has blank options 5298 edit filament: delete last preset prompt users 5302 create filament: filament combox has cili preset 5311 create filament: printer name too long to can not show all 5276 edit filament: PLA Aero filament type filter issue add prusa vendor Revised copy Change-Id: I5dcc615ce0951b1a9953fa12283f6090f5069045 * FIX: some translation Change-Id: Icb8614a0af18f96d15f3b97c17e0f6f708296847 * FIX:cancel is_equal for slicing function Jira: STUDIO-5267 Change-Id: I66d759aa2c968f8a28a6a5d8378929754f2db689 * FIX:UI stuck due to pop-up window with wrong chamber temperature JIRA: 5304 Change-Id: I1a49a7219b7a6f5700243704c348724e7930ce1a * FIX: allow input '+' and hide edit preset btn Change-Id: I97aec7c3ac4cc8b9d6c535f0126aaa1926553d86 * ENH: handle printer direct close and not retry Change-Id: I5dd55f8085cf6383a8420ab41e614ea6ae210c78 Jira: STUDIO-5305 * ci: update build version to 01.08.00.62 Change-Id: I09716bf79354b503197c751272fd3171e0abc8fd * add: new translation to ukr for AirFlow and Prusa * add: Texture Plate name fix * add new feature to localization .de, fix .it (#2876) * FIX:add slice_facet_for_cut_mesh api for cut tool and modify section_vertices_map 's traverse Jira: STUDIO-5267 Change-Id: Ifc4b183a4e4c4fdb4f47742f14f70a1ed93fa056 Change-Id: I52bfaef8926ef967b78a6cb712a1731a1b528a24 * FIX: Make the front smaller for Czech in device panel Jira: STUDIO-5151 Signed-off-by: wenjie.guo <wenjie.guo@bambulab.com> Change-Id: I315174b55f923da069854fb4fed8cf3937b82074 * FIX: there is no object can be jumped to in notification jira: new Change-Id: Ib81bf49236952ede24a2de126051572d63916e01 * FIX: add height range, modifier in Preview pane will crash jira: STUDIO-5340 1. fix crash at add height range, modifiers in Preview from objectList 2. fix an assert hit when slicing 3. fix an assert hit when enter AssembleView 4. forbidden popup menu by right-click objectList in Preview Change-Id: I444bc76b1a4307999b387e4f60386b2d272bd308 * FIX: Black spot in the sending printing task page Jira: STUDIO-5307 Signed-off-by: wenjie.guo <wenjie.guo@bambulab.com> Change-Id: I3bd97c063ec5f0faf7d12047da39f60ce55cae4b * FIX: reset_cut_by_contours should update_buffer_data Jira: STUDIO-5376 Change-Id: I5aacb1f7b65822031d7138abd61a45b09c743531 * ENH:editing_window_width's value is small on the laptop Jira: STUDIO-5238 STUDIO-5265 Change-Id: Ia958772bcb081817da621115f99328bb62770cd5 * ENH: bumped version to 1.8.1 Change-Id: I9d25403daa5b7b8ca415c0b364670da9e0f932b0 * FIX: create filament dialog: create btn can not show all Jira: 5310 5331 Change-Id: I185272c90d9ff1c3d6b47abbefbf488d0d965cca * FIX:update custom_texture when new_shape=false Jira: STUDIO-5287 Change-Id: I3add95f9f9345c14a48cc7467513d1b3ce95f4c9 * ENH:editing_window_width's value is small on the laptop Jira: STUDIO-5238 Change-Id: I9044129f4e0c8ca7469db05b3e547fca4754342a * FIX:add slash_to_back_slash for saving file path Jira: STUDIO-5287 Change-Id: I9f3c176cd0831c793958f08601c63efac98176a4 * FIX: a button color didn't response to dark mode change jira: STUDIO-5315 Change-Id: I95489f01ccd1f77b9e95b0d0f69e5398d2e88487 * FIX: height range layers displayed in wrong position jira: STUDIO-5341 Change-Id: I83918b4624f367efa54321f1898e1176cdb04ea9 * FIX: auto arranging issues with locked plates 1. global auto arranging may put items overlap with wipe tower if some plates are locked jira: STUDIO-5329 2. items outside bed may overlap with plate boundary if it's rotated jira: STUDIO-5329 3. plate-wise auto arranging uses wrong min_obj_distance if the plate is by-layer printing but global setting is by-object printing jira: STUDIO-5330 Change-Id: I5dba2f1317e183c9aeec1cb2bd227fbddf4316e6 (cherry picked from commit db1eac41efff5f1e8d5ac0af74c6fc7ab59fc253) * FIX: a mistake in upward machine jira:[NEW] Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: Ibdb26c3d904634f322aef0dc0c7b8867d9fb5854 * FIX:a blank pop-up appears JIRA:XXXX Change-Id: Ice92b55204e4897fec024a6d99412eb810bddd4a * FIX:fixed failure in updating nozzle type jira:[STUDIO-5248] Change-Id: Iad37b5d5b76d37cb1723ef21d7c39b1e3fcaf8d7 * FIX:fixed issue with AI monitoring settings jira:[STUDIO-5082] Change-Id: I967fe3c1e9da61a55bcbfaa2a8e067dd5af18f72 * FIX:fixed issue with lan mode jira:[STUDIO-5189] Change-Id: I1d0a05f19dcea154cf3ef2b61ed0546d3581905e * FIX:update text for loading or unloading filaments jira:[STUDIO-5231] Change-Id: Ic7729c3ec012485b3d87e3d01f11e87502c67895 * FIX: Revert "ENH: do not leave a gap for top... Revert "ENH: do not leave a gap for top interface if the top z distance is 0" This reverts commit 79ea32c7cbbdb7e689637980af7c36caf42284c9. Revert reason: the supports are impossible to remove in some cases. jira: STUDIO-5385 Change-Id: I376a6f4dfd78da6dfea68b9ac3d552cddd0b4272 (cherry picked from commit 34e38b705fde7f5d7f9a3a89c96a3627ce0c998e) * ENH: improve normal support's quality 1. Add a base_interface_layer when using Supp.W 2. Fix a bug where base_angle and interface_angle are wong jira: STUDIO-5386 Change-Id: I52ab32c63b3cd1e6e2ba6463b01ae26699cf13d3 (cherry picked from commit 92ddd4a10b793572a1fa009da5b9e44fcdf81de2) * NEW:tracking stl model files jira:[STUDIO-5372] Change-Id: Idb1275b07441f0cd06c24588d5f7c20f81f1556c * FIX: edit filament dialog: preset name too long to del btn nan't show Jira: 5336 5174 and verify string normalization Change-Id: I380c3bed2bf43d01094b68979a8b67f4187c0b93 * FIX: some translation Jira: 5232 5300 5334 Change-Id: Ie474ca823011e81aab82a9809af3d6e42980496b * FIX: some translation Change-Id: Iaabe6087bed3b7d47d911cf4fb51c770804e72fb * ENH: change default tree_support_wall_count to 0 Now normal support also uses this option, so we can't default it to 1, otherwise normal supports will be too hard to remove. jira: none Change-Id: Ic5700af5c17e3a7b265c8915f28b0db35c6e06e6 (cherry picked from commit 6b84a9826da108b76569e686bd9def0b23ae29fd) * FIX:The name of the material in the error prompt is empty JIRA:STUDIO-4907 Change-Id: I3cf44f099256a51f21a44a89c89c000f734d1f36 * ci: update build version to 01.08.01.51 Change-Id: Ib20f5a12b65472102befec0a2adf82744fc29c46 * FIX: imgui textinput cannot paste on macos jira: STUDIO-5070、STUDIO-5365 Change-Id: Iea8f41e12744ecda0fbb95c1a8f2e014a7cdc384 * FIX: not cache printer file list on error Change-Id: I99843aedbf14d3d1d553ccac9b0bd26403274a82 Jira: none * FIX: thread of close BBLUserPresetExceedLimit notify Change-Id: I9698134ba1cc91fc83eac441f900d68c4c4b556a * ENH: Resolve non manifold edges by fixing model interfaces Jira: STUDIO-5124 Change-Id: I7ea86be44acb80b6c4762a76208b4a031acd0b27 * FIX:nozzle type sync jira:[STUDIO-5248] Change-Id: I63d48628832473d8d371ed643dc8528b00382531 * FIX: array bound happen in TriangleSelector::deserialize Jira: STUDIO-5170 Change-Id: I92b72a887845b462fad208f13607293b44d3d333 * FIX:cropping rendering without considering assembly views Jira: STUDIO-5260 Change-Id: Ia56cf80b305ae05f25f06ec277f85b3c5430a6df * FIX: PA for custom filament not available in BL Studio github: 2971 Change-Id: I6ccd36a183e7367d69557300f7242f5403f4bb33 * FIX: Bitmap is way too small on Mac Jira: STUDIO-5393 Signed-off-by: wenjie.guo <wenjie.guo@bambulab.com> Change-Id: I6b550669fa8cd5fc9bfa6ed96d64d19a949f01b2 * FIX: move shutdown wait to OnExit Change-Id: I70d9a2bb686525ae5273aa9d63e25691da4ab65c Jira: STUDIO-2884 * FIX: calibration manage result dialog issue on macos jira: STUDIO-4949 STUDIO-5378 Change-Id: I00abefd45a0d274a4b68bb1ab18debe8f91d169e * FIX: adjust bed shape dialog button UI style fix that button text is hard to see in dark mode jira: STUDIO-5247 Change-Id: I2cf5b3cdd2eff9b821bdf5525bec4f329fc58dd1 * FIX: 5331 rescale btn Jira: STUDIO-5331 Change-Id: If153424b8480e64b166018e3cd98c17db557d0a8 Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> * FIX: support do not generate jira:[NEW] Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: Ide9709d95203185538e280517f7aa6136beeda44 * FIX: remove not match printer config ota cache Change-Id: Ib73fc2ea31fa2186061cfcb5a170bc59b9db84ca Jira: none * FIX:cancel the variable of "checkbox_size" as a fixed value Jira: STUDIO-5150 Change-Id: I30d876d141b8b35ab4a3fee4889993d87b7c1741 * ENH:add reset_cut_by_contours in on_load function Jira:STUDIO-5269 m_connector_size_tolerance default value is 0.1f Change-Id: I6c67fff3cb0c1190e9141ed6f68fbfa848679f35 * ENH:cancel EnterReturnsTrue for imgui in cut Jira: STUDIO-5269 Change-Id: Ifc4b183a4e4c4fdb4f47742f14f70a1ed93fa056 Signed-off-by: zhou.xu <zhou.xu@bambulab.com> * FIX: dailytips should not change content frequently when slicing all jira: STUDIO-5234 Change-Id: Icb7e9c28404d9db8ebed58d937e13f89c5403b5c * FIX: objectList clone shortcut key issue jira: new Change-Id: Ia75bf58a7d53f962e1af6c2fd97497270b7eea84 * ENH:handling cases without msgs jira:[STUDIO-5401 STUDIO-5399] Change-Id: Iae651d5a19a45b0138a6aa621326a8b4a9649824 * ENH: optimize param description jira:[NEW] Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: Id0ca9224227a716b21fc0b8430722264dc319344 * ENH: add translation jira:[NEW] Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I3b1f04fee3cd6322793794ad8b8707859f6c7d26 * FIX: close edit preset paramsDialog, mac unresponsive Jira: 5298 Change-Id: I021e00567354cfb1f2f5f1f2bf6ba1fc35b164c5 * ENH:disable AI monitoring on the p1p series Change-Id: I514bb1fb1ced6c03dd619230a9adac3be63f2de2 * ci: update build version to 01.08.01.52 Change-Id: I9f5e30d3fc4b7ef9321c522d3c18fce98f03742f * FIX: close edit preset paramsDialog, mac unresponsive Change-Id: Ic816754a20b7f6a5cdb46475750eb301fec3ad3a * FIX: organic support not work with raft only There is no raft generated when only raft enabled but no support needed. jira: none Change-Id: Ic0c9269e2f98038d85c9bc54e4a85f892dc5d764 * FIX: CLI: add object config when assemble JIRA: no jira Change-Id: I945f820fb58f2f643170b4b0b66742f6bbbdfd29 * FIX: delete preset prompt Jira: XXXX Change-Id: I6511c806c56393d4f6bd72d1c506da59675d49ff * FIX:Reorganize the assignment of variables of "m_editing_window_width" Jira: STUDIO-5238 Change-Id: If369916f3f5c21510f5f297bfd05c1230bdda7a4 * ENH: CLI: re-compute flush_volumes_matrix when it is missed Change-Id: Ie8f53c6bef003b1434de02ea14de5787b376484f * FIX: some translation for delete filament Change-Id: Ib46a8eba33f2e21016476aaab4a57a740e86b1b8 * FIX: scrolled window / del preset / edit filament issue Jira: 5092 GitHub: 1936 edit filament: just one preset, the scroll bar obscures the preset name edit filament: delete selected preset, click no, but preset be deleted from UI edit filament: serial sometimes displays incorrectly Change-Id: Ibc91609e252179de0c05ca065099756da6631165 * ci: update build version to 01.08.01.53 Change-Id: I5563a2c0812ab9a0d7727df27e17e681066ffa08 --------- Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com> Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Signed-off-by: Kunlong Ma <kunlong.ma@bambulab.com> Signed-off-by: wenjie.guo <wenjie.guo@bambulab.com> Signed-off-by: qing.zhang <qing.zhang@bambulab.com> Signed-off-by: Stone Li <stone.li@bambulab.com> Signed-off-by: zhou.xu <zhou.xu@bambulab.com> Co-authored-by: zorro.zhang <zorro.zhang@bambulab.com> Co-authored-by: liz.li <liz.li@bambulab.com> Co-authored-by: maosheng.wei <maosheng.wei@bambulab.com> Co-authored-by: chunmao.guo <chunmao.guo@bambulab.com> Co-authored-by: tao wang <tao.wang@bambulab.com> Co-authored-by: Arthur <arthur.tang@bambulab.com> Co-authored-by: lane.wei <lane.wei@bambulab.com> Co-authored-by: gerrit <gerrit@bambulab.com> Co-authored-by: xun.zhang <xun.zhang@bambulab.com> Co-authored-by: zhou.xu <zhou.xu@bambulab.com> Co-authored-by: hu.wang <hu.wang@bambulab.com> Co-authored-by: Kunlong Ma <kunlong.ma@bambulab.com> Co-authored-by: wenjie.guo <wenjie.guo@bambulab.com> Co-authored-by: qing.zhang <qing.zhang@bambulab.com> Co-authored-by: zhimin.zeng <zhimin.zeng@bambulab.com> Co-authored-by: the Raz <rasmus@abc.se> Co-authored-by: Andy <andylg@yandex.ru> Co-authored-by: Stone Li <stone.li@bambulab.com> Co-authored-by: enricoturri1966 <enricoturri@seznam.cz> Co-authored-by: Dmytro Chystiakov <dlchistyakov@gmail.com> Co-authored-by: Heiko Liebscher <hliebscher@idn.de>
1009 lines
54 KiB
C++
1009 lines
54 KiB
C++
#ifndef slic3r_Preset_hpp_
|
|
#define slic3r_Preset_hpp_
|
|
|
|
#include <deque>
|
|
#include <set>
|
|
#include <unordered_map>
|
|
#include <functional>
|
|
#include <boost/filesystem/path.hpp>
|
|
#include <boost/property_tree/ptree_fwd.hpp>
|
|
|
|
#include "PrintConfig.hpp"
|
|
#include "Semver.hpp"
|
|
#include "ProjectTask.hpp"
|
|
|
|
//BBS: change system directories
|
|
#define PRESET_SYSTEM_DIR "system"
|
|
#define PRESET_USER_DIR "user"
|
|
#define PRESET_FILAMENT_NAME "filament"
|
|
#define PRESET_PRINT_NAME "process"
|
|
#define PRESET_PRINTER_NAME "machine"
|
|
#define PRESET_SLA_PRINT_NAME "sla_print"
|
|
#define PRESET_SLA_MATERIALS_NAME "sla_materials"
|
|
#define PRESET_PROFILES_DIR "profiles"
|
|
#define PRESET_PROFILES_TEMOLATE_DIR "profiles_template"
|
|
#define PRESET_TEMPLATE_DIR "Template"
|
|
#define PRESET_CUSTOM_VENDOR "Custom"
|
|
|
|
//BBS: iot preset type strings
|
|
#define PRESET_IOT_PRINTER_TYPE "printer"
|
|
#define PRESET_IOT_FILAMENT_TYPE "filament"
|
|
#define PRESET_IOT_PRINT_TYPE "print"
|
|
|
|
|
|
//BBS: add json support
|
|
#define BBL_JSON_KEY_VERSION "version"
|
|
#define BBL_JSON_KEY_IS_CUSTOM "is_custom_defined"
|
|
#define BBL_JSON_KEY_URL "url"
|
|
#define BBL_JSON_KEY_NAME "name"
|
|
#define BBL_JSON_KEY_DESCRIPTION "description"
|
|
#define BBL_JSON_KEY_FORCE_UPDATE "force_update"
|
|
#define BBL_JSON_KEY_MACHINE_MODEL_LIST "machine_model_list"
|
|
#define BBL_JSON_KEY_PROCESS_LIST "process_list"
|
|
#define BBL_JSON_KEY_SUB_PATH "sub_path"
|
|
#define BBL_JSON_KEY_FILAMENT_LIST "filament_list"
|
|
#define BBL_JSON_KEY_MACHINE_LIST "machine_list"
|
|
#define BBL_JSON_KEY_TYPE "type"
|
|
#define BBL_JSON_KEY_FROM "from"
|
|
#define BBL_JSON_KEY_SETTING_ID "setting_id"
|
|
#define BBL_JSON_KEY_BASE_ID "base_id"
|
|
#define BBL_JSON_KEY_USER_ID "user_id"
|
|
#define BBL_JSON_KEY_FILAMENT_ID "filament_id"
|
|
#define BBL_JSON_KEY_UPDATE_TIME "updated_time"
|
|
#define BBL_JSON_KEY_INHERITS "inherits"
|
|
#define BBL_JSON_KEY_INSTANTIATION "instantiation"
|
|
#define BBL_JSON_KEY_NOZZLE_DIAMETER "nozzle_diameter"
|
|
#define BBL_JSON_KEY_PRINTER_TECH "machine_tech"
|
|
#define BBL_JSON_KEY_FAMILY "family"
|
|
#define BBL_JSON_KEY_BED_MODEL "bed_model"
|
|
#define BBL_JSON_KEY_BED_TEXTURE "bed_texture"
|
|
#define BBL_JSON_KEY_HOTEND_MODEL "hotend_model"
|
|
#define BBL_JSON_KEY_DEFAULT_MATERIALS "default_materials"
|
|
#define BBL_JSON_KEY_MODEL_ID "model_id"
|
|
|
|
//BBL: json path
|
|
|
|
|
|
namespace Slic3r {
|
|
|
|
class AppConfig;
|
|
class PresetBundle;
|
|
|
|
enum ConfigFileType
|
|
{
|
|
CONFIG_FILE_TYPE_UNKNOWN,
|
|
CONFIG_FILE_TYPE_APP_CONFIG,
|
|
CONFIG_FILE_TYPE_CONFIG,
|
|
CONFIG_FILE_TYPE_CONFIG_BUNDLE,
|
|
};
|
|
|
|
//BBS: add a function to load the version from xxx.json
|
|
extern Semver get_version_from_json(std::string file_path);
|
|
//BBS: add a function to load the key-values from xxx.json
|
|
extern int get_values_from_json(std::string file_path, std::vector<std::string>& keys, std::map<std::string, std::string>& key_values);
|
|
|
|
extern ConfigFileType guess_config_file_type(const boost::property_tree::ptree &tree);
|
|
|
|
class VendorProfile
|
|
{
|
|
public:
|
|
std::string name;
|
|
std::string id;
|
|
Semver config_version;
|
|
std::string config_update_url;
|
|
std::string changelog_url;
|
|
|
|
struct PrinterVariant {
|
|
PrinterVariant() {}
|
|
PrinterVariant(const std::string &name) : name(name) {}
|
|
std::string name;
|
|
};
|
|
|
|
struct PrinterModel {
|
|
PrinterModel() {}
|
|
std::string id;
|
|
std::string name;
|
|
//BBS: this is internal id for the printer. Currently only used for searching in database
|
|
std::string model_id;
|
|
PrinterTechnology technology;
|
|
std::string family;
|
|
std::vector<PrinterVariant> variants;
|
|
std::vector<std::string> default_materials;
|
|
// Vendor & Printer Model specific print bed model & texture.
|
|
std::string bed_model;
|
|
std::string bed_texture;
|
|
std::string hotend_model;
|
|
|
|
PrinterVariant* variant(const std::string &name) {
|
|
for (auto &v : this->variants)
|
|
if (v.name == name)
|
|
return &v;
|
|
return nullptr;
|
|
}
|
|
|
|
const PrinterVariant* variant(const std::string &name) const { return const_cast<PrinterModel*>(this)->variant(name); }
|
|
};
|
|
std::vector<PrinterModel> models;
|
|
|
|
std::set<std::string> default_filaments;
|
|
std::set<std::string> default_sla_materials;
|
|
|
|
VendorProfile() {}
|
|
VendorProfile(std::string id) : id(std::move(id)) {}
|
|
|
|
bool valid() const { return ! name.empty() && ! id.empty() && config_version.valid(); }
|
|
|
|
// Load VendorProfile from an ini file.
|
|
// If `load_all` is false, only the header with basic info (name, version, URLs) is loaded.
|
|
static VendorProfile from_ini(const boost::filesystem::path &path, bool load_all=true);
|
|
static VendorProfile from_ini(const boost::property_tree::ptree &tree, const boost::filesystem::path &path, bool load_all=true);
|
|
|
|
size_t num_variants() const { size_t n = 0; for (auto &model : models) n += model.variants.size(); return n; }
|
|
std::vector<std::string> families() const;
|
|
|
|
bool operator< (const VendorProfile &rhs) const { return this->id < rhs.id; }
|
|
bool operator==(const VendorProfile &rhs) const { return this->id == rhs.id; }
|
|
};
|
|
|
|
class Preset;
|
|
|
|
// Helper to hold a profile with its vendor definition, where the vendor definition may have been extracted from a parent system preset.
|
|
// The parent preset is only accessible through PresetCollection, therefore to allow definition of the various is_compatible_with methods
|
|
// outside of the PresetCollection, this composite is returned by PresetCollection::get_preset_with_vendor_profile() when needed.
|
|
struct PresetWithVendorProfile {
|
|
PresetWithVendorProfile(const Preset &preset, const VendorProfile *vendor) : preset(preset), vendor(vendor) {}
|
|
const Preset &preset;
|
|
const VendorProfile *vendor;
|
|
};
|
|
|
|
// Note: it is imporant that map is used here rather than unordered_map,
|
|
// because we need iterators to not be invalidated,
|
|
// because Preset and the ConfigWizard hold pointers to VendorProfiles.
|
|
// XXX: maybe set is enough (cf. changes in Wizard)
|
|
typedef std::map<std::string, VendorProfile> VendorMap;
|
|
|
|
class Preset
|
|
{
|
|
public:
|
|
enum Type
|
|
{
|
|
TYPE_INVALID,
|
|
TYPE_PRINT,
|
|
TYPE_SLA_PRINT,
|
|
TYPE_FILAMENT,
|
|
TYPE_SLA_MATERIAL,
|
|
TYPE_PRINTER,
|
|
TYPE_COUNT,
|
|
// This type is here to support PresetConfigSubstitutions for physical printers, however it does not belong to the Preset class,
|
|
// PhysicalPrinter class is used instead.
|
|
TYPE_PHYSICAL_PRINTER,
|
|
// BBS: plate config
|
|
TYPE_PLATE,
|
|
// BBS: model config
|
|
TYPE_MODEL,
|
|
};
|
|
|
|
Type type = TYPE_INVALID;
|
|
|
|
// The preset represents a "default" set of properties,
|
|
// pulled from the default values of the PrintConfig (see PrintConfigDef for their definitions).
|
|
bool is_default = false;
|
|
// External preset points to a configuration, which has been loaded but not imported
|
|
// into the Slic3r default configuration location.
|
|
bool is_external = false;
|
|
// System preset is read-only.
|
|
bool is_system = false;
|
|
// Preset is visible, if it is associated with a printer model / variant that is enabled in the AppConfig
|
|
// or if it has no printer model / variant association.
|
|
// Also the "default" preset is only visible, if it is the only preset in the list.
|
|
bool is_visible = true;
|
|
// Has this preset been modified?
|
|
bool is_dirty = false;
|
|
// Is this preset compatible with the currently active printer?
|
|
bool is_compatible = true;
|
|
|
|
//BBS: add type for project-embedded
|
|
bool is_project_embedded = false;
|
|
ConfigSubstitutions *loading_substitutions{nullptr};
|
|
bool is_user() const { return ! this->is_default && ! this->is_system && ! this->is_project_embedded; }
|
|
//bool is_user() const { return ! this->is_default && ! this->is_system; }
|
|
|
|
// Name of the preset, usually derived form the file name.
|
|
std::string name;
|
|
// File name of the preset. This could be a Print / Filament / Printer preset,
|
|
// or a Configuration file bundling the Print + Filament + Printer presets (in that case is_external and possibly is_system will be true),
|
|
// or it could be a G-code (again, is_external will be true).
|
|
std::string file;
|
|
// If this is a system profile, then there should be a vendor data available to display at the UI.
|
|
const VendorProfile *vendor = nullptr;
|
|
|
|
// Has this profile been loaded?
|
|
bool loaded = false;
|
|
|
|
// Configuration data, loaded from a file, or set from the defaults.
|
|
DynamicPrintConfig config;
|
|
|
|
// Alias of the preset
|
|
std::string alias;
|
|
// List of profile names, from which this profile was renamed at some point of time.
|
|
// This list is then used to match profiles by their names when loaded from .gcode, .3mf, .amf,
|
|
// and to match the "inherits" field of user profiles with updated system profiles.
|
|
std::vector<std::string> renamed_from;
|
|
|
|
//BBS
|
|
Semver version; // version of preset
|
|
std::string ini_str; // ini string of preset
|
|
std::string setting_id; // setting id in cloud database
|
|
std::string filament_id; // setting id in cloud database
|
|
std::string user_id; // preset user_id
|
|
std::string base_id; // base id of preset
|
|
std::string sync_info; // enum: "delete", "create", "update", ""
|
|
std::string custom_defined; // enum: "1", "0", ""
|
|
long long updated_time{0}; //last updated time
|
|
std::map<std::string, std::string> key_values;
|
|
|
|
static std::string get_type_string(Preset::Type type);
|
|
// get string type for iot
|
|
static std::string get_iot_type_string(Preset::Type type);
|
|
static Preset::Type get_type_from_string(std::string type_str);
|
|
void load_info(const std::string& file);
|
|
void save_info(std::string file = "");
|
|
void remove_files();
|
|
|
|
//BBS: add logic for only difference save
|
|
//if parent_config is null, save all keys, otherwise, only save difference
|
|
void save(DynamicPrintConfig* parent_config);
|
|
void reload(Preset const & parent);
|
|
|
|
// Return a label of this preset, consisting of a name and a "(modified)" suffix, if this preset is dirty.
|
|
std::string label(bool no_alias) const;
|
|
|
|
// Set the is_dirty flag if the provided config is different from the active one.
|
|
void set_dirty(const DynamicPrintConfig &config) { this->is_dirty = ! this->config.diff(config).empty(); }
|
|
void set_dirty(bool dirty = true) { this->is_dirty = dirty; }
|
|
void reset_dirty() { this->is_dirty = false; }
|
|
|
|
// Returns the name of the preset, from which this preset inherits.
|
|
static std::string& inherits(DynamicPrintConfig &cfg) { return cfg.option<ConfigOptionString>("inherits", true)->value; }
|
|
std::string& inherits() { return Preset::inherits(this->config); }
|
|
const std::string& inherits() const { return Preset::inherits(const_cast<Preset*>(this)->config); }
|
|
|
|
// Returns the "compatible_prints_condition".
|
|
static std::string& compatible_prints_condition(DynamicPrintConfig &cfg) { return cfg.option<ConfigOptionString>("compatible_prints_condition", true)->value; }
|
|
std::string& compatible_prints_condition() {
|
|
assert(this->type == TYPE_FILAMENT || this->type == TYPE_SLA_MATERIAL);
|
|
return Preset::compatible_prints_condition(this->config);
|
|
}
|
|
const std::string& compatible_prints_condition() const { return const_cast<Preset*>(this)->compatible_prints_condition(); }
|
|
|
|
// Returns the "compatible_printers_condition".
|
|
static std::string& compatible_printers_condition(DynamicPrintConfig &cfg) { return cfg.option<ConfigOptionString>("compatible_printers_condition", true)->value; }
|
|
std::string& compatible_printers_condition() {
|
|
assert(this->type == TYPE_PRINT || this->type == TYPE_SLA_PRINT || this->type == TYPE_FILAMENT || this->type == TYPE_SLA_MATERIAL);
|
|
return Preset::compatible_printers_condition(this->config);
|
|
}
|
|
const std::string& compatible_printers_condition() const { return const_cast<Preset*>(this)->compatible_printers_condition(); }
|
|
|
|
// Return a printer technology, return ptFFF if the printer technology is not set.
|
|
static PrinterTechnology printer_technology(const DynamicPrintConfig &cfg) {
|
|
auto *opt = cfg.option<ConfigOptionEnum<PrinterTechnology>>("printer_technology");
|
|
// The following assert may trigger when importing some legacy profile,
|
|
// but it is safer to keep it here to capture the cases where the "printer_technology" key is queried, where it should not.
|
|
// assert(opt != nullptr);
|
|
return (opt == nullptr) ? ptFFF : opt->value;
|
|
}
|
|
PrinterTechnology printer_technology() const { return Preset::printer_technology(this->config); }
|
|
// This call returns a reference, it may add a new entry into the DynamicPrintConfig.
|
|
PrinterTechnology& printer_technology_ref() { return this->config.option<ConfigOptionEnum<PrinterTechnology>>("printer_technology", true)->value; }
|
|
|
|
// Set is_visible according to application config
|
|
void set_visible_from_appconfig(const AppConfig &app_config);
|
|
|
|
// Resize the extruder specific fields, initialize them with the content of the 1st extruder.
|
|
void set_num_extruders(unsigned int n) { this->config.set_num_extruders(n); }
|
|
|
|
// Sort lexicographically by a preset name. The preset name shall be unique across a single PresetCollection.
|
|
bool operator<(const Preset &other) const { return this->name < other.name; }
|
|
|
|
// special for upport G and Support W
|
|
std::string get_filament_type(std::string &display_filament_type);
|
|
std::string get_printer_type(PresetBundle *preset_bundle); // get edited preset type
|
|
std::string get_current_printer_type(PresetBundle *preset_bundle); // get current preset type
|
|
|
|
bool has_lidar(PresetBundle *preset_bundle);
|
|
bool is_custom_defined();
|
|
|
|
BedType get_default_bed_type(PresetBundle *preset_bundle);
|
|
bool has_cali_lines(PresetBundle* preset_bundle);
|
|
|
|
|
|
|
|
static const std::vector<std::string>& print_options();
|
|
static const std::vector<std::string>& filament_options();
|
|
// Printer options contain the nozzle options.
|
|
static const std::vector<std::string>& printer_options();
|
|
// Nozzle options of the printer options.
|
|
static const std::vector<std::string>& nozzle_options();
|
|
// Printer machine limits, those are contained in printer_options().
|
|
static const std::vector<std::string>& machine_limits_options();
|
|
|
|
static const std::vector<std::string>& sla_printer_options();
|
|
static const std::vector<std::string>& sla_material_options();
|
|
static const std::vector<std::string>& sla_print_options();
|
|
|
|
static void update_suffix_modified(const std::string& new_suffix_modified);
|
|
static const std::string& suffix_modified();
|
|
static std::string remove_suffix_modified(const std::string& name);
|
|
static void normalize(DynamicPrintConfig &config);
|
|
// Report configuration fields, which are misplaced into a wrong group, remove them from the config.
|
|
static std::string remove_invalid_keys(DynamicPrintConfig &config, const DynamicPrintConfig &default_config);
|
|
|
|
// BBS: move constructor to public
|
|
Preset(Type type, const std::string &name, bool is_default = false) : type(type), is_default(is_default), name(name) {}
|
|
|
|
protected:
|
|
Preset() = default;
|
|
|
|
friend class PresetCollection;
|
|
friend class PresetBundle;
|
|
};
|
|
|
|
bool is_compatible_with_print (const PresetWithVendorProfile &preset, const PresetWithVendorProfile &active_print, const PresetWithVendorProfile &active_printer);
|
|
bool is_compatible_with_printer(const PresetWithVendorProfile &preset, const PresetWithVendorProfile &active_printer, const DynamicPrintConfig *extra_config);
|
|
bool is_compatible_with_printer(const PresetWithVendorProfile &preset, const PresetWithVendorProfile &active_printer);
|
|
|
|
enum class PresetSelectCompatibleType {
|
|
// Never select a compatible preset if the newly selected profile is not compatible.
|
|
Never,
|
|
// Only select a compatible preset if the active profile used to be compatible, but it is no more.
|
|
OnlyIfWasCompatible,
|
|
// Always select a compatible preset if the active profile is no more compatible.
|
|
Always
|
|
};
|
|
|
|
// Substitutions having been performed during parsing a single configuration file.
|
|
struct PresetConfigSubstitutions {
|
|
// User readable preset name.
|
|
std::string preset_name;
|
|
// Type of the preset (Print / Filament / Printer ...)
|
|
Preset::Type preset_type;
|
|
enum class Source {
|
|
UserFile,
|
|
ConfigBundle,
|
|
//BBS: add cloud and project type
|
|
UserCloud,
|
|
ProjectFile,
|
|
};
|
|
Source preset_source;
|
|
// Source of the preset. It may be empty in case of a ConfigBundle being loaded.
|
|
std::string preset_file;
|
|
// What config value has been substituted with what.
|
|
ConfigSubstitutions substitutions;
|
|
};
|
|
|
|
// Substitutions having been performed during parsing a set of configuration files, for example when starting up
|
|
// PrusaSlicer and reading the user Print / Filament / Printer profiles.
|
|
using PresetsConfigSubstitutions = std::vector<PresetConfigSubstitutions>;
|
|
|
|
// Collections of presets of the same type (one of the Print, Filament or Printer type).
|
|
class PresetCollection
|
|
{
|
|
public:
|
|
// Initialize the PresetCollection with the "- default -" preset.
|
|
PresetCollection(Preset::Type type, const std::vector<std::string> &keys, const Slic3r::StaticPrintConfig &defaults, const std::string &default_name = "Default Setting");
|
|
|
|
typedef std::deque<Preset>::iterator Iterator;
|
|
typedef std::deque<Preset>::const_iterator ConstIterator;
|
|
typedef std::function<void(Preset* preset, std::string sync_info)> SyncFunc;
|
|
//BBS get m_presets begin
|
|
Iterator lbegin() { return m_presets.begin(); }
|
|
//BBS: validate_preset
|
|
bool validate_preset(const std::string &name, std::string &inherit);
|
|
|
|
Iterator begin() { return m_presets.begin() + m_num_default_presets; }
|
|
ConstIterator begin() const { return m_presets.cbegin() + m_num_default_presets; }
|
|
ConstIterator cbegin() const { return m_presets.cbegin() + m_num_default_presets; }
|
|
Iterator end() { return m_presets.end(); }
|
|
ConstIterator end() const { return m_presets.cend(); }
|
|
ConstIterator cend() const { return m_presets.cend(); }
|
|
|
|
//BBS
|
|
Iterator erase(Iterator it) { return m_presets.erase(it); }
|
|
SyncFunc sync_func{ nullptr };
|
|
void set_sync_func(SyncFunc func) { sync_func = func; }
|
|
//BBS: mutex
|
|
void lock() { m_mutex.lock(); }
|
|
void unlock() { m_mutex.unlock(); }
|
|
|
|
void reset(bool delete_files);
|
|
|
|
Preset::Type type() const { return m_type; }
|
|
// Name, to be used on the screen and in error messages. Not localized.
|
|
std::string name() const;
|
|
// Name, to be used as a section name in config bundle, and as a folder name for presets.
|
|
std::string section_name() const;
|
|
const std::deque<Preset>& operator()() const { return m_presets; }
|
|
|
|
// Add default preset at the start of the collection, increment the m_default_preset counter.
|
|
void add_default_preset(const std::vector<std::string> &keys, const Slic3r::StaticPrintConfig &defaults, const std::string &preset_name);
|
|
|
|
// Load ini files of the particular type from the provided directory path.
|
|
void load_presets(const std::string &dir_path, const std::string &subdir, PresetsConfigSubstitutions& substitutions, ForwardCompatibilitySubstitutionRule rule);
|
|
|
|
//BBS: update user presets directory
|
|
void update_user_presets_directory(const std::string& dir_path, const std::string& type);
|
|
void save_user_presets(const std::string& dir_path, const std::string& type, std::vector<std::string>& need_to_delete_list);
|
|
bool load_user_preset(std::string name, std::map<std::string, std::string> preset_values, PresetsConfigSubstitutions& substitutions, ForwardCompatibilitySubstitutionRule rule);
|
|
void update_after_user_presets_loaded();
|
|
//BBS: get user presets
|
|
int get_user_presets(PresetBundle *preset_bundle, std::vector<Preset> &result_presets);
|
|
void set_sync_info_and_save(std::string name, std::string setting_id, std::string syncinfo, long long update_time);
|
|
bool need_sync(std::string name, std::string setting_id, long long update_time);
|
|
|
|
//BBS: add function to generate differed preset for save
|
|
//the pointer should be freed by the caller
|
|
Preset* get_preset_differed_for_save(Preset& preset);
|
|
//BBS:get the differencen values to update
|
|
int get_differed_values_to_update(Preset& preset, std::map<std::string, std::string>& key_values);
|
|
|
|
//BBS: add project embedded presets logic
|
|
void load_project_embedded_presets(std::vector<Preset*>& project_presets, const std::string& type, PresetsConfigSubstitutions& substitutions, ForwardCompatibilitySubstitutionRule rule);
|
|
std::vector<Preset*> get_project_embedded_presets();
|
|
bool reset_project_embedded_presets();
|
|
|
|
// Load a preset from an already parsed config file, insert it into the sorted sequence of presets
|
|
// and select it, losing previous modifications.
|
|
Preset& load_preset(const std::string &path, const std::string &name, const DynamicPrintConfig &config, bool select = true, Semver file_version = Semver(), bool is_custom_defined = false);
|
|
Preset& load_preset(const std::string &path, const std::string &name, DynamicPrintConfig &&config, bool select = true, Semver file_version = Semver(), bool is_custom_defined = false);
|
|
|
|
bool clone_presets(std::vector<Preset const *> const &presets, std::vector<std::string> &failures, std::function<void(Preset &, Preset::Type &)> modifier, bool force_rewritten = false);
|
|
bool clone_presets_for_printer(std::vector<Preset const *> const &presets, std::vector<std::string> &failures, std::string const &printer, bool force_rewritten = false);
|
|
bool create_presets_from_template_for_printer(
|
|
std::vector<Preset const *> const &templates, std::vector<std::string> &failures, std::string const &printer, std::function <std::string(std::string)> create_filament_id, bool force_rewritten = false);
|
|
bool clone_presets_for_filament(Preset const *const & preset,
|
|
std::vector<std::string> &failures,
|
|
std::string const & filament_name,
|
|
std::string const & filament_id,
|
|
const DynamicConfig & dynamic_config,
|
|
const std::string & compatible_printers,
|
|
bool force_rewritten = false);
|
|
|
|
std::map<std::string, std::vector<Preset const *>> get_filament_presets() const;
|
|
|
|
// Returns a loaded preset, returns true if an existing preset was selected AND modified from config.
|
|
// In that case the successive filament loaded for a multi material printer should not be modified, but
|
|
// an external preset should be created instead.
|
|
enum class LoadAndSelect {
|
|
// Never select
|
|
Never,
|
|
// Always select
|
|
Always,
|
|
// Select a profile only if it was modified.
|
|
OnlyIfModified,
|
|
};
|
|
std::pair<Preset*, bool> load_external_preset(
|
|
// Path to the profile source file (a G-code, an AMF or 3MF file, a config file)
|
|
const std::string &path,
|
|
// Name of the profile, derived from the source file name.
|
|
const std::string &name,
|
|
// Original name of the profile, extracted from the loaded config. Empty, if the name has not been stored.
|
|
const std::string &original_name,
|
|
// Config to initialize the preset from.
|
|
const DynamicPrintConfig &config,
|
|
//different settings list
|
|
const std::set<std::string> &different_settings_list,
|
|
// Select the preset after loading?
|
|
LoadAndSelect select = LoadAndSelect::Always,
|
|
const Semver file_version = Semver(),
|
|
const std::string filament_id = std::string());
|
|
|
|
// Save the preset under a new name. If the name is different from the old one,
|
|
// a new preset is stored into the list of presets.
|
|
// All presets are marked as not modified and the new preset is activated.
|
|
//BBS: add project embedded preset logic
|
|
void save_current_preset(const std::string &new_name, bool detach = false, bool save_to_project = false, Preset* _curr_preset = nullptr);
|
|
|
|
// Delete the current preset, activate the first visible preset.
|
|
// returns true if the preset was deleted successfully.
|
|
bool delete_current_preset();
|
|
// Delete the current preset, activate the first visible preset.
|
|
// returns true if the preset was deleted successfully.
|
|
bool delete_preset(const std::string& name);
|
|
|
|
// Enable / disable the "- default -" preset.
|
|
void set_default_suppressed(bool default_suppressed);
|
|
bool is_default_suppressed() const { return m_default_suppressed; }
|
|
|
|
// Select a preset. If an invalid index is provided, the first visible preset is selected.
|
|
Preset& select_preset(size_t idx);
|
|
// Return the selected preset, without the user modifications applied.
|
|
Preset& get_selected_preset() {
|
|
//BBS fix crash when m_idx_selected == -1, give a default value
|
|
if ((m_idx_selected < 0) || (m_idx_selected >= m_presets.size())) {
|
|
select_preset(first_visible_idx());
|
|
}
|
|
return m_presets[m_idx_selected];
|
|
}
|
|
const Preset& get_selected_preset() const { return m_presets[m_idx_selected]; }
|
|
size_t get_selected_idx() const { return m_idx_selected; }
|
|
// Returns the name of the selected preset, or an empty string if no preset is selected.
|
|
std::string get_selected_preset_name() const {
|
|
if (m_idx_selected == size_t(-1) || m_idx_selected >= m_presets.size())
|
|
return std::string();
|
|
return this->get_selected_preset().name;
|
|
}
|
|
// For the current edited preset, return the parent preset if there is one.
|
|
// If there is no parent preset, nullptr is returned.
|
|
// The parent preset may be a system preset or a user preset, which will be
|
|
// reflected by the UI.
|
|
const Preset* get_selected_preset_parent() const;
|
|
// Get parent preset for a child preset, based on the "inherits" field of a child,
|
|
// where the "inherits" profile name is searched for in both m_presets and m_map_system_profile_renamed.
|
|
const Preset* get_preset_parent(const Preset& child) const;
|
|
const Preset* get_preset_base(const Preset& child) const;
|
|
// Return the selected preset including the user modifications.
|
|
Preset& get_edited_preset() { return m_edited_preset; }
|
|
const Preset& get_edited_preset() const { return m_edited_preset; }
|
|
|
|
// Return the last saved preset.
|
|
// const Preset& get_saved_preset() const { return m_saved_preset; }
|
|
|
|
// Return vendor of the first parent profile, for which the vendor is defined, or null if such profile does not exist.
|
|
PresetWithVendorProfile get_preset_with_vendor_profile(const Preset &preset) const;
|
|
PresetWithVendorProfile get_edited_preset_with_vendor_profile() const { return this->get_preset_with_vendor_profile(this->get_edited_preset()); }
|
|
|
|
const std::string& get_preset_name_by_alias(const std::string& alias) const;
|
|
const std::string* get_preset_name_renamed(const std::string &old_name) const;
|
|
|
|
// used to update preset_choice from Tab
|
|
const std::deque<Preset>& get_presets() const { return m_presets; }
|
|
size_t get_idx_selected() { return m_idx_selected; }
|
|
static const std::string& get_suffix_modified();
|
|
|
|
// Return a preset possibly with modifications.
|
|
Preset& default_preset(size_t idx = 0) { assert(idx < m_num_default_presets); return m_presets[idx]; }
|
|
const Preset& default_preset(size_t idx = 0) const { assert(idx < m_num_default_presets); return m_presets[idx]; }
|
|
virtual const Preset& default_preset_for(const DynamicPrintConfig & /* config */) const { return this->default_preset(); }
|
|
// Return a preset by an index. If the preset is active, a temporary copy is returned.
|
|
Preset& preset(size_t idx, bool real = false) {
|
|
if (real) return m_presets[idx];
|
|
return (idx == m_idx_selected) ? m_edited_preset : m_presets[idx];
|
|
}
|
|
const Preset& preset(size_t idx) const { return const_cast<PresetCollection*>(this)->preset(idx); }
|
|
void discard_current_changes() {
|
|
m_presets[m_idx_selected].reset_dirty();
|
|
m_edited_preset = m_presets[m_idx_selected];
|
|
// update_saved_preset_from_current_preset();
|
|
}
|
|
|
|
// Return a preset by its name. If the preset is active, a temporary copy is returned.
|
|
// If a preset is not found by its name, null is returned.
|
|
// BBS return real pointer if set real = true
|
|
Preset* find_preset(const std::string &name, bool first_visible_if_not_found = false, bool real = false);
|
|
const Preset* find_preset(const std::string &name, bool first_visible_if_not_found = false) const
|
|
{ return const_cast<PresetCollection*>(this)->find_preset(name, first_visible_if_not_found); }
|
|
|
|
size_t first_visible_idx() const;
|
|
// Return index of the first compatible preset. Certainly at least the '- default -' preset shall be compatible.
|
|
// If one of the prefered_alternates is compatible, select it.
|
|
template<typename PreferedCondition>
|
|
size_t first_compatible_idx(PreferedCondition prefered_condition) const
|
|
{
|
|
size_t i = m_default_suppressed ? m_num_default_presets : 0;
|
|
size_t n = this->m_presets.size();
|
|
size_t i_compatible = n;
|
|
int match_quality = -1;
|
|
for (; i < n; ++ i)
|
|
// Since we use the filament selection from Wizard, it's needed to control the preset visibility too
|
|
if (m_presets[i].is_compatible && m_presets[i].is_visible) {
|
|
int this_match_quality = prefered_condition(m_presets[i]);
|
|
if (this_match_quality > match_quality) {
|
|
if (match_quality == std::numeric_limits<int>::max())
|
|
// Better match will not be found.
|
|
return i;
|
|
// Store the first compatible profile with highest match quality into i_compatible.
|
|
i_compatible = i;
|
|
match_quality = this_match_quality;
|
|
}
|
|
}
|
|
return (i_compatible == n) ?
|
|
// No compatible preset found, return the default preset.
|
|
0 :
|
|
// Compatible preset found.
|
|
i_compatible;
|
|
}
|
|
// Return index of the first compatible preset. Certainly at least the '- default -' preset shall be compatible.
|
|
size_t first_compatible_idx() const { return this->first_compatible_idx([](const Preset&) -> int { return 0; }); }
|
|
|
|
// Return index of the first visible preset. Certainly at least the '- default -' preset shall be visible.
|
|
// Return the first visible preset. Certainly at least the '- default -' preset shall be visible.
|
|
Preset& first_visible() { return this->preset(this->first_visible_idx()); }
|
|
const Preset& first_visible() const { return this->preset(this->first_visible_idx()); }
|
|
Preset& first_compatible() { return this->preset(this->first_compatible_idx()); }
|
|
template<typename PreferedCondition>
|
|
Preset& first_compatible(PreferedCondition prefered_condition) { return this->preset(this->first_compatible_idx(prefered_condition)); }
|
|
const Preset& first_compatible() const { return this->preset(this->first_compatible_idx()); }
|
|
|
|
// Return number of presets including the "- default -" preset.
|
|
size_t size() const { return m_presets.size(); }
|
|
bool has_defaults_only() const { return m_presets.size() <= m_num_default_presets; }
|
|
|
|
// For Print / Filament presets, disable those, which are not compatible with the printer.
|
|
template<typename PreferedCondition>
|
|
void update_compatible(const PresetWithVendorProfile &active_printer, const PresetWithVendorProfile *active_print, PresetSelectCompatibleType select_other_if_incompatible, PreferedCondition prefered_condition)
|
|
{
|
|
if (this->update_compatible_internal(active_printer, active_print, select_other_if_incompatible) == (size_t)-1)
|
|
// Find some other compatible preset, or the "-- default --" preset.
|
|
this->select_preset(this->first_compatible_idx(prefered_condition));
|
|
}
|
|
void update_compatible(const PresetWithVendorProfile &active_printer, const PresetWithVendorProfile *active_print, PresetSelectCompatibleType select_other_if_incompatible)
|
|
{ this->update_compatible(active_printer, active_print, select_other_if_incompatible, [](const Preset&) -> int { return 0; }); }
|
|
|
|
size_t num_visible() const { return std::count_if(m_presets.begin(), m_presets.end(), [](const Preset &preset){return preset.is_visible;}); }
|
|
|
|
// Compare the content of get_selected_preset() with get_edited_preset() configs, return true if they differ.
|
|
bool current_is_dirty() const
|
|
{ return is_dirty(&this->get_edited_preset(), &this->get_selected_preset()); }
|
|
// Compare the content of get_selected_preset() with get_edited_preset() configs, return the list of keys where they differ.
|
|
std::vector<std::string> current_dirty_options(const bool deep_compare = false) const
|
|
{ return dirty_options(&this->get_edited_preset(), &this->get_selected_preset(), deep_compare); }
|
|
// Compare the content of get_selected_preset() with get_edited_preset() configs, return the list of keys where they differ.
|
|
std::vector<std::string> current_different_from_parent_options(const bool deep_compare = false) const
|
|
{ return dirty_options(&this->get_edited_preset(), this->get_selected_preset_parent(), deep_compare); }
|
|
|
|
// Compare the content of get_saved_preset() with get_edited_preset() configs, return true if they differ.
|
|
bool saved_is_dirty() const
|
|
{ return is_dirty(&this->get_edited_preset(), &m_saved_preset); }
|
|
// Compare the content of get_saved_preset() with get_edited_preset() configs, return the list of keys where they differ.
|
|
// std::vector<std::string> saved_dirty_options() const
|
|
// { return dirty_options(&this->get_edited_preset(), &this->get_saved_preset(), /* deep_compare */ false); }
|
|
// Copy edited preset into saved preset.
|
|
void update_saved_preset_from_current_preset() { m_saved_preset = m_edited_preset; }
|
|
|
|
// Return a sorted list of system preset names.
|
|
// Used for validating the "inherits" flag when importing user's config bundles.
|
|
// Returns names of all system presets including the former names of these presets.
|
|
std::vector<std::string> system_preset_names() const;
|
|
|
|
// Update a dirty flag of the current preset
|
|
// Return true if the dirty flag changed.
|
|
bool update_dirty();
|
|
|
|
// Select a profile by its name. Return true if the selection changed.
|
|
// Without force, the selection is only updated if the index changes.
|
|
// With force, the changes are reverted if the new index is the same as the old index.
|
|
bool select_preset_by_name(const std::string &name, bool force);
|
|
|
|
// Generate a file path from a profile name. Add the ".ini" suffix if it is missing.
|
|
std::string path_from_name(const std::string &new_name, bool detach = false) const;
|
|
std::string path_for_preset(const Preset & preset) const;
|
|
|
|
size_t num_default_presets() { return m_num_default_presets; }
|
|
|
|
protected:
|
|
PresetCollection() = default;
|
|
// Copy constructor and copy operators are not to be used from outside PresetBundle,
|
|
// as the Profile::vendor points to an instance of VendorProfile stored at parent PresetBundle!
|
|
PresetCollection(const PresetCollection &other) = default;
|
|
//BBS: add operator= logic insteadof default
|
|
PresetCollection& operator=(const PresetCollection &other);
|
|
// After copying a collection with the default operators above, call this function
|
|
// to adjust Profile::vendor pointers.
|
|
void update_vendor_ptrs_after_copy(const VendorMap &vendors);
|
|
|
|
// Select a preset, if it exists. If it does not exist, select an invalid (-1) index.
|
|
// This is a temporary state, which shall be fixed immediately by the following step.
|
|
bool select_preset_by_name_strict(const std::string &name);
|
|
|
|
// Merge one vendor's presets with the other vendor's presets, report duplicates.
|
|
std::vector<std::string> merge_presets(PresetCollection &&other, const VendorMap &new_vendors);
|
|
|
|
// Update m_map_alias_to_profile_name from loaded system profiles.
|
|
void update_map_alias_to_profile_name();
|
|
|
|
// Update m_map_system_profile_renamed from loaded system profiles.
|
|
void update_map_system_profile_renamed();
|
|
|
|
private:
|
|
// Find a preset position in the sorted list of presets.
|
|
// The "-- default -- " preset is always the first, so it needs
|
|
// to be handled differently.
|
|
// If a preset does not exist, an iterator is returned indicating where to insert a preset with the same name.
|
|
std::deque<Preset>::iterator find_preset_internal(const std::string &name)
|
|
{
|
|
auto it = Slic3r::lower_bound_by_predicate(m_presets.begin() + m_num_default_presets, m_presets.end(), [&name](const auto& l) { return l.name < name; });
|
|
if (it == m_presets.end() || it->name != name) {
|
|
// Preset has not been not found in the sorted list of non-default presets. Try the defaults.
|
|
for (size_t i = 0; i < m_num_default_presets; ++ i)
|
|
if (m_presets[i].name == name) {
|
|
it = m_presets.begin() + i;
|
|
break;
|
|
}
|
|
}
|
|
return it;
|
|
}
|
|
std::deque<Preset>::const_iterator find_preset_internal(const std::string &name) const
|
|
{ return const_cast<PresetCollection*>(this)->find_preset_internal(name); }
|
|
std::deque<Preset>::iterator find_preset_renamed(const std::string &name) {
|
|
auto it_renamed = m_map_system_profile_renamed.find(name);
|
|
auto it = (it_renamed == m_map_system_profile_renamed.end()) ? m_presets.end() : this->find_preset_internal(it_renamed->second);
|
|
assert((it_renamed == m_map_system_profile_renamed.end()) || (it != m_presets.end() && it->name == it_renamed->second));
|
|
return it;
|
|
}
|
|
std::deque<Preset>::const_iterator find_preset_renamed(const std::string &name) const
|
|
{ return const_cast<PresetCollection*>(this)->find_preset_renamed(name); }
|
|
|
|
size_t update_compatible_internal(const PresetWithVendorProfile &active_printer, const PresetWithVendorProfile *active_print, PresetSelectCompatibleType unselect_if_incompatible);
|
|
public:
|
|
static bool is_dirty(const Preset *edited, const Preset *reference);
|
|
static std::vector<std::string> dirty_options(const Preset *edited, const Preset *reference, const bool deep_compare = false);
|
|
//BBS: add function for dirty_options_without_option_list
|
|
static std::vector<std::string> dirty_options_without_option_list(const Preset *edited, const Preset *reference, const std::set<std::string>& option_ignore_list, const bool deep_compare = false);
|
|
private:
|
|
// Type of this PresetCollection: TYPE_PRINT, TYPE_FILAMENT or TYPE_PRINTER.
|
|
Preset::Type m_type;
|
|
// List of presets, starting with the "- default -" preset.
|
|
// Use deque to force the container to allocate an object per each entry,
|
|
// so that the addresses of the presets don't change during resizing of the container.
|
|
std::deque<Preset> m_presets;
|
|
// System profiles may have aliases. Map to the full profile name.
|
|
std::vector<std::pair<std::string, std::string>> m_map_alias_to_profile_name;
|
|
// Map from old system profile name to a current system profile name.
|
|
std::map<std::string, std::string> m_map_system_profile_renamed;
|
|
// Initially this preset contains a copy of the selected preset. Later on, this copy may be modified by the user.
|
|
Preset m_edited_preset;
|
|
// Contains a copy of the last saved selected preset.
|
|
Preset m_saved_preset;
|
|
|
|
// Selected preset.
|
|
size_t m_idx_selected;
|
|
// Is the "- default -" preset suppressed?
|
|
bool m_default_suppressed = true;
|
|
size_t m_num_default_presets = 0;
|
|
|
|
// Path to the directory to store the config files into.
|
|
std::string m_dir_path;
|
|
|
|
// to access select_preset_by_name_strict() and the default & copy constructors.
|
|
friend class PresetBundle;
|
|
|
|
//BBS: mutex
|
|
std::mutex m_mutex;
|
|
};
|
|
|
|
// Printer supports the FFF and SLA technologies, with different set of configuration values,
|
|
// therefore this PresetCollection needs to handle two defaults.
|
|
class PrinterPresetCollection : public PresetCollection
|
|
{
|
|
public:
|
|
PrinterPresetCollection(Preset::Type type, const std::vector<std::string> &keys, const Slic3r::StaticPrintConfig &defaults, const std::string &default_name = "Default Printer") :
|
|
PresetCollection(type, keys, defaults, default_name) {}
|
|
|
|
const Preset& default_preset_for(const DynamicPrintConfig &config) const override;
|
|
|
|
const Preset* find_system_preset_by_model_and_variant(const std::string &model_id, const std::string &variant) const;
|
|
const Preset* find_custom_preset_by_model_and_variant(const std::string &model_id, const std::string &variant) const;
|
|
|
|
bool only_default_printers() const;
|
|
private:
|
|
PrinterPresetCollection() = default;
|
|
PrinterPresetCollection(const PrinterPresetCollection &other) = default;
|
|
PrinterPresetCollection& operator=(const PrinterPresetCollection &other) = default;
|
|
|
|
friend class PresetBundle;
|
|
};
|
|
|
|
namespace PresetUtils {
|
|
// PrinterModel of a system profile, from which this preset is derived, or null if it is not derived from a system profile.
|
|
const VendorProfile::PrinterModel* system_printer_model(const Preset &preset);
|
|
std::string system_printer_bed_model(const Preset& preset);
|
|
std::string system_printer_bed_texture(const Preset& preset);
|
|
std::string system_printer_hotend_model(const Preset& preset);
|
|
} // namespace PresetUtils
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
class PhysicalPrinter
|
|
{
|
|
public:
|
|
PhysicalPrinter(const std::string& name, const DynamicPrintConfig &default_config);
|
|
PhysicalPrinter(const std::string& name, const DynamicPrintConfig &default_config, const Preset& preset);
|
|
void set_name(const std::string &name);
|
|
|
|
// Name of the Physical Printer, usually derived form the file name.
|
|
std::string name;
|
|
// File name of the Physical Printer.
|
|
std::string file;
|
|
// Configuration data, loaded from a file, or set from the defaults.
|
|
DynamicPrintConfig config;
|
|
// set of presets used with this physical printer
|
|
std::set<std::string> preset_names;
|
|
|
|
// Has this profile been loaded?
|
|
bool loaded = false;
|
|
|
|
static std::string separator();
|
|
static const std::vector<std::string>& printer_options();
|
|
static const std::vector<std::string>& print_host_options();
|
|
static std::vector<std::string> presets_with_print_host_information(const PrinterPresetCollection& printer_presets);
|
|
static bool has_print_host_information(const DynamicPrintConfig& config);
|
|
|
|
const std::set<std::string>& get_preset_names() const;
|
|
|
|
void update_preset_names_in_config();
|
|
|
|
//BBS: change to json format
|
|
//void save() { this->config.save(this->file); }
|
|
void save(DynamicPrintConfig* parent_config) { this->config.save_to_json(this->file, std::string("Physical_Printer"), std::string("User"), std::string(SLIC3R_VERSION)); }
|
|
void save(const std::string& file_name_from, const std::string& file_name_to);
|
|
|
|
void update_from_preset(const Preset& preset);
|
|
void update_from_config(const DynamicPrintConfig &new_config);
|
|
|
|
// add preset to the preset_names
|
|
// return false, if preset with this name is already exist in the set
|
|
bool add_preset(const std::string& preset_name);
|
|
bool delete_preset(const std::string& preset_name);
|
|
void reset_presets();
|
|
|
|
// Return a printer technology, return ptFFF if the printer technology is not set.
|
|
static PrinterTechnology printer_technology(const DynamicPrintConfig& cfg) {
|
|
auto* opt = cfg.option<ConfigOptionEnum<PrinterTechnology>>("printer_technology");
|
|
// The following assert may trigger when importing some legacy profile,
|
|
// but it is safer to keep it here to capture the cases where the "printer_technology" key is queried, where it should not.
|
|
return (opt == nullptr) ? ptFFF : opt->value;
|
|
}
|
|
PrinterTechnology printer_technology() const { return printer_technology(this->config); }
|
|
|
|
// Sort lexicographically by a preset name. The preset name shall be unique across a single PresetCollection.
|
|
bool operator<(const PhysicalPrinter& other) const { return this->name < other.name; }
|
|
|
|
// get full printer name included a name of the preset
|
|
std::string get_full_name(std::string preset_name) const;
|
|
|
|
// get printer name from the full name uncluded preset name
|
|
static std::string get_short_name(std::string full_name);
|
|
|
|
// get preset name from the full name uncluded printer name
|
|
static std::string get_preset_name(std::string full_name);
|
|
|
|
protected:
|
|
friend class PhysicalPrinterCollection;
|
|
};
|
|
|
|
|
|
// ---------------------------------
|
|
// *** PhysicalPrinterCollection ***
|
|
// ---------------------------------
|
|
|
|
// Collections of physical printers
|
|
class PhysicalPrinterCollection
|
|
{
|
|
public:
|
|
PhysicalPrinterCollection(const std::vector<std::string>& keys);
|
|
|
|
typedef std::deque<PhysicalPrinter>::iterator Iterator;
|
|
typedef std::deque<PhysicalPrinter>::const_iterator ConstIterator;
|
|
Iterator begin() { return m_printers.begin(); }
|
|
ConstIterator begin() const { return m_printers.cbegin(); }
|
|
ConstIterator cbegin() const { return m_printers.cbegin(); }
|
|
Iterator end() { return m_printers.end(); }
|
|
ConstIterator end() const { return m_printers.cend(); }
|
|
ConstIterator cend() const { return m_printers.cend(); }
|
|
|
|
bool empty() const {return m_printers.empty(); }
|
|
|
|
void reset(bool delete_files) {};
|
|
|
|
const std::deque<PhysicalPrinter>& operator()() const { return m_printers; }
|
|
|
|
// Load ini files of the particular type from the provided directory path.
|
|
void load_printers(const std::string& dir_path, const std::string& subdir, PresetsConfigSubstitutions& substitutions, ForwardCompatibilitySubstitutionRule rule);
|
|
void load_printers_from_presets(PrinterPresetCollection &printer_presets);
|
|
// Load printer from the loaded configuration
|
|
void load_printer(const std::string& path, const std::string& name, DynamicPrintConfig&& config, bool select, bool save=false);
|
|
|
|
// Save the printer under a new name. If the name is different from the old one,
|
|
// a new printer is stored into the list of printers.
|
|
// New printer is activated.
|
|
void save_printer(PhysicalPrinter& printer, const std::string& renamed_from = "");
|
|
|
|
// Delete the current preset, activate the first visible preset.
|
|
// returns true if the preset was deleted successfully.
|
|
bool delete_printer(const std::string& name);
|
|
// Delete the selected preset
|
|
// returns true if the preset was deleted successfully.
|
|
bool delete_selected_printer();
|
|
// Delete preset_name preset from all printers:
|
|
// If there is last preset for the printer and first_check== false, then delete this printer
|
|
// returns true if all presets were deleted successfully.
|
|
bool delete_preset_from_printers(const std::string& preset_name);
|
|
|
|
// Get list of printers which have more than one preset and "preset_names" preset is one of them
|
|
std::vector<std::string> get_printers_with_preset( const std::string &preset_name);
|
|
// Get list of printers which has only "preset_names" preset
|
|
std::vector<std::string> get_printers_with_only_preset( const std::string &preset_name);
|
|
|
|
// Return the selected preset, without the user modifications applied.
|
|
PhysicalPrinter& get_selected_printer() { return m_printers[m_idx_selected]; }
|
|
const PhysicalPrinter& get_selected_printer() const { return m_printers[m_idx_selected]; }
|
|
|
|
size_t get_selected_idx() const { return m_idx_selected; }
|
|
// Returns the name of the selected preset, or an empty string if no preset is selected.
|
|
std::string get_selected_printer_name() const { return (m_idx_selected == size_t(-1)) ? std::string() : this->get_selected_printer().name; }
|
|
// Returns the config of the selected printer, or nullptr if no printer is selected.
|
|
DynamicPrintConfig* get_selected_printer_config() { return (m_idx_selected == size_t(-1)) ? nullptr : &(this->get_selected_printer().config); }
|
|
// Returns the config of the selected printer, or nullptr if no printer is selected.
|
|
PrinterTechnology get_selected_printer_technology() { return (m_idx_selected == size_t(-1)) ? PrinterTechnology::ptAny : this->get_selected_printer().printer_technology(); }
|
|
|
|
// Each physical printer can have a several related preset,
|
|
// so, use the next functions to get an exact names of selections in the list:
|
|
// Returns the full name of the selected printer, or an empty string if no preset is selected.
|
|
std::string get_selected_full_printer_name() const;
|
|
// Returns the printer model of the selected preset, or an empty string if no preset is selected.
|
|
std::string get_selected_printer_preset_name() const { return (m_idx_selected == size_t(-1)) ? std::string() : m_selected_preset; }
|
|
|
|
// Select printer by the full printer name, which contains name of printer, separator and name of selected preset
|
|
// If full_name doesn't contain name of selected preset, then select first preset in the list for this printer
|
|
void select_printer(const std::string& full_name);
|
|
void select_printer(const PhysicalPrinter& printer);
|
|
void select_printer(const std::string& printer_name, const std::string& preset_name);
|
|
bool has_selection() const;
|
|
void unselect_printer() ;
|
|
bool is_selected(ConstIterator it, const std::string &preset_name) const;
|
|
|
|
// Return a printer by an index. If the printer is active, a temporary copy is returned.
|
|
PhysicalPrinter& printer(size_t idx) { return m_printers[idx]; }
|
|
const PhysicalPrinter& printer(size_t idx) const { return const_cast<PhysicalPrinterCollection*>(this)->printer(idx); }
|
|
|
|
// Return a preset by its name. If the preset is active, a temporary copy is returned.
|
|
// If a preset is not found by its name, null is returned.
|
|
// It is possible case (in)sensitive search
|
|
PhysicalPrinter* find_printer(const std::string& name, bool case_sensitive_search = true);
|
|
const PhysicalPrinter* find_printer(const std::string& name, bool case_sensitive_search = true) const
|
|
{
|
|
return const_cast<PhysicalPrinterCollection*>(this)->find_printer(name, case_sensitive_search);
|
|
}
|
|
|
|
// Generate a file path from a profile name. Add the ".ini" suffix if it is missing.
|
|
std::string path_from_name(const std::string& new_name) const;
|
|
|
|
const DynamicPrintConfig& default_config() const { return m_default_config; }
|
|
|
|
private:
|
|
friend class PresetBundle;
|
|
PhysicalPrinterCollection() = default;
|
|
PhysicalPrinterCollection& operator=(const PhysicalPrinterCollection& other) = default;
|
|
|
|
// Find a physical printer position in the sorted list of printers.
|
|
// The name of a printer should be unique and case insensitive
|
|
// Use this functions with case_sensitive_search = false, when you need case insensitive search
|
|
std::deque<PhysicalPrinter>::iterator find_printer_internal(const std::string& name, bool case_sensitive_search = true);
|
|
std::deque<PhysicalPrinter>::const_iterator find_printer_internal(const std::string& name, bool case_sensitive_search = true) const
|
|
{
|
|
return const_cast<PhysicalPrinterCollection*>(this)->find_printer_internal(name);
|
|
}
|
|
|
|
// List of printers
|
|
// Use deque to force the container to allocate an object per each entry,
|
|
// so that the addresses of the presets don't change during resizing of the container.
|
|
std::deque<PhysicalPrinter> m_printers;
|
|
|
|
// Default config for a physical printer containing all key/value pairs of PhysicalPrinter::printer_options().
|
|
DynamicPrintConfig m_default_config;
|
|
|
|
// Selected printer.
|
|
size_t m_idx_selected = size_t(-1);
|
|
// The name of the preset which is currently select for this printer
|
|
std::string m_selected_preset;
|
|
|
|
// Path to the directory to store the config files into.
|
|
std::string m_dir_path;
|
|
};
|
|
|
|
|
|
} // namespace Slic3r
|
|
|
|
#endif /* slic3r_Preset_hpp_ */
|