Merge branch 'main' into belt/baseChanges

This commit is contained in:
Rodrigo Faselli
2026-06-04 17:32:35 -03:00
committed by GitHub
155 changed files with 26628 additions and 4804 deletions

View File

@@ -628,10 +628,10 @@ msgid "Add connectors"
msgstr "Adicionar conectores"
msgid "Upper part"
msgstr "Parte superior"
msgstr "Peça superior"
msgid "Lower part"
msgstr "Parte inferior"
msgstr "Peça inferior"
msgid "Keep"
msgstr "Manter"
@@ -8027,7 +8027,7 @@ msgid "Disable Auto-Drop to preserve z positioning?\n"
msgstr ""
msgid "Object with floating parts was detected"
msgstr ""
msgstr "Foi detectado um objeto com partes flutuantes"
msgid "Another export job is running."
msgstr "Outro trabalho de exportação está em execução."
@@ -8446,7 +8446,7 @@ msgid "Triangles: %1%\n"
msgstr "Triângulos: %1%\n"
msgid "Use \"Fix Model\" to repair the mesh."
msgstr ""
msgstr "Use \"Corrigir Modelo\" para reparar a malha."
#, c-format, boost-format
msgid ""
@@ -8619,18 +8619,20 @@ msgid "Show splash screen"
msgstr "Mostrar tela de abertura"
msgid "Show the splash screen during startup."
msgstr "Mostra a tela de abertura durante a inicialização."
msgstr "Mostrar a tela de abertura durante a inicialização."
msgid "Show shared profiles notification"
msgstr ""
msgstr "Mostrar notificação de perfis compartilhados"
msgid ""
"Show a notification with a link to browse shared profiles when the selected "
"printer is changed."
msgstr ""
"Mostrar uma notificação com um link para navegar pelos perfis compartilhados "
"quando a impressora selecionada for alterada."
msgid "Use window buttons on left side"
msgstr ""
msgstr "Usar os botões de janela no lado esquerdo"
msgid "(Requires restart)"
msgstr "(Requer reinício)"
@@ -8963,12 +8965,15 @@ msgid ""
"Limits viewport frame rate to reduce GPU load and power usage.\n"
"Set to 0 for unlimited frame rate."
msgstr ""
"Limita a taxa de quadros da janela de visualização para reduzir a carga da "
"GPU e o consumo de energia.\n"
"Defina como 0 para taxa de quadros ilimitada."
msgid "Show FPS overlay"
msgstr ""
msgstr "Mostrar painel de FPS"
msgid "Displays current viewport FPS in the top-right corner."
msgstr ""
msgstr "Exibe o FPS atual da janela de visualização no canto superior direito."
msgid "Login region"
msgstr "Região de login"
@@ -8981,6 +8986,10 @@ msgid ""
"the transmission of data to Bambu's cloud services too. Users who don't use "
"BBL machines or use LAN mode only can safely turn on this function."
msgstr ""
"Esta opção desativa todos os serviços em nuvem, como o Orca Cloud e o Bambu "
"Cloud. Isso também interrompe a transmissão de dados para os serviços em "
"nuvem da Bambu. Usuários que não utilizam máquinas Bambu Labs ou que usam "
"apenas o modo LAN podem ativar esta função com segurança."
msgid "Network test"
msgstr "Teste de Rede"
@@ -9286,7 +9295,7 @@ msgid "Project-inside presets"
msgstr "Predefinições dentro do projeto"
msgid "Bundle presets"
msgstr ""
msgstr "Empacotar predefinições"
msgid "System"
msgstr "Sistema"
@@ -9889,6 +9898,9 @@ msgid ""
"type in the slicing file. Please make sure you have installed the correct "
"filament in the external spool."
msgstr ""
"O tipo de filamento externo é desconhecido ou não corresponde ao tipo de "
"filamento no arquivo de fatiamento. Certifique-se de ter instalado o "
"filamento correto no carretel externo."
msgid "Please refer to Wiki before use->"
msgstr "Consulte o Wiki antes de usar->"
@@ -11506,11 +11518,15 @@ msgid ""
"Native Wayland liveview requires the GStreamer GTK video sink. Please "
"install the gtksink plugin for GStreamer, then restart OrcaSlicer."
msgstr ""
"A visualização ao vivo nativa do Wayland requer o receptor de vídeo GTK do "
"GStreamer. Instale o plugin gtksink para GStreamer e reinicie o OrcaSlicer."
msgid ""
"Failed to initialize the native Wayland GStreamer video sink. Please check "
"your GStreamer GTK plugin installation."
msgstr ""
"Falha ao inicializar o receptor de vídeo nativo do Wayland GStreamer. "
"Verifique a instalação do plugin GStreamer GTK."
msgid ""
"Windows Media Player is required for this task! Do you want to enable "
@@ -11551,6 +11567,8 @@ msgstr ""
msgid "Cloud agent is not available. Please restart OrcaSlicer and try again."
msgstr ""
"O agente na nuvem não está disponível. Reinicie o OrcaSlicer e tente "
"novamente."
msgid "Bambu Network plug-in not detected."
msgstr "Plug-in de Rede Bambu não detectado."
@@ -11742,7 +11760,7 @@ msgid "Zoom out"
msgstr "Afastar zoom"
msgid "Toggle printable for object/part"
msgstr ""
msgstr "Alternar modo de impressão para objeto/peça"
msgid "Switch between Prepare/Preview"
msgstr "Alternar entre Preparar/Pré-visualizar"
@@ -11997,13 +12015,13 @@ msgstr "Mesa de Extensão"
#, boost-format
msgid "Split into %1% parts"
msgstr ""
msgstr "Dividir em %1% peças"
msgid "Repair finished"
msgstr "Reparo concluído"
msgid "Repair failed"
msgstr ""
msgstr "Reparo falhou"
msgid "Repair canceled"
msgstr "Reparo cancelado"
@@ -12083,15 +12101,19 @@ msgid "Flush volumes matrix do not match to the correct size!"
msgstr "A matriz de volumes de descarga não corresponde ao tamanho correto!"
msgid "set_accel_and_jerk() is only supported by Klipper"
msgstr ""
msgstr "set_accel_and_jerk() só é suportado pelo Klipper"
msgid ""
"Input shaping is not supported by Marlin < 2.1.2.\n"
"Check your firmware version and update your G-code flavor to ´Marlin 2´"
msgstr ""
"O controle de entrada não é suportado pelo Marlin < 2.1.2.\n"
"Verifique a versão do seu firmware e atualize o seu G-code para 'Marlin 2'"
msgid "Input shaping is only supported by Klipper, RepRapFirmware and Marlin 2"
msgstr ""
"O controle de entrada é suportado apenas pelo Klipper, RepRapFirmware e "
"Marlin 2"
msgid "Grouping error: "
msgstr "Erro de agrupamento: "
@@ -12676,7 +12698,7 @@ msgstr ""
"por este valor."
msgid "Elephant foot layers density"
msgstr ""
msgstr "Densidade das camadas do pé de elefante"
msgid ""
"Density of internal solid infill for Elephant foot layers compensation.\n"
@@ -12684,6 +12706,11 @@ msgid ""
"Subsequent layers become linearly denser by the height specified in "
"elefant_foot_compensation_layers."
msgstr ""
"Densidade do preenchimento sólido interno para compensação das camadas de "
"pé de elefante.\n"
"O valor inicial para a segunda camada está definido.\n"
"As camadas subsequentes tornam-se linearmente mais densas pela altura "
"especificada em elefant_foot_compensation_layers."
msgid ""
"Slicing height for each layer. Smaller layer height means more accurate and "
@@ -13849,14 +13876,18 @@ msgstr ""
msgid ""
"Enable this to override the fan speed set in custom G-code during print."
msgstr ""
"Habilite para substituir a velocidade da ventoinha definida no G-code "
"personalizado durante a impressão."
msgid "On completion"
msgstr ""
msgstr "Na cinclusão"
msgid ""
"Enable this to override the fan speed set in custom G-code after print "
"completion."
msgstr ""
"Habilite para substituir a velocidade da ventoinha definida no G-code "
"personalizado após a conclusão da impressão."
msgid ""
"Speed of exhaust fan during printing. This speed will override the speed in "
@@ -14284,6 +14315,13 @@ msgid ""
"\n"
"This option will be disabled if spiral vase mode is enabled."
msgstr ""
"A direção em que as voltas da parede de contorno são extrudados quando "
"vistos de cima.\n"
"Os furos são impressos na direção oposta ao contorno para manter o "
"alinhamento com as camadas cujos polígonos de contorno estão incompletos e "
"mudam de direção, formando também parcialmente o contorno de um furo.\n"
"\n"
"Esta opção será desativada se o modo vaso espiral estiver ativado."
msgid "Counter clockwise"
msgstr "Anti-horário"
@@ -14684,16 +14722,16 @@ msgid "Auto For Match"
msgstr "Automático para correspondência"
msgid "Enable filament dynamic map"
msgstr ""
msgstr "Habilitar mapa dinâmico de filamento"
msgid "Enable dynamic filament mapping during print."
msgstr ""
msgstr "Habilitar mapeamento dinâmico de filamentos durante a impressão."
msgid "Has filament switcher"
msgstr ""
msgstr "Tem trocador de filamentos"
msgid "Printer has a filament switcher hardware (e.g., AMS)."
msgstr ""
msgstr "A impressora tem um sistema de troca de filamentos (Ex.: AMS)."
msgid "Flush temperature"
msgstr "Temperatura de purga"
@@ -14968,10 +15006,10 @@ msgstr ""
"confiável."
msgid "Wipe tower cooling"
msgstr ""
msgstr "Resriamento da torre de limpeza"
msgid "Temperature drop before entering filament tower"
msgstr ""
msgstr "Redução de temperatura antes de entrar na torre de filamentos"
msgid "Interface layer pre-extrusion distance"
msgstr "Distância de pré-extrusão da camada de interface"
@@ -15433,12 +15471,14 @@ msgstr ""
"placa de impressão."
msgid "First layer travel"
msgstr ""
msgstr "Deslocamento para primeira camada"
msgid ""
"Travel acceleration of first layer.\n"
"The percentage value is relative to Travel Acceleration."
msgstr ""
"Aceleração de deslocamento para a primeira camada.\n"
"O valor percentual é relativo à Aceleração de Deslocamento."
msgid "Enable accel_to_decel"
msgstr "Habilitar accel_to_decel"
@@ -15779,6 +15819,17 @@ msgid ""
"Ripple: Uniform ripple pattern that ripples left and right of the original "
"path. Repeating pattern, woven appearance."
msgstr ""
"Tipo de ruído a ser usado para geração de textura difusa:\n"
"Clássico: Ruído aleatório uniforme clássico;\n"
"Perlin: Ruído Perlin, que dá uma textura mais consistente;\n"
"Billow: Semelhante ao ruído Perlin, mas mais aglomerado;\n"
"Multifractal estriado: Ruído estriado com características pontiagudas e "
"irregulares. Cria texturas semelhantes a mármore;\n"
"Voronoi: Divide a superfície em células Voronoi e desloca cada uma delas "
"por uma quantidade aleatória. Cria uma textura de retalhos;\n"
"Ondulação: Padrão de ondulação uniforme que se propaga para a esquerda e "
"para a direita do caminho original. Padrão repetitivo, com aparência de "
"tecido."
msgid "Classic"
msgstr "Clássico"
@@ -15796,7 +15847,7 @@ msgid "Voronoi"
msgstr "Voronoi"
msgid "Ripple"
msgstr ""
msgstr "Ondulação"
msgid "Fuzzy skin feature size"
msgstr "Tamanho dos elementos da textura difusa"
@@ -15829,13 +15880,14 @@ msgstr ""
"baixos resultarão em ruído mais suave."
msgid "Number of ripples per layer"
msgstr ""
msgstr "Número de ondulações por camada"
msgid "Controls how many full cycles of ripples will be added per layer."
msgstr ""
"Controla quantos ciclos completos de ondulações serão adicionados por camada."
msgid "Ripple offset"
msgstr ""
msgstr "Deslocamento das ondulações"
msgid ""
"Shifts the ripple phase forward along the print path by the specified "
@@ -15849,9 +15901,21 @@ msgid ""
"The shift is applied once every number of layers set by Layers between "
"ripple offset, so layers within the same group are printed identically."
msgstr ""
"Desloca a fase da ondulação para a frente ao longo do percurso de impressão "
"pela porcentagem especificada de um comprimento de onda a cada período de "
"camada.\n"
"- 0% mantém todas as camadas idênticas.\n"
"- 50% desloca o padrão em meio comprimento de onda, invertendo efetivamente "
"a fase.\n"
"- 100% desloca o padrão em um comprimento de onda completo, retornando à "
"fase original.\n"
"\n"
"O deslocamento é aplicado uma vez a cada número de camadas definido em "
"Camadas entre deslocamento de ondulação, de modo que as camadas dentro do "
"mesmo grupo sejam impressas de forma idêntica."
msgid "Layers between ripple offset"
msgstr ""
msgstr "Camadas entre o deslocamento de onda"
msgid ""
"Specifies how many consecutive layers share the same ripple phase before the "
@@ -15864,6 +15928,15 @@ msgid ""
"to 6 are shifted by the configured offset, then layers 7 to 9 return to the "
"base pattern, etc."
msgstr ""
"Especifica quantas camadas consecutivas compartilham a mesma fase de "
"ondulação antes da aplicação do deslocamento.\n"
"Por exemplo:\n"
"- 1 = A camada 1 é impressa com o padrão de ondulação base, em seguida a "
"camada 2 é deslocada pelo valor configurado, depois a camada 3 retorna ao "
"padrão base e assim por diante.\n"
"- 3 = As camadas 1 a 3 são impressas com o padrão de ondulação base, em "
"seguida as camadas 4 a 6 são deslocadas pelo valor configurado, depois as "
"camadas 7 a 9 retornam ao padrão base, etc."
msgid "Filter out tiny gaps"
msgstr "Filtrar vazios pequenos"
@@ -16596,13 +16669,17 @@ msgstr ""
"Habilitar o contorno da camada Z (antisserrilhamento da camada Z)."
msgid "Minimize wall height angle"
msgstr ""
msgstr "Minimizar o ângulo de altura das paredes"
msgid ""
"Reduce the height of top-surface perimeters to match the model edge height.\n"
"Affects perimeters with a slope less than this angle (degrees).\n"
"A reasonable value is 35. Set to 0 to disable."
msgstr ""
"Reduz a altura dos perímetros da superfície superior para corresponder à "
"altura da aresta do modelo.\n"
"Afeta os perímetros com uma inclinação menor que este ângulo (em graus).\n"
"Um valor razoável é 35. Defina como 0 para desativar."
msgid "°"
msgstr "°"
@@ -16615,12 +16692,14 @@ msgstr ""
"Desative a alternância da direção de preenchimento ao usar o contorno em Z."
msgid "Minimum z height"
msgstr ""
msgstr "Altura Z mínima"
msgid ""
"Minimum Z-layer height.\n"
"Also controls the slicing plane."
msgstr ""
"Altura mínima da camada Z.\n"
"Também controla o plano de corte."
msgid "This G-code is inserted at every layer change after the Z lift."
msgstr "Este G-code é inserido a cada mudança de camada após a elevação Z."
@@ -16823,12 +16902,14 @@ msgid "Maximum speed of resonance avoidance."
msgstr "Velocidade máxima de prevenção de ressonância."
msgid "Emit input shaping"
msgstr ""
msgstr "Emitir modelagem de entrada"
msgid ""
"Override firmware input shaping settings.\n"
"If disabled, firmware settings are used."
msgstr ""
"Substituir as configurações de modelagem de entrada do firmware.\n"
"Se desativado, as configurações do firmware serão usadas."
msgid "Input shaper type"
msgstr "Tipo de modelador de entrada"
@@ -16838,6 +16919,9 @@ msgid ""
"Default uses the firmware default settings.\n"
"Disable turns off input shaping in the firmware."
msgstr ""
"Escolha o algoritmo de modelagem de entrada.\n"
"Padrão usa as configurações padrão do firmware.\n"
"Desativar desativa a modelagem de entrada no firmware."
msgid "MZV"
msgstr ""
@@ -23280,6 +23364,10 @@ msgid ""
"the surface quality of your overhangs? However, it can cause wall "
"inconsistencies so use carefully!"
msgstr ""
"Reversão em par\n"
"Você sabia que o recurso <b>Reversão em par</b> pode melhorar "
"significativamente a qualidade da superfície de suas saliências? No entanto, "
"ele pode causar inconsistências na parede, portanto, use com cuidado!"
#: resources/data/hints.ini: [hint:Cut Tool]
msgid ""

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

View File

@@ -1,6 +1,6 @@
{
"name": "Anycubic",
"version": "02.04.00.00",
"version": "02.04.00.01",
"force_update": "0",
"description": "Anycubic configurations",
"machine_model_list": [

View File

@@ -1,6 +1,6 @@
{
"name": "Artillery",
"version": "02.04.00.00",
"version": "02.04.00.01",
"force_update": "0",
"description": "Artillery configurations",
"machine_model_list": [

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
{
"name": "CoLiDo",
"version": "02.04.00.00",
"version": "02.04.00.01",
"force_update": "0",
"description": "CoLiDo configurations",
"machine_model_list": [

View File

@@ -1,6 +1,6 @@
{
"name": "Comgrow",
"version": "02.04.00.00",
"version": "02.04.00.01",
"force_update": "0",
"description": "Comgrow configurations",
"machine_model_list": [

View File

@@ -1,6 +1,6 @@
{
"name": "Creality",
"version": "02.03.02.72",
"version": "02.03.02.73",
"force_update": "0",
"description": "Creality configurations",
"machine_model_list": [

View File

@@ -1,6 +1,6 @@
{
"name": "Cubicon",
"version": "02.04.00.00",
"version": "02.04.00.01",
"force_update": "0",
"description": "Cubicon configurations",
"machine_model_list": [

View File

@@ -1,6 +1,6 @@
{
"name": "Elegoo",
"version": "02.04.00.00",
"version": "02.04.00.02",
"force_update": "0",
"description": "Elegoo configurations",
"machine_model_list": [
@@ -286,6 +286,10 @@
"name": "0.40mm Standard @Elegoo Neptune 0.8 nozzle",
"sub_path": "process/EN2SERIES/0.40mm Standard @Elegoo Neptune 0.8 nozzle.json"
},
{
"name": "0.50mm Standard @Elegoo Giga 1.0 nozzle",
"sub_path": "process/EOSGIGA/0.50mm Standard @Elegoo Giga 1.0 nozzle.json"
},
{
"name": "0.50mm Standard @Elegoo N3Max 1.0 nozzle",
"sub_path": "process/EN3SERIES/0.50mm Standard @Elegoo N3Max 1.0 nozzle.json"
@@ -314,6 +318,42 @@
"name": "0.50mm Standard @Elegoo N4Pro 1.0 nozzle",
"sub_path": "process/EN4SERIES/0.50mm Standard @Elegoo N4Pro 1.0 nozzle.json"
},
{
"name": "0.08mm Optimal @Elegoo C 0.2 nozzle",
"sub_path": "process/EC/0.08mm Optimal @Elegoo C 0.2 nozzle.json"
},
{
"name": "0.12mm Draft @Elegoo C 0.2 nozzle",
"sub_path": "process/EC/0.12mm Draft @Elegoo C 0.2 nozzle.json"
},
{
"name": "0.14mm Extra Draft @Elegoo C 0.2 nozzle",
"sub_path": "process/EC/0.14mm Extra Draft @Elegoo C 0.2 nozzle.json"
},
{
"name": "0.08mm Optimal @Elegoo CC 0.2 nozzle",
"sub_path": "process/ECC/0.08mm Optimal @Elegoo CC 0.2 nozzle.json"
},
{
"name": "0.12mm Draft @Elegoo CC 0.2 nozzle",
"sub_path": "process/ECC/0.12mm Draft @Elegoo CC 0.2 nozzle.json"
},
{
"name": "0.14mm Extra Draft @Elegoo CC 0.2 nozzle",
"sub_path": "process/ECC/0.14mm Extra Draft @Elegoo CC 0.2 nozzle.json"
},
{
"name": "0.08mm Optimal @Elegoo CC2 0.2 nozzle",
"sub_path": "process/ECC2/0.08mm Optimal @Elegoo CC2 0.2 nozzle.json"
},
{
"name": "0.12mm Draft @Elegoo CC2 0.2 nozzle",
"sub_path": "process/ECC2/0.12mm Draft @Elegoo CC2 0.2 nozzle.json"
},
{
"name": "0.14mm Extra Draft @Elegoo CC2 0.2 nozzle",
"sub_path": "process/ECC2/0.14mm Extra Draft @Elegoo CC2 0.2 nozzle.json"
},
{
"name": "0.08mm Optimal @Elegoo N3Max 0.2 nozzle",
"sub_path": "process/EN3SERIES/0.08mm Optimal @Elegoo N3Max 0.2 nozzle.json"
@@ -370,6 +410,322 @@
"name": "0.12mm Draft @Elegoo N4Pro 0.2 nozzle",
"sub_path": "process/EN4SERIES/0.12mm Draft @Elegoo N4Pro 0.2 nozzle.json"
},
{
"name": "0.12mm Fine @Elegoo C 0.4 nozzle",
"sub_path": "process/EC/0.12mm Fine @Elegoo C 0.4 nozzle.json"
},
{
"name": "0.16mm Optimal @Elegoo C 0.4 nozzle",
"sub_path": "process/EC/0.16mm Optimal @Elegoo C 0.4 nozzle.json"
},
{
"name": "0.20mm Strength @Elegoo C 0.4 nozzle",
"sub_path": "process/EC/0.20mm Strength @Elegoo C 0.4 nozzle.json"
},
{
"name": "0.24mm Draft @Elegoo C 0.4 nozzle",
"sub_path": "process/EC/0.24mm Draft @Elegoo C 0.4 nozzle.json"
},
{
"name": "0.28mm Extra Draft @Elegoo C 0.4 nozzle",
"sub_path": "process/EC/0.28mm Extra Draft @Elegoo C 0.4 nozzle.json"
},
{
"name": "0.12mm Fine @Elegoo CC 0.4 nozzle",
"sub_path": "process/ECC/0.12mm Fine @Elegoo CC 0.4 nozzle.json"
},
{
"name": "0.16mm Optimal @Elegoo CC 0.4 nozzle",
"sub_path": "process/ECC/0.16mm Optimal @Elegoo CC 0.4 nozzle.json"
},
{
"name": "0.20mm Strength @Elegoo CC 0.4 nozzle",
"sub_path": "process/ECC/0.20mm Strength @Elegoo CC 0.4 nozzle.json"
},
{
"name": "0.24mm Draft @Elegoo CC 0.4 nozzle",
"sub_path": "process/ECC/0.24mm Draft @Elegoo CC 0.4 nozzle.json"
},
{
"name": "0.28mm Extra Draft @Elegoo CC 0.4 nozzle",
"sub_path": "process/ECC/0.28mm Extra Draft @Elegoo CC 0.4 nozzle.json"
},
{
"name": "0.12mm Fine @Elegoo CC2 0.4 nozzle",
"sub_path": "process/ECC2/0.12mm Fine @Elegoo CC2 0.4 nozzle.json"
},
{
"name": "0.16mm Optimal @Elegoo CC2 0.4 nozzle",
"sub_path": "process/ECC2/0.16mm Optimal @Elegoo CC2 0.4 nozzle.json"
},
{
"name": "0.20mm Strength @Elegoo CC2 0.4 nozzle",
"sub_path": "process/ECC2/0.20mm Strength @Elegoo CC2 0.4 nozzle.json"
},
{
"name": "0.24mm Draft @Elegoo CC2 0.4 nozzle",
"sub_path": "process/ECC2/0.24mm Draft @Elegoo CC2 0.4 nozzle.json"
},
{
"name": "0.28mm Extra Draft @Elegoo CC2 0.4 nozzle",
"sub_path": "process/ECC2/0.28mm Extra Draft @Elegoo CC2 0.4 nozzle.json"
},
{
"name": "0.16mm Optimal @Elegoo Giga 0.4 nozzle",
"sub_path": "process/EOSGIGA/0.16mm Optimal @Elegoo Giga 0.4 nozzle.json"
},
{
"name": "0.20mm Strength @Elegoo Giga 0.4 nozzle",
"sub_path": "process/EOSGIGA/0.20mm Strength @Elegoo Giga 0.4 nozzle.json"
},
{
"name": "0.24mm Draft @Elegoo Giga 0.4 nozzle",
"sub_path": "process/EOSGIGA/0.24mm Draft @Elegoo Giga 0.4 nozzle.json"
},
{
"name": "0.28mm Extra Draft @Elegoo Giga 0.4 nozzle",
"sub_path": "process/EOSGIGA/0.28mm Extra Draft @Elegoo Giga 0.4 nozzle.json"
},
{
"name": "0.12mm Fine @Elegoo N3Max 0.4 nozzle",
"sub_path": "process/EN3SERIES/0.12mm Fine @Elegoo N3Max 0.4 nozzle.json"
},
{
"name": "0.16mm Optimal @Elegoo N3Max 0.4 nozzle",
"sub_path": "process/EN3SERIES/0.16mm Optimal @Elegoo N3Max 0.4 nozzle.json"
},
{
"name": "0.20mm Strength @Elegoo N3Max 0.4 nozzle",
"sub_path": "process/EN3SERIES/0.20mm Strength @Elegoo N3Max 0.4 nozzle.json"
},
{
"name": "0.24mm Draft @Elegoo N3Max 0.4 nozzle",
"sub_path": "process/EN3SERIES/0.24mm Draft @Elegoo N3Max 0.4 nozzle.json"
},
{
"name": "0.28mm Extra Draft @Elegoo N3Max 0.4 nozzle",
"sub_path": "process/EN3SERIES/0.28mm Extra Draft @Elegoo N3Max 0.4 nozzle.json"
},
{
"name": "0.12mm Fine @Elegoo N3Plus 0.4 nozzle",
"sub_path": "process/EN3SERIES/0.12mm Fine @Elegoo N3Plus 0.4 nozzle.json"
},
{
"name": "0.16mm Optimal @Elegoo N3Plus 0.4 nozzle",
"sub_path": "process/EN3SERIES/0.16mm Optimal @Elegoo N3Plus 0.4 nozzle.json"
},
{
"name": "0.20mm Strength @Elegoo N3Plus 0.4 nozzle",
"sub_path": "process/EN3SERIES/0.20mm Strength @Elegoo N3Plus 0.4 nozzle.json"
},
{
"name": "0.24mm Draft @Elegoo N3Plus 0.4 nozzle",
"sub_path": "process/EN3SERIES/0.24mm Draft @Elegoo N3Plus 0.4 nozzle.json"
},
{
"name": "0.28mm Extra Draft @Elegoo N3Plus 0.4 nozzle",
"sub_path": "process/EN3SERIES/0.28mm Extra Draft @Elegoo N3Plus 0.4 nozzle.json"
},
{
"name": "0.12mm Fine @Elegoo N3Pro 0.4 nozzle",
"sub_path": "process/EN3SERIES/0.12mm Fine @Elegoo N3Pro 0.4 nozzle.json"
},
{
"name": "0.16mm Optimal @Elegoo N3Pro 0.4 nozzle",
"sub_path": "process/EN3SERIES/0.16mm Optimal @Elegoo N3Pro 0.4 nozzle.json"
},
{
"name": "0.20mm Strength @Elegoo N3Pro 0.4 nozzle",
"sub_path": "process/EN3SERIES/0.20mm Strength @Elegoo N3Pro 0.4 nozzle.json"
},
{
"name": "0.24mm Draft @Elegoo N3Pro 0.4 nozzle",
"sub_path": "process/EN3SERIES/0.24mm Draft @Elegoo N3Pro 0.4 nozzle.json"
},
{
"name": "0.28mm Extra Draft @Elegoo N3Pro 0.4 nozzle",
"sub_path": "process/EN3SERIES/0.28mm Extra Draft @Elegoo N3Pro 0.4 nozzle.json"
},
{
"name": "0.12mm Fine @Elegoo N4 0.4 nozzle",
"sub_path": "process/EN4SERIES/0.12mm Fine @Elegoo N4 0.4 nozzle.json"
},
{
"name": "0.16mm Optimal @Elegoo N4 0.4 nozzle",
"sub_path": "process/EN4SERIES/0.16mm Optimal @Elegoo N4 0.4 nozzle.json"
},
{
"name": "0.20mm Strength @Elegoo N4 0.4 nozzle",
"sub_path": "process/EN4SERIES/0.20mm Strength @Elegoo N4 0.4 nozzle.json"
},
{
"name": "0.24mm Draft @Elegoo N4 0.4 nozzle",
"sub_path": "process/EN4SERIES/0.24mm Draft @Elegoo N4 0.4 nozzle.json"
},
{
"name": "0.28mm Extra Draft @Elegoo N4 0.4 nozzle",
"sub_path": "process/EN4SERIES/0.28mm Extra Draft @Elegoo N4 0.4 nozzle.json"
},
{
"name": "0.12mm Fine @Elegoo N4Max 0.4 nozzle",
"sub_path": "process/EN4SERIES/0.12mm Fine @Elegoo N4Max 0.4 nozzle.json"
},
{
"name": "0.16mm Optimal @Elegoo N4Max 0.4 nozzle",
"sub_path": "process/EN4SERIES/0.16mm Optimal @Elegoo N4Max 0.4 nozzle.json"
},
{
"name": "0.20mm Strength @Elegoo N4Max 0.4 nozzle",
"sub_path": "process/EN4SERIES/0.20mm Strength @Elegoo N4Max 0.4 nozzle.json"
},
{
"name": "0.24mm Draft @Elegoo N4Max 0.4 nozzle",
"sub_path": "process/EN4SERIES/0.24mm Draft @Elegoo N4Max 0.4 nozzle.json"
},
{
"name": "0.28mm Extra Draft @Elegoo N4Max 0.4 nozzle",
"sub_path": "process/EN4SERIES/0.28mm Extra Draft @Elegoo N4Max 0.4 nozzle.json"
},
{
"name": "0.12mm Fine @Elegoo N4Plus 0.4 nozzle",
"sub_path": "process/EN4SERIES/0.12mm Fine @Elegoo N4Plus 0.4 nozzle.json"
},
{
"name": "0.16mm Optimal @Elegoo N4Plus 0.4 nozzle",
"sub_path": "process/EN4SERIES/0.16mm Optimal @Elegoo N4Plus 0.4 nozzle.json"
},
{
"name": "0.20mm Strength @Elegoo N4Plus 0.4 nozzle",
"sub_path": "process/EN4SERIES/0.20mm Strength @Elegoo N4Plus 0.4 nozzle.json"
},
{
"name": "0.24mm Draft @Elegoo N4Plus 0.4 nozzle",
"sub_path": "process/EN4SERIES/0.24mm Draft @Elegoo N4Plus 0.4 nozzle.json"
},
{
"name": "0.28mm Extra Draft @Elegoo N4Plus 0.4 nozzle",
"sub_path": "process/EN4SERIES/0.28mm Extra Draft @Elegoo N4Plus 0.4 nozzle.json"
},
{
"name": "0.12mm Fine @Elegoo N4Pro 0.4 nozzle",
"sub_path": "process/EN4SERIES/0.12mm Fine @Elegoo N4Pro 0.4 nozzle.json"
},
{
"name": "0.16mm Optimal @Elegoo N4Pro 0.4 nozzle",
"sub_path": "process/EN4SERIES/0.16mm Optimal @Elegoo N4Pro 0.4 nozzle.json"
},
{
"name": "0.20mm Strength @Elegoo N4Pro 0.4 nozzle",
"sub_path": "process/EN4SERIES/0.20mm Strength @Elegoo N4Pro 0.4 nozzle.json"
},
{
"name": "0.24mm Draft @Elegoo N4Pro 0.4 nozzle",
"sub_path": "process/EN4SERIES/0.24mm Draft @Elegoo N4Pro 0.4 nozzle.json"
},
{
"name": "0.28mm Extra Draft @Elegoo N4Pro 0.4 nozzle",
"sub_path": "process/EN4SERIES/0.28mm Extra Draft @Elegoo N4Pro 0.4 nozzle.json"
},
{
"name": "0.12mm Fine @Elegoo Neptune 0.4 nozzle",
"sub_path": "process/EN2SERIES/0.12mm Fine @Elegoo Neptune 0.4 nozzle.json"
},
{
"name": "0.16mm Optimal @Elegoo Neptune 0.4 nozzle",
"sub_path": "process/EN2SERIES/0.16mm Optimal @Elegoo Neptune 0.4 nozzle.json"
},
{
"name": "0.20mm Strength @Elegoo Neptune 0.4 nozzle",
"sub_path": "process/EN2SERIES/0.20mm Strength @Elegoo Neptune 0.4 nozzle.json"
},
{
"name": "0.24mm Draft @Elegoo Neptune 0.4 nozzle",
"sub_path": "process/EN2SERIES/0.24mm Draft @Elegoo Neptune 0.4 nozzle.json"
},
{
"name": "0.28mm Extra Draft @Elegoo Neptune 0.4 nozzle",
"sub_path": "process/EN2SERIES/0.28mm Extra Draft @Elegoo Neptune 0.4 nozzle.json"
},
{
"name": "0.18mm Fine @Elegoo C 0.6 nozzle",
"sub_path": "process/EC/0.18mm Fine @Elegoo C 0.6 nozzle.json"
},
{
"name": "0.24mm Optimal @Elegoo C 0.6 nozzle",
"sub_path": "process/EC/0.24mm Optimal @Elegoo C 0.6 nozzle.json"
},
{
"name": "0.30mm Strength @Elegoo C 0.6 nozzle",
"sub_path": "process/EC/0.30mm Strength @Elegoo C 0.6 nozzle.json"
},
{
"name": "0.36mm Draft @Elegoo C 0.6 nozzle",
"sub_path": "process/EC/0.36mm Draft @Elegoo C 0.6 nozzle.json"
},
{
"name": "0.42mm Extra Draft @Elegoo C 0.6 nozzle",
"sub_path": "process/EC/0.42mm Extra Draft @Elegoo C 0.6 nozzle.json"
},
{
"name": "0.18mm Fine @Elegoo CC 0.6 nozzle",
"sub_path": "process/ECC/0.18mm Fine @Elegoo CC 0.6 nozzle.json"
},
{
"name": "0.24mm Optimal @Elegoo CC 0.6 nozzle",
"sub_path": "process/ECC/0.24mm Optimal @Elegoo CC 0.6 nozzle.json"
},
{
"name": "0.30mm Strength @Elegoo CC 0.6 nozzle",
"sub_path": "process/ECC/0.30mm Strength @Elegoo CC 0.6 nozzle.json"
},
{
"name": "0.36mm Draft @Elegoo CC 0.6 nozzle",
"sub_path": "process/ECC/0.36mm Draft @Elegoo CC 0.6 nozzle.json"
},
{
"name": "0.42mm Extra Draft @Elegoo CC 0.6 nozzle",
"sub_path": "process/ECC/0.42mm Extra Draft @Elegoo CC 0.6 nozzle.json"
},
{
"name": "0.18mm Fine @Elegoo CC2 0.6 nozzle",
"sub_path": "process/ECC2/0.18mm Fine @Elegoo CC2 0.6 nozzle.json"
},
{
"name": "0.24mm Optimal @Elegoo CC2 0.6 nozzle",
"sub_path": "process/ECC2/0.24mm Optimal @Elegoo CC2 0.6 nozzle.json"
},
{
"name": "0.30mm Strength @Elegoo CC2 0.6 nozzle",
"sub_path": "process/ECC2/0.30mm Strength @Elegoo CC2 0.6 nozzle.json"
},
{
"name": "0.36mm Draft @Elegoo CC2 0.6 nozzle",
"sub_path": "process/ECC2/0.36mm Draft @Elegoo CC2 0.6 nozzle.json"
},
{
"name": "0.42mm Extra Draft @Elegoo CC2 0.6 nozzle",
"sub_path": "process/ECC2/0.42mm Extra Draft @Elegoo CC2 0.6 nozzle.json"
},
{
"name": "0.18mm Fine @Elegoo Giga 0.6 nozzle",
"sub_path": "process/EOSGIGA/0.18mm Fine @Elegoo Giga 0.6 nozzle.json"
},
{
"name": "0.24mm Optimal @Elegoo Giga 0.6 nozzle",
"sub_path": "process/EOSGIGA/0.24mm Optimal @Elegoo Giga 0.6 nozzle.json"
},
{
"name": "0.30mm Strength @Elegoo Giga 0.6 nozzle",
"sub_path": "process/EOSGIGA/0.30mm Strength @Elegoo Giga 0.6 nozzle.json"
},
{
"name": "0.36mm Draft @Elegoo Giga 0.6 nozzle",
"sub_path": "process/EOSGIGA/0.36mm Draft @Elegoo Giga 0.6 nozzle.json"
},
{
"name": "0.42mm Extra Draft @Elegoo Giga 0.6 nozzle",
"sub_path": "process/EOSGIGA/0.42mm Extra Draft @Elegoo Giga 0.6 nozzle.json"
},
{
"name": "0.24mm Optimal @Elegoo N3Max 0.6 nozzle",
"sub_path": "process/EN3SERIES/0.24mm Optimal @Elegoo N3Max 0.6 nozzle.json"
@@ -454,6 +810,82 @@
"name": "0.42mm Extra Draft @Elegoo N4Pro 0.6 nozzle",
"sub_path": "process/EN4SERIES/0.42mm Extra Draft @Elegoo N4Pro 0.6 nozzle.json"
},
{
"name": "0.24mm Optimal @Elegoo Neptune 0.6 nozzle",
"sub_path": "process/EN2SERIES/0.24mm Optimal @Elegoo Neptune 0.6 nozzle.json"
},
{
"name": "0.36mm Draft @Elegoo Neptune 0.6 nozzle",
"sub_path": "process/EN2SERIES/0.36mm Draft @Elegoo Neptune 0.6 nozzle.json"
},
{
"name": "0.42mm Extra Draft @Elegoo Neptune 0.6 nozzle",
"sub_path": "process/EN2SERIES/0.42mm Extra Draft @Elegoo Neptune 0.6 nozzle.json"
},
{
"name": "0.16mm Extra Fine @Elegoo C 0.8 nozzle",
"sub_path": "process/EC/0.16mm Extra Fine @Elegoo C 0.8 nozzle.json"
},
{
"name": "0.24mm Fine @Elegoo C 0.8 nozzle",
"sub_path": "process/EC/0.24mm Fine @Elegoo C 0.8 nozzle.json"
},
{
"name": "0.32mm Optimal @Elegoo C 0.8 nozzle",
"sub_path": "process/EC/0.32mm Optimal @Elegoo C 0.8 nozzle.json"
},
{
"name": "0.48mm Draft @Elegoo C 0.8 nozzle",
"sub_path": "process/EC/0.48mm Draft @Elegoo C 0.8 nozzle.json"
},
{
"name": "0.16mm Extra Fine @Elegoo CC 0.8 nozzle",
"sub_path": "process/ECC/0.16mm Extra Fine @Elegoo CC 0.8 nozzle.json"
},
{
"name": "0.24mm Fine @Elegoo CC 0.8 nozzle",
"sub_path": "process/ECC/0.24mm Fine @Elegoo CC 0.8 nozzle.json"
},
{
"name": "0.32mm Optimal @Elegoo CC 0.8 nozzle",
"sub_path": "process/ECC/0.32mm Optimal @Elegoo CC 0.8 nozzle.json"
},
{
"name": "0.48mm Draft @Elegoo CC 0.8 nozzle",
"sub_path": "process/ECC/0.48mm Draft @Elegoo CC 0.8 nozzle.json"
},
{
"name": "0.16mm Extra Fine @Elegoo CC2 0.8 nozzle",
"sub_path": "process/ECC2/0.16mm Extra Fine @Elegoo CC2 0.8 nozzle.json"
},
{
"name": "0.24mm Fine @Elegoo CC2 0.8 nozzle",
"sub_path": "process/ECC2/0.24mm Fine @Elegoo CC2 0.8 nozzle.json"
},
{
"name": "0.32mm Optimal @Elegoo CC2 0.8 nozzle",
"sub_path": "process/ECC2/0.32mm Optimal @Elegoo CC2 0.8 nozzle.json"
},
{
"name": "0.48mm Draft @Elegoo CC2 0.8 nozzle",
"sub_path": "process/ECC2/0.48mm Draft @Elegoo CC2 0.8 nozzle.json"
},
{
"name": "0.24mm Fine @Elegoo Giga 0.8 nozzle",
"sub_path": "process/EOSGIGA/0.24mm Fine @Elegoo Giga 0.8 nozzle.json"
},
{
"name": "0.32mm Optimal @Elegoo Giga 0.8 nozzle",
"sub_path": "process/EOSGIGA/0.32mm Optimal @Elegoo Giga 0.8 nozzle.json"
},
{
"name": "0.48mm Draft @Elegoo Giga 0.8 nozzle",
"sub_path": "process/EOSGIGA/0.48mm Draft @Elegoo Giga 0.8 nozzle.json"
},
{
"name": "0.56mm Extra Draft @Elegoo Giga 0.8 nozzle",
"sub_path": "process/EOSGIGA/0.56mm Extra Draft @Elegoo Giga 0.8 nozzle.json"
},
{
"name": "0.24mm Fine @Elegoo N3Max 0.8 nozzle",
"sub_path": "process/EN3SERIES/0.24mm Fine @Elegoo N3Max 0.8 nozzle.json"
@@ -538,6 +970,26 @@
"name": "0.48mm Draft @Elegoo N4Pro 0.8 nozzle",
"sub_path": "process/EN4SERIES/0.48mm Draft @Elegoo N4Pro 0.8 nozzle.json"
},
{
"name": "0.24mm Fine @Elegoo Neptune 0.8 nozzle",
"sub_path": "process/EN2SERIES/0.24mm Fine @Elegoo Neptune 0.8 nozzle.json"
},
{
"name": "0.32mm Optimal @Elegoo Neptune 0.8 nozzle",
"sub_path": "process/EN2SERIES/0.32mm Optimal @Elegoo Neptune 0.8 nozzle.json"
},
{
"name": "0.30mm Fine @Elegoo Giga 1.0 nozzle",
"sub_path": "process/EOSGIGA/0.30mm Fine @Elegoo Giga 1.0 nozzle.json"
},
{
"name": "0.40mm Optimal @Elegoo Giga 1.0 nozzle",
"sub_path": "process/EOSGIGA/0.40mm Optimal @Elegoo Giga 1.0 nozzle.json"
},
{
"name": "0.60mm Draft @Elegoo Giga 1.0 nozzle",
"sub_path": "process/EOSGIGA/0.60mm Draft @Elegoo Giga 1.0 nozzle.json"
},
{
"name": "0.30mm Fine @Elegoo N3Max 1.0 nozzle",
"sub_path": "process/EN3SERIES/0.30mm Fine @Elegoo N3Max 1.0 nozzle.json"

View File

@@ -48,6 +48,9 @@
"extruder_offset": [
"0x0"
],
"retract_length_toolchange": [
"0"
],
"default_bed_type": "4",
"auto_toolchange_command": "0",
"fan_speedup_time": "0.5",

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
{
"name": "Eryone",
"version": "02.04.00.00",
"version": "02.04.00.01",
"force_update": "0",
"description": "Eryone configurations",
"machine_model_list": [

View File

@@ -1,7 +1,7 @@
{
"name": "Flashforge",
"url": "",
"version": "02.04.00.00",
"version": "02.04.00.01",
"force_update": "0",
"description": "Flashforge configurations",
"machine_model_list": [

View File

@@ -1,6 +1,6 @@
{
"name": "FlyingBear",
"version": "02.04.00.00",
"version": "02.04.00.01",
"force_update": "1",
"description": "FlyingBear configurations",
"machine_model_list": [

View File

@@ -1,6 +1,6 @@
{
"name": "Ginger Additive",
"version": "02.04.00.00",
"version": "02.04.00.01",
"force_update": "1",
"description": "Ginger configuration",
"machine_model_list": [

View File

@@ -1,6 +1,6 @@
{
"name": "InfiMech",
"version": "02.04.00.00",
"version": "02.04.00.01",
"force_update": "1",
"description": "InfiMech configurations",
"machine_model_list": [

View File

@@ -1,7 +1,7 @@
{
"name": "Kingroon",
"url": "https://kingroon.com/",
"version": "02.04.00.00",
"version": "02.04.00.01",
"force_update": "1",
"description": "Kingroon configuration files",
"machine_model_list": [

View File

@@ -28,6 +28,7 @@
"initial_layer_line_width": "0.5",
"initial_layer_speed": "60",
"initial_layer_travel_speed": "300",
"initial_layer_travel_acceleration": "4000",
"inner_wall_acceleration": "20000",
"inner_wall_jerk": "15",
"inner_wall_line_width": "0.4",

View File

@@ -68,6 +68,258 @@
"name": "fdm_filament_pla",
"sub_path": "filament/base/fdm_filament_pla.json"
},
{
"name": "FilAr PLA @base",
"sub_path": "filament/FilAr/FilAr PLA @base.json"
},
{
"name": "FilAr PLA Bronce",
"sub_path": "filament/FilAr/FilAr PLA Bronce.json"
},
{
"name": "FilAr PLA Gris Plata",
"sub_path": "filament/FilAr/FilAr PLA Gris Plata.json"
},
{
"name": "FilAr PLA Cobre",
"sub_path": "filament/FilAr/FilAr PLA Cobre.json"
},
{
"name": "FilAr PLA Titanio",
"sub_path": "filament/FilAr/FilAr PLA Titanio.json"
},
{
"name": "FilAr PLA Tabaco",
"sub_path": "filament/FilAr/FilAr PLA Tabaco.json"
},
{
"name": "FilAr PLA Cafe con Leche",
"sub_path": "filament/FilAr/FilAr PLA Cafe con Leche.json"
},
{
"name": "FilAr PLA Manteca",
"sub_path": "filament/FilAr/FilAr PLA Manteca.json"
},
{
"name": "FilAr PLA Marron Oxido",
"sub_path": "filament/FilAr/FilAr PLA Marron Oxido.json"
},
{
"name": "FilAr PLA Carpincho",
"sub_path": "filament/FilAr/FilAr PLA Carpincho.json"
},
{
"name": "FilAr PLA Rosa Amaranto",
"sub_path": "filament/FilAr/FilAr PLA Rosa Amaranto.json"
},
{
"name": "FilAr PLA Rosa Flamenco",
"sub_path": "filament/FilAr/FilAr PLA Rosa Flamenco.json"
},
{
"name": "FilAr PLA Piel",
"sub_path": "filament/FilAr/FilAr PLA Piel.json"
},
{
"name": "FilAr PLA Verde FilAr",
"sub_path": "filament/FilAr/FilAr PLA Verde FilAr.json"
},
{
"name": "FilAr PLA Verde Manzana",
"sub_path": "filament/FilAr/FilAr PLA Verde Manzana.json"
},
{
"name": "FilAr PLA Verde Pixel",
"sub_path": "filament/FilAr/FilAr PLA Verde Pixel.json"
},
{
"name": "FilAr PLA Verde Oliva",
"sub_path": "filament/FilAr/FilAr PLA Verde Oliva.json"
},
{
"name": "FilAr PLA Blanco Antartida",
"sub_path": "filament/FilAr/FilAr PLA Blanco Antartida.json"
},
{
"name": "FilAr PLA Blanco Calido",
"sub_path": "filament/FilAr/FilAr PLA Blanco Calido.json"
},
{
"name": "FilAr PLA Negro Azabache",
"sub_path": "filament/FilAr/FilAr PLA Negro Azabache.json"
},
{
"name": "FilAr PLA Naranja Tigre",
"sub_path": "filament/FilAr/FilAr PLA Naranja Tigre.json"
},
{
"name": "FilAr PLA Rojo de Carreras",
"sub_path": "filament/FilAr/FilAr PLA Rojo de Carreras.json"
},
{
"name": "FilAr PLA Amarillo Lirio",
"sub_path": "filament/FilAr/FilAr PLA Amarillo Lirio.json"
},
{
"name": "FilAr PLA Violeta Jacaranda",
"sub_path": "filament/FilAr/FilAr PLA Violeta Jacaranda.json"
},
{
"name": "FilAr PLA Gris Pizarra",
"sub_path": "filament/FilAr/FilAr PLA Gris Pizarra.json"
},
{
"name": "FilAr PLA Gris Ceniza",
"sub_path": "filament/FilAr/FilAr PLA Gris Ceniza.json"
},
{
"name": "FilAr PLA Azul Francia",
"sub_path": "filament/FilAr/FilAr PLA Azul Francia.json"
},
{
"name": "FilAr PLA Celeste Cielo",
"sub_path": "filament/FilAr/FilAr PLA Celeste Cielo.json"
},
{
"name": "FilAr PLA Oro",
"sub_path": "filament/FilAr/FilAr PLA Oro.json"
},
{
"name": "FilAr PLA Dorado",
"sub_path": "filament/FilAr/FilAr PLA Dorado.json"
},
{
"name": "FilAr PLA-mate @base",
"sub_path": "filament/FilAr/FilAr PLA-mate @base.json"
},
{
"name": "FilAr PLA-mate Amarillo",
"sub_path": "filament/FilAr/FilAr PLA-mate Amarillo.json"
},
{
"name": "FilAr PLA-mate Azul",
"sub_path": "filament/FilAr/FilAr PLA-mate Azul.json"
},
{
"name": "FilAr PLA-mate Beige",
"sub_path": "filament/FilAr/FilAr PLA-mate Beige.json"
},
{
"name": "FilAr PLA-mate Blanco",
"sub_path": "filament/FilAr/FilAr PLA-mate Blanco.json"
},
{
"name": "FilAr PLA-mate Bordo",
"sub_path": "filament/FilAr/FilAr PLA-mate Bordo.json"
},
{
"name": "FilAr PLA-mate Celeste Cielo",
"sub_path": "filament/FilAr/FilAr PLA-mate Celeste Cielo.json"
},
{
"name": "FilAr PLA-mate Chocolate",
"sub_path": "filament/FilAr/FilAr PLA-mate Chocolate.json"
},
{
"name": "FilAr PLA-mate Gris",
"sub_path": "filament/FilAr/FilAr PLA-mate Gris.json"
},
{
"name": "FilAr PLA-mate Marron",
"sub_path": "filament/FilAr/FilAr PLA-mate Marron.json"
},
{
"name": "FilAr PLA-mate Naranja",
"sub_path": "filament/FilAr/FilAr PLA-mate Naranja.json"
},
{
"name": "FilAr PLA-mate Negro",
"sub_path": "filament/FilAr/FilAr PLA-mate Negro.json"
},
{
"name": "FilAr PLA-mate Piel",
"sub_path": "filament/FilAr/FilAr PLA-mate Piel.json"
},
{
"name": "FilAr PLA-mate Rojo",
"sub_path": "filament/FilAr/FilAr PLA-mate Rojo.json"
},
{
"name": "FilAr PLA-mate Rosa",
"sub_path": "filament/FilAr/FilAr PLA-mate Rosa.json"
},
{
"name": "FilAr PLA-mate Uva",
"sub_path": "filament/FilAr/FilAr PLA-mate Uva.json"
},
{
"name": "FilAr PLA-mate Verde",
"sub_path": "filament/FilAr/FilAr PLA-mate Verde.json"
},
{
"name": "FilAr PLA-mate Violeta",
"sub_path": "filament/FilAr/FilAr PLA-mate Violeta.json"
},
{
"name": "FilAr PETG @base",
"sub_path": "filament/FilAr/FilAr PETG @base.json"
},
{
"name": "FilAr PETG Amarillo Lima",
"sub_path": "filament/FilAr/FilAr PETG Amarillo Lima.json"
},
{
"name": "FilAr PETG Amarillo Radiante",
"sub_path": "filament/FilAr/FilAr PETG Amarillo Radiante.json"
},
{
"name": "FilAr PETG Azul Boreal",
"sub_path": "filament/FilAr/FilAr PETG Azul Boreal.json"
},
{
"name": "FilAr PETG Azul Francia",
"sub_path": "filament/FilAr/FilAr PETG Azul Francia.json"
},
{
"name": "FilAr PETG Azul Imperial",
"sub_path": "filament/FilAr/FilAr PETG Azul Imperial.json"
},
{
"name": "FilAr PETG Blanco Antartida",
"sub_path": "filament/FilAr/FilAr PETG Blanco Antartida.json"
},
{
"name": "FilAr PETG Cian",
"sub_path": "filament/FilAr/FilAr PETG Cian.json"
},
{
"name": "FilAr PETG Coral",
"sub_path": "filament/FilAr/FilAr PETG Coral.json"
},
{
"name": "FilAr PETG Cristal",
"sub_path": "filament/FilAr/FilAr PETG Cristal.json"
},
{
"name": "FilAr PETG Gris Ceniza",
"sub_path": "filament/FilAr/FilAr PETG Gris Ceniza.json"
},
{
"name": "FilAr PETG Gris Plata",
"sub_path": "filament/FilAr/FilAr PETG Gris Plata.json"
},
{
"name": "FilAr PETG Magenta",
"sub_path": "filament/FilAr/FilAr PETG Magenta.json"
},
{
"name": "FilAr PETG Negro Azabache",
"sub_path": "filament/FilAr/FilAr PETG Negro Azabache.json"
},
{
"name": "FilAr PETG Rojo Carmesi",
"sub_path": "filament/FilAr/FilAr PETG Rojo Carmesi.json"
},
{
"name": "fdm_filament_pp",
"sub_path": "filament/base/fdm_filament_pp.json"

View File

@@ -0,0 +1,53 @@
{
"type": "filament",
"name": "FilAr PETG @base",
"inherits": "fdm_filament_pet",
"from": "system",
"filament_id": "FILARB03",
"instantiation": "false",
"filament_type": [
"PETG"
],
"filament_vendor": [
"FilAr"
],
"filament_diameter": [
"1.75"
],
"filament_density": [
"1.27"
],
"filament_flow_ratio": [
"0.95"
],
"nozzle_temperature": [
"240"
],
"nozzle_temperature_initial_layer": [
"245"
],
"nozzle_temperature_range_low": [
"230"
],
"nozzle_temperature_range_high": [
"250"
],
"hot_plate_temp": [
"78"
],
"hot_plate_temp_initial_layer": [
"78"
],
"textured_plate_temp": [
"78"
],
"textured_plate_temp_initial_layer": [
"78"
],
"fan_min_speed": [
"40"
],
"fan_max_speed": [
"60"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PETG Amarillo Lima",
"inherits": "FilAr PETG @base",
"from": "system",
"filament_id": "FILAR0047",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#C7E03A"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PETG Amarillo Radiante",
"inherits": "FilAr PETG @base",
"from": "system",
"filament_id": "FILAR0048",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#FFD400"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PETG Azul Boreal",
"inherits": "FilAr PETG @base",
"from": "system",
"filament_id": "FILAR0049",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#1B4F9C"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PETG Azul Francia",
"inherits": "FilAr PETG @base",
"from": "system",
"filament_id": "FILAR0050",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#0033A0"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PETG Azul Imperial",
"inherits": "FilAr PETG @base",
"from": "system",
"filament_id": "FILAR0051",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#14306B"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PETG Blanco Antartida",
"inherits": "FilAr PETG @base",
"from": "system",
"filament_id": "FILAR0052",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#F7FAFC"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PETG Cian",
"inherits": "FilAr PETG @base",
"from": "system",
"filament_id": "FILAR0053",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#00B7D4"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PETG Coral",
"inherits": "FilAr PETG @base",
"from": "system",
"filament_id": "FILAR0054",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#FF6F5E"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PETG Cristal",
"inherits": "FilAr PETG @base",
"from": "system",
"filament_id": "FILAR0055",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#E8F0EC"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PETG Gris Ceniza",
"inherits": "FilAr PETG @base",
"from": "system",
"filament_id": "FILAR0056",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#B4B6B1"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PETG Gris Plata",
"inherits": "FilAr PETG @base",
"from": "system",
"filament_id": "FILAR0057",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#8C8686"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PETG Magenta",
"inherits": "FilAr PETG @base",
"from": "system",
"filament_id": "FILAR0058",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#B5174B"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PETG Negro Azabache",
"inherits": "FilAr PETG @base",
"from": "system",
"filament_id": "FILAR0059",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#000000"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PETG Rojo Carmesi",
"inherits": "FilAr PETG @base",
"from": "system",
"filament_id": "FILAR0060",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#8C1020"
]
}

View File

@@ -0,0 +1,47 @@
{
"type": "filament",
"name": "FilAr PLA @base",
"inherits": "fdm_filament_pla",
"from": "system",
"filament_id": "FILARB01",
"instantiation": "false",
"filament_type": [
"PLA"
],
"filament_vendor": [
"FilAr"
],
"filament_diameter": [
"1.75"
],
"filament_density": [
"1.24"
],
"filament_flow_ratio": [
"0.98"
],
"nozzle_temperature": [
"210"
],
"nozzle_temperature_initial_layer": [
"215"
],
"nozzle_temperature_range_low": [
"200"
],
"nozzle_temperature_range_high": [
"220"
],
"hot_plate_temp": [
"60"
],
"hot_plate_temp_initial_layer": [
"60"
],
"textured_plate_temp": [
"60"
],
"textured_plate_temp_initial_layer": [
"60"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Amarillo Lirio",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0022",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#FFD52B"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Azul Francia",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0026",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#0000FF"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Blanco Antartida",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0017",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#F7FAFC"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Blanco Calido",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0018",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#FFF8E7"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Bronce",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0001",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#AD8428"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Cafe con Leche",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0006",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#E0B269"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Carpincho",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0009",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#E8DFC1"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Celeste Cielo",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0027",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#A1EBFF"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Cobre",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0003",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#87421E"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Dorado",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0029",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#A67F00"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Gris Ceniza",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0025",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#B4B6B1"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Gris Pizarra",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0024",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#4B4B4B"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Gris Plata",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0002",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#8C8686"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Manteca",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0007",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#FFF5AB"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Marron Oxido",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0008",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#5E190E"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Naranja Tigre",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0020",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#FC5017"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Negro Azabache",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0019",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#000000"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Oro",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0028",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#FFD700"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Piel",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0012",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#FADDAC"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Rojo de Carreras",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0021",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#FA0F0F"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Rosa Amaranto",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0010",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#FA4164"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Rosa Flamenco",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0011",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#FFC7C2"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Tabaco",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0005",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#7D5429"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Titanio",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0004",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#878681"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Verde FilAr",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0013",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#036D6B"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Verde Manzana",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0014",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#D4FF38"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Verde Oliva",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0016",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#595900"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Verde Pixel",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0015",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#02E32F"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA Violeta Jacaranda",
"inherits": "FilAr PLA @base",
"from": "system",
"filament_id": "FILAR0023",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#9342C9"
]
}

View File

@@ -0,0 +1,47 @@
{
"type": "filament",
"name": "FilAr PLA-mate @base",
"inherits": "fdm_filament_pla",
"from": "system",
"filament_id": "FILARB02",
"instantiation": "false",
"filament_type": [
"PLA"
],
"filament_vendor": [
"FilAr"
],
"filament_diameter": [
"1.75"
],
"filament_density": [
"1.24"
],
"filament_flow_ratio": [
"0.98"
],
"nozzle_temperature": [
"200"
],
"nozzle_temperature_initial_layer": [
"205"
],
"nozzle_temperature_range_low": [
"195"
],
"nozzle_temperature_range_high": [
"210"
],
"hot_plate_temp": [
"60"
],
"hot_plate_temp_initial_layer": [
"60"
],
"textured_plate_temp": [
"60"
],
"textured_plate_temp_initial_layer": [
"60"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA-mate Amarillo",
"inherits": "FilAr PLA-mate @base",
"from": "system",
"filament_id": "FILAR0030",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#E8C547"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA-mate Azul",
"inherits": "FilAr PLA-mate @base",
"from": "system",
"filament_id": "FILAR0031",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#2D5DA8"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA-mate Beige",
"inherits": "FilAr PLA-mate @base",
"from": "system",
"filament_id": "FILAR0032",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#D8C4A0"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA-mate Blanco",
"inherits": "FilAr PLA-mate @base",
"from": "system",
"filament_id": "FILAR0033",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#F2F2EC"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA-mate Bordo",
"inherits": "FilAr PLA-mate @base",
"from": "system",
"filament_id": "FILAR0034",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#6E1A2B"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA-mate Celeste Cielo",
"inherits": "FilAr PLA-mate @base",
"from": "system",
"filament_id": "FILAR0035",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#9DC8E8"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA-mate Chocolate",
"inherits": "FilAr PLA-mate @base",
"from": "system",
"filament_id": "FILAR0036",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#4A2E22"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA-mate Gris",
"inherits": "FilAr PLA-mate @base",
"from": "system",
"filament_id": "FILAR0037",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#7E7E7E"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA-mate Marron",
"inherits": "FilAr PLA-mate @base",
"from": "system",
"filament_id": "FILAR0038",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#6B4226"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA-mate Naranja",
"inherits": "FilAr PLA-mate @base",
"from": "system",
"filament_id": "FILAR0039",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#E0662A"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA-mate Negro",
"inherits": "FilAr PLA-mate @base",
"from": "system",
"filament_id": "FILAR0040",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#1A1A1A"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA-mate Piel",
"inherits": "FilAr PLA-mate @base",
"from": "system",
"filament_id": "FILAR0041",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#E8C9A8"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA-mate Rojo",
"inherits": "FilAr PLA-mate @base",
"from": "system",
"filament_id": "FILAR0042",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#B5302E"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA-mate Rosa",
"inherits": "FilAr PLA-mate @base",
"from": "system",
"filament_id": "FILAR0043",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#E07A9B"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA-mate Uva",
"inherits": "FilAr PLA-mate @base",
"from": "system",
"filament_id": "FILAR0044",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#5B2A6B"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA-mate Verde",
"inherits": "FilAr PLA-mate @base",
"from": "system",
"filament_id": "FILAR0045",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#3A7D44"
]
}

View File

@@ -0,0 +1,14 @@
{
"type": "filament",
"name": "FilAr PLA-mate Violeta",
"inherits": "FilAr PLA-mate @base",
"from": "system",
"filament_id": "FILAR0046",
"instantiation": "true",
"filament_vendor": [
"FilAr"
],
"default_filament_colour": [
"#6B3FA0"
]
}

View File

@@ -1,6 +1,6 @@
{
"name": "Phrozen",
"version": "02.04.00.00",
"version": "02.04.00.01",
"force_update": "0",
"description": "Phrozen configurations",
"machine_model_list": [

View File

@@ -1,6 +1,6 @@
{
"name": "Prusa",
"version": "02.04.00.00",
"version": "02.04.00.01",
"force_update": "0",
"description": "Prusa configurations",
"machine_model_list": [

View File

@@ -0,0 +1,247 @@
#version 110
const vec3 ZERO = vec3(0.0, 0.0, 0.0);
const vec3 LightRed = vec3(0.78, 0.0, 0.0);
const vec3 LightBlue = vec3(0.73, 1.0, 1.0);
const float EPSILON = 0.0001;
#define INTENSITY_CORRECTION 0.6
#define PHONG_BRIGHTNESS 1.0
// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31)
const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929);
#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION)
#define LIGHT_TOP_SPECULAR (0.8 * INTENSITY_CORRECTION)
#define LIGHT_TOP_SHININESS 128.0
// normalized values for (1./1.43, 0.2/1.43, 1./1.43)
const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074);
#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION)
#define LIGHT_FRONT_SPECULAR (0.28 * INTENSITY_CORRECTION)
#define LIGHT_FRONT_SHININESS 64.0
#define INTENSITY_AMBIENT 0.22
#define WINDOW_REFLECTION_INTENSITY 0.55
struct PrintVolumeDetection
{
// 0 = rectangle, 1 = circle, 2 = custom, 3 = invalid
int type;
// type = 0 (rectangle):
// x = min.x, y = min.y, z = max.x, w = max.y
// type = 1 (circle):
// x = center.x, y = center.y, z = radius
vec4 xy_data;
// x = min z, y = max z
vec2 z_data;
};
struct SlopeDetection
{
bool actived;
float normal_z;
mat3 volume_world_normal_matrix;
};
uniform vec4 uniform_color;
uniform bool use_color_clip_plane;
uniform vec4 uniform_color_clip_plane_1;
uniform vec4 uniform_color_clip_plane_2;
uniform SlopeDetection slope;
//BBS: add outline_color
uniform bool is_outline;
uniform sampler2D depth_tex;
uniform vec2 screen_size;
#ifdef ENABLE_ENVIRONMENT_MAP
uniform sampler2D environment_tex;
uniform bool use_environment_tex;
#endif // ENABLE_ENVIRONMENT_MAP
uniform PrintVolumeDetection print_volume;
uniform float z_far;
uniform float z_near;
uniform bool enable_ssao;
varying vec3 clipping_planes_dots;
varying float color_clip_plane_dot;
varying vec4 world_pos;
varying float world_normal_z;
varying vec3 eye_normal;
varying vec3 eye_position;
vec3 getBackfaceColor(vec3 fill) {
float brightness = 0.2126 * fill.r + 0.7152 * fill.g + 0.0722 * fill.b;
return (brightness > 0.75) ? vec3(0.11, 0.165, 0.208) : vec3(0.988, 0.988, 0.988);
}
// Silhouette edge detection & rendering algorithm by leoneruggiero
// https://www.shadertoy.com/view/DslXz2
#define INFLATE 1
float GetTolerance(float d, float k)
{
float A = -(z_far+z_near)/(z_far-z_near);
float B = -2.0*z_far*z_near /(z_far-z_near);
d = d*2.0-1.0;
return -k*(d+A)*(d+A)/B;
}
float DetectSilho(vec2 fragCoord, vec2 dir)
{
float x0 = abs(texture2D(depth_tex, (fragCoord + dir*-2.0) / screen_size).r);
float x1 = abs(texture2D(depth_tex, (fragCoord + dir*-1.0) / screen_size).r);
float x2 = abs(texture2D(depth_tex, (fragCoord + dir* 0.0) / screen_size).r);
float x3 = abs(texture2D(depth_tex, (fragCoord + dir* 1.0) / screen_size).r);
float d0 = (x1-x0);
float d1 = (x2-x3);
float r0 = x1 + d0 - x2;
float r1 = x2 + d1 - x1;
float tol = GetTolerance(x2, 0.04);
return smoothstep(0.0, tol*tol, max( - r0*r1, 0.0));
}
float DetectSilho(vec2 fragCoord)
{
return max(
DetectSilho(fragCoord, vec2(1,0)),
DetectSilho(fragCoord, vec2(0,1))
);
}
float compute_ssao_factor(vec3 normal, vec3 view_dir, vec3 eye_pos)
{
vec3 normal_dx = dFdx(normal);
vec3 normal_dy = dFdy(normal);
float normal_variation = clamp(length(normal_dx) + length(normal_dy), 0.0, 1.0);
float depth_gradient = clamp(length(vec2(dFdx(eye_pos.z), dFdy(eye_pos.z))) * 0.8, 0.0, 1.0);
float cavity = clamp(normal_variation * 0.70 + depth_gradient * 0.60, 0.0, 1.0);
float cavity_mask = smoothstep(0.25, 0.75, cavity);
float ao_strength = pow(cavity, 1.15) * cavity_mask;
return clamp(1.0 - ao_strength * 0.90, 0.25, 1.0);
}
float soft_circle(vec2 p, vec2 center, float radius, float blur)
{
float dist = distance(p, center);
return 1.0 - smoothstep(radius - blur, radius, dist);
}
vec3 compute_window_reflection(vec3 normal, vec3 view_dir)
{
const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929);
vec3 light_dir = normalize(LIGHT_TOP_DIR);
vec3 reflect_light = normalize(reflect(-light_dir, normal));
// UV coordinates for the reflection
vec2 uv = (reflect_light.xy / (1.0 + max(reflect_light.z, 0.3))) * 2.2;
vec2 grad = fwidth(uv) * 0.8;
float blur = 0.12 + grad.x * 1.5;
// === CIRCULAR WINDOW (porthole style) ===
// Single round window, no bars
vec2 window_center = vec2(0.0, 0.0);
float window_radius = 0.5; // Radius of the circular window
float window_light = soft_circle(uv, window_center, window_radius, blur);
// No bars - just pure circular glass
float bars = 1.0;
// Fresnel effect for edge glow
float fresnel = pow(1.0 - max(dot(normal, view_dir), 0.0), 1.0);
float facing = smoothstep(-0.4, 0.6, reflect_light.z);
float intensity = window_light * bars * (0.25 + 0.25 * fresnel) * facing;
intensity = clamp(intensity, 0.0, 0.45);
return vec3(intensity);
}
void main()
{
if (any(lessThan(clipping_planes_dots, ZERO)))
discard;
vec4 color;
if (use_color_clip_plane) {
color.rgb = (color_clip_plane_dot < 0.0) ? uniform_color_clip_plane_1.rgb : uniform_color_clip_plane_2.rgb;
color.a = uniform_color.a;
}
else
color = uniform_color;
if (slope.actived) {
if(world_pos.z<0.1 && world_pos.z>-0.1)
{
color.rgb = LightBlue;
color.a = 0.8;
}
else if( world_normal_z < slope.normal_z - EPSILON)
{
color.rgb = color.rgb * 0.5 + LightRed * 0.5;
color.a = 0.8;
}
}
vec3 pv_check_min = ZERO;
vec3 pv_check_max = ZERO;
if (print_volume.type == 0) {
pv_check_min = world_pos.xyz - vec3(print_volume.xy_data.x, print_volume.xy_data.y, print_volume.z_data.x);
pv_check_max = world_pos.xyz - vec3(print_volume.xy_data.z, print_volume.xy_data.w, print_volume.z_data.y);
}
else if (print_volume.type == 1) {
float delta_radius = print_volume.xy_data.z - distance(world_pos.xy, print_volume.xy_data.xy);
pv_check_min = vec3(delta_radius, 0.0, world_pos.z - print_volume.z_data.x);
pv_check_max = vec3(0.0, 0.0, world_pos.z - print_volume.z_data.y);
}
color.rgb = (any(lessThan(pv_check_min, ZERO)) || any(greaterThan(pv_check_max, ZERO))) ? mix(color.rgb, ZERO, 0.3333) : color.rgb;
vec3 normal = normalize(eye_normal);
vec3 view_dir = normalize(-eye_position);
float NdotL_top = max(dot(normal, LIGHT_TOP_DIR), 0.0);
float diffuse = INTENSITY_AMBIENT + NdotL_top * LIGHT_TOP_DIFFUSE;
vec3 half_top = normalize(LIGHT_TOP_DIR + view_dir);
float specular = LIGHT_TOP_SPECULAR * pow(max(dot(normal, half_top), 0.0), LIGHT_TOP_SHININESS);
float NdotL_front = max(dot(normal, LIGHT_FRONT_DIR), 0.0);
diffuse += NdotL_front * LIGHT_FRONT_DIFFUSE;
vec3 half_front = normalize(LIGHT_FRONT_DIR + view_dir);
specular += LIGHT_FRONT_SPECULAR * pow(max(dot(normal, half_front), 0.0), LIGHT_FRONT_SHININESS);
vec3 window_reflection = compute_window_reflection(normal, view_dir);
// SSAO is applied in post-process pass. Keep base lighting unchanged here.
if (is_outline) {
vec3 shaded_rgb = (vec3(specular) + window_reflection + color.rgb * diffuse) * PHONG_BRIGHTNESS;
vec4 shaded_color = vec4(clamp(shaded_rgb, vec3(0.0), vec3(1.0)), color.a);
vec2 fragCoord = gl_FragCoord.xy;
float s = DetectSilho(fragCoord);
for(int i=1;i<=INFLATE; i++)
{
s = max(s, DetectSilho(fragCoord.xy + vec2(i, 0)));
s = max(s, DetectSilho(fragCoord.xy + vec2(0, i)));
}
gl_FragColor = vec4(mix(shaded_color.rgb, getBackfaceColor(shaded_color.rgb), s), shaded_color.a);
}
#ifdef ENABLE_ENVIRONMENT_MAP
else if (use_environment_tex)
gl_FragColor = vec4(clamp((0.45 * texture2D(environment_tex, normalize(eye_normal).xy * 0.5 + 0.5).xyz + window_reflection + 0.8 * color.rgb * diffuse) * PHONG_BRIGHTNESS, vec3(0.0), vec3(1.0)), color.a);
#endif
else
gl_FragColor = vec4(clamp((vec3(specular) + window_reflection + color.rgb * diffuse) * PHONG_BRIGHTNESS, vec3(0.0), vec3(1.0)), color.a);
}

View File

@@ -0,0 +1,54 @@
#version 110
const vec3 ZERO = vec3(0.0, 0.0, 0.0);
struct SlopeDetection
{
bool actived;
float normal_z;
mat3 volume_world_normal_matrix;
};
uniform mat4 view_model_matrix;
uniform mat4 projection_matrix;
uniform mat3 view_normal_matrix;
uniform mat4 volume_world_matrix;
uniform SlopeDetection slope;
// Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane.
uniform vec2 z_range;
// Clipping plane - general orientation. Used by the SLA gizmo.
uniform vec4 clipping_plane;
// Color clip plane - general orientation. Used by the cut gizmo.
uniform vec4 color_clip_plane;
attribute vec3 v_position;
attribute vec3 v_normal;
varying vec3 clipping_planes_dots;
varying float color_clip_plane_dot;
varying vec4 world_pos;
varying float world_normal_z;
varying vec3 eye_normal;
varying vec3 eye_position;
void main()
{
// First transform the normal into camera space and normalize the result.
eye_normal = normalize(view_normal_matrix * v_normal);
vec4 position = view_model_matrix * vec4(v_position, 1.0);
eye_position = position.xyz;
// Point in homogenous coordinates.
world_pos = volume_world_matrix * vec4(v_position, 1.0);
// z component of normal vector in world coordinate used for slope shading
world_normal_z = slope.actived ? (normalize(slope.volume_world_normal_matrix * v_normal)).z : 0.0;
gl_Position = projection_matrix * position;
// Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded.
clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z);
color_clip_plane_dot = dot(world_pos, color_clip_plane);
}

View File

@@ -0,0 +1,85 @@
#version 110
/**
* SSAO Shader - GLSL 110 version with highlight protection
* Preserves brightness on upward-facing surfaces (top areas)
*/
uniform sampler2D color_texture;
uniform sampler2D depth_texture;
uniform sampler2D normal_texture;
uniform vec2 inv_tex_size;
uniform float z_near;
uniform float z_far;
varying vec2 tex_coord;
float linearize_depth(float depth)
{
float z = depth * 2.0 - 1.0;
return (2.0 * z_near * z_far) / (z_far + z_near - z * (z_far - z_near));
}
void main()
{
vec3 base = texture2D(color_texture, tex_coord).rgb;
float depth_center = linearize_depth(texture2D(depth_texture, tex_coord).r);
// Sample normal at current fragment (range: -1 to 1)
vec3 normal_center = texture2D(normal_texture, tex_coord).rgb * 2.0 - 1.0;
// Calculate how much the surface faces upward
// up_factor = 1.0 for surfaces pointing straight up (0,0,1)
// up_factor = 0.0 for surfaces pointing down or sideways
float up_factor = max(0.0, normal_center.z); // Assuming Z is up axis
// Alternative: if Y is up, use normal_center.y
// Adaptive sampling radius
float radius = mix(2.0, 4.0, depth_center / z_far);
vec2 offsets[8];
offsets[0] = vec2( 1.0, 0.0);
offsets[1] = vec2( 0.707, 0.707);
offsets[2] = vec2( 0.0, 1.0);
offsets[3] = vec2(-0.707, 0.707);
offsets[4] = vec2(-1.0, 0.0);
offsets[5] = vec2(-0.707,-0.707);
offsets[6] = vec2( 0.0, -1.0);
offsets[7] = vec2( 0.707,-0.707);
float occlusion = 0.0;
int valid_samples = 0;
for (int i = 0; i < 8; ++i) {
vec2 uv = tex_coord + offsets[i] * inv_tex_size * radius;
uv = clamp(uv, vec2(0.001), vec2(0.999));
float sample_depth = linearize_depth(texture2D(depth_texture, uv).r);
float depth_diff = max(0.0, depth_center - sample_depth);
float threshold = 0.015 * (0.5 + depth_center / z_far);
float contribution = smoothstep(0.001, threshold, depth_diff);
float diagonal_weight = 1.0 - abs(offsets[i].x * offsets[i].y) * 0.5;
occlusion += contribution * diagonal_weight;
valid_samples++;
}
if (valid_samples > 0)
occlusion /= float(valid_samples);
// flatter/top-like surfaces get less darkening
float ao_intensity = 0.55;
float ambient_occlusion = 1.0 - occlusion * ao_intensity;
// Different min values for top vs bottom surfaces
float ao_min = mix(0.45, 0.70, up_factor); // Bottom: 0.45, Top: 0.70
ambient_occlusion = clamp(ambient_occlusion, ao_min, 1.0);
// Boost brightness on top surfaces (optional)
float brightness_boost = 1.0 + up_factor * 0.15; // 15% extra brightness on top
ambient_occlusion = pow(ambient_occlusion, 2.2) * brightness_boost;
ambient_occlusion = clamp(ambient_occlusion, 0.45, 1.05);
gl_FragColor = vec4(base * ambient_occlusion, 1.0);
}

View File

@@ -0,0 +1,15 @@
#version 110
uniform mat4 view_model_matrix;
uniform mat4 projection_matrix;
attribute vec3 v_position;
attribute vec2 v_tex_coord;
varying vec2 tex_coord;
void main()
{
tex_coord = v_tex_coord;
gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0);
}

View File

@@ -0,0 +1,250 @@
#version 140
const vec3 ZERO = vec3(0.0, 0.0, 0.0);
const vec3 LightRed = vec3(0.78, 0.0, 0.0);
const vec3 LightBlue = vec3(0.73, 1.0, 1.0);
const float EPSILON = 0.0001;
#define INTENSITY_CORRECTION 0.6
#define PHONG_BRIGHTNESS 1.0
// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31)
const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929);
#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION)
#define LIGHT_TOP_SPECULAR (0.8 * INTENSITY_CORRECTION)
#define LIGHT_TOP_SHININESS 128.0
// normalized values for (1./1.43, 0.2/1.43, 1./1.43)
const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074);
#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION)
#define LIGHT_FRONT_SPECULAR (0.28 * INTENSITY_CORRECTION)
#define LIGHT_FRONT_SHININESS 64.0
#define INTENSITY_AMBIENT 0.22
#define WINDOW_REFLECTION_INTENSITY 0.55
struct PrintVolumeDetection
{
// 0 = rectangle, 1 = circle, 2 = custom, 3 = invalid
int type;
// type = 0 (rectangle):
// x = min.x, y = min.y, z = max.x, w = max.y
// type = 1 (circle):
// x = center.x, y = center.y, z = radius
vec4 xy_data;
// x = min z, y = max z
vec2 z_data;
};
struct SlopeDetection
{
bool actived;
float normal_z;
mat3 volume_world_normal_matrix;
};
uniform vec4 uniform_color;
uniform bool use_color_clip_plane;
uniform vec4 uniform_color_clip_plane_1;
uniform vec4 uniform_color_clip_plane_2;
uniform SlopeDetection slope;
//BBS: add outline_color
uniform bool is_outline;
uniform sampler2D depth_tex;
uniform vec2 screen_size;
#ifdef ENABLE_ENVIRONMENT_MAP
uniform sampler2D environment_tex;
uniform bool use_environment_tex;
#endif // ENABLE_ENVIRONMENT_MAP
uniform PrintVolumeDetection print_volume;
uniform float z_far;
uniform float z_near;
uniform bool enable_ssao;
in vec3 clipping_planes_dots;
in float color_clip_plane_dot;
in vec4 world_pos;
in float world_normal_z;
in vec3 eye_normal;
in vec3 eye_position;
out vec4 out_color;
vec3 getBackfaceColor(vec3 fill) {
float brightness = 0.2126 * fill.r + 0.7152 * fill.g + 0.0722 * fill.b;
return (brightness > 0.75) ? vec3(0.11, 0.165, 0.208) : vec3(0.988, 0.988, 0.988);
}
// Silhouette edge detection & rendering algorithm by leoneruggiero
// https://www.shadertoy.com/view/DslXz2
#define INFLATE 1
float GetTolerance(float d, float k)
{
float A=- (z_far+z_near)/(z_far-z_near);
float B=-2.0*z_far*z_near /(z_far-z_near);
d = d*2.0-1.0;
return -k*(d+A)*(d+A)/B;
}
float DetectSilho(vec2 fragCoord, vec2 dir)
{
float x0 = abs(texture(depth_tex, (fragCoord + dir*-2.0) / screen_size).r);
float x1 = abs(texture(depth_tex, (fragCoord + dir*-1.0) / screen_size).r);
float x2 = abs(texture(depth_tex, (fragCoord + dir* 0.0) / screen_size).r);
float x3 = abs(texture(depth_tex, (fragCoord + dir* 1.0) / screen_size).r);
float d0 = (x1-x0);
float d1 = (x2-x3);
float r0 = x1 + d0 - x2;
float r1 = x2 + d1 - x1;
float tol = GetTolerance(x2, 0.04);
return smoothstep(0.0, tol*tol, max( - r0*r1, 0.0));
}
float DetectSilho(vec2 fragCoord)
{
return max(
DetectSilho(fragCoord, vec2(1,0)),
DetectSilho(fragCoord, vec2(0,1))
);
}
float compute_ssao_factor(vec3 normal, vec3 view_dir, vec3 eye_pos)
{
vec3 normal_dx = dFdx(normal);
vec3 normal_dy = dFdy(normal);
float normal_variation = clamp(length(normal_dx) + length(normal_dy), 0.0, 1.0);
float depth_gradient = clamp(length(vec2(dFdx(eye_pos.z), dFdy(eye_pos.z))) * 0.8, 0.0, 1.0);
float cavity = clamp(normal_variation * 0.70 + depth_gradient * 0.60, 0.0, 1.0);
float cavity_mask = smoothstep(0.25, 0.75, cavity);
float ao_strength = pow(cavity, 1.15) * cavity_mask;
return clamp(1.0 - ao_strength * 0.90, 0.25, 1.0);
}
float soft_circle(vec2 p, vec2 center, float radius, float blur)
{
float dist = distance(p, center);
return 1.0 - smoothstep(radius - blur, radius, dist);
}
vec3 compute_window_reflection(vec3 normal, vec3 view_dir)
{
const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929);
vec3 light_dir = normalize(LIGHT_TOP_DIR);
vec3 reflect_light = normalize(reflect(-light_dir, normal));
// UV coordinates for the reflection
vec2 uv = (reflect_light.xy / (1.0 + max(reflect_light.z, 0.3))) * 2.2;
vec2 grad = fwidth(uv) * 0.8;
float blur = 0.12 + grad.x * 1.5;
// === CIRCULAR WINDOW (porthole style) ===
// Single round window, no bars
vec2 window_center = vec2(0.0, 0.0);
float window_radius = 0.5; // Radius of the circular window
float window_light = soft_circle(uv, window_center, window_radius, blur);
// No bars - just pure circular glass
float bars = 1.0;
// Fresnel effect for edge glow
float fresnel = pow(1.0 - max(dot(normal, view_dir), 0.0), 1.0);
float facing = smoothstep(-0.4, 0.6, reflect_light.z);
float intensity = window_light * bars * (0.25 + 0.25 * fresnel) * facing;
intensity = clamp(intensity, 0.0, 0.45);
return vec3(intensity);
}
void main()
{
if (any(lessThan(clipping_planes_dots, ZERO)))
discard;
vec4 color;
if (use_color_clip_plane) {
color.rgb = (color_clip_plane_dot < 0.0) ? uniform_color_clip_plane_1.rgb : uniform_color_clip_plane_2.rgb;
color.a = uniform_color.a;
}
else
color = uniform_color;
if (slope.actived) {
if(world_pos.z<0.1&&world_pos.z>-0.1)
{
color.rgb = LightBlue;
color.a = 0.8;
}
else if( world_normal_z < slope.normal_z - EPSILON)
{
color.rgb = color.rgb * 0.5 + LightRed * 0.5;
color.a = 0.8;
}
}
vec3 pv_check_min = ZERO;
vec3 pv_check_max = ZERO;
if (print_volume.type == 0) {
pv_check_min = world_pos.xyz - vec3(print_volume.xy_data.x, print_volume.xy_data.y, print_volume.z_data.x);
pv_check_max = world_pos.xyz - vec3(print_volume.xy_data.z, print_volume.xy_data.w, print_volume.z_data.y);
}
else if (print_volume.type == 1) {
float delta_radius = print_volume.xy_data.z - distance(world_pos.xy, print_volume.xy_data.xy);
pv_check_min = vec3(delta_radius, 0.0, world_pos.z - print_volume.z_data.x);
pv_check_max = vec3(0.0, 0.0, world_pos.z - print_volume.z_data.y);
}
color.rgb = (any(lessThan(pv_check_min, ZERO)) || any(greaterThan(pv_check_max, ZERO))) ? mix(color.rgb, ZERO, 0.3333) : color.rgb;
vec3 normal = normalize(eye_normal);
vec3 view_dir = normalize(-eye_position);
float NdotL_top = max(dot(normal, LIGHT_TOP_DIR), 0.0);
float diffuse = INTENSITY_AMBIENT + NdotL_top * LIGHT_TOP_DIFFUSE;
vec3 half_top = normalize(LIGHT_TOP_DIR + view_dir);
float specular = LIGHT_TOP_SPECULAR * pow(max(dot(normal, half_top), 0.0), LIGHT_TOP_SHININESS);
float NdotL_front = max(dot(normal, LIGHT_FRONT_DIR), 0.0);
diffuse += NdotL_front * LIGHT_FRONT_DIFFUSE;
vec3 half_front = normalize(LIGHT_FRONT_DIR + view_dir);
specular += LIGHT_FRONT_SPECULAR * pow(max(dot(normal, half_front), 0.0), LIGHT_FRONT_SHININESS);
vec3 window_reflection = compute_window_reflection(normal, view_dir);
// SSAO is applied in post-process pass. Keep base lighting unchanged here.
if (is_outline) {
vec3 shaded_rgb = (vec3(specular) + window_reflection + color.rgb * diffuse) * PHONG_BRIGHTNESS;
vec4 shaded_color = vec4(clamp(shaded_rgb, vec3(0.0), vec3(1.0)), color.a);
vec2 fragCoord = gl_FragCoord.xy;
float s = DetectSilho(fragCoord);
for(int i=1;i<=INFLATE; i++)
{
s = max(s, DetectSilho(fragCoord.xy + vec2(i, 0)));
s = max(s, DetectSilho(fragCoord.xy + vec2(0, i)));
}
out_color = vec4(mix(shaded_color.rgb, getBackfaceColor(shaded_color.rgb), s), shaded_color.a);
}
#ifdef ENABLE_ENVIRONMENT_MAP
else if (use_environment_tex)
out_color = vec4(clamp((0.45 * texture(environment_tex, normalize(eye_normal).xy * 0.5 + 0.5).xyz + window_reflection + 0.8 * color.rgb * diffuse) * PHONG_BRIGHTNESS, vec3(0.0), vec3(1.0)), color.a);
#endif
else
out_color = vec4(clamp((vec3(specular) + window_reflection + color.rgb * diffuse) * PHONG_BRIGHTNESS, vec3(0.0), vec3(1.0)), color.a);
}

View File

@@ -0,0 +1,54 @@
#version 140
const vec3 ZERO = vec3(0.0, 0.0, 0.0);
struct SlopeDetection
{
bool actived;
float normal_z;
mat3 volume_world_normal_matrix;
};
uniform mat4 view_model_matrix;
uniform mat4 projection_matrix;
uniform mat3 view_normal_matrix;
uniform mat4 volume_world_matrix;
uniform SlopeDetection slope;
// Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane.
uniform vec2 z_range;
// Clipping plane - general orientation. Used by the SLA gizmo.
uniform vec4 clipping_plane;
// Color clip plane - general orientation. Used by the cut gizmo.
uniform vec4 color_clip_plane;
in vec3 v_position;
in vec3 v_normal;
out vec3 clipping_planes_dots;
out float color_clip_plane_dot;
out vec4 world_pos;
out float world_normal_z;
out vec3 eye_normal;
out vec3 eye_position;
void main()
{
// First transform the normal into camera space and normalize the result.
eye_normal = normalize(view_normal_matrix * v_normal);
vec4 position = view_model_matrix * vec4(v_position, 1.0);
eye_position = position.xyz;
// Point in homogenous coordinates.
world_pos = volume_world_matrix * vec4(v_position, 1.0);
// z component of normal vector in world coordinate used for slope shading
world_normal_z = slope.actived ? (normalize(slope.volume_world_normal_matrix * v_normal)).z : 0.0;
gl_Position = projection_matrix * position;
// Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded.
clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z);
color_clip_plane_dot = dot(world_pos, color_clip_plane);
}

View File

@@ -0,0 +1,103 @@
#version 140
/**
* SSAO Shader - GLSL 140 version with sharp depth threshold
* Only darkens valleys/concave areas, ignores smooth variations
*/
uniform sampler2D color_texture;
uniform sampler2D depth_texture;
uniform sampler2D normal_texture;
uniform float z_near;
uniform float z_far;
in vec2 tex_coord;
out vec4 frag_color;
float linearize_depth(float depth)
{
float z = depth * 2.0 - 1.0;
return (2.0 * z_near * z_far) / (z_far + z_near - z * (z_far - z_near));
}
void main()
{
ivec2 pixel = ivec2(gl_FragCoord.xy);
float center_depth = linearize_depth(texelFetch(depth_texture, pixel, 0).r);
// Sample normal buffer (stored as RGB in 0-1 range, convert to -1 to 1)
vec3 normal_center = texelFetch(normal_texture, pixel, 0).rgb * 2.0 - 1.0;
normal_center = normalize(normal_center);
// Calculate upward-facing factor (Z-up coordinate system)
float up_factor = clamp(normal_center.z * 1.5, 0.0, 1.0);
// Adaptive radius in pixel space
int radius = int(mix(2.0, 4.0, center_depth / z_far));
// Optimized sampling pattern
const ivec2 offsets[12] = ivec2[](
ivec2(1, 0), ivec2(-1, 0), ivec2(0, 1), ivec2(0, -1),
ivec2(1, 1), ivec2(-1, 1), ivec2(1, -1), ivec2(-1, -1),
ivec2(2, 0), ivec2(-2, 0), ivec2(0, 2), ivec2(0, -2)
);
float occlusion = 0.0;
int valid_samples = 0;
for (int i = 0; i < 12; i++) {
ivec2 sample_pixel = pixel + offsets[i] * radius;
if (sample_pixel.x < 0 || sample_pixel.y < 0)
continue;
float sample_depth = linearize_depth(texelFetch(depth_texture, sample_pixel, 0).r);
// Sample normal at neighbor
vec3 normal_sample = texelFetch(normal_texture, sample_pixel, 0).rgb * 2.0 - 1.0;
// Depth difference (positive if neighbor is closer to camera)
float depth_diff = center_depth - sample_depth;
// Sharp depth threshold ===
// Minimum depth difference to consider occlusion (ignores small variations)
float threshold_min = 0.008; // Higher = only deep valleys get darkened
float threshold_max = 0.04; // Transition range for full occlusion
float contribution = 0.0;
if (depth_diff > threshold_min) {
// Abrupt mapping with power curve
contribution = (depth_diff - threshold_min) / (threshold_max - threshold_min);
contribution = clamp(contribution, 0.0, 1.0);
contribution = pow(contribution, 2.0); // Steeper curve for sharper transition
}
// Reduce occlusion on planar surfaces (similar normals)
float normal_similarity = dot(normal_center, normal_sample);
float planar_factor = smoothstep(0.75, 0.95, normal_similarity);
contribution *= (1.0 - planar_factor * 0.6);
occlusion += contribution;
valid_samples++;
}
if (valid_samples > 0) {
// Calculate ambient occlusion factor with higher base intensity
float ao_factor = 1.0 - (occlusion / float(valid_samples)) * 0.6;
// Keep bright areas clean (higher minimum for upward-facing surfaces)
float ao_min = mix(0.55, 0.85, up_factor);
ao_factor = clamp(ao_factor, ao_min, 1.0);
// Slight brightness boost for upward-facing surfaces
float brightness_boost = 1.0 + up_factor * 0.15;
ao_factor = ao_factor * brightness_boost;
occlusion = ao_factor;
} else {
occlusion = 1.0;
}
vec3 color = texture(color_texture, tex_coord).rgb;
frag_color = vec4(color * occlusion, 1.0);
}

View File

@@ -0,0 +1,15 @@
#version 140
uniform mat4 view_model_matrix;
uniform mat4 projection_matrix;
in vec3 v_position;
in vec2 v_tex_coord;
out vec2 tex_coord;
void main()
{
tex_coord = v_tex_coord;
gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0);
}

View File

@@ -1,470 +1 @@
#Content
{
overflow-y:auto;
padding: 0 10px 0 20px; /* ORCA Specify & Reduce horizontal paddings to fit 4 items per row */
height: 100%;
}
.OneVendorBlock {
position: relative;
margin-bottom: 7px;
}
.OneVendorBlock:last-of-type {
margin-bottom: 36px;
}
.BlockBanner
{
position: sticky;
top: 0;
left: 0;
padding: 0px;
border-bottom: 2px solid var(--main-color);
width: 100%;
display: flex;
align-items: center;
z-index: 100;
background-color: var(--bg-color-secondary);
box-sizing: border-box;
}
.BannerBtns
{
display: flex;
white-space: nowrap;
justify-content: space-around;
align-items: center;
text-align: center;
margin-right: 5px; /* ORCA align buttons with end of horizontal separator/line */
margin-left: auto;
}
.BlockBanner a
{
line-height: 30px;
height: 30px;
font-size: 17px;
font-weight: 600;
padding: 0px 10px;
color: var(--fg-color-text);
}
.BlockBanner .modelCount {
margin: 0 15px 0 auto;
font-size: 14px;
line-height: 14px;
height: 15px;
color: var(--fg-color-label);
}
.VendorCheckbox {
transform: scale(1.3);
}
.PrinterArea
{
padding: 7px 0px; /* ORCA Reduce horizontal paddings to fit 4 items per row */
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 7px;
}
.PrinterBlock
{
display: flex;
align-items: center;
text-align: center;
flex-direction: column;
gap:10px;
padding: 15px 10px 10px 10px;
background-color: var(--bg-color-secondary);
position: relative;
border: 1px solid transparent
}
.PrinterBlock:hover {
background-color: var(--focus-bg-item);
border-color:var(--main-color);
}
.PImg {
width:120px; /* ORCA use covers as 120x120px but use source file as 240x240 for better quality on hidpi */
height:120px; /* ORCA fit image to fill frame */
}
.PrinterInfo,
.PrinterInfoMark {
position: absolute;
right: 4px;
top: 4px;
opacity: 0;
border-radius: 11px;
line-height: 19px;
font-size: 14px;
}
.PrinterInfo {
--card-animation-delay: .8s; /* open info with delay on list / compact view to prevent them appear while mouse movements */
--card-info-height: fit-content;
left: 4px;
width: auto;
z-index: 9998;
height: var(--card-info-height);
border-color: var(--border-color);
background: var(--bg-color);
padding: 10px;
text-align: left;
color: var(--fg-color-text);
pointer-events: none;
}
#Content[layout="2"] .PrinterInfo {
--card-animation-delay: .3s;
--card-info-height: 116px;
}
.PrinterInfo .title {font-weight: 700}
.PrinterInfo .value {font-weight: 400}
.PrinterInfoMark:hover + .PrinterInfo {
animation: infoCard 0s forwards var(--card-animation-delay);
}
@keyframes infoCard {100% {
opacity: 1;
box-shadow: 0 5px 10px rgba(0,0,0,.2);
}}
.PrinterInfoMark {
width: 20px;
height: 20px;
background: var(--main-color);
border: 1px solid var(--main-color);
z-index: 9999;
color: #FFF;
text-align: center;
}
.PrinterBlock:hover .PrinterInfoMark {
opacity: 1;
}
.PrinterBlock:hover .PrinterInfoMark:hover {
background: var(--main-color-hover);
}
.ModelCheckBox
{
position: absolute;
height: 6px;
bottom: 0;
left: 10%;
width: 80%;
background: var(--button-bg-hover)
}
.ModelCheckBox.ModelCheckBoxSelected
{
background: var(--main-color-fixed)
}
img.ModelThumbnail
{
width: 100%;
height: 100%;
}
.PName
{
font-weight: 600;
line-height: 20px; /* ORCA */
text-align: center;
width: 100%;
color: var(--fg-color-text);
}
.pNozzel
{
display: none;
align-items: center;
justify-content:flex-start;
color: #5A5A5A;
padding-left: 0px; /* ORCA Align checkboxes with with model text */
}
.pNozzel input
{
vertical-align: middle;
margin-right: 5px;
}
.LayoutSelector {
position: absolute;
right:21px;
top:14px;
}
.LayoutSelector .TabGroup {
display: flex;
padding: 2px;
gap: 2px;
border-radius: 6px;
background-color: var(--bg-color-alt);
}
.LayoutSelector .icon16 {
opacity: .8;
}
.LayoutSelector .TabButton {
padding: 7px;
border-radius: 4px;
}
.LayoutSelector .TabButton.selected {background: var(--main-color)}
.LayoutSelector .TabButton.selected:hover {background: var(--main-color-hover)}
.LayoutSelector .TabButton.selected .icon16 {background: #FFF}
.LayoutSelector .TabButton:nth-of-type(1) .icon16 {--icon-url: var(--icon-layout-list)}
.LayoutSelector .TabButton:nth-of-type(2) .icon16 {--icon-url: var(--icon-layout-compact)}
.LayoutSelector .TabButton:nth-of-type(3) .icon16 {--icon-url: var(--icon-layout-cover)}
/* LAYOUT */
#Content[layout="compact-list"] .PrinterArea {
grid-template-columns: repeat(4, 1fr);
}
#Content[layout="compact-list"] .PImg {
display: none;
}
#Content[layout="compact-list"] .OneVendorBlock {
margin-bottom: 15px;
}
#Content[layout="compact-cover"] .PrinterArea {
grid-template-columns: repeat(3, 1fr);
}
#Content[layout="compact-cover"] .PImg {
width: 60px;
min-width: 60px;
height: 60px;
}
#Content[layout|="compact"] .PName {
text-align: left;
}
#Content[layout|="compact"] .PrinterBlock {
flex-direction: row;
padding: 5px 5px 5px 18px;
}
#Content[layout|="compact"] .ModelCheckBox {
width: 6px;
height: 80%;
left:0;
top:10%
}
#Content[layout|="compact"] .OneVendorBlock:last-of-type {
margin-bottom: 0px;
}
/*-----Notice-----*/
#NoticeMask
{
background-color: #000;
position: absolute;
top: 0px;
left: 0px;
right: 0px;
bottom: 0px;
opacity: 0.05;
display: none;
}
#NoticeBody
{
display: none;
width: 400px;
border-width: 1px;
border-style: solid;
border-radius: 4px;
background-color: inherit;
position: absolute;
left: 50%;
top: 200px;
margin-left: -200px;
}
#NoticeBar
{
background-color:#00f0d8;
height: 40px;
line-height: 40px;
color: #fff;
text-align: center;
}
#NoticeContent
{
padding: 4mm 10mm;
}
#NoticeBtns
{
margin-top: 4mm;
display: flex;
justify-content:flex-end;
}
.search {
position: absolute;
left:66px;
top: 14px;
width: 34px;
height: 34px;
z-index: 99;
overflow: hidden;
}
.search:focus-within,
.search[hasvalue="1"] {
width: calc(100% - 194px);
}
.searchTerm {
width: 100%;
height: 100%;
padding: 4px 5px;
border-radius: 6px;
outline: none;
box-sizing: border-box;
background: var(--button-bg-normal);
border: 1px solid var(--button-bg-normal);
}
@media (prefers-reduced-motion: no-preference) {
.searchTerm {
transition: background-color .2s
}
}
.searchTerm,
.search-placeholder {
line-height: 24px; /* ORCA center text vertically */
font-size: 14px;
}
.search:focus-within .searchTerm,
.search[hasvalue="1"] .searchTerm {
padding-left:33px;
background: var(--bg-color);
border-color: var(--main-color);
}
.search[hasvalue="1"]:not(:focus-within, :hover) .searchTerm {
border-color: var(--border-color);
}
.search:not(:focus-within, [hasvalue="1"]) .searchTerm {
cursor: default;
}
.search:not(:focus-within, [hasvalue="1"]) .searchTerm:hover {
background: var(--button-bg-hover);
}
.search-placeholder {
color: var(--fg-color-disabled);
left: 33px;
}
.searchTerm:not(:placeholder-shown) + .search-placeholder {
opacity: 0;
}
.search-icon,
.search-placeholder {
position: absolute;
top: 50%;
transform: translateY(-50%);
pointer-events: none;
}
.search-icon {
left: 9px;
--icon-url: var(--icon-search);
}
.SidebarBtn {
position: absolute;
left: 20px;
top: 14px;
padding: 9px;
border-radius: 6px;
}
.SidebarBtn .icon16 {
--icon-url: var(--icon-sidebar);
}
#SidebarContainer {
position: absolute;
top: 0;
left: -240px;
right: 0;
height: 100%;
z-index: 999999;
display: flex;
pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
#SidebarContainer {
transition: background-color .2s, left .2s
}
}
#SidebarContainer[open="1"] {
left: 0px;
pointer-events: all;
background: rgba(0,0,0,.3);
}
#Sidebar {
flex: 0 0 220px;
background: var(--bg-color);
box-shadow: 5px 0 20px rgba(0,0,0,.2);
padding: 15px 0;
overflow-y: auto;
}
#Sidebar .title {
font-size: 17px;
line-height: 17px;
font-weight: 600;
padding: 0 0 5px 20px;
}
#Sidebar .SidebarItem {
width: 100%;
padding: 2px 10px 2px 20px;
color:var(--fg-color-text);
font-size: 14px;
border: 1px solid transparent;
box-sizing: border-box;
}
#Sidebar .SidebarItem:hover {
border-color: var(--main-color);
}
#SidebarContainer .back {
flex: 1;
}
/* UNIQUE STYLES */

View File

@@ -1,395 +1,15 @@
// UNIQUE FUNCTIONS
// Keep in here for future additions
function OnInit()
{
//let strInput=JSON.stringify(cData);
//HandleModelList(cData);
TranslatePage();
RequestProfile();
}
function RequestProfile()
{
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="request_userguide_profile";
SendWXMessage( JSON.stringify(tSend) );
}
function HandleStudio( pVal )
{
// alert(strInput);
// alert(JSON.stringify(strInput));
//
// let pVal=IsJson(strInput);
// if(pVal==null)
// {
// alert("Msg Format Error is not Json");
// return;
// }
let strCmd=pVal['command'];
//alert(strCmd);
if(strCmd=='response_userguide_profile')
{
HandleModelList(pVal['response']);
}
}
function ShowPrinterThumb(pItem, strImg)
{
$(pItem).attr('src',strImg);
$(pItem).attr('onerror',null);
}
function ChooseModel( vendor, ModelName )
{
let ChooseItem=$(".ModelCheckBox[vendor='"+vendor+"'][model='"+ModelName+"']");
if(ChooseItem!=null)
{
if( $(ChooseItem).hasClass('ModelCheckBoxSelected') )
$(ChooseItem).removeClass('ModelCheckBoxSelected');
else
$(ChooseItem).addClass('ModelCheckBoxSelected');
SetModelSelect(vendor, ModelName, $(ChooseItem).hasClass('ModelCheckBoxSelected'));
}
}
function HandleModelList( pVal )
{
if( !pVal.hasOwnProperty("model") )
return;
pModel=pVal['model'];
// ORCA ensure list correctly ordered
pModel = pModel.sort((a, b)=>(a["vendor"].localeCompare(b["vendor"])))
pModel = [ // move custom printers to top
...pModel.filter(i=>i.vendor === "Custom"),
...pModel.filter(i=>i.vendor !== "Custom")
];
let nTotal=pModel.length;
let ModelHtml={};
for(let n=0;n<nTotal;n++)
{
let OneModel=pModel[n];
let strVendor=OneModel['vendor'];
//Add Vendor Html Node
if($(".OneVendorBlock[vendor='"+strVendor+"']").length==0)
{
let sVV=strVendor;
if( sVV=="BBL" )
sVV="Bambu Lab";
if( sVV=="Custom")
sVV="Custom Printer";
if( sVV=="Other")
sVV="Orca colosseum";
let HtmlNewVendor='<div class="OneVendorBlock" Vendor="'+strVendor+'">'+
'<div class="BlockBanner">'+
' <a>'+sVV+'</a>'+
' <div class="BannerBtns" onClick="ChooseVendor('+"\'"+strVendor+"\'"+')">'+
' <div class="modelCount"></div>' +
' <input type="checkbox" class="VendorCheckbox"/>'+
' </div>'+
//' <div class="BannerBtns">'+
//' <div class="ButtonStyleConfirm ButtonTypeWindow trans" tid="t11" onClick="SelectPrinterAll('+"\'"+strVendor+"\'"+')">all</div>'+
//' <div class="ButtonStyleRegular ButtonTypeWindow trans" tid="t12" onClick="SelectPrinterNone('+"\'"+strVendor+"\'"+')">none</div>'+
//' </div>'+
'</div>'+
'<div class="PrinterArea"> '+
'</div>'+
'</div>';
$('#Content').append(HtmlNewVendor);
}
let ModelName=OneModel['model'];
//Collect Html Node Nozzel Html
if( !ModelHtml.hasOwnProperty(strVendor))
ModelHtml[strVendor]='';
ModelHtml[strVendor]+=CreatePrinterBlock(OneModel); // ORCA
}
//Update Nozzel Html Append
for( let key in ModelHtml )
{
$(".OneVendorBlock[vendor='"+key+"'] .PrinterArea").append( ModelHtml[key] );
}
//Update Checkbox
for(let m=0;m<nTotal;m++)
{
let OneModel=pModel[m];
let SelectList=OneModel['nozzle_selected'];
if(SelectList!='')
{
ChooseModel(OneModel['vendor'], OneModel['model']);
}
}
const $SidebarVendors = $('#SidebarVendors');
let SidebarHTML = "";
$(`.OneVendorBlock`).each((i, el)=>{
UpdateVendorCheckbox(el.getAttribute("vendor"));
SidebarHTML +=`<div class="SidebarItem" onclick="scrollToVendor(this.textContent)">${el.getAttribute('vendor')}</div>`;
});
$SidebarVendors.html(SidebarHTML)
// let AlreadySelect=$(".ModelCheckBoxSelected");
// let nSelect=AlreadySelect.length;
// if(nSelect==0)
// {
// $("div.OneVendorBlock[vendor='"+BBL+"'] .ModelCheckBox").addClass('ModelCheckBoxSelected');
// }
TranslatePage();
}
function scrollToVendor(vendor) {
const el = $(".OneVendorBlock[vendor='"+vendor+"']")[0];
if (el){
document.getElementById('SidebarContainer').setAttribute('open', '0');
document.getElementById('Content').scrollTo({top: el.offsetTop, behavior: "smooth"});
}
}
function SetModelSelect(vendor, model, checked) {
if (!ModelNozzleSelected.hasOwnProperty(vendor) && !checked) {
return;
}
if (!ModelNozzleSelected.hasOwnProperty(vendor) && checked) {
ModelNozzleSelected[vendor] = {};
}
let oVendor = ModelNozzleSelected[vendor];
if (oVendor.hasOwnProperty(model) || checked) {
oVendor[model] = checked;
}
UpdateVendorCheckbox(vendor)
}
function GetModelSelect(vendor, model) {
if (!ModelNozzleSelected.hasOwnProperty(vendor)) {
return false;
}
let oVendor = ModelNozzleSelected[vendor];
if (!oVendor.hasOwnProperty(model)) {
return false;
}
return oVendor[model];
}
function FilterModelList(keyword) {
//Save checkbox state
let ModelSelect = $('.ModelCheckBox');
for (let n = 0; n < ModelSelect.length; n++) {
let OneItem = ModelSelect[n];
let strModel = OneItem.getAttribute("model");
let strVendor = OneItem.getAttribute("vendor");
SetModelSelect(strVendor, strModel, $(OneItem).hasClass('ModelCheckBoxSelected'));
}
$('.search')[0].setAttribute("hasvalue", keyword ? "1" : "0")
let nTotal = pModel.length;
let ModelHtml = {};
let kwSplit = keyword.toLowerCase().match(/\S+/g) || [];
$('#Content').empty();
for (let n = 0; n < nTotal; n++) {
let OneModel = pModel[n];
let strVendor = OneModel['vendor'];
let search = (OneModel['name'] + '\0' + strVendor).toLowerCase();
if (!kwSplit.every(s => search.includes(s)))
continue;
//Add Vendor Html Node
if ($(".OneVendorBlock[vendor='" + strVendor + "']").length == 0) {
let sVV = strVendor;
if (sVV == "BBL")
sVV = "Bambu Lab";
if (sVV == "Custom")
sVV = "Custom Printer";
if (sVV == "Other")
sVV = "Orca colosseum";
let HtmlNewVendor = '<div class="OneVendorBlock" Vendor="' + strVendor + '">' +
'<div class="BlockBanner">' +
' <a>' + sVV + '</a>' +
' <div class="BannerBtns" onClick="ChooseVendor('+"\'"+strVendor+"\'"+')">'+
' <div class="modelCount"></div>' +
' <input type="checkbox" class="VendorCheckbox"/>'+
' </div>'+
//' <div class="BannerBtns">' +
//' <div class="ButtonStyleConfirm ButtonTypeWindow trans" tid="t11" onClick="SelectPrinterAll(' + "\'" + strVendor + "\'" + ')">all</div>' +
//' <div class="ButtonStyleRegular ButtonTypeWindow trans" tid="t12" onClick="SelectPrinterNone(' + "\'" + strVendor + "\'" + ')">none</div>' +
//' </div>' +
'</div>' +
'<div class="PrinterArea"> ' +
'</div>' +
'</div>';
$('#Content').append(HtmlNewVendor);
}
//Collect Html Node Nozzel Html
if (!ModelHtml.hasOwnProperty(strVendor))
ModelHtml[strVendor] = '';
ModelHtml[strVendor]+=CreatePrinterBlock(OneModel); // ORCA
}
//Update Nozzel Html Append
for (let key in ModelHtml) {
let obj = $(".OneVendorBlock[vendor='" + key + "'] .PrinterArea");
obj.empty();
obj.append(ModelHtml[key]);
}
//Update Checkbox
ModelSelect = $('.ModelCheckBox');
for (let n = 0; n < ModelSelect.length; n++) {
let OneItem = ModelSelect[n];
let strModel = OneItem.getAttribute("model");
let strVendor = OneItem.getAttribute("vendor");
let checked = GetModelSelect(strVendor, strModel);
if (checked)
$(OneItem).addClass('ModelCheckBoxSelected');
else
$(OneItem).removeClass('ModelCheckBoxSelected');
}
const $SidebarVendors = $('#SidebarVendors');
let SidebarHTML = "";
$(`.OneVendorBlock`).each((i, el)=>{
UpdateVendorCheckbox(el.getAttribute("vendor"));
SidebarHTML +=`<div class="SidebarItem" onclick="scrollToVendor(this.textContent)">${el.getAttribute('vendor')}</div>`;
});
$SidebarVendors.html(SidebarHTML)
const $content = $('#Content');
$content.css("padding-right", $content[0].scrollHeight > $content[0].clientHeight ? "10px" : "20px");
// let AlreadySelect=$(".ModelCheckBoxSelected");
// let nSelect=AlreadySelect.length;
// if(nSelect==0)
// {
// $("div.OneVendorBlock[vendor='"+BBL+"'] .ModelCheckBox").addClass('ModelCheckBoxSelected');
// }
TranslatePage();
}
function CreatePrinterBlock(OneModel)
{
// ORCA use single functuon to create blocks to simplify code
let vendor = OneModel['vendor']
vendorName = vendor=="BBL" ? "Bambu Lab" : vendor=="Custom" ? "Generic Printer" : vendor;
let modelName = OneModel['name'];
// Most of it unneeded. this can be applied in profiles
if( vendor=="Custom")
modelName = modelName.split(" ")[1];
// these uses different case in name; seckit, ratrig, blocks
else if (modelName.toLowerCase().startsWith(vendorName.toLowerCase()))
modelName = modelName.slice(vendorName.length);
// these not matches. have to fix in profiles to reduce conditions in here;
else if (vendor == "MagicMaker" && modelName.startsWith("MM"))
modelName = modelName.slice(("MM").length);
else if (vendor == "OrcaArena")
modelName = modelName.slice(("Orca Arena").length);
else if (vendor == "RolohaunDesign" && modelName.startsWith("Rolohaun"))
modelName = modelName.slice(("Rolohaun").length);
return '<div class="PrinterBlock" onClick="ChooseModel(\''+vendor+'\',\''+OneModel['model']+'\')">'+
'<div class="PImg">'+
'<img class="ModelThumbnail" src="' + OneModel['cover'] + '" />'+
'</div>'+
'<div class="PrinterInfoMark">?</div>'+
'<div class="PrinterInfo">'+
//' <div class="title trans">Print volume</div>'+
//' <div class="value">' + OneModel['printable_height'] + '</div>'+
' <div class="title trans">Nozzle</div>'+
' <div class="value">' + OneModel['nozzle_diameter'].replaceAll(";", " · ") + '</div>'+
'</div>'+
'<div style="display: flex;">'+
' <div class="ModelCheckBox" vendor="' +vendor+ '" model="'+OneModel['model']+'"></div>'+
' <div class="PName">'+ modelName +'</div>'+ // ><p>'+ vendorName +'</p>
'</div>'+
'</div>';
}
function SelectPrinterAll( sVendor )
{
$("div.OneVendorBlock[vendor='"+sVendor+"'] .ModelCheckBox").addClass('ModelCheckBoxSelected');
$("div.OneVendorBlock[vendor='"+sVendor+"'] .ModelCheckBox").each(function() {
let strModel = this.getAttribute("model");
SetModelSelect(sVendor, strModel, true);
});
}
function SelectPrinterNone( sVendor )
{
$("div.OneVendorBlock[vendor='"+sVendor+"'] .ModelCheckBox").removeClass('ModelCheckBoxSelected');
$("div.OneVendorBlock[vendor='"+sVendor+"'] .ModelCheckBox").each(function() {
let strModel = this.getAttribute("model");
SetModelSelect(sVendor, strModel, false);
});
}
function ChooseVendor(sVendor) {
const $cbs = $(`.OneVendorBlock[vendor='${sVendor}'] .ModelCheckBox`);
const sel = $cbs.length && $cbs.not('.ModelCheckBoxSelected').length;
sel ? $cbs.addClass('ModelCheckBoxSelected')
: $cbs.removeClass('ModelCheckBoxSelected');
$cbs.each((i, el)=>{SetModelSelect(sVendor, el.getAttribute('model'), sel)});
}
function UpdateVendorCheckbox(sVendor) {
const $vb = $(`.OneVendorBlock[vendor='${sVendor}']`);
const $cbs = $vb.find(`.ModelCheckBox`);
const $vcb = $vb.find(`.VendorCheckbox`);
const selCount = $cbs.filter('.ModelCheckBoxSelected').length;
const allSel = selCount === $cbs.length && selCount > 0;
const nonSel = selCount === 0;
$vcb.prop({checked: allSel , indeterminate: !allSel && !nonSel});
$vb.find(".modelCount").text(selCount + " / " + $cbs.length);
}
function GotoFilamentPage()
{
let nChoose=OnExitFilter();
@@ -397,97 +17,3 @@ function GotoFilamentPage()
if(nChoose>0)
window.open('../22/index.html','_self');
}
function OnExitFilter() {
let nTotal = 0;
let ModelAll = {};
for (vendor in ModelNozzleSelected) {
for (model in ModelNozzleSelected[vendor]) {
if (!ModelNozzleSelected[vendor][model])
continue;
if (!ModelAll.hasOwnProperty(model)) {
//alert("ADD: "+strModel);
ModelAll[model] = {};
ModelAll[model]["model"] = model;
}
nTotal++;
}
}
var tSend = {};
tSend['sequence_id'] = Math.round(new Date() / 1000);
tSend['command'] = "save_userguide_models";
tSend['data'] = ModelAll;
SendWXMessage(JSON.stringify(tSend));
return nTotal;
}
//
function OnExit()
{
let ModelAll={};
let ModelSelect=$(".ModelCheckBoxSelected");
let nTotal=ModelSelect.length;
if( nTotal==0 )
{
ShowNotice(1);
return 0;
}
for(let n=0;n<nTotal;n++)
{
let OneItem=ModelSelect[n];
let strModel=OneItem.getAttribute("model");
//alert(strModel+strVendor+strNozzel);
if(!ModelAll.hasOwnProperty(strModel))
{
//alert("ADD: "+strModel);
ModelAll[strModel]={};
ModelAll[strModel]["model"]=strModel;
}
}
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="save_userguide_models";
tSend['data']=ModelAll;
SendWXMessage( JSON.stringify(tSend) );
return nTotal;
}
function ShowNotice( nShow )
{
if(nShow==0)
{
$("#NoticeMask").hide();
$("#NoticeBody").hide();
}
else
{
$("#NoticeMask").show();
$("#NoticeBody").show();
}
}

View File

@@ -0,0 +1,441 @@
#Content {
overflow-y:auto;
padding: 0 10px 0 20px; /* ORCA Specify & Reduce horizontal paddings to fit 4 items per row */
height: 100%;
}
/* VENDOR BLOCK */
.OneVendorBlock {
position: relative;
margin-bottom: 7px;
}
.OneVendorBlock:last-of-type {
margin-bottom: 36px;
}
.BlockBanner {
position: sticky;
top: 0;
left: 0;
padding: 0px;
border-bottom: 2px solid var(--main-color);
width: 100%;
display: flex;
align-items: center;
z-index: 100;
background-color: var(--bg-color-secondary);
box-sizing: border-box;
}
.BannerBtns {
display: flex;
white-space: nowrap;
justify-content: space-around;
align-items: center;
text-align: center;
margin-right: 5px; /* ORCA align buttons with end of horizontal separator/line */
margin-left: auto;
}
.BlockBanner a {
line-height: 30px;
height: 30px;
font-size: 17px;
font-weight: 600;
padding: 0px 10px;
color: var(--fg-color-text);
}
.BlockBanner .modelCount {
margin: 0 15px 0 auto;
font-size: 14px;
line-height: 14px;
height: 15px;
color: var(--fg-color-label);
}
.VendorCheckbox {
transform: scale(1.3);
}
.PrinterArea {
padding: 7px 0px; /* ORCA Reduce horizontal paddings to fit 4 items per row */
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 7px;
}
/* PRINTER BLOCK */
.PrinterBlock {
display: flex;
align-items: center;
text-align: center;
flex-direction: column;
gap:10px;
padding: 15px 10px 10px 10px;
background-color: var(--bg-color-secondary);
position: relative;
border: 1px solid transparent
}
.PrinterBlock:hover {
background-color: var(--focus-bg-item);
border-color:var(--main-color);
}
.PImg {
width:120px; /* ORCA use covers as 120x120px but use source file as 240x240 for better quality on hidpi */
height:120px; /* ORCA fit image to fill frame */
}
.PrinterInfo,
.PrinterInfoMark {
position: absolute;
right: 4px;
top: 4px;
opacity: 0;
border-radius: 11px;
line-height: 19px;
font-size: 14px;
}
.PrinterInfo {
--card-animation-delay: .8s; /* open info with delay on list / compact view to prevent them appear while mouse movements */
left: 4px;
width: auto;
z-index: 9998;
height: fit-content;
border-color: var(--border-color);
background: var(--bg-color);
padding: 10px;
text-align: left;
color: var(--fg-color-text);
pointer-events: none;
}
#Content[layout="large-cover"] .PrinterInfo {
--card-animation-delay: .3s;
}
.PrinterInfo .title {font-weight: 700}
.PrinterInfo .value {font-weight: 400}
.PrinterInfoMark:hover + .PrinterInfo {
animation: infoCard 0s forwards var(--card-animation-delay);
}
@keyframes infoCard {100% {
opacity: 1;
box-shadow: 0 5px 10px rgba(0,0,0,.2);
}}
.PrinterInfoMark {
width: 20px;
height: 20px;
background: var(--main-color);
border: 1px solid var(--main-color);
z-index: 9999;
color: #FFF;
text-align: center;
}
.PrinterBlock:hover .PrinterInfoMark {
opacity: 1;
}
.PrinterBlock:hover .PrinterInfoMark:hover {
background: var(--main-color-hover);
}
.ModelCheckBox {
position: absolute;
height: 6px;
bottom: 0;
left: 10%;
width: 80%;
background: var(--button-bg-hover)
}
.ModelCheckBox.ModelCheckBoxSelected {
background: var(--main-color-fixed)
}
img.ModelThumbnail {
width: 100%;
height: 100%;
}
.PName {
font-weight: 600;
line-height: 20px; /* ORCA */
text-align: center;
width: 100%;
color: var(--fg-color-text);
}
/* LAYOUT SELECTOR */
.LayoutSelector {
position: absolute;
right:21px;
top:14px;
}
.LayoutSelector .TabGroup {
display: flex;
padding: 2px;
gap: 2px;
border-radius: 6px;
background-color: var(--bg-color-alt);
}
.LayoutSelector .icon16 {
opacity: .8;
}
.LayoutSelector .TabButton {
padding: 7px;
border-radius: 4px;
}
.LayoutSelector .TabButton.selected {background: var(--main-color)}
.LayoutSelector .TabButton.selected:hover {background: var(--main-color-hover)}
.LayoutSelector .TabButton.selected .icon16 {background: #FFF}
.LayoutSelector .TabButton:nth-of-type(1) .icon16 {--icon-url: var(--icon-layout-list)}
.LayoutSelector .TabButton:nth-of-type(2) .icon16 {--icon-url: var(--icon-layout-compact)}
.LayoutSelector .TabButton:nth-of-type(3) .icon16 {--icon-url: var(--icon-layout-cover)}
/* LAYOUT */
#Content[layout="compact-list"] .PrinterArea {
grid-template-columns: repeat(4, 1fr);
}
#Content[layout="compact-list"] .PImg {
display: none;
}
#Content[layout="compact-list"] .OneVendorBlock {
margin-bottom: 15px;
}
#Content[layout="compact-cover"] .PrinterArea {
grid-template-columns: repeat(3, 1fr);
}
#Content[layout="compact-cover"] .PImg {
width: 60px;
min-width: 60px;
height: 60px;
}
#Content[layout|="compact"] .PName {
text-align: left;
}
#Content[layout|="compact"] .PrinterBlock {
flex-direction: row;
padding: 5px 5px 5px 18px;
}
#Content[layout|="compact"] .ModelCheckBox {
width: 6px;
height: 80%;
left:0;
top:10%
}
#Content[layout|="compact"] .OneVendorBlock:last-of-type {
margin-bottom: 0px;
}
/* SEARCH */
.search {
position: absolute;
left:66px;
top: 14px;
width: 34px;
height: 34px;
z-index: 99;
overflow: hidden;
}
.search:focus-within,
.search[hasvalue="1"] {
width: calc(100% - 194px);
}
.searchTerm {
width: 100%;
height: 100%;
padding: 4px 5px;
border-radius: 6px;
outline: none;
box-sizing: border-box;
background: var(--button-bg-normal);
border: 1px solid var(--button-bg-normal);
}
@media (prefers-reduced-motion: no-preference) {
.searchTerm {
transition: background-color .2s
}
}
.searchTerm,
.search-placeholder {
line-height: 24px; /* ORCA center text vertically */
font-size: 14px;
}
.search:focus-within .searchTerm,
.search[hasvalue="1"] .searchTerm {
padding-left:33px;
background: var(--bg-color);
border-color: var(--main-color);
}
.search[hasvalue="1"]:not(:focus-within, :hover) .searchTerm {
border-color: var(--border-color);
}
.search:not(:focus-within, [hasvalue="1"]) .searchTerm {
cursor: default;
}
.search:not(:focus-within, [hasvalue="1"]) .searchTerm:hover {
background: var(--button-bg-hover);
}
.search-placeholder {
color: var(--fg-color-disabled);
left: 33px;
}
.searchTerm:not(:placeholder-shown) + .search-placeholder {
opacity: 0;
}
.search-icon,
.search-placeholder {
position: absolute;
top: 50%;
transform: translateY(-50%);
pointer-events: none;
}
.search-icon {
left: 9px;
--icon-url: var(--icon-search);
}
/* SIDEBAR */
.SidebarBtn {
position: absolute;
left: 20px;
top: 14px;
padding: 9px;
border-radius: 6px;
}
.SidebarBtn .icon16 {
--icon-url: var(--icon-sidebar);
}
#SidebarContainer {
position: absolute;
top: 0;
left: -240px;
right: 0;
height: 100%;
z-index: 999999;
display: flex;
pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
#SidebarContainer {
transition: background-color .2s, left .2s
}
}
#SidebarContainer[open="1"] {
left: 0px;
pointer-events: all;
background: rgba(0,0,0,.3);
}
#Sidebar {
flex: 0 0 220px;
background: var(--bg-color);
box-shadow: 5px 0 20px rgba(0,0,0,.2);
padding: 15px 0;
overflow-y: auto;
}
#Sidebar .title {
font-size: 17px;
line-height: 17px;
font-weight: 600;
padding: 0 0 5px 20px;
}
#Sidebar .SidebarItem {
width: 100%;
padding: 2px 10px 2px 20px;
color:var(--fg-color-text);
font-size: 14px;
border: 1px solid transparent;
box-sizing: border-box;
}
#Sidebar .SidebarItem:hover {
border-color: var(--main-color);
}
#SidebarContainer .back {
flex: 1;
}
/* NOTICE POPUP */
#NoticeMask {
background-color: #000;
position: absolute;
top: 0px;
left: 0px;
right: 0px;
bottom: 0px;
opacity: 0.05;
display: none;
}
#NoticeBody {
display: none;
width: 400px;
border-width: 1px;
border-style: solid;
border-radius: 4px;
background-color: inherit;
position: absolute;
left: 50%;
top: 200px;
margin-left: -200px;
}
#NoticeBar {
background-color:#00f0d8;
height: 40px;
line-height: 40px;
color: #fff;
text-align: center;
}
#NoticeContent {
padding: 4mm 10mm;
}
#NoticeBtns {
margin-top: 4mm;
display: flex;
justify-content:flex-end;
}

View File

@@ -0,0 +1,632 @@
var pModel = {};
var ModelNozzleSelected = {};
let SearchBox;
let $content;
function InitGlobalVariables()
{
SearchBox = document.querySelector('.searchTerm');
$content = $('#Content');
}
function RequestProfile()
{
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="request_userguide_profile";
SendWXMessage( JSON.stringify(tSend) );
}
function HandleStudio( pVal )
{
// alert(strInput);
// alert(JSON.stringify(strInput));
//
// let pVal=IsJson(strInput);
// if(pVal==null)
// {
// alert("Msg Format Error is not Json");
// return;
// }
let strCmd=pVal['command'];
//alert(strCmd);
if(strCmd=='response_userguide_profile')
{
HandleModelList(pVal['response']);
}
}
function HandleModelList( pVal )
{
if( !pVal.hasOwnProperty("model") )
return;
pModel=pVal['model'];
// ORCA ensure list correctly ordered
pModel = pModel.sort((a, b)=>(a["vendor"].localeCompare(b["vendor"])))
pModel = [ // move custom printers to top
...pModel.filter(i=>i.vendor === "Custom"),
...pModel.filter(i=>i.vendor !== "Custom")
];
let nTotal=pModel.length;
let ModelHtml={};
for(let n=0;n<nTotal;n++)
{
let OneModel=pModel[n];
let strVendor=OneModel['vendor'];
//Add Vendor Html Node
if($(".OneVendorBlock[vendor='"+strVendor+"']").length==0)
{
let HtmlNewVendor = CreateVendorBlock(strVendor);
$('#Content').append(HtmlNewVendor);
}
let ModelName=OneModel['model'];
//Collect Html Node Nozzel Html
if( !ModelHtml.hasOwnProperty(strVendor))
ModelHtml[strVendor]='';
ModelHtml[strVendor] += CreatePrinterBlock(OneModel); // ORCA
}
//Update Nozzel Html Append
for( let key in ModelHtml )
{
$(".OneVendorBlock[vendor='"+key+"'] .PrinterArea").append( ModelHtml[key] );
}
//Update Checkbox
for(let m=0;m<nTotal;m++)
{
let OneModel=pModel[m];
let SelectList=OneModel['nozzle_selected'];
if(SelectList!='') {
ChooseModel(OneModel['vendor'], OneModel['model']);
}
}
UpdateSidebarVendors();
// let AlreadySelect=$(".ModelCheckBoxSelected");
// let nSelect=AlreadySelect.length;
// if(nSelect==0)
// {
// $("div.OneVendorBlock[vendor='"+BBL+"'] .ModelCheckBox").addClass('ModelCheckBoxSelected');
// }
TranslatePage();
}
function SetModelSelect(vendor, model, checked) {
if (!ModelNozzleSelected.hasOwnProperty(vendor) && !checked) {
return;
}
if (!ModelNozzleSelected.hasOwnProperty(vendor) && checked) {
ModelNozzleSelected[vendor] = {};
}
let oVendor = ModelNozzleSelected[vendor];
if (oVendor.hasOwnProperty(model) || checked) {
oVendor[model] = checked;
}
UpdateVendorCheckbox(vendor)
}
function GetModelSelect(vendor, model) {
if (!ModelNozzleSelected.hasOwnProperty(vendor)) {
return false;
}
let oVendor = ModelNozzleSelected[vendor];
if (!oVendor.hasOwnProperty(model)) {
return false;
}
return oVendor[model];
}
function ChooseModel(vendor, ModelName)
{
let ChooseItem=$(".ModelCheckBox[vendor='"+vendor+"'][model='"+ModelName+"']");
if(ChooseItem.length > 0) {
if( $(ChooseItem).hasClass('ModelCheckBoxSelected') )
$(ChooseItem).removeClass('ModelCheckBoxSelected');
else
$(ChooseItem).addClass('ModelCheckBoxSelected');
SetModelSelect(vendor, ModelName, $(ChooseItem).hasClass('ModelCheckBoxSelected'));
}
}
function FilterModelList(keyword) {
//Save checkbox state
let ModelSelect = $('.ModelCheckBox');
for (let n = 0; n < ModelSelect.length; n++) {
let OneItem = ModelSelect[n];
let strModel = OneItem.getAttribute("model");
let strVendor = OneItem.getAttribute("vendor");
SetModelSelect(strVendor, strModel, $(OneItem).hasClass('ModelCheckBoxSelected'));
}
$('.search')[0].setAttribute("hasvalue", keyword ? "1" : "0")
let nTotal = pModel.length;
let ModelHtml = {};
let kwSplit = keyword.toLowerCase().match(/\S+/g) || [];
$('#Content').empty();
for (let n = 0; n < nTotal; n++) {
let OneModel = pModel[n];
let strVendor = OneModel['vendor'];
let search = (OneModel['name'] + '\0' + strVendor).toLowerCase();
if (!kwSplit.every(s => search.includes(s)))
continue;
//Add Vendor Html Node
if ($(".OneVendorBlock[vendor='" + strVendor + "']").length == 0) {
let HtmlNewVendor = CreateVendorBlock(strVendor);
$('#Content').append(HtmlNewVendor);
}
//Collect Html Node Nozzel Html
if (!ModelHtml.hasOwnProperty(strVendor))
ModelHtml[strVendor] = '';
ModelHtml[strVendor] += CreatePrinterBlock(OneModel); // ORCA
}
//Update Nozzel Html Append
for (let key in ModelHtml) {
let obj = $(".OneVendorBlock[vendor='" + key + "'] .PrinterArea");
obj.empty();
obj.append(ModelHtml[key]);
}
//Update Checkbox
ModelSelect = $('.ModelCheckBox');
for (let n = 0; n < ModelSelect.length; n++) {
let OneItem = ModelSelect[n];
let strModel = OneItem.getAttribute("model");
let strVendor = OneItem.getAttribute("vendor");
let checked = GetModelSelect(strVendor, strModel);
if (checked)
$(OneItem).addClass('ModelCheckBoxSelected');
else
$(OneItem).removeClass('ModelCheckBoxSelected');
}
UpdateSidebarVendors();
$content.css("padding-right", $content[0].scrollHeight > $content[0].clientHeight ? "10px" : "20px");
// let AlreadySelect=$(".ModelCheckBoxSelected");
// let nSelect=AlreadySelect.length;
// if(nSelect==0)
// {
// $("div.OneVendorBlock[vendor='"+BBL+"'] .ModelCheckBox").addClass('ModelCheckBoxSelected');
// }
TranslatePage();
}
function textInput(obj) {
FilterModelList(obj.value);
}
function CreateVendorBlock(vendorName)
{
let alt = vendorName;
if( alt == "BBL" )
alt = "Bambu Lab";
if( alt == "Custom")
alt = "Custom Printer";
if( alt == "Other")
alt = "Orca colosseum";
return '<div class="OneVendorBlock" Vendor="' + vendorName + '">' +
' <div class="BlockBanner">' +
' <a>' + alt + '</a>' +
' <div class="BannerBtns" onClick="ChooseVendor('+"\'"+vendorName+"\'"+')">'+
' <div class="modelCount"></div>' +
' <input type="checkbox" class="VendorCheckbox"/>'+
' </div>'+
' </div>' +
' <div class="PrinterArea"> ' +
' </div>' +
'</div>';
}
function CreatePrinterBlock(OneModel)
{
let vendor = OneModel['vendor']
let vendorName = vendor=="BBL" ? "Bambu Lab" : vendor=="Custom" ? "Generic Printer" : vendor;
let modelName = OneModel['name'];
// Most of it unneeded. this can be applied in profiles
if( vendor=="Custom")
modelName = modelName.split(" ")[1];
// these uses different case in name; seckit, ratrig, blocks
else if (modelName.toLowerCase().startsWith(vendorName.toLowerCase()))
modelName = modelName.slice(vendorName.length);
// these not matches. have to fix in profiles to reduce conditions in here;
else if (vendor == "MagicMaker" && modelName.startsWith("MM"))
modelName = modelName.slice(("MM").length);
else if (vendor == "OrcaArena")
modelName = modelName.slice(("Orca Arena").length);
else if (vendor == "RolohaunDesign" && modelName.startsWith("Rolohaun"))
modelName = modelName.slice(("Rolohaun").length);
return '<div class="PrinterBlock" onClick="ChooseModel(\''+vendor+'\',\''+OneModel['model']+'\')">'+
' <div class="PImg">'+
' <img class="ModelThumbnail" src="' + OneModel['cover'] + '" />'+
' </div>'+
' <div class="PrinterInfoMark">?</div>'+
' <div class="PrinterInfo">'+
' <div class="title trans">Nozzle</div>'+
' <div class="value">' + OneModel['nozzle_diameter'].replaceAll(";", " · ") + '</div>'+
' </div>'+
' <div style="display: flex;">'+
' <div class="ModelCheckBox" vendor="' +vendor+ '" model="'+OneModel['model']+'"></div>'+
' <div class="PName">'+ modelName +'</div>'+ // ><p>'+ vendorName +'</p>
' </div>'+
'</div>';
}
function scrollToVendor(vendor) {
const el = $(".OneVendorBlock[vendor='"+vendor+"']")[0];
if (el){
document.getElementById('SidebarContainer').setAttribute('open', '0');
document.getElementById('Content').scrollTo({top: el.offsetTop, behavior: "smooth"});
}
}
function UpdateSidebarVendors()
{
let SidebarHTML = "";
$(`.OneVendorBlock`).each((i, el)=>{
UpdateVendorCheckbox(el.getAttribute("vendor"));
SidebarHTML +=`<div class="SidebarItem" onclick="scrollToVendor(this.textContent)">${el.getAttribute('vendor')}</div>`;
});
$('#SidebarVendors').html(SidebarHTML)
}
function ChooseVendor(sVendor) { // automatically selects / unselects all
const $cbs = $(`.OneVendorBlock[vendor='${sVendor}'] .ModelCheckBox`);
const sel = $cbs.length && $cbs.not('.ModelCheckBoxSelected').length;
sel ? $cbs.addClass('ModelCheckBoxSelected')
: $cbs.removeClass('ModelCheckBoxSelected');
$cbs.each((i, el)=>{SetModelSelect(sVendor, el.getAttribute('model'), sel)});
}
function UpdateVendorCheckbox(sVendor) {
const $vb = $(`.OneVendorBlock[vendor='${sVendor}']`);
const $cbs = $vb.find(`.ModelCheckBox`);
const $vcb = $vb.find(`.VendorCheckbox`);
const selCount = $cbs.filter('.ModelCheckBoxSelected').length;
const allSel = selCount === $cbs.length && selCount > 0;
const nonSel = selCount === 0;
$vcb.prop({checked: allSel , indeterminate: !allSel && !nonSel});
$vb.find(".modelCount").text(selCount + " / " + $cbs.length);
}
function OnExit()
{
let ModelAll={};
let ModelSelect=$(".ModelCheckBoxSelected");
let nTotal=ModelSelect.length;
if( nTotal==0 ) {
ShowNotice(1);
return 0;
}
for(let n=0;n<nTotal;n++)
{
let OneItem=ModelSelect[n];
let strModel=OneItem.getAttribute("model");
//alert(strModel+strVendor+strNozzel);
if(!ModelAll.hasOwnProperty(strModel))
{
//alert("ADD: "+strModel);
ModelAll[strModel]={};
ModelAll[strModel]["model"]=strModel;
}
}
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="save_userguide_models";
tSend['data']=ModelAll;
SendWXMessage( JSON.stringify(tSend) );
return nTotal;
}
function OnExitFilter() {
let nTotal = 0;
let ModelAll = {};
for (let vendor in ModelNozzleSelected) {
for (let model in ModelNozzleSelected[vendor]) {
if (!ModelNozzleSelected[vendor][model])
continue;
if (!ModelAll.hasOwnProperty(model)) {
//alert("ADD: "+strModel);
ModelAll[model] = {};
ModelAll[model]["model"] = model;
}
nTotal++;
}
}
var tSend = {};
tSend['sequence_id'] = Math.round(new Date() / 1000);
tSend['command'] = "save_userguide_models";
tSend['data'] = ModelAll;
SendWXMessage(JSON.stringify(tSend));
return nTotal;
}
function ShowNotice( nShow )
{
if(nShow==0) {
$("#NoticeMask").hide();
$("#NoticeBody").hide();
}
else {
$("#NoticeMask").show();
$("#NoticeBody").show();
}
}
// SNAPPY SCROLLING WITHOUT LAGS
const SNAP_DELAY = 600;
const SNAP_DURATION = 200;
const SNAP_CORR = 8; // error correction / tolerance
let scrollTimer = null;
let lastScrollTop = 0;
let scrollDir = 'down';
let isSnapping = false;
let snapRafId = null;
let lastSnapTarget = null;
let waitingForUserScroll = false;
function findSnap(cur, dir) {
if (lastSnapTarget !== null && Math.abs(cur - lastSnapTarget) < SNAP_CORR) return null;
const savedScroll = cur;
$content[0].scrollTop = 0; // Temporarily scroll to 0 so getBoundingClientRect can get absolute positions
let bcTop = el=>(el.getBoundingClientRect().top);
const contentTop = bcTop($content[0]);
const bannerH = ($content.find('.BlockBanner')[0] || {}).offsetHeight || 0;
const firstCard = $content.find('.PrinterBlock')[0];
const firstArea = $content.find('.PrinterArea')[0];
const cardGap = (firstCard && firstArea) ? (bcTop(firstCard) - bcTop(firstArea)) : 0;
const candidates = $content.find('.BlockBanner, .PrinterBlock').get();
if (dir === 'up') candidates.reverse();
let result = lastSeen = null;
for (const el of candidates) {
const snapTo = Math.round(
el.classList.contains('BlockBanner')
? (bcTop(el.closest('.OneVendorBlock')) - contentTop)
: Math.max(0, bcTop(el) - contentTop - bannerH - cardGap)
);
if (snapTo != lastSeen){
lastSeen = snapTo;
if (dir === 'down' && snapTo > cur + SNAP_CORR) { result = snapTo; break; }
if (dir === 'up' && snapTo < cur - SNAP_CORR) { result = snapTo; break; }
}
}
$content[0].scrollTop = savedScroll; // Restore scroll position
return result;
}
function smoothScrollTo(target) {
if (snapRafId) {
cancelAnimationFrame(snapRafId);
snapRafId = null;
}
const el = $content[0];
const from = el.scrollTop;
const dist = target - from;
const t0 = performance.now();
const ease = t => t < 0.5 ? 2*t*t : -1 + (4 - 2*t)*t;
function onDone() {
el.scrollTop = target;
lastScrollTop = lastSnapTarget = target;
waitingForUserScroll = true;
clearTimeout(scrollTimer);
scrollTimer = null;
snapRafId = null;
isSnapping = false;
}
if (Math.abs(dist) < 2)
return onDone();
snapRafId = requestAnimationFrame(function step(now) {
const p = Math.min((now - t0) / SNAP_DURATION, 1);
el.scrollTop = from + dist * ease(p);
if (p < 1)
snapRafId = requestAnimationFrame(step);
else
onDone();
});
}
function armSnap() {
waitingForUserScroll = false;
lastSnapTarget = null;
}
function initScrollEvents() {
$content.on('scroll', function() {
if (isSnapping) return;
if (this.scrollTop > lastScrollTop + 1) scrollDir = 'down';
else if (this.scrollTop < lastScrollTop - 1) scrollDir = 'up';
lastScrollTop = this.scrollTop;
if (waitingForUserScroll) return;
clearTimeout(scrollTimer);
scrollTimer = setTimeout(()=>{
if (isSnapping) return;
const target = findSnap($content[0].scrollTop, scrollDir);
if (target){
isSnapping = true;
smoothScrollTo(target);
}
}, SNAP_DELAY);
});
let touchY = 0;
$content[0].addEventListener('touchstart', e => {
touchY = e.touches[0].clientY;
armSnap();
}, { passive: true });
$content[0].addEventListener('touchmove', e => {
const dy = touchY - e.touches[0].clientY;
if (Math.abs(dy) > 3)
scrollDir = dy > 0 ? 'down' : 'up';
}, { passive: true });
// Re-arm snap system on user scroll
$content[0].addEventListener('wheel', armSnap, { passive: true });
// Re-arm on after scrollbar usage
$content[0].addEventListener('pointerdown', e => {
if (e.target === $content[0])
armSnap();
});
// Re-arm on keyboard scroll or focus changes
document.addEventListener('keydown', e => {
if (document.activeElement != SearchBox){
let scrollKeys = ['ArrowUp','ArrowDown','PageUp','PageDown',' '];
let hasFocus = $content[0].contains(document.activeElement);
if(scrollKeys.includes(e.key) || (hasFocus && e.which == 9))
armSnap();
}
});
// ORCA unfocus search bar while scrolling and its content empty
$content[0].addEventListener("scroll", () => {
if (document.activeElement === SearchBox && SearchBox.value == "")
SearchBox.blur();
});
}
document.addEventListener('DOMContentLoaded', initScrollEvents);
// LAYOUT SELECTOR
function LayoutMode(value) {
let LayoutSelector = document.querySelector('.LayoutSelector > .TabGroup');
let LayoutBtns = Array.from(LayoutSelector.children);
let LayoutTypes = ["compact-list","compact-cover","large-cover"];
if($content[0].getAttribute("layout") === value)
return;
// find current visible vendor and scroll to it after layout change
let target = null;
for (const el of $content.find('.OneVendorBlock')) {
if (el.getBoundingClientRect().bottom - $content[0].getBoundingClientRect().top >= -1) {
target = el.getAttribute("vendor");
break;
}
}
LayoutBtns.forEach(el => el.classList.remove('selected'));
LayoutBtns[LayoutTypes.indexOf(value)].classList.add('selected');
$content[0].setAttribute("layout", value);
if (target) scrollToVendor(target);
}
document.addEventListener('DOMContentLoaded', () => LayoutMode("large-cover"));
// KEY EVENTS
function initKeyEvents(closeOnESC) {
document.onkeydown = function (event) {
var e = event || window.event || arguments.callee.caller.arguments[0];
let sidebar = document.getElementById('SidebarContainer');
if (e.keyCode == 27){
if(sidebar.getAttribute('open') == "1") { // prefer to close sidebar first if its open
sidebar.setAttribute('open', '0');
}
else if (closeOnESC){
ClosePage();
}
}
// ORCA focus search bar on key input
// SearchBox not in focus && writable character && non modifier
if (document.activeElement != SearchBox && e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {
SearchBox.focus();
}
// Close sidebar on any key input
sidebar.setAttribute('open', '0');
//if (window.event) {
// try { e.keyCode = 0; } catch (e) { }
// e.returnValue = true;
//}
};
}

View File

@@ -6,6 +6,7 @@
<title>引导_P21</title>
<link rel="stylesheet" type="text/css" href="../../include/global.css" /> <!-- ORCA One for all-->
<link rel="stylesheet" type="text/css" href="../css/common.css" />
<link rel="stylesheet" type="text/css" href="../21/common.css" /> <!-- ORCA use common sources for setup guide and standalone dialog -->
<link rel="stylesheet" type="text/css" href="21.css" />
<link rel="stylesheet" type="text/css" href="../css/dark.css" />
<script type="text/javascript" src="test.js"></script>
@@ -14,7 +15,8 @@
<script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="21.js"></script>
<script type="text/javascript" src="../21/common.js"></script> <!-- ORCA use common sources for setup guide and standalone dialog -->
<script type="text/javascript" src="21.js"></script>
</head>
<body onLoad="OnInit()">
<div id="Title">
@@ -49,93 +51,33 @@
<div id="Content" class="thin-scroll">
<!--<div class="OneVendorBlock" Vendor="BBL">
<div class="BlockBanner">
<a>BBL-3DP</a>
<div class="BannerBtns">
<div class="ButtonStyleConfirm ButtonTypeWindow trans" onClick="SelectPrinterAll('BBL')">所有</div>
<div class="ButtonStyleRegular ButtonTypeWindow trans" onClick="SelectPrinterNone('BBL')"></div>
<!-- EXAMPLE GENERATED CODE BLOCK
<div class="OneVendorBlock" Vendor="VendorName">
<div class="BlockBanner">
<a>VendorName</a>
<div class="BannerBtns" onClick="ChooseVendor('VendorName')" >
<div class="modelCount"></div>
<input type="checkbox" class="VendorCheckbox" />
</div>
</div>
<div class="PrinterArea">
<div class="PrinterBlock" onClick="ChooseModel('VendorName','ModelName')" >
<div class="PImg" >
<img class="ModelThumbnail" src="CoverPath" />
</div>
<div class="PrinterInfoMark">?</div>
<div class="PrinterInfo">
<div class="title trans">Nozzle</div>
<div class="value">nozzleInfo</div>
</div>
<div style="display: flex;">
<div class="ModelCheckBox" vendor="' +vendor+ '" model="'+OneModel['model']+'"></div>
<div class="PName">modelName</div>
</div>
</div>
</div>
</div>
<div class="PrinterArea">
<div class="PrinterBlock">
<div class="PImg">
<img class="ModelThumbnail" src="p2.jpg" />
<div class="ModelCheckBox ModelCheckBoxSelected" model="BBL-3DP-V5NORMAL" onClick="ChooseModel('BBL-3DP-V5NORMAL')"></div>
</div>
<div class="PName">BBL-3DP-V4NORMAL</div>
<div class="pNozzel TextS2"><input id="ZZ" type="checkbox" model="BBL-3DP-V4NORMAL" nozzel="0.4" vendor="BBL" />0.4mm nozzle</div>
<div class="pNozzel TextS2"><input type="checkbox" model="BBL-3DP-V4NORMAL" nozzel="0.1" vendor="BBL" />0.1mm nozzle</div>
</div>
<div class="PrinterBlock">
<div class="PImg">
<img class="ModelThumbnail" src="p2.jpg" />
<div class="ModelCheckBox"></div>
</div>
<div class="PName">BBL-3DP-V4NORMAL</div>
<div class="pNozzel TextS2"><input type="checkbox" model="BBL-3DP-V5NORMAL" nozzel="0.4" vendor="BBL" />0.4mm nozzle</div>
<div class="pNozzel TextS2"><input type="checkbox" model="BBL-3DP-V5NORMAL" nozzel="0.2" vendor="BBL" />0.22mm nozzle</div>
<div class="pNozzel TextS2"><input type="checkbox" model="BBL-3DP-V5NORMAL" nozzel="0.1" vendor="BBL" />0.1mm nozzle</div>
</div>
<div class="PrinterBlock">
<div class="PImg">
<img class="ModelThumbnail" src="p2.jpg" />
<div class="ModelCheckBox"></div>
</div>
<div class="PName">BBL-3DP-V4NORMAL</div>
<div class="pNozzel TextS2"><input id="ZZ" type="checkbox" model="BBL-3DP-V4NORMAL" nozzel="0.4" vendor="BBL" />0.4mm nozzle</div>
<div class="pNozzel TextS2"><input type="checkbox" model="BBL-3DP-V4NORMAL" nozzel="0.1" vendor="BBL" />0.11mm nozzle</div>
</div>
<div class="PrinterBlock">
<div class="PImg">
<img class="ModelThumbnail" src="p2.jpg" />
<div class="ModelCheckBox ModelCheckBoxSelected"></div>
</div>
<div class="PName">BBL-3DP-V4NORMAL</div>
<div class="pNozzel TextS2"><input type="checkbox" model="BBL-3DP-V5NORMAL" nozzel="0.4" vendor="BBL" />0.4mm nozzle</div>
<div class="pNozzel TextS2"><input type="checkbox" model="BBL-3DP-V5NORMAL" nozzel="0.2" vendor="BBL" />0.22mm nozzle</div>
<div class="pNozzel TextS2"><input type="checkbox" model="BBL-3DP-V5NORMAL" nozzel="0.1" vendor="BBL" />0.1mm nozzle</div>
</div>
</div>
</div>
<div class="OneVendorBlock" Vendor="BAMBU">
<div class="BlockBanner">
<a>BAMBU-3DP</a>
<div class="BannerBtns">
<div class="SmallBtn_Green trans" onClick="SelectPrinterAll('BAMBU')">所有</div>
<div class="SmallBtn trans" onClick="SelectPrinterNone('BAMBU')">无</div>
</div>
</div>
<div class="PrinterArea">
<div class="PrinterBlock">
<div class="PImg">
<img class="ModelThumbnail" src="p2.jpg" />
<div class="ModelCheckBox ModelCheckBoxSelected"></div>
</div>
<div class="PName TextS1">BBL-3DP-V4NORMAL</div>
<div class="pNozzel TextS2"><input type="checkbox" model="BBL-3DP-V4NORMAL" nozzel="0.4" vendor="BAMBU" />0.4mm nozzle</div>
<div class="pNozzel TextS2"><input type="checkbox" model="BBL-3DP-V4NORMAL" nozzel="0.1" vendor="BAMBU" />0.1mm nozzle</div>
</div>
<div class="PrinterBlock">
<div class="PImg">
<img class="ModelThumbnail" src="p2.jpg" />
<div class="ModelCheckBox ModelCheckBoxSelected"></div>
</div>
<div class="PName TextS1">BBL-3DP-V4NORMAL</div>
<div class="pNozzel TextS2"><input type="checkbox" model="BBL-3DP-V5NORMAL" nozzel="0.4" vendor="BAMBU" />0.4mm nozzle</div>
<div class="pNozzel TextS2"><input type="checkbox" model="BBL-3DP-V5NORMAL" nozzel="0.2" vendor="BAMBU" />0.2mm nozzle</div>
<div class="pNozzel TextS2"><input type="checkbox" model="BBL-3DP-V5NORMAL" nozzel="0.1" vendor="BAMBU" />0.1mm nozzle</div>
</div>
</div>
</div>-->
-->
</div>
<div id="AcceptArea">
@@ -153,212 +95,10 @@
</div>
</div>
</div>
</body>
<script>
const SearchBox = document.querySelector('.searchTerm');
document.onkeydown = function (event) {
var e = event || window.event || arguments.callee.caller.arguments[0];
// ORCA focus search bar on key input
// SearchBox not in focus && writable character && non modifier
if (document.activeElement != SearchBox && e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {
SearchBox.focus();
}
// Close sidebar
document.getElementById('SidebarContainer').setAttribute('open', '0')
//if (window.event) {
// try { e.keyCode = 0; } catch (e) { }
// e.returnValue = true;
//}
};
let pModel = {};
let ModelNozzleSelected = {};
function textInput(obj) {
FilterModelList(obj.value);
}
const $content = $('#Content');
// SNAPPY SCROLLING WITHOUT LAGS
const SNAP_DELAY = 600;
const SNAP_DURATION = 200;
const SNAP_CORR = 8; // error correction / tolerance
let scrollTimer = null;
let lastScrollTop = 0;
let scrollDir = 'down';
let isSnapping = false;
let snapRafId = null;
let lastSnapTarget = null;
let waitingForUserScroll = false;
function findSnap(cur, dir) {
if (lastSnapTarget !== null && Math.abs(cur - lastSnapTarget) < SNAP_CORR) return null;
const savedScroll = cur;
$content[0].scrollTop = 0; // Temporarily scroll to 0 so getBoundingClientRect can get absolute positions
let bcTop = el=>(el.getBoundingClientRect().top);
const contentTop = bcTop($content[0]);
const bannerH = ($content.find('.BlockBanner')[0] || {}).offsetHeight || 0;
const firstCard = $content.find('.PrinterBlock')[0];
const firstArea = $content.find('.PrinterArea')[0];
const cardGap = (firstCard && firstArea) ? (bcTop(firstCard) - bcTop(firstArea)) : 0;
const candidates = $content.find('.BlockBanner, .PrinterBlock').get();
if (dir === 'up') candidates.reverse();
let result = lastSeen = null;
for (const el of candidates) {
const snapTo = Math.round(
el.classList.contains('BlockBanner')
? (bcTop(el.closest('.OneVendorBlock')) - contentTop)
: Math.max(0, bcTop(el) - contentTop - bannerH - cardGap)
);
if (snapTo != lastSeen){
lastSeen = snapTo;
if (dir === 'down' && snapTo > cur + SNAP_CORR) { result = snapTo; break; }
if (dir === 'up' && snapTo < cur - SNAP_CORR) { result = snapTo; break; }
}
}
$content[0].scrollTop = savedScroll; // Restore scroll position
return result;
}
function smoothScrollTo(target) {
if (snapRafId) {
cancelAnimationFrame(snapRafId);
snapRafId = null;
}
const el = $content[0];
const from = el.scrollTop;
const dist = target - from;
const t0 = performance.now();
const ease = t => t < 0.5 ? 2*t*t : -1 + (4 - 2*t)*t;
function onDone() {
el.scrollTop = target;
lastScrollTop = lastSnapTarget = target;
waitingForUserScroll = true;
clearTimeout(scrollTimer);
scrollTimer = null;
snapRafId = null;
isSnapping = false;
}
if (Math.abs(dist) < 2)
return onDone();
snapRafId = requestAnimationFrame(function step(now) {
const p = Math.min((now - t0) / SNAP_DURATION, 1);
el.scrollTop = from + dist * ease(p);
if (p < 1)
snapRafId = requestAnimationFrame(step);
else
onDone();
});
}
function armSnap() {
waitingForUserScroll = false;
lastSnapTarget = null;
}
$content.on('scroll', function() {
if (isSnapping) return;
if (this.scrollTop > lastScrollTop + 1) scrollDir = 'down';
else if (this.scrollTop < lastScrollTop - 1) scrollDir = 'up';
lastScrollTop = this.scrollTop;
if (waitingForUserScroll) return;
clearTimeout(scrollTimer);
scrollTimer = setTimeout(()=>{
if (isSnapping) return;
const target = findSnap($content[0].scrollTop, scrollDir);
if (target){
isSnapping = true;
smoothScrollTo(target);
}
}, SNAP_DELAY);
});
let touchY = 0;
$content[0].addEventListener('touchstart', e => {
touchY = e.touches[0].clientY;
armSnap();
}, { passive: true });
$content[0].addEventListener('touchmove', e => {
const dy = touchY - e.touches[0].clientY;
if (Math.abs(dy) > 3)
scrollDir = dy > 0 ? 'down' : 'up';
}, { passive: true });
// Re-arm snap system on user scroll
$content[0].addEventListener('wheel', armSnap, { passive: true });
// Re-arm on after scrollbar usage
$content[0].addEventListener('pointerdown', e => {
if (e.target === $content[0])
armSnap();
});
// Re-arm on keyboard scroll or focus changes
document.addEventListener('keydown', e => {
if (document.activeElement != SearchBox){
let scrollKeys = ['ArrowUp','ArrowDown','PageUp','PageDown',' '];
let hasFocus = $content[0].contains(document.activeElement);
if(scrollKeys.includes(e.key) || (hasFocus && e.which == 9))
armSnap();
}
});
// ORCA unfocus search bar while scrolling and its content empty
$content[0].addEventListener("scroll", () => {
if (document.activeElement === SearchBox && SearchBox.value == "")
SearchBox.blur();
});
// LAYOUT SELECTOR
const LayoutSelector = document.querySelector('.LayoutSelector > .TabGroup');
const LayoutBtns = Array.from(LayoutSelector.children);
const LayoutTypes = ["compact-list","compact-cover","large-cover"];
function LayoutMode(value) {
if($content[0].getAttribute("layout") === value)
return;
// find current visible vendor and scroll to it after layout change
let target = null;
for (const el of $content.find('.OneVendorBlock')) {
if (el.getBoundingClientRect().bottom - $content[0].getBoundingClientRect().top >= -1) {
target = el.getAttribute("vendor");
break;
}
}
LayoutBtns.forEach(el => el.classList.remove('selected'));
LayoutBtns[LayoutTypes.indexOf(value)].classList.add('selected');
$content[0].setAttribute("layout", value);
if (target) scrollToVendor(target);
}
LayoutMode("large-cover");
initKeyEvents(false); // dont close on ESC
InitGlobalVariables();
</script>
</html>

Some files were not shown because too many files have changed in this diff Show More