mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-11-02 20:51:23 -07:00
* 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>
1008 lines
54 KiB
C++
1008 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_ */
|