mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-08-30 13:26:58 +00:00
Merge branch 'main' into belt/baseChanges
This commit is contained in:
@@ -628,10 +628,10 @@ msgid "Add connectors"
|
|||||||
msgstr "Adicionar conectores"
|
msgstr "Adicionar conectores"
|
||||||
|
|
||||||
msgid "Upper part"
|
msgid "Upper part"
|
||||||
msgstr "Parte superior"
|
msgstr "Peça superior"
|
||||||
|
|
||||||
msgid "Lower part"
|
msgid "Lower part"
|
||||||
msgstr "Parte inferior"
|
msgstr "Peça inferior"
|
||||||
|
|
||||||
msgid "Keep"
|
msgid "Keep"
|
||||||
msgstr "Manter"
|
msgstr "Manter"
|
||||||
@@ -8027,7 +8027,7 @@ msgid "Disable Auto-Drop to preserve z positioning?\n"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Object with floating parts was detected"
|
msgid "Object with floating parts was detected"
|
||||||
msgstr ""
|
msgstr "Foi detectado um objeto com partes flutuantes"
|
||||||
|
|
||||||
msgid "Another export job is running."
|
msgid "Another export job is running."
|
||||||
msgstr "Outro trabalho de exportação está em execução."
|
msgstr "Outro trabalho de exportação está em execução."
|
||||||
@@ -8446,7 +8446,7 @@ msgid "Triangles: %1%\n"
|
|||||||
msgstr "Triângulos: %1%\n"
|
msgstr "Triângulos: %1%\n"
|
||||||
|
|
||||||
msgid "Use \"Fix Model\" to repair the mesh."
|
msgid "Use \"Fix Model\" to repair the mesh."
|
||||||
msgstr ""
|
msgstr "Use \"Corrigir Modelo\" para reparar a malha."
|
||||||
|
|
||||||
#, c-format, boost-format
|
#, c-format, boost-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -8619,18 +8619,20 @@ msgid "Show splash screen"
|
|||||||
msgstr "Mostrar tela de abertura"
|
msgstr "Mostrar tela de abertura"
|
||||||
|
|
||||||
msgid "Show the splash screen during startup."
|
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"
|
msgid "Show shared profiles notification"
|
||||||
msgstr ""
|
msgstr "Mostrar notificação de perfis compartilhados"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Show a notification with a link to browse shared profiles when the selected "
|
"Show a notification with a link to browse shared profiles when the selected "
|
||||||
"printer is changed."
|
"printer is changed."
|
||||||
msgstr ""
|
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"
|
msgid "Use window buttons on left side"
|
||||||
msgstr ""
|
msgstr "Usar os botões de janela no lado esquerdo"
|
||||||
|
|
||||||
msgid "(Requires restart)"
|
msgid "(Requires restart)"
|
||||||
msgstr "(Requer reinício)"
|
msgstr "(Requer reinício)"
|
||||||
@@ -8963,12 +8965,15 @@ msgid ""
|
|||||||
"Limits viewport frame rate to reduce GPU load and power usage.\n"
|
"Limits viewport frame rate to reduce GPU load and power usage.\n"
|
||||||
"Set to 0 for unlimited frame rate."
|
"Set to 0 for unlimited frame rate."
|
||||||
msgstr ""
|
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"
|
msgid "Show FPS overlay"
|
||||||
msgstr ""
|
msgstr "Mostrar painel de FPS"
|
||||||
|
|
||||||
msgid "Displays current viewport FPS in the top-right corner."
|
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"
|
msgid "Login region"
|
||||||
msgstr "Região de login"
|
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 "
|
"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."
|
"BBL machines or use LAN mode only can safely turn on this function."
|
||||||
msgstr ""
|
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"
|
msgid "Network test"
|
||||||
msgstr "Teste de Rede"
|
msgstr "Teste de Rede"
|
||||||
@@ -9286,7 +9295,7 @@ msgid "Project-inside presets"
|
|||||||
msgstr "Predefinições dentro do projeto"
|
msgstr "Predefinições dentro do projeto"
|
||||||
|
|
||||||
msgid "Bundle presets"
|
msgid "Bundle presets"
|
||||||
msgstr ""
|
msgstr "Empacotar predefinições"
|
||||||
|
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "Sistema"
|
msgstr "Sistema"
|
||||||
@@ -9889,6 +9898,9 @@ msgid ""
|
|||||||
"type in the slicing file. Please make sure you have installed the correct "
|
"type in the slicing file. Please make sure you have installed the correct "
|
||||||
"filament in the external spool."
|
"filament in the external spool."
|
||||||
msgstr ""
|
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->"
|
msgid "Please refer to Wiki before use->"
|
||||||
msgstr "Consulte o Wiki antes de usar->"
|
msgstr "Consulte o Wiki antes de usar->"
|
||||||
@@ -11506,11 +11518,15 @@ msgid ""
|
|||||||
"Native Wayland liveview requires the GStreamer GTK video sink. Please "
|
"Native Wayland liveview requires the GStreamer GTK video sink. Please "
|
||||||
"install the gtksink plugin for GStreamer, then restart OrcaSlicer."
|
"install the gtksink plugin for GStreamer, then restart OrcaSlicer."
|
||||||
msgstr ""
|
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 ""
|
msgid ""
|
||||||
"Failed to initialize the native Wayland GStreamer video sink. Please check "
|
"Failed to initialize the native Wayland GStreamer video sink. Please check "
|
||||||
"your GStreamer GTK plugin installation."
|
"your GStreamer GTK plugin installation."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Falha ao inicializar o receptor de vídeo nativo do Wayland GStreamer. "
|
||||||
|
"Verifique a instalação do plugin GStreamer GTK."
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Windows Media Player is required for this task! Do you want to enable "
|
"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."
|
msgid "Cloud agent is not available. Please restart OrcaSlicer and try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"O agente na nuvem não está disponível. Reinicie o OrcaSlicer e tente "
|
||||||
|
"novamente."
|
||||||
|
|
||||||
msgid "Bambu Network plug-in not detected."
|
msgid "Bambu Network plug-in not detected."
|
||||||
msgstr "Plug-in de Rede Bambu não detectado."
|
msgstr "Plug-in de Rede Bambu não detectado."
|
||||||
@@ -11742,7 +11760,7 @@ msgid "Zoom out"
|
|||||||
msgstr "Afastar zoom"
|
msgstr "Afastar zoom"
|
||||||
|
|
||||||
msgid "Toggle printable for object/part"
|
msgid "Toggle printable for object/part"
|
||||||
msgstr ""
|
msgstr "Alternar modo de impressão para objeto/peça"
|
||||||
|
|
||||||
msgid "Switch between Prepare/Preview"
|
msgid "Switch between Prepare/Preview"
|
||||||
msgstr "Alternar entre Preparar/Pré-visualizar"
|
msgstr "Alternar entre Preparar/Pré-visualizar"
|
||||||
@@ -11997,13 +12015,13 @@ msgstr "Mesa de Extensão"
|
|||||||
|
|
||||||
#, boost-format
|
#, boost-format
|
||||||
msgid "Split into %1% parts"
|
msgid "Split into %1% parts"
|
||||||
msgstr ""
|
msgstr "Dividir em %1% peças"
|
||||||
|
|
||||||
msgid "Repair finished"
|
msgid "Repair finished"
|
||||||
msgstr "Reparo concluído"
|
msgstr "Reparo concluído"
|
||||||
|
|
||||||
msgid "Repair failed"
|
msgid "Repair failed"
|
||||||
msgstr ""
|
msgstr "Reparo falhou"
|
||||||
|
|
||||||
msgid "Repair canceled"
|
msgid "Repair canceled"
|
||||||
msgstr "Reparo cancelado"
|
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!"
|
msgstr "A matriz de volumes de descarga não corresponde ao tamanho correto!"
|
||||||
|
|
||||||
msgid "set_accel_and_jerk() is only supported by Klipper"
|
msgid "set_accel_and_jerk() is only supported by Klipper"
|
||||||
msgstr ""
|
msgstr "set_accel_and_jerk() só é suportado pelo Klipper"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Input shaping is not supported by Marlin < 2.1.2.\n"
|
"Input shaping is not supported by Marlin < 2.1.2.\n"
|
||||||
"Check your firmware version and update your G-code flavor to ´Marlin 2´"
|
"Check your firmware version and update your G-code flavor to ´Marlin 2´"
|
||||||
msgstr ""
|
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"
|
msgid "Input shaping is only supported by Klipper, RepRapFirmware and Marlin 2"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"O controle de entrada é suportado apenas pelo Klipper, RepRapFirmware e "
|
||||||
|
"Marlin 2"
|
||||||
|
|
||||||
msgid "Grouping error: "
|
msgid "Grouping error: "
|
||||||
msgstr "Erro de agrupamento: "
|
msgstr "Erro de agrupamento: "
|
||||||
@@ -12676,7 +12698,7 @@ msgstr ""
|
|||||||
"por este valor."
|
"por este valor."
|
||||||
|
|
||||||
msgid "Elephant foot layers density"
|
msgid "Elephant foot layers density"
|
||||||
msgstr ""
|
msgstr "Densidade das camadas do pé de elefante"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Density of internal solid infill for Elephant foot layers compensation.\n"
|
"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 "
|
"Subsequent layers become linearly denser by the height specified in "
|
||||||
"elefant_foot_compensation_layers."
|
"elefant_foot_compensation_layers."
|
||||||
msgstr ""
|
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 ""
|
msgid ""
|
||||||
"Slicing height for each layer. Smaller layer height means more accurate and "
|
"Slicing height for each layer. Smaller layer height means more accurate and "
|
||||||
@@ -13849,14 +13876,18 @@ msgstr ""
|
|||||||
msgid ""
|
msgid ""
|
||||||
"Enable this to override the fan speed set in custom G-code during print."
|
"Enable this to override the fan speed set in custom G-code during print."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Habilite para substituir a velocidade da ventoinha definida no G-code "
|
||||||
|
"personalizado durante a impressão."
|
||||||
|
|
||||||
msgid "On completion"
|
msgid "On completion"
|
||||||
msgstr ""
|
msgstr "Na cinclusão"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enable this to override the fan speed set in custom G-code after print "
|
"Enable this to override the fan speed set in custom G-code after print "
|
||||||
"completion."
|
"completion."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Habilite para substituir a velocidade da ventoinha definida no G-code "
|
||||||
|
"personalizado após a conclusão da impressão."
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Speed of exhaust fan during printing. This speed will override the speed in "
|
"Speed of exhaust fan during printing. This speed will override the speed in "
|
||||||
@@ -14284,6 +14315,13 @@ msgid ""
|
|||||||
"\n"
|
"\n"
|
||||||
"This option will be disabled if spiral vase mode is enabled."
|
"This option will be disabled if spiral vase mode is enabled."
|
||||||
msgstr ""
|
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"
|
msgid "Counter clockwise"
|
||||||
msgstr "Anti-horário"
|
msgstr "Anti-horário"
|
||||||
@@ -14684,16 +14722,16 @@ msgid "Auto For Match"
|
|||||||
msgstr "Automático para correspondência"
|
msgstr "Automático para correspondência"
|
||||||
|
|
||||||
msgid "Enable filament dynamic map"
|
msgid "Enable filament dynamic map"
|
||||||
msgstr ""
|
msgstr "Habilitar mapa dinâmico de filamento"
|
||||||
|
|
||||||
msgid "Enable dynamic filament mapping during print."
|
msgid "Enable dynamic filament mapping during print."
|
||||||
msgstr ""
|
msgstr "Habilitar mapeamento dinâmico de filamentos durante a impressão."
|
||||||
|
|
||||||
msgid "Has filament switcher"
|
msgid "Has filament switcher"
|
||||||
msgstr ""
|
msgstr "Tem trocador de filamentos"
|
||||||
|
|
||||||
msgid "Printer has a filament switcher hardware (e.g., AMS)."
|
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"
|
msgid "Flush temperature"
|
||||||
msgstr "Temperatura de purga"
|
msgstr "Temperatura de purga"
|
||||||
@@ -14968,10 +15006,10 @@ msgstr ""
|
|||||||
"confiável."
|
"confiável."
|
||||||
|
|
||||||
msgid "Wipe tower cooling"
|
msgid "Wipe tower cooling"
|
||||||
msgstr ""
|
msgstr "Resriamento da torre de limpeza"
|
||||||
|
|
||||||
msgid "Temperature drop before entering filament tower"
|
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"
|
msgid "Interface layer pre-extrusion distance"
|
||||||
msgstr "Distância de pré-extrusão da camada de interface"
|
msgstr "Distância de pré-extrusão da camada de interface"
|
||||||
@@ -15433,12 +15471,14 @@ msgstr ""
|
|||||||
"placa de impressão."
|
"placa de impressão."
|
||||||
|
|
||||||
msgid "First layer travel"
|
msgid "First layer travel"
|
||||||
msgstr ""
|
msgstr "Deslocamento para primeira camada"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Travel acceleration of first layer.\n"
|
"Travel acceleration of first layer.\n"
|
||||||
"The percentage value is relative to Travel Acceleration."
|
"The percentage value is relative to Travel Acceleration."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Aceleração de deslocamento para a primeira camada.\n"
|
||||||
|
"O valor percentual é relativo à Aceleração de Deslocamento."
|
||||||
|
|
||||||
msgid "Enable accel_to_decel"
|
msgid "Enable accel_to_decel"
|
||||||
msgstr "Habilitar 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 "
|
"Ripple: Uniform ripple pattern that ripples left and right of the original "
|
||||||
"path. Repeating pattern, woven appearance."
|
"path. Repeating pattern, woven appearance."
|
||||||
msgstr ""
|
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"
|
msgid "Classic"
|
||||||
msgstr "Clássico"
|
msgstr "Clássico"
|
||||||
@@ -15796,7 +15847,7 @@ msgid "Voronoi"
|
|||||||
msgstr "Voronoi"
|
msgstr "Voronoi"
|
||||||
|
|
||||||
msgid "Ripple"
|
msgid "Ripple"
|
||||||
msgstr ""
|
msgstr "Ondulação"
|
||||||
|
|
||||||
msgid "Fuzzy skin feature size"
|
msgid "Fuzzy skin feature size"
|
||||||
msgstr "Tamanho dos elementos da textura difusa"
|
msgstr "Tamanho dos elementos da textura difusa"
|
||||||
@@ -15829,13 +15880,14 @@ msgstr ""
|
|||||||
"baixos resultarão em ruído mais suave."
|
"baixos resultarão em ruído mais suave."
|
||||||
|
|
||||||
msgid "Number of ripples per layer"
|
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."
|
msgid "Controls how many full cycles of ripples will be added per layer."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Controla quantos ciclos completos de ondulações serão adicionados por camada."
|
||||||
|
|
||||||
msgid "Ripple offset"
|
msgid "Ripple offset"
|
||||||
msgstr ""
|
msgstr "Deslocamento das ondulações"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Shifts the ripple phase forward along the print path by the specified "
|
"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 "
|
"The shift is applied once every number of layers set by Layers between "
|
||||||
"ripple offset, so layers within the same group are printed identically."
|
"ripple offset, so layers within the same group are printed identically."
|
||||||
msgstr ""
|
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"
|
msgid "Layers between ripple offset"
|
||||||
msgstr ""
|
msgstr "Camadas entre o deslocamento de onda"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Specifies how many consecutive layers share the same ripple phase before the "
|
"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 "
|
"to 6 are shifted by the configured offset, then layers 7 to 9 return to the "
|
||||||
"base pattern, etc."
|
"base pattern, etc."
|
||||||
msgstr ""
|
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"
|
msgid "Filter out tiny gaps"
|
||||||
msgstr "Filtrar vazios pequenos"
|
msgstr "Filtrar vazios pequenos"
|
||||||
@@ -16596,13 +16669,17 @@ msgstr ""
|
|||||||
"Habilitar o contorno da camada Z (antisserrilhamento da camada Z)."
|
"Habilitar o contorno da camada Z (antisserrilhamento da camada Z)."
|
||||||
|
|
||||||
msgid "Minimize wall height angle"
|
msgid "Minimize wall height angle"
|
||||||
msgstr ""
|
msgstr "Minimizar o ângulo de altura das paredes"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Reduce the height of top-surface perimeters to match the model edge height.\n"
|
"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"
|
"Affects perimeters with a slope less than this angle (degrees).\n"
|
||||||
"A reasonable value is 35. Set to 0 to disable."
|
"A reasonable value is 35. Set to 0 to disable."
|
||||||
msgstr ""
|
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 "°"
|
msgid "°"
|
||||||
msgstr "°"
|
msgstr "°"
|
||||||
@@ -16615,12 +16692,14 @@ msgstr ""
|
|||||||
"Desative a alternância da direção de preenchimento ao usar o contorno em Z."
|
"Desative a alternância da direção de preenchimento ao usar o contorno em Z."
|
||||||
|
|
||||||
msgid "Minimum z height"
|
msgid "Minimum z height"
|
||||||
msgstr ""
|
msgstr "Altura Z mínima"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Minimum Z-layer height.\n"
|
"Minimum Z-layer height.\n"
|
||||||
"Also controls the slicing plane."
|
"Also controls the slicing plane."
|
||||||
msgstr ""
|
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."
|
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."
|
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."
|
msgstr "Velocidade máxima de prevenção de ressonância."
|
||||||
|
|
||||||
msgid "Emit input shaping"
|
msgid "Emit input shaping"
|
||||||
msgstr ""
|
msgstr "Emitir modelagem de entrada"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Override firmware input shaping settings.\n"
|
"Override firmware input shaping settings.\n"
|
||||||
"If disabled, firmware settings are used."
|
"If disabled, firmware settings are used."
|
||||||
msgstr ""
|
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"
|
msgid "Input shaper type"
|
||||||
msgstr "Tipo de modelador de entrada"
|
msgstr "Tipo de modelador de entrada"
|
||||||
@@ -16838,6 +16919,9 @@ msgid ""
|
|||||||
"Default uses the firmware default settings.\n"
|
"Default uses the firmware default settings.\n"
|
||||||
"Disable turns off input shaping in the firmware."
|
"Disable turns off input shaping in the firmware."
|
||||||
msgstr ""
|
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"
|
msgid "MZV"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -23280,6 +23364,10 @@ msgid ""
|
|||||||
"the surface quality of your overhangs? However, it can cause wall "
|
"the surface quality of your overhangs? However, it can cause wall "
|
||||||
"inconsistencies so use carefully!"
|
"inconsistencies so use carefully!"
|
||||||
msgstr ""
|
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]
|
#: resources/data/hints.ini: [hint:Cut Tool]
|
||||||
msgid ""
|
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",
|
"name": "Anycubic",
|
||||||
"version": "02.04.00.00",
|
"version": "02.04.00.01",
|
||||||
"force_update": "0",
|
"force_update": "0",
|
||||||
"description": "Anycubic configurations",
|
"description": "Anycubic configurations",
|
||||||
"machine_model_list": [
|
"machine_model_list": [
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "Artillery",
|
"name": "Artillery",
|
||||||
"version": "02.04.00.00",
|
"version": "02.04.00.01",
|
||||||
"force_update": "0",
|
"force_update": "0",
|
||||||
"description": "Artillery configurations",
|
"description": "Artillery configurations",
|
||||||
"machine_model_list": [
|
"machine_model_list": [
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "CoLiDo",
|
"name": "CoLiDo",
|
||||||
"version": "02.04.00.00",
|
"version": "02.04.00.01",
|
||||||
"force_update": "0",
|
"force_update": "0",
|
||||||
"description": "CoLiDo configurations",
|
"description": "CoLiDo configurations",
|
||||||
"machine_model_list": [
|
"machine_model_list": [
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "Comgrow",
|
"name": "Comgrow",
|
||||||
"version": "02.04.00.00",
|
"version": "02.04.00.01",
|
||||||
"force_update": "0",
|
"force_update": "0",
|
||||||
"description": "Comgrow configurations",
|
"description": "Comgrow configurations",
|
||||||
"machine_model_list": [
|
"machine_model_list": [
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "Creality",
|
"name": "Creality",
|
||||||
"version": "02.03.02.72",
|
"version": "02.03.02.73",
|
||||||
"force_update": "0",
|
"force_update": "0",
|
||||||
"description": "Creality configurations",
|
"description": "Creality configurations",
|
||||||
"machine_model_list": [
|
"machine_model_list": [
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "Cubicon",
|
"name": "Cubicon",
|
||||||
"version": "02.04.00.00",
|
"version": "02.04.00.01",
|
||||||
"force_update": "0",
|
"force_update": "0",
|
||||||
"description": "Cubicon configurations",
|
"description": "Cubicon configurations",
|
||||||
"machine_model_list": [
|
"machine_model_list": [
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "Elegoo",
|
"name": "Elegoo",
|
||||||
"version": "02.04.00.00",
|
"version": "02.04.00.02",
|
||||||
"force_update": "0",
|
"force_update": "0",
|
||||||
"description": "Elegoo configurations",
|
"description": "Elegoo configurations",
|
||||||
"machine_model_list": [
|
"machine_model_list": [
|
||||||
@@ -286,6 +286,10 @@
|
|||||||
"name": "0.40mm Standard @Elegoo Neptune 0.8 nozzle",
|
"name": "0.40mm Standard @Elegoo Neptune 0.8 nozzle",
|
||||||
"sub_path": "process/EN2SERIES/0.40mm Standard @Elegoo Neptune 0.8 nozzle.json"
|
"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",
|
"name": "0.50mm Standard @Elegoo N3Max 1.0 nozzle",
|
||||||
"sub_path": "process/EN3SERIES/0.50mm Standard @Elegoo N3Max 1.0 nozzle.json"
|
"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",
|
"name": "0.50mm Standard @Elegoo N4Pro 1.0 nozzle",
|
||||||
"sub_path": "process/EN4SERIES/0.50mm Standard @Elegoo N4Pro 1.0 nozzle.json"
|
"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",
|
"name": "0.08mm Optimal @Elegoo N3Max 0.2 nozzle",
|
||||||
"sub_path": "process/EN3SERIES/0.08mm Optimal @Elegoo N3Max 0.2 nozzle.json"
|
"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",
|
"name": "0.12mm Draft @Elegoo N4Pro 0.2 nozzle",
|
||||||
"sub_path": "process/EN4SERIES/0.12mm Draft @Elegoo N4Pro 0.2 nozzle.json"
|
"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",
|
"name": "0.24mm Optimal @Elegoo N3Max 0.6 nozzle",
|
||||||
"sub_path": "process/EN3SERIES/0.24mm Optimal @Elegoo N3Max 0.6 nozzle.json"
|
"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",
|
"name": "0.42mm Extra Draft @Elegoo N4Pro 0.6 nozzle",
|
||||||
"sub_path": "process/EN4SERIES/0.42mm Extra Draft @Elegoo N4Pro 0.6 nozzle.json"
|
"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",
|
"name": "0.24mm Fine @Elegoo N3Max 0.8 nozzle",
|
||||||
"sub_path": "process/EN3SERIES/0.24mm Fine @Elegoo N3Max 0.8 nozzle.json"
|
"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",
|
"name": "0.48mm Draft @Elegoo N4Pro 0.8 nozzle",
|
||||||
"sub_path": "process/EN4SERIES/0.48mm Draft @Elegoo N4Pro 0.8 nozzle.json"
|
"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",
|
"name": "0.30mm Fine @Elegoo N3Max 1.0 nozzle",
|
||||||
"sub_path": "process/EN3SERIES/0.30mm Fine @Elegoo N3Max 1.0 nozzle.json"
|
"sub_path": "process/EN3SERIES/0.30mm Fine @Elegoo N3Max 1.0 nozzle.json"
|
||||||
|
|||||||
@@ -48,6 +48,9 @@
|
|||||||
"extruder_offset": [
|
"extruder_offset": [
|
||||||
"0x0"
|
"0x0"
|
||||||
],
|
],
|
||||||
|
"retract_length_toolchange": [
|
||||||
|
"0"
|
||||||
|
],
|
||||||
"default_bed_type": "4",
|
"default_bed_type": "4",
|
||||||
"auto_toolchange_command": "0",
|
"auto_toolchange_command": "0",
|
||||||
"fan_speedup_time": "0.5",
|
"fan_speedup_time": "0.5",
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "Eryone",
|
"name": "Eryone",
|
||||||
"version": "02.04.00.00",
|
"version": "02.04.00.01",
|
||||||
"force_update": "0",
|
"force_update": "0",
|
||||||
"description": "Eryone configurations",
|
"description": "Eryone configurations",
|
||||||
"machine_model_list": [
|
"machine_model_list": [
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "Flashforge",
|
"name": "Flashforge",
|
||||||
"url": "",
|
"url": "",
|
||||||
"version": "02.04.00.00",
|
"version": "02.04.00.01",
|
||||||
"force_update": "0",
|
"force_update": "0",
|
||||||
"description": "Flashforge configurations",
|
"description": "Flashforge configurations",
|
||||||
"machine_model_list": [
|
"machine_model_list": [
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "FlyingBear",
|
"name": "FlyingBear",
|
||||||
"version": "02.04.00.00",
|
"version": "02.04.00.01",
|
||||||
"force_update": "1",
|
"force_update": "1",
|
||||||
"description": "FlyingBear configurations",
|
"description": "FlyingBear configurations",
|
||||||
"machine_model_list": [
|
"machine_model_list": [
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "Ginger Additive",
|
"name": "Ginger Additive",
|
||||||
"version": "02.04.00.00",
|
"version": "02.04.00.01",
|
||||||
"force_update": "1",
|
"force_update": "1",
|
||||||
"description": "Ginger configuration",
|
"description": "Ginger configuration",
|
||||||
"machine_model_list": [
|
"machine_model_list": [
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "InfiMech",
|
"name": "InfiMech",
|
||||||
"version": "02.04.00.00",
|
"version": "02.04.00.01",
|
||||||
"force_update": "1",
|
"force_update": "1",
|
||||||
"description": "InfiMech configurations",
|
"description": "InfiMech configurations",
|
||||||
"machine_model_list": [
|
"machine_model_list": [
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "Kingroon",
|
"name": "Kingroon",
|
||||||
"url": "https://kingroon.com/",
|
"url": "https://kingroon.com/",
|
||||||
"version": "02.04.00.00",
|
"version": "02.04.00.01",
|
||||||
"force_update": "1",
|
"force_update": "1",
|
||||||
"description": "Kingroon configuration files",
|
"description": "Kingroon configuration files",
|
||||||
"machine_model_list": [
|
"machine_model_list": [
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
"initial_layer_line_width": "0.5",
|
"initial_layer_line_width": "0.5",
|
||||||
"initial_layer_speed": "60",
|
"initial_layer_speed": "60",
|
||||||
"initial_layer_travel_speed": "300",
|
"initial_layer_travel_speed": "300",
|
||||||
|
"initial_layer_travel_acceleration": "4000",
|
||||||
"inner_wall_acceleration": "20000",
|
"inner_wall_acceleration": "20000",
|
||||||
"inner_wall_jerk": "15",
|
"inner_wall_jerk": "15",
|
||||||
"inner_wall_line_width": "0.4",
|
"inner_wall_line_width": "0.4",
|
||||||
|
|||||||
@@ -68,6 +68,258 @@
|
|||||||
"name": "fdm_filament_pla",
|
"name": "fdm_filament_pla",
|
||||||
"sub_path": "filament/base/fdm_filament_pla.json"
|
"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",
|
"name": "fdm_filament_pp",
|
||||||
"sub_path": "filament/base/fdm_filament_pp.json"
|
"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",
|
"name": "Phrozen",
|
||||||
"version": "02.04.00.00",
|
"version": "02.04.00.01",
|
||||||
"force_update": "0",
|
"force_update": "0",
|
||||||
"description": "Phrozen configurations",
|
"description": "Phrozen configurations",
|
||||||
"machine_model_list": [
|
"machine_model_list": [
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "Prusa",
|
"name": "Prusa",
|
||||||
"version": "02.04.00.00",
|
"version": "02.04.00.01",
|
||||||
"force_update": "0",
|
"force_update": "0",
|
||||||
"description": "Prusa configurations",
|
"description": "Prusa configurations",
|
||||||
"machine_model_list": [
|
"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
|
/* UNIQUE STYLES */
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
@@ -1,395 +1,15 @@
|
|||||||
|
// UNIQUE FUNCTIONS
|
||||||
|
|
||||||
|
// Keep in here for future additions
|
||||||
function OnInit()
|
function OnInit()
|
||||||
{
|
{
|
||||||
//let strInput=JSON.stringify(cData);
|
//let strInput=JSON.stringify(cData);
|
||||||
//HandleModelList(cData);
|
//HandleModelList(cData);
|
||||||
|
|
||||||
TranslatePage();
|
TranslatePage();
|
||||||
|
|
||||||
RequestProfile();
|
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()
|
function GotoFilamentPage()
|
||||||
{
|
{
|
||||||
let nChoose=OnExitFilter();
|
let nChoose=OnExitFilter();
|
||||||
@@ -397,97 +17,3 @@ function GotoFilamentPage()
|
|||||||
if(nChoose>0)
|
if(nChoose>0)
|
||||||
window.open('../22/index.html','_self');
|
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>
|
<title>引导_P21</title>
|
||||||
<link rel="stylesheet" type="text/css" href="../../include/global.css" /> <!-- ORCA One for all-->
|
<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="../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="21.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="../css/dark.css" />
|
<link rel="stylesheet" type="text/css" href="../css/dark.css" />
|
||||||
<script type="text/javascript" src="test.js"></script>
|
<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="../../data/text.js"></script>
|
||||||
<script type="text/javascript" src="../js/globalapi.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="../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>
|
</head>
|
||||||
<body onLoad="OnInit()">
|
<body onLoad="OnInit()">
|
||||||
<div id="Title">
|
<div id="Title">
|
||||||
@@ -49,93 +51,33 @@
|
|||||||
|
|
||||||
<div id="Content" class="thin-scroll">
|
<div id="Content" class="thin-scroll">
|
||||||
|
|
||||||
<!--<div class="OneVendorBlock" Vendor="BBL">
|
<!-- EXAMPLE GENERATED CODE BLOCK
|
||||||
<div class="BlockBanner">
|
<div class="OneVendorBlock" Vendor="VendorName">
|
||||||
<a>BBL-3DP</a>
|
<div class="BlockBanner">
|
||||||
<div class="BannerBtns">
|
<a>VendorName</a>
|
||||||
<div class="ButtonStyleConfirm ButtonTypeWindow trans" onClick="SelectPrinterAll('BBL')">所有</div>
|
<div class="BannerBtns" onClick="ChooseVendor('VendorName')" >
|
||||||
<div class="ButtonStyleRegular ButtonTypeWindow trans" onClick="SelectPrinterNone('BBL')">无</div>
|
<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>
|
</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>
|
||||||
<div id="AcceptArea">
|
<div id="AcceptArea">
|
||||||
@@ -153,212 +95,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
<script>
|
<script>
|
||||||
const SearchBox = document.querySelector('.searchTerm');
|
initKeyEvents(false); // dont close on ESC
|
||||||
|
InitGlobalVariables();
|
||||||
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");
|
|
||||||
</script>
|
</script>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user