mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-07-15 23:12:08 +00:00
Merge branch 'main' into belt/baseChanges
This commit is contained in:
@@ -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 ""
|
||||
|
||||
19696
localization/i18n/th/OrcaSlicer_th.po
Normal file
19696
localization/i18n/th/OrcaSlicer_th.po
Normal file
File diff suppressed because it is too large
Load Diff
BIN
resources/fonts/Sarabun-Medium.ttf
Normal file
BIN
resources/fonts/Sarabun-Medium.ttf
Normal file
Binary file not shown.
BIN
resources/fonts/Sarabun-SemiBold.ttf
Normal file
BIN
resources/fonts/Sarabun-SemiBold.ttf
Normal file
Binary file not shown.
@@ -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": [
|
||||
|
||||
@@ -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
@@ -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": [
|
||||
|
||||
@@ -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": [
|
||||
|
||||
@@ -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": [
|
||||
|
||||
@@ -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": [
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
@@ -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": [
|
||||
|
||||
@@ -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": [
|
||||
|
||||
@@ -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": [
|
||||
|
||||
@@ -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": [
|
||||
|
||||
@@ -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": [
|
||||
|
||||
@@ -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": [
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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": [
|
||||
|
||||
@@ -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": [
|
||||
|
||||
247
resources/shaders/110/phong.fs
Normal file
247
resources/shaders/110/phong.fs
Normal 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);
|
||||
}
|
||||
54
resources/shaders/110/phong.vs
Normal file
54
resources/shaders/110/phong.vs
Normal 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);
|
||||
}
|
||||
85
resources/shaders/110/ssao.fs
Normal file
85
resources/shaders/110/ssao.fs
Normal 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);
|
||||
}
|
||||
15
resources/shaders/110/ssao.vs
Normal file
15
resources/shaders/110/ssao.vs
Normal 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);
|
||||
}
|
||||
250
resources/shaders/140/phong.fs
Normal file
250
resources/shaders/140/phong.fs
Normal 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);
|
||||
}
|
||||
54
resources/shaders/140/phong.vs
Normal file
54
resources/shaders/140/phong.vs
Normal 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);
|
||||
}
|
||||
103
resources/shaders/140/ssao.fs
Normal file
103
resources/shaders/140/ssao.fs
Normal 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);
|
||||
}
|
||||
15
resources/shaders/140/ssao.vs
Normal file
15
resources/shaders/140/ssao.vs
Normal 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);
|
||||
}
|
||||
@@ -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 */
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
441
resources/web/guide/21/common.css
Normal file
441
resources/web/guide/21/common.css
Normal 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;
|
||||
}
|
||||
632
resources/web/guide/21/common.js
Normal file
632
resources/web/guide/21/common.js
Normal 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;
|
||||
//}
|
||||
};
|
||||
}
|
||||
@@ -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
Reference in New Issue
Block a user