meerk40t 0.9.7910__py2.py3-none-any.whl → 0.9.7940__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. meerk40t/balormk/controller.py +46 -13
  2. meerk40t/balormk/livelightjob.py +34 -7
  3. meerk40t/core/bindalias.py +12 -4
  4. meerk40t/core/cutcode/plotcut.py +2 -1
  5. meerk40t/core/elements/branches.py +35 -14
  6. meerk40t/core/elements/clipboard.py +10 -12
  7. meerk40t/core/elements/elements.py +23 -0
  8. meerk40t/core/elements/files.py +1 -1
  9. meerk40t/core/elements/geometry.py +48 -14
  10. meerk40t/core/elements/grid.py +56 -24
  11. meerk40t/core/elements/offset_clpr.py +2 -4
  12. meerk40t/core/elements/placements.py +17 -22
  13. meerk40t/core/elements/render.py +30 -11
  14. meerk40t/core/elements/shapes.py +206 -126
  15. meerk40t/core/node/effect_hatch.py +8 -7
  16. meerk40t/core/node/effect_warp.py +7 -2
  17. meerk40t/core/node/effect_wobble.py +8 -2
  18. meerk40t/core/node/op_image.py +79 -25
  19. meerk40t/core/spoolers.py +1 -1
  20. meerk40t/core/units.py +4 -0
  21. meerk40t/grbl/emulator.py +10 -8
  22. meerk40t/grbl/gcodejob.py +11 -3
  23. meerk40t/grbl/plugin.py +10 -1
  24. meerk40t/gui/help_assets/help_assets.py +402 -43
  25. meerk40t/gui/plugin.py +12 -0
  26. meerk40t/gui/tips.py +78 -41
  27. meerk40t/gui/wxmmain.py +99 -4
  28. meerk40t/lihuiyu/driver.py +46 -9
  29. meerk40t/main.py +1 -1
  30. meerk40t/ruida/emulator.py +13 -10
  31. meerk40t/ruida/plugin.py +5 -0
  32. meerk40t/ruida/rdjob.py +5 -5
  33. meerk40t/tools/geomstr.py +15 -0
  34. {meerk40t-0.9.7910.dist-info → meerk40t-0.9.7940.dist-info}/METADATA +1 -1
  35. {meerk40t-0.9.7910.dist-info → meerk40t-0.9.7940.dist-info}/RECORD +40 -40
  36. {meerk40t-0.9.7910.dist-info → meerk40t-0.9.7940.dist-info}/LICENSE +0 -0
  37. {meerk40t-0.9.7910.dist-info → meerk40t-0.9.7940.dist-info}/WHEEL +0 -0
  38. {meerk40t-0.9.7910.dist-info → meerk40t-0.9.7940.dist-info}/entry_points.txt +0 -0
  39. {meerk40t-0.9.7910.dist-info → meerk40t-0.9.7940.dist-info}/top_level.txt +0 -0
  40. {meerk40t-0.9.7910.dist-info → meerk40t-0.9.7940.dist-info}/zip-safe +0 -0
@@ -259,6 +259,356 @@ russian_wordlist_howto = """
259
259
 
260
260
  Для полного набора директив форматирования см.: https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
261
261
  """
262
+ spanish_wordlist_howto = """
263
+ Las Listas de Palabras le permiten crear elementos de texto en su diseño que contienen texto de marcador de posición que se reemplaza en el momento de la grabación desde esta Lista de Palabras. Así puede grabar varios elementos con diferentes textos sin tener que cambiar su diseño cada vez.
264
+
265
+ Un marcador de posición consiste en un nombre dentro de llaves, por ejemplo '{NOMBRE}'. Utilice el nombre en el Editor de Listas de Palabras para asociarlo con el marcador de posición y este será reemplazado por el texto que ingrese en el Contenido de la Lista de Palabras asociada.
266
+
267
+ Por ejemplo, imagine que quiere crear un conjunto de etiquetas de reserva de asientos para una cena, cada una con el nombre de una persona diferente. Habiendo creado el contorno de la etiqueta, por ejemplo un rectángulo, use la herramienta de texto para crear un elemento de texto que contenga lo siguiente:
268
+ 'Este asiento está reservado para {NOMBRE}'
269
+
270
+ Luego use el editor de Listas de Palabras para crear una o más entradas como sigue:
271
+ |-----------|------|-------|
272
+ | Nombre | Tipo | Índice|
273
+ |-----------|------|-------|
274
+ | nombre | Texto| 0 |
275
+ |-----------|------|-------|
276
+ Después haga clic en la fila 'nombre' y agregue varios elementos al panel de Contenidos, por ejemplo:
277
+ Pablo
278
+ David
279
+ Andy
280
+ Ahora, cuando ejecute la grabación, obtendrá etiquetas individuales con diferentes nombres, por ejemplo 'Este asiento está reservado para Andy'.
281
+
282
+ Puede usar tantos nombres de marcadores de posición como desee en los campos de texto de su diseño.
283
+
284
+ El valor 'Índice' en la tabla de la Lista de Palabras indica qué entrada de la lista de contenidos se usará a continuación, cero significa la primera entrada. El índice se incrementa automáticamente en uno al final de cada grabación.
285
+
286
+ Pero suponga que por eficiencia ahora quiere grabar dos etiquetas de reserva de asientos al mismo tiempo, cada una con un nombre diferente de la misma lista. En este caso, si la primera etiqueta usa '{NOMBRE#+0}' y la segunda '{NOMBRE#+1}' (note el signo más). '{NOMBRE}' o '{NOMBRE#+0}' usa la entrada actual (apuntada por el valor de Índice), '{NOMBRE#+1}' usa la siguiente entrada después de la actual, etc.
287
+
288
+ Con el uso anterior, puede usar estos valores tantas veces como desee en su diseño. Para avanzar el índice debe hacer clic en los botones Anterior / Siguiente en la barra de herramientas.
289
+
290
+ Como alternativa a ingresar manualmente los valores de la lista de palabras usando este editor, puede usar un archivo CSV estándar separado por comas. Los nombres de los marcadores de posición se definen en la línea de encabezado estándar del CSV (la primera línea del archivo CSV), y el contenido se toma de todas las líneas siguientes. La forma más fácil de crear un archivo CSV es usando una hoja de cálculo, por ejemplo Excel, aunque para sitios de comercio electrónico su sitio web podría crear automáticamente el archivo CSV a partir de los pedidos realizados en línea por los clientes.
291
+
292
+ Las entradas cargadas desde un archivo CSV se muestran como Tipo CSV, y puede establecer los valores de Índice para todas las entradas CSV al mismo tiempo.
293
+
294
+ Nota: Si su CSV no tiene una línea de encabezado, las columnas se llamarán 'column_1', 'column_2', etc.
295
+
296
+ La lista de palabras también contiene algunas entradas especiales (que pueden ser especialmente útiles para diseños de calibración):
297
+ * 'version' - Versión de Meerk40t
298
+ * 'date' - Fecha de inicio de la grabación
299
+ * 'time' - Hora de inicio de la grabación
300
+ * 'op_device' - Dispositivo en el que está grabando
301
+ * 'op_speed' - Velocidad de la operación actual
302
+ * 'op_power' - PPI de la operación actual
303
+ * 'op_dpi' - DPI de la operación actual (raster)
304
+ * 'op_passes' - Pasadas de la operación actual
305
+
306
+ Los marcadores de posición para 'date' y 'time' también pueden contener directivas de formato que le permiten formatearlos según sus convenciones locales, por ejemplo:
307
+ {date@%d.%m.%Y} - 31.12.2022
308
+ {time@%H:%M} - 23:59
309
+
310
+ Para un conjunto completo de directivas de formato, consulte: https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
311
+ """
312
+ chinese_wordlist_howto = """
313
+ 单词列表允许您在设计中创建包含占位符文本的文本元素,这些占位符文本将在烧录时由该单词列表中的内容替换。这样,您可以在不每次更改设计的情况下烧录多个带有不同文本的项目。
314
+
315
+ 占位符由大括号中的名称组成,例如“{FIRSTNAME}”。您可以在单词列表编辑器中使用该名称将其与占位符关联,占位符将被您在相关单词列表内容中输入的文本替换。
316
+
317
+ 例如,假设您想为晚宴创建一组座位预留标签,每个标签上都有不同的名字。创建好标签轮廓(例如一个矩形)后,使用文本绘图工具创建一个包含如下内容的文本元素:
318
+ “此座位保留给{FIRSTNAME}”
319
+
320
+ 然后,您可以使用单词列表编辑器创建一个或多个如下条目:
321
+ |-----------|------|-------|
322
+ | 名称 | 类型 | 索引 |
323
+ |-----------|------|-------|
324
+ | firstname | 文本 | 0 |
325
+ |-----------|------|-------|
326
+ 然后点击“firstname”行,在内容面板中添加多个项目,例如:
327
+ 保罗
328
+ 大卫
329
+ 安迪
330
+ 现在,当您执行烧录时,您将获得带有不同名字的单独座位标签,例如“此座位保留给安迪”。
331
+
332
+ 您可以在设计的文本字段中使用任意数量的不同占位符名称。
333
+
334
+ 单词列表表中的“索引”值指示下一个将使用内容列表中的哪个条目,零表示第一个条目。每次烧录结束时,索引会自动加一。
335
+
336
+ 但假设为了提高效率,您现在想同时烧录两个座位预留标签,每个标签都来自同一个列表但名字不同。在这种情况下,如果第一个标签使用“{NAME#+0}”,第二个使用“{NAME#+1}”(注意加号)。 “{NAME}”或“{NAME#+0}”使用当前条目(由索引值指向), “{NAME#+1}”使用当前条目之后的下一个条目,依此类推。
337
+
338
+ 通过上述用法,您可以在设计中多次使用这些值。要推进索引,您需要点击工具栏上的上一个/下一个按钮。
339
+
340
+ 除了使用此单词列表编辑器手动输入单词列表值外,您还可以使用标准逗号分隔的CSV文件。占位符名称在标准CSV头行(CSV文件的第一行)中定义,内容则取自所有后续行。创建CSV文件的最简单方法是使用电子表格(如Excel),当然对于电商网站,您的网站也可以根据客户在线下单自动创建CSV文件。
341
+
342
+ 从CSV文件加载的条目显示为类型CSV,您可以同时为所有CSV条目设置索引值。
343
+
344
+ 注意:如果您的CSV没有头行,列将被命名为“column_1”、“column_2”等。
345
+
346
+ 单词列表还包含一些特殊条目(对于校准设计可能特别有用):
347
+ * 'version' - Meerk40t版本
348
+ * 'date' - 烧录开始日期
349
+ * 'time' - 烧录开始时间
350
+ * 'op_device' - 您正在烧录的设备
351
+ * 'op_speed' - 当前操作的速度
352
+ * 'op_power' - 当前操作的PPI
353
+ * 'op_dpi' - 当前(光栅)操作的DPI
354
+ * 'op_passes' - 当前操作的遍数
355
+
356
+ “date”和“time”的占位符还可以包含格式指令,允许您根据本地习惯对其进行格式化,例如:
357
+ {date@%Y.%m.%d} - 2022.12.31
358
+ {time@%H:%M} - 23:59
359
+
360
+ 完整的格式指令请参见:https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
361
+ """
362
+ hungarian_wordlist_howto = """
363
+ A Szólisták lehetővé teszik, hogy a tervezésben olyan szövegelemeket hozzon létre, amelyek helyőrző szöveget tartalmaznak, és ezeket a szólistából származó tartalommal cseréli ki az égetés során. Így több elemet is égethet különböző szövegekkel anélkül, hogy minden alkalommal módosítania kellene a tervet.
364
+
365
+ A helyőrző egy név, amely kapcsos zárójelek között van, például '{KERESZTNÉV}'. A Szólista szerkesztőben ezt a nevet használja a helyőrzőhöz való társításhoz, és a helyőrzőt az Ön által a kapcsolódó Szólista tartalmába beírt szöveg váltja fel.
366
+
367
+ Például, ha vacsorához szeretne ülésfoglaló címkéket készíteni, mindegyiken más-más névvel, akkor hozzon létre egy névcímke körvonalat (például egy téglalapot), majd a Szöveg eszközzel hozzon létre egy szövegelemet, amely a következőt tartalmazza:
368
+ 'Ez a hely {KERESZTNÉV} számára van fenntartva'
369
+
370
+ Ezután a Szólista szerkesztővel hozzon létre egy vagy több bejegyzést az alábbiak szerint:
371
+ |-----------|------|-------|
372
+ | Név | Típus| Index |
373
+ |-----------|------|-------|
374
+ | keresztnev| Szöveg| 0 |
375
+ |-----------|------|-------|
376
+ Ezután kattintson a 'keresztnev' sorra, és adjon hozzá több elemet a Tartalom panelhez, például:
377
+ Pál
378
+ Dávid
379
+ András
380
+ Most, amikor végrehajtja az égetést, egyedi helycímkéket kap, amelyek különböző neveket tartalmaznak, például 'Ez a hely András számára van fenntartva'.
381
+
382
+ A tervezés szövegmezőiben annyi különböző helyőrző nevet használhat, amennyit csak szeretne.
383
+
384
+ A Szólista táblázat 'Index' értéke azt jelzi, hogy a Tartalom listából melyik bejegyzést használja legközelebb, a nulla az első bejegyzést jelenti. Az index minden égetés végén automatikusan eggyel növekszik.
385
+
386
+ Ha azonban hatékonyság szempontjából most két ülésfoglaló címkét szeretne egyszerre égetni, mindegyik más-más névvel ugyanabból a listából, akkor az első címke '{NÉV#+0}', a második pedig '{NÉV#+1}' (figyelje a plusz jelet). A '{NÉV}' vagy '{NÉV#+0}' a jelenlegi bejegyzést használja (amelyre az Index érték mutat), a '{NÉV#+1}' a jelenlegi utáni következő bejegyzést stb.
387
+
388
+ A fenti használattal ezeket az értékeket annyiszor használhatja a tervezésben, ahányszor csak szeretné. Az index előrehaladásához kattintson az Előző/Következő gombokra az eszköztáron.
389
+
390
+ A szólista értékeit nemcsak manuálisan viheti be a Szólista szerkesztővel, hanem használhat szabványos, vesszővel elválasztott CSV-fájlt is. A helyőrző neveket a szabványos CSV-fejléc sorban (a CSV-fájl első sora) határozza meg, a tartalmat pedig az összes következő sorból veszi. A CSV-fájl létrehozásának legegyszerűbb módja egy táblázatkezelő, például az Excel használata, de például webáruházak esetén a weboldal automatikusan létrehozhatja a CSV-fájlt az online leadott rendelésekből.
391
+
392
+ A CSV-fájlból betöltött bejegyzések típusa CSV-ként jelenik meg, és az összes CSV-bejegyzés indexértékét egyszerre beállíthatja.
393
+
394
+ Megjegyzés: Ha a CSV-fájlban nincs fejlécsor, az oszlopokat 'column_1', 'column_2' stb. néven nevezi el.
395
+
396
+ A szólista néhány speciális bejegyzést is tartalmaz (amelyek különösen hasznosak lehetnek kalibrációs tervekhez):
397
+ * 'version' - Meerk40t verzió
398
+ * 'date' - Az égetés kezdési dátuma
399
+ * 'time' - Az égetés kezdési ideje
400
+ * 'op_device' - Az eszköz, amelyen éget
401
+ * 'op_speed' - Az aktuális művelet sebessége
402
+ * 'op_power' - Az aktuális művelet PPI-je
403
+ * 'op_dpi' - Az aktuális (raszteres) művelet DPI-je
404
+ * 'op_passes' - Az aktuális művelet átfutásai
405
+
406
+ A 'date' és 'time' helyőrzők formázási utasításokat is tartalmazhatnak, amelyek lehetővé teszik, hogy azokat a helyi szokásoknak megfelelően formázza, például:
407
+ {date@%Y.%m.%d} - 2022.12.31
408
+ {time@%H:%M} - 23:59
409
+
410
+ A formátumutasítások teljes készletéhez lásd: https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
411
+ """
412
+ portuguese_wordlist_howto = """
413
+ As Listas de Palavras permitem criar elementos de texto no seu design que contêm texto de espaço reservado, substituído no momento da gravação pelo conteúdo desta Lista de Palavras. Assim, pode gravar vários itens com textos diferentes sem ter de alterar o design de cada vez.
414
+
415
+ Um espaço reservado consiste num nome entre chavetas, por exemplo '{NOME}'. Utilize o nome no Editor de Listas de Palavras para o associar ao espaço reservado e este será substituído pelo texto que inserir no Conteúdo da Lista de Palavras associada.
416
+
417
+ Por exemplo, imagine que quer criar um conjunto de etiquetas de reserva de lugares para um jantar, cada uma com o nome de uma pessoa diferente. Depois de criar o contorno da etiqueta, por exemplo um retângulo, utilize a ferramenta de texto para criar um elemento de texto com o seguinte conteúdo:
418
+ 'Este lugar está reservado para {NOME}'
419
+
420
+ Depois, utilize o editor de Listas de Palavras para criar uma ou mais entradas como segue:
421
+ |-----------|------|-------|
422
+ | Nome | Tipo | Índice|
423
+ |-----------|------|-------|
424
+ | nome | Texto| 0 |
425
+ |-----------|------|-------|
426
+ Depois clique na linha 'nome' e adicione vários itens ao painel de Conteúdo, por exemplo:
427
+ Paulo
428
+ David
429
+ Andy
430
+ Agora, ao executar a gravação, obterá etiquetas individuais com nomes diferentes, por exemplo 'Este lugar está reservado para Andy'.
431
+
432
+ Pode usar tantos nomes de espaços reservados quantos quiser nos campos de texto do seu design.
433
+
434
+ O valor 'Índice' na tabela da Lista de Palavras indica qual entrada da lista de conteúdos será usada a seguir, sendo zero a primeira entrada. O índice é automaticamente incrementado em um no final de cada gravação.
435
+
436
+ Mas suponha que, por eficiência, agora quer gravar duas etiquetas de reserva de lugares ao mesmo tempo, cada uma com um nome diferente da mesma lista. Neste caso, se a primeira etiqueta usar '{NOME#+0}' e a segunda '{NOME#+1}' (note o sinal de mais). '{NOME}' ou '{NOME#+0}' usa a entrada atual (apontada pelo valor do Índice), '{NOME#+1}' usa a próxima entrada após a atual, etc.
437
+
438
+ Com o uso acima, pode usar estes valores quantas vezes quiser no seu design. Para avançar o índice, deve clicar nos botões Anterior / Seguinte na barra de ferramentas.
439
+
440
+ Como alternativa à introdução manual dos valores da lista de palavras usando este editor, pode usar um ficheiro CSV padrão separado por vírgulas. Os nomes dos espaços reservados são definidos na linha de cabeçalho padrão do CSV (a primeira linha do ficheiro CSV), e o conteúdo é retirado de todas as linhas seguintes. A forma mais fácil de criar um ficheiro CSV é usando uma folha de cálculo, por exemplo o Excel, mas para sites de comércio eletrónico o seu site pode criar automaticamente o ficheiro CSV a partir das encomendas feitas online pelos clientes.
441
+
442
+ As entradas carregadas de um ficheiro CSV são apresentadas como Tipo CSV, e pode definir os valores de Índice para todas as entradas CSV ao mesmo tempo.
443
+
444
+ Nota: Se o seu CSV não tiver uma linha de cabeçalho, as colunas serão nomeadas 'column_1', 'column_2', etc.
445
+
446
+ A lista de palavras também contém algumas entradas especiais (que podem ser especialmente úteis para designs de calibração):
447
+ * 'version' - Versão do Meerk40t
448
+ * 'date' - Data de início da gravação
449
+ * 'time' - Hora de início da gravação
450
+ * 'op_device' - Dispositivo em que está a gravar
451
+ * 'op_speed' - Velocidade da operação atual
452
+ * 'op_power' - PPI da operação atual
453
+ * 'op_dpi' - DPI da operação atual (raster)
454
+ * 'op_passes' - Passagens da operação atual
455
+
456
+ Os espaços reservados para 'date' e 'time' também podem conter diretivas de formatação que permitem formatá-los de acordo com as suas convenções locais, por exemplo:
457
+ {date@%d.%m.%Y} - 31.12.2022
458
+ {time@%H:%M} - 23:59
459
+
460
+ Para um conjunto completo de diretivas de formato, consulte: https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
461
+ """
462
+ portuguese_brazilian_wordlist_howto = """
463
+ As Listas de Palavras permitem criar elementos de texto no seu design que contêm texto de espaço reservado, substituído no momento da gravação pelo conteúdo desta Lista de Palavras. Assim, pode gravar vários itens com textos diferentes sem ter de alterar o design de cada vez.
464
+
465
+ Um espaço reservado consiste num nome entre chaves, por exemplo '{NOME}'. Utilize o nome no Editor de Listas de Palavras para o associar ao espaço reservado e este será substituído pelo texto que inserir no Conteúdo da Lista de Palavras associada.
466
+
467
+ Por exemplo, imagine que quer criar um conjunto de etiquetas de reserva de lugares para um jantar, cada uma com o nome de uma pessoa diferente. Depois de criar o contorno da etiqueta, por exemplo um retângulo, utilize a ferramenta de texto para criar um elemento de texto com o seguinte conteúdo:
468
+ 'Este lugar está reservado para {NOME}'
469
+
470
+ Depois, utilize o editor de Listas de Palavras para criar uma ou mais entradas como segue:
471
+ |-----------|------|-------|
472
+ | Nome | Tipo | Índice|
473
+ |-----------|------|-------|
474
+ | nome | Texto| 0 |
475
+ |-----------|------|-------|
476
+ Depois clique na linha 'nome' e adicione vários itens ao painel de Conteúdo, por exemplo:
477
+ Paulo
478
+ David
479
+ Andy
480
+ Agora, ao executar a gravação, obterá etiquetas individuais com nomes diferentes, por exemplo 'Este lugar está reservado para Andy'.
481
+
482
+ Pode usar tantos nomes de espaços reservados quantos quiser nos campos de texto do seu design.
483
+
484
+ O valor 'Índice' na tabela da Lista de Palavras indica qual entrada da lista de conteúdos será usada a seguir, sendo zero a primeira entrada. O índice é automaticamente incrementado em um no final de cada gravação.
485
+
486
+ Mas suponha que, por eficiência, agora quer gravar duas etiquetas de reserva de lugares ao mesmo tempo, cada uma com um nome diferente da mesma lista. Neste caso, se a primeira etiqueta usar '{NOME#+0}' e a segunda '{NOME#+1}' (note o sinal de mais). '{NOME}' ou '{NOME#+0}' usa a entrada atual (apontada pelo valor do Índice), '{NOME#+1}' usa a próxima entrada após a atual, etc.
487
+
488
+ Com o uso acima, pode usar estes valores quantas vezes quiser no seu design. Para avançar o índice, deve clicar nos botões Anterior / Seguinte na barra de ferramentas.
489
+
490
+ Como alternativa à introdução manual dos valores da lista de palavras usando este editor, pode usar um ficheiro CSV padrão separado por vírgulas. Os nomes dos espaços reservados são definidos na linha de cabeçalho padrão do CSV (a primeira linha do ficheiro CSV), e o conteúdo é retirado de todas as linhas seguintes. A forma mais fácil de criar um ficheiro CSV é usando uma folha de cálculo, por exemplo o Excel, mas para sites de comércio eletrónico o seu site pode criar automaticamente o ficheiro CSV a partir das encomendas feitas online pelos clientes.
491
+
492
+ As entradas carregadas de um ficheiro CSV são apresentadas como Tipo CSV, e pode definir os valores de Índice para todas as entradas CSV ao mesmo tempo.
493
+
494
+ Nota: Se o seu CSV não tiver uma linha de cabeçalho, as colunas serão nomeadas 'column_1', 'column_2', etc.
495
+
496
+ A lista de palavras também contém algumas entradas especiais (que podem ser especialmente úteis para designs de calibração):
497
+ * 'version' - Versão do Meerk40t
498
+ * 'date' - Data de início da gravação
499
+ * 'time' - Hora de início da gravação
500
+ * 'op_device' - Dispositivo em que está a gravar
501
+ * 'op_speed' - Velocidade da operação atual
502
+ * 'op_power' - PPI da operação atual
503
+ * 'op_dpi' - DPI da operação atual (raster)
504
+ * 'op_passes' - Passagens da operação atual
505
+
506
+ Os espaços reservados para 'date' e 'time' também podem conter diretivas de formatação que permitem formatá-los de acordo com as suas convenções locais, por exemplo:
507
+ {date@%d.%m.%Y} - 31.12.2022
508
+ {time@%H:%M} - 23:59
509
+
510
+ Para um conjunto completo de diretivas de formato, consulte: https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
511
+ """
512
+ japanese_wordlist_howto = """
513
+ ワードリストを使用すると、デザイン内のテキスト要素にプレースホルダーテキストを含めることができ、焼成時にこのワードリストから内容に置き換えられます。これにより、毎回デザインを変更することなく、異なるテキストを持つ複数のアイテムを焼成できます。
514
+
515
+ プレースホルダーは中括弧内の名前で構成されます。例: '{FIRSTNAME}'。ワードリストエディタでこの名前を使用してプレースホルダーと関連付けると、関連付けられたワードリストの内容に入力したテキストでプレースホルダーが置き換えられます。
516
+
517
+ この機能の使用例として、ディナーパーティーの席予約タグを作成したいとします。各タグには異なる人の名前が入っています。名札の輪郭(例:長方形)を作成した後、テキスト描画ツールを使用して次の内容を含むテキスト要素を作成します:
518
+ 「この席は{FIRSTNAME}のために予約されています」
519
+
520
+ 次に、このワードリストエディタを使用して、次のようなエントリを1つ以上作成します:
521
+ |-----------|------|-------|
522
+ | 名前 | 種類 | インデックス |
523
+ |-----------|------|-------|
524
+ | firstname | テキスト | 0 |
525
+ |-----------|------|-------|
526
+ 次に「firstname」行をクリックし、内容ペインにいくつかの項目を追加します。例:
527
+ ポール
528
+ デイビッド
529
+ アンディ
530
+ これで焼成を実行すると、「この席はアンディのために予約されています」のように、異なる名前が入った個別の席札が得られます。
531
+
532
+ デザインのテキストフィールドには、好きなだけ多くの異なるプレースホルダー名を使用できます。
533
+
534
+ ワードリストテーブルの「インデックス」値は、次に使用される内容リストのエントリを示します。ゼロは最初のエントリを意味します。インデックスは各焼成の最後に自動的に1つ増加します。
535
+
536
+ 効率のために、同じリストから異なる名前を持つ2つの席予約タグを同時に焼成したい場合、最初のタグは「{NAME#+0}」、2番目は「{NAME#+1}」(プラス記号に注意)を使用します。「{NAME}」または「{NAME#+0}」は現在のエントリ(インデックス値が指すもの)を使用し、「{NAME#+1}」は現在の次のエントリを使用します。
537
+
538
+ 上記の使い方で、これらの値はデザイン内で何度でも使用できます。インデックスを進めるには、ツールバーの前/次ボタンをクリックします。
539
+
540
+ このワードリストエディタを使用して手動で値を入力する代わりに、標準のカンマ区切りCSVファイルを使用することもできます。プレースホルダー名は標準のCSVヘッダー行(CSVファイルの最初の行)で定義され、内容はすべての後続行から取得されます。CSVファイルを作成する最も簡単な方法は、Excelなどのスプレッドシートを使用することです。ECサイトの場合、ウェブサイトが顧客の注文から自動的にCSVファイルを作成することもできます。
541
+
542
+ CSVファイルから読み込まれたエントリはタイプCSVとして表示され、すべてのCSVエントリのインデックス値を同時に設定できます。
543
+
544
+ 注意:CSVにヘッダー行がない場合、列は「column_1」、「column_2」などと名付けられます。
545
+
546
+ ワードリストには、いくつかの特別なエントリも含まれています(キャリブレーションデザインに特に便利です):
547
+ * 'version' - Meerk40tバージョン
548
+ * 'date' - 焼成開始日
549
+ * 'time' - 焼成開始時刻
550
+ * 'op_device' - 使用しているデバイス
551
+ * 'op_speed' - 現在の操作の速度
552
+ * 'op_power' - 現在の操作のPPI
553
+ * 'op_dpi' - 現在(ラスター)操作のDPI
554
+ * 'op_passes' - 現在の操作のパス数
555
+
556
+ 「date」と「time」のプレースホルダーには、ローカルの規則に従ってフォーマットできる書式指定子を含めることもできます。例:
557
+ {date@%Y.%m.%d} - 2022.12.31
558
+ {time@%H:%M} - 23:59
559
+
560
+ 書式指定子の完全なセットについては、https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior を参照してください。
561
+ """
562
+ dutch_wordlist_howto = """
563
+ Met Woordenlijsten kunt u textelementen in uw ontwerp maken die tijdelijke tekst bevatten die bij het branden wordt vervangen door deze Woordenlijst. U kunt dan meerdere items met verschillende tekst branden zonder uw ontwerp telkens te hoeven wijzigen.
564
+
565
+ Een tijdelijke aanduiding bestaat uit een naam tussen accolades, bijvoorbeeld '{VOORNAAM}'. U gebruikt de naam in de Woordenlijst-editor om deze te koppelen aan de tijdelijke aanduiding en de tijdelijke aanduiding wordt vervangen door de tekst die u invoert in de bijbehorende Woordenlijst-inhoud.
566
+
567
+ Als voorbeeld van hoe deze functionaliteit wordt gebruikt, stel dat u een set zitplaatsreserveringslabels voor een diner wilt maken, elk met een andere naam. Nadat u het snijpad voor de naamlabelomtrek hebt gemaakt, bijvoorbeeld een rechthoek, gebruikt u het tekstgereedschap om een textelement te maken met de volgende inhoud:
568
+ 'Deze stoel is gereserveerd voor {VOORNAAM}'
569
+
570
+ Gebruik vervolgens deze Woordenlijst-editor om een of meer items als volgt te maken:
571
+ |-----------|------|-------|
572
+ | Naam | Type | Index |
573
+ |-----------|------|-------|
574
+ | voornaam | Tekst| 0 |
575
+ |-----------|------|-------|
576
+ Klik vervolgens op de rij 'voornaam' en voeg meerdere items toe aan het inhoudspaneel, bijvoorbeeld:
577
+ Paul
578
+ David
579
+ Andy
580
+ Wanneer u nu het branden uitvoert, krijgt u individuele plaatslabels met verschillende namen, bijvoorbeeld 'Deze stoel is gereserveerd voor Andy'.
581
+
582
+ U kunt zoveel verschillende tijdelijke aanduidingsnamen gebruiken als u wilt in tekstvelden in uw ontwerp.
583
+
584
+ De 'Index'-waarde in de Woordenlijsttabel geeft aan welk item in de inhoudslijst de volgende keer wordt gebruikt, waarbij nul het eerste item betekent. De index wordt automatisch met één verhoogd aan het einde van elke brand.
585
+
586
+ Stel dat u nu om efficiëntie twee zitplaatsreserveringslabels tegelijk wilt branden, elk met een andere naam uit dezelfde lijst. In dit geval, als het eerste label '{NAAM#+0}' gebruikt en het tweede '{NAAM#+1}' (let op het plusteken). '{NAAM}' of '{NAAM#+0}' gebruikt het huidige item (aangegeven door de Index-waarde), '{NAAM#+1}' gebruikt het volgende item na het huidige, enzovoort.
587
+
588
+ Met het bovenstaande gebruik kunt u deze waarden zo vaak gebruiken als u wilt in uw ontwerp. Om de index te verhogen, moet u op de Vorige / Volgende knoppen in de werkbalk klikken.
589
+
590
+ Als alternatief voor het handmatig invoeren van de waarden van de woordenlijst met deze editor, kunt u een standaard door komma's gescheiden CSV-bestand gebruiken. De tijdelijke aanduidingsnamen worden gedefinieerd in de standaard CSV-kopregel (de eerste regel in het CSV-bestand), en de inhoud wordt vervolgens uit alle volgende regels gehaald. De eenvoudigste manier om een CSV-bestand te maken is met een spreadsheet, bijvoorbeeld Excel, maar voor webwinkels kan uw website het CSV-bestand automatisch aanmaken op basis van online geplaatste bestellingen van klanten.
591
+
592
+ Items die uit een CSV-bestand zijn geladen, worden weergegeven als Type CSV, en u kunt de Index-waarden voor alle CSV-items tegelijk instellen.
593
+
594
+ Opmerking: als uw CSV geen kopregel heeft, worden de kolommen 'column_1', 'column_2', enz. genoemd.
595
+
596
+ De woordenlijst bevat ook enkele speciale items (die vooral handig kunnen zijn voor kalibratieontwerpen):
597
+ * 'version' - Meerk40t-versie
598
+ * 'date' - Datum waarop het branden is gestart
599
+ * 'time' - Tijd waarop het branden is gestart
600
+ * 'op_device' - Apparaat waarop u brandt
601
+ * 'op_speed' - Snelheid van de huidige bewerking
602
+ * 'op_power' - PPI van de huidige bewerking
603
+ * 'op_dpi' - DPI van de huidige (raster) bewerking
604
+ * 'op_passes' - Aantal passes van de huidige bewerking
605
+
606
+ De tijdelijke aanduidingen voor 'date' en 'time' kunnen ook opmaakopdrachten bevatten waarmee u ze kunt opmaken volgens uw lokale conventies, bijvoorbeeld:
607
+ {date@%d.%m.%Y} - 31.12.2022
608
+ {time@%H:%M} - 23:59
609
+
610
+ Voor een volledige set opmaakopdrachten, zie: https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
611
+ """
262
612
 
263
613
  english_material_howto = """
264
614
  The Material Library Manager allows to create, maintain, use and manage operations that are customized to provide a desired effect with a given material (hence the name Material Library).
@@ -285,58 +635,67 @@ russian_material_howto = """
285
635
  Параметры, которые вы хотите использовать, например, для резки акрила, очень отличаются от тех, которые вы хотите использовать для гравировки изображения на сланце.
286
636
  Вы можете поделиться такими настройками материала с сообществом MeerK40t и можете извлечь пользу из вкладов других, загружая и используя их настройки.
287
637
  """
638
+ spanish_material_howto = """
639
+ El Gestor de la Biblioteca de Materiales permite crear, mantener, usar y gestionar operaciones que están personalizadas para proporcionar un efecto deseado con un material dado (de ahí el nombre Biblioteca de Materiales).
640
+ Los parámetros que desea utilizar, por ejemplo, para cortar acrílico son muy diferentes de los que desea utilizar para grabar una imagen en pizarra.
641
+ Puede compartir dicha configuración de material con la comunidad de MeerK40t y beneficiarse de las contribuciones de otros cargando y utilizando sus configuraciones.
642
+ """
643
+ chinese_material_howto = """
644
+ 材料库管理器允许您创建、维护、使用和管理针对特定材料定制的操作(因此称为材料库)。
645
+ 例如,用于切割亚克力的参数与用于在石板上雕刻图像的参数非常不同。
646
+ 您可以与MeerK40t社区分享此类材料设置,也可以通过加载和使用他人的设置来受益于他人的贡献。
647
+ """
648
+ hungarian_material_howto = """
649
+ Az Anyagkönyvtár kezelő lehetővé teszi, hogy létrehozzon, karbantartson, használjon és kezeljen olyan műveleteket, amelyek egy adott anyaghoz igazított hatást biztosítanak (innen az Anyagkönyvtár elnevezés).
650
+ Az akril vágásához használt paraméterek például nagyon eltérnek azoktól, amelyeket pala gravírozásához használna.
651
+ Az ilyen anyagbeállításokat megoszthatja a MeerK40t közösséggel, és mások hozzájárulásaiból is profitálhat, ha betölti és használja az ő beállításaikat.
652
+ """
653
+ portuguese_material_howto = """
654
+ O Gerenciador de Biblioteca de Materiais permite criar, manter, usar e gerenciar operações que são personalizadas para fornecer um efeito desejado com um determinado material (daí o nome Biblioteca de Materiais).
655
+ Os parâmetros que você deseja usar, por exemplo, para cortar acrílico, são muito diferentes dos que você deseja usar para gravar uma imagem em ardósia.
656
+ Você pode compartilhar essa configuração de material com a comunidade MeerK40t e pode se beneficiar das contribuições de outros carregando e usando suas configurações.
657
+ """
658
+ portuguese_brazilian_material_howto = """
659
+ O Gerenciador de Biblioteca de Materiais permite criar, manter, usar e gerenciar operações que são personalizadas para fornecer um efeito desejado com um determinado material (daí o nome Biblioteca de Materiais).
660
+ Os parâmetros que você deseja usar, por exemplo, para cortar acrílico, são muito diferentes dos que você deseja usar para gravar uma imagem em ardósia.
661
+ Você pode compartilhar essa configuração de material com a comunidade MeerK40t e pode se beneficiar das contribuições de outros carregando e usando suas configurações.
662
+ """
663
+ japanese_material_howto = """
664
+ マテリアルライブラリマネージャーは、特定の材料で望ましい効果を得るためにカスタマイズされた操作を作成、維持、使用、管理することができます(そのため「マテリアルライブラリ」と呼ばれます)。
665
+ 例えば、アクリルをカットするために使用するパラメータは、スレートに画像を彫刻するために使用するパラメータとは大きく異なります。
666
+ このようなマテリアル設定をMeerK40tコミュニティと共有したり、他の人の設定を読み込んで利用することで、その貢献から恩恵を受けることができます。
667
+ """
668
+ dutch_material_howto = """
669
+ De Materialenbibliotheekbeheerder stelt u in staat om bewerkingen te maken, te onderhouden, te gebruiken en te beheren die zijn aangepast om een gewenst effect te bereiken met een bepaald materiaal (vandaar de naam Materialenbibliotheek).
670
+ De parameters die u bijvoorbeeld wilt gebruiken voor het snijden van acryl zijn heel anders dan die voor het graveren van een afbeelding op leisteen.
671
+ U kunt dergelijke materiaalsinstellingen delen met de MeerK40t-gemeenschap en profiteren van de bijdragen van anderen door hun instellingen te laden en te gebruiken.
672
+ """
288
673
 
289
674
 
290
675
  def asset(context, asset):
291
- language = context.language
292
- lang = "english"
293
- # Language #00 : en - English
294
- if language == 0: # ("en", "English", wx.LANGUAGE_ENGLISH)
295
- lang = "english"
296
- # Language #01 : it - italiano
297
- if language == 1: # ("it", "italiano", wx.LANGUAGE_ITALIAN),
298
- lang = "italian"
299
- # Language #02 : fr - français
300
- if language == 2: # ("fr", "français", wx.LANGUAGE_FRENCH),
301
- lang = "french"
302
- # Language #03 : de - Deutsch
303
- if language == 3: # ("de", "Deutsch", wx.LANGUAGE_GERMAN),
304
- lang = "german"
305
- # Language #04 : es - español
306
- if language == 4: # ("es", "español", wx.LANGUAGE_SPANISH),
307
- lang = "spanish"
308
- # Language #05 : zh - 中文
309
- if language == 5: # ("zh", "中文", wx.LANGUAGE_CHINESE),
310
- lang = "chinese"
311
- # Language #06 : hu - Magyar
312
- if language == 6: # ("hu", "Magyar", wx.LANGUAGE_HUNGARIAN),
313
- lang = "hungarian"
314
- # Language #07 : pt_PT - português
315
- if language == 7: # ("pt_PT", "português", wx.LANGUAGE_PORTUGUESE),
316
- lang = "portuguese"
317
- # Language #08 : pt_BR - português brasileiro
318
- if (
319
- language == 8
320
- ): # ("pt_BR", "português brasileiro", wx.LANGUAGE_PORTUGUESE_BRAZILIAN),
321
- lang = "portuguese_brazilian"
322
- # Language #09 : ja - 日本
323
- if language == 9: # ("ja", "日本", wx.LANGUAGE_JAPANESE),
324
- lang = "japanese"
325
- # Language #10 : nl - Nederlands
326
- if language == 10: # ("nl", "Nederlands", wx.LANGUAGE_DUTCH),
327
- lang = "dutch"
328
- # Language #11 : ru - русский
329
- if language == 11: # ("ru", "русский", wx.LANGUAGE_RUSSIAN),
330
- lang = "russian"
331
-
676
+ language_map = {
677
+ 0: "english",
678
+ 1: "italian",
679
+ 2: "french",
680
+ 3: "german",
681
+ 4: "spanish",
682
+ 5: "chinese",
683
+ 6: "hungarian",
684
+ 7: "portuguese",
685
+ 8: "portuguese_brazilian",
686
+ 9: "japanese",
687
+ 10: "dutch",
688
+ 11: "russian",
689
+ }
690
+ lang = language_map.get(getattr(context, "language", 0), "english")
332
691
  text = ""
333
692
  try:
334
693
  text = globals()[f"{lang}_{asset}"]
335
694
  except KeyError:
336
695
  try:
337
- text = globals()["english_" + asset]
696
+ text = globals()[f"english_{asset}"]
338
697
  except KeyError:
339
698
  pass
340
- if text and text[0] == "\n":
699
+ if text and text.startswith("\n"):
341
700
  return text[1:]
342
701
  return text
meerk40t/gui/plugin.py CHANGED
@@ -111,6 +111,18 @@ and a wxpython version <= 4.1.1."""
111
111
  "page": "Gui",
112
112
  "section": "General",
113
113
  },
114
+ {
115
+ "attr": "remember_main_pos",
116
+ "object": kernel.root,
117
+ "default": True,
118
+ "type": bool,
119
+ "label": _("Remember main window position"),
120
+ "tip": _(
121
+ "Should MeerK40t remember its last position on the screen?"
122
+ ),
123
+ "page": "Gui",
124
+ "section": "General",
125
+ },
114
126
  {
115
127
  "attr": "windows_save",
116
128
  "object": kernel.root,
meerk40t/gui/tips.py CHANGED
@@ -466,11 +466,30 @@ class TipPanel(wx.Panel):
466
466
  if successful:
467
467
  # Store the result to the local cache file
468
468
  if len(content):
469
- try:
470
- with open(self.local_file, mode="w") as f:
471
- f.write(content)
472
- except (OSError, RuntimeError, PermissionError, FileNotFoundError):
473
- pass
469
+ successful = False
470
+ # Try to write the content to the local file.
471
+ for codepage in ["utf-8", "cp1252"]:
472
+ try:
473
+ with open(self.local_file, mode="w", encoding=codepage) as f:
474
+ f.write(content)
475
+ successful = True
476
+ break
477
+ except (
478
+ UnicodeDecodeError,
479
+ OSError,
480
+ RuntimeError,
481
+ PermissionError,
482
+ FileNotFoundError,
483
+ ):
484
+ pass
485
+ if not successful:
486
+ # If we still failed, try with surrogateescape
487
+ # This is a workaround for some unicode issues.
488
+ try:
489
+ with open(self.local_file, mode="w") as f:
490
+ f.write(content)
491
+ except (OSError, RuntimeError, PermissionError, FileNotFoundError):
492
+ pass
474
493
 
475
494
  def load_tips_from_local_cache(self):
476
495
  def comparable_version(version):
@@ -506,42 +525,60 @@ class TipPanel(wx.Panel):
506
525
  myversion = comparable_version(self.context.kernel.version)
507
526
 
508
527
  try:
509
- with open(self.local_file, mode="r") as f:
510
- ver = ""
511
- tip = ""
512
- cmd = ""
513
- img = ""
514
- lastline_was_tip = False
515
- for line in f:
516
- cline = line.strip()
517
- if cline.startswith("#") or len(cline) == 0:
518
- continue
519
- if cline.startswith("tip="):
520
- lastline_was_tip = True
521
- # Store previous
522
- add_tip(tip, cmd, img, ver, myversion)
523
- ver = ""
524
- tip = cline[len("tip=") :]
525
- cmd = ""
526
- img = ""
527
- elif cline.startswith("version="):
528
- lastline_was_tip = False
529
- ver = cline[len("version=") :]
530
- elif cline.startswith("cmd="):
531
- lastline_was_tip = False
532
- cmd = cline[len("cmd=") :]
533
- elif cline.startswith("image="):
534
- lastline_was_tip = False
535
- img = cline[len("image=") :]
536
- elif cline.startswith("img="):
537
- lastline_was_tip = False
538
- img = cline[len("img=") :]
539
- else:
540
- if lastline_was_tip:
541
- tip += "\n" + cline
542
-
543
- # Something pending?
544
- add_tip(tip, cmd, img, ver, myversion)
528
+ content = ""
529
+ codepages = ["utf-8", "cp1252"]
530
+ for codepage in codepages:
531
+ try:
532
+ with open(self.local_file, mode="r", encoding=codepage) as f:
533
+ content = f.read()
534
+ break
535
+ except UnicodeDecodeError:
536
+ content = ""
537
+ if not content:
538
+ with open(
539
+ self.local_file,
540
+ mode="r",
541
+ encoding="utf-8",
542
+ errors="surrogateescape",
543
+ ) as f:
544
+ content = f.read()
545
+
546
+ lines = content.splitlines()
547
+ ver = ""
548
+ tip = ""
549
+ cmd = ""
550
+ img = ""
551
+ lastline_was_tip = False
552
+ for line in lines:
553
+ cline = line.strip()
554
+ if cline.startswith("#") or len(cline) == 0:
555
+ continue
556
+ if cline.startswith("tip="):
557
+ lastline_was_tip = True
558
+ # Store previous
559
+ add_tip(tip, cmd, img, ver, myversion)
560
+ ver = ""
561
+ tip = cline[len("tip=") :]
562
+ cmd = ""
563
+ img = ""
564
+ elif cline.startswith("version="):
565
+ lastline_was_tip = False
566
+ ver = cline[len("version=") :]
567
+ elif cline.startswith("cmd="):
568
+ lastline_was_tip = False
569
+ cmd = cline[len("cmd=") :]
570
+ elif cline.startswith("image="):
571
+ lastline_was_tip = False
572
+ img = cline[len("image=") :]
573
+ elif cline.startswith("img="):
574
+ lastline_was_tip = False
575
+ img = cline[len("img=") :]
576
+ else:
577
+ if lastline_was_tip:
578
+ tip += "\n" + cline
579
+
580
+ # Something pending?
581
+ add_tip(tip, cmd, img, ver, myversion)
545
582
 
546
583
  except (OSError, RuntimeError, PermissionError, FileNotFoundError):
547
584
  return