Compare commits

...

1104 Commits

Author SHA1 Message Date
Seth Hillbrand 0642cd845e Translated using Weblate (Lithuanian)
Currently translated at 95.4% (9663 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/lt/
2026-03-19 18:36:05 +01:00
Seth Hillbrand 3f1f813261 Translated using Weblate (Latvian)
Currently translated at 93.0% (9422 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/lv/
2026-03-19 18:36:05 +01:00
Seth Hillbrand 1c15289e6a Translated using Weblate (Spanish (Mexico))
Currently translated at 98.6% (9983 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es_MX/
2026-03-19 18:36:05 +01:00
Seth Hillbrand bc51261317 Translated using Weblate (Indonesian)
Currently translated at 93.8% (9497 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/id/
2026-03-19 18:36:05 +01:00
Seth Hillbrand a4adc0786a Translated using Weblate (Estonian)
Currently translated at 93.2% (9440 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/et/
2026-03-19 18:36:05 +01:00
ZbeeGin d4aedfce79 Translated using Weblate (Polish)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-03-19 18:36:05 +01:00
Seth Hillbrand 025e1654b8 Translated using Weblate (Polish)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-03-19 18:36:05 +01:00
Seth Hillbrand 749699a245 Translated using Weblate (Dutch)
Currently translated at 90.0% (9120 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nl/
2026-03-19 18:36:05 +01:00
Seth Hillbrand 70268107ad Translated using Weblate (Norwegian Bokmål)
Currently translated at 95.3% (9651 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nb_NO/
2026-03-19 18:36:05 +01:00
Seth Hillbrand 81685d652c Translated using Weblate (Tamil)
Currently translated at 99.7% (10095 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ta/
2026-03-19 18:36:04 +01:00
Seth Hillbrand 7d4199a1d5 Translated using Weblate (Georgian)
Currently translated at 94.1% (9529 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2026-03-19 18:36:04 +01:00
Seth Hillbrand fe6cf5df69 Translated using Weblate (Vietnamese)
Currently translated at 95.0% (9623 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/vi/
2026-03-19 18:36:04 +01:00
Seth Hillbrand cc61cca5f6 Translated using Weblate (Italian)
Currently translated at 99.2% (10046 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2026-03-19 18:36:04 +01:00
Seth Hillbrand b213e26fb0 Translated using Weblate (Ukrainian)
Currently translated at 99.9% (10114 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/uk/
2026-03-19 18:36:04 +01:00
Seth Hillbrand e534e415aa Translated using Weblate (Thai)
Currently translated at 97.0% (9824 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/th/
2026-03-19 18:36:04 +01:00
Seth Hillbrand c54489b01d Translated using Weblate (Japanese)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-03-19 18:36:04 +01:00
dsa-t d363891159 Translated using Weblate (Russian)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ru/
2026-03-19 18:36:04 +01:00
Seth Hillbrand b64458e84e Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.9% (10013 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt_BR/
2026-03-19 18:36:04 +01:00
Seth Hillbrand 53faf2a9f5 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 98.2% (9948 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2026-03-19 18:36:04 +01:00
Seth Hillbrand 90d745efce Translated using Weblate (Korean)
Currently translated at 99.9% (10116 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ko/
2026-03-19 18:36:04 +01:00
Seth Hillbrand 0e00644bb1 Translated using Weblate (Danish)
Currently translated at 95.3% (9651 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/da/
2026-03-19 18:36:04 +01:00
Seth Hillbrand cad668f809 Translated using Weblate (Spanish)
Currently translated at 98.2% (9946 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es/
2026-03-19 18:36:03 +01:00
Seth Hillbrand a06cbe82c0 Translated using Weblate (Hungarian)
Currently translated at 94.5% (9575 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-03-19 18:36:03 +01:00
Seth Hillbrand 20185b1335 Translated using Weblate (Romanian)
Currently translated at 94.5% (9574 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2026-03-19 18:36:03 +01:00
Seth Hillbrand 3f2c528f2d Translated using Weblate (Swedish)
Currently translated at 99.9% (10117 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2026-03-19 18:36:03 +01:00
Seth Hillbrand f333e43a13 Translated using Weblate (Catalan)
Currently translated at 95.7% (9695 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ca/
2026-03-19 18:36:03 +01:00
Damjan Prerad d729728b36 Translated using Weblate (Serbian)
Currently translated at 18.8% (1907 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sr/
2026-03-19 18:36:03 +01:00
Seth Hillbrand 1077de4965 Translated using Weblate (Arabic)
Currently translated at 93.0% (9420 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ar/
2026-03-19 18:36:03 +01:00
Seth Hillbrand 7457315ee9 Translated using Weblate (Czech)
Currently translated at 98.5% (9979 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-19 18:36:03 +01:00
Seth Hillbrand 3f54d20263 Translated using Weblate (Hebrew)
Currently translated at 93.4% (9462 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/he/
2026-03-19 18:36:03 +01:00
Seth Hillbrand 3f653f84b8 Translated using Weblate (Portuguese)
Currently translated at 99.5% (10082 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt/
2026-03-19 18:36:03 +01:00
Mitja Nemec 4bcd989777 Translated using Weblate (Slovenian)
Currently translated at 1.2% (130 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sl/
2026-03-19 18:36:03 +01:00
Seth Hillbrand 2033e7dc7c Translated using Weblate (Finnish)
Currently translated at 97.2% (9846 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/fi/
2026-03-19 18:36:03 +01:00
Seth Hillbrand 514e6e876f Translated using Weblate (Turkish)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-19 18:36:03 +01:00
Seth Hillbrand 6407345b8e Translated using Weblate (Greek)
Currently translated at 98.6% (9982 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/el/
2026-03-19 18:36:03 +01:00
Seth Hillbrand 5c45647883 Translated using Weblate (Slovak)
Currently translated at 96.7% (9791 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-19 18:36:02 +01:00
Seth Hillbrand 0724a2c800 Translated using Weblate (Bulgarian)
Currently translated at 8.4% (854 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/bg/
2026-03-19 18:36:02 +01:00
Seth Hillbrand 171d8ceb66 Translated using Weblate (Lithuanian)
Currently translated at 95.4% (9663 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/lt/
2026-03-19 18:36:02 +01:00
Seth Hillbrand f39c1b727f Translated using Weblate (Latvian)
Currently translated at 93.0% (9422 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/lv/
2026-03-19 18:36:02 +01:00
Seth Hillbrand 0c44e77031 Translated using Weblate (Hungarian)
Currently translated at 94.5% (9575 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-03-19 18:36:02 +01:00
Tomas0015 39f2a29855 Translated using Weblate (Czech)
Currently translated at 98.5% (9979 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-19 18:36:02 +01:00
Pferd O. 2cf751030c Translated using Weblate (German)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-03-19 18:36:02 +01:00
Seth Hillbrand 6da507631d Translated using Weblate (Slovak)
Currently translated at 96.7% (9791 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-19 18:36:02 +01:00
Seth Hillbrand 2f5d3b48f7 Translated using Weblate (Czech)
Currently translated at 98.4% (9963 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-19 18:36:02 +01:00
Seth Hillbrand bf3f6caa8a Translated using Weblate (Hebrew)
Currently translated at 93.4% (9462 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/he/
2026-03-19 18:36:02 +01:00
ZbeeGin 2a36c903f1 Translated using Weblate (Polish)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-03-19 18:36:02 +01:00
Tomas0015 275dbe4dad Translated using Weblate (Czech)
Currently translated at 78.9% (7995 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-19 18:36:02 +01:00
Seth Hillbrand c83fd6d8f2 Translated using Weblate (Romanian)
Currently translated at 94.5% (9574 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2026-03-19 18:36:02 +01:00
EdizonTN eaee3ddb6b Translated using Weblate (Slovak)
Currently translated at 73.7% (7462 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-19 18:36:01 +01:00
Seth Hillbrand cc589d0dd2 Translated using Weblate (Greek)
Currently translated at 98.6% (9982 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/el/
2026-03-19 18:36:01 +01:00
EdizonTN 13364847b1 Translated using Weblate (Slovak)
Currently translated at 73.5% (7449 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-19 18:36:01 +01:00
Seth Hillbrand d70123f434 Translated using Weblate (Catalan)
Currently translated at 95.7% (9695 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ca/
2026-03-19 18:36:01 +01:00
aris-kimi 40bfeb25be Translated using Weblate (Greek)
Currently translated at 85.4% (8647 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/el/
2026-03-19 18:36:01 +01:00
Seth Hillbrand 174e0132eb Translated using Weblate (Indonesian)
Currently translated at 93.8% (9497 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/id/
2026-03-19 18:36:01 +01:00
Seth Hillbrand c07c92d429 Translated using Weblate (Lithuanian)
Currently translated at 95.4% (9665 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/lt/
2026-03-19 18:36:01 +01:00
Seth Hillbrand df943280d5 Translated using Weblate (Thai)
Currently translated at 97.0% (9824 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/th/
2026-03-19 18:36:01 +01:00
Seth Hillbrand 67e80f0fef Translated using Weblate (Finnish)
Currently translated at 97.2% (9846 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/fi/
2026-03-19 18:36:01 +01:00
Seth Hillbrand d3d6b74375 Translated using Weblate (Georgian)
Currently translated at 94.1% (9529 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2026-03-19 18:36:01 +01:00
EdizonTN 9b9e293648 Translated using Weblate (Slovak)
Currently translated at 72.2% (7318 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-19 18:36:01 +01:00
Seth Hillbrand ee698e99ed Translated using Weblate (Tamil)
Currently translated at 99.5% (10082 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ta/
2026-03-19 18:36:01 +01:00
Seth Hillbrand 502cb971f1 Translated using Weblate (Turkish)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-19 18:36:00 +01:00
Seth Hillbrand 90caa46019 Translated using Weblate (Latvian)
Currently translated at 93.1% (9425 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/lv/
2026-03-19 18:36:00 +01:00
Seth Hillbrand 9db46bc55f Translated using Weblate (Hungarian)
Currently translated at 94.6% (9577 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-03-19 18:36:00 +01:00
Seth Hillbrand db96292e2a Translated using Weblate (Portuguese)
Currently translated at 99.5% (10082 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt/
2026-03-19 18:36:00 +01:00
Seth Hillbrand f9df859ec6 Translated using Weblate (Swedish)
Currently translated at 99.9% (10117 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2026-03-19 18:36:00 +01:00
Seth Hillbrand 2c5ad35df5 Translated using Weblate (Hebrew)
Currently translated at 93.4% (9461 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/he/
2026-03-19 18:36:00 +01:00
Seth Hillbrand d4eb33bf82 Translated using Weblate (Lithuanian)
Currently translated at 95.4% (9665 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/lt/
2026-03-19 18:36:00 +01:00
Seth Hillbrand 242a902b91 Translated using Weblate (Arabic)
Currently translated at 93.0% (9420 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ar/
2026-03-19 18:36:00 +01:00
dsa-t 1e7d477dcc Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.6% (10089 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2026-03-19 18:36:00 +01:00
CharlieYu bfd1cf534a Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.6% (10089 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2026-03-19 18:36:00 +01:00
Rigo Ligo 4cc6ecdd91 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.6% (10089 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2026-03-19 18:36:00 +01:00
Hubert Hu 6017f1b3f5 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.6% (10089 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2026-03-19 18:36:00 +01:00
CloverGit 61b6d39762 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.6% (10089 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2026-03-19 18:36:00 +01:00
Anonymous 74456ef3a8 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.6% (10089 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2026-03-19 18:36:00 +01:00
dsa-t 6b9fa2f9a0 Translated using Weblate (Indonesian)
Currently translated at 14.1% (1431 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/id/
2026-03-19 18:36:00 +01:00
Anonymous 7d4fedde51 Translated using Weblate (Indonesian)
Currently translated at 14.1% (1431 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/id/
2026-03-19 18:36:00 +01:00
dsa-t db557858a8 Translated using Weblate (Arabic)
Currently translated at 1.1% (117 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ar/
2026-03-19 18:35:59 +01:00
Hesham Eina Abdalla a2f59e19e7 Translated using Weblate (Arabic)
Currently translated at 1.1% (117 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ar/
2026-03-19 18:35:59 +01:00
Morad Tamer b45a60c19f Translated using Weblate (Arabic)
Currently translated at 1.1% (117 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ar/
2026-03-19 18:35:59 +01:00
Anonymous e28445ef33 Translated using Weblate (Arabic)
Currently translated at 1.1% (117 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ar/
2026-03-19 18:35:59 +01:00
dsa-t 586a794536 Translated using Weblate (Slovak)
Currently translated at 71.8% (7271 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-19 18:35:59 +01:00
EdizonTN 6fd56d5eb8 Translated using Weblate (Slovak)
Currently translated at 71.8% (7271 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-19 18:35:59 +01:00
Anonymous ce11590737 Translated using Weblate (Slovak)
Currently translated at 71.8% (7271 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-19 18:35:59 +01:00
Deleted User 14cf906477 Translated using Weblate (Turkish)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-19 18:35:59 +01:00
dsa-t e64ca49dbe Translated using Weblate (Turkish)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-19 18:35:59 +01:00
Tevfik Bagcivan e581b02339 Translated using Weblate (Turkish)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-19 18:35:59 +01:00
Argeolog ac51bc6768 Translated using Weblate (Turkish)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-19 18:35:59 +01:00
Ahmet Saygın ÖĞÜLMÜŞ e5462fe07f Translated using Weblate (Turkish)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-19 18:35:59 +01:00
YÜKSEL AÇIKGÖZ 39d0557663 Translated using Weblate (Turkish)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-19 18:35:59 +01:00
İclal Gör 6724857248 Translated using Weblate (Turkish)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-19 18:35:59 +01:00
Anonymous 23b6c6dce0 Translated using Weblate (Turkish)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-19 18:35:59 +01:00
dsa-t 52595ee470 Translated using Weblate (Lithuanian)
Currently translated at 42.1% (4264 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/lt/
2026-03-19 18:35:59 +01:00
Anonymous 8702bae833 Translated using Weblate (Lithuanian)
Currently translated at 42.1% (4264 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/lt/
2026-03-19 18:35:58 +01:00
dsa-t 8f5c6b53c7 Translated using Weblate (Georgian)
Currently translated at 32.9% (3335 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2026-03-19 18:35:58 +01:00
Temuri Doghonadze 7e65a7ea9a Translated using Weblate (Georgian)
Currently translated at 32.9% (3335 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2026-03-19 18:35:58 +01:00
Anonymous 873ff01e42 Translated using Weblate (Georgian)
Currently translated at 32.9% (3335 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2026-03-19 18:35:58 +01:00
dsa-t 4224f8c0e9 Translated using Weblate (Serbian)
Currently translated at 18.8% (1907 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sr/
2026-03-19 18:35:58 +01:00
___davidpr 8532ed5941 Translated using Weblate (Serbian)
Currently translated at 18.8% (1907 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sr/
2026-03-19 18:35:58 +01:00
Anonymous 93d7d98588 Translated using Weblate (Serbian)
Currently translated at 18.8% (1907 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sr/
2026-03-19 18:35:58 +01:00
Luka Borkovic ab7855dd63 Translated using Weblate (Serbian)
Currently translated at 18.8% (1907 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sr/
2026-03-19 18:35:58 +01:00
dsa-t 5b5ad7c003 Translated using Weblate (Ukrainian)
Currently translated at 99.9% (10114 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/uk/
2026-03-19 18:35:58 +01:00
Ivan Chuba fb21c75605 Translated using Weblate (Ukrainian)
Currently translated at 99.9% (10114 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/uk/
2026-03-19 18:35:58 +01:00
Максим Горпиніч 0fe3b74ede Translated using Weblate (Ukrainian)
Currently translated at 99.9% (10114 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/uk/
2026-03-19 18:35:58 +01:00
Anonymous 7b4a4a8636 Translated using Weblate (Ukrainian)
Currently translated at 99.9% (10114 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/uk/
2026-03-19 18:35:58 +01:00
dsa-t a82b48947d Translated using Weblate (Romanian)
Currently translated at 29.8% (3023 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2026-03-19 18:35:58 +01:00
Marco Ciampa 6d75d2ba5f Translated using Weblate (Romanian)
Currently translated at 29.8% (3023 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2026-03-19 18:35:58 +01:00
Tatu Bogdan d6195d31af Translated using Weblate (Romanian)
Currently translated at 29.8% (3023 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2026-03-19 18:35:58 +01:00
Peter B ed69bd5022 Translated using Weblate (Romanian)
Currently translated at 29.8% (3023 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2026-03-19 18:35:58 +01:00
Alex Gellen fff449e5ff Translated using Weblate (Romanian)
Currently translated at 29.8% (3023 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2026-03-19 18:35:58 +01:00
Anonymous d444e6b30f Translated using Weblate (Romanian)
Currently translated at 29.8% (3023 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2026-03-19 18:35:58 +01:00
dsa-t 30ca0280f8 Translated using Weblate (Czech)
Currently translated at 78.9% (7992 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-19 18:35:57 +01:00
Hynek Štětina 633ac76562 Translated using Weblate (Czech)
Currently translated at 78.9% (7992 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-19 18:35:57 +01:00
Michal Kundrát 308313fb60 Translated using Weblate (Czech)
Currently translated at 78.9% (7992 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-19 18:35:57 +01:00
René Široký c3860142ca Translated using Weblate (Czech)
Currently translated at 78.9% (7992 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-19 18:35:57 +01:00
Tomas0015 1682f95479 Translated using Weblate (Czech)
Currently translated at 78.9% (7992 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-19 18:35:57 +01:00
Jan Straka aa71602a7e Translated using Weblate (Czech)
Currently translated at 78.9% (7992 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-19 18:35:57 +01:00
Anonymous 647b9cc76d Translated using Weblate (Czech)
Currently translated at 78.9% (7992 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-19 18:35:57 +01:00
dsa-t 4019ccb787 Translated using Weblate (Spanish)
Currently translated at 98.2% (9946 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es/
2026-03-19 18:35:57 +01:00
Gaston Schelotto 908a109aee Translated using Weblate (Spanish)
Currently translated at 98.2% (9946 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es/
2026-03-19 18:35:57 +01:00
Francisco Jose Rey 88da8bfb01 Translated using Weblate (Spanish)
Currently translated at 98.2% (9946 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es/
2026-03-19 18:35:57 +01:00
Seth Hillbrand bc2c2f232a Translated using Weblate (Spanish)
Currently translated at 98.2% (9946 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es/
2026-03-19 18:35:57 +01:00
Anonymous bf2bd44be3 Translated using Weblate (Spanish)
Currently translated at 98.2% (9946 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es/
2026-03-19 18:35:57 +01:00
Adolfo Jayme Barrientos 1ab26795cd Translated using Weblate (Spanish)
Currently translated at 98.2% (9946 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es/
2026-03-19 18:35:57 +01:00
ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) 7cc618989f Translated using Weblate (Latvian)
Currently translated at 0.7% (78 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/lv/
2026-03-19 18:35:57 +01:00
dsa-t 8e1aa6f6a5 Translated using Weblate (Latvian)
Currently translated at 0.7% (78 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/lv/
2026-03-19 18:35:57 +01:00
Anonymous 190e6e75f2 Translated using Weblate (Latvian)
Currently translated at 0.7% (78 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/lv/
2026-03-19 18:35:57 +01:00
dsa-t 2081b57420 Translated using Weblate (Polish)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-03-19 18:35:56 +01:00
szumsky 0e3a4ef80c Translated using Weblate (Polish)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-03-19 18:35:56 +01:00
ZbeeGin c86c410768 Translated using Weblate (Polish)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-03-19 18:35:56 +01:00
Anonymous 8a1878b6d0 Translated using Weblate (Polish)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-03-19 18:35:56 +01:00
dsa-t 113371e054 Translated using Weblate (Thai)
Currently translated at 60.1% (6086 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/th/
2026-03-19 18:35:56 +01:00
Anonymous c8fb1b14bf Translated using Weblate (Thai)
Currently translated at 60.1% (6086 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/th/
2026-03-19 18:35:56 +01:00
dsa-t 9b5dd9e669 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9913 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2026-03-19 18:35:56 +01:00
Oliver0804 5bce575ab7 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9913 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2026-03-19 18:35:56 +01:00
Shuwn Hsu 5f04dd2f47 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9913 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2026-03-19 18:35:56 +01:00
William Lin 6ab9b8150b Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9913 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2026-03-19 18:35:56 +01:00
CloverGit 38d2c67490 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9913 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2026-03-19 18:35:56 +01:00
Che-Hsien Su 0d3002f8e2 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9913 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2026-03-19 18:35:56 +01:00
Vic 7a5dbe958a Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9913 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2026-03-19 18:35:56 +01:00
pominglee 11db3af4c5 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9913 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2026-03-19 18:35:56 +01:00
Anonymous 4f21c5e423 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9913 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2026-03-19 18:35:56 +01:00
Håvard Syslak 5b7514cf12 Translated using Weblate (Norwegian Bokmål)
Currently translated at 95.3% (9651 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nb_NO/
2026-03-19 18:35:56 +01:00
dsa-t 68c5989735 Translated using Weblate (Norwegian Bokmål)
Currently translated at 95.3% (9651 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nb_NO/
2026-03-19 18:35:55 +01:00
Stian Kristensen a2ed1a8f1a Translated using Weblate (Norwegian Bokmål)
Currently translated at 95.3% (9651 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nb_NO/
2026-03-19 18:35:55 +01:00
Seth Hillbrand 740fd5c9a6 Translated using Weblate (Norwegian Bokmål)
Currently translated at 95.3% (9651 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nb_NO/
2026-03-19 18:35:55 +01:00
Anonymous bdb274de94 Translated using Weblate (Norwegian Bokmål)
Currently translated at 95.3% (9651 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nb_NO/
2026-03-19 18:35:55 +01:00
dsa-t 5aa1efca45 Translated using Weblate (Korean)
Currently translated at 99.9% (10116 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ko/
2026-03-19 18:35:55 +01:00
Pedro Moreira 8a4b498152 Translated using Weblate (Korean)
Currently translated at 99.9% (10116 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ko/
2026-03-19 18:35:55 +01:00
Jason Son 54cbe58f02 Translated using Weblate (Korean)
Currently translated at 99.9% (10116 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ko/
2026-03-19 18:35:55 +01:00
Seth Hillbrand 6478561e03 Translated using Weblate (Korean)
Currently translated at 99.9% (10116 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ko/
2026-03-19 18:35:55 +01:00
김랑기 1c370fd4dc Translated using Weblate (Korean)
Currently translated at 99.9% (10116 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ko/
2026-03-19 18:35:55 +01:00
DevAny cee80894e8 Translated using Weblate (Korean)
Currently translated at 99.9% (10116 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ko/
2026-03-19 18:35:55 +01:00
Anonymous b6d64d03ee Translated using Weblate (Korean)
Currently translated at 99.9% (10116 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ko/
2026-03-19 18:35:55 +01:00
dsa-t 8807622905 Translated using Weblate (Hungarian)
Currently translated at 53.2% (5388 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-03-19 18:35:55 +01:00
Miklós Márton 29bd6b222b Translated using Weblate (Hungarian)
Currently translated at 53.2% (5388 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-03-19 18:35:55 +01:00
KB 72d30b519f Translated using Weblate (Hungarian)
Currently translated at 53.2% (5388 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-03-19 18:35:55 +01:00
Anonymous 02865587e7 Translated using Weblate (Hungarian)
Currently translated at 53.2% (5388 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-03-19 18:35:55 +01:00
Sárkány Lőrinc 494c371a9b Translated using Weblate (Hungarian)
Currently translated at 53.2% (5388 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-03-19 18:35:55 +01:00
dsa-t 27d5f00cab Translated using Weblate (Italian)
Currently translated at 99.2% (10046 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2026-03-19 18:35:55 +01:00
Marco Ciampa 560a4ecd4f Translated using Weblate (Italian)
Currently translated at 99.2% (10046 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2026-03-19 18:35:54 +01:00
Anonymous c504168d92 Translated using Weblate (Italian)
Currently translated at 99.2% (10046 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2026-03-19 18:35:54 +01:00
dsa-t b2cec41bce Translated using Weblate (Danish)
Currently translated at 95.3% (9651 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/da/
2026-03-19 18:35:54 +01:00
Seth Hillbrand 59ab3a501d Translated using Weblate (Danish)
Currently translated at 95.3% (9651 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/da/
2026-03-19 18:35:54 +01:00
Anonymous 260a67319e Translated using Weblate (Danish)
Currently translated at 95.3% (9651 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/da/
2026-03-19 18:35:54 +01:00
dsa-t f215d81482 Translated using Weblate (Dutch)
Currently translated at 90.0% (9120 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nl/
2026-03-19 18:35:54 +01:00
Herman van der Vaart d1f08abcbd Translated using Weblate (Dutch)
Currently translated at 90.0% (9120 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nl/
2026-03-19 18:35:54 +01:00
Stefan De Raedemaeker d0d91adbd4 Translated using Weblate (Dutch)
Currently translated at 90.0% (9120 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nl/
2026-03-19 18:35:54 +01:00
Anonymous eed4a44bdc Translated using Weblate (Dutch)
Currently translated at 90.0% (9120 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nl/
2026-03-19 18:35:54 +01:00
dsa-t 414da508c8 Translated using Weblate (Tamil)
Currently translated at 99.5% (10082 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ta/
2026-03-19 18:35:54 +01:00
Anonymous f07ff6bcac Translated using Weblate (Tamil)
Currently translated at 99.5% (10082 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ta/
2026-03-19 18:35:54 +01:00
தமிழ்நேரம் 26f4f5cb1d Translated using Weblate (Tamil)
Currently translated at 99.5% (10082 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ta/
2026-03-19 18:35:54 +01:00
dsa-t 588f6328c3 Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.9% (10013 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt_BR/
2026-03-19 18:35:54 +01:00
soldado-do-wolfenstein 1ccc17ca63 Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.9% (10013 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt_BR/
2026-03-19 18:35:54 +01:00
brunofaus a1aa13fa69 Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.9% (10013 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt_BR/
2026-03-19 18:35:54 +01:00
Seth Hillbrand 90ff6fa4fd Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.9% (10013 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt_BR/
2026-03-19 18:35:54 +01:00
Wellington Terumi Uemura 3f7fbf76e9 Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.9% (10013 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt_BR/
2026-03-19 18:35:54 +01:00
Anonymous 2cdad44489 Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.9% (10013 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt_BR/
2026-03-19 18:35:53 +01:00
Nguyễn Ngọc Khánh 1f020dbb0f Translated using Weblate (Vietnamese)
Currently translated at 95.0% (9623 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/vi/
2026-03-19 18:35:53 +01:00
Seth Hillbrand ad11b2d919 Translated using Weblate (Vietnamese)
Currently translated at 95.0% (9623 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/vi/
2026-03-19 18:35:53 +01:00
Anonymous 9926241579 Translated using Weblate (Vietnamese)
Currently translated at 95.0% (9623 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/vi/
2026-03-19 18:35:53 +01:00
dsa-t d8b3582108 Translated using Weblate (Slovenian)
Currently translated at 1.2% (129 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sl/
2026-03-19 18:35:53 +01:00
Mitja Nemec ca760a6375 Translated using Weblate (Slovenian)
Currently translated at 1.2% (129 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sl/
2026-03-19 18:35:53 +01:00
Anonymous be3d5eeb3f Translated using Weblate (Slovenian)
Currently translated at 1.2% (129 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sl/
2026-03-19 18:35:53 +01:00
dsa-t 6bd88c9fd5 Translated using Weblate (Estonian)
Currently translated at 93.2% (9440 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/et/
2026-03-19 18:35:53 +01:00
Ivan Chuba 8307b48980 Translated using Weblate (Estonian)
Currently translated at 93.2% (9440 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/et/
2026-03-19 18:35:53 +01:00
Anonymous 5a8693b79f Translated using Weblate (Estonian)
Currently translated at 93.2% (9440 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/et/
2026-03-19 18:35:53 +01:00
Seth Hillbrand c9dc0443ef Translated using Weblate (Estonian)
Currently translated at 93.2% (9440 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/et/
2026-03-19 18:35:53 +01:00
dsa-t 09b541b1fa Translated using Weblate (Portuguese)
Currently translated at 99.5% (10082 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt/
2026-03-19 18:35:53 +01:00
Hildo Guillardi Júnior b68a30e0c7 Translated using Weblate (Portuguese)
Currently translated at 99.5% (10082 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt/
2026-03-19 18:35:53 +01:00
Julio Dias 705955454f Translated using Weblate (Portuguese)
Currently translated at 99.5% (10082 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt/
2026-03-19 18:35:53 +01:00
Seth Hillbrand 820f7c8815 Translated using Weblate (Portuguese)
Currently translated at 99.5% (10082 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt/
2026-03-19 18:35:53 +01:00
Manuela Silva 10dff13c23 Translated using Weblate (Portuguese)
Currently translated at 99.5% (10082 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt/
2026-03-19 18:35:53 +01:00
ssantos a3e0d1f11d Translated using Weblate (Portuguese)
Currently translated at 99.5% (10082 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt/
2026-03-19 18:35:52 +01:00
Anonymous d674eb68f6 Translated using Weblate (Portuguese)
Currently translated at 99.5% (10082 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt/
2026-03-19 18:35:52 +01:00
Anonymous 93f0b0051c Translated using Weblate (Hebrew)
Currently translated at 93.4% (9461 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/he/
2026-03-19 18:35:52 +01:00
Seth Hillbrand 5b6ebc4cb6 Translated using Weblate (Hebrew)
Currently translated at 93.4% (9461 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/he/
2026-03-19 18:35:52 +01:00
dsa-t 2692a0cf6b Translated using Weblate (German)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-03-19 18:35:52 +01:00
Henrik Kauhanen 7f96d5e3c1 Translated using Weblate (German)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-03-19 18:35:52 +01:00
Kliment f751c7a0d9 Translated using Weblate (German)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-03-19 18:35:52 +01:00
Ettore Atalan d9701172da Translated using Weblate (German)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-03-19 18:35:52 +01:00
weblateuser cad817af82 Translated using Weblate (German)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-03-19 18:35:52 +01:00
Pferd O. 9ad7b44ebb Translated using Weblate (German)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-03-19 18:35:52 +01:00
Frank Sonnenberg 42a6eec544 Translated using Weblate (German)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-03-19 18:35:52 +01:00
Anonymous da762550dd Translated using Weblate (German)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-03-19 18:35:52 +01:00
dsa-t 198d0e8251 Translated using Weblate (Finnish)
Currently translated at 97.2% (9846 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/fi/
2026-03-19 18:35:52 +01:00
Henrik Kauhanen 8c1945f842 Translated using Weblate (Finnish)
Currently translated at 97.2% (9846 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/fi/
2026-03-19 18:35:52 +01:00
Toni Laiho dc53f3155a Translated using Weblate (Finnish)
Currently translated at 97.2% (9846 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/fi/
2026-03-19 18:35:52 +01:00
Kliment 906c113c4e Translated using Weblate (Finnish)
Currently translated at 97.2% (9846 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/fi/
2026-03-19 18:35:52 +01:00
Anonymous ef73c3f308 Translated using Weblate (Finnish)
Currently translated at 97.2% (9846 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/fi/
2026-03-19 18:35:52 +01:00
dsa-t c7ced181b6 Translated using Weblate (Spanish (Mexico))
Currently translated at 98.6% (9983 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es_MX/
2026-03-19 18:35:51 +01:00
Deleted User b572ee2a5e Translated using Weblate (Spanish (Mexico))
Currently translated at 98.6% (9983 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es_MX/
2026-03-19 18:35:51 +01:00
Seth Hillbrand daafc521b9 Translated using Weblate (Spanish (Mexico))
Currently translated at 98.6% (9983 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es_MX/
2026-03-19 18:35:51 +01:00
Anonymous 62d4a895bd Translated using Weblate (Spanish (Mexico))
Currently translated at 98.6% (9983 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es_MX/
2026-03-19 18:35:51 +01:00
dsa-t 435835c537 Translated using Weblate (Bulgarian)
Currently translated at 8.0% (819 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/bg/
2026-03-19 18:35:51 +01:00
109247019824 664b874a13 Translated using Weblate (Bulgarian)
Currently translated at 8.0% (819 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/bg/
2026-03-19 18:35:51 +01:00
Anonymous bae493cb13 Translated using Weblate (Bulgarian)
Currently translated at 8.0% (819 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/bg/
2026-03-19 18:35:51 +01:00
dsa-t 89be4d2933 Translated using Weblate (Catalan)
Currently translated at 41.4% (4196 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ca/
2026-03-19 18:35:51 +01:00
rsr.private f47d8e7879 Translated using Weblate (Catalan)
Currently translated at 41.4% (4196 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ca/
2026-03-19 18:35:51 +01:00
Marc de Miguel 2cf3b297ba Translated using Weblate (Catalan)
Currently translated at 41.4% (4196 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ca/
2026-03-19 18:35:51 +01:00
Arnau Llovet Vidal 6d4a53d9df Translated using Weblate (Catalan)
Currently translated at 41.4% (4196 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ca/
2026-03-19 18:35:51 +01:00
Adolfo Jayme Barrientos fba52e3dbf Translated using Weblate (Catalan)
Currently translated at 41.4% (4196 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ca/
2026-03-19 18:35:51 +01:00
Anonymous 10101648a7 Translated using Weblate (Catalan)
Currently translated at 41.4% (4196 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ca/
2026-03-19 18:35:51 +01:00
Johan Heikkilä 654c775b82 Translated using Weblate (Swedish)
Currently translated at 99.9% (10117 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2026-03-19 18:35:51 +01:00
dsa-t c65092e1a1 Translated using Weblate (Swedish)
Currently translated at 99.9% (10117 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2026-03-19 18:35:51 +01:00
Stefan Bjornelund the Gnome 746f2f56f9 Translated using Weblate (Swedish)
Currently translated at 99.9% (10117 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2026-03-19 18:35:51 +01:00
Joakim Lundborg c7a1594081 Translated using Weblate (Swedish)
Currently translated at 99.9% (10117 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2026-03-19 18:35:50 +01:00
Henrik Kauhanen dc37a609a6 Translated using Weblate (Swedish)
Currently translated at 99.9% (10117 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2026-03-19 18:35:50 +01:00
Anonymous fc7ccc3657 Translated using Weblate (Swedish)
Currently translated at 99.9% (10117 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2026-03-19 18:35:50 +01:00
dsa-t 29c8d0783f Translated using Weblate (Croatian)
Currently translated at 0.0% (0 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hr/
2026-03-19 18:35:50 +01:00
Anonymous e1d6a22bab Translated using Weblate (Croatian)
Currently translated at 0.0% (0 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hr/
2026-03-19 18:35:50 +01:00
dsa-t 12f4459d30 Translated using Weblate (Greek)
Currently translated at 85.4% (8647 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/el/
2026-03-19 18:35:50 +01:00
Theodoros Asimakopoulos 24ef1bf721 Translated using Weblate (Greek)
Currently translated at 85.4% (8647 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/el/
2026-03-19 18:35:50 +01:00
aris-kimi d09975ccd6 Translated using Weblate (Greek)
Currently translated at 85.4% (8647 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/el/
2026-03-19 18:35:50 +01:00
Anonymous b890ffb66f Translated using Weblate (Greek)
Currently translated at 85.4% (8647 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/el/
2026-03-19 18:35:50 +01:00
dsa-t 98324e7437 Translated using Weblate (Russian)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ru/
2026-03-19 18:35:50 +01:00
Anonymous 6a76a420e9 Translated using Weblate (Russian)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ru/
2026-03-19 18:35:50 +01:00
dsa-t 29e53c11e2 Translated using Weblate (Japanese)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-03-19 18:35:50 +01:00
Tokita, Hiroshi 8eec657d8f Translated using Weblate (Japanese)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-03-19 18:35:50 +01:00
co8 j 516f32f05e Translated using Weblate (Japanese)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-03-19 18:35:50 +01:00
2tama3 d4720d3134 Translated using Weblate (Japanese)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-03-19 18:35:50 +01:00
John Beard ca86c82f9b Docset: disable the reserved index space
Doxygen-Awesome's adaptive top/sidebar CSS doesn't work well
when there is no index, as in a docset.
2026-03-19 11:06:53 +08:00
Tomasz Wlostowski b781fc29a7 router: fix use-after-free error when dragging a single (no tracks attached via) in shove mode
Fixes: https://gitlab.com/kicad/code/kicad/-/work_items/23449

(cherry picked from commit 1909f3a8b3)
2026-03-16 21:58:43 +01:00
Tomasz Wlostowski 7a1121bd62 router: correctly sanitize router layer to BOARD layer translation
Fixes: https://gitlab.com/kicad/code/kicad/-/work_items/23449

Cherry-picked from 731d46cc8c
2026-03-16 21:58:40 +01:00
Jon Evans ffa8fef0d3 API: always serialize with UTF-8
(cherry picked from commit 1637a124ff)

Co-authored-by: Jon Evans <jon@craftyjon.com>
2026-03-15 22:03:42 -04:00
Jon Evans d6cc7faed4 API: fix netclass filtering for multiple membership
Fixes https://gitlab.com/kicad/code/kicad/-/work_items/23435


(cherry picked from commit 24778647ab)

Co-authored-by: Jon Evans <jon@craftyjon.com>
2026-03-15 09:20:20 -04:00
Wayne Stambaugh bd24029f6a Begin version 9.0.9 development. 2026-03-15 08:52:43 -04:00
Wayne Stambaugh b09c98053a Tag stable version 9.0.8. 2026-03-15 08:48:29 -04:00
Anonymous a882002c9b Translated using Weblate (Japanese)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-03-13 20:35:23 +01:00
Seth Hillbrand 3f114dd551 Update translations 2026-03-13 11:18:49 -07:00
Henrik Kauhanen f41bc308af Translated using Weblate (Swedish)
Currently translated at 99.9% (10117 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2026-03-13 19:18:17 +01:00
Seth Hillbrand 3e68881128 Translated using Weblate (Norwegian Bokmål)
Currently translated at 95.3% (9651 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nb_NO/
2026-03-13 19:18:17 +01:00
EdizonTN 750d93767f Translated using Weblate (Slovak)
Currently translated at 71.8% (7271 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-13 19:18:17 +01:00
YÜKSEL AÇIKGÖZ e40fc3e86a Translated using Weblate (Turkish)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-13 19:18:17 +01:00
Seth Hillbrand a4ea00cb1c Translated using Weblate (Danish)
Currently translated at 95.3% (9656 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/da/
2026-03-13 19:18:17 +01:00
Seth Hillbrand 28436ba8ea Translated using Weblate (Vietnamese)
Currently translated at 95.0% (9623 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/vi/
2026-03-13 19:18:17 +01:00
2tama3 113b5a3bc0 Translated using Weblate (Japanese)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-03-13 19:18:17 +01:00
ZbeeGin ab22fd2a37 Translated using Weblate (Polish)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-03-13 19:18:17 +01:00
EdizonTN 3c7eadbd1c Translated using Weblate (Slovak)
Currently translated at 71.1% (7204 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-13 19:18:16 +01:00
Simon Schaak 6023bd0a99 Multichannel dialog: fix other tab grids
(cherry picked from commit 3fc2963215)
2026-03-13 11:16:09 -07:00
Mark Roszko b2bfa24c98 ERC dialog: make "Save..." button write listed violations
the ERC dialog's save action always wrote (just) errors and warnings to
the report, regardless of the violations listed in the dialog based on
the checkboxes. that was different from the DRC dialog's behavior, which
writes the selected severities to the report. this change makes the ERC
dialog's "Save..." button behave the same as the DRC dialog's.


(cherry picked from commit 42d202b6cf)

Co-authored-by: Bernhard Kirchen <schlimmchen@posteo.net>
2026-03-13 11:07:29 +00:00
Seth Hillbrand a0beba756f Update translations 2026-03-11 13:58:44 -07:00
brunofaus 03d3127d5b Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.9% (10013 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt_BR/
2026-03-11 21:02:56 +01:00
EdizonTN ad8db26464 Translated using Weblate (Slovak)
Currently translated at 70.8% (7177 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-11 21:02:55 +01:00
Seth Hillbrand 6d3dd89934 Translated using Weblate (Spanish)
Currently translated at 98.2% (9946 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es/
2026-03-10 13:12:30 +01:00
Seth Hillbrand c2153b88de Translated using Weblate (Estonian)
Currently translated at 93.2% (9440 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/et/
2026-03-10 13:12:17 +01:00
CloverGit e9058cddb8 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.6% (10089 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2026-03-10 13:09:05 +01:00
Seth Hillbrand f368ede532 Update translations 2026-03-09 11:12:00 -07:00
Henrik Kauhanen 4184948774 Translated using Weblate (Swedish)
Currently translated at 99.9% (10117 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2026-03-09 19:07:30 +01:00
Tomas0015 788db1062e Translated using Weblate (Czech)
Currently translated at 78.9% (7992 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-09 19:07:30 +01:00
EdizonTN 1d5b432e78 Translated using Weblate (Slovak)
Currently translated at 70.3% (7123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-09 19:07:30 +01:00
szumsky 0b7e739a9a Translated using Weblate (Polish)
Currently translated at 99.9% (10113 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-03-09 19:07:30 +01:00
Frank Sonnenberg 6abc727f67 Translated using Weblate (German)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-03-09 19:07:30 +01:00
ZbeeGin 44f0690a33 Translated using Weblate (Polish)
Currently translated at 99.9% (10113 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-03-09 19:07:30 +01:00
2tama3 53a873bbda Translated using Weblate (Japanese)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-03-09 19:07:29 +01:00
EdizonTN 08c6d0db31 Translated using Weblate (Slovak)
Currently translated at 69.1% (6997 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-09 19:07:29 +01:00
YÜKSEL AÇIKGÖZ f76736d054 Translated using Weblate (Turkish)
Currently translated at 100.0% (10123 of 10123 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-09 19:07:29 +01:00
dsa-t f601709fcc Translated using Weblate (Georgian)
Currently translated at 32.9% (3335 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2026-03-09 19:07:29 +01:00
Temuri Doghonadze 5120b0d9e3 Translated using Weblate (Georgian)
Currently translated at 32.9% (3335 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2026-03-09 19:07:29 +01:00
Anonymous a01b23e25f Translated using Weblate (Georgian)
Currently translated at 32.9% (3335 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2026-03-09 19:07:29 +01:00
dsa-t b34076d995 Translated using Weblate (Korean)
Currently translated at 99.9% (10114 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ko/
2026-03-09 19:07:29 +01:00
Pedro Moreira 0c7c9f53a8 Translated using Weblate (Korean)
Currently translated at 99.9% (10114 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ko/
2026-03-09 19:07:29 +01:00
Jason Son faffb91731 Translated using Weblate (Korean)
Currently translated at 99.9% (10114 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ko/
2026-03-09 19:07:29 +01:00
Seth Hillbrand aadc2fa50a Translated using Weblate (Korean)
Currently translated at 99.9% (10114 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ko/
2026-03-09 19:07:29 +01:00
김랑기 441851ca1b Translated using Weblate (Korean)
Currently translated at 99.9% (10114 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ko/
2026-03-09 19:07:29 +01:00
DevAny 0df142ff7d Translated using Weblate (Korean)
Currently translated at 99.9% (10114 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ko/
2026-03-09 19:07:29 +01:00
Anonymous 7d5385eea6 Translated using Weblate (Korean)
Currently translated at 99.9% (10114 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ko/
2026-03-09 19:07:29 +01:00
dsa-t 1d8383d30b Translated using Weblate (Indonesian)
Currently translated at 14.1% (1431 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/id/
2026-03-09 19:07:29 +01:00
Anonymous c0c4787063 Translated using Weblate (Indonesian)
Currently translated at 14.1% (1431 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/id/
2026-03-09 19:07:28 +01:00
dsa-t 11fb7c33fe Translated using Weblate (Spanish)
Currently translated at 98.2% (9944 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es/
2026-03-09 19:07:28 +01:00
Gaston Schelotto ca73d0cbdb Translated using Weblate (Spanish)
Currently translated at 98.2% (9944 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es/
2026-03-09 19:07:28 +01:00
Francisco Jose Rey 0939994964 Translated using Weblate (Spanish)
Currently translated at 98.2% (9944 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es/
2026-03-09 19:07:28 +01:00
Seth Hillbrand 2e990170f5 Translated using Weblate (Spanish)
Currently translated at 98.2% (9944 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es/
2026-03-09 19:07:28 +01:00
Anonymous dcd66a1249 Translated using Weblate (Spanish)
Currently translated at 98.2% (9944 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es/
2026-03-09 19:07:28 +01:00
Adolfo Jayme Barrientos b3ed007e98 Translated using Weblate (Spanish)
Currently translated at 98.2% (9944 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es/
2026-03-09 19:07:28 +01:00
dsa-t 4bd5ccf5f3 Translated using Weblate (German)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-03-09 19:07:28 +01:00
Henrik Kauhanen 9c023f71b1 Translated using Weblate (German)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-03-09 19:07:28 +01:00
Kliment 0f0472ee89 Translated using Weblate (German)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-03-09 19:07:28 +01:00
Ettore Atalan 52fd059557 Translated using Weblate (German)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-03-09 19:07:28 +01:00
weblateuser 3ede385a30 Translated using Weblate (German)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-03-09 19:07:27 +01:00
Pferd O. 19a8278829 Translated using Weblate (German)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-03-09 19:07:27 +01:00
Frank Sonnenberg 52f9c0156c Translated using Weblate (German)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-03-09 19:07:27 +01:00
Anonymous 6a1165bdc2 Translated using Weblate (German)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-03-09 19:07:27 +01:00
dsa-t a876b05fa5 Translated using Weblate (Italian)
Currently translated at 99.2% (10044 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2026-03-09 19:07:27 +01:00
Marco Ciampa ae10e04ce8 Translated using Weblate (Italian)
Currently translated at 99.2% (10044 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2026-03-09 19:07:27 +01:00
Anonymous 42e271cbdf Translated using Weblate (Italian)
Currently translated at 99.2% (10044 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2026-03-09 19:07:27 +01:00
dsa-t 3e1cbcac84 Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.9% (10011 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt_BR/
2026-03-09 19:07:27 +01:00
soldado-do-wolfenstein c96cee4b96 Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.9% (10011 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt_BR/
2026-03-09 19:07:27 +01:00
Seth Hillbrand 264d445a9f Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.9% (10011 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt_BR/
2026-03-09 19:07:27 +01:00
Wellington Terumi Uemura 7e6f5b5b91 Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.9% (10011 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt_BR/
2026-03-09 19:07:27 +01:00
Anonymous 8cdbe92345 Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.9% (10011 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt_BR/
2026-03-09 19:07:27 +01:00
dsa-t 4318c5e81d Translated using Weblate (Lithuanian)
Currently translated at 42.1% (4264 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/lt/
2026-03-09 19:07:26 +01:00
Anonymous f6469e9622 Translated using Weblate (Lithuanian)
Currently translated at 42.1% (4264 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/lt/
2026-03-09 19:07:26 +01:00
dsa-t 559ca6970c Translated using Weblate (Slovenian)
Currently translated at 1.2% (129 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sl/
2026-03-09 19:07:26 +01:00
Mitja Nemec 9dd167ca50 Translated using Weblate (Slovenian)
Currently translated at 1.2% (129 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sl/
2026-03-09 19:07:26 +01:00
Anonymous 1156445256 Translated using Weblate (Slovenian)
Currently translated at 1.2% (129 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sl/
2026-03-09 19:07:26 +01:00
dsa-t b237f743b8 Translated using Weblate (Russian)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ru/
2026-03-09 19:07:26 +01:00
Anonymous c34ac5a701 Translated using Weblate (Russian)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ru/
2026-03-09 19:07:26 +01:00
dsa-t 5defdbcd1d Translated using Weblate (Danish)
Currently translated at 41.2% (4172 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/da/
2026-03-09 19:07:26 +01:00
Anonymous 399b72c05a Translated using Weblate (Danish)
Currently translated at 41.2% (4172 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/da/
2026-03-09 19:07:26 +01:00
dsa-t 87cf283064 Translated using Weblate (Czech)
Currently translated at 78.9% (7989 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-09 19:07:26 +01:00
Hynek Štětina aebe3d79d0 Translated using Weblate (Czech)
Currently translated at 78.9% (7989 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-09 19:07:26 +01:00
Michal Kundrát 3f02a24096 Translated using Weblate (Czech)
Currently translated at 78.9% (7989 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-09 19:07:26 +01:00
René Široký 7a378e71d9 Translated using Weblate (Czech)
Currently translated at 78.9% (7989 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-09 19:07:26 +01:00
Tomas0015 f2b5cb4327 Translated using Weblate (Czech)
Currently translated at 78.9% (7989 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-09 19:07:25 +01:00
Jan Straka b77de2e997 Translated using Weblate (Czech)
Currently translated at 78.9% (7989 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-09 19:07:25 +01:00
Anonymous 57da3455a8 Translated using Weblate (Czech)
Currently translated at 78.9% (7989 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-09 19:07:25 +01:00
dsa-t f475d1e7c4 Translated using Weblate (Greek)
Currently translated at 85.4% (8645 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/el/
2026-03-09 19:07:25 +01:00
Theodoros Asimakopoulos f902bee722 Translated using Weblate (Greek)
Currently translated at 85.4% (8645 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/el/
2026-03-09 19:07:25 +01:00
aris-kimi f848ad2dc4 Translated using Weblate (Greek)
Currently translated at 85.4% (8645 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/el/
2026-03-09 19:07:25 +01:00
Anonymous aa1add163b Translated using Weblate (Greek)
Currently translated at 85.4% (8645 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/el/
2026-03-09 19:07:25 +01:00
dsa-t c9327da6d6 Translated using Weblate (Serbian)
Currently translated at 18.8% (1907 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sr/
2026-03-09 19:07:25 +01:00
___davidpr 3068b8bb43 Translated using Weblate (Serbian)
Currently translated at 18.8% (1907 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sr/
2026-03-09 19:07:25 +01:00
Anonymous 371e60678f Translated using Weblate (Serbian)
Currently translated at 18.8% (1907 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sr/
2026-03-09 19:07:25 +01:00
Luka Borkovic 352813b633 Translated using Weblate (Serbian)
Currently translated at 18.8% (1907 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sr/
2026-03-09 19:07:25 +01:00
dsa-t 0b0fe011e5 Translated using Weblate (Japanese)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-03-09 19:07:24 +01:00
Tokita, Hiroshi 2d464c08e7 Translated using Weblate (Japanese)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-03-09 19:07:24 +01:00
co8 j 09de36bf32 Translated using Weblate (Japanese)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-03-09 19:07:24 +01:00
2tama3 e49035c9d2 Translated using Weblate (Japanese)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-03-09 19:07:24 +01:00
Anonymous 5d1fd55f5a Translated using Weblate (Japanese)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-03-09 19:07:24 +01:00
Deleted User 74fb4f82ba Translated using Weblate (Turkish)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-09 19:07:24 +01:00
dsa-t 3e29de1d00 Translated using Weblate (Turkish)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-09 19:07:24 +01:00
Tevfik Bagcivan 7a299568b3 Translated using Weblate (Turkish)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-09 19:07:24 +01:00
Argeolog 29ed1e7850 Translated using Weblate (Turkish)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-09 19:07:24 +01:00
Ahmet Saygın ÖĞÜLMÜŞ eb107eaa19 Translated using Weblate (Turkish)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-09 19:07:24 +01:00
YÜKSEL AÇIKGÖZ 75af08bee2 Translated using Weblate (Turkish)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-09 19:07:24 +01:00
İclal Gör 020a895040 Translated using Weblate (Turkish)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-09 19:07:24 +01:00
Anonymous e59409d8bd Translated using Weblate (Turkish)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-09 19:07:24 +01:00
dsa-t 195605553a Translated using Weblate (Romanian)
Currently translated at 29.8% (3023 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2026-03-09 19:07:24 +01:00
Marco Ciampa 27461a458d Translated using Weblate (Romanian)
Currently translated at 29.8% (3023 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2026-03-09 19:07:24 +01:00
Tatu Bogdan 4f9119af02 Translated using Weblate (Romanian)
Currently translated at 29.8% (3023 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2026-03-09 19:07:23 +01:00
Peter B dfb2b32aef Translated using Weblate (Romanian)
Currently translated at 29.8% (3023 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2026-03-09 19:07:23 +01:00
Alex Gellen b8497903e7 Translated using Weblate (Romanian)
Currently translated at 29.8% (3023 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2026-03-09 19:07:23 +01:00
Anonymous 5011975452 Translated using Weblate (Romanian)
Currently translated at 29.8% (3023 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2026-03-09 19:07:23 +01:00
dsa-t 89940f18c1 Translated using Weblate (Slovak)
Currently translated at 69.1% (6996 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-09 19:07:23 +01:00
EdizonTN d2ca2854f0 Translated using Weblate (Slovak)
Currently translated at 69.1% (6996 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-09 19:07:23 +01:00
Anonymous bdedae7867 Translated using Weblate (Slovak)
Currently translated at 69.1% (6996 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-09 19:07:23 +01:00
dsa-t f945286861 Translated using Weblate (Tamil)
Currently translated at 99.6% (10082 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ta/
2026-03-09 19:07:23 +01:00
Anonymous 978267bbb8 Translated using Weblate (Tamil)
Currently translated at 99.6% (10082 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ta/
2026-03-09 19:07:23 +01:00
தமிழ்நேரம் c3b6a8143b Translated using Weblate (Tamil)
Currently translated at 99.6% (10082 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ta/
2026-03-09 19:07:23 +01:00
dsa-t 7741b50d54 Translated using Weblate (Hungarian)
Currently translated at 53.2% (5388 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-03-09 19:07:23 +01:00
Miklós Márton d8c4c88d34 Translated using Weblate (Hungarian)
Currently translated at 53.2% (5388 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-03-09 19:07:23 +01:00
KB 2ac030bfb8 Translated using Weblate (Hungarian)
Currently translated at 53.2% (5388 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-03-09 19:07:22 +01:00
Anonymous b0535d07a4 Translated using Weblate (Hungarian)
Currently translated at 53.2% (5388 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-03-09 19:07:22 +01:00
Sárkány Lőrinc 0bdc83aba7 Translated using Weblate (Hungarian)
Currently translated at 53.2% (5388 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-03-09 19:07:22 +01:00
dsa-t f6585748bf Translated using Weblate (Finnish)
Currently translated at 97.2% (9844 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/fi/
2026-03-09 19:07:22 +01:00
Henrik Kauhanen acea522147 Translated using Weblate (Finnish)
Currently translated at 97.2% (9844 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/fi/
2026-03-09 19:07:22 +01:00
Toni Laiho cfbefd22ae Translated using Weblate (Finnish)
Currently translated at 97.2% (9844 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/fi/
2026-03-09 19:07:22 +01:00
Kliment c4b9008878 Translated using Weblate (Finnish)
Currently translated at 97.2% (9844 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/fi/
2026-03-09 19:07:22 +01:00
Anonymous 88493eb19a Translated using Weblate (Finnish)
Currently translated at 97.2% (9844 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/fi/
2026-03-09 19:07:22 +01:00
dsa-t 03ddc8ef80 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.6% (10086 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2026-03-09 19:07:22 +01:00
CharlieYu e9acab5fb3 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.6% (10086 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2026-03-09 19:07:21 +01:00
Rigo Ligo 30879fb78d Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.6% (10086 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2026-03-09 19:07:21 +01:00
Hubert Hu 8d14d7498f Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.6% (10086 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2026-03-09 19:07:21 +01:00
CloverGit f0715942d3 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.6% (10086 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2026-03-09 19:07:21 +01:00
Anonymous 07e4a809c0 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.6% (10086 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2026-03-09 19:07:21 +01:00
dsa-t cf1621ed89 Translated using Weblate (Bulgarian)
Currently translated at 8.0% (819 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/bg/
2026-03-09 19:07:21 +01:00
109247019824 6dd0d9f45b Translated using Weblate (Bulgarian)
Currently translated at 8.0% (819 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/bg/
2026-03-09 19:07:21 +01:00
Anonymous 1091000202 Translated using Weblate (Bulgarian)
Currently translated at 8.0% (819 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/bg/
2026-03-09 19:07:21 +01:00
dsa-t b40751930c Translated using Weblate (Polish)
Currently translated at 99.8% (10108 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-03-09 19:07:21 +01:00
ZbeeGin 37041529ae Translated using Weblate (Polish)
Currently translated at 99.8% (10108 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-03-09 19:07:21 +01:00
Anonymous f7cd2f3fa2 Translated using Weblate (Polish)
Currently translated at 99.8% (10108 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-03-09 19:07:21 +01:00
dsa-t a5f1b76893 Translated using Weblate (Portuguese)
Currently translated at 99.5% (10080 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt/
2026-03-09 19:07:21 +01:00
Hildo Guillardi Júnior a973aabfd0 Translated using Weblate (Portuguese)
Currently translated at 99.5% (10080 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt/
2026-03-09 19:07:21 +01:00
Julio Dias aa4be4474e Translated using Weblate (Portuguese)
Currently translated at 99.5% (10080 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt/
2026-03-09 19:07:21 +01:00
Seth Hillbrand 6e058523cf Translated using Weblate (Portuguese)
Currently translated at 99.5% (10080 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt/
2026-03-09 19:07:21 +01:00
Manuela Silva bd03949c62 Translated using Weblate (Portuguese)
Currently translated at 99.5% (10080 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt/
2026-03-09 19:07:20 +01:00
ssantos 10669c3b77 Translated using Weblate (Portuguese)
Currently translated at 99.5% (10080 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt/
2026-03-09 19:07:20 +01:00
Anonymous 33227f617b Translated using Weblate (Portuguese)
Currently translated at 99.5% (10080 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt/
2026-03-09 19:07:20 +01:00
dsa-t e9f43aca31 Translated using Weblate (Dutch)
Currently translated at 90.0% (9118 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nl/
2026-03-09 19:07:20 +01:00
Herman van der Vaart eac8635cbb Translated using Weblate (Dutch)
Currently translated at 90.0% (9118 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nl/
2026-03-09 19:07:20 +01:00
Stefan De Raedemaeker 0b0f115dc7 Translated using Weblate (Dutch)
Currently translated at 90.0% (9118 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nl/
2026-03-09 19:07:20 +01:00
Anonymous 43305c51b5 Translated using Weblate (Dutch)
Currently translated at 90.0% (9118 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nl/
2026-03-09 19:07:20 +01:00
Håvard Syslak cf36ee9be8 Translated using Weblate (Norwegian Bokmål)
Currently translated at 41.7% (4221 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nb_NO/
2026-03-09 19:07:20 +01:00
dsa-t ccd70bd699 Translated using Weblate (Norwegian Bokmål)
Currently translated at 41.7% (4221 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nb_NO/
2026-03-09 19:07:20 +01:00
Stian Kristensen ce5656a373 Translated using Weblate (Norwegian Bokmål)
Currently translated at 41.7% (4221 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nb_NO/
2026-03-09 19:07:20 +01:00
Anonymous 64ca58d205 Translated using Weblate (Norwegian Bokmål)
Currently translated at 41.7% (4221 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nb_NO/
2026-03-09 19:07:20 +01:00
dsa-t 2adf6429f7 Translated using Weblate (Croatian)
Currently translated at 0.0% (0 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hr/
2026-03-09 19:07:20 +01:00
Anonymous 53f5b563fa Translated using Weblate (Croatian)
Currently translated at 0.0% (0 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hr/
2026-03-09 19:07:19 +01:00
dsa-t 53ca9b42b7 Translated using Weblate (Estonian)
Currently translated at 3.7% (375 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/et/
2026-03-09 19:07:19 +01:00
Ivan Chuba bc4cffe0d3 Translated using Weblate (Estonian)
Currently translated at 3.7% (375 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/et/
2026-03-09 19:07:19 +01:00
Anonymous 225ce42c6c Translated using Weblate (Estonian)
Currently translated at 3.7% (375 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/et/
2026-03-09 19:07:19 +01:00
dsa-t 7b6d04124d Translated using Weblate (Thai)
Currently translated at 60.1% (6086 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/th/
2026-03-09 19:07:19 +01:00
Anonymous 3211c6e563 Translated using Weblate (Thai)
Currently translated at 60.1% (6086 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/th/
2026-03-09 19:07:19 +01:00
dsa-t bf8035eb08 Translated using Weblate (Vietnamese)
Currently translated at 23.3% (2365 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/vi/
2026-03-09 19:07:19 +01:00
Nguyễn Ngọc Khánh 6df0e447f9 Translated using Weblate (Vietnamese)
Currently translated at 23.3% (2365 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/vi/
2026-03-09 19:07:19 +01:00
Anonymous 300b3f2067 Translated using Weblate (Vietnamese)
Currently translated at 23.3% (2365 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/vi/
2026-03-09 19:07:19 +01:00
Johan Heikkilä 16c0a41f95 Translated using Weblate (Swedish)
Currently translated at 99.9% (10115 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2026-03-09 19:07:19 +01:00
dsa-t 54583b22e6 Translated using Weblate (Swedish)
Currently translated at 99.9% (10115 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2026-03-09 19:07:19 +01:00
Stefan Bjornelund the Gnome afe8c612a6 Translated using Weblate (Swedish)
Currently translated at 99.9% (10115 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2026-03-09 19:07:19 +01:00
Joakim Lundborg f3da402537 Translated using Weblate (Swedish)
Currently translated at 99.9% (10115 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2026-03-09 19:07:19 +01:00
Henrik Kauhanen a1bd75bfac Translated using Weblate (Swedish)
Currently translated at 99.9% (10115 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2026-03-09 19:07:19 +01:00
Anonymous 3c416463e9 Translated using Weblate (Swedish)
Currently translated at 99.9% (10115 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2026-03-09 19:07:18 +01:00
dsa-t ada0464b8a Translated using Weblate (Spanish (Mexico))
Currently translated at 98.6% (9981 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es_MX/
2026-03-09 19:07:18 +01:00
Deleted User 81d3150b2d Translated using Weblate (Spanish (Mexico))
Currently translated at 98.6% (9981 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es_MX/
2026-03-09 19:07:18 +01:00
Seth Hillbrand f6775465c7 Translated using Weblate (Spanish (Mexico))
Currently translated at 98.6% (9981 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es_MX/
2026-03-09 19:07:18 +01:00
Anonymous 0bbc37324a Translated using Weblate (Spanish (Mexico))
Currently translated at 98.6% (9981 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es_MX/
2026-03-09 19:07:18 +01:00
Anonymous 27b34599ff Translated using Weblate (Hebrew)
Currently translated at 93.4% (9460 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/he/
2026-03-09 19:07:18 +01:00
Seth Hillbrand 6636f00a18 Translated using Weblate (Hebrew)
Currently translated at 93.4% (9460 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/he/
2026-03-09 19:07:18 +01:00
dsa-t 2ac547050d Translated using Weblate (Ukrainian)
Currently translated at 99.9% (10112 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/uk/
2026-03-09 19:07:18 +01:00
Ivan Chuba 997b72c808 Translated using Weblate (Ukrainian)
Currently translated at 99.9% (10112 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/uk/
2026-03-09 19:07:18 +01:00
Максим Горпиніч e55afc12d6 Translated using Weblate (Ukrainian)
Currently translated at 99.9% (10112 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/uk/
2026-03-09 19:07:18 +01:00
Anonymous 342822580c Translated using Weblate (Ukrainian)
Currently translated at 99.9% (10112 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/uk/
2026-03-09 19:07:18 +01:00
dsa-t c2acb2a796 Translated using Weblate (Catalan)
Currently translated at 41.4% (4196 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ca/
2026-03-09 19:07:18 +01:00
rsr.private d9c76748bb Translated using Weblate (Catalan)
Currently translated at 41.4% (4196 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ca/
2026-03-09 19:07:18 +01:00
Marc de Miguel 41c8d23046 Translated using Weblate (Catalan)
Currently translated at 41.4% (4196 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ca/
2026-03-09 19:07:17 +01:00
Arnau Llovet Vidal 1137e00322 Translated using Weblate (Catalan)
Currently translated at 41.4% (4196 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ca/
2026-03-09 19:07:17 +01:00
Adolfo Jayme Barrientos 40f1836aab Translated using Weblate (Catalan)
Currently translated at 41.4% (4196 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ca/
2026-03-09 19:07:17 +01:00
Anonymous 8cf947d6ef Translated using Weblate (Catalan)
Currently translated at 41.4% (4196 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ca/
2026-03-09 19:07:17 +01:00
ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) af0c1c8956 Translated using Weblate (Latvian)
Currently translated at 0.7% (78 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/lv/
2026-03-09 19:07:17 +01:00
dsa-t 7f288c8787 Translated using Weblate (Latvian)
Currently translated at 0.7% (78 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/lv/
2026-03-09 19:07:17 +01:00
Anonymous bfe38f49c9 Translated using Weblate (Latvian)
Currently translated at 0.7% (78 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/lv/
2026-03-09 19:07:17 +01:00
dsa-t b967c97db7 Translated using Weblate (Arabic)
Currently translated at 1.1% (117 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ar/
2026-03-09 19:07:17 +01:00
Hesham Eina Abdalla 24f9e450c5 Translated using Weblate (Arabic)
Currently translated at 1.1% (117 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ar/
2026-03-09 19:07:17 +01:00
Morad Tamer 7684abc92c Translated using Weblate (Arabic)
Currently translated at 1.1% (117 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ar/
2026-03-09 19:07:17 +01:00
Anonymous 1c3b395a48 Translated using Weblate (Arabic)
Currently translated at 1.1% (117 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ar/
2026-03-09 19:07:16 +01:00
dsa-t 6b9cd91ef4 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9911 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2026-03-09 19:07:16 +01:00
Oliver0804 df213e1ad3 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9911 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2026-03-09 19:07:16 +01:00
Shuwn Hsu 98e2fc0976 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9911 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2026-03-09 19:07:16 +01:00
William Lin b7460f13b7 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9911 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2026-03-09 19:07:16 +01:00
CloverGit 10dcec397c Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9911 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2026-03-09 19:07:16 +01:00
Che-Hsien Su e31fd3f6a4 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9911 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2026-03-09 19:07:16 +01:00
Vic 04f805d2f5 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9911 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2026-03-09 19:07:16 +01:00
pominglee 42bb81dae4 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9911 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2026-03-09 19:07:16 +01:00
Anonymous 3387854c6c Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9911 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2026-03-09 19:07:16 +01:00
EdizonTN 8397291113 Translated using Weblate (Slovak)
Currently translated at 69.0% (6985 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-09 19:07:15 +01:00
YÜKSEL AÇIKGÖZ a26c9cba9a Translated using Weblate (Turkish)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-09 19:07:15 +01:00
Ian McKernan 3137020b7f Fix incorrect SVG export offset for symbols reference and value fields
(cherry picked from commit 8acdf8d3ea)
2026-03-09 09:22:10 -04:00
Jon Evans 0aeb33f94f API: Avoid redundant serialization of polyline arcs
Fixes https://gitlab.com/kicad/code/kicad-python/-/issues/79
2026-03-08 00:20:25 -05:00
Jon Evans d248f1d3f4 Fix IPC API losing custom fields when updating footprints
(Manual cherry-pick of 0596455809)
2026-03-07 23:28:27 -05:00
Jon Evans 9547cc190e API: Fix missing pad shape serialization
(only impacts 9.0 branch)
2026-03-07 22:52:39 -05:00
JamesJCode cc4409cb1a Auto-increment directive label fields on repeat item action
Fixes #23331

(cherry picked from commit 69f218f8ff)
2026-03-06 21:51:00 +00:00
Seth Hillbrand ddec1361d1 Update translations 2026-03-06 13:08:08 -08:00
Seth Hillbrand 0b3456404e Update translations 2026-03-06 12:39:46 -08:00
Seth Hillbrand c6a662eba4 Translated using Weblate (Spanish)
Currently translated at 98.2% (9944 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es/
2026-03-06 21:14:33 +01:00
Seth Hillbrand d32737c177 Translated using Weblate (Korean)
Currently translated at 99.9% (10114 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ko/
2026-03-06 21:14:01 +01:00
Seth Hillbrand f7af713592 Translated using Weblate (Hebrew)
Currently translated at 93.4% (9460 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/he/
2026-03-06 21:13:41 +01:00
EdizonTN ffa0838e62 Translated using Weblate (Slovak)
Currently translated at 68.3% (6921 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-06 21:10:42 +01:00
YÜKSEL AÇIKGÖZ bf1dbfa65b Translated using Weblate (Turkish)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-06 21:10:37 +01:00
Seth Hillbrand c752ca869c Translated using Weblate (Spanish (Mexico))
Currently translated at 98.6% (9981 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/es_MX/
2026-03-06 21:10:25 +01:00
2tama3 e33bdc65b7 Translated using Weblate (Japanese)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-03-06 21:09:50 +01:00
Alex Shvartzkop 2b51b2b9b9 Update translations 2026-03-05 22:09:27 +03:00
dsa-t d97a0f818c Translated using Weblate (Russian)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ru/
2026-03-05 20:06:46 +01:00
Theodoros Asimakopoulos d735810cad Translated using Weblate (Greek)
Currently translated at 85.4% (8645 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/el/
2026-03-05 20:06:46 +01:00
EdizonTN 0858ce9fff Translated using Weblate (Slovak)
Currently translated at 67.4% (6826 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-05 20:06:46 +01:00
YÜKSEL AÇIKGÖZ 0f0e15421a Translated using Weblate (Turkish)
Currently translated at 99.1% (10039 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/tr/
2026-03-05 20:06:45 +01:00
EdizonTN 7a89d88018 Translated using Weblate (Slovak)
Currently translated at 67.0% (6791 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-05 20:06:45 +01:00
Sárkány Lőrinc 0059b5ab69 Translated using Weblate (Hungarian)
Currently translated at 53.2% (5388 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-03-05 20:06:45 +01:00
EdizonTN de062bd5e3 Translated using Weblate (Slovak)
Currently translated at 66.8% (6766 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-05 20:06:45 +01:00
Tomas0015 9f13d12158 Translated using Weblate (Czech)
Currently translated at 78.9% (7989 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-05 20:06:45 +01:00
Sárkány Lőrinc 74aebd8e9e Translated using Weblate (Hungarian)
Currently translated at 53.2% (5386 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-03-05 20:06:45 +01:00
EdizonTN 705e2ba2fd Translated using Weblate (Slovak)
Currently translated at 66.7% (6756 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-05 20:06:45 +01:00
EdizonTN 40d9f5eda6 Translated using Weblate (Slovak)
Currently translated at 66.5% (6731 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-05 20:06:45 +01:00
Mitja Nemec 791219c314 Translated using Weblate (Slovenian)
Currently translated at 1.2% (129 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sl/
2026-03-05 20:06:45 +01:00
Sárkány Lőrinc 763e62f70d Translated using Weblate (Hungarian)
Currently translated at 53.1% (5384 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-03-05 20:06:45 +01:00
Tomas0015 a986c10544 Translated using Weblate (Czech)
Currently translated at 78.6% (7962 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-05 20:06:45 +01:00
2tama3 03101435c4 Translated using Weblate (Japanese)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-03-05 20:06:45 +01:00
Tomas0015 f6b9b3243f Translated using Weblate (Czech)
Currently translated at 78.5% (7948 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-03-05 20:06:45 +01:00
Sárkány Lőrinc 05433f5bb2 Translated using Weblate (Hungarian)
Currently translated at 53.1% (5379 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-03-05 20:06:44 +01:00
EdizonTN 4622b17085 Translated using Weblate (Slovak)
Currently translated at 66.4% (6721 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-05 20:06:44 +01:00
Pferd O. 3324b4d167 Translated using Weblate (German)
Currently translated at 100.0% (10121 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-03-05 20:06:44 +01:00
Henrik Kauhanen f620393385 Translated using Weblate (Swedish)
Currently translated at 99.9% (10115 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2026-03-05 20:06:44 +01:00
EdizonTN bc8d31187c Translated using Weblate (Slovak)
Currently translated at 64.3% (6513 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-05 20:06:44 +01:00
ZbeeGin 16575689c2 Translated using Weblate (Polish)
Currently translated at 99.8% (10108 of 10121 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-03-05 20:06:44 +01:00
Damjan Prerad 2d4d531b42 Fix empty project name in symbol instances
Symbol instance saving was refactored earlier. This replaced
the conditional project name lookup with unconditional use of the
stored m_ProjectName. This variable is never populated at symbol
creation time, and is not updated on project rename or Save As, this
results in empty or stale project names being written to disk.

Restore the conditional: use the live project name from GetProjectName()
for current project instances, and fall back to the stored m_ProjectName
only for foreign project instances.

This is the v9 equivalent of the master fix in 4836d172c7, which could
not be cherry-picked due to v10-specific virtual root changes.
2026-03-05 15:47:43 +01:00
Jeff Young 1862fe4a22 Pull back more changes from master.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/23310
2026-03-04 21:16:46 +00:00
Seth Hillbrand 846bb2790c Fix multiline text selection highlight for outline fonts
When selecting multiline text objects with non-default (outline) fonts
in the schematic editor, only a single line-height box was drawn as
the selection highlight. This happened because boxText() called
GetTextExtents() which used StringBoundaryLimits() treating the entire
multiline string as one line, producing a very wide but single-height
bounding box.

Replace the boxText() call with GetBoundingBox() which correctly
computes the bounding box for multiline text by measuring each line
individually and accounting for interline spacing.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/23198

(cherry picked from commit fc8c1e2b44)
2026-03-04 20:40:13 +00:00
Wayne Stambaugh 0a2ae3b526 Tag stable version 9.0.8 release candidate 1. 2026-03-02 18:01:38 -05:00
Wayne Stambaugh 973f6a29e5 Fix clipped info bar button text in ERC dialog.
The ERC dialog info bar button text gets clipped when there are symbols
that are not annotated in the schematic.  This was a manual cherry pick
from fixes in the development branch that got overlooked.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22638
2026-03-02 17:56:54 -05:00
Seth Hillbrand 145b190904 Fix crash in SCH_RULE_AREA::RemoveItem
FreeDrawList() deletes items in arbitrary order. When a SCH_RULE_AREA
is freed before items it contains, those items' destructors call
RemoveItem() on the freed rule area, causing a use-after-free crash
in unordered_set::erase.

This breaks the bidirectional references in ~SCH_RULE_AREA() so
contained items no longer hold dangling pointers to the destroyed
rule area.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22822
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22993

(cherry picked from commit 92fe51409e)
2026-03-02 11:52:38 -08:00
Dominique Fuchs 394d466a47 Guard null m_appearancePanel in colour-changed handler
During PCB_EDIT_FRAME construction, wxEVT_SYS_COLOUR_CHANGED
can fire before m_appearancePanel is created. On macOS with
multiple displays, LoadWindowState triggers a synchronous
windowDidChangeBackingProperties notification during DoSetSize,
which wxWidgets translates into a colour-changed event. The
handler dereferences m_appearancePanel unconditionally, causing
an EXC_BAD_ACCESS crash.

Add a null check consistent with all other m_appearancePanel
accesses in the same file.

Fixes kicad/code/kicad#23302

Signed-off-by: Dominique Fuchs's avatarDominique Fuchs <df@0x9d.net>

(Cherry-picked from a592b9db27)
2026-03-02 19:28:54 +00:00
Wayne Stambaugh bad8f864b6 Fix schematic plot job file name handling.
The schematic plot job set was incorrectly handling file definitions as
paths resulting in the output file always being used as a path definition.
This fix honors file name definitions provided in the plot dialog path text
control.
2026-03-02 11:43:37 -05:00
Jon Evans 3514d130cb API: Add support for retrieving user names for all layers 2026-03-01 22:25:09 -05:00
Ian McInerney bec0c8387d Don't gate toolbar tool action processing by ID anymore
We have some actions that use wx IDs now (e.g., wxID_PASTE), so we can't
just process things in our custom ID region anymore.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/23239

(Cherry-picked from 96d5de482a)
2026-03-02 01:42:37 +00:00
Alex Shvartzkop 707b1e18a3 Update translations 2026-03-01 09:48:44 +03:00
Sárkány Lőrinc 9a74d5f5ef Translated using Weblate (Hungarian)
Currently translated at 53.1% (5376 of 10118 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-03-01 07:35:57 +01:00
ZbeeGin 2de883c52a Translated using Weblate (Polish)
Currently translated at 99.8% (10107 of 10118 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-03-01 07:35:57 +01:00
2tama3 bea7f9c81b Translated using Weblate (Japanese)
Currently translated at 100.0% (10118 of 10118 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-03-01 07:35:57 +01:00
EdizonTN 9e769d1ab0 Translated using Weblate (Slovak)
Currently translated at 64.0% (6482 of 10118 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-01 07:35:57 +01:00
Henrik Kauhanen 694132c2fe Translated using Weblate (Swedish)
Currently translated at 99.9% (10113 of 10118 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2026-03-01 07:35:57 +01:00
EdizonTN 5bb9e1e5c1 Translated using Weblate (Slovak)
Currently translated at 62.9% (6366 of 10118 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-01 07:35:57 +01:00
EdizonTN 06859309d7 Translated using Weblate (Slovak)
Currently translated at 62.8% (6363 of 10118 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-03-01 07:35:57 +01:00
Che-Hsien Su 51124f9ee6 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9912 of 10118 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2026-03-01 07:35:57 +01:00
Pferd O. 027c1cdf9c Translated using Weblate (German)
Currently translated at 100.0% (10118 of 10118 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-03-01 07:35:56 +01:00
Henrik Kauhanen 91cb46fe08 Translated using Weblate (Swedish)
Currently translated at 99.9% (10113 of 10118 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2026-03-01 07:35:56 +01:00
2tama3 b340fd6b06 Translated using Weblate (Japanese)
Currently translated at 100.0% (10118 of 10118 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-03-01 07:35:56 +01:00
Mark Roszko c176626120 Add --generate-report for drill report 2026-02-28 12:28:47 -05:00
Ian McInerney edd208aaa4 Don't show locking control in reference image dialog in footprint editor
We don't support locked items in the footprint editor.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/23203

(Cherry-picked from 21d441d208)
2026-02-28 16:35:19 +00:00
Seth Hillbrand a252e92d77 pcbnew: fix STEP exporter build errors
Match the three VECTOR2D origin parameters in exporter_step.cpp to
their const-reference declarations in exporter_step.h.
2026-02-27 18:59:08 -08:00
Seth Hillbrand 2a628ecadf pcbnew: fix DRC dialog focus stealing and flicker on GTK
SafeYieldFor( this, wxEVT_CATEGORY_NATIVE_EVENTS ) was called every
100ms during DRC to keep the UI responsive.  On GTK this processes raw
GDK events including window-focus and expose events, causing the dialog
to steal focus and flicker continuously while DRC is running.

wxEVT_CATEGORY_UI and wxEVT_CATEGORY_USER_INPUT are sufficient: UI
events keep the gauge visually updated; user-input events allow the
Cancel button to respond.  Excluding wxEVT_CATEGORY_NATIVE_EVENTS
eliminates the GTK focus/repaint churn without affecting Windows
behaviour (the 100 ms gate from fd501b4bc8 is retained).

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22916

(cherry picked from commit 18c76bbe7c7425db27e1597b044d93ebc13d5bbe)
2026-02-27 12:57:17 -08:00
Seth Hillbrand 366d083da2 Fix solder mask generation issues in STEP export
Fixed two problems with soldermask generation.  First, via holes weren't
cut in soldermask when copper export was disabled.  Second, we ignored
zones on F.Mask/B.Mask when zone export was disabled even though
soldermask export was enabled.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20452

(cherry picked from commit 497fe12f2d)
2026-02-27 12:56:47 -08:00
Wayne Stambaugh 2c55930bcf Fix false positive warning message when updating board from schematic.
The board connectivity algorithm creates pseudo net names for footprints
that have multiple pads with the same number using a "_N" suffix.  At
some point a change was made to the zone net properties dialog that
allowed choosing a pseudo net name as the net name assigned to the zone.
This caused the netlist updater to trigger a false "zone has no pads
connected" warning because the pseudo net name is not in the schematic
net list.

The warning message was not very helpful. Added the correct zone layers
and the net name assigned to the zone to the message for improved
clarity.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22133

(cherry picked from commit 6ba805173e)
2026-02-27 13:37:36 -05:00
Seth Hillbrand 008511e5e8 eeschema: fix design block panel crash on file open in standalone mode
When opening a new schematic file in standalone eeschema (without the
project manager), the project is reloaded via settings_manager.  The
old project's DESIGN_BLOCK_LIB_TABLE is destroyed, but
DESIGN_BLOCK_TREE_MODEL_ADAPTER::m_libs still holds a raw pointer to
it.  Hovering over any design block after this point fires
LIB_TREE::onPreselect -> GenerateInfo() -> m_libs->GetEnumeratedDesignBlock(),
which dereferences the dangling pointer and causes a SIGSEGV.

Fix by overriding SCH_EDIT_FRAME::ProjectChanged() to call
m_designBlocksPane->RefreshLibs(), which updates m_libs to point at
the new project's DESIGN_BLOCK_LIB_TABLE via adapter->SetLibTable().

Fixes: https://gitlab.com/kicad/code/kicad/-/issues/23156
2026-02-26 08:46:26 -08:00
Wayne Stambaugh 8eb9b52c00 QA housekeeping.
Remove the 9.99 QA configuration files.  They do not belong in the 9.0
branch.
2026-02-25 13:55:16 -05:00
Seth Hillbrand d23ac98062 Altium importer: use pre-computed kicadLocation for pin electrical end
ASCH_PIN already computes the electrical connection point (kicadLocation)
from the Altium body-end coordinates and pin length using combined
integer+fractional arithmetic, which avoids the rounding error that
occurs when computing Altium2KiCadUnit(body) + Altium2KiCadUnit(length)
separately.

Use this pre-computed value directly instead of manually adding the
pin-length offset to elem.location, eliminating the known off-by-one
positioning issue noted in the previous TODO comment.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/23238
2026-02-24 18:43:36 -08:00
Seth Hillbrand 0f16c0539e Fix Altium importer text orientation in symbols on schematic
Altium stores text orientation in absolute coordinates. When
importing labels inside symbols, the text angle and justification were
stored as-is in the library symbol, but KiCad applies the symbol's
orientation transform (via OrientAndMirrorSymbolItems) at render time.
This caused text to be rotated twice.  Fix this by pre-compensating for
the KiCad rotation.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22940
2026-02-24 18:43:33 -08:00
Seth Hillbrand fcc16293d0 Altium importer: Compensate field text for symbol orientation
When importing Altium schematics, text field properties (angle and
justification) for designators and parameters are stored in absolute
page coordinates. KiCad stores these relative to the parent symbol
and applies the symbol's transform at render time. Without
compensation, text appears with incorrect rotation and alignment
after the symbol orientation commit (090583a57e).

Add AdjustFieldForSymbolOrientation() to inverse-transform text angle
and horizontal justification based on the parent symbol's Altium
orientation. The compensation follows the same logic as
SCH_FIELD::Rotate() applied in the reverse direction for each of the
four orientation cases and mirror-Y.

Also add the missing SetTextPositioning() call in ParseLibDesignator()
to preserve text angle and justification for library-level designators.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22907
2026-02-24 18:41:15 -08:00
Seth Hillbrand c18d0c17f9 Altium: Fix pin orientation and arc geometry on import
Pin orientations from Altium are in absolute schematic coordinates, but
KiCad stores them in library-local space. To tranform the, we compute
both the pin body end and connection point in absolute coordinates,
transform both through GetRelativePosition, and derive the orientation
from the resulting direction vector.

This also fixes arc start/end offsets, which were computed from absolute
angles but never transformed to library-local space.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22907
2026-02-24 18:41:12 -08:00
Alex Shvartzkop 923fef44e9 Update translations 2026-02-25 01:09:13 +03:00
EdizonTN 0d160c41dc Translated using Weblate (Slovak)
Currently translated at 62.3% (6305 of 10116 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-24 23:08:23 +01:00
Tomas0015 5ffab9079f Translated using Weblate (Czech)
Currently translated at 78.5% (7949 of 10116 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-02-24 23:08:23 +01:00
EdizonTN 39dc9c1f89 Translated using Weblate (Slovak)
Currently translated at 62.3% (6303 of 10116 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-24 23:08:23 +01:00
2tama3 3c2bf49349 Translated using Weblate (Japanese)
Currently translated at 100.0% (10116 of 10116 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-02-24 23:08:23 +01:00
Frank Sonnenberg c0c8dec9ab Translated using Weblate (German)
Currently translated at 100.0% (10116 of 10116 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-24 23:08:23 +01:00
ZbeeGin 13418bf205 Translated using Weblate (Polish)
Currently translated at 99.9% (10107 of 10116 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-02-24 23:08:23 +01:00
EdizonTN 86ce0abacd Translated using Weblate (Slovak)
Currently translated at 61.9% (6263 of 10116 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-24 23:08:23 +01:00
EdizonTN 36231f0bee Translated using Weblate (Slovak)
Currently translated at 61.2% (6196 of 10116 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-24 23:08:22 +01:00
Ivan Chuba 4ddd716f22 Translated using Weblate (Ukrainian)
Currently translated at 99.9% (10113 of 10116 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/uk/
2026-02-24 23:08:22 +01:00
Pferd O. d9212a03be Translated using Weblate (German)
Currently translated at 100.0% (10116 of 10116 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-24 23:08:22 +01:00
Mitja Nemec 6322536b93 Translated using Weblate (Slovenian)
Currently translated at 0.8% (88 of 10116 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sl/
2026-02-24 23:08:22 +01:00
Seth Hillbrand 9bf88d7394 Fix image rotation direction in BITMAP_BASE::Rotate
The wxImage::Rotate90() parameter means "clockwise" when true, but the
code was passing aRotateCCW directly. This caused the pixel rotation to
be opposite to the intended direction. The bug manifested as images
appearing incorrectly after save/reload, since the OpenGL renderer uses
m_originalImage with m_rotation compensation, while after reload the
already-rotated pixels have no rotation compensation.

Also updated the unit test that was written to match the buggy behavior,
and added a separate test case for CW rotation.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22719

(cherry picked from commit a02b5f2f1f)
2026-02-24 08:39:43 -08:00
Seth Hillbrand 4a00f058a6 qa_cli: update ERC test fixtures for severity reporting
Commit a5f5298cad added severity headers to ERC report output but
didn't update the CLI test reference files. Update the golden .rpt
files to include the new "Report includes:" header line, update the
.json golden file to include the new "included_severities" array, and
bump the JSON test's line_skip_count from 5 to 9 to skip past the
new block and the kicad_version field during comparison.
2026-02-24 08:30:29 -08:00
Seth Hillbrand 6b1ab24ac9 Add $INSUNITS header variable to DXF export
The DXF exporter was missing the $INSUNITS header variable, which tells
CAD software what physical units the drawing coordinates represent. Without
it, other programs have no reliable way to determine the coordinate scale.

Add $INSUNITS to the HEADER section alongside the existing $MEASUREMENT
variable. When exporting in millimeters, $INSUNITS is set to 4; when
exporting in inches, it is set to 1.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/23181

(cherry picked from commit c0a6a139cf)
2026-02-23 18:21:50 -08:00
Seth Hillbrand 1fbdaf1347 Fix use-after-free in SCH_DIRECTIVE_LABEL destruction with rule areas
When FreeDrawList() destroys items in arbitrary order, a directive label
may be freed before the rule area it connects to. The rule area's
destructor then calls RemoveConnectedRuleArea() on the freed label.

Add ~SCH_DIRECTIVE_LABEL() that calls RemoveDirective() on each
connected rule area, mirroring the existing bidirectional cleanup
between SCH_RULE_AREA and SCH_ITEM.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/23150

(cherry picked from commit 685ee777bc)
2026-02-23 18:18:30 -08:00
Seth Hillbrand ca94b79638 Fix locked state lost when router splits a track segment
When routing a new track that connects to the middle of a locked track,
the router splits the existing segment into two pieces via
SplitAdjacentSegments. The PNS-level Clone preserves the MK_LOCKED
marker on both halves, but createBoardItem did not propagate the locked
state when creating the new board item for the second half.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21564

(cherry picked from commit 7df22da61a)
2026-02-23 18:12:17 -08:00
Seth Hillbrand 29345cc4d0 Fix diff pair router losing inherited track width after first click
When "Use Connected Track Width" is enabled and routing starts from
pre-routed diff pair tracks, the router correctly inherits the track
width for the initial segment. However, after the first click to fix
that segment, updateSizesAfterRouterEvent() recalculates sizes from
netclass constraints and DIFF_PAIR_PLACER::UpdateSizes() unconditionally
overwrites the inherited width, causing subsequent segments to revert
to the netclass default.

LINE_PLACER::UpdateSizes() already guards against this by checking
TrackWidthIsExplicit() and HasPlacedAnything() to preserve the
inherited width during chained placement. Add the same guard to
DIFF_PAIR_PLACER::UpdateSizes() so that the inherited diff pair width
is preserved across fix-route boundaries.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20189

(cherry picked from commit 573381c95b)
2026-02-23 18:10:26 -08:00
Seth Hillbrand 38510036f8 Fix crash in schematic hierarchy when load fails partway through
Guard against empty hierarchy in SetSheetNumberAndCount() to prevent
crash when schematic load fails and the hierarchy list is not populated.
Return empty string instead of asserting in GetPageNumber() when the
sheet path is empty.

Resolves KICAD-11EJ

(cherry picked from commit 0b79465d51)
2026-02-23 18:10:07 -08:00
Seth Hillbrand 625f28d84d Fix perpetual footprint change notifications for legacy FPIDs
When schematic symbols have footprint fields without library name prefixes
(e.g., "DGG56" instead of "Package_SO:DGG56"), the netlist updater's FPID
comparison always fails against the board's fully qualified FPIDs, causing
"Update PCB from Schematic" to perpetually report footprint changes that
can never be resolved.

Match by item name only when the schematic-side FPID has no library
nickname (legacy format), and warn the user to add the library prefix.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22958

(cherry picked from commit c28dd5d4a9)
2026-02-23 18:09:24 -08:00
Seth Hillbrand 78c0d81eb0 Attempt to fix crash on exit
The update check runs on the thread pool and captures a raw pointer to the
KICAD_MANAGER_FRAME for CallAfter. If the update check completes during
frame destruction, the CallAfter targets a partially-destroyed window,
causing a segfault in wxWindowBase::RemoveEventHandler via wxAuiNotebook
destruction.  At least, that is the theory...

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22593

(cherry picked from commit c0230e74c1)
2026-02-23 18:05:43 -08:00
Seth Hillbrand d911483455 Fix crash when exiting KiCad with editor frames open
Guard against re-entrant wxEVT_CLOSE_WINDOW events in windowClosing().
GTK can deliver a second close event while the first is still being
processed (e.g. during Destroy() calls in doCloseWindow), leading to
use-after-free crashes when the tool manager has already been deleted.

Also add defensive null checks for GetToolManager() and GetTool() in
all SaveSettings/SaveProjectLocalSettings paths that access the
selection tool filter, since these are called during frame teardown.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22926

(cherry picked from commit cb31a1ade7)
2026-02-23 18:05:40 -08:00
Seth Hillbrand 8759d05a12 Fix overlapping track segments
When routing with "Fix All Segments on Click" disabled, collinear segments
committed across multiple partial fixes were never merged, resulting in
redundant overlapping track segments.

The root cause was that simplifyNewLine() was only called when the route
was complete (realEnd=true), not during partial fixes. This function
handles merging of collinear segments and removal of contained segments.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/19538

(cherry picked from commit 30838e1ec8)
2026-02-23 18:04:20 -08:00
Seth Hillbrand 3fbf6ff1d0 Add escaping support for spaces in bus parsing
Adds support for two escaping mechanisms in bus vector and bus group
parsing to allow net names with spaces inside bus constructs in one of
two common ways

1. Backslash escaping: Data\ Bus[1..4] or BUS{Net\ One Net\ Two}
2. Quoted strings: "Data Bus"[1..4] or BUS{"Net One" "Net Two"}

Fixes https://gitlab.com/kicad/code/kicad/-/issues/9258

(cherry picked from commit 66e232bc36)
2026-02-23 18:04:15 -08:00
Seth Hillbrand 09fcc1269f Strip whitespace from bus alias names and members
Bus alias names and member names entered with leading or trailing
whitespace caused silent connection failures because the lookup
used the trimmed name from the schematic label while the definition
retained the untrimmed name.

Centralize sanitization in BUS_ALIAS by trimming whitespace in
SetName() and adding AddMember/SetMembers/ClearMembers methods
that trim and reject empty strings. Remove the mutable Members()
accessor to prevent bypassing the sanitization. Update all callers
across parsers, importers, and the dialog to use the new API.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/19971

(cherry picked from commit 80c4b1b4df)
2026-02-23 18:02:57 -08:00
Dominique Fuchs 5ffe0e762a macOS: Fix kicad-cli resolving paths relative to symlink location 2026-02-23 17:55:34 -08:00
Akhil Velagapudi 40a4f1543f IPC-2581: Fix duplicate Location elements for multi-pad pins 2026-02-23 17:51:28 -08:00
Damjan 106f10ca46 Adjust/Distribute tool skips table cells 2026-02-23 17:44:39 -08:00
Jeff Young 48ad039c39 Unbind event handlers in d'tor. 2026-02-23 17:44:36 -08:00
Seth Hillbrand 4891b45be4 Fix O(n^2) ResolveItem lookups for degen boards
ResolveItem's linear scan fallback now caches items on first
hit, so repeated lookups for the same uncached UUID are O(1)
instead of O(n). The cache is made mutable to allow population
from the const method.

In resolveGroups, the parser now uses the board's item-by-id
cache directly instead of calling ResolveItem, and builds a
one-time hash map for footprint children. This eliminates the
per-call dynamic_cast and linear scans that made group
resolution quadratic on boards with many groups.

(cherry picked from commit 459d2cfb68)
2026-02-23 17:28:24 -08:00
Bernhard Kirchen a5f5298cad ERC/DRC reports: list what severities are part of the report
an ERC or DRC report without violations or without violations of a
particular kind does not tell the user whether there actually are no
violations of that severity, or if the severity was filtered.

we now list the severities by name that are included in the report.

(cherry picked from commit cd03794b23)
2026-02-23 13:15:54 -05:00
Bernhard Kirchen 662b7daf00 CLI: make ERC report include violations with the expected severities
the ERC report creates its own SHEETLIST_ERC_ITEMS_PROVIDER and
hard-codes warnings and errors as wanted severities, regardless
of the --severity-* options given through the CLI.

we keep the marker provider optional and create a fallback instance for
tests code that expects reports with warnings and errors.

(cherry picked from commit 24dec03ba5)
2026-02-22 17:07:45 -05:00
Wayne Stambaugh f4b3366b30 Revert "Fix schematic ERC report command line output."
This reverts commit 47edf9b52d.
2026-02-22 17:06:39 -05:00
Wayne Stambaugh 47edf9b52d Fix schematic ERC report command line output.
The schematic ERC command line report was always reporting the same output
regardless of the severity options because the severity was hard coded to
RPT_SEVERITY_ERROR and RPT_SEVERITY_WARNING.  The ERC_REPORT object now has
an optional severities argument for filtering the output ERC items.
2026-02-22 14:40:14 -05:00
Seth Hillbrand 1390e4d82f Fix routing perf regression from clearance cache
The clearance cache added in b0d0dd57ef invalidates on every
SetLayer() and SetNetCode() call. The router's rule resolver
calls SetLayer() on dummy board items for every clearance
evaluation during routing. Each call acquires an exclusive
lock and linearly scans the entire cache, but dummy items
never exist in the cache, so this is pure waste.

Skip cache invalidation for items flagged ROUTER_TRANSIENT.
The flag is already set on all dummy items in the rule
resolver.

Also replace the O(n) linear scan in InvalidateClearanceCache
with targeted O(1) hash erasure per copper layer.
2026-02-20 15:07:27 -08:00
Seth Hillbrand e1fe374b0a Open subsheets in project context on activation
Double-clicking a subsheet in the project tree opened
it as a standalone schematic, losing reference numbers
and project context. The fix scans the schematic file
hierarchy using a lightweight text parser to determine
if the clicked file is part of the project. If it is,
the project schematic opens and navigates to the target
sheet via MAIL_SCH_NAVIGATE_TO_SHEET.

The cross-probing handler now compares against
SCH_SCREEN::GetFileName() instead of
SCH_SHEET::GetFileName(), since the screen stores the
absolute path while the sheet stores a relative one.
The previous comparison would never match for subsheets.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/23000
2026-02-19 11:07:37 -08:00
Alex Shvartzkop db83e73498 Update translations 2026-02-19 12:58:07 +03:00
Frank Sonnenberg ae84af20db Translated using Weblate (German)
Currently translated at 100.0% (10119 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-19 10:57:31 +01:00
Tomas0015 cd343c953a Translated using Weblate (Czech)
Currently translated at 78.2% (7922 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-02-19 10:57:31 +01:00
EdizonTN 5f8e45632d Translated using Weblate (Slovak)
Currently translated at 60.6% (6133 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-19 10:57:31 +01:00
2tama3 65e153b02c Translated using Weblate (Japanese)
Currently translated at 100.0% (10119 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-02-19 10:57:31 +01:00
Tomas0015 3722e13fa6 Translated using Weblate (Czech)
Currently translated at 77.9% (7891 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-02-19 10:57:30 +01:00
Frank Sonnenberg 1102e32c2a Translated using Weblate (German)
Currently translated at 100.0% (10119 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-19 10:57:30 +01:00
Frank Sonnenberg 4e719bb048 Translated using Weblate (German)
Currently translated at 100.0% (10119 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-19 10:57:30 +01:00
EdizonTN aa30dea896 Translated using Weblate (Slovak)
Currently translated at 60.2% (6096 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-19 10:57:30 +01:00
2tama3 e8e58a5e38 Translated using Weblate (Japanese)
Currently translated at 100.0% (10119 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-02-19 10:57:30 +01:00
Alex Gellen 43d8f48517 Translated using Weblate (Romanian)
Currently translated at 29.8% (3025 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2026-02-19 10:57:30 +01:00
Mitja Nemec 2cc9c18337 Translated using Weblate (Slovenian)
Currently translated at 0.5% (53 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sl/
2026-02-19 10:57:30 +01:00
Hynek Štětina fba97dd2c7 Translated using Weblate (Czech)
Currently translated at 77.9% (7885 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-02-19 10:57:29 +01:00
Seth Hillbrand ac922b8ad3 Fix hotkey list dialog missing runtime refresh
The List Hotkeys dialog now saves edits but was not calling
CommonSettingsChanged(HOTKEYS_CHANGED) after closing, so
ACTION_MANAGER kept stale keycode lookup maps and edited
shortcuts did not take effect until restart.

Add the HOTKEYS_CHANGED notification after the dialog closes
with OK. Add a Cancel button so users can discard accidental
edits. Exclude gesture and platform command pseudo-actions
from the Preferences panel since edits to those entries are
not persisted to disk. The List Hotkeys dialog continues to
show them for reference. Update the stale "read-only" doc
comment on DIALOG_LIST_HOTKEYS.
2026-02-18 18:40:18 -08:00
Seth Hillbrand 1d4e119724 Fix hotkey editing not working in Preferences dialog.
Remove the m_readOnly parameter from PANEL_HOTKEYS_EDITOR and
WIDGET_HOTKEY_LIST. This parameter was causing hotkey changes not to be
saved because TransferDataFromWindow() would return early when m_readOnly
was true, and event handlers for editing were only bound when m_readOnly
was false.

Both the Preferences Hotkeys panel and the Help > List Hotkeys dialog
now support editing, which is the expected behavior.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22455
2026-02-18 18:40:18 -08:00
Wayne Stambaugh a88edddef3 Overwrite output file when exporting ODB++ from the command line.
Remove the existing file check when exporting ODB++ from the command line.
It is still retained when exporting ODB++ using the dialog.

This also adds additional command line status information when exporting
from the command line using a CLI_REPORTER object.  If any errors occur
exporting they are written to 'stderr' and the job handler returns an
unknown error code instead of always returning a successful export.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/23148
2026-02-18 18:48:28 -05:00
jean-pierre charras c1e9e95849 French translation update 2026-02-18 13:07:16 +01:00
Seth Hillbrand 3f69a07e89 Fix crash/hang in DRC zone-zone clearance check
SEG::operator< delegates to VECTOR2I::operator< which compares by
squared magnitude. When SEG::operator< mixes this magnitude comparison
with VECTOR2I::operator== (exact coordinate equality) for tie-breaking,
it violates strict weak ordering: two points at the same magnitude but
different coordinates are "incomparable" under operator< but "unequal"
under operator==, breaking transitivity of incomparability.

Replace the default SEG::operator< sort with a lexicographic comparator
on x/y coordinates, which provides a proper strict weak ordering and
matches the sweep-line optimization that follows (breaking the inner
loop when refSegment.B.x < testSegment.A.x).

Also add null checks for polyA/polyB from GetFill() before dereferencing.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/23112
2026-02-16 14:02:44 -08:00
Seth Hillbrand 9dbffdffeb Don't strip trailing null byte from binary records in Altium parser
ReadProperties() unconditionally stripped a trailing 0x00 byte from all
records. This is correct for text records where 0x00 is a string
terminator, but binary records contain raw compressed data where 0x00 is
valid payload. When a zlib stream happened to end with 0x00, stripping
it caused ReadFullPascalString() to throw out_of_range, crashing Altium
.SchLib imports.

Only strip the null byte for non-binary records.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/23013
2026-02-16 13:06:24 -08:00
Alex Shvartzkop e1e00acccb Update translations 2026-02-16 02:11:53 +03:00
EdizonTN 6ffbdeb08c Translated using Weblate (Slovak)
Currently translated at 59.8% (6060 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-15 23:10:50 +00:00
EdizonTN e70682e7c6 Translated using Weblate (Slovak)
Currently translated at 59.8% (6058 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-16 00:07:31 +01:00
Ivan Chuba 3c8718bfdb Translated using Weblate (Ukrainian)
Currently translated at 99.9% (10116 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/uk/
2026-02-16 00:07:31 +01:00
Jan Straka 94bc350653 Translated using Weblate (Czech)
Currently translated at 77.9% (7885 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-02-16 00:07:31 +01:00
ZbeeGin 012fb56c14 Translated using Weblate (Polish)
Currently translated at 99.9% (10109 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-02-16 00:07:31 +01:00
Pferd O. 71a37d54d4 Translated using Weblate (German)
Currently translated at 100.0% (10119 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-16 00:07:30 +01:00
Marco Ciampa 2d694ce203 Translated using Weblate (Italian)
Currently translated at 99.3% (10049 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2026-02-16 00:07:30 +01:00
EdizonTN f2c7936425 Translated using Weblate (Slovak)
Currently translated at 59.4% (6020 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-16 00:07:30 +01:00
Pferd O. 41603e1c4f Translated using Weblate (German)
Currently translated at 99.9% (10111 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-16 00:07:30 +01:00
Marco Ciampa 4d35bc7c2d Translated using Weblate (Italian)
Currently translated at 99.2% (10047 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2026-02-16 00:07:30 +01:00
EdizonTN 34c8413bba Translated using Weblate (Slovak)
Currently translated at 59.3% (6004 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-16 00:07:30 +01:00
Ivan Chuba d6bba34632 Translated using Weblate (Ukrainian)
Currently translated at 99.9% (10112 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/uk/
2026-02-16 00:07:30 +01:00
CloverGit 2631af8aa9 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.7% (10091 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2026-02-16 00:07:29 +01:00
EdizonTN f6aff75274 Translated using Weblate (Slovak)
Currently translated at 58.6% (5935 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-16 00:07:29 +01:00
Marco Ciampa ac5d8a10b6 Translated using Weblate (Italian)
Currently translated at 99.2% (10043 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2026-02-16 00:07:29 +01:00
2tama3 aed8e51eb5 Translated using Weblate (Japanese)
Currently translated at 100.0% (10119 of 10119 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-02-16 00:07:29 +01:00
Jeff Young a058d1db76 Check graphic for matching nets.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/23011

(cherry picked from commit 26e97207e2)
2026-02-13 12:33:07 +00:00
John Beard af9a3281ca Pcbnew: export footprints in normal mode, not compact
Otherwise, footprints will export differently to how they save.

In master, this is already fixed with
KICAD_FORMAT::Prettify( prettyData, KICAD_FORMAT::FORMAT_MODE::NORMAL );

Fixes: https://gitlab.com/kicad/code/kicad/-/issues/23050
2026-02-13 18:14:57 +08:00
Alex Shvartzkop e6c4bbd429 Update translations 2026-02-12 00:15:52 +03:00
René Široký 6f8a4bf2bf Translated using Weblate (Czech)
Currently translated at 77.9% (7884 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-02-11 22:13:15 +01:00
Frank Sonnenberg f8c4f5a83f Translated using Weblate (German)
Currently translated at 100.0% (10114 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-11 22:13:15 +01:00
Pferd O. bd45f578cd Translated using Weblate (German)
Currently translated at 100.0% (10114 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-11 22:13:15 +01:00
EdizonTN 17dade6a1e Translated using Weblate (Slovak)
Currently translated at 58.6% (5930 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-11 22:13:15 +01:00
Tomas0015 f8d52e0242 Translated using Weblate (Czech)
Currently translated at 77.9% (7884 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-02-11 22:13:15 +01:00
René Široký d3c57917b4 Translated using Weblate (Czech)
Currently translated at 77.9% (7884 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-02-11 22:13:15 +01:00
Pferd O. 30558013a8 Translated using Weblate (German)
Currently translated at 99.9% (10113 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-11 22:13:15 +01:00
Frank Sonnenberg cdc6ce1113 Translated using Weblate (German)
Currently translated at 99.9% (10113 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-11 22:13:15 +01:00
Alex Gellen 5ae3c8462e Translated using Weblate (Romanian)
Currently translated at 28.9% (2930 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2026-02-11 22:13:15 +01:00
Tomas0015 413ec5660b Translated using Weblate (Czech)
Currently translated at 77.9% (7881 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2026-02-11 22:13:14 +01:00
EdizonTN 062447439b Translated using Weblate (Slovak)
Currently translated at 58.6% (5927 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-11 22:13:14 +01:00
Pferd O. 342168a77e Translated using Weblate (German)
Currently translated at 99.9% (10113 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-11 22:13:14 +01:00
Frank Sonnenberg bd940d4694 Translated using Weblate (German)
Currently translated at 99.9% (10113 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-11 22:13:14 +01:00
Pferd O. b4b1870c51 Translated using Weblate (German)
Currently translated at 99.9% (10113 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-11 22:13:14 +01:00
ZbeeGin 4c26d6b043 Translated using Weblate (Polish)
Currently translated at 100.0% (10114 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-02-11 22:13:14 +01:00
EdizonTN 0c683754a0 Translated using Weblate (Slovak)
Currently translated at 58.0% (5871 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-11 22:13:14 +01:00
Frank Sonnenberg e6a5296dd8 Translated using Weblate (German)
Currently translated at 99.9% (10113 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-11 22:13:14 +01:00
Frank Sonnenberg babe5cbfa0 Translated using Weblate (German)
Currently translated at 99.9% (10113 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-11 22:13:14 +01:00
2tama3 06be33cc41 Translated using Weblate (Japanese)
Currently translated at 100.0% (10114 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-02-11 22:13:13 +01:00
EdizonTN 3b36ba1fa3 Translated using Weblate (Slovak)
Currently translated at 58.0% (5868 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-11 22:13:13 +01:00
CloverGit 87660838f5 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (10094 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2026-02-11 22:13:13 +01:00
Damjan cedb3b15a6 Fix PCB table flipping to respect Left/Right and Top/Bottom preference 2026-02-11 12:39:48 -05:00
Damjan d5305adde1 Fix multiline text alignment in symbol plots
(cherry picked from commit ca750804ac)
2026-02-09 19:59:23 -05:00
Jeff Young 5ebfc5ac18 Fill in some missing tests in SCH_SYMBOL operator==. 2026-02-09 15:41:58 +00:00
Seth Hillbrand 2436b2e900 Remove WinRT accidental cherry-pick 2026-02-08 19:52:22 -08:00
Seth Hillbrand a251d083fa Add more Linux warnings
MSVC is all bend out of shape about wxString conversions so it will help
to get the warnings on Linux as well.  Only works for Clang right now

(cherry picked from commit 382e141db5)
2026-02-08 17:15:44 -08:00
Damjan 05004b8026 Fix autocomplete popup closing immediately on first line.
(cherry picked from commit 201a49b1c9)
2026-02-08 12:12:15 +00:00
Damjan 5fa8b26f4c Fix accent (´) being converted to apostrophe in Scintilla text controls
(cherry picked from commit f23d3df3ca)
2026-02-08 12:08:27 +00:00
Seth Hillbrand eb6ab26ed7 Only report duplicate pins when on different nets
Symbols with multiple pins sharing the same pin number are valid when
those pins are connected to the same net. This is common for connector
symbols and jumpers where internal connections exist.

The ERC now checks actual net connections rather than just detecting
duplicate pin numbers. A new TestDuplicatePinNets function iterates
over sheet paths to access connection information and only reports an
error when duplicate-numbered pins are connected to different nets.

The error report now states which pins are duplicate and which nets

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20443

(cherry picked from commit 37c005fb32)
2026-02-06 08:55:04 -08:00
jean-pierre charras 062c21ce5c Try to fix French translation 2026-02-06 14:21:23 +01:00
jean-pierre charras 2cdf5ca637 French translation update 2026-02-06 12:50:38 +01:00
Seth Hillbrand bbbe0235bf Fix render jobs not honoring layer presets
When executing render jobs from jobsets, the code stored the preset name
in m_CurrentPreset but never actually applied the preset's layer visibility
settings and colors. This caused renders to use whatever settings were in
the user's 3D viewer config instead of the specified preset.

Add code to look up the preset and apply its settings using SetVisibleLayers()
and SetLayerColors(), matching the behavior of the 3D viewer GUI.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21887

(cherry picked from commit 0dc4c5d08b)
2026-02-05 23:01:38 -08:00
Seth Hillbrand 5631ef69c9 Eeschema: Fix snap indicator hidden when snapping to anchors
BestSnapAnchor unconditionally hid the snap point indicator and
cleared the snap item at the end of the function, even after
successfully snapping to an anchor. This was introduced in
e892783109 when the snap line logic was refactored to use
SnapToConstructionLines. The original code used mutually exclusive
if/else if/else branches, but the refactored code fell through to
the cleanup block in all cases.

Return early from BestSnapAnchor when snapped to an anchor, which
preserves the snap indicator visibility and m_snapItem state. This
restores the visual feedback (circle-cross marker) that shows when
the cursor has snapped to a pin, wire endpoint, or junction.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22678

(cherry picked from commit e87f655293)
2026-02-05 23:01:38 -08:00
Seth Hillbrand 2d67316967 Fix ERC non-determinism when processing global power pins
Sort m_global_power_pins before processing in generateGlobalPowerPinSubGraphs()
to ensure deterministic iteration order. This prevents the same schematic from
producing different ERC results on consecutive runs.

The sort key uses sheet path, symbol reference, and pin number for a stable
ordering that does not depend on RTree iteration order.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20012

(cherry picked from commit 22428040b7)
2026-02-05 23:01:38 -08:00
Seth Hillbrand f418a0e256 Fix HTTP library symbol library nickname not set correctly
When placing a symbol from an HTTP library, the symbol kept the original
KiCad library nickname instead of using the HTTP library nickname. For
example, a symbol from the W5 HTTP library would retain "Device" as its
library nickname instead of "W5".

The issue was in loadSymbolFromPart() where only the sub-library name was
updated, leaving the library nickname from the source symbol unchanged.

The fix extracts the library nickname from the HTTP library path
(e.g., "W5.kicad_httplib" becomes "W5"), passes this path to
loadSymbolFromPart(), and calls SetLibNickname() before setting the
sub-library name. This ensures the symbol's library link is correctly
formatted as "LibraryNickname:PartName" instead of using the wrong
library name.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20407

(cherry picked from commit b61b0f180c)
2026-02-05 23:01:38 -08:00
Seth Hillbrand 00f1c1c4ee Fix hidden power pin visibility change not updating connectivity
SCH_PIN::HasConnectivityChanges() now detects visibility changes for
power input pins. Hidden power pins create implicit global net
connections via IsGlobalPower(), so visibility changes affect
connectivity semantics.

Also detects pin type changes to/from PT_POWER_IN since these affect
IsGlobalPower() as well.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21159

(cherry picked from commit 9587f62e0c)
2026-02-05 23:01:38 -08:00
Seth Hillbrand 61247a1b43 IPC-2581: Export solder mask openings for SMD pads
SMD pads have implicit solder mask and paste openings that are defined by
the pad's expansion properties, but the mask layers are not in the pad's
layer set. The IPC-2581 exporter was only iterating over the pad's layer
set, causing mask/paste layer features to be missing for SMD pads.

Add pads to F_Mask/B_Mask and F_Paste/B_Paste layer features when they
are on the corresponding copper layer, unless they already explicitly
include those layers in their layer set.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/16658

(cherry picked from commit 37b23ef824)
2026-02-05 23:01:38 -08:00
Seth Hillbrand 13063d2148 Cairo: Fix high CPU usage in fallback graphics mode
Create wxPaintDC in onPaint() to acknowledge paint events. Without this,
wxWidgets keeps sending paint events because it thinks the window still
needs to be painted. This caused continuous repaints in Cairo mode,
consuming CPU when dialogs with preview canvases were open.

The OpenGL GAL has the same issue but is not affected because
wxGLCanvas handles paint events differently via its double-buffering
mechanism.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/18823

(cherry picked from commit e8d3b68e6b)
2026-02-05 23:01:38 -08:00
Seth Hillbrand 1a14809f16 Fix via placement when pressing V before starting to route
When the user presses V to place a via before clicking to start routing,
the via placement intent was being ignored because ToggleViaPlacement()
only works during active routing. The via would only appear if the user
moved the mouse after pressing V.

Add a flag to remember when V is pressed in pre-routing state and enable
via placement after routing starts.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/19814

(cherry picked from commit f6a0b6b836)
2026-02-05 23:01:38 -08:00
Seth Hillbrand 4034211f6e Altium: Apply symbol orientation and mirroring on import
Apply the symbol orientation and mirroring from Altium schematic files
when importing. Previously, all imported symbols were placed at 0 degree
rotation regardless of their original orientation in Altium.

The orientation mapping follows the same pattern used for power ports:
- Altium 0 (RIGHTWARDS) -> KiCad SYM_ORIENT_90
- Altium 1 (UPWARDS) -> KiCad SYM_ORIENT_180
- Altium 2 (LEFTWARDS) -> KiCad SYM_ORIENT_270
- Altium 3 (DOWNWARDS) -> KiCad SYM_ORIENT_0

When the symbol is mirrored in Altium, SYM_MIRROR_Y is also applied.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/19630

(cherry picked from commit 090583a57e)
2026-02-05 23:01:38 -08:00
Seth Hillbrand 8a839ac851 Fix incorrect ordering of mouse click and escape key events
When pressing escape soon after left clicking (within ~60ms), KiCad
was processing the escape key before the mouse button release event
due to wxWidgets event queue ordering. This caused operations to be
canceled instead of completed.

The fix adds flushPendingClicks() which checks button state via polling
when an escape key event arrives. If a button was logically pressed but
has been physically released, the click event is generated before the
escape event is processed, maintaining proper ordering.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20527

(cherry picked from commit b9327dbe7e)
2026-02-05 23:01:38 -08:00
Seth Hillbrand a8ecaf2cc9 Git: Show error when pull fails due to unstaged changes
When git pull fails due to unstaged changes in the working directory,
show an informative error message instead of silently failing.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20363

(cherry picked from commit 0b116673ab)
2026-02-05 23:01:37 -08:00
Seth Hillbrand b395c31c91 Show embedded fonts inherited from footprints in board setup
When a PCB contains footprints with embedded fonts, the Board Setup
dialog's Embedded Files panel was not showing these inherited fonts,
even though they were correctly embedded when saving.

Fix by collecting embedded files from all footprints and passing them
to PANEL_EMBEDDED_FILES as inherited files.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20579

(cherry picked from commit b0bf0a9365)
2026-02-05 23:01:37 -08:00
Seth Hillbrand ad80375664 Sync Sheet Pins dialog now honors selected sheet
When opening the Sync Sheet Pins dialog from the toolbar, the dialog
now automatically selects the tab for the currently selected sheet.
If no sheet is selected, it falls back to selecting the first tab
with unsynced pins (those showing the exclamation mark icon).

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22344

(cherry picked from commit 618aa535b1)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 53724b15b0 Fix false positive board edge clearance for concentric arcs
Use DRC epsilon tolerance when checking edge clearance collisions to prevent
false positives caused by floating-point precision issues. Items placed exactly
at the specified clearance distance were incorrectly flagged due to
floating-point rounding in arc/arc distance calculations.

The fix subtracts m_epsilon from the collision threshold, which is initialized
from the board's DRC epsilon setting. This provides consistent tolerance
handling that matches other DRC checks.

Adds regression test with concentric arcs where copper arc inner edge is
exactly at board edge clearance distance.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/18839

(cherry picked from commit 01e67cef85)
2026-02-05 23:01:37 -08:00
Seth Hillbrand adeda13537 Fix router clearance check for pads with different sizes on each layer
When using FRONT_INNER_BACK padstack mode on a 2-layer board, the router
would incorrectly report clearance violations. This happened because
syncPad() created an INNER_LAYERS SOLID with PNS_LAYER_RANGE(1, 0),
which got swapped to (0, 1) by the constructor. This caused the SOLID
to be indexed on both F_Cu and B_Cu, leading to incorrect collision
checks that used the wrong pad size.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20355

(cherry picked from commit 7d1b5db8ac)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 8986f0762e Add 30-second connection timeout to CURL to prevent UI freeze
Without a connection timeout, CURL can wait up to 5 minutes for DNS
resolution or connection establishment when network is unreachable.
The 30-second connection timeout applies only to the connection phase,
not the total transfer time, so large file downloads still work normally.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20568

(cherry picked from commit f5c7ab27c9)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 80fd7b6287 Fix HTTP library symbol name not set correctly
When loading symbols from an HTTP library, the duplicated symbol
retained the original symbol's name instead of the HTTP library
part identifier. This caused ERC to report "Symbol not found"
errors with the wrong symbol name.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20247

(cherry picked from commit c2403152e0)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 7d95d025c4 Fix topology mismatch with dotted reference designators in multichannel tool
The multichannel tool's topology matching failed when reference designators
contained dots (e.g., TRIM_1.1, TRIM_2.1) because GetRefDesPrefix() extracted
different prefixes for components that should match. TRIM_1.1 gave prefix
"TRIM_1." while TRIM_2.1 gave "TRIM_2.", causing IsSameKind() to return false.

Modified the prefix comparison in topo_match.cpp to find the longest common
starting sequence between prefixes and verify that the differing parts are
valid channel suffixes (digits and dots only). This allows TRIM_1. and TRIM_2.
to match because they share base prefix "TRIM_" with channel suffixes.

Added unit test for the specific dotted reference designator case.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20058

(cherry picked from commit e9c32c7202)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 0ccd2b7db7 Fix arrow key movement precision during Move operation
When moving items with arrow keys, the position should change by exactly
the grid step amount. My previous fix for issue 21682 introduced Align()
which snaps to the nearest grid point, but this causes problems when the
item starts at an off-grid position.

The original fix also had a second problem where the refreshPreview filter
was too broad. CursorControl posts refreshPreview after handling arrow
keys, but the filter prevented using the keyboard position for that event,
so it fell back to mouse position instead.

This restructures the code to always use the keyboard position when it's
valid, and moves the refreshPreview filter inside so it only skips the
axis lock logic rather than the entire keyboard handling path.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22805

(cherry picked from commit f41394fc5a)
2026-02-05 23:01:37 -08:00
Seth Hillbrand d9958ff5ff kicad-cli: Preprocess vector args
argparse required long-form functions to use an equal sign to process a
string like --rotate='-45,0,45' but would accept long-form args that
didn't have a negative like --output test.png without the equal sign.

Since this is an intrinsic limitation of our library, we work around it
by detecting these vector forms and changing them into an equality under
the hood.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20191

(cherry picked from commit a9ce9da551)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 0ae20bf3b0 pcbnew: Fix footprint selection when only opposite-side layers visible
Footprints with graphics on both copper layers (like fiducials without
pads) were not selectable when only the opposite-side layers were
visible. For example, a footprint declared on F.Cu with graphics on
B.Cu could not be selected when showing only bottom layers.

The early-return check based on the footprint's declared side prevented
the child visibility iteration from running, even though child items on
the opposite layer were visible. Removing this check allows the existing
child iteration to correctly determine selectability based on whether
any child items are on visible layers.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22666

(cherry picked from commit 40ea18277f)
2026-02-05 23:01:37 -08:00
Seth Hillbrand bd64ea015c Allow lowercase letters for array tool pin numbering
The ARRAY_AXIS class now accepts lowercase letters (a-z) as input for
alphabetic numbering schemes and preserves that case in the output.
This allows users to create pin numbers like a1, b1, c1 which are
commonly used in DIN 41612 and other backplane connectors.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22787

(cherry picked from commit 56b8309525)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 0b8a92d930 Ensure that arcs are properly handled when converting
Shallow arcs are essentially segments but the cutoff is not clear.  So
we build a two-tiered system where we know that arcs with at least a
sagitta-chord ratio of 0.3 are valid and we know that less than 0.2 is
invalid.  After that, we do additional rational checks to find
problematic arcs that are more computationally intensive

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22475

(cherry picked from commit 3b3d640eed)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 6f5a92c7e2 Altium Schematic Import: Fix duplicate sheet creation in hierarchical projects
When importing Altium projects, sheets were sometimes imported as both top-level
sheets and hierarchical subsheets. This happened because the project file lists
sheets in arbitrary order. If a parent sheet was processed before its children,
the children would be loaded as subsheets during hierarchy descent. Later, when
those same files appeared in the project file, duplicate sheets were created.

The importer now checks whether a file has already been loaded as a subsheet
before creating a new top-level sheet entry. The check includes a case-insensitive
fallback search since Altium uses inconsistent casing in its .SchDoc extension.

Sheet filenames were also being set to the original Altium paths instead of
KiCad project-relative paths. This caused path mismatches in the hierarchy
search and left references to non-existent Altium paths in the saved schematic.
Filenames now use the KiCad project directory with the .kicad_sch extension.

Hierarchical labels on top-level sheets are converted to global labels during
import since top-level sheets have no parent sheet to connect them to.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21909

(cherry picked from commit f00dc1befd)
2026-02-05 23:01:37 -08:00
Seth Hillbrand ef617a272d Fix mirrored text in data views for RTL locales like Hebrew
wxWidgets applies layout direction mirroring to controls when the locale
is a right-to-left language (Hebrew, Arabic, etc.). This caused text in
wxDataViewCtrl and wxListCtrl widgets to appear horizontally mirrored,
making them unreadable.

The fix explicitly sets wxLayout_LeftToRight on all wxDataViewCtrl and
wxListCtrl widgets used to display violation reports and data lists.
This follows the existing pattern used in other KiCad dialogs and
drawing panels.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22750

(cherry picked from commit f41eb38405)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 196e63ba01 Altium importer: Fix symbols with slashes in names not loading
When Altium symbol names contain slashes (e.g., "C-68UF/63V_10/10-SMD"),
the compound file stores them in directories using underscores instead
(since slashes are invalid in directory names). The symbol cache used
these directory names as keys, but the symbol's internal name (m_name)
was set from the original Altium LIBREFERENCE property with slashes.

This caused a mismatch when loading symbols via the symbol chooser,
as the tree node's LIB_ID was built from GetName() (with slashes) but
the cache lookup expected the directory name (with underscores).

Fix by setting the symbol name to match the cache key after parsing,
ensuring consistent lookups.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22453

(cherry picked from commit f91e3df207)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 133d2fa5f6 Reset tool dispatcher state when GAL canvas loses focus
When the GAL canvas loses focus while a mouse button is pressed,
the button-up event may be delivered to another window, leaving
the tool dispatcher in an inconsistent state where it thinks the
button is still pressed. This can cause selection and drag
operations to stop working until the application is restarted.

Call ResetState() on the tool dispatcher when focus is lost to
ensure the button tracking state is properly cleared. This
complements the existing CancelDrag() call which only resets the
view-level panning/zooming state.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22317

(cherry picked from commit f5731f69b1)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 18575df311 Use GetType() for pin alternate electrical type queries
When a pin has an alternate function selected, GetType() correctly
returns the alternate's type. However, GetCanonicalElectricalTypeName(),
GetElectricalTypeName(), and PlotPinType() were accessing m_type directly,
bypassing the alternate type lookup. This caused netlist exports to show
the wrong pin type (e.g., "no_connect" instead of "power_in") and the
NC symbol to be drawn incorrectly when alternates changed the pin type.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22286

(cherry picked from commit 25430cfbb8)
2026-02-05 23:01:37 -08:00
Seth Hillbrand f1b0926699 Properly bind event handlers to a sink
Lambdas are stored as opaque functors, so wxWidgets cannot see what they
capture.  Since we don't know what the event sink is, we don't know to
detach the handler when the sink is destroyed.  Then, events can execute
after the swatch is destroyed

Changing the lambdas to a member function explicitly binds the event to
a sink and wxWidgets can track it and detach the handler when the swatch
hits a dtor

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22689

(cherry picked from commit 36655e0499)
2026-02-05 23:01:37 -08:00
Seth Hillbrand eadc270c11 Fix overlapping dialogs in zone manager
When transferring data, we may hit an error.  Don't keep processing b/c
this will move the progress dialog back to the front

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22687

(cherry picked from commit aef709bbe4)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 02731c6e8b Fabmaster: Preserve static shapes that have no matching outline
Static shapes in Allegro are copper areas that don't void around other nets.
In Fabmaster export, these appear as filled areas with net assignments but
without corresponding outline polygons. Previously, the importer deleted all
netted zones after matching outlines to fills, which caused static shapes
to disappear entirely.

Now the importer tracks which fills are matched to outlines and only deletes
those. Unmatched fills (static shapes) are preserved as solid filled zones
with their original net assignments.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/7753

(cherry picked from commit 6601701fe0)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 305761c777 IPC-2581: Use inline geometry for shapes in Marking elements
When shapes like circles, rectangles, and polygons are placed within
Marking elements in Package definitions, they should use inline Polyline
geometry rather than UserPrimitiveRef references.

The fix adds an aInline parameter to addShape() for PCB_SHAPE. When true,
circles are output as two PolyStepCurve arcs forming a complete circle,
rectangles as PolyStepSegment paths, and polygons as Polyline elements
with their outline points.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/17623

(cherry picked from commit 0ef2631492)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 948fc25618 Fix dashed/dotted line rendering in simulator graphs
The horizontal segment merging optimization was breaking non-solid pen
styles by combining line segments, which altered the dash/dot pattern.
This fix only applies the merging optimization for solid pens and extends
the reduced chunk size handling to all non-solid pen styles.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/18887

(cherry picked from commit 233fa0366f)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 31c06bd7f2 Fix multichannel tool removing vias from reference rule area
When a copper fill zone shares the same name as a placement rule area,
the multichannel tool's enclosedByArea() queries would match items in
both zones. This caused vias and other routing in the reference area to
be incorrectly removed during repeat layout operations.

Changed findOtherItemsInRuleArea() and findRoutingInRuleArea() to use
the zone's UUID instead of its name when constructing enclosedByArea()
expressions.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21184

(cherry picked from commit 37d8f151ff)
2026-02-05 23:01:37 -08:00
Seth Hillbrand c85e130ea5 Prevent lockup when tuning differential pair length
Fix freezes caused excessive branching.  Replaced the recursive
branching tracking with iterative joint mapping and a timeout fail-safe.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22041

(cherry picked from commit bc37f184bb)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 737e6de4c5 Fix missing colors when exporting STEP model
The TDocStd_XLinkTool::Copy function copies shape labels between XDE
documents but doesn't properly transfer color associations which are
stored separately in the ColorTool section. This caused component
models to lose their color information when exported to STEP.

Added transferColors() function to explicitly transfer color information
from source to destination document by recursively transferring colors
to all elements in destination shape

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21865

(cherry picked from commit 1bda2a4b40)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 4a37d391c0 Don't change directory when importing settings
Working directory nukes the current project, so don't modify it when
importing settings from another

Fixes https://gitlab.com/kicad/code/kicad/-/issues/16151

(cherry picked from commit bc0484d8bc)
2026-02-05 23:01:37 -08:00
Seth Hillbrand f6318ad852 Clear hidden file attribute on Windows before saving
On Windows, files with the hidden attribute cannot be overwritten using
standard file I/O operations. This can cause save failures when files
have been synced via cloud services like OneDrive, which may set the
hidden attribute on files.

This commit extends KIPLATFORM::IO::MakeWriteable() to also clear the
hidden attribute on Windows, and adds calls to this function before
saving schematic and board files.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/14956

(cherry picked from commit d2013cba95)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 30b0f2a368 Fix DXF import corruption with large coordinates
The overflow check for auto-offsetting imported graphics did not account
for the IU conversion factor, causing DXF files with coordinates around
2300mm to exhibit visual glitches. The check compared mm values directly
against INT32_MAX, but after IU conversion (multiply by 1e6 for PCB),
these values exceed the integer limit.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/9681

(cherry picked from commit 00565e0f14)
2026-02-05 23:01:37 -08:00
Seth Hillbrand c2d551036f Fix table comparison in operator< causing file churn
Copy pasta in SCH_TABLE::operator< had compared GetPosition().x
and GetPosition().y against themselves instead of against other's position.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22559

(cherry picked from commit 0188edb155)
2026-02-05 23:01:37 -08:00
Seth Hillbrand a0457b2e0f Fix multi-channel tool swapping identical parallel components
When copying layouts between rule areas, identical parallel components
(e.g., multiple capacitors in parallel) would get their positions mixed
up randomly. This happened because the sorting functions used for
component matching did not provide deterministic ordering for
topologically identical components.

The fix adds reference designator as a secondary sort key in both
sortByPinCount() and findMatchingComponents(), ensuring that identical
parallel components are always matched in a consistent order based on
their reference designators.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22293

(cherry picked from commit 348bbad7be)
2026-02-05 23:01:37 -08:00
Seth Hillbrand d13d88bcb3 Fix memory leak in Python pcbnew.FootprintLoad()
PCB_IO_MGR::FindPlugin() returns a new PCB_IO* that the caller owns. The
Python wrapper functions (FootprintLoad, FootprintSave, etc.) in
footprint.i call GetPluginForPath which calls FindPlugin, but the
returned plugin object was never deleted because SWIG didn't know
Python owned it.

The %newobject directive tells SWIG that Python owns the returned
PCB_IO* and should delete it when the Python object is garbage
collected.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22526

(cherry picked from commit 0f0fbc55d7)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 3352623b2a Fix component classes not being cleared during Update PCB from Schematic
Two things were happening here

1. The FOOTPRINT copy constructor and assignment operators did not copy
the static component class from the source footprint. So when the undo
system created copies of footprints, the component class information was lost.

2. When only the component class changed (no other footprint parameters), the
change was not recorded in the commit and could be lost.

This change adds the component class info to the copy operation, tracks
it in COMMIT and updates footprins without component classes to 'none'

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21101

(cherry picked from commit 127a85f753)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 6ee10db849 Fix STEP export for models with non-self-contained XDE data
Some STEP files exported from CAD tools like Fusion 360 with linked
components contain internal references that violate OpenCASCADE's
"self-contained" requirement for TDocStd_XLinkTool::Copy. This caused
the error "TDocStd_XLinkTool::Copy : not self-contained" and prevented
the 3D model from being included in the exported STEP file.

The fix checks if the source label is self-contained using
TDF_Tool::IsSelfContained before attempting the copy. If not
self-contained, it falls back to extracting just the geometric shape
directly and adds it to the destination document. This loses some
XDE metadata like colors and names, but allows the model to be
successfully transferred rather than failing entirely.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22417

(cherry picked from commit 1948da99a2)
2026-02-05 23:01:37 -08:00
Seth Hillbrand 96820f8ac1 Add virtual fields to CLI BOM export data model
The CLI BOM export handler should add Mandatory fields
and virtual fields

This adds the generated field columns to match the GUI behavior, allowing
users to include ${QUANTITY} and ${ITEM_NUMBER} in CLI BOM exports.

Also adds test coverage for BOM export with virtual fields.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22613

(cherry picked from commit 3659475455)
2026-02-05 23:01:37 -08:00
Seth Hillbrand c5dca7310d Prevent crash when updating to lower pin count
When iterating, we need to check if our index is valid for both new and
old symbols

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22566

(cherry picked from commit 465207df4a)
2026-02-05 23:01:36 -08:00
Seth Hillbrand db0be852c4 Don't trip on bus syntax
Instead of relying on regex, do a bus expansion to determine coloration
and membership

Fixes https://gitlab.com/kicad/code/kicad/-/issues/16915

(cherry picked from commit 8178a6d338)
2026-02-05 23:01:36 -08:00
Seth Hillbrand 25804bb945 Don't clear references unconditionally
If we are clearing all references in the schematic, then we can clear
our references, otherwise, just eliminate the ones for the proper
sheets.   We don't want to clear the references on Sheet A when we copy
and paste it to Sheet B.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20173

(cherry picked from commit 8d37b3787d)
2026-02-05 23:01:36 -08:00
Seth Hillbrand a6ebb8a162 Have tabs skip over hidden/disabled controls
Set an explicit tab order in the find/replace dialog

Fixes https://gitlab.com/kicad/code/kicad/-/issues/18073

(cherry picked from commit 390a1da1ee)
2026-02-05 23:01:36 -08:00
Seth Hillbrand 84839b47a4 Handle bus member rename deterministically
Look to see if, in the same bus, the bus member was renamed.  if so,
take the new name unless one of two things:
1) If the current name already matches a different bus member
2) If a different bus updated the neighbor (this preserves the bus name)

Fixes https://gitlab.com/kicad/code/kicad/-/issues/18299

(cherry picked from commit 511d213462)
2026-02-05 23:01:36 -08:00
Seth Hillbrand 1602da41a4 Ensure wires stay connected to sheet pins
Pass screen into sheet_point_edit_behavior so that we can catch
connected wires when resizing

Fixes https://gitlab.com/kicad/code/kicad/-/issues/17724

(cherry picked from commit 9c4999f229)
2026-02-05 23:01:36 -08:00
Seth Hillbrand 187cc84b55 Assign netclasses after resolution in Altium import
We are correctly importing netclasses in the Altium import but we need
to fully resolve them in order for them to show up without
saving/reopening

Also found a crash when importing invalid pads that didn't need to be
there.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/15584

(cherry picked from commit ed993ae35d)
2026-02-05 23:01:36 -08:00
Seth Hillbrand 548bc438b4 Change Remove Version Control to Disable
We don't need destructive operations in KiCad.  We can just disable the
git integration on a per-project basis for people

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22134

(cherry picked from commit 09413b0fc6)
2026-02-05 23:01:36 -08:00
Seth Hillbrand f1ba9f70ac Propogate drivers back
If a higher priority driver renames the bus member, be sure to inform
the rest of the bus

Fixes https://gitlab.com/kicad/code/kicad/-/issues/18119

(cherry picked from commit f873d672c1)
2026-02-05 23:01:36 -08:00
Seth Hillbrand 0ac783aa7e Normalize pad to unflipped orientation
Should keep the pad orientation consistent for output

Fixes https://gitlab.com/kicad/code/kicad/-/issues/19703

(cherry picked from commit 709b577026)
2026-02-05 23:01:36 -08:00
Seth Hillbrand 983e8c0058 Correct PNS diff pair collision order
After shapes are modified, we want to perform the collision check on the
modified lines (pLine/nLine) not the previous geometry.  We also need to
set the heads to the shape in order to commit the shoved geometry in
FixRoute()

Fixes https://gitlab.com/kicad/code/kicad/-/issues/10825

(cherry picked from commit 1c59cc29ff)
2026-02-05 23:01:36 -08:00
Seth Hillbrand f653c6cfad Ensure shared sheet units are updated
When updating the unit of the next symbol to be placed, we need to
update all instances of the symbol unit

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22052

(cherry picked from commit 1b4cdfcbac)
2026-02-05 23:01:36 -08:00
Seth Hillbrand a4d7dc9775 Ensure unique ODB++ component names
Use the known entity map to check for _1, _2, etc before renaming.  Adds
logging for each change

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21701

(cherry picked from commit e6cb818818)
2026-02-05 23:01:36 -08:00
Seth Hillbrand 97a826b5f5 Restore Freeze/Thaw pattern
While wxWindowUpdateLocker is supposed to do the same thing, it appears
less effective

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22434

(cherry picked from commit 635550b31e)
2026-02-05 23:01:36 -08:00
Seth Hillbrand 4ccaf7051d Sort bus neighbors
When choosing the shorted net name, ensure that we are alphabetically
sorted for vectors to keep a consistent name

Fixes https://gitlab.com/kicad/code/kicad/-/issues/18606

(cherry picked from commit ba54c640ab)
2026-02-05 23:01:36 -08:00
Seth Hillbrand 08e6d7f292 Don't break out nested buses for implicit connection
Only break out nets

Fixes https://gitlab.com/kicad/code/kicad/-/issues/17771

(cherry picked from commit 61e85f3b25)
2026-02-05 23:01:36 -08:00
Seth Hillbrand 02709d7026 Performance improvements in Creepage
Caching and pre-filtering parents avoids some of the worst O(n^2) loops.
Adds a basic test to check for minimum performance and scaling.  We'll
have to see if our test machine handles it

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21482

(cherry picked from commit a3eb311c48)
2026-02-05 23:01:36 -08:00
Seth Hillbrand 2912419b41 Persist utf8 strings
It is possible that the utf8 strings expire before the API call handles
them.  Also possible that the size is incorrect when not using length()
on the proper string.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20231

(cherry picked from commit 0f87d6eead)
2026-02-05 23:01:36 -08:00
Seth Hillbrand a4097884b5 Fix vector bus parsing
Avoid the nesting braces when embedding a bracket vector

Fixes https://gitlab.com/kicad/code/kicad/-/issues/9031

(cherry picked from commit 2e8e4f91e4)
2026-02-05 23:01:36 -08:00
Seth Hillbrand 86fe87fd61 Fix crash when changing invalid model
Check for empty models and clear pointers when changing

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22437

(cherry picked from commit 1df7cb1bd7)
2026-02-05 23:01:36 -08:00
Seth Hillbrand 04ea0796d0 Handle git cancellation when closing
Tidies up a few places where we need to hold the mutex and early exit
from loops if we are quitting

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21849

(cherry picked from commit fd2ddf60b7)
2026-02-05 23:01:36 -08:00
Seth Hillbrand 19a9cac436 Prevent holding dangling pointers when rebuilding
Changing properties consecutively can rebuild the grid, leading to
dangling pointers.  Storing references by name keeps the current pointer
accurate

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22262

(cherry picked from commit 458db88648)
2026-02-05 23:01:36 -08:00
Seth Hillbrand 0b88e2a9ab Do not clear netclasses when appending
Appending should not replace all content, it should add to the existing
content, so don't remove data before loading the board to append

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22089

(cherry picked from commit acab87cadc)
2026-02-05 23:01:36 -08:00
Seth Hillbrand 0fc6e20508 Attempt to fix ordering issue when quitting
In some cases (mostly mac but not just), we can get to the dtor for
thread pool after the CV has already been destroyed.  This prevents that
from being possible and hopefully fixes the crash

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22583

(cherry picked from commit 1b4a840820)
2026-02-05 23:01:36 -08:00
Seth Hillbrand c17dbbdc7b Import default Eagle netclass clearances
Eagle picks largest clearance of netclass and zone.  However, Eagle also
allows netclass-netclass definitions.  KiCad only has a single netclass
clearance option.  Since custom rules override the zone clearance, we
can get a situation where the KiCad clearance is different that the
Eagle clearance.

This fixes the common use case where Eagle netclass to 'default'
clearance is set.  This can be represented by KiCad.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21283

(cherry picked from commit 22ba1451d6)
2026-02-05 23:01:36 -08:00
Seth Hillbrand dd221d4c85 Don't remove locked segments
When removing redundant tracks, check to see if the segment is locked
before removing it.  If it is, skip the locked track(s)

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22387

(cherry picked from commit f745f61d06)
2026-02-05 23:01:36 -08:00
Seth Hillbrand 3c1a7701d0 Fit sheet on cross-probe
If we are not zooming to fit the selection on cross-probe, when we
change sheets, just show the whole sheet but maintain the sheet size for
the new display

Fixes https://gitlab.com/kicad/code/kicad/-/issues/19515

(cherry picked from commit 1eab09147a)
2026-02-05 23:01:35 -08:00
Seth Hillbrand 016dc47ec2 Don't copy embedded files for temp objects
Just takes a long time and we throw it away a ms later

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22547

(cherry picked from commit d94d2c9a05)
2026-02-05 23:01:35 -08:00
Seth Hillbrand f3079700dd Import footprints even without graphics
Fixes https://gitlab.com/kicad/code/kicad/-/issues/7792

(cherry picked from commit 1fd163d09f)
2026-02-05 23:01:35 -08:00
Alex Shvartzkop d53f791e04 Update translations 2026-02-05 23:40:09 +03:00
Pferd O. 8d3b089c17 Translated using Weblate (German)
Currently translated at 99.9% (10113 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-05 21:39:12 +01:00
Frank Sonnenberg bd2c8f828f Translated using Weblate (German)
Currently translated at 99.9% (10113 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-05 21:39:12 +01:00
Temuri Doghonadze f1450ca6e9 Translated using Weblate (Georgian)
Currently translated at 33.0% (3339 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2026-02-05 21:39:12 +01:00
EdizonTN 1d12392bef Translated using Weblate (Slovak)
Currently translated at 57.3% (5802 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-05 21:39:12 +01:00
Ivan Chuba e8330f9cff Translated using Weblate (Ukrainian)
Currently translated at 100.0% (10114 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/uk/
2026-02-05 21:39:11 +01:00
Frank Sonnenberg 9b4e015b51 Translated using Weblate (German)
Currently translated at 99.9% (10113 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-05 21:39:11 +01:00
EdizonTN 2cc5a88d0b Translated using Weblate (Slovak)
Currently translated at 56.8% (5749 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-05 21:39:11 +01:00
ZbeeGin 8ac2628c12 Translated using Weblate (Polish)
Currently translated at 99.8% (10101 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-02-05 21:39:11 +01:00
Alex Gellen fb83a926c1 Translated using Weblate (Romanian)
Currently translated at 28.7% (2909 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2026-02-05 21:39:11 +01:00
2tama3 370934e219 Translated using Weblate (Japanese)
Currently translated at 100.0% (10114 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-02-05 21:39:11 +01:00
EdizonTN 57c02b2df3 Translated using Weblate (Slovak)
Currently translated at 56.6% (5725 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-05 21:39:11 +01:00
Ivan Chuba 9fc399fc8f Translated using Weblate (Ukrainian)
Currently translated at 99.9% (10112 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/uk/
2026-02-05 21:39:10 +01:00
Pferd O. 42d5d6dc42 Translated using Weblate (German)
Currently translated at 99.9% (10113 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-05 21:39:10 +01:00
ZbeeGin 910222c052 Translated using Weblate (Polish)
Currently translated at 99.8% (10099 of 10114 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-02-05 21:39:10 +01:00
Seth Hillbrand 49f6154ce3 Trim unused OCCT libraries from FindOCC
Remove 15 libraries from OCC_LIBS_COMMON that KiCad never
links against: persistence format libs (TKBin*, TKXml*,
TKTObj), unused modeling algorithms (TKFeat, TKFillet,
TKOffset, TKXMesh), and OCCT viewer internals (TKMeshVS,
TKOpenGl). This reduces the common set from 35 to 22.

In loadmodel.cpp, drop the unused AIS_Shape.hxx include and
add an explicit Quantity_ColorRGBA.hxx include that was
previously pulled in transitively through AIS_Shape.

Add /usr/opencascade to the Unix library search hints.
2026-02-04 12:42:49 -08:00
Jon Evans a366808478 Fix IPC API not permitting operations when a single polygon is selected 2026-02-04 09:37:39 -05:00
Jon Evans 07778ad10f Prevent crash when corrupt files leave pins without parents 2026-02-03 15:14:58 -05:00
Jeff Young f00d6dd194 Back out 507ec29cc0.
Apply a more localized fix which doesn't mess up
text positioning.

Also move it to shared code so that it can't get out
of sync with plotting again.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22921

(cherry picked from commit 0f33d13c1c)
2026-02-03 16:12:14 +00:00
Alex Shvartzkop b04c8bb905 Update translations 2026-02-02 18:27:25 +03:00
EdizonTN 32a5cfda8b Translated using Weblate (Slovak)
Currently translated at 56.3% (5697 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-02 16:25:37 +01:00
Alex Gellen 41fd0e41e2 Translated using Weblate (Romanian)
Currently translated at 28.0% (2832 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2026-02-02 16:25:37 +01:00
Marco Ciampa 620fdb46af Translated using Weblate (Italian)
Currently translated at 99.3% (10048 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2026-02-02 16:25:37 +01:00
Temuri Doghonadze 95e881b7ea Translated using Weblate (Georgian)
Currently translated at 33.0% (3337 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2026-02-02 16:25:36 +01:00
EdizonTN c928a06b99 Translated using Weblate (Slovak)
Currently translated at 55.2% (5585 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-02 16:25:36 +01:00
Pferd O. 2de16c4b52 Translated using Weblate (German)
Currently translated at 100.0% (10110 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-02 16:25:36 +01:00
Frank Sonnenberg fdedf2f067 Translated using Weblate (German)
Currently translated at 100.0% (10110 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-02 16:25:36 +01:00
EdizonTN 2bd4ebacbf Translated using Weblate (Slovak)
Currently translated at 55.2% (5581 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sk/
2026-02-02 16:25:36 +01:00
Frank Sonnenberg 0226769d67 Translated using Weblate (German)
Currently translated at 100.0% (10110 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-02 16:25:36 +01:00
Temuri Doghonadze 010aadf4cf Translated using Weblate (Georgian)
Currently translated at 33.0% (3337 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2026-02-02 16:25:36 +01:00
Temuri Doghonadze 30ed02d3a9 Translated using Weblate (Georgian)
Currently translated at 32.8% (3324 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2026-02-02 16:25:36 +01:00
Temuri Doghonadze c3f0e459dc Translated using Weblate (Georgian)
Currently translated at 32.8% (3321 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2026-02-02 16:25:35 +01:00
CloverGit a85548f825 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (10094 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2026-02-02 16:25:35 +01:00
ZbeeGin 8251915da5 Translated using Weblate (Polish)
Currently translated at 99.8% (10098 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-02-02 16:25:35 +01:00
Alex Gellen df219063e1 Translated using Weblate (Romanian)
Currently translated at 27.4% (2776 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2026-02-02 16:25:35 +01:00
Marco Ciampa a4b0b8cd51 Translated using Weblate (Italian)
Currently translated at 99.3% (10046 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2026-02-02 16:25:35 +01:00
2tama3 e2a8c8ca74 Translated using Weblate (Japanese)
Currently translated at 100.0% (10110 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-02-02 16:25:35 +01:00
Marco Ciampa 4d87de2b78 Translated using Weblate (Italian)
Currently translated at 99.3% (10046 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2026-02-02 16:25:35 +01:00
Alex Gellen 6fa6168118 Translated using Weblate (Romanian)
Currently translated at 25.6% (2593 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2026-02-02 16:25:35 +01:00
2tama3 1cf8f00a3f Translated using Weblate (Japanese)
Currently translated at 100.0% (10110 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-02-02 16:25:35 +01:00
Pferd O. cf879fd811 Translated using Weblate (German)
Currently translated at 100.0% (10110 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-02 16:25:34 +01:00
ZbeeGin b40a3bd81c Translated using Weblate (Polish)
Currently translated at 99.8% (10097 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-02-02 16:25:34 +01:00
ZbeeGin b046e658eb Translated using Weblate (Polish)
Currently translated at 99.8% (10097 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2026-02-02 16:25:34 +01:00
2tama3 6d37e7fa2e Translated using Weblate (Japanese)
Currently translated at 100.0% (10110 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-02-02 16:25:34 +01:00
Ivan Chuba 60fe60440f Translated using Weblate (Ukrainian)
Currently translated at 100.0% (10110 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/uk/
2026-02-02 16:25:34 +01:00
CloverGit 5596b46d61 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (10094 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2026-02-02 16:25:34 +01:00
Pferd O. 3cfdd05a51 Translated using Weblate (German)
Currently translated at 100.0% (10110 of 10110 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2026-02-02 16:25:34 +01:00
jean-pierre charras 0a789e1cbc Eeschema: netlist Allegro export: do not quote value string twice.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22868

(cherry picked from commit a26c25b7e5)
2026-02-02 16:22:12 +01:00
Mike Williams cb30093045 drc: remove stale markers from cache
Fixes: https://gitlab.com/kicad/code/kicad/-/issues/22888
Fixes: https://gitlab.com/kicad/code/kicad/-/issues/22901
2026-02-02 10:03:36 -05:00
Seth Hillbrand c5a32bd4d2 Fix PCB generator layer reporting
The tuning pattern generator now returns the layer of its
contained tracks instead of the base layer. During parsing,
generators set their layer to match contained tracks so the
layer is preserved when loading files.

(cherry picked from commit 7f92e60d22)
2026-01-30 11:03:40 -08:00
jean-pierre charras 169e0d7f3e Eeschema: netlist Allegro export: fix missing items in $PACKAGES section.
(cherry picked from commit 80e2443ed3)
2026-01-28 16:57:53 +01:00
jean-pierre charras 0342375cdf French translation update 2026-01-28 16:51:17 +01:00
Seth Hillbrand 44f34e1f82 Make MSVC happy 2026-01-26 18:24:16 -08:00
Seth Hillbrand 9deec754cd Fix crash when running ERC twice with rule areas
When a schematic item is deleted or moved, it must remove itself from
any SCH_RULE_AREA that contains it. Previously, the rule area kept
dangling pointers to deleted items in its m_items and m_prev_items
sets. On subsequent ERC runs, iterating these sets and calling methods
on freed memory caused a crash.

Added SCH_RULE_AREA::RemoveItem() and call it from SCH_ITEM destructor
to clean up the bidirectional references.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22854
2026-01-26 16:15:44 -08:00
Seth Hillbrand 33f2886c24 Fix MSVC build 2026-01-23 22:03:14 -08:00
Seth Hillbrand 0b21f33a3a Fix some determinism in saving
Teardrops don't get their own unique UUID saved in the file, so they can
end up being sorted differently on save.  Instead, we assign a synthetic
UUID to the teardrop based on its two connecting elements' UUIDs.

This also fixes the comparison function so that we don't end up mixing
around caches

(cherry picked from commit a48d8c0233)
2026-01-23 13:57:32 -08:00
Seth Hillbrand 3b1d9e4c4a Router: Fix shove not honoring item-to-item custom design rules
When tracks have location-dependent clearances defined by custom rules
(insideCourtyard, intersectsArea conditions), the shove algorithm would
lock track endpoints during drag operations. This prevented tracks from
being reshoved when they moved from one clearance zone to another,
resulting in unresolvable DRC violations.

Add SHP_DONT_LOCK_ENDPOINTS policy flag to prevent endpoint locking
during drag operations. This allows the entire line to be reshoved when
clearance requirements change as segments move between different
clearance zones.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/18550

(cherry picked from commit 1907580b82)
2026-01-23 12:39:57 -08:00
Seth Hillbrand c13b4e9757 Ensure aperture mask DRC hits all tracks
First, we need to ensure that when DRC says it will report errors for
all track segments that this includes the aperature errors.  Second, max
clearance needs to include aperature clearance.  If you set that higher
than your standard clearance, the RTree might not catch elements that
don't have their own aperture clearance (like teardrops that inherit
from pads)
2026-01-23 12:03:55 -08:00
Seth Hillbrand 0d2f50e38d Ensure 3d model plugins respect the flags
KICAD_RUN_FROM_BUILD_DIR should prevent ABI-incompatible plugins from
being loaded
2026-01-23 10:49:09 -08:00
Seth Hillbrand d12e9f2046 Add missing sanity check for diff pair
We did this to single tracks back in a07c4921a8 but forgot diff pairs

(cherry picked from commit e723734038)
2026-01-20 10:11:45 -08:00
Seth Hillbrand 3ba9119137 Sanity checks in design settings
(cherry picked from commit a07c4921a8)
2026-01-20 10:09:37 -08:00
Seth Hillbrand 3ade986e8d Altium Importer: Fix library cache assertion and improve root sheet handling
Fixed assertion failure in ensureLoadedLibrary() where m_timestamps and
m_libCache could become out of sync if an exception was thrown during
library parsing. Both maps are now properly cleaned up on error.

When importing Altium projects with a single top-level sheet, that sheet
now becomes the root instead of creating an unnecessary dummy root. Projects
with multiple top-level sheets continue to use a dummy root container as before.

This simplifies the schematic hierarchy for single-sheet projects and makes
them more consistent with how KiCad normally structures schematics.
2026-01-19 14:24:03 -08:00
Seth Hillbrand 8357261519 Altium Schematic Import: Fix duplicate sheet creation in hierarchical projects
When importing Altium projects, sheets were sometimes imported as both top-level
sheets and hierarchical subsheets. This happened because the project file lists
sheets in arbitrary order. If a parent sheet was processed before its children,
the children would be loaded as subsheets during hierarchy descent. Later, when
those same files appeared in the project file, duplicate sheets were created.

The importer now checks whether a file has already been loaded as a subsheet
before creating a new top-level sheet entry. The check includes a case-insensitive
fallback search since Altium uses inconsistent casing in its .SchDoc extension.

Sheet filenames were also being set to the original Altium paths instead of
KiCad project-relative paths. This caused path mismatches in the hierarchy
search and left references to non-existent Altium paths in the saved schematic.
Filenames now use the KiCad project directory with the .kicad_sch extension.

Hierarchical labels on top-level sheets are converted to global labels during
import since top-level sheets have no parent sheet to connect them to.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21909

(cherry picked from commit f00dc1befd)
2026-01-19 14:04:21 -08:00
Jeff Young 9e0d6091f5 Honour overwrite flag.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22665

(cherry picked from commit 02b49d2f3b)
2026-01-19 14:26:10 +00:00
Jeff Young a1c0892a96 Formatting.
(cherry picked from commit bd06f734a2)
2026-01-19 14:23:29 +00:00
Wayne Stambaugh a6c3d7900c Do not clip progress dialog message.
The progress dialog is initialized with an empty message string.  This
causes all subsequent message to be nearly completely clipped because the
initial dialog layout is done with the empty string.

This is fixed by laying out the dialog in the derived object dtor.
2026-01-18 07:53:50 -05:00
Sven Pauli 37a073698c Fix memory leak in PNS/tuning tool.
(cherry picked from commit 61d893694c)
2026-01-18 07:53:50 -05:00
Jeff Young cef1f69200 Allow cancel from Route Selected operations.
ADDED: a new "Cancel Current Item" to move to the next
item.  "Cancel" goes back to cancelling the entire op.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22729

(cherry picked from commit 62c8ee9793)
2026-01-18 12:27:43 +00:00
Jeff Young f30931733f Uninitialized variable safety.
(cherry picked from commit 83b4f19844)
2026-01-18 12:27:43 +00:00
Alex Shvartzkop 9b61821505 router: improve shove when dragging track ends in some cases
Try both cw and ccw direction and pick the shortest in shoveLineToHullSet

See https://gitlab.com/kicad/code/kicad/-/issues/22749
2026-01-17 18:52:03 +03:00
Alex Shvartzkop 52788676f7 Update translations 2026-01-16 18:17:29 +03:00
CloverGit 2ff7504587 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.9% (10093 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2026-01-16 15:10:32 +01:00
CloverGit e097f43600 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.9% (10093 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2026-01-16 15:10:32 +01:00
Ivan Chuba 2b7859de10 Translated using Weblate (Estonian)
Currently translated at 3.7% (375 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/et/
2026-01-16 15:10:32 +01:00
Sárkány Lőrinc 77ad45eb28 Translated using Weblate (Hungarian)
Currently translated at 53.2% (5380 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-01-16 15:10:32 +01:00
CloverGit 99c0fcdb45 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (10090 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2026-01-16 15:10:32 +01:00
Sárkány Lőrinc 1bef7decc6 Translated using Weblate (Hungarian)
Currently translated at 53.1% (5368 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-01-16 15:10:32 +01:00
Sárkány Lőrinc bab3d326fe Translated using Weblate (Hungarian)
Currently translated at 53.1% (5366 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-01-16 15:10:31 +01:00
Sárkány Lőrinc d3ea4fba4d Translated using Weblate (Hungarian)
Currently translated at 52.6% (5324 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-01-16 15:10:31 +01:00
2tama3 d1b69f4e64 Translated using Weblate (Japanese)
Currently translated at 100.0% (10103 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-01-16 15:10:31 +01:00
Herman van der Vaart 2d3d71cef9 Translated using Weblate (Dutch)
Currently translated at 90.3% (9124 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/nl/
2026-01-16 15:10:31 +01:00
Sárkány Lőrinc a4bcba25f5 Translated using Weblate (Hungarian)
Currently translated at 52.3% (5293 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-01-16 15:10:31 +01:00
Marco Ciampa 7ad3e8b4c3 Translated using Weblate (Italian)
Currently translated at 99.4% (10044 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2026-01-16 15:10:31 +01:00
Sárkány Lőrinc 3f1020fe52 Translated using Weblate (Hungarian)
Currently translated at 52.0% (5259 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-01-16 15:10:31 +01:00
Alex Shvartzkop 0dc3ad45cd router: fix getting stuck when routing right next to other tracks in Walkaround mode.
The walkround algorithm fails if the path points are inside the padded hull,
so remove the extra hull clearance padding.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20117
Fixes https://gitlab.com/kicad/code/kicad/-/issues/21813
2026-01-16 16:29:00 +03:00
Seth Hillbrand 16bde88f7d Fix crash in table manipulation
When undoing an align operation on cells, we had no columns (cells
only), so we ended up with a divide by zero

We shouldn't be aligning cells outside of a table, so this disables the
action and provides a guardrail for the divide by zero

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22704
2026-01-14 14:03:36 -08:00
Jeff Young 8a840b28f5 Use the correct preferences.
The fooptrint viewer has its own WIDNOW_SETTINGS.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22709

(cherry picked from commit d40dced428)
2026-01-14 15:22:41 +00:00
Jeff Young e5cf42882e Fix Interactive Offset Tool.
The final offset is supposed to be typed into
the dialog.  What comes up in the dialog to
start is the NOP offset.

This also means the on-canvaw hint arrow needs
to point the other way.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22692

(cherry picked from commit faa0875d3a)
2026-01-14 15:17:05 +00:00
Alex Shvartzkop ddac9c500b Support WRL substitutions in STEP export when using embedded models. 2026-01-13 15:07:19 +05:00
Wayne Stambaugh d3e05c9147 Prevent assertion when setting status bar progress indicator above range.
(cherry picked from commit 008abdb187)
2026-01-12 15:26:40 -05:00
Alex Shvartzkop de10e02759 Embed STEP models along with WRL(VRML) in "Collect And Embed 3D Models".
STEP models are needed for STEP export, but the KiCad libraries specify .wrl models.
2026-01-13 00:59:48 +05:00
Alex Shvartzkop 6cfe5df7c0 Fix crash when CallAfter is called while destructing thread pool on exit.
PROJECT_TREE_PANE is already destructed at that point.
2026-01-13 00:56:54 +05:00
Alex Shvartzkop 6c7ace5eba Support VRML(WRL) mesh data for STL/PLY export.
master commit: afd2405230
2026-01-13 00:28:50 +05:00
Alex Shvartzkop 0fdbc5ea48 Add "Collect And Embed 3D Models" to Tools menu. 2026-01-12 15:17:41 +05:00
Seth Hillbrand 20b7d49c81 ADDED: Action to embed all 3d models referenced
Moves through the footprints and replaces external references with
internal embedded files

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20847
2026-01-12 15:17:41 +05:00
Seth Hillbrand f6fb40f110 Cache netclass clearances
Importing Altium boards can generate hundreds of netclasses.  Our O(N)
search was choking on the overload
2026-01-09 16:22:03 -08:00
Seth Hillbrand 9455c86a5e Fix broken cherry-pick 2026-01-09 13:47:20 -08:00
Mark Roszko bb02206e8d Update pad layers on footprint swap dialog, centralize that function from the pcb parser
(cherry picked from commit d6bea496f4)
2026-01-08 12:24:15 -08:00
Seth Hillbrand 0b9ff5e2bc Pre-initialize the OwnClearance cache
Thread this so that massive boards can set up their cache quickly
2026-01-07 17:53:10 -08:00
Seth Hillbrand 13c4922270 Add clearance cache to improve clearance outline rendering performance
When displaying pad and track clearance outlines, GetOwnClearance()
was called repeatedly during rendering, re-evaluating DRC rules on
every paint refresh. With complex DRC rules, this caused significant
slowdown.

Add a lazy-evaluated cache in DRC_ENGINE keyed by (UUID, layer) that
stores clearance values. The cache is invalidated when DRC rules
change (in InitEngine) or properties change that could affect clearance
(net, layer, pad type)
2026-01-07 17:10:15 -08:00
dsa-t 23c5e101b7 Use LIB_TREE_RENDERER GTK workaround from wx 3.2.7
See https://github.com/wxWidgets/wxWidgets/issues/24227


(cherry picked from commit ac281c79d2)

Co-authored-by: Alex Shvartzkop <dudesuchamazing@gmail.com>
2026-01-05 11:28:12 +03:00
jean-pierre charras 004f91bf05 DIALOG_LINE_PROPERTIES: do not commit a change for lines during creation.
When creating lines, one can edit them. But a commit must not be created, because
it is useless (no previous item) and it can create dangling pointers if the line
creation is aborted.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22642

(cherry picked from commit 0ac47819f1)
2026-01-04 18:35:20 +01:00
jean-pierre charras 26a300688e Fix link issue on mingw/msys2. (imported from master branch)
Previously fixed in master branch
2026-01-04 18:34:49 +01:00
Seth Hillbrand 1a03a9a244 Handle invalid SPICE library files gracefully
When a binary file (like an OrCAD .olb) is selected instead of a valid SPICE library,
catch the std::out_of_range exception to prevent crashes and report an error.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22189

(cherry picked from commit fe2fe400fd)
2026-01-04 08:25:26 -08:00
Wayne Stambaugh 0299edac4d Properly lay out info bar buttons.
For some reason This fix does not work in the 9.0 branch.  It is being
cherry picked to keep it in sync with the master branch.

(cherry picked from commit 4eb1c8d66e)
2026-01-04 10:54:32 -05:00
Seth Hillbrand d2cd5ecdd1 Don't clear references unconditionally
If we are clearing all references in the schematic, then we can clear
our references, otherwise, just eliminate the ones for the proper
sheets.   We don't want to clear the references on Sheet A when we copy
and paste it to Sheet B.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20173

(cherry picked from commit 8d37b3787d)
2026-01-02 17:15:12 -08:00
Seth Hillbrand cd8ecbcc6d Ensure derived symbols can also hold embedded files
Derived symbols should have access to both the embedded files from the
parent as well as their own embedded files.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22356

(cherry picked from commit adc6e8f06a)
2026-01-02 17:15:12 -08:00
Mark Roszko e0ea53ee1f Move code block to updated CompareGeometry, forgot to in previous commit
(cherry picked from commit e64a0d982a)

Co-authored-by: Mark Roszko <mark.roszko@gmail.com>
2026-01-03 00:33:01 +00:00
Mark Roszko 24a139843a Increase DRC parity epsilon to tolerate rounding errors at the nm scale
It seems the last digit on our scale tends to have some error shift depending on order of operations performed on a component. Reproducing the position and orientation for the comparison alone may not generate the same error in the virtual comparison part and we would get false DRC error.

Move the epsilon to the 10nm as that seems to be empirically safe
2026-01-02 11:53:46 -05:00
Jeff Young c0b1254e20 Special-case firing of SelectedItemsModified in FPEditor.
(The footprint itself is never selected, but we still
use this event for the properties manager, etc.)

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22608

(cherry picked from commit 3dd42c0b35)
2026-01-02 12:04:11 +00:00
Jeff Young 44030c622a Give 2-pin SUBCKT's shortened signal names for current.
ngspice only recognises the long format for
items with more than 2 nodes.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21994

(cherry picked from commit b76221958b)
2026-01-02 12:04:11 +00:00
Jeff Young 7e43c6acba Clean up itemsToPlace on ESC.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22358

(cherry picked from commit cad3eac481)
2026-01-02 12:04:11 +00:00
Jeff Young fcc91b1407 Don't rotate around centre when there's a user-defined reference point.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/21843

(cherry picked from commit 78b36796e8)
2026-01-02 12:04:11 +00:00
Jeff Young aa65b4266c More flexible (and correct) version of CopySexprFile(),
Fixes https://gitlab.com/kicad/code/kicad/-/issues/21738

(cherry picked from commit 666e7f5bc5)
2026-01-02 12:04:11 +00:00
Jeff Young 08fd4630e9 Update sheetfiles and instance projects in Save As.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/21738

(cherry picked from commit da1a3a944e)
2026-01-02 12:04:11 +00:00
Mark Roszko f4aa3d663b Fix lib parity drc for polys, add cyclical path match rather than exact point order match 2026-01-01 23:05:58 -05:00
Seth Hillbrand f28cf4e753 Block ERC error for stacked NC pins
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22409

(cherry picked from commit 3cbb0685d1)
2026-01-01 15:36:59 -08:00
Seth Hillbrand 4a53f97e27 Ensure beziers are shown
If we can't find an inflection, draw the straight line

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22459

(cherry picked from commit 8e95894936)
2026-01-01 15:16:03 -08:00
akhilles 84df82f9a7 IPC-2581: Export description to BomItem description attribute
The IPC-2581C spec defines an optional "description" attribute for
BomItem elements. Export the footprint's library description to this
field to provide human-readable component information in the BOM.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22257

(cherry picked from commit 41aeeacaaf)
2026-01-01 15:15:30 -08:00
Seth Hillbrand 9efd12092f Remove redundant ExchangeItem call
This was originally here to solve
https://gitlab.com/kicad/code/kicad/-/issues/17851 However, since then,
we have changed how pins are handled in UpdatePins(), leading to the
exchanged item having dangling pointers.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21995

(cherry picked from commit 3e63d5c5a6)
2026-01-01 14:17:12 -08:00
Seth Hillbrand 9389449246 Avoid printing superfluous bus messages
If we don't have a bus selected, we don't need the bus-relevant data and
the net might be separate

Fixes https://gitlab.com/kicad/code/kicad/-/issues/18350

(cherry picked from commit 430c62d3ca)
2026-01-01 14:15:26 -08:00
Wayne Stambaugh e70208bd48 Begin version 9.0.8 development. 2026-01-01 13:00:08 -05:00
Wayne Stambaugh cc82296118 Tag stable version 9.0.7. 2026-01-01 12:54:29 -05:00
Alex Shvartzkop bce055fa21 Update translations 2026-01-01 20:31:21 +03:00
Sárkány Lőrinc 45471ecfc9 Translated using Weblate (Hungarian)
Currently translated at 51.6% (5219 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-01-01 15:49:57 +01:00
Marco Ciampa ca8633b3db Translated using Weblate (Italian)
Currently translated at 99.4% (10043 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2026-01-01 15:49:57 +01:00
2tama3 fbb70da3c0 Translated using Weblate (Japanese)
Currently translated at 100.0% (10103 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-01-01 15:49:57 +01:00
Marco Ciampa 8f8c937db5 Translated using Weblate (Italian)
Currently translated at 99.3% (10037 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2026-01-01 15:49:56 +01:00
Sárkány Lőrinc b62a67ceba Translated using Weblate (Hungarian)
Currently translated at 51.6% (5217 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-01-01 15:49:56 +01:00
2tama3 c0c25fb1d7 Translated using Weblate (Japanese)
Currently translated at 100.0% (10103 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-01-01 15:49:56 +01:00
Sárkány Lőrinc 2b3d3bc41b Translated using Weblate (Hungarian)
Currently translated at 51.4% (5200 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-01-01 15:49:56 +01:00
Sárkány Lőrinc 60d64c8c1b Translated using Weblate (Hungarian)
Currently translated at 51.3% (5192 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-01-01 15:49:56 +01:00
Sárkány Lőrinc b5a54e8822 Translated using Weblate (Hungarian)
Currently translated at 51.1% (5172 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-01-01 15:49:56 +01:00
Sárkány Lőrinc 962aadb859 Translated using Weblate (Hungarian)
Currently translated at 51.1% (5170 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-01-01 15:49:56 +01:00
Sárkány Lőrinc e2a5b8ee74 Translated using Weblate (Hungarian)
Currently translated at 49.3% (4988 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-01-01 15:49:56 +01:00
2tama3 a3f7e5339b Translated using Weblate (Japanese)
Currently translated at 100.0% (10103 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2026-01-01 15:49:56 +01:00
Henrik Kauhanen c5964c59ce Translated using Weblate (Swedish)
Currently translated at 99.9% (10097 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2026-01-01 15:49:55 +01:00
Sárkány Lőrinc dcff6e0547 Translated using Weblate (Hungarian)
Currently translated at 48.0% (4852 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2026-01-01 15:49:55 +01:00
Wayne Stambaugh 9f6e81e9cc Tag stable version 9.0.7 release candidate 2. 2025-12-23 15:40:18 -05:00
Alex Shvartzkop 17c867e92f Update translations 2025-12-23 05:02:55 +03:00
Sárkány Lőrinc 938dec0d6e Translated using Weblate (Hungarian)
Currently translated at 47.8% (4835 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-12-23 03:02:04 +01:00
CloverGit 0107ac0532 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (10090 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2025-12-23 03:02:04 +01:00
soldado-do-wolfenstein d4910a66dc Translated using Weblate (Portuguese (Brazil))
Currently translated at 97.6% (9867 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pt_BR/
2025-12-23 03:02:04 +01:00
Sárkány Lőrinc 89ebfa63c9 Translated using Weblate (Hungarian)
Currently translated at 47.7% (4825 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-12-23 03:02:04 +01:00
Sárkány Lőrinc 451642fa62 Translated using Weblate (Hungarian)
Currently translated at 46.6% (4713 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-12-23 03:02:04 +01:00
CharlieYu 8f52e2b685 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.9% (10093 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2025-12-23 03:02:03 +01:00
Temuri Doghonadze 3597d76c40 Translated using Weblate (Georgian)
Currently translated at 32.8% (3319 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2025-12-23 03:02:03 +01:00
Sárkány Lőrinc 6c092d78a3 Translated using Weblate (Hungarian)
Currently translated at 45.4% (4594 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-12-23 03:02:03 +01:00
Marco Ciampa 95bbcc40d4 Translated using Weblate (Italian)
Currently translated at 99.3% (10036 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2025-12-23 03:02:03 +01:00
Sárkány Lőrinc 2ebe4cc9e2 Translated using Weblate (Hungarian)
Currently translated at 45.4% (4590 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-12-23 03:02:03 +01:00
Sárkány Lőrinc 2f52c4901a Translated using Weblate (Hungarian)
Currently translated at 45.3% (4579 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-12-23 03:02:03 +01:00
Sárkány Lőrinc 689fb262c5 Translated using Weblate (Hungarian)
Currently translated at 45.2% (4568 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-12-23 03:02:03 +01:00
Sárkány Lőrinc 16b0ec206a Translated using Weblate (Hungarian)
Currently translated at 44.8% (4529 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-12-23 03:02:03 +01:00
Pferd O. 890735dbe1 Translated using Weblate (German)
Currently translated at 100.0% (10103 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2025-12-23 03:02:03 +01:00
Jon Evans 3cfb633ea4 Avoid crash when project tree files disappear
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22568
2025-12-22 15:55:25 -05:00
Alex Shvartzkop 92274f1a5d Fix assert failure when opening simulator frame
Fixes KICAD-XS2
2025-12-20 19:01:08 +03:00
Alex Shvartzkop 7d03b6bb8c Fix assert failures when opening non-ASCII files in gerbview.
Fixes KICAD-KEV
2025-12-20 03:19:28 +03:00
Alex Shvartzkop 9ae5759e24 Specctra DSN: fix assert failures when exporting footprint arcs.
Fixes KICAD-PG4
2025-12-20 02:04:48 +03:00
Alex Shvartzkop 11467a7f4b Specctra DSN export: add last rectangle edge. 2025-12-20 02:04:48 +03:00
Wayne Stambaugh f8f051275f Fix Windows build error. 2025-12-19 16:46:04 -05:00
Wayne Stambaugh a167322440 Do not assume sheet path is valid when getting sheet page number.
Fixes KICAD-C4Q
2025-12-19 15:41:34 -05:00
Jeff Young 2b1747f80f Careful of unspecified start reference.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22552

(cherry picked from commit 1aed1d5f2f)
2025-12-19 13:21:02 +00:00
jean-pierre charras 26b350b51a symbol editor: import SVG: fix incorrect import of degenerated splines
Degenerated splines are in fact segments. So they are imported as 2 points polylines.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22556

(cherry picked from commit 1b17b57be0)
2025-12-19 15:47:06 +03:00
Jeff Young 64821c793f Don't test clearance or shorting for same-net items; only holes.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22532

(cherry picked from commit 57c9866094)
2025-12-16 14:11:10 +00:00
Alex Shvartzkop 50ddfefbbb Fix potential crash when multichannel tool can't find any rule areas.
fbp dialog changes:
- Don't add the first grid row,
- Resize the grid with the dialog window,
- Improve min sizes.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22535
2025-12-16 16:27:56 +03:00
jean-pierre charras 49ee909d68 DIALOG_LABEL_PROPERTIES: ensure multiple placed labels have a unique ID
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22529

(cherry picked from commit e20671ea73)
2025-12-15 10:03:09 +01:00
Wayne Stambaugh 85ebd7c371 Tag stable version 9.0.7 release candidate 1. 2025-12-14 09:30:40 -05:00
jean-pierre charras 12d1f5bdd9 SVG_PLOTTER: fix incorrect bitmaps position is some cases
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22326

Cherry picked by hand.
2025-12-14 14:10:18 +01:00
Alex Shvartzkop 5071295d34 Update translations 2025-12-13 20:08:29 +03:00
CloverGit 5885b364a3 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.7% (10082 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2025-12-13 18:07:50 +01:00
Sárkány Lőrinc 1a04549321 Translated using Weblate (Hungarian)
Currently translated at 44.1% (4464 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-12-13 18:07:50 +01:00
Sárkány Lőrinc b9819bc8ae Translated using Weblate (Hungarian)
Currently translated at 44.1% (4460 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-12-13 18:07:50 +01:00
2tama3 7cd534c614 Translated using Weblate (Japanese)
Currently translated at 100.0% (10103 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2025-12-13 18:07:50 +01:00
Pferd O. f652fbcfcf Translated using Weblate (German)
Currently translated at 99.9% (10098 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2025-12-13 18:07:50 +01:00
Максим Горпиніч 6085182574 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (10103 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/uk/
2025-12-13 18:07:50 +01:00
Henrik Kauhanen 3aa22cd4e4 Translated using Weblate (Swedish)
Currently translated at 99.9% (10095 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2025-12-13 18:07:49 +01:00
Marco Ciampa 7e33fc18d3 Translated using Weblate (Italian)
Currently translated at 99.3% (10034 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2025-12-13 18:07:49 +01:00
dsa-t 0503b22617 Translated using Weblate (Russian)
Currently translated at 100.0% (10103 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ru/
2025-12-13 18:07:49 +01:00
2tama3 e2562aae5d Translated using Weblate (Japanese)
Currently translated at 100.0% (10103 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2025-12-13 18:07:49 +01:00
Henrik Kauhanen b1b28786af Translated using Weblate (Swedish)
Currently translated at 99.9% (10094 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2025-12-13 18:07:49 +01:00
Sárkány Lőrinc 355afb9845 Translated using Weblate (Hungarian)
Currently translated at 44.1% (4459 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-12-13 18:07:49 +01:00
Vic 14d2ebc607 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 98.1% (9913 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2025-12-13 18:07:49 +01:00
Максим Горпиніч c48ace68a0 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (10103 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/uk/
2025-12-13 18:07:48 +01:00
Ivan Chuba c82caa6dc1 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (10103 of 10103 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/uk/
2025-12-13 18:07:48 +01:00
Alex Shvartzkop 50309f0033 Revert "Lock harfbuzz to 11.2.0 to avoid 11.3.3+ regressions/features."
This reverts commit 481e78a29f.
2025-12-13 02:28:10 +03:00
Alex Shvartzkop a588a63778 Remove hb_ft_font_set_funcs call in outline fonts.
It doesn't appear to do anything useful since we already use the ft vtable,
and calling hb_ft_font_set_funcs breaks x_advance values in harfbuzz 11.3.0+

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22524
2025-12-13 02:27:12 +03:00
Alex Shvartzkop 481e78a29f Lock harfbuzz to 11.2.0 to avoid 11.3.3+ regressions/features.
pos.x_advance is just too small for bold Bahnschrift font when using harfbuzz 11.3.3+

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22524
2025-12-12 22:28:38 +03:00
Alex Shvartzkop 5e4633545b Clear tool manager model to avoid crash when closing PCB editor. 2025-12-12 21:29:15 +03:00
Mark Roszko 447be71b65 Fix new msvc build warnings about enums
(cherry picked from commit 0e46f99fdf)
2025-12-12 21:17:37 +03:00
Mike Williams a54ac23bbb snapping: don't snap to invisible footprint anchors 2025-12-12 07:59:23 -05:00
Mike Williams a017fb265f footprint anchors: only show them for footprints on visible layers 2025-12-12 07:59:23 -05:00
Mike Williams 65e486499e view switcher: default to advance selection
This make ctrl-tab/shift-tab work like other OS and KiCad switcher
paradigms.
2025-12-12 07:59:23 -05:00
Mark Roszko ef2f445b14 Don't EscapeHTML on the netname that is stored internally
(cherry picked from commit 602eeb01e3)

Co-authored-by: Mark Roszko <mark.roszko@gmail.com>
2025-12-12 12:50:28 +00:00
dsa-t 866d92e1f6 Altium PCB import: don't overwrite m_layermap.
m_layermap contains copper layers from stackup info at this point.
We don't want to clear it, especially that most copper layers don't
appear in the layer mapping dialog.


(cherry picked from commit 744406cda0)

Co-authored-by: Alex Shvartzkop <dudesuchamazing@gmail.com>
2025-12-11 21:45:41 +03:00
Seth Hillbrand 3003c0c509 Clear construction manager with grid helper
Construction manager and snap manager keep raw pointers to board items,
so we need to clear them when switching canvases
2025-12-10 08:31:19 -08:00
Alex Shvartzkop 9b3e14546e Update translations 2025-12-10 10:04:59 +03:00
CloverGit 1a3bded55e Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (10083 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2025-12-10 07:59:28 +01:00
Sárkány Lőrinc bf9d6e2689 Translated using Weblate (Hungarian)
Currently translated at 44.1% (4454 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-12-10 07:59:28 +01:00
Sárkány Lőrinc 24529ef5df Translated using Weblate (Hungarian)
Currently translated at 43.9% (4441 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-12-10 07:59:28 +01:00
Marco Ciampa 4bf59e4b0f Translated using Weblate (Italian)
Currently translated at 99.3% (10033 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2025-12-10 07:59:28 +01:00
Seth Hillbrand 2c35d43069 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9890 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2025-12-10 07:59:28 +01:00
Sárkány Lőrinc a3a00a4932 Translated using Weblate (Hungarian)
Currently translated at 43.7% (4415 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-12-10 07:59:27 +01:00
Sárkány Lőrinc 2fd4406f04 Translated using Weblate (Hungarian)
Currently translated at 43.4% (4386 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-12-10 07:59:27 +01:00
Temuri Doghonadze d4c262cc40 Translated using Weblate (Georgian)
Currently translated at 32.8% (3318 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2025-12-10 07:59:27 +01:00
Sárkány Lőrinc 1767edfd87 Translated using Weblate (Hungarian)
Currently translated at 42.7% (4318 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-12-10 07:59:27 +01:00
CloverGit 704bfa5391 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.9% (10087 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2025-12-10 07:59:27 +01:00
Sárkány Lőrinc ed8a699670 Translated using Weblate (Hungarian)
Currently translated at 42.3% (4274 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-12-10 07:59:27 +01:00
Temuri Doghonadze 49ca0e5452 Translated using Weblate (Georgian)
Currently translated at 32.7% (3307 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2025-12-10 07:59:27 +01:00
Sárkány Lőrinc 844a1b5eb9 Translated using Weblate (Hungarian)
Currently translated at 41.1% (4154 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-12-10 07:59:27 +01:00
CloverGit ff6c1852b4 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (10084 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2025-12-10 07:59:27 +01:00
Temuri Doghonadze 6d6355c67d Translated using Weblate (Georgian)
Currently translated at 32.5% (3285 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2025-12-10 07:59:26 +01:00
Sárkány Lőrinc 3321da2a5d Translated using Weblate (Hungarian)
Currently translated at 40.3% (4073 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-12-10 07:59:26 +01:00
Marco Ciampa 74963bd16c Translated using Weblate (Italian)
Currently translated at 99.3% (10032 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2025-12-10 07:59:26 +01:00
Temuri Doghonadze 03c67a8033 Translated using Weblate (Georgian)
Currently translated at 32.1% (3250 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2025-12-10 07:59:26 +01:00
Temuri Doghonadze 778d8846d6 Translated using Weblate (Georgian)
Currently translated at 30.9% (3125 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2025-12-10 07:59:26 +01:00
Marco Ciampa b5a763fe69 Translated using Weblate (Italian)
Currently translated at 99.3% (10030 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2025-12-10 07:59:26 +01:00
CloverGit af16d38b46 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (10081 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2025-12-10 07:59:26 +01:00
Marco Ciampa d089ecbc02 Translated using Weblate (Italian)
Currently translated at 99.2% (10026 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2025-12-10 07:59:26 +01:00
Temuri Doghonadze 06b6b51ed8 Translated using Weblate (Georgian)
Currently translated at 29.7% (3002 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2025-12-10 07:59:26 +01:00
CloverGit cbaeb2235e Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (10079 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2025-12-10 07:59:25 +01:00
ZbeeGin 833b5fc6e2 Translated using Weblate (Polish)
Currently translated at 100.0% (10097 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2025-12-10 07:59:25 +01:00
Krzysztof Kawa 22efda6367 Translated using Weblate (Polish)
Currently translated at 100.0% (10097 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/pl/
2025-12-10 07:59:24 +01:00
Marco Ciampa 964947bc4f Translated using Weblate (Italian)
Currently translated at 99.2% (10017 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2025-12-10 07:59:24 +01:00
Temuri Doghonadze f032186e43 Translated using Weblate (Georgian)
Currently translated at 28.7% (2904 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2025-12-10 07:59:24 +01:00
Jan Straka 91f6033982 Translated using Weblate (Czech)
Currently translated at 77.9% (7872 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/cs/
2025-12-10 07:59:24 +01:00
CloverGit fa1bb05cfa Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (10079 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2025-12-10 07:59:24 +01:00
Temuri Doghonadze 9ac570c622 Translated using Weblate (Georgian)
Currently translated at 28.2% (2856 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2025-12-10 07:59:24 +01:00
CloverGit 1e795bee18 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (10079 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2025-12-10 07:59:24 +01:00
Marco Ciampa e9a1792d45 Translated using Weblate (Italian)
Currently translated at 99.1% (10013 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2025-12-10 07:59:23 +01:00
CloverGit c2593c3547 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (10079 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2025-12-10 07:59:23 +01:00
2tama3 c59c1701bb Translated using Weblate (Japanese)
Currently translated at 100.0% (10097 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2025-12-10 07:59:23 +01:00
CloverGit 534acc718d Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (10079 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2025-12-10 07:59:23 +01:00
Marco Ciampa 7f6557e76a Translated using Weblate (Italian)
Currently translated at 99.1% (10013 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2025-12-10 07:59:23 +01:00
Henrik Kauhanen b6f21ea2ae Translated using Weblate (Swedish)
Currently translated at 99.9% (10091 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/sv/
2025-12-10 07:59:23 +01:00
Marco Ciampa e906e5e98c Translated using Weblate (Italian)
Currently translated at 99.0% (10002 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2025-12-10 07:59:23 +01:00
CloverGit c5a02c908f Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (10079 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2025-12-10 07:59:22 +01:00
Marco Ciampa 9edf3e4005 Translated using Weblate (Italian)
Currently translated at 99.0% (10001 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2025-12-10 07:59:22 +01:00
Pferd O. 55a8a075e6 Translated using Weblate (German)
Currently translated at 100.0% (10097 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2025-12-10 07:59:22 +01:00
김랑기 1f95d9bc1c Translated using Weblate (Korean)
Currently translated at 99.7% (10075 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ko/
2025-12-10 07:59:22 +01:00
Marco Ciampa 97971957ce Translated using Weblate (Italian)
Currently translated at 98.7% (9972 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2025-12-10 07:59:22 +01:00
김랑기 662f4c1e89 Translated using Weblate (Korean)
Currently translated at 99.3% (10033 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ko/
2025-12-10 07:59:22 +01:00
Temuri Doghonadze 49a03c7c01 Translated using Weblate (Georgian)
Currently translated at 28.0% (2836 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2025-12-10 07:59:22 +01:00
김랑기 ed6319fae0 Translated using Weblate (Korean)
Currently translated at 99.1% (10016 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ko/
2025-12-10 07:59:22 +01:00
2tama3 10f5d88b7a Translated using Weblate (Japanese)
Currently translated at 100.0% (10097 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2025-12-10 07:59:21 +01:00
Ivan Chuba 8937681052 Translated using Weblate (Estonian)
Currently translated at 3.5% (357 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/et/
2025-12-10 07:59:21 +01:00
Pferd O. a0030b4dd3 Translated using Weblate (German)
Currently translated at 100.0% (10097 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2025-12-10 07:59:20 +01:00
Vic 1fb6254d62 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9890 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2025-12-10 07:59:19 +01:00
CloverGit 6f0bafa7a0 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (10080 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2025-12-10 07:59:19 +01:00
Максим Горпиніч c7e7d3aac8 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (10097 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/uk/
2025-12-10 07:59:19 +01:00
2tama3 312dd06216 Translated using Weblate (Japanese)
Currently translated at 100.0% (10097 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2025-12-10 07:59:19 +01:00
Marco Ciampa 803ce01795 Translated using Weblate (Italian)
Currently translated at 98.7% (9969 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2025-12-10 07:59:18 +01:00
Pferd O. d9cc8ee071 Translated using Weblate (German)
Currently translated at 99.9% (10096 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2025-12-10 07:59:18 +01:00
Jeff Young 27df4775d0 Kill any running tools before switching the footprint. 2025-12-09 23:51:48 +00:00
Jeff Young 3071bbd201 Don't short-cicuit Remove() or RemoveAll().
Also, make sure PCB_GRID_HELPER installs itself
as a board listener.  (Otherwise its
OnBoardItemRemoved() handler will never get
called.)

(cherry picked from commit 88e87bab3e)
2025-12-09 18:00:37 +00:00
Jeff Young 6296360047 Clear snap items when their parent footprint are removed from board.
(cherry picked from commit 75deaaa467)
2025-12-09 18:00:37 +00:00
Seth Hillbrand a23c267fb3 Avoid calling grid helper when changing tool
When changing tools, the canvas may reference objects that are invalid,
so avoid using the grid helper here.  We don't need the cursor pos at
this point anyway

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21929
2025-12-08 15:31:39 -08:00
Jeff Young 85f483c36b Fix accidentally broken text mirroring direction.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22479

(cherry picked from commit 39cf28d5fd)
2025-12-08 17:20:10 +00:00
Jeff Young e99964d652 Fix indenting. 2025-12-08 16:38:42 +00:00
Jeff Young a68a69893c Regenerate changes list when checkboxes change.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22467

(cherry picked from commit 51494f3853)
2025-12-08 16:38:42 +00:00
Jeff Young 3f528f89ef Force output of pad offset when other layers of padstack differ.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22464

(cherry picked from commit 8133e53fbf)
2025-12-08 16:38:42 +00:00
Mark Roszko 1a69f21462 Reduce tiny fp errors that can be introduced when updating footprints
Moving by the cursor position (double) and then back to the integer coordinate position sometimes added tiny tiny tiny shifts in the coordinate.


(cherry picked from commit dad49d5dba)

Co-authored-by: Mark Roszko <mark.roszko@gmail.com>
2025-12-06 20:41:32 +00:00
Mark Roszko 47363766c7 Fix rule areas not accounting for inner layer expansion in drc parity check
Also fix up the pad stack check to account for external layer presence more properly
2025-12-06 14:12:14 -05:00
Mark Roszko 1d694eba5d Allow footprints to have additional layers on their pads in boards instead of flagging constant library mismatches
Board layer count settings increase the number of layers on PTH pads when the board is loaded.
This causes false library mismatch DRCs with little explanation of something that is automatic and logical behavior.
2025-12-06 11:26:14 -05:00
Wayne Stambaugh dbeaeae919 Reset tools before loading new footprint in footprint chooser.
This may not actually fix this issue.  It is probably safer to reset all
tools before changing the footprint view just in case an unexpected event
occurs that causes a tool to attempt to access an object no longer valid
in the view.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21929
2025-12-05 08:12:19 -05:00
Seth Hillbrand 4f97ce15cc Fix broken cherry-pick 2025-12-03 15:43:36 -08:00
Seth Hillbrand d27552a282 Ensure closed polygons for filling
PDF output needs closed polygons to fill objects, so ensure that we
properly close before filling

(cherry picked from commit ae80e30467)
2025-12-03 11:32:11 -08:00
Wayne Stambaugh 0be18638f8 Use correct signature of VIA::Width() to prevent crash.
- Update VIA::GetWidth() to raise an assertion and always return a valid albeit
  most likely incorrect width.

- Fix interactive via placement tool to call the correct VIA::GetWidth() which
  prevents the crash/assertion.  This uses the layer of the shape where the via
  is being placed.

Fixes KICAD-ZY6
2025-12-01 15:35:38 -05:00
Jeff Young a697be4fbf Resolve text variables when resolving netclasses.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22413

(cherry picked from commit 36c603b6f0)
2025-12-01 17:35:49 +00:00
Mark Roszko ac6dcbe9ae Update vcpkg for wx test 2025-12-01 01:16:01 +00:00
Jeff Young d16f784412 Don't leave the dirty flag set after clearing properties.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22428
2025-11-30 14:38:01 +00:00
Jeff Young b12b88fd40 Don't try to open-code a SHAPE_POLY_SET::BooleanSubtract().
Fixes https://gitlab.com/kicad/code/kicad/-/issues/17317

(cherry picked from commit 308134d025)
2025-11-30 14:38:01 +00:00
Bernhard Kirchen bd2152bb3d add DRC exclusion comment to JSON report
closes #22330.

(cherry picked from commit 80e148fb68)
2025-11-30 14:38:01 +00:00
Jeff Young 677750b64e Remove previous hack for dealing with ligatures.
It appears to be no longer needed, and messes some
things up.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22402

(cherry picked from commit 4bfed3f174)
2025-11-30 14:38:01 +00:00
Jeff Young d6ddeff443 Fix initial focus in Label Properties dialog.
(cherry picked from commit 84213dff2a)
2025-11-30 14:38:01 +00:00
Jeff Young 06e1e4c62c Drawing tools must police their own handling of paste.
Doing otherwise disables paste even when
the tool is idle.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22373

(cherry picked from commit b7c561b232)
2025-11-30 14:38:01 +00:00
Alex Shvartzkop aa6fb159b5 Warn about Controlled folder access on Windows
Controlled folder access blocks access to Documents folder which we use.
2025-11-29 19:38:17 +03:00
Mark Roszko 3ed9fbe423 Edit doxygen.yml
(cherry picked from commit bc73ecbddf)

Co-authored-by: Mark Roszko <mark.roszko@gmail.com>
2025-11-27 00:11:04 +00:00
Alex Shvartzkop 8b93d56c14 Hyperlynx export: swap arc start/end.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22178
2025-11-25 12:48:27 +03:00
Alex Shvartzkop 138f8af8ab Support Autodesk Fusion urn format for Eagle import.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22394
2025-11-25 09:55:30 +03:00
Mark Roszko 00b6f25031 Fix calculator min size and minor dead code nix
(cherry picked from commit e222aaeefd)

82bbecc9 pcb_calculator: remove dead code in PCB_CALCULATOR_FRAME::OnUpdateUi
d1de79b8 fixes https://gitlab.com/kicad/code/kicad/-/issues/22385

Co-authored-by: Jan Dorniak <jaskij@gmail.com>
2025-11-23 17:05:42 +00:00
Mark Roszko fdb333ca8b Add missing include 2025-11-22 18:54:21 +00:00
Mark Roszko 014a4d040c Handle Python multi-phase initialization support in swig-4.4.0
Signed-off-by: Mark Roszko <mark.roszko@gmail.com>


(cherry picked from commit c5a2b86379)

Co-authored-by: Raman Varabets <gitlab-20240601-da2ef10c@cyborgize.sg>
2025-11-22 18:15:30 +00:00
Jon Evans 5818b52a38 API: Ensure new footprints have unique child UUIDs
Fixes https://gitlab.com/kicad/code/kicad/-/issues/21340
2025-11-22 11:28:37 -05:00
Jon Evans ea5ae7cc5d API: Fix serialization of footprint rule overrides; add missing allow_soldermask_bridges attribute
Fixes https://gitlab.com/kicad/code/kicad/-/issues/21674
2025-11-22 09:59:03 -05:00
Jon Evans f230800365 Use active layer when pasting text from clipboard
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22370
2025-11-22 09:25:15 -05:00
Jon Evans 51ba93c680 Fix loading of shape offset and delta for complex padstacks
Fixes https://gitlab.com/kicad/code/kicad/-/issues/21691
2025-11-22 09:21:23 -05:00
Alex Shvartzkop bddc4e5f89 gerbview: significantly improve performance when zip archive has extra ASCII files. 2025-11-22 15:27:24 +03:00
Jon Evans bdd98e801f API: Add schematic pin attributes to pads
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22360
2025-11-20 23:29:43 -05:00
Mark Roszko a7c69264ad Fix vcpkg baseline hash 2025-11-20 21:04:54 -05:00
Mark Roszko 9c16efcb83 Bump vcpkg baseline 2025-11-20 20:53:55 -05:00
Mark Roszko 89155c488f Bump kicad-vcpkg for a wxwidgets fix (aui icon drawing speed) 2025-11-20 20:53:11 -05:00
Jon Evans 949be9a63a API: Preserve linked symbol properties in footprints
Fixes https://gitlab.com/kicad/code/kicad/-/issues/21655
2025-11-20 19:57:27 -05:00
Alex Shvartzkop 0685039e0a EasyEDA/JLCEDA Pro V3: fix pin name/number import. 2025-11-21 02:05:09 +03:00
Alex Shvartzkop 5ab0ab2bdb EasyEDA Pro schematic import: improve text sizing. 2025-11-21 00:50:14 +03:00
Alex Shvartzkop 95f895b4a9 EasyEDA Pro schematic import: change Arial to default font
JLCEDA Pro V3 export to format version V1 specifies Arial
explicitly instead of null for default font,
and system's Arial usually doesn't have the Chinese charset.
2025-11-21 00:49:15 +03:00
Alex Shvartzkop 34a7f64821 EasyEDA Pro: allow picking "Global Net Name" from symbol.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/19734
2025-11-21 00:19:28 +03:00
Alex Shvartzkop 95f1630bce Revert "Ignore visibility and style attrs in instance data."
This reverts commit 17158f21da.
2025-11-20 23:36:57 +03:00
jean-pierre charras 85494592d6 ZONE::GetMsgPanelInfo(): fix info displayed for rule areas
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22352

(cherry picked from commit 284348f032)
2025-11-20 17:28:06 +01:00
jean-pierre charras 4a5c64a036 Fix plot pad issue with solder paste layer when using a percentage for clearance.
For chamfered rectangle pads, when using a percentage to define a clearance for
solder paste shape from copper pad shape with different X and Y sizes, the
plotted solder paste shape was incorrect.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22306

(cherry picked from commit fa0fc59d82)
2025-11-20 14:34:26 +01:00
dsa-t 39e69ffdad Work around a bug in JLCEDA V1 format export where SMD pads specify zero-sized hole.
(cherry picked from commit 3e8a2fb7ea)

Co-authored-by: Alex Shvartzkop <dudesuchamazing@gmail.com>
2025-11-20 14:31:12 +03:00
Jeff Young 48d8c8d0b2 Hand cherry-pick of ea147ae68b. 2025-11-14 18:15:52 +00:00
Jeff Young 06f48b6c88 Refresh library tree when saving an editable copy.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22247

(cherry picked from commit 885bb34f66)
2025-11-13 12:35:18 +00:00
Magnus Lundmark 96868b2737 Add row or column to a table now respects formatting
(cherry picked from commit a6840a1370)
2025-11-10 14:10:44 +00:00
JamesJCode 4e4a2d1fa1 Implement hierarchical component classes
This ensures that hierarchical sheets inside a rule are with a
component class attached pass that component class down the
schematic hierarchy.

(cherry picked from commit 710a239c67)
2025-11-09 20:51:08 +00:00
Wayne Stambaugh 3c4f582352 Fix image rotation direction in schematic editor.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22254

(cherry picked from commit 2e278c10f8)
2025-11-06 16:36:13 -05:00
akhilles 7a513cb61a IPC-2581: Fix SlotCavity to use drill hole dimensions
The addSlotCavity function was using GetEffectiveShape() which returns
the copper pad geometry, not the drill hole geometry. This caused
slotted through-holes to export with incorrect dimensions in the ROUT
layer, resulting in zero annular ring when parsed by IPC-2581 compliant
tools.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22145
2025-11-06 14:04:25 -05:00
dsa-t 29863a3da1 Fix EasyEDA Pro v2.2 compatibility.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22239


(cherry picked from commit be8025b331)

Co-authored-by: Alex Shvartzkop <dudesuchamazing@gmail.com>
2025-11-06 11:15:23 +03:00
Jeff Young f059596736 Fix regression with resolving text variables in symbol fields table.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/19978
2025-11-04 17:52:03 +00:00
Jeff Young 19c0bb27f5 Adding/removing items to/from footprint taints the geometry caches.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22203
2025-11-04 17:41:42 +00:00
Alex Shvartzkop 7852afc219 router: try to resolve track drag collision first before showing "Track violates DRC". 2025-11-04 02:28:07 +03:00
Alex Shvartzkop 32b15a6d8d Support wx 3.2 in Eagle sch parser.
(cherry picked from commit 79a926f533)
2025-11-03 02:10:44 +03:00
Alex Shvartzkop 5eb95e9976 Support reading EAGLE sch files starting with "<eagle" instead of correct xml header.
(cherry picked from commit 7ff43c501e)
2025-11-03 02:10:44 +03:00
Alex Shvartzkop 378b7ef2cb Eagle import: improve rot field parsing. 2025-11-03 02:10:44 +03:00
Alex Shvartzkop 1770ce0557 Update translations 2025-11-02 05:47:46 +03:00
Максим Горпиніч 31ce874136 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (10096 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/uk/
2025-11-02 03:45:45 +01:00
Marco Ciampa c4d3d0e0e2 Translated using Weblate (Italian)
Currently translated at 98.6% (9964 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2025-11-02 03:45:45 +01:00
CloverGit 050df10ad4 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (10081 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2025-11-02 03:45:45 +01:00
Marco Ciampa 2c8d12f9eb Translated using Weblate (Italian)
Currently translated at 98.6% (9962 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2025-11-02 03:45:45 +01:00
CloverGit acc70d85c3 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (10079 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2025-11-02 03:45:45 +01:00
Tatu Bogdan 995e313f3a Translated using Weblate (Romanian)
Currently translated at 24.2% (2449 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ro/
2025-11-02 03:45:45 +01:00
2tama3 c5b6ebaa1a Translated using Weblate (Japanese)
Currently translated at 100.0% (10096 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2025-11-02 03:45:45 +01:00
Pferd O 9ce8200750 Translated using Weblate (German)
Currently translated at 100.0% (10096 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2025-11-02 03:45:45 +01:00
Eli Hughes 5bc2f6aa2b adding some docuemntation for the http test server as well as a requirements.txt and pyproject.toml for running w/ uv
(cherry picked from commit 8fa6656e39)
2025-11-01 10:24:11 +00:00
Jeff Young db2f1a3040 Don't beep on the event that got us here.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22158

(cherry picked from commit 8c2b5977ec)
2025-10-30 15:35:01 +00:00
Jeff Young 3a77e1377a Resolve text variables in descriptions and keywords.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22146

(cherry picked from commit 5e41d63bd0)
2025-10-30 15:35:01 +00:00
Jeff Young 7a9d9fb5f6 Hand cherry-pick of 82b1bcecca. 2025-10-30 15:35:01 +00:00
Jeff Young d4c25be6c0 Make sure graphic items pass selection filter. 2025-10-30 15:35:01 +00:00
Jeff Young 11d08ae2c8 Make sure graphic segments pass selection filter. 2025-10-30 15:35:01 +00:00
Jeff Young da8be848e1 Multiple bug fixes in handling of inheritance chains.
Lots of code assumed a single inheritance, while in
fact the parent could also be derived.

Also removed a couple of cover types on std:shared_ptr
and std::weak_ptr as it's important to know the API
contract you're dealing with.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22003

(cherry picked from commit 857c408b25)
2025-10-30 15:35:01 +00:00
Jeff Young c3226645c5 Hand cherry-pick parts of f1e4d75118. 2025-10-30 15:35:01 +00:00
Jeff Young 144cdd98ce Replace comment; change format name.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/21982

(cherry picked from commit d8b4fde1c8)
2025-10-30 15:35:01 +00:00
Philippe Maire 9aa9a618be Fix position file alignment when the values or footprint contain UTF-8 characters. https://gitlab.com/kicad/code/kicad/-/issues/21982
(cherry picked from commit 1be157d212)
2025-10-30 15:35:01 +00:00
Jeff Young 2cc574ed14 Adjust text offset after SCH_/LIB_ merger.
(It was upside down as it originated
from the flipped coordinate system.)

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21802

(cherry picked from commit 507ec29cc0)
2025-10-30 15:35:01 +00:00
Jeff Young 08267916e8 Give auto-created fields names.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/21928

(cherry picked from commit 4c91cba7c8)
2025-10-30 15:35:01 +00:00
Jeff Young 3476553bb2 Cleanup CLI argument specifications.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/21950

(cherry picked from commit 9468f304c7)
2025-10-30 15:35:01 +00:00
Jeff Young c7fd6a14d6 Formatting. 2025-10-30 15:35:01 +00:00
Jeff Young 8c1e3704e7 Cherry-pick of 54200d073a. 2025-10-30 15:35:01 +00:00
Jeff Young 9eef6cf857 Be wary of items being pulled out from under PointEditor.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/21966

(cherry picked from commit 54200d073a)
2025-10-30 15:35:01 +00:00
Jeff Young 2b662b4ccc Don't abort same-net items in the filter.
We still need to check for hole collisions.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21941

(cherry picked from commit d03b5f44ab)
2025-10-30 15:35:01 +00:00
Jeff Young 8a78d83087 Hand cherry-pick 77d6a1d490 2025-10-30 15:35:01 +00:00
Jeff Young c05fe36a0a Hand cherry-pick hole clearance fixes for #21941. 2025-10-30 15:35:01 +00:00
Jeff Young 2cf7288b1b Hand cherry-pick of b6cc9df1f4. 2025-10-30 15:35:01 +00:00
jean-pierre charras 77686f50af Fix BOARD::ConvertBrdLayerToPolygonalContours() broken for PCB_TABLE
ConvertBrdLayerToPolygonalContours() convert basic graphic items to their
polygonal shapes to allow plotting them in DXF export and vrml export.
For PCB_TABLE, the conversion of PCB_TABLE basic graphic items (textx, segments)
was not made.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21934

(cherry picked from commit 118410eb1b)
2025-10-30 13:57:45 +01:00
Wayne Stambaugh f84f0b913d Begin version 9.0.7 development. 2025-10-30 08:43:20 -04:00
Wayne Stambaugh 8a3464bdf1 Tag stable version 9.0.6. 2025-10-30 08:41:59 -04:00
Alex Shvartzkop 51646e6605 Update translations 2025-10-30 04:51:46 +03:00
Vic e962686afb Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9891 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2025-10-30 02:50:56 +01:00
2tama3 9211d60d7b Translated using Weblate (Japanese)
Currently translated at 100.0% (10096 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2025-10-30 02:50:56 +01:00
Marco Ciampa 632c03a874 Translated using Weblate (Italian)
Currently translated at 98.6% (9958 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/it/
2025-10-30 02:50:56 +01:00
Vic 24d2eded07 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.9% (9891 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2025-10-30 02:50:56 +01:00
தமிழ்நேரம் d3a5bf20db Translated using Weblate (Tamil)
Currently translated at 99.9% (10094 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ta/
2025-10-30 02:50:56 +01:00
Pferd O 099e0d1312 Translated using Weblate (German)
Currently translated at 99.9% (10093 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2025-10-30 02:50:56 +01:00
Frank Sonnenberg 3c1bc31456 Translated using Weblate (German)
Currently translated at 99.9% (10093 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2025-10-30 02:50:56 +01:00
Vic 2fffc9780b Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.8% (9874 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2025-10-30 02:50:56 +01:00
தமிழ்நேரம் 68bfa2001e Translated using Weblate (Tamil)
Currently translated at 99.8% (10078 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ta/
2025-10-30 02:50:56 +01:00
Sárkány Lőrinc ebdf4c7719 Translated using Weblate (Hungarian)
Currently translated at 39.7% (4012 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-10-30 02:50:55 +01:00
Toni Laiho f944b662b6 Translated using Weblate (Finnish)
Currently translated at 97.6% (9854 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/fi/
2025-10-30 02:50:55 +01:00
Frank Sonnenberg 3ac9bace21 Translated using Weblate (German)
Currently translated at 99.9% (10093 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2025-10-30 02:50:55 +01:00
Vic 98141d0143 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.7% (9871 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hant/
2025-10-30 02:50:55 +01:00
தமிழ்நேரம் d90d86775b Translated using Weblate (Tamil)
Currently translated at 99.7% (10067 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ta/
2025-10-30 02:50:55 +01:00
dsa-t 578d0a5a4a Translated using Weblate (Russian)
Currently translated at 100.0% (10096 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ru/
2025-10-30 02:50:55 +01:00
2tama3 53075ee9f3 Translated using Weblate (Japanese)
Currently translated at 100.0% (10096 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2025-10-30 02:50:55 +01:00
Frank Sonnenberg 7f19d051ed Translated using Weblate (German)
Currently translated at 99.9% (10094 of 10096 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2025-10-30 02:50:55 +01:00
Seth Hillbrand 364cf0808f Ensure snaps override grid points 2025-10-29 15:22:52 -07:00
Seth Hillbrand d3cce1e35c Remove H/V/45 limits in router completely
Lots of complaints, little benefit

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22147

(cherry picked from commit ab0e0abe67)
2025-10-28 17:00:55 -07:00
jean-pierre charras 1b20a932ad Fix Unroute Selected when footprint is select and filter selection pad OFF
Fixes https://gitlab.com/kicad/code/kicad/-/issues/22138

(cherry picked from commit 8ba749bf49)
2025-10-28 18:40:01 +01:00
Jeff Young 3b0dac9491 Fix typo. 2025-10-27 15:35:39 +00:00
Wayne Stambaugh 4433da15b1 Tag stable version 9.0.6 release candidate 2. 2025-10-22 18:40:21 -04:00
Alex Shvartzkop e4af447855 Update translations 2025-10-23 00:59:39 +03:00
தமிழ்நேரம் ecd4326533 Translated using Weblate (Tamil)
Currently translated at 99.5% (10050 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ta/
2025-10-23 00:57:45 +03:00
Sárkány Lőrinc 73854bc9f1 Translated using Weblate (Hungarian)
Currently translated at 39.7% (4009 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/hu/
2025-10-23 00:57:30 +03:00
CloverGit 544c035298 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (10082 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2025-10-23 00:57:18 +03:00
aris-kimi c8da489b1f Translated using Weblate (Greek)
Currently translated at 85.6% (8649 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/el/
2025-10-23 00:57:18 +03:00
2tama3 da6f97b24f Translated using Weblate (Japanese)
Currently translated at 100.0% (10097 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2025-10-23 00:57:08 +03:00
Tokita, Hiroshi 464d248b8c Translated using Weblate (Japanese)
Currently translated at 100.0% (10097 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ja/
2025-10-23 00:57:08 +03:00
CloverGit b790b46c76 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (10081 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/zh_Hans/
2025-10-23 00:56:54 +03:00
Frank Sonnenberg b4a5422e54 Translated using Weblate (German)
Currently translated at 100.0% (10097 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2025-10-23 00:56:43 +03:00
Mark Hämmerling 565d54a184 Translated using Weblate (German)
Currently translated at 100.0% (10097 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2025-10-23 00:56:43 +03:00
Pferd O ebcf96dcd6 Translated using Weblate (German)
Currently translated at 100.0% (10097 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2025-10-23 00:56:43 +03:00
Pferd O e067a8ddc8 Translated using Weblate (German)
Currently translated at 100.0% (10097 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/de/
2025-10-23 00:56:43 +03:00
Temuri Doghonadze 4d8feb94bd Translated using Weblate (Georgian)
Currently translated at 27.6% (2790 of 10097 strings)

Translation: KiCad EDA/v9
Translate-URL: https://hosted.weblate.org/projects/kicad/v9/ka/
2025-10-23 00:56:27 +03:00
Seth Hillbrand 2374e5e542 Propagate lib_fields changes
Partial cherry-pick of 702f774a1f and
fef84a2c6a
2025-10-22 13:10:04 -07:00
Seth Hillbrand a3e4a001bb Fix HV45 toggle during move
Action handled externally, so trigger internal updates on flag

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22025
2025-10-21 16:44:12 -07:00
Seth Hillbrand edc25f8ba0 Fix axis locking when keypresses are specific
If you immediately pressed left/right it would not unlock unless there
was a mouse movement between
2025-10-21 16:25:49 -07:00
Seth Hillbrand 10a03972d4 Re-enable axis locking on cursor key
This is an accidental feature previously but now make it explicit.
Pressing left or right keys will lock the movement to the horizontal
axis until you press the opposite key.  Same for up/down

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21981
2025-10-21 15:30:26 -07:00
Wayne Stambaugh 5a3c210b7c Revert "Tag stable version 9.0.6 release candidate 2."
This reverts commit 239eb5a1ff.
2025-10-21 16:48:53 -04:00
Wayne Stambaugh 239eb5a1ff Tag stable version 9.0.6 release candidate 2. 2025-10-21 16:39:16 -04:00
Seth Hillbrand c1a1bbc96b Strongly prefer snap points over snap lines
When moving toward an intersection of snap lines that is also a snap
point, when the grid is off, the snap will always be closer to one snap
line or the other before the snap point.  This is problematic for
snapping to a center point, e.g.

Instead, if you are within the snap range of a snap point, that should
be your preference.  Zooming in will allow snapping to the snap physical
point on a line and avoiding the snap point snapping

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22045
2025-10-21 12:07:27 -07:00
Seth Hillbrand c16076a5c3 Remove Local Power from v9 2025-10-21 12:04:57 -07:00
Seth Hillbrand 77ab6c29bf Ensure ERC Exclusions are maintained
After we load/resolve the exclusions, we want to ensure that the
resolved ones are re-recorded into the project file so that it always
remains consistent with the state of the system.  This way, if pcbnew
closes first and re-saves the project, our exclusions are not lost until
the schematic closes

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21410

(cherry picked from commit 5442e5050e)
2025-10-21 06:27:40 -07:00
Seth Hillbrand 9366902052 Clear the keyboard movement flag on mouse move
We detect mouse movement by checking if the screen position is not the
keyboard position and if not, we clear the
m_lastKeyboardCursorPositionValid that is used for detemining keyboard
movement in snaps

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21981

(cherry picked from commit 120c788ef0)
2025-10-20 16:34:11 -07:00
Jeff Young 86b687bdaf Minimal cherry-pick of ba73ce78e6. 2025-10-20 14:08:30 +01:00
Wayne Stambaugh 1da4895619 Sync shared symbol instance field values in symbol fields table dialog.
Change data store key from wxString to KIID_PATH to make it easier to look
up shared symbol instances by KIID.
2025-10-16 17:56:18 -04:00
Seth Hillbrand fbf9a45a00 Fix MSVC compile 2025-10-15 17:27:45 -07:00
Seth Hillbrand c6c2d6468d Keep movement snaps aligned with start
Prevents jumping elements when we start to move

(cherry picked from commit d4265ebff8)
2025-10-15 16:51:40 -07:00
Seth Hillbrand b349140112 Snap construction lines to grid if enabled
Nearest grid line intersection is a snap point on construction lines

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21984

(cherry picked from commit ce305990e8)
2025-10-15 16:49:00 -07:00
Seth Hillbrand 5dafadb12c Prioritize anchor snapping over snapline/grid
We have a number of potential snap points and we would prefer to snap to
identified snap points on objects in the view over ethereal points
created by intersections

(cherry picked from commit ce49e9d69c)
2025-10-15 15:25:55 -07:00
Seth Hillbrand da1f71684c Use full path to match symbols in table/BOM
In the symbol fields table, we can't rely on the UUID being unique
across sheets.  So, we need to keep the full path as our key to unique
symbols

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21998

N.B. This is similar to but not a direct cherry pick from 8cf33049be
since the branches have diverged
2025-10-15 15:14:50 -07:00
Seth Hillbrand 563a2d20b7 SCH_ITEMs will not always have a schematic pointer
Especially if we are updating a symbol, the pointer is removed, so we
need to be able to handle this case

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21995
2025-10-15 10:01:39 -07:00
Seth Hillbrand f31450018d Add missing acknowlegement for ur-3dmodels library
(cherry picked from commit fcc25071b7)
2025-10-15 06:57:00 -07:00
Seth Hillbrand c329ba2b4c Add link to original GitHub 3D repo
(cherry picked from commit 61f33a2fef)
2025-10-15 06:57:00 -07:00
Seth Hillbrand fe42b1fd6b Fix link to Maui's GitHub
(cherry picked from commit 9067338e37)
2025-10-15 06:57:00 -07:00
Jon Evans 66628a3501 API: Do not attempt to unpack invalid layers
Fixes https://gitlab.com/kicad/code/kicad/-/issues/21743
2025-10-14 17:55:30 -04:00
Tomasz Wlostowski e21ebbff76 router: improved multidrag segment side/corner determination
Fixes https://gitlab.com/kicad/code/kicad/-/issues/21972
2025-10-14 19:16:42 +03:00
Seth Hillbrand 7df0a80eed Don't write invalid countour data in ODB++
Fixes https://gitlab.com/kicad/code/kicad/-/issues/21974

(cherry picked from commit df76a54db1)
2025-10-13 16:20:11 -07:00
Jeff Young 790dee114b Use the fully-qualified name in the library too.
(Otherwise when we save another symbol with
a different fully-qualified name, but same
elem.text, we'll delete the first instance
which we still have cached.)

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21947
2025-10-12 20:30:33 +01:00
Seth Hillbrand 3f17abba60 Properly handle choices mapped
If the choice is an integer, we need to be able to handle it directly
because we can't get the wxAny to a wxString if the underlying type
doesn't map

(cherry picked from commit 42a76dd4bd)
2025-10-11 22:55:46 -07:00
568 changed files with 703317 additions and 347301 deletions
+2 -2
View File
@@ -1,7 +1,7 @@
build_doxygen_docker:
image: docker:stable
image: docker:24.0.5-cli
services:
- docker:dind
- docker:24.0.5-dind
stage: build
rules:
- if: $CI_PIPELINE_SOURCE == "schedule" && $SCHEDULED_JOB_NAME == "doxygen"
@@ -202,6 +202,10 @@ EDA_3D_VIEWER_FRAME::EDA_3D_VIEWER_FRAME( KIWAY* aKiway, PCB_BASE_FRAME* aParent
EDA_3D_VIEWER_FRAME::~EDA_3D_VIEWER_FRAME()
{
// Shutdown all running tools
if( m_toolManager )
m_toolManager->ShutdownAllTools();
Prj().GetProjectFile().m_Viewports3D = m_appearancePanel->GetUserViewports();
m_canvas->SetEventDispatcher( nullptr );
@@ -185,6 +185,10 @@ PANEL_PREVIEW_3D_MODEL::PANEL_PREVIEW_3D_MODEL( wxWindow* aParent, PCB_BASE_FRAM
PANEL_PREVIEW_3D_MODEL::~PANEL_PREVIEW_3D_MODEL()
{
// Shutdown all running tools
if( m_toolManager )
m_toolManager->ShutdownAllTools();
// Restore the 3D viewer Render settings, that can be modified by the panel tools
if( m_boardAdapter.m_Cfg )
m_boardAdapter.m_Cfg->m_Render = m_initialRender;
+14
View File
@@ -115,6 +115,20 @@ message SetBoardOrigin
kiapi.common.types.Vector2 origin = 3;
}
message GetBoardLayerName
{
kiapi.common.types.DocumentSpecifier board = 1;
kiapi.board.types.BoardLayer layer = 2;
}
message BoardLayerNameResponse
{
// The name of the layer shown in the KiCad GUI, which may be a default value like "F.Cu" or may
// have been customized by the user.
string name = 1;
}
/*
* Net management
*/
+34
View File
@@ -464,6 +464,18 @@ message ThermalSpokeSettings
kiapi.common.types.Distance gap = 3;
}
message SymbolPinInfo
{
// The pin name for the associated symbol pin, if one exists
string name = 1;
// The electrical type of the associated symbol pin, if one exists (EPT_UNKNOWN if not)
kiapi.common.types.ElectricalPinType type = 2;
// True if the pin is attached to a no-connect marker in the schematic
bool no_connect = 3;
}
message Pad
{
kiapi.common.types.KIID id = 1;
@@ -481,6 +493,10 @@ message Pad
// Since: 9.0.4
kiapi.common.types.Distance pad_to_die_length = 9;
// Information about the associated symbol pin, if one exists
// Since: 9.0.7
SymbolPinInfo symbol_pin = 10;
}
enum ZoneType
@@ -830,6 +846,9 @@ message FootprintAttributes
bool exempt_from_courtyard_requirement = 6;
bool do_not_populate = 7;
FootprintMountingStyle mounting_style = 8;
// Since: 9.0.7
bool allow_soldermask_bridges = 9;
}
message NetTieDefinition
@@ -902,4 +921,19 @@ message FootprintInstance
// The sheet path to the associated symbol for this footprint instance, if one exists
kiapi.common.types.SheetPath symbol_path = 13;
// The name of the hierarchical sheet the associated symbol for this footprint exists on,
// or the empty string if there is no associated symbol
// Since: 9.0.7
string symbol_sheet_name = 14;
// The filename of the hierarchical sheet the associated symbol for this footprint exists on,
// or the empty string if there is no associated symbol
// Since: 9.0.7
string symbol_sheet_filename = 15;
// The the footprint filters given by the symbol this footprint is associated with,
// or the empty string if there is no associated symbol
// Since: 9.0.7
string symbol_footprint_filters = 16;
}
+22
View File
@@ -451,3 +451,25 @@ enum MapMergeMode
// The existing map will be cleared and replaced with the incoming map
MMM_REPLACE = 2;
}
enum ElectricalPinType
{
EPT_UNKNOWN = 0;
EPT_INPUT = 1;
EPT_OUTPUT = 2;
EPT_BIDIRECTIONAL = 3;
EPT_TRISTATE = 4;
EPT_PASSIVE = 5;
// A free pin is not internally connected and may connect to any net (route-through)
EPT_FREE = 6;
EPT_UNSPECIFIED = 7;
EPT_POWER_INPUT = 8;
EPT_POWER_OUTPUT = 9;
EPT_OPEN_COLLECTOR = 10;
EPT_OPEN_EMITTER = 11;
// A no-connect pin should not be connected to any net
EPT_NO_CONNECT = 12;
}
+5
View File
@@ -205,7 +205,12 @@ BITMAP2CMP_FRAME::BITMAP2CMP_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
BITMAP2CMP_FRAME::~BITMAP2CMP_FRAME()
{
// Shutdown all running tools
if( m_toolManager )
m_toolManager->ShutdownAllTools();
SaveSettings( config() );
/*
* This needed for OSX: avoids further OnDraw processing after this
* destructor and before the native window is destroyed
+3 -1
View File
@@ -51,5 +51,7 @@ DOCSET_BUNDLE_ID = ${DOCSET_BUNDLE_ID}
DISABLE_INDEX = YES
GENERATE_TREEVIEW = NO
SEARCHENGINE = NO
GENERATE_TAGFILE = ${DOXY_TAG_FILE}"
GENERATE_TAGFILE = ${DOXY_TAG_FILE}
# Doxygen-awesome doesn't look great without the index
HTML_EXTRA_STYLESHEET = "
)
+1 -15
View File
@@ -28,18 +28,12 @@
# Set the needed libraries
set( OCC_LIBS_COMMON
TKBinL
TKBin
TKBinTObj
TKBinXCAF
TKBool
TKBO
TKBRep
TKCAF
TKCDF
TKernel
TKFeat
TKFillet
TKG2d
TKG3d
TKGeomAlgo
@@ -48,22 +42,13 @@ set( OCC_LIBS_COMMON
TKLCAF
TKMath
TKMesh
TKMeshVS
TKOffset
TKOpenGl
TKPrim
TKRWMesh
TKService
TKShHealing
TKTObj
TKTopAlgo
TKV3d
TKXCAF
TKXMesh
TKXmlL
TKXml
TKXmlTObj
TKXmlXCAF
TKXSBase
)
@@ -140,6 +125,7 @@ else(WIN32)
/usr
/usr/local
/usr/local/opencascade
/usr/opencascade
/opt/opencascade
/opt/opencascade/lin64/gcc
PATH_SUFFIXES lib
+2 -2
View File
@@ -2,7 +2,7 @@
# This program source code file is part of KICAD, a free EDA CAD application.
#
# Copyright (C) 2016 Wayne Stambaugh <stambaughw@gmail.com>
# Copyright (C) 2016-2023, 2024 KiCad Developers, see AUTHORS.txt for contributors.
# Copyright (C) 2016-2023, 2024, 2025 KiCad Developers, see AUTHORS.txt for contributors.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -37,7 +37,7 @@
# KiCad.
#
# Note: This version string should follow the semantic versioning system
set( KICAD_SEMANTIC_VERSION "9.0.6-rc1" )
set( KICAD_SEMANTIC_VERSION "9.0.8-unknown" )
# Default the version to the semantic version.
# This is overridden by the git repository tag though (if using git)
+7
View File
@@ -184,6 +184,13 @@ if( CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
set( HAVE_WIMPLICIT_FLOAT_CONVERSION true )
endif()
CHECK_CXX_COMPILER_FLAG( "-Wambiguous-conditional" COMPILER_SUPPORTS_WAMBIGUOUS_CONDITIONAL )
# Add this to match MSVC's warning about ambiguous conditionals
if( COMPILER_SUPPORTS_WAMBIGUOUS_CONDITIONAL )
set( WARN_FLAGS_CXX "${WARN_FLAGS_CXX} -Wambiguous-conditional" )
endif()
# See if the compiler will throw warnings on these conversions
CHECK_CXX_COMPILER_FLAG( "-Wunused-const-variable" COMPILER_SUPPORTS_WUNUSED_CONST_VARIABLE )
+3
View File
@@ -11,6 +11,7 @@ include_directories(
./dialogs
./widgets
./dialog_about
${CMAKE_SOURCE_DIR}/libs/sexpr/include
${CMAKE_SOURCE_DIR}/resources/bitmaps_png
${CMAKE_SOURCE_DIR}/3d-viewer
${CMAKE_SOURCE_DIR}/pcbnew
@@ -128,6 +129,7 @@ set( KICOMMON_SRCS
widgets/kistatusbar.cpp
widgets/number_badge.cpp
widgets/progress_reporter_base.cpp
widgets/report_severity.cpp
widgets/std_bitmap_button.cpp
widgets/ui_common.cpp
widgets/wx_html_report_panel.cpp
@@ -237,6 +239,7 @@ target_link_libraries( kicommon
fmt::fmt
CURL::libcurl
picosha2
sexpr
${ZSTD_LIBRARY}
${wxWidgets_LIBRARIES}
${LIBGIT2_LIBRARIES}
+17
View File
@@ -121,6 +121,8 @@ static const wxChar EnableExtensionSnaps[] = wxT( "EnableExtensionSnaps" );
static const wxChar ExtensionSnapTimeoutMs[] = wxT( "ExtensionSnapTimeoutMs" );
static const wxChar ExtensionSnapActivateOnHover[] = wxT( "ExtensionSnapActivateOnHover" );
static const wxChar EnableSnapAnchorsDebug[] = wxT( "EnableSnapAnchorsDebug" );
static const wxChar SnapHysteresis[] = wxT( "SnapHysteresis" );
static const wxChar SnapToAnchorMargin[] = wxT( "SnapToAnchorMargin" );
static const wxChar MinParallelAngle[] = wxT( "MinParallelAngle" );
static const wxChar HoleWallPaintingMultiplier[] = wxT( "HoleWallPaintingMultiplier" );
static const wxChar MsgPanelShowUuids[] = wxT( "MsgPanelShowUuids" );
@@ -131,6 +133,7 @@ static const wxChar ExcludeFromSimulationLineWidth[] = wxT( "ExcludeFromSimulati
static const wxChar GitIconRefreshInterval[] = wxT( "GitIconRefreshInterval" );
static const wxChar MaxPastedTextLength[] = wxT( "MaxPastedTextLength" );
static const wxChar PNSProcessClusterTimeout[] = wxT( "PNSProcessClusterTimeout" );
static const wxChar FollowBranchTimeout[] = wxT( "FollowBranchTimeoutMs" );
} // namespace KEYS
@@ -301,6 +304,8 @@ ADVANCED_CFG::ADVANCED_CFG()
m_ExtensionSnapTimeoutMs = 500;
m_ExtensionSnapActivateOnHover = true;
m_EnableSnapAnchorsDebug = false;
m_SnapHysteresis = 5;
m_SnapToAnchorMargin = 1.1;
m_MinParallelAngle = 0.001;
m_HoleWallPaintingMultiplier = 1.5;
@@ -318,6 +323,7 @@ ADVANCED_CFG::ADVANCED_CFG()
m_MaxPastedTextLength = 100;
m_PNSProcessClusterTimeout = 100; // Default: 100 ms
m_FollowBranchTimeout = 500; // Default: 500 ms
loadFromConfigFile();
}
@@ -582,6 +588,14 @@ void ADVANCED_CFG::loadSettings( wxConfigBase& aCfg )
&m_EnableSnapAnchorsDebug,
m_EnableSnapAnchorsDebug ) );
configParams.push_back( new PARAM_CFG_INT( true, AC_KEYS::SnapHysteresis,
&m_SnapHysteresis, m_SnapHysteresis,
0, 100 ) );
configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::SnapToAnchorMargin,
&m_SnapToAnchorMargin, m_SnapToAnchorMargin,
1.0, 2.0 ) );
configParams.push_back( new PARAM_CFG_DOUBLE( true, AC_KEYS::MinParallelAngle,
&m_MinParallelAngle, m_MinParallelAngle,
0.0, 45.0 ) );
@@ -619,6 +633,9 @@ void ADVANCED_CFG::loadSettings( wxConfigBase& aCfg )
configParams.push_back( new PARAM_CFG_INT( true, AC_KEYS::PNSProcessClusterTimeout,
&m_PNSProcessClusterTimeout, 100, 10, 10000 ) );
configParams.push_back( new PARAM_CFG_INT( true, AC_KEYS::FollowBranchTimeout,
&m_FollowBranchTimeout, 500, 50, 5000 ) );
// Special case for trace mask setting...we just grab them and set them immediately
// Because we even use wxLogTrace inside of advanced config
wxString traceMasks;
+52
View File
@@ -26,6 +26,7 @@
#include <core/typeinfo.h>
#include <font/text_attributes.h>
#include <layer_ids.h>
#include <pin_type.h>
#include <stroke_params.h>
using namespace kiapi;
@@ -498,3 +499,54 @@ types::StrokeLineStyle ToProtoEnum( LINE_STYLE aValue )
"Unhandled case in ToProtoEnum<LINE_STYLE>");
}
}
template<>
ELECTRICAL_PINTYPE FromProtoEnum( types::ElectricalPinType aValue )
{
switch( aValue )
{
case types::ElectricalPinType::EPT_INPUT: return ELECTRICAL_PINTYPE::PT_INPUT;
case types::ElectricalPinType::EPT_OUTPUT: return ELECTRICAL_PINTYPE::PT_OUTPUT;
case types::ElectricalPinType::EPT_BIDIRECTIONAL: return ELECTRICAL_PINTYPE::PT_BIDI;
case types::ElectricalPinType::EPT_TRISTATE: return ELECTRICAL_PINTYPE::PT_TRISTATE;
case types::ElectricalPinType::EPT_PASSIVE: return ELECTRICAL_PINTYPE::PT_PASSIVE;
case types::ElectricalPinType::EPT_FREE: return ELECTRICAL_PINTYPE::PT_NIC;
case types::ElectricalPinType::EPT_UNSPECIFIED: return ELECTRICAL_PINTYPE::PT_UNSPECIFIED;
case types::ElectricalPinType::EPT_POWER_INPUT: return ELECTRICAL_PINTYPE::PT_POWER_IN;
case types::ElectricalPinType::EPT_POWER_OUTPUT: return ELECTRICAL_PINTYPE::PT_POWER_OUT;
case types::ElectricalPinType::EPT_OPEN_COLLECTOR: return ELECTRICAL_PINTYPE::PT_OPENCOLLECTOR;
case types::ElectricalPinType::EPT_OPEN_EMITTER: return ELECTRICAL_PINTYPE::PT_OPENEMITTER;
case types::ElectricalPinType::EPT_NO_CONNECT: return ELECTRICAL_PINTYPE::PT_NC;
case types::ElectricalPinType::EPT_UNKNOWN:
default:
wxCHECK_MSG( false, ELECTRICAL_PINTYPE::PT_UNSPECIFIED,
"Unhandled case in FromProtoEnum<types::ElectricalPinType>" );
}
}
template<>
types::ElectricalPinType ToProtoEnum( ELECTRICAL_PINTYPE aValue )
{
switch( aValue )
{
case ELECTRICAL_PINTYPE::PT_INPUT: return types::ElectricalPinType::EPT_INPUT;
case ELECTRICAL_PINTYPE::PT_OUTPUT: return types::ElectricalPinType::EPT_OUTPUT;
case ELECTRICAL_PINTYPE::PT_BIDI: return types::ElectricalPinType::EPT_BIDIRECTIONAL;
case ELECTRICAL_PINTYPE::PT_TRISTATE: return types::ElectricalPinType::EPT_TRISTATE;
case ELECTRICAL_PINTYPE::PT_PASSIVE: return types::ElectricalPinType::EPT_PASSIVE;
case ELECTRICAL_PINTYPE::PT_NIC: return types::ElectricalPinType::EPT_FREE;
case ELECTRICAL_PINTYPE::PT_UNSPECIFIED: return types::ElectricalPinType::EPT_UNSPECIFIED;
case ELECTRICAL_PINTYPE::PT_POWER_IN: return types::ElectricalPinType::EPT_POWER_INPUT;
case ELECTRICAL_PINTYPE::PT_POWER_OUT: return types::ElectricalPinType::EPT_POWER_OUTPUT;
case ELECTRICAL_PINTYPE::PT_OPENCOLLECTOR: return types::ElectricalPinType::EPT_OPEN_COLLECTOR;
case ELECTRICAL_PINTYPE::PT_OPENEMITTER: return types::ElectricalPinType::EPT_OPEN_EMITTER;
case ELECTRICAL_PINTYPE::PT_NC: return types::ElectricalPinType::EPT_NO_CONNECT;
// Inherit shouldn't be serialized, it's an internal flag
case ELECTRICAL_PINTYPE::PT_INHERIT:
default:
wxCHECK_MSG( false, types::ElectricalPinType::EPT_UNKNOWN,
"Unhandled case in ToProtoEnum<ELECTRICAL_PINTYPE>");
}
}
+14 -4
View File
@@ -122,10 +122,9 @@ KICOMMON_API void PackPolyLine( types::PolyLine& aOutput, const SHAPE_LINE_CHAIN
if( vertex < 0 )
break;
types::PolyLineNode* node = aOutput.mutable_nodes()->Add();
if( aSlc.IsPtOnArc( vertex ) )
if( aSlc.IsArcStart( vertex ) )
{
types::PolyLineNode* node = aOutput.mutable_nodes()->Add();
const SHAPE_ARC& arc = aSlc.Arc( aSlc.ArcIndex( vertex ) );
node->mutable_arc()->mutable_start()->set_x_nm( arc.GetP0().x );
node->mutable_arc()->mutable_start()->set_y_nm( arc.GetP0().y );
@@ -134,8 +133,9 @@ KICOMMON_API void PackPolyLine( types::PolyLine& aOutput, const SHAPE_LINE_CHAIN
node->mutable_arc()->mutable_end()->set_x_nm( arc.GetP1().x );
node->mutable_arc()->mutable_end()->set_y_nm( arc.GetP1().y );
}
else
else if( !aSlc.IsPtOnArc( vertex ) )
{
types::PolyLineNode* node = aOutput.mutable_nodes()->Add();
node->mutable_point()->set_x_nm( aSlc.CPoint( vertex ).x );
node->mutable_point()->set_y_nm( aSlc.CPoint( vertex ).y );
}
@@ -241,4 +241,14 @@ KICOMMON_API void PackSheetPath( types::SheetPath& aOutput, const KIID_PATH& aIn
aOutput.add_path()->set_value( entry.AsStdString() );
}
KICOMMON_API KIID_PATH UnpackSheetPath( const types::SheetPath& aInput )
{
KIID_PATH output;
for( const types::KIID& sheet : aInput.path() )
output.push_back( KIID( sheet.value() ) );
return output;
}
} // namespace kiapi::common
+32 -3
View File
@@ -37,7 +37,11 @@ static bool schemeNonUnitColsStartAt0( ARRAY_AXIS::NUMBERING_TYPE type )
}
ARRAY_AXIS::ARRAY_AXIS() : m_type( NUMBERING_TYPE::NUMBERING_NUMERIC ), m_offset( 0 ), m_step( 1 )
ARRAY_AXIS::ARRAY_AXIS() :
m_type( NUMBERING_TYPE::NUMBERING_NUMERIC ),
m_offset( 0 ),
m_step( 1 ),
m_useLowercase( false )
{
}
@@ -76,7 +80,14 @@ std::optional<int> ARRAY_AXIS::getNumberingOffset( const wxString& str ) const
for( unsigned i = 0; i < str.length(); i++ )
{
int chIndex = alphabet.Find( str[i], false );
wxUniChar ch = str[i];
// For alphabetic types, convert to uppercase for lookup since our alphabets
// are defined with uppercase letters. This allows users to enter lowercase.
if( !TypeIsNumeric( m_type ) && ch >= 'a' && ch <= 'z' )
ch = ch - 'a' + 'A';
int chIndex = alphabet.Find( ch, false );
if( chIndex == wxNOT_FOUND )
return std::optional<int>{};
@@ -109,6 +120,18 @@ bool ARRAY_AXIS::SetOffset( const wxString& aOffsetName )
if( !offset )
return false;
// For alphabetic types, check if the user entered lowercase letters.
// If so, we'll output lowercase letters as well.
if( !TypeIsNumeric( m_type ) && !aOffsetName.IsEmpty() )
{
wxUniChar firstChar = aOffsetName[0];
m_useLowercase = ( firstChar >= 'a' && firstChar <= 'z' );
}
else
{
m_useLowercase = false;
}
SetOffset( *offset );
return true;
}
@@ -140,5 +163,11 @@ wxString ARRAY_AXIS::GetItemNumber( int n ) const
n = m_offset + m_step * n;
return AlphabeticFromIndex( n, alphabet, nonUnitColsStartAt0 );
wxString result = AlphabeticFromIndex( n, alphabet, nonUnitColsStartAt0 );
// If the user entered a lowercase starting value, output lowercase letters
if( m_useLowercase )
result = result.Lower();
return result;
}
+2 -1
View File
@@ -450,7 +450,8 @@ void BITMAP_BASE::Rotate( bool aRotateCCW )
int resY = m_image->GetOptionInt( wxIMAGE_OPTION_RESOLUTIONY );
int unit = m_image->GetOptionInt( wxIMAGE_OPTION_RESOLUTIONUNIT );
*m_image = m_image->Rotate90( aRotateCCW );
// wxImage::Rotate90 parameter is "clockwise", so invert for CCW rotation
*m_image = m_image->Rotate90( !aRotateCCW );
m_image->SetOption( wxIMAGE_OPTION_RESOLUTIONUNIT, unit );
m_image->SetOption( wxIMAGE_OPTION_RESOLUTIONX, resX );
+7 -1
View File
@@ -909,7 +909,13 @@ static void buildKicadAboutBanner( EDA_BASE_FRAME* aParent, ABOUT_APP_INFO& aInf
#define FOOTPRINT_LIB_CONTRIBUTION _( "Footprints" )
aInfo.AddLibrarian( new CONTRIBUTOR( wxS( "Scripts by Maui" ),
MODELS_3D_CONTRIBUTION,
wxS( "https://gitlab.com/kicad/libraries/kicad-footprint-generator" ) ) );
wxS( "https://github.com/easyw" ) ) );
aInfo.AddLibrarian( new CONTRIBUTOR( wxS( "Hasan Yavuz Özderya" ),
MODELS_3D_CONTRIBUTION,
wxS( "https://bitbucket.org/hyOzd/freecad-macros/src/master/" ) ) );
aInfo.AddLibrarian( new CONTRIBUTOR( wxS( "GitHub contributors" ),
MODELS_3D_CONTRIBUTION,
wxS( "https://github.com/easyw/kicad-3d-models-in-freecad/graphs/contributors" ) ) );
aInfo.AddLibrarian( new CONTRIBUTOR( wxS( "GitLab contributors" ),
MODELS_3D_CONTRIBUTION,
wxS( "https://gitlab.com/kicad/libraries/kicad-packages3D/-/graphs/master" ) ) );
+15 -1
View File
@@ -752,7 +752,10 @@ void DIALOG_SHIM::OnCharHook( wxKeyEvent& aEvt )
for( size_t i = 0; i < m_tabOrder.size(); ++i )
{
if( m_tabOrder[i] == currentWindow )
// Check for exact match or if currentWindow is a child of the control
// (e.g., the text entry inside a wxComboBox)
if( m_tabOrder[i] == currentWindow
|| ( currentWindow && m_tabOrder[i]->IsDescendant( currentWindow ) ) )
{
currentIdx = (int) i;
break;
@@ -763,6 +766,17 @@ void DIALOG_SHIM::OnCharHook( wxKeyEvent& aEvt )
{
advance( currentIdx );
// Skip hidden or disabled controls
int startIdx = currentIdx;
while( !m_tabOrder[currentIdx]->IsShown() || !m_tabOrder[currentIdx]->IsEnabled() )
{
advance( currentIdx );
if( currentIdx == startIdx )
break; // Avoid infinite loop if all controls are hidden
}
//todo: We don't currently have non-textentry dialog boxes but this will break if
// we add them.
#ifdef __APPLE__
+3 -1
View File
@@ -39,7 +39,8 @@ DIALOG_LIST_HOTKEYS::DIALOG_LIST_HOTKEYS( EDA_BASE_FRAME* aParent ):
wxBoxSizer* main_sizer = new wxBoxSizer( wxVERTICAL );
KIFACE* kiface = nullptr;
m_hk_list = new PANEL_HOTKEYS_EDITOR( aParent, this, true );
m_hk_list = new PANEL_HOTKEYS_EDITOR( aParent, this );
m_hk_list->SetIncludeGestures( true );
wxWindow* kicadMgr_window = wxWindow::FindWindowByName( KICAD_MANAGER_FRAME_NAME );
@@ -71,6 +72,7 @@ DIALOG_LIST_HOTKEYS::DIALOG_LIST_HOTKEYS( EDA_BASE_FRAME* aParent ):
wxStdDialogButtonSizer* sdb_sizer = new wxStdDialogButtonSizer;
sdb_sizer->AddButton( new wxButton( this, wxID_OK ) );
sdb_sizer->AddButton( new wxButton( this, wxID_CANCEL ) );
sdb_sizer->Realize();
main_sizer->Add( sdb_sizer, 0, wxEXPAND | wxALL, margin );
+2 -1
View File
@@ -36,7 +36,8 @@
EDA_VIEW_SWITCHER::EDA_VIEW_SWITCHER( wxWindow* aParent, const wxArrayString& aItems,
wxKeyCode aCtrlKey ) :
EDA_VIEW_SWITCHER_BASE( aParent ),
m_tabState( true ),
// Start with the tab marked as "up" so the initial ctrl-tab press advances selection.
m_tabState( false ),
m_receivingEvents( false ),
m_ctrlKey( aCtrlKey )
{
+32 -10
View File
@@ -90,8 +90,12 @@ void EMBEDDED_FILES_GRID_TRICKS::doPopupSelection( wxCommandEvent& event )
/* ---------- End of GRID_TRICKS for embedded files grid ---------- */
PANEL_EMBEDDED_FILES::PANEL_EMBEDDED_FILES( wxWindow* parent, EMBEDDED_FILES* aFiles ) :
PANEL_EMBEDDED_FILES_BASE( parent ), m_files( aFiles ), m_localFiles( new EMBEDDED_FILES() )
PANEL_EMBEDDED_FILES::PANEL_EMBEDDED_FILES( wxWindow* aParent, EMBEDDED_FILES* aFiles, int aFlags,
std::vector<const EMBEDDED_FILES*> aInheritedFiles ) :
PANEL_EMBEDDED_FILES_BASE( aParent ),
m_files( aFiles ),
m_localFiles( new EMBEDDED_FILES() ),
m_inheritedFiles( std::move( aInheritedFiles ) )
{
for( auto& [name, file] : m_files->EmbeddedFileMap() )
{
@@ -99,6 +103,19 @@ PANEL_EMBEDDED_FILES::PANEL_EMBEDDED_FILES( wxWindow* parent, EMBEDDED_FILES* aF
m_localFiles->AddFile( newFile );
}
for( const EMBEDDED_FILES* inheritedFiles : m_inheritedFiles )
{
for( auto& [name, file] : inheritedFiles->EmbeddedFileMap() )
{
if( m_localFiles->HasFile( name ) )
continue;
EMBEDDED_FILES::EMBEDDED_FILE* newFile = new EMBEDDED_FILES::EMBEDDED_FILE( *file );
m_localFiles->AddFile( newFile );
m_inheritedFileNames.insert( name );
}
}
// Set up the standard buttons
m_delete_button->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
m_browse_button->SetBitmap( KiBitmapBundle( BITMAPS::small_folder ) );
@@ -131,6 +148,7 @@ PANEL_EMBEDDED_FILES::~PANEL_EMBEDDED_FILES()
{
// Remove the GRID_TRICKS handler
m_files_grid->PopEventHandler( true );
delete m_localFiles;
}
@@ -242,6 +260,9 @@ bool PANEL_EMBEDDED_FILES::TransferDataFromWindow()
for( auto& file : files )
{
if( m_inheritedFileNames.count( file->name ) )
continue;
m_files->AddFile( file );
m_localFiles->RemoveFile( file->name, false );
}
@@ -378,6 +399,14 @@ bool PANEL_EMBEDDED_FILES::RemoveEmbeddedFile( const wxString& aFileName )
if( name.StartsWith( FILEEXT::KiCadUriPrefix ) )
name = name.Mid( FILEEXT::KiCadUriPrefix.size() + 3 );
if( m_inheritedFileNames.count( name ) )
{
wxString msg = _( "Embedded files inherited from a parent symbol cannot be removed." );
DisplayErrorMessage( this, msg );
return false;
}
int row = std::max( 0, m_files_grid->GetGridCursorRow() );
for( int ii = 0; ii < m_files_grid->GetNumberRows(); ii++ )
@@ -409,14 +438,7 @@ void PANEL_EMBEDDED_FILES::onDeleteEmbeddedFile( wxCommandEvent& event )
wxString name = m_files_grid->GetCellValue( row, 0 );
m_localFiles->RemoveFile( name );
m_files_grid->DeleteRows( row );
if( row < m_files_grid->GetNumberRows() )
m_files_grid->SetGridCursor( row, 0 );
else if( m_files_grid->GetNumberRows() > 0 )
m_files_grid->SetGridCursor( m_files_grid->GetNumberRows() - 1, 0 );
RemoveEmbeddedFile( name );
}
+7 -1
View File
@@ -24,6 +24,9 @@
#ifndef PANEL_EMBEDDED_FILES_H
#define PANEL_EMBEDDED_FILES_H
#include <set>
#include <vector>
#include <embedded_files.h>
#include "panel_embedded_files_base.h"
@@ -55,7 +58,8 @@ protected:
class PANEL_EMBEDDED_FILES : public PANEL_EMBEDDED_FILES_BASE
{
public:
PANEL_EMBEDDED_FILES( wxWindow* parent, EMBEDDED_FILES* aFiles );
PANEL_EMBEDDED_FILES( wxWindow* aParent, EMBEDDED_FILES* aFiles, int aFlags = 0,
std::vector<const EMBEDDED_FILES*> aInheritedFiles = {} );
~PANEL_EMBEDDED_FILES() override;
bool TransferDataFromWindow() override;
@@ -79,6 +83,8 @@ private:
EMBEDDED_FILES* m_files;
EMBEDDED_FILES* m_localFiles;
std::vector<const EMBEDDED_FILES*> m_inheritedFiles;
std::set<wxString> m_inheritedFileNames;
};
+5 -10
View File
@@ -65,11 +65,10 @@ static wxSearchCtrl* CreateTextFilterBox( wxWindow* aParent, const wxString& aDe
}
PANEL_HOTKEYS_EDITOR::PANEL_HOTKEYS_EDITOR( EDA_BASE_FRAME* aFrame, wxWindow* aWindow,
bool aReadOnly ) :
PANEL_HOTKEYS_EDITOR::PANEL_HOTKEYS_EDITOR( EDA_BASE_FRAME* aFrame, wxWindow* aWindow ) :
RESETTABLE_PANEL( aWindow, wxID_ANY, wxDefaultPosition, wxDefaultSize ),
m_frame( aFrame ),
m_readOnly( aReadOnly ),
m_includeGestures( false ),
m_hotkeyStore()
{
wxBoxSizer* mainSizer = new wxBoxSizer( wxVERTICAL );
@@ -78,11 +77,10 @@ PANEL_HOTKEYS_EDITOR::PANEL_HOTKEYS_EDITOR( EDA_BASE_FRAME* aFrame, wxWindow* aW
m_filterSearch = CreateTextFilterBox( this, _( "Type filter text" ) );
bMargins->Add( m_filterSearch, 0, wxEXPAND | wxTOP | wxRIGHT, 5 );
m_hotkeyListCtrl = new WIDGET_HOTKEY_LIST( this, m_hotkeyStore, m_readOnly );
m_hotkeyListCtrl = new WIDGET_HOTKEY_LIST( this, m_hotkeyStore );
bMargins->Add( m_hotkeyListCtrl, 1, wxEXPAND | wxTOP | wxRIGHT, 5 );
if( !m_readOnly )
installButtons( bMargins );
installButtons( bMargins );
mainSizer->Add( bMargins, 1, wxEXPAND, 0 );
@@ -166,7 +164,7 @@ void PANEL_HOTKEYS_EDITOR::installButtons( wxSizer* aSizer )
bool PANEL_HOTKEYS_EDITOR::TransferDataToWindow()
{
m_hotkeyStore.Init( m_actions, m_readOnly );
m_hotkeyStore.Init( m_actions, m_includeGestures );
if( !m_hotkeyListCtrl->TransferDataToControl() )
return false;
@@ -177,9 +175,6 @@ bool PANEL_HOTKEYS_EDITOR::TransferDataToWindow()
bool PANEL_HOTKEYS_EDITOR::TransferDataFromWindow()
{
if( m_readOnly )
return true;
if( !m_hotkeyListCtrl->TransferDataFromControl() )
return false;
+6
View File
@@ -626,6 +626,12 @@ void EDA_DRAW_PANEL_GAL::onLostFocus( wxFocusEvent& aEvent )
m_viewControls->CancelDrag();
// Reset the tool dispatcher's button state when focus is lost. This prevents
// the dispatcher from thinking the button is still pressed when focus returns,
// which can cause selection and drag operations to stop working.
if( m_eventDispatcher )
m_eventDispatcher->ResetState();
aEvent.Skip();
}
+7 -1
View File
@@ -220,6 +220,12 @@ wxWindow* EDA_BASE_FRAME::findQuasiModalDialog()
void EDA_BASE_FRAME::windowClosing( wxCloseEvent& event )
{
// Guard against re-entrant close events. GTK can deliver a second wxEVT_CLOSE_WINDOW
// while we are still processing the first one (e.g. during Destroy() calls), which leads
// to use-after-free crashes when child objects have already been torn down.
if( m_isClosing )
return;
// Don't allow closing when a quasi-modal is open.
wxWindow* quasiModal = findQuasiModalDialog();
@@ -1064,7 +1070,7 @@ void EDA_BASE_FRAME::ShowPreferences( wxString aStartPage, wxString aStartParent
WX_BUSY_INDICATOR busy_cursor;
WX_TREEBOOK* book = dlg.GetTreebook();
PANEL_HOTKEYS_EDITOR* hotkeysPanel = new PANEL_HOTKEYS_EDITOR( this, book, false );
PANEL_HOTKEYS_EDITOR* hotkeysPanel = new PANEL_HOTKEYS_EDITOR( this, book );
KIFACE* kiface = nullptr;
std::vector<int> expand;
+17 -17
View File
@@ -318,7 +318,7 @@ void EDA_DRAW_FRAME::CommonSettingsChanged( int aFlags )
m_galDisplayOptions.ReadCommonConfig( *settings, this );
GetToolManager()->RunAction( ACTIONS::gridPreset, config()->m_Window.grid.last_size_idx );
GetToolManager()->RunAction( ACTIONS::gridPreset, GetWindowSettings( config() )->grid.last_size_idx );
UpdateGridSelectBox();
if( m_lastToolbarIconSize == 0
@@ -373,7 +373,7 @@ void EDA_DRAW_FRAME::UpdateGridSelectBox()
wxCHECK( config(), /* void */ );
GRID_MENU::BuildChoiceList( &gridsList, config(), this );
GRID_MENU::BuildChoiceList( &gridsList, GetWindowSettings( config() ), this );
for( const wxString& grid : gridsList )
m_gridSelectBox->Append( grid );
@@ -381,7 +381,7 @@ void EDA_DRAW_FRAME::UpdateGridSelectBox()
m_gridSelectBox->Append( wxT( "---" ) );
m_gridSelectBox->Append( _( "Edit Grids..." ) );
m_gridSelectBox->SetSelection( config()->m_Window.grid.last_size_idx );
m_gridSelectBox->SetSelection( GetWindowSettings( config() )->grid.last_size_idx );
}
@@ -394,7 +394,7 @@ void EDA_DRAW_FRAME::OnUpdateSelectGrid( wxUpdateUIEvent& aEvent )
wxCHECK( config(), /* void */ );
int idx = config()->m_Window.grid.last_size_idx;
int idx = GetWindowSettings( config() )->grid.last_size_idx;
idx = std::clamp( idx, 0, (int) m_gridSelectBox->GetCount() - 1 );
if( idx != m_gridSelectBox->GetSelection() )
@@ -414,10 +414,10 @@ void EDA_DRAW_FRAME::OnUpdateSelectZoom( wxUpdateUIEvent& aEvent )
wxCHECK( config(), /* void */ );
const std::vector<double>& zoomList = config()->m_Window.zoom_factors;
int curr_selection = m_zoomSelectBox->GetSelection();
int new_selection = 0; // select zoom auto
double last_approx = 1e9; // large value to start calculation
const std::vector<double>& zoomList = GetWindowSettings( config() )->zoom_factors;
int curr_selection = m_zoomSelectBox->GetSelection();
int new_selection = 0; // select zoom auto
double last_approx = 1e9; // large value to start calculation
// Search for the nearest available value to the current zoom setting, and select it
for( size_t jj = 0; jj < zoomList.size(); ++jj )
@@ -484,11 +484,11 @@ void EDA_DRAW_FRAME::OnSelectGrid( wxCommandEvent& event )
}
bool EDA_DRAW_FRAME::IsGridVisible() const
bool EDA_DRAW_FRAME::IsGridVisible()
{
wxCHECK( config(), true );
return config()->m_Window.grid.show;
return GetWindowSettings( config() )->grid.show;
}
@@ -496,7 +496,7 @@ void EDA_DRAW_FRAME::SetGridVisibility( bool aVisible )
{
wxCHECK( config(), /* void */ );
config()->m_Window.grid.show = aVisible;
GetWindowSettings( config() )->grid.show = aVisible;
// Update the display with the new grid
if( GetCanvas() )
@@ -514,11 +514,11 @@ void EDA_DRAW_FRAME::SetGridVisibility( bool aVisible )
}
bool EDA_DRAW_FRAME::IsGridOverridden() const
bool EDA_DRAW_FRAME::IsGridOverridden()
{
wxCHECK( config(), false );
return config()->m_Window.grid.overrides_enabled;
return GetWindowSettings( config() )->grid.overrides_enabled;
}
@@ -526,7 +526,7 @@ void EDA_DRAW_FRAME::SetGridOverrides( bool aOverride )
{
wxCHECK( config(), /* void */ );
config()->m_Window.grid.overrides_enabled = aOverride;
GetWindowSettings( config() )->grid.overrides_enabled = aOverride;
}
@@ -549,14 +549,14 @@ void EDA_DRAW_FRAME::UpdateZoomSelectBox()
wxCHECK( config(), /* void */ );
for( unsigned i = 0; i < config()->m_Window.zoom_factors.size(); ++i )
for( unsigned ii = 0; ii < GetWindowSettings( config() )->zoom_factors.size(); ++ii )
{
double current = config()->m_Window.zoom_factors[i];
double current = GetWindowSettings( config() )->zoom_factors[ii];
m_zoomSelectBox->Append( wxString::Format( _( "Zoom %.2f" ), current ) );
if( zoom == current )
m_zoomSelectBox->SetSelection( i + 1 );
m_zoomSelectBox->SetSelection( ii + 1 );
}
}
+3 -3
View File
@@ -189,14 +189,14 @@ void EDA_TEXT::Serialize( google::protobuf::Any &aContainer ) const
using namespace kiapi::common;
types::Text text;
text.set_text( GetText().ToStdString() );
text.set_hyperlink( GetHyperlink().ToStdString() );
text.set_text( GetText().ToUTF8() );
text.set_hyperlink( GetHyperlink().ToUTF8() );
PackVector2( *text.mutable_position(), GetTextPos() );
types::TextAttributes* attrs = text.mutable_attributes();
if( GetFont() )
attrs->set_font_name( GetFont()->GetName().ToStdString() );
attrs->set_font_name( GetFont()->GetName().ToUTF8() );
attrs->set_horizontal_alignment(
ToProtoEnum<GR_TEXT_H_ALIGN_T, types::HorizontalAlignment>( GetHorizJustify() ) );
+15
View File
@@ -591,6 +591,21 @@ EMBEDDED_FILES::EMBEDDED_FILES( const EMBEDDED_FILES& other ) :
}
EMBEDDED_FILES::EMBEDDED_FILES( const EMBEDDED_FILES& other, bool aDeepCopy ) :
m_embedFonts( other.m_embedFonts )
{
if( aDeepCopy )
{
for( const auto& [name, file] : other.m_files )
m_files[name] = new EMBEDDED_FILE( *file );
m_fontFiles = other.m_fontFiles;
}
m_fileAddedCallback = other.m_fileAddedCallback;
}
// Copy assignment operator
EMBEDDED_FILES& EMBEDDED_FILES::operator=( const EMBEDDED_FILES& other )
{
+2 -7
View File
@@ -355,7 +355,7 @@ VECTOR2I OUTLINE_FONT::getTextAsGlyphsUnlocked( BOX2I* aBBox,
// contents
hb_font_t* referencedFont = hb_ft_font_create_referenced( face );
hb_ft_font_set_funcs( referencedFont );
hb_shape( referencedFont, buf, nullptr, 0 );
unsigned int glyphCount;
@@ -376,10 +376,6 @@ VECTOR2I OUTLINE_FONT::getTextAsGlyphsUnlocked( BOX2I* aBBox,
for( unsigned int i = 0; i < glyphCount; i++ )
{
// Don't process glyphs that were already included in a previous cluster
if( i > 0 && glyphInfo[i].cluster == glyphInfo[i-1].cluster )
continue;
if( aGlyphs )
{
GLYPH_CACHE_KEY key = { face, glyphInfo[i].codepoint, scaleFactor, m_forDrawingSheet,
@@ -557,9 +553,8 @@ void OUTLINE_FONT::RenderToOpenGLCanvas( KIGFX::OPENGL_GAL& aGal, const wxString
std::lock_guard<std::mutex> guard( m_freeTypeMutex );
hb_font_t* referencedFont = hb_ft_font_create_referenced( m_face );
hb_font_t* referencedFont = hb_ft_font_create_referenced( m_face );
hb_ft_font_set_funcs( referencedFont );
hb_shape( referencedFont, buf, nullptr, 0 );
const double mirror_factor = ( aIsMirrored ? 1 : -1 );
+5
View File
@@ -29,6 +29,7 @@
#include <wx/image.h>
#include <wx/log.h>
#include <wx/dcclient.h>
#include <gal/cairo/cairo_gal.h>
#include <gal/cairo/cairo_compositor.h>
@@ -1650,6 +1651,10 @@ void CAIRO_GAL::setCompositor()
void CAIRO_GAL::onPaint( wxPaintEvent& aEvent )
{
// A wxPaintDC must be created in wxEVT_PAINT handlers. Without this, the system keeps
// sending paint events because it thinks the window still needs to be painted, causing
// high CPU usage in fallback mode (Cairo).
wxPaintDC dc( this );
PostPaint( aEvent );
}
+145 -80
View File
@@ -38,12 +38,15 @@
#include <string_utils.h>
#include <launch_ext.h>
#include "wx/tokenzr.h"
#include <sexpr/sexpr.h>
#include <sexpr/sexpr_parser.h>
#include <wx/wfstream.h>
#include <wx/fs_zip.h>
#include <wx/zipstrm.h>
#include <filesystem>
#include <core/kicad_algo.h>
void QuoteString( wxString& string )
{
@@ -302,6 +305,79 @@ void KiCopyFile( const wxString& aSrcPath, const wxString& aDestPath, wxString&
}
static void traverseSEXPR( SEXPR::SEXPR* aNode, const std::function<void( SEXPR::SEXPR* )>& aVisitor )
{
aVisitor( aNode );
if( aNode->IsList() )
{
for( unsigned i = 0; i < aNode->GetNumberOfChildren(); i++ )
traverseSEXPR( aNode->GetChild( i ), aVisitor );
}
}
void CopySexprFile( const wxString& aSrcPath, const wxString& aDestPath,
std::function<bool( const std::string& token, wxString& value )> aCallback,
wxString& aErrors )
{
bool success = false;
try
{
SEXPR::PARSER parser;
std::unique_ptr<SEXPR::SEXPR> sexpr( parser.ParseFromFile( TO_UTF8( aSrcPath ) ) );
traverseSEXPR( sexpr.get(),
[&]( SEXPR::SEXPR* node )
{
if( node->IsList() && node->GetNumberOfChildren() > 1 && node->GetChild( 0 )->IsSymbol() )
{
std::string token = node->GetChild( 0 )->GetSymbol();
SEXPR::SEXPR_STRING* pathNode = dynamic_cast<SEXPR::SEXPR_STRING*>( node->GetChild( 1 ) );
SEXPR::SEXPR_SYMBOL* symNode = dynamic_cast<SEXPR::SEXPR_SYMBOL*>( node->GetChild( 1 ) );
wxString path;
if( pathNode )
path = pathNode->m_value;
else if( symNode )
path = symNode->m_value;
if( aCallback( token, path ) )
{
if( pathNode )
pathNode->m_value = path;
else if( symNode )
symNode->m_value = path;
}
}
} );
wxFFile destFile( aDestPath, "wb" );
if( destFile.IsOpened() )
success = destFile.Write( sexpr->AsString( 0 ) );
// wxFFile dtor will close the file
}
catch( ... )
{
success = false;
}
if( !success )
{
wxString msg;
if( !aErrors.empty() )
aErrors += wxS( "\n" );
msg.Printf( _( "Cannot copy file '%s'." ), aDestPath );
aErrors += msg;
}
}
wxString QuoteFullPath( wxFileName& fn, wxPathFormat format )
{
return wxT( "\"" ) + fn.GetFullPath( format ) + wxT( "\"" );
@@ -347,8 +423,7 @@ bool RmDirRecursive( const wxString& aFileName, wxString* aErrors )
catch( const fs::filesystem_error& e )
{
if( aErrors )
*aErrors = wxString::Format( _( "Error removing directory '%s': %s" ),
aFileName, e.what() );
*aErrors = wxString::Format( _( "Error removing directory '%s': %s" ), aFileName, e.what() );
return false;
}
@@ -357,7 +432,8 @@ bool RmDirRecursive( const wxString& aFileName, wxString* aErrors )
}
bool CopyDirectory( const wxString& aSourceDir, const wxString& aDestDir, wxString& aErrors )
bool CopyDirectory( const wxString& aSourceDir, const wxString& aDestDir,
const std::vector<wxString>& aPathsWithOverwriteDisallowed, wxString& aErrors )
{
wxDir dir( aSourceDir );
@@ -380,23 +456,25 @@ bool CopyDirectory( const wxString& aSourceDir, const wxString& aDestDir, wxStri
while( cont )
{
wxString sourcePath = aSourceDir + wxFileName::GetPathSeparator() + filename;
wxString sourcePath = dir.GetNameWithSep() + filename;
wxString destPath = aDestDir + wxFileName::GetPathSeparator() + filename;
if( wxFileName::DirExists( sourcePath ) )
{
// Recursively copy subdirectories
if( !CopyDirectory( sourcePath, destPath, aErrors ) )
if( !CopyDirectory( sourcePath, destPath, aPathsWithOverwriteDisallowed, aErrors ) )
return false;
}
else
{
// Copy files
if( !wxCopyFile( sourcePath, destPath ) )
if( alg::contains( aPathsWithOverwriteDisallowed, sourcePath ) && wxFileExists( destPath ) )
{
aErrors += wxString::Format( _( "Could not copy file: %s to %s" ),
sourcePath,
destPath );
// Presumably user does not want an error on a no-overwrite condition....
}
else if( !wxCopyFile( sourcePath, destPath ) )
{
aErrors += wxString::Format( _( "Could not copy file: %s to %s" ), sourcePath, destPath );
return false;
}
}
@@ -408,8 +486,8 @@ bool CopyDirectory( const wxString& aSourceDir, const wxString& aDestDir, wxStri
}
bool CopyFilesOrDirectory( const wxString& aSourcePath, const wxString& aDestDir, wxString& aErrors,
int& aFileCopiedCount, const std::vector<wxString>& aExclusions )
bool CopyFilesOrDirectory( const wxString& aSourcePath, const wxString& aDestDir, bool aAllowOverwrites,
wxString& aErrors, std::vector<wxString>& aPathsWritten )
{
// Parse source path and determine if it's a directory
wxFileName sourceFn( aSourcePath );
@@ -417,85 +495,72 @@ bool CopyFilesOrDirectory( const wxString& aSourcePath, const wxString& aDestDir
bool isSourceDirectory = wxFileName::DirExists( sourcePath );
wxString baseDestDir = aDestDir;
auto performCopy = [&]( const wxString& src, const wxString& dest ) -> bool
{
if( wxCopyFile( src, dest ) )
{
aFileCopiedCount++;
return true;
}
aErrors += wxString::Format( _( "Could not copy file: %s to %s" ), src, dest );
aErrors += wxT( "\n" );
return false;
};
auto processEntries = [&]( const wxString& srcDir, const wxString& pattern,
const wxString& destDir ) -> bool
{
wxDir dir( srcDir );
if( !dir.IsOpened() )
{
aErrors += wxString::Format( _( "Could not open source directory: %s" ), srcDir );
aErrors += wxT( "\n" );
return false;
}
wxString filename;
bool success = true;
// Find all entries matching pattern (files + directories + hidden items)
bool cont = dir.GetFirst( &filename, pattern, wxDIR_FILES | wxDIR_DIRS | wxDIR_HIDDEN );
while( cont )
{
const wxString entrySrc = srcDir + wxFileName::GetPathSeparator() + filename;
const wxString entryDest = destDir + wxFileName::GetPathSeparator() + filename;
// Apply exclusion filters
bool exclude =
filename.Matches( wxT( "~*.lck" ) ) || filename.Matches( wxT( "*.lck" ) );
for( const auto& exclusion : aExclusions )
auto performCopy =
[&]( const wxString& src, const wxString& dest ) -> bool
{
if( entrySrc.Matches( exclusion ) )
if( wxCopyFile( src, dest, aAllowOverwrites ) )
{
exclude = true;
break;
aPathsWritten.push_back( dest );
return true;
}
}
if( !exclude )
aErrors += wxString::Format( _( "Could not copy file: %s to %s" ), src, dest );
aErrors += wxT( "\n" );
return false;
};
auto processEntries =
[&]( const wxString& srcDir, const wxString& pattern, const wxString& destDir ) -> bool
{
if( wxFileName::DirExists( entrySrc ) )
wxDir dir( srcDir );
if( !dir.IsOpened() )
{
// Recursively process subdirectories
if( !CopyFilesOrDirectory( entrySrc, destDir, aErrors, aFileCopiedCount,
aExclusions ) )
{
aErrors += wxString::Format( _( "Could not copy directory: %s to %s" ),
entrySrc, entryDest );
aErrors += wxT( "\n" );
success = false;
}
aErrors += wxString::Format( _( "Could not open source directory: %s" ), srcDir );
aErrors += wxT( "\n" );
return false;
}
else
wxString filename;
bool success = true;
// Find all entries matching pattern (files + directories + hidden items)
bool cont = dir.GetFirst( &filename, pattern, wxDIR_FILES | wxDIR_DIRS | wxDIR_HIDDEN );
while( cont )
{
// Copy individual files
if( !performCopy( entrySrc, entryDest ) )
const wxString entrySrc = srcDir + wxFileName::GetPathSeparator() + filename;
const wxString entryDest = destDir + wxFileName::GetPathSeparator() + filename;
if( !filename.Matches( wxT( "~*.lck" ) ) && !filename.Matches( wxT( "*.lck" ) ) )
{
success = false;
if( wxFileName::DirExists( entrySrc ) )
{
// Recursively process subdirectories
if( !CopyFilesOrDirectory( entrySrc, destDir, aAllowOverwrites, aErrors, aPathsWritten ) )
{
aErrors += wxString::Format( _( "Could not copy directory: %s to %s" ),
entrySrc, entryDest );
aErrors += wxT( "\n" );
success = false;
}
}
else
{
// Copy individual files
if( !performCopy( entrySrc, entryDest ) )
{
success = false;
}
}
}
cont = dir.GetNext( &filename );
}
}
cont = dir.GetNext( &filename );
}
return success;
};
return success;
};
// If copying a directory, append its name to destination path
if( isSourceDirectory )
@@ -507,8 +572,7 @@ bool CopyFilesOrDirectory( const wxString& aSourcePath, const wxString& aDestDir
// Create destination directory hierarchy
if( !wxFileName::Mkdir( baseDestDir, wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL ) )
{
aErrors +=
wxString::Format( _( "Could not create destination directory: %s" ), baseDestDir );
aErrors += wxString::Format( _( "Could not create destination directory: %s" ), baseDestDir );
aErrors += wxT( "\n" );
return false;
@@ -531,6 +595,7 @@ bool CopyFilesOrDirectory( const wxString& aSourcePath, const wxString& aDestDir
return false;
}
// Process all matching files in source directory
return processEntries( dirPath, fileName, baseDestDir );
}
+50
View File
@@ -378,6 +378,14 @@ PullResult GIT_PULL_HANDLER::handleFastForward()
PullResult GIT_PULL_HANDLER::handleMerge( const git_annotated_commit** aMergeHeads,
size_t aMergeHeadsCount )
{
if( hasUnstagedChanges( GetRepo() ) )
{
AddErrorString(
_( "Cannot merge: you have unstaged changes. "
"Please commit or stash them before pulling." ) );
return PullResult::DirtyWorkdir;
}
git_merge_options merge_opts;
git_merge_options_init( &merge_opts, GIT_MERGE_OPTIONS_VERSION );
@@ -481,6 +489,14 @@ PullResult GIT_PULL_HANDLER::handleMerge( const git_annotated_commit** aMergeHea
PullResult GIT_PULL_HANDLER::handleRebase( const git_annotated_commit** aMergeHeads, size_t aMergeHeadsCount )
{
if( hasUnstagedChanges( GetRepo() ) )
{
AddErrorString(
_( "Cannot rebase: you have unstaged changes. "
"Please commit or stash them before pulling." ) );
return PullResult::DirtyWorkdir;
}
// Get the current branch reference
git_reference* head_ref = nullptr;
@@ -563,6 +579,40 @@ PullResult GIT_PULL_HANDLER::handleRebase( const git_annotated_commit** aMergeHe
}
bool GIT_PULL_HANDLER::hasUnstagedChanges( git_repository* aRepo )
{
if( !aRepo )
return false;
git_status_options opts;
git_status_init_options( &opts, GIT_STATUS_OPTIONS_VERSION );
opts.show = GIT_STATUS_SHOW_WORKDIR_ONLY;
opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED;
git_status_list* status_list = nullptr;
if( git_status_list_new( &status_list, aRepo, &opts ) != GIT_OK )
{
wxLogTrace( traceGit, "Failed to get status list: %s", KIGIT_COMMON::GetLastGitError() );
return false;
}
KIGIT::GitStatusListPtr status_list_ptr( status_list );
size_t count = git_status_list_entrycount( status_list );
for( size_t ii = 0; ii < count; ++ii )
{
const git_status_entry* entry = git_status_byindex( status_list, ii );
if( entry->status & ( GIT_STATUS_WT_MODIFIED | GIT_STATUS_WT_DELETED | GIT_STATUS_WT_TYPECHANGE ) )
return true;
}
return false;
}
void GIT_PULL_HANDLER::UpdateProgress( int aCurrent, int aTotal, const wxString& aMessage )
{
+3
View File
@@ -43,6 +43,7 @@ struct CommitDetails
// Enum for result codes, error codes are negative, success codes are positive
enum class PullResult : int
{
DirtyWorkdir = -3,
MergeFailed = -2,
Error = -1,
Success = 0,
@@ -86,6 +87,8 @@ private:
PullResult handleFastForward();
PullResult handleMerge( const git_annotated_commit** aMergeHeads, size_t aMergeHeadsCount );
PullResult handleRebase( const git_annotated_commit** aMergeHeads, size_t aMergeHeadsCount );
static bool hasUnstagedChanges( git_repository* aRepo );
};
#endif // _GIT_PULL_HANDLER_H_
+6 -2
View File
@@ -258,7 +258,7 @@ std::pair<std::set<wxString>,std::set<wxString>> KIGIT_COMMON::GetDifferentFiles
std::set<wxString> modified_set;
git_revwalk* walker = nullptr;
if( !m_repo || !from_oid )
if( !m_repo || !from_oid || IsCancelled() )
return modified_set;
if( git_revwalk_new( &walker, m_repo ) != GIT_OK )
@@ -286,6 +286,10 @@ std::pair<std::set<wxString>,std::set<wxString>> KIGIT_COMMON::GetDifferentFiles
// iterate over all local commits not in remote
while( git_revwalk_next( &oid, walker ) == GIT_OK )
{
// Check for cancellation to allow early exit during shutdown
if( IsCancelled() )
return modified_set;
if( git_commit_lookup( &commit, m_repo, &oid ) != GIT_OK )
{
wxLogTrace( traceGit, "Failed to lookup commit: %s", KIGIT_COMMON::GetLastGitError() );
@@ -371,7 +375,7 @@ std::pair<std::set<wxString>,std::set<wxString>> KIGIT_COMMON::GetDifferentFiles
std::pair<std::set<wxString>,std::set<wxString>> modified_files;
if( !m_repo )
if( !m_repo || IsCancelled() )
return modified_files;
git_reference* head = nullptr;
+9
View File
@@ -26,6 +26,7 @@
#include <git/kicad_git_errors.h>
#include <atomic>
#include <git2.h>
#include <mutex>
#include <set>
@@ -138,6 +139,12 @@ public:
int HandleSSHAgentAuthentication( git_cred** aOut, const wxString& aUsername );
bool IsCancelled() const { return m_cancel.load(); }
void SetCancelled( bool aCancel ) { m_cancel.store( aCancel ); }
std::mutex& GetMutex() { return m_gitActionMutex; }
static wxString GetLastGitError()
{
const git_error* error = git_error_last();
@@ -174,6 +181,8 @@ private:
int m_nextPublicKey;
bool m_secretFetched;
std::atomic<bool> m_cancel{ false };
// Create a dummy flag to tell if we have tested ssh agent credentials separately
// from the ssh key credentials
static const unsigned KIGIT_CREDENTIAL_SSH_AGENT = 1 << sizeof( m_testedTypes - 1 );
+3 -1
View File
@@ -324,7 +324,9 @@ int KeyCodeFromKeyName( const wxString& keyname )
void DisplayHotkeyList( EDA_BASE_FRAME* aParent )
{
DIALOG_LIST_HOTKEYS dlg( aParent );
dlg.ShowModal();
if( dlg.ShowModal() == wxID_OK )
dlg.Kiway().CommonSettingsChanged( HOTKEYS_CHANGED );
}
+1 -5
View File
@@ -323,11 +323,7 @@ bool HTTP_LIB_CONNECTION::SelectAll( const HTTP_LIB_CATEGORY& aCategory, std::ve
part.id = item.at( "id" );
if( item.contains( "description" ) )
{
// At this point we don't display anything so just set it to false
part.fields.push_back( std::make_pair( "description",
std::make_tuple( item.at( "description" ), false ) ) );
}
part.desc = item.at( "description" );
// API might not want to return an optional name.
if( item.contains( "name" ) )
@@ -132,10 +132,12 @@ void GRAPHICS_IMPORTER_BUFFER::ImportTo( GRAPHICS_IMPORTER& aImporter )
// the graphics in the KiCad drawing area.
else if( aImporter.GetImportOffsetMM() == VECTOR2D( 0, 0 ) )
{
if( boundingBox.GetRight() > std::numeric_limits<int>::max()
|| boundingBox.GetBottom() > std::numeric_limits<int>::max()
|| boundingBox.GetLeft() < std::numeric_limits<int>::min()
|| boundingBox.GetTop() < std::numeric_limits<int>::min() )
double iuFactor = aImporter.GetMillimeterToIuFactor();
if( boundingBox.GetRight() * iuFactor > std::numeric_limits<int>::max()
|| boundingBox.GetBottom() * iuFactor > std::numeric_limits<int>::max()
|| boundingBox.GetLeft() * iuFactor < std::numeric_limits<int>::min()
|| boundingBox.GetTop() * iuFactor < std::numeric_limits<int>::min() )
{
VECTOR2D offset = boundingBox.GetOrigin();
aImporter.SetImportOffsetMM( -offset );
+1 -1
View File
@@ -382,7 +382,7 @@ std::map<wxString, wxString> ALTIUM_BINARY_PARSER::ReadProperties(
// we use std::string because std::string can handle NULL-bytes
// wxString would end the string at the first NULL-byte
std::string str = std::string( m_pos, length - ( hasNullByte ? 1 : 0 ) );
std::string str = std::string( m_pos, length - ( ( hasNullByte && !isBinary ) ? 1 : 0 ) );
m_pos += length;
if( isBinary )
+25 -6
View File
@@ -327,7 +327,8 @@ bool EURN::IsValid() const
"footprint",
"library",
"package",
"symbol"
"symbol",
"fs.file"
};
if( validAssetTypes.count( assetType ) == 0 )
@@ -407,11 +408,29 @@ EROT Convert<EROT>( const wxString& aRot )
value.spin = aRot.find( 'S' ) != aRot.npos;
value.mirror = aRot.find( 'M' ) != aRot.npos;
value.degrees = strtod( aRot.c_str()
+ 1 // skip leading 'R'
+ int( value.spin ) // skip optional leading 'S'
+ int( value.mirror ), // skip optional leading 'M'
nullptr );
size_t rPos = aRot.find( 'R' );
if( rPos == wxString::npos )
{
value.degrees = 0.0;
return value;
}
// Calculate the offset after 'R', 'S', and 'M'
size_t offset;
for( offset = 0; offset < aRot.size(); offset++ )
{
if( wxIsdigit( aRot[offset] ) )
break;
}
wxString degreesStr = aRot.Mid( offset );
// Use locale-independent conversion
if( !degreesStr.ToCDouble( &value.degrees ) )
value.degrees = 0.0;
return value;
}
+3
View File
@@ -428,6 +428,9 @@ struct EAGLE_BASE
* The "/<VERSION>" is omitted when referencing the asset without specifying a particular version.
* For example, "urn:adsk.eagle:component:60986/2" references version 2 of component 60986 and
* "urn:adsk.eagle:library:60968" references library 60986 without specifying a version.
*
* Autodesk Fusion can use a different format instead, e.g.:
* "urn:adsk.wipprod:fs.file:vf.RSKzNVZVQPeDNm7Bnfr3WQ"
*/
struct EURN : public EAGLE_BASE
{
@@ -72,7 +72,17 @@ EASYEDAPRO::ProjectToSelectorDialog( const nlohmann::json& aProject, bool aPcbOn
std::map<wxString, EASYEDAPRO::PRJ_SCHEMATIC> prjSchematics = aProject.at( "schematics" );
std::map<wxString, EASYEDAPRO::PRJ_BOARD> prjBoards = aProject.at( "boards" );
std::map<wxString, wxString> prjPcbNames = aProject.at( "pcbs" );
std::map<wxString, wxString> prjPcbNames;
std::map<wxString, nlohmann::json> prjPcbs = aProject.at( "pcbs" );
for( const auto& [pcbUuid, pcbJsonEntry] : prjPcbs )
{
if( pcbJsonEntry.is_string() )
prjPcbNames.emplace( pcbUuid, pcbJsonEntry );
else if( pcbJsonEntry.is_object() )
prjPcbNames.emplace( pcbUuid, pcbJsonEntry.at( "title" ) );
}
for( const auto& [prjName, board] : prjBoards )
{
+3 -3
View File
@@ -220,7 +220,7 @@ void EASYEDAPRO::from_json( const nlohmann::json& j, EASYEDAPRO::PRJ_SYMBOL& d )
if( j.at( "type" ).is_number() )
d.type = j.at( "type" );
if( j.at( "tags" ).is_object() )
if( j.find( "tags" ) != j.end() && j.at( "tags" ).is_object() )
d.tags = j.at( "tags" );
if( j.find( "custom_tags" ) != j.end() && j.at( "custom_tags" ).is_object() )
@@ -249,7 +249,7 @@ void EASYEDAPRO::from_json( const nlohmann::json& j, EASYEDAPRO::PRJ_FOOTPRINT&
if( j.at( "type" ).is_number() )
d.type = j.at( "type" );
if( j.at( "tags" ).is_object() )
if( j.find( "tags" ) != j.end() && j.at( "tags" ).is_object() )
d.tags = j.at( "tags" );
if( j.find( "custom_tags" ) != j.end() && j.at( "custom_tags" ).is_object() )
@@ -275,7 +275,7 @@ void EASYEDAPRO::from_json( const nlohmann::json& j, EASYEDAPRO::PRJ_DEVICE& d )
if( j.at( "version" ).is_string() )
d.version = j.at( "version" ).get<wxString>();
if( j.at( "tags" ).is_object() )
if( j.find( "tags" ) != j.end() && j.at( "tags" ).is_object() )
d.tags = j.at( "tags" );
if( j.find( "custom_tags" ) != j.end() && j.at( "custom_tags" ).is_object() )
+11 -7
View File
@@ -97,27 +97,24 @@ void PrependDirectoryToPath( wxFileName& aFileName, const wxString aDirPath )
}
wxString JOB::GetFullOutputPath( PROJECT* aProject ) const
wxString JOB::ResolveOutputPath( const wxString& aPath, bool aPathIsDirectory, PROJECT* aProject ) const
{
std::function<bool( wxString* )> textResolver =
[&]( wxString* token ) -> bool
{
if( m_titleBlock.TextVarResolver( token, aProject ) )
return true;
if( aProject )
return aProject->TextVarResolver( token );
return false;
};
// use the working output path (nonsaved) over the configured path if its not empty
wxString outPath = m_workingOutputPath.IsEmpty() ? m_outputPath : m_workingOutputPath;
wxString outPath = aPath;
outPath = ExpandTextVars( outPath, &textResolver );
if( !m_tempOutputDirectory.IsEmpty() )
{
if( m_outputPathIsDirectory )
if( aPathIsDirectory )
{
wxFileName fn( outPath );
@@ -144,12 +141,19 @@ wxString JOB::GetFullOutputPath( PROJECT* aProject ) const
return fn.GetFullPath();
}
}
}
return outPath;
}
wxString JOB::GetFullOutputPath( PROJECT* aProject ) const
{
return ResolveOutputPath( m_workingOutputPath.IsEmpty() ? m_outputPath : m_workingOutputPath,
m_outputPathIsDirectory, aProject );
}
void JOB::SetConfiguredOutputPath( const wxString& aPath )
{
m_outputPath = aPath;
+7
View File
@@ -249,6 +249,8 @@ public:
*/
wxString GetFullOutputPath( PROJECT* aProject ) const;
wxString ResolveOutputPath( const wxString& aPath, bool aPathIsDirectory, PROJECT* aProject ) const;
bool GetOutputPathIsDirectory() const { return m_outputPathIsDirectory; }
protected:
@@ -261,6 +263,11 @@ protected:
wxString m_outputPath;
bool m_outputPathIsDirectory;
wxString m_description;
/**
* The working output path is a transient path that takes priority over the configured
* output path when determining where to write output files.
*/
wxString m_workingOutputPath;
std::vector<JOB_PARAM_BASE*> m_params;
+10 -1
View File
@@ -70,7 +70,8 @@ JOB_EXPORT_PCB_DRILL::JOB_EXPORT_PCB_DRILL() :
m_zeroFormat( ZEROS_FORMAT::DECIMAL ),
m_mapFormat( MAP_FORMAT::PDF ),
m_gerberPrecision( 5 ),
m_generateMap( false )
m_generateMap( false ),
m_generateReport( false )
{
m_params.emplace_back( new JOB_PARAM<bool>( "excellon.mirror_y",
&m_excellonMirrorY,
@@ -115,6 +116,14 @@ JOB_EXPORT_PCB_DRILL::JOB_EXPORT_PCB_DRILL() :
m_params.emplace_back( new JOB_PARAM<int>( "gerber_precision",
&m_gerberPrecision,
m_gerberPrecision ) );
m_params.emplace_back( new JOB_PARAM<bool>( "generate_report",
&m_generateReport,
m_generateReport ) );
m_params.emplace_back( new JOB_PARAM<wxString>( "report_filename",
&m_reportPath,
m_reportPath ) );
}
+3
View File
@@ -85,6 +85,9 @@ public:
MAP_FORMAT m_mapFormat;
int m_gerberPrecision;
bool m_generateMap;
bool m_generateReport;
wxString m_reportPath;
};
#endif
+1
View File
@@ -44,6 +44,7 @@ public:
virtual bool OutputPrecheck() { return true; }
virtual bool HandleOutputs( const wxString& aBaseTempPath,
PROJECT* aProject,
const std::vector<wxString>& aPathsWithOverwriteDisallowed,
const std::vector<JOB_OUTPUT>& aOutputsToHandle ) = 0;
virtual void FromJson( const nlohmann::json& j ) = 0;
+3 -1
View File
@@ -42,7 +42,9 @@ bool JOBS_OUTPUT_ARCHIVE::OutputPrecheck()
}
bool JOBS_OUTPUT_ARCHIVE::HandleOutputs( const wxString& baseTempPath, PROJECT* aProject,
bool JOBS_OUTPUT_ARCHIVE::HandleOutputs( const wxString& baseTempPath,
PROJECT* aProject,
const std::vector<wxString>& aPathsWithOverwriteDisallowed,
const std::vector<JOB_OUTPUT>& aOutputsToHandle )
{
bool success = true;
+3 -2
View File
@@ -32,8 +32,9 @@ public:
ZIP
};
bool HandleOutputs( const wxString& aBaseTempPath,
PROJECT* aProject,
bool HandleOutputs( const wxString& aBaseTempPath,
PROJECT* aProject,
const std::vector<wxString>& aPathsWithOverwriteDisallowed,
const std::vector<JOB_OUTPUT>& aOutputsToHandle ) override;
bool OutputPrecheck() override;
+4 -2
View File
@@ -30,7 +30,9 @@ JOBS_OUTPUT_FOLDER::JOBS_OUTPUT_FOLDER() :
}
bool JOBS_OUTPUT_FOLDER::HandleOutputs( const wxString& baseTempPath, PROJECT* aProject,
bool JOBS_OUTPUT_FOLDER::HandleOutputs( const wxString& baseTempPath,
PROJECT* aProject,
const std::vector<wxString>& aPathsWithOverwriteDisallowed,
const std::vector<JOB_OUTPUT>& aOutputsToHandle )
{
wxString outputPath = ExpandTextVars( m_outputPath, aProject );
@@ -47,7 +49,7 @@ bool JOBS_OUTPUT_FOLDER::HandleOutputs( const wxString& baseTempPath, PROJECT* a
wxString errors;
if( !CopyDirectory( baseTempPath, outputPath, errors ) )
if( !CopyDirectory( baseTempPath, outputPath, aPathsWithOverwriteDisallowed, errors ) )
return false;
return true;
+3 -2
View File
@@ -27,8 +27,9 @@ class JOBS_OUTPUT_FOLDER : public JOBS_OUTPUT_HANDLER
public:
JOBS_OUTPUT_FOLDER();
bool HandleOutputs( const wxString& aBaseTempPath,
PROJECT* aProject,
bool HandleOutputs( const wxString& aBaseTempPath,
PROJECT* aProject,
const std::vector<wxString>& aPathsWithOverwriteDisallowed,
const std::vector<JOB_OUTPUT>& aOutputsToHandle ) override;
bool OutputPrecheck() override;
+12
View File
@@ -139,6 +139,12 @@ KICAD_CURL_EASY::KICAD_CURL_EASY() :
curl_easy_setopt( m_CURL, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS );
#endif
// Set connection timeout to prevent long freezes when network is unreachable.
// Without this, CURL can wait up to 5 minutes for DNS resolution or connection
// establishment, which causes the UI to freeze on macOS when behind a proxy with
// restricted internet access.
curl_easy_setopt( m_CURL, CURLOPT_CONNECTTIMEOUT, 30L );
#ifdef _WIN32
long sslOpts = CURLSSLOPT_NATIVE_CA;
@@ -345,6 +351,12 @@ bool KICAD_CURL_EASY::SetOutputStream( const std::ostream* aOutput )
}
bool KICAD_CURL_EASY::SetConnectTimeout( long aTimeoutSecs )
{
return setOption( CURLOPT_CONNECTTIMEOUT, aTimeoutSecs ) == CURLE_OK;
}
int KICAD_CURL_EASY::GetTransferTotal( uint64_t& aDownloadedBytes ) const
{
#if LIBCURL_VERSION_NUM >= 0x073700 // 7.55.0
+11
View File
@@ -285,6 +285,17 @@ void KIID::Increment()
}
KIID KIID::Combine( const KIID& aFirst, const KIID& aSecond )
{
KIID result( 0 );
for( int i = 0; i < 16; ++i )
result.m_uuid.data[i] = aFirst.m_uuid.data[i] ^ aSecond.m_uuid.data[i];
return result;
}
void KIID::CreateNilUuids( bool aNil )
{
g_createNilUuids = aNil;
+14 -1
View File
@@ -48,7 +48,20 @@ public:
wxSize GetSize() const override
{
return wxSize( GetOwner()->GetWidth(), GetTextExtent( m_text ).y + 2 );
wxSize size( GetOwner()->GetWidth(), GetTextExtent( m_text ).y + 2 );
#if defined( __WXGTK__ ) && !wxCHECK_VERSION( 3, 2, 7 )
// Somehow returning 0 or negative width prevents the returned height from
// being taken into account at all, even if we return strictly positive
// width from later calls to GetSize(), meaning that it's enough to return
// 0 from it once to completely break the layout for the entire lifetime of
// the control.
//
// As this is completely unexpected, forcefully prevent this from happening
size.IncTo( wxSize( 1, 1 ) );
#endif
return size;
}
bool GetValue( wxVariant& aValue ) const override
+95 -79
View File
@@ -22,6 +22,7 @@
#include <wx/stdpaths.h>
#include <wx/string.h>
#include <wx/utils.h>
#include <wx/msgdlg.h>
#include <kiplatform/environment.h>
#include <paths.h>
@@ -151,6 +152,7 @@ wxString PATHS::GetDefaultUserProjectsPath()
}
#if !defined( __WXMAC__ ) && !defined( __WXMSW__ )
/**
* Get the CMake build root directory for the current executable
* (which assumes the executable is in a build directory).
@@ -191,6 +193,48 @@ static wxString getBuildDirectoryRoot()
return fn.GetPath();
}
#elif defined( __WXMAC__ )
/**
* Get the main .app bundle root with symlinks resolved.
* Handles both main KiCad binaries and aux binaries inside the bundle.
* This is the single source of truth for bundle root resolution on macOS.
*/
static wxString getOSXBundleRoot()
{
static wxString bundleRoot;
if( bundleRoot.empty() )
{
wxFileName fn( wxStandardPaths::Get().GetExecutablePath() );
WX_FILENAME::ResolvePossibleSymlinks( fn );
fn.SetFullName( wxEmptyString ); // Remove binary name
// Navigate from .../Contents/MacOS/ up to the .app bundle root
// e.g., /Applications/KiCad/KiCad.app/Contents/MacOS -> /Applications/KiCad/KiCad.app
if( fn.GetDirCount() >= 2 && fn.GetDirs().Last() == wxT( "MacOS" ) )
{
fn.RemoveLastDir(); // MacOS
fn.RemoveLastDir(); // Contents
}
// Handle aux binaries inside main bundle
// From: .../main.app/Contents/Applications/standalone.app
// To: .../main.app
const wxArrayString dirs = fn.GetDirs();
if( dirs.GetCount() >= 4 && dirs[dirs.GetCount() - 2] == wxT( "Applications" )
&& dirs[dirs.GetCount() - 4].Lower().EndsWith( wxT( "app" ) ) )
{
fn.RemoveLastDir(); // standalone.app
fn.RemoveLastDir(); // Applications
fn.RemoveLastDir(); // Contents
}
bundleRoot = fn.GetPath();
}
return bundleRoot;
}
#endif
wxString PATHS::GetStockDataPath( bool aRespectRunFromBuildDir )
@@ -201,12 +245,10 @@ wxString PATHS::GetStockDataPath( bool aRespectRunFromBuildDir )
{
// Allow debugging from build dir by placing relevant files/folders in the build root
#if defined( __WXMAC__ )
wxFileName fn = wxStandardPaths::Get().GetExecutablePath();
fn.RemoveLastDir();
fn.RemoveLastDir();
fn.RemoveLastDir();
fn.RemoveLastDir();
wxFileName fn;
fn.AssignDir( getOSXBundleRoot() );
fn.RemoveLastDir(); // Above the .app bundle
fn.RemoveLastDir(); // Above the target subdirectory to build root
path = fn.GetPath();
#elif defined( __WXMSW__ )
path = getWindowsKiCadRoot();
@@ -361,32 +403,25 @@ wxString PATHS::GetStockPlugins3DPath()
fn.AppendDir( wxT( "plugins" ) );
#elif defined( __WXMAC__ )
fn.Assign( wxStandardPaths::Get().GetPluginsDir(), wxEmptyString );
// This must be mapped to main bundle for everything but kicad.app
const wxArrayString dirs = fn.GetDirs();
// Check if we are the main kicad binary. in this case, the path will be
// /path/to/bundlename.app/Contents/PlugIns
// If we are an aux binary, the path will be something like
// /path/to/bundlename.app/Contents/Applications/<standalone>.app/Contents/PlugIns
if( dirs.GetCount() >= 6 &&
dirs[dirs.GetCount() - 4] == wxT( "Applications" ) &&
dirs[dirs.GetCount() - 6].Lower().EndsWith( wxT( "app" ) ) )
{
fn.RemoveLastDir();
fn.RemoveLastDir();
fn.RemoveLastDir();
fn.RemoveLastDir();
fn.AppendDir( wxT( "PlugIns" ) );
}
fn.AssignDir( getOSXBundleRoot() );
fn.AppendDir( wxT( "Contents" ) );
fn.AppendDir( wxT( "PlugIns" ) );
#else
// KICAD_PLUGINDIR = CMAKE_INSTALL_FULL_LIBDIR path is the absolute path
// corresponding to the install path used for constructing KICAD_USER_PLUGIN
wxString tfname = wxString::FromUTF8Unchecked( KICAD_PLUGINDIR );
fn.Assign( tfname, "" );
fn.AppendDir( wxT( "kicad" ) );
fn.AppendDir( wxT( "plugins" ) );
if( wxGetEnv( wxT( "KICAD_RUN_FROM_BUILD_DIR" ), nullptr ) )
{
fn.Assign( wxStandardPaths::Get().GetExecutablePath() );
fn.AppendDir( wxT( ".." ) );
fn.AppendDir( wxT( "plugins" ) );
}
else
{
// KICAD_PLUGINDIR = CMAKE_INSTALL_FULL_LIBDIR path is the absolute path
// corresponding to the install path used for constructing KICAD_USER_PLUGIN
wxString tfname = wxString::FromUTF8Unchecked( KICAD_PLUGINDIR );
fn.Assign( tfname, "" );
fn.AppendDir( wxT( "kicad" ) );
fn.AppendDir( wxT( "plugins" ) );
}
#endif
fn.AppendDir( wxT( "3d" ) );
@@ -502,6 +537,25 @@ void PATHS::EnsureUserPathsExist()
EnsurePathExists( GetDefaultUserFootprintsPath() );
EnsurePathExists( GetDefaultUser3DModelsPath() );
EnsurePathExists( GetDefault3rdPartyPath() );
#ifdef _WIN32
// Warn about Controlled folder access
wxFileName tmp;
getUserDocumentPath( tmp );
if( !tmp.DirExists() )
{
wxString msg = wxString::Format(
_( "KiCad was unable to use '%s'.\n"
"\n"
"1. Disable 'Controlled folder access' in Windows settings or Group Policy\n"
"2. Make sure no other antivirus software interferes with KiCad\n"
"3. Make sure you have correct permissions set up" ),
tmp.GetPath() );
wxMessageBox( msg, _( "Warning" ), wxICON_WARNING );
}
#endif
}
@@ -530,28 +584,10 @@ wxString PATHS::GetOSXKicadMachineDataDir()
wxString PATHS::GetOSXKicadDataDir()
{
// According to wxWidgets documentation for GetDataDir:
// Mac: appname.app/Contents/SharedSupport bundle subdirectory
wxFileName ddir( wxStandardPaths::Get().GetDataDir(), wxEmptyString );
// This must be mapped to main bundle for everything but kicad.app
const wxArrayString dirs = ddir.GetDirs();
// Check if we are the main kicad binary. in this case, the path will be
// /path/to/bundlename.app/Contents/SharedSupport
// If we are an aux binary, the path will be something like
// /path/to/bundlename.app/Contents/Applications/<standalone>.app/Contents/SharedSupport
if( dirs.GetCount() >= 6 &&
dirs[dirs.GetCount() - 4] == wxT( "Applications" ) &&
dirs[dirs.GetCount() - 6].Lower().EndsWith( wxT( "app" ) ) )
{
ddir.RemoveLastDir();
ddir.RemoveLastDir();
ddir.RemoveLastDir();
ddir.RemoveLastDir();
ddir.AppendDir( wxT( "SharedSupport" ) );
}
wxFileName ddir;
ddir.AssignDir( getOSXBundleRoot() );
ddir.AppendDir( wxT( "Contents" ) );
ddir.AppendDir( wxT( "SharedSupport" ) );
return ddir.GetPath();
}
#endif
@@ -622,33 +658,12 @@ const wxString& PATHS::GetExecutablePath()
if( exe_path.empty() )
{
#ifdef __WXMAC__
// Use bundle root helper which handles symlink resolution and aux binaries
exe_path = getOSXBundleRoot() + wxT( "/" );
#else
wxString bin_dir = wxStandardPaths::Get().GetExecutablePath();
#ifdef __WXMAC__
// On OSX GetExecutablePath() will always point to main
// bundle directory, e.g., /Applications/kicad.app/
wxFileName fn( bin_dir );
WX_FILENAME::ResolvePossibleSymlinks( fn );
if( fn.GetName() == wxT( "kicad" ) || fn.GetName() == wxT( "kicad-cli" ) )
{
// kicad launcher, so just remove the Contents/MacOS part
fn.RemoveLastDir();
fn.RemoveLastDir();
}
else
{
// standalone binaries live in Contents/Applications/<standalone>.app/Contents/MacOS
fn.RemoveLastDir();
fn.RemoveLastDir();
fn.RemoveLastDir();
fn.RemoveLastDir();
fn.RemoveLastDir();
}
bin_dir = fn.GetPath() + wxT( "/" );
#else
// Use unix notation for paths. I am not sure this is a good idea,
// but it simplifies compatibility between Windows and Unices.
// However it is a potential problem in path handling under Windows.
@@ -657,8 +672,9 @@ const wxString& PATHS::GetExecutablePath()
// Remove file name form command line:
while( bin_dir.Last() != '/' && !bin_dir.IsEmpty() )
bin_dir.RemoveLast();
#endif
exe_path = bin_dir;
#endif
}
return exe_path;
+2
View File
@@ -176,6 +176,8 @@ void PGM_BASE::Destroy()
#endif
m_pgm_checker.reset();
m_singleton.Shutdown();
}
+7 -1
View File
@@ -141,12 +141,14 @@ void DXF_PLOTTER::SetUnits( DXF_UNITS aUnit )
case DXF_UNITS::MM:
m_unitScalingFactor = 0.00254;
m_measurementDirective = 1;
m_insUnits = 4;
break;
case DXF_UNITS::INCH:
default:
m_unitScalingFactor = 0.0001;
m_measurementDirective = 0;
m_insUnits = 1;
}
}
@@ -219,6 +221,10 @@ bool DXF_PLOTTER::StartPlot( const wxString& aPageNumber )
"$MEASUREMENT\n"
" 70\n"
"%u\n"
" 9\n"
"$INSUNITS\n"
" 70\n"
"%u\n"
" 0\n"
"ENDSEC\n"
" 0\n"
@@ -313,7 +319,7 @@ bool DXF_PLOTTER::StartPlot( const wxString& aPageNumber )
"-0.2\n"
" 0\n"
"ENDTAB\n",
GetMeasurementDirective() );
GetMeasurementDirective(), GetInsUnits() );
// Text styles table
// Defines 4 text styles, one for each bold/italic combination
+1 -1
View File
@@ -415,7 +415,7 @@ void PDF_PLOTTER::PlotPoly( const std::vector<VECTOR2I>& aCornerList, FILL_T aFi
if( aFill == FILL_T::NO_FILL )
fputs( "S\n", m_workFile );
else if( aWidth == 0 )
fputs( "f\n", m_workFile );
fputs( "h f\n", m_workFile );
else
fputs( "b\n", m_workFile );
}
+2 -2
View File
@@ -683,10 +683,10 @@ void SVG_PLOTTER::PlotImage( const wxImage& aImage, const VECTOR2I& aPos, double
img_stream.CopyTo( buffer.data(), buffer.size() );
base64::encode( buffer, encoded );
VECTOR2D pos = userToDeviceCoordinates( start );
fprintf( m_outputFile,
"<image x=\"%f\" y=\"%f\" xlink:href=\"data:image/png;base64,",
userToDeviceSize( start.x ),
userToDeviceSize( start.y ) );
pos.x, pos.y );
for( size_t i = 0; i < encoded.size(); i++ )
{
+256 -8
View File
@@ -316,9 +316,12 @@ NET_SETTINGS::NET_SETTINGS( JSON_SETTINGS* aParent, const std::string& aPath ) :
wxString pattern = entry["pattern"].get<wxString>();
wxString netclass = entry["netclass"].get<wxString>();
m_netClassPatternAssignments.push_back(
{ std::make_unique<EDA_COMBINED_MATCHER>( pattern, CTX_NETCLASS ),
netclass } );
// Expand bus patterns so individual bus member nets can be matched
ForEachBusMember( pattern,
[&]( const wxString& memberPattern )
{
addSinglePatternAssignment( memberPattern, netclass );
} );
}
}
},
@@ -557,6 +560,21 @@ bool NET_SETTINGS::HasNetclassLabelAssignment( const wxString& netName ) const
void NET_SETTINGS::SetNetclassPatternAssignment( const wxString& pattern, const wxString& netclass )
{
// Expand bus patterns (vector buses and bus groups) to individual member patterns.
// This is necessary because the regex/wildcard matchers interpret brackets and braces
// as special characters, not as bus notation.
ForEachBusMember( pattern,
[&]( const wxString& memberPattern )
{
addSinglePatternAssignment( memberPattern, netclass );
} );
ClearAllCaches();
}
void NET_SETTINGS::addSinglePatternAssignment( const wxString& pattern, const wxString& netclass )
{
// Avoid exact duplicates - these shouldn't cause problems, due to later de-duplication
// but they are unnecessary.
@@ -569,8 +587,6 @@ void NET_SETTINGS::SetNetclassPatternAssignment( const wxString& pattern, const
// No assignment, add a new one
m_netClassPatternAssignments.push_back(
{ std::make_unique<EDA_COMBINED_MATCHER>( pattern, CTX_NETCLASS ), netclass } );
ClearAllCaches();
}
@@ -733,6 +749,44 @@ std::shared_ptr<NETCLASS> NET_SETTINGS::GetEffectiveNetClass( const wxString& aN
// Handle zero resolved netclasses
if( resolvedNetclasses.size() == 0 )
{
// For bus patterns, check if all members share the same netclass.
// If they do, the bus inherits that netclass for coloring purposes.
std::shared_ptr<NETCLASS> sharedNetclass;
bool allSameNetclass = true;
bool isBusPattern = false;
ForEachBusMember( aNetName,
[&]( const wxString& member )
{
// If ForEachBusMember gives us back the same name, it's not a bus.
// Skip to avoid infinite recursion.
if( member == aNetName )
return;
isBusPattern = true;
if( !allSameNetclass )
return;
std::shared_ptr<NETCLASS> memberNc = GetEffectiveNetClass( member );
if( !sharedNetclass )
{
sharedNetclass = memberNc;
}
else if( memberNc->GetName() != sharedNetclass->GetName() )
{
allSameNetclass = false;
}
} );
if( isBusPattern && allSameNetclass && sharedNetclass
&& sharedNetclass->GetName() != NETCLASS::Default )
{
m_effectiveNetclassCache[aNetName] = sharedNetclass;
return sharedNetclass;
}
m_effectiveNetclassCache[aNetName] = m_defaultNetClass;
return m_defaultNetClass;
@@ -1015,6 +1069,33 @@ static bool isSuperSubOverbar( wxChar c )
}
/**
* Check if a character at the given position is escaped by a backslash.
*
* @param aStr The string to check
* @param aPos Position of the character to check
* @return true if the character is preceded by a backslash escape
*/
static bool isEscaped( const wxString& aStr, size_t aPos )
{
if( aPos == 0 )
return false;
// Count consecutive backslashes before this position
int backslashCount = 0;
size_t pos = aPos;
while( pos > 0 && aStr[pos - 1] == '\\' )
{
backslashCount++;
pos--;
}
// If odd number of backslashes, the character is escaped
return ( backslashCount % 2 ) == 1;
}
bool NET_SETTINGS::ParseBusVector( const wxString& aBus, wxString* aName,
std::vector<wxString>* aMemberList )
{
@@ -1032,6 +1113,7 @@ bool NET_SETTINGS::ParseBusVector( const wxString& aBus, wxString* aName,
long begin = 0;
long end = 0;
int braceNesting = 0;
bool inQuotes = false;
prefix.reserve( busLen );
@@ -1039,18 +1121,57 @@ bool NET_SETTINGS::ParseBusVector( const wxString& aBus, wxString* aName,
//
for( ; i < busLen; ++i )
{
// Handle quoted strings (allows spaces inside)
if( aBus[i] == '"' && !isEscaped( aBus, i ) )
{
inQuotes = !inQuotes;
continue;
}
if( inQuotes )
{
// Inside quotes, add characters directly (including spaces)
if( aBus[i] == '\\' && i + 1 < busLen )
{
// Handle escaped characters inside quotes
prefix += aBus[++i];
}
else
{
prefix += aBus[i];
}
continue;
}
if( aBus[i] == '{' )
{
if( i > 0 && isSuperSubOverbar( aBus[i-1] ) )
{
braceNesting++;
if( !prefix.IsEmpty() )
prefix.RemoveLast();
continue;
}
else
return false;
}
else if( aBus[i] == '}' )
{
braceNesting--;
continue;
}
// Handle backslash-escaped spaces
if( aBus[i] == '\\' && i + 1 < busLen && aBus[i + 1] == ' ' )
{
prefix += aBus[++i];
continue;
}
// Unescaped space or ] in bus vector prefix is not allowed
if( aBus[i] == ' ' || aBus[i] == ']' )
return false;
@@ -1111,6 +1232,9 @@ bool NET_SETTINGS::ParseBusVector( const wxString& aBus, wxString* aName,
if( aBus[i] == '}' )
{
braceNesting--;
}
else if( aBus[i] == '+' || aBus[i] == '-' || aBus[i] == 'P' || aBus[i] == 'N' )
{
suffix += aBus[i];
}
else
@@ -1154,17 +1278,68 @@ bool NET_SETTINGS::ParseBusGroup( const wxString& aGroup, wxString* aName,
wxString prefix;
wxString tmp;
int braceNesting = 0;
bool inQuotes = false;
prefix.reserve( groupLen );
// Escape spaces in member names so recursive parsing by ForEachBusMember works correctly.
// Both quoted strings and backslash-escaped spaces collapse to bare spaces during parsing,
// so we must re-escape them for subsequent ParseBusVector/ParseBusGroup calls.
auto escapeSpacesForBus =
[]( const wxString& aMember ) -> wxString
{
wxString escaped;
escaped.reserve( aMember.length() * 2 );
for( wxUniChar c : aMember )
{
if( c == ' ' )
escaped += wxT( "\\ " );
else
escaped += c;
}
return escaped;
};
// Parse prefix
//
for( ; i < groupLen; ++i )
{
// Handle quoted strings (allows spaces inside)
if( aGroup[i] == '"' && !isEscaped( aGroup, i ) )
{
inQuotes = !inQuotes;
continue;
}
if( inQuotes )
{
// Inside quotes, add characters directly (including spaces)
if( aGroup[i] == '\\' && i + 1 < groupLen )
{
// Handle escaped characters inside quotes
prefix += aGroup[++i];
}
else
{
prefix += aGroup[i];
}
continue;
}
if( aGroup[i] == '{' )
{
if( i > 0 && isSuperSubOverbar( aGroup[i-1] ) )
{
braceNesting++;
if( !prefix.IsEmpty() )
prefix.RemoveLast();
continue;
}
else
break;
}
@@ -1173,6 +1348,14 @@ bool NET_SETTINGS::ParseBusGroup( const wxString& aGroup, wxString* aName,
braceNesting--;
}
// Handle backslash-escaped spaces
if( aGroup[i] == '\\' && i + 1 < groupLen && aGroup[i + 1] == ' ' )
{
prefix += aGroup[++i];
continue;
}
// Unescaped space, [, or ] in bus group prefix is not allowed
if( aGroup[i] == ' ' || aGroup[i] == '[' || aGroup[i] == ']' )
return false;
@@ -1192,12 +1375,44 @@ bool NET_SETTINGS::ParseBusGroup( const wxString& aGroup, wxString* aName,
if( i >= groupLen )
return false;
inQuotes = false;
for( ; i < groupLen; ++i )
{
// Handle quoted strings (allows spaces inside member names)
if( aGroup[i] == '"' && !isEscaped( aGroup, i ) )
{
inQuotes = !inQuotes;
continue;
}
if( inQuotes )
{
// Inside quotes, add characters directly (including spaces)
if( aGroup[i] == '\\' && i + 1 < groupLen )
{
// Handle escaped characters inside quotes
tmp += aGroup[++i];
}
else
{
tmp += aGroup[i];
}
continue;
}
if( aGroup[i] == '{' )
{
if( i > 0 && isSuperSubOverbar( aGroup[i-1] ) )
{
braceNesting++;
if( !tmp.IsEmpty() )
tmp.RemoveLast();
continue;
}
else
return false;
}
@@ -1206,21 +1421,29 @@ bool NET_SETTINGS::ParseBusGroup( const wxString& aGroup, wxString* aName,
if( braceNesting )
{
braceNesting--;
continue;
}
else
{
if( aMemberList && !tmp.IsEmpty() )
aMemberList->push_back( EscapeString( tmp, CTX_NETNAME ) );
aMemberList->push_back( EscapeString( escapeSpacesForBus( tmp ), CTX_NETNAME ) );
return true;
}
}
// Commas aren't strictly legal, but we can be pretty sure what the author had in mind.
// Handle backslash-escaped spaces in member names
if( aGroup[i] == '\\' && i + 1 < groupLen && aGroup[i + 1] == ' ' )
{
tmp += aGroup[++i];
continue;
}
// Unescaped space or comma separates members
if( aGroup[i] == ' ' || aGroup[i] == ',' )
{
if( aMemberList && !tmp.IsEmpty() )
aMemberList->push_back( EscapeString( tmp, CTX_NETNAME ) );
aMemberList->push_back( EscapeString( escapeSpacesForBus( tmp ), CTX_NETNAME ) );
tmp.Clear();
continue;
@@ -1231,3 +1454,28 @@ bool NET_SETTINGS::ParseBusGroup( const wxString& aGroup, wxString* aName,
return false;
}
void NET_SETTINGS::ForEachBusMember( const wxString& aBusPattern,
const std::function<void( const wxString& )>& aFunction )
{
std::vector<wxString> members;
if( ParseBusVector( aBusPattern, nullptr, &members ) )
{
// Vector bus: call function for each expanded member
for( const wxString& member : members )
aFunction( member );
}
else if( ParseBusGroup( aBusPattern, nullptr, &members ) )
{
// Bus group: recursively expand each member (which may itself be a vector or group)
for( const wxString& member : members )
ForEachBusMember( member, aFunction );
}
else
{
// Not a bus pattern: call function with the original pattern
aFunction( aBusPattern );
}
}
+2
View File
@@ -117,6 +117,8 @@ PROJECT_FILE::PROJECT_FILE( const wxString& aFullPath ) :
m_LegacyLibNames.push_back( entry.get<wxString>() );
}, {} ) );
m_NetSettings = std::make_shared<NET_SETTINGS>( this, "net_settings" );
m_params.emplace_back( new PARAM_LAYER_PRESET( "board.layer_presets", &m_LayerPresets ) );
@@ -45,6 +45,7 @@ PROJECT_LOCAL_SETTINGS::PROJECT_LOCAL_SETTINGS( PROJECT* aProject, const wxStrin
m_ShapeOpacity( 1.0 ),
m_ImageOpacity( 0.6 ),
m_PcbSelectionFilter(),
m_GitIntegrationDisabled( false ),
m_project( aProject ),
m_wasMigrated( false )
{
@@ -207,6 +208,8 @@ PROJECT_LOCAL_SETTINGS::PROJECT_LOCAL_SETTINGS( PROJECT* aProject, const wxStrin
m_params.emplace_back( new PARAM<wxString>( "git.ssh_key", &m_GitSSHKey, "" ) );
m_params.emplace_back( new PARAM<bool>( "git.integration_disabled", &m_GitIntegrationDisabled, false ) );
m_params.emplace_back( new PARAM<wxString>( "net_inspector_panel.filter_text",
&m_NetInspectorPanel.filter_text, "" ) );
m_params.emplace_back( new PARAM<bool>( "net_inspector_panel.filter_by_net_name",
+17 -4
View File
@@ -311,13 +311,21 @@ wxPGWindowList PG_COLOR_EDITOR::CreateControls( wxPropertyGrid* aGrid, wxPGPrope
editor->SetPosition( aPos );
editor->SetSize( aSize );
// Capture property name instead of pointer to avoid dangling pointer if grid is rebuilt
wxString propName = colorProp->GetName();
editor->Bind( COLOR_SWATCH_CHANGED,
[=]( wxCommandEvent& aEvt )
{
wxVariant val;
auto data = new COLOR4D_VARIANT_DATA( editor->GetSwatchColor() );
val.SetData( data );
aGrid->ChangePropertyValue( colorProp, val );
wxPGProperty* prop = aGrid->GetPropertyByName( propName );
if( prop )
{
wxVariant val;
auto data = new COLOR4D_VARIANT_DATA( editor->GetSwatchColor() );
val.SetData( data );
aGrid->ChangePropertyValue( prop, val );
}
} );
#if wxCHECK_VERSION( 3, 3, 0 )
@@ -330,6 +338,11 @@ wxPGWindowList PG_COLOR_EDITOR::CreateControls( wxPropertyGrid* aGrid, wxPGPrope
[=]()
{
editor->GetNewSwatchColor();
wxPGProperty* prop = aGrid->GetPropertyByName( propName );
if( prop )
aGrid->DrawItem( prop );
} );
}
+3
View File
@@ -174,6 +174,9 @@ void RC_ITEM::GetJsonViolation( RC_JSON::VIOLATION& aViolation, UNITS_PROVIDER*
aViolation.type = GetSettingsKey();
aViolation.excluded = ( m_parent && m_parent->IsExcluded() );
if( m_parent && m_parent->IsExcluded() && !m_parent->GetComment().IsEmpty() )
aViolation.comment = m_parent->GetComment();
EDA_ITEM* mainItem = nullptr;
EDA_ITEM* auxItem = nullptr;
+6 -4
View File
@@ -206,10 +206,12 @@ void SCINTILLA_TRICKS::onModified( wxStyledTextEvent& aEvent )
{
// If the font is larger than the height of a single-line text box we can get issues
// with the text disappearing every other character due to dodgy scrolling behaviour.
CallAfter( [this]()
{
m_te->ScrollToStart();
} );
CallAfter(
[this]()
{
if( !m_te->AutoCompActive() )
m_te->ScrollToStart();
} );
}
}
+25 -6
View File
@@ -20,18 +20,37 @@
#include <singleton.h>
#include <bs_thread_pool.hpp>
#include <gal/opengl/gl_context_mgr.h>
#include <thread_pool.h>
KICAD_SINGLETON::~KICAD_SINGLETON()
{
// This will wait for all threads to finish and then join them to the main thread
delete m_ThreadPool;
// Shutdown() should have been called before static destruction.
// If not, we still try to clean up, but this may crash on macOS
// during static destruction due to condition variable issues.
Shutdown();
}
m_ThreadPool = nullptr;
m_GLContextManager->DeleteAll();
delete m_GLContextManager;
m_GLContextManager = nullptr;
void KICAD_SINGLETON::Shutdown()
{
// This will wait for all threads to finish and then join them to the main thread.
// Must be called before static destruction begins to avoid crashes on macOS.
if( m_ThreadPool )
{
delete m_ThreadPool;
m_ThreadPool = nullptr;
// Clear the cached thread pool pointer to prevent dangling reference
InvalidateKiCadThreadPool();
}
if( m_GLContextManager )
{
m_GLContextManager->DeleteAll();
delete m_GLContextManager;
m_GLContextManager = nullptr;
}
}
+1 -1
View File
@@ -155,7 +155,7 @@ bool ConvertSmartQuotesAndDashes( wxString* aString )
for( wxString::iterator ii = aString->begin(); ii != aString->end(); ++ii )
{
if( *ii == L'\u00B4' || *ii == L'\u2018' || *ii == L'\u2019' )
if( *ii == L'\u2018' || *ii == L'\u2019' )
{
*ii = '\'';
retVal = true;
+16
View File
@@ -26,6 +26,7 @@
#include <thread_pool.h>
static thread_pool* tp = nullptr;
static bool tp_owned = false; // True if we created the thread pool ourselves
thread_pool& GetKiCadThreadPool()
{
@@ -36,6 +37,7 @@ thread_pool& GetKiCadThreadPool()
if( PGM_BASE* pgm = PgmOrNull() )
{
tp = &pgm->GetThreadPool();
tp_owned = false;
return *tp;
}
@@ -43,6 +45,20 @@ thread_pool& GetKiCadThreadPool()
// so we need to create our own thread pool
int num_threads = std::max( 0, ADVANCED_CFG::GetCfg().m_MaximumThreads );
tp = new thread_pool( num_threads );
tp_owned = true;
return *tp;
}
void InvalidateKiCadThreadPool()
{
// If we own the thread pool (scripting context), delete it
if( tp && tp_owned )
{
delete tp;
}
tp = nullptr;
tp_owned = false;
}
+6 -2
View File
@@ -477,13 +477,17 @@ void ACTION_TOOLBAR::onToolEvent( wxAuiToolBarEvent& aEvent )
bool handled = false;
if( m_toolManager && type == wxEVT_COMMAND_TOOL_CLICKED && id >= TOOL_ACTION::GetBaseUIId() )
if( m_toolManager && type == wxEVT_COMMAND_TOOL_CLICKED )
{
const auto actionIt = m_toolActions.find( id );
const auto cancelIt = m_toolCancellable.find( id );
// Determine if the tool is actually cancellable
bool isCancellable = ( cancelIt != m_toolCancellable.end() ) ? cancelIt->second : false;
// The toolbar item is toggled before the event is sent, so we check for it not being
// toggled to see if it was toggled originally
if( m_toolCancellable[id] && !GetToolToggled( id ) )
if( isCancellable && !GetToolToggled( id ) )
{
// Send a cancel event
m_toolManager->CancelTool();
+1
View File
@@ -612,6 +612,7 @@ int COMMON_TOOLS::GridProperties( const TOOL_EVENT& aEvent )
case FRAME_SCH_SYMBOL_EDITOR: showGridPrefs( _( "Symbol Editor" ) ); break;
case FRAME_PCB_EDITOR: showGridPrefs( _( "PCB Editor" ) ); break;
case FRAME_FOOTPRINT_EDITOR: showGridPrefs( _( "Footprint Editor" ) ); break;
case FRAME_FOOTPRINT_VIEWER: showGridPrefs( _( "Footprint Browser" ) ); break;
case FRAME_PL_EDITOR: showGridPrefs( _( "Drawing Sheet Editor" ) ); break;
case FRAME_GERBER: showGridPrefs( _( "Gerber Viewer" ) ); break;
default: wxFAIL_MSG( "Unknown frame: " + GetName() ); break;
+146 -5
View File
@@ -32,10 +32,12 @@
#include <wx/timer.h>
#include <wx/debug.h>
#include <wx/log.h>
#include <advanced_config.h>
#include <math/util.h>
#include <hash.h>
#include <trace_helpers.h>
/**
@@ -555,21 +557,38 @@ void SNAP_LINE_MANAGER::SetSnappedAnchor( const VECTOR2I& aAnchorPos )
OPT_VECTOR2I SNAP_LINE_MANAGER::GetNearestSnapLinePoint( const VECTOR2I& aCursor,
const VECTOR2I& aNearestGrid,
std::optional<int> aDistToNearest,
int aSnapRange ) const
int aSnapRange,
const VECTOR2D& aGridSize,
const VECTOR2I& aGridOrigin ) const
{
wxUnusedVar( aNearestGrid );
wxLogTrace( traceSnap, "GetNearestSnapLinePoint: cursor=(%d, %d), nearestGrid=(%d, %d), distToNearest=%s, snapRange=%d",
aCursor.x, aCursor.y, aNearestGrid.x, aNearestGrid.y,
aDistToNearest ? wxString::Format( "%d", *aDistToNearest ) : wxString( "none" ), aSnapRange );
if( !m_snapLineOrigin || m_directions.empty() )
{
wxLogTrace( traceSnap, " No snap line origin or no directions, returning nullopt" );
return std::nullopt;
}
const bool gridBetterThanNearest = !aDistToNearest || *aDistToNearest > aSnapRange;
const bool gridActive = aGridSize.x > 0 && aGridSize.y > 0;
wxLogTrace( traceSnap, " snapLineOrigin=(%d, %d), directions count=%zu, gridBetterThanNearest=%d, gridActive=%d",
m_snapLineOrigin->x, m_snapLineOrigin->y, m_directions.size(), gridBetterThanNearest, gridActive );
if( !gridBetterThanNearest )
{
wxLogTrace( traceSnap, " Grid not better than nearest, returning nullopt" );
return std::nullopt;
}
const int escapeRange = 2 * aSnapRange;
const EDA_ANGLE longRangeEscapeAngle( 4, DEGREES_T );
wxLogTrace( traceSnap, " escapeRange=%d, longRangeEscapeAngle=%.1f deg",
escapeRange, longRangeEscapeAngle.AsDegrees() );
const VECTOR2D origin( *m_snapLineOrigin );
const VECTOR2D cursor( aCursor );
const VECTOR2D delta = cursor - origin;
@@ -577,13 +596,17 @@ OPT_VECTOR2I SNAP_LINE_MANAGER::GetNearestSnapLinePoint( const VECTOR2I& aCur
double bestPerpDistance = std::numeric_limits<double>::max();
std::optional<VECTOR2I> bestSnapPoint;
for( const VECTOR2I& direction : m_directions )
for( size_t ii = 0; ii < m_directions.size(); ++ii )
{
const VECTOR2I& direction = m_directions[ii];
VECTOR2D dirVector( direction );
double dirLength = dirVector.EuclideanNorm();
if( dirLength == 0.0 )
{
wxLogTrace( traceSnap, " Direction %zu: zero length, skipping", ii );
continue;
}
VECTOR2D dirUnit = dirVector / dirLength;
@@ -592,8 +615,14 @@ OPT_VECTOR2I SNAP_LINE_MANAGER::GetNearestSnapLinePoint( const VECTOR2I& aCur
VECTOR2D offset = delta - dirUnit * distanceAlong;
double perpDistance = offset.EuclideanNorm();
wxLogTrace( traceSnap, " Direction %zu: dir=(%d, %d), perpDist=%.1f, distAlong=%.1f",
ii, direction.x, direction.y, perpDistance, distanceAlong );
if( perpDistance > aSnapRange )
{
wxLogTrace( traceSnap, " perpDistance > snapRange, skipping" );
continue;
}
bool escaped = false;
@@ -603,20 +632,113 @@ OPT_VECTOR2I SNAP_LINE_MANAGER::GetNearestSnapLinePoint( const VECTOR2I& aCur
EDA_ANGLE directionAngle( dirVector );
double angleDiff = ( deltaAngle - directionAngle ).Normalize180().AsDegrees();
wxLogTrace( traceSnap, " In escape range: deltaAngle=%.1f, dirAngle=%.1f, angleDiff=%.1f",
deltaAngle.AsDegrees(), directionAngle.AsDegrees(), angleDiff );
if( std::abs( angleDiff ) > longRangeEscapeAngle.AsDegrees() )
{
escaped = true;
wxLogTrace( traceSnap, " ESCAPED (angle diff too large)" );
}
}
if( !escaped && perpDistance < bestPerpDistance )
if( escaped )
{
wxLogTrace( traceSnap, " Not updating (escaped)" );
continue;
}
// Now snap the projection to the grid if the grid is active
VECTOR2D snapPoint = projection;
if( gridActive )
{
// For horizontal/vertical lines, snap to grid intersections
if( direction.x == 0 && direction.y != 0 )
{
// Vertical line: keep origin X, snap Y to grid
snapPoint.x = origin.x;
snapPoint.y = aNearestGrid.y;
wxLogTrace( traceSnap, " Vertical line: snapping to grid Y, snapPoint=(%.1f, %.1f)",
snapPoint.x, snapPoint.y );
}
else if( direction.y == 0 && direction.x != 0 )
{
// Horizontal line: snap X to grid, keep origin Y
snapPoint.x = aNearestGrid.x;
snapPoint.y = origin.y;
wxLogTrace( traceSnap, " Horizontal line: snapping to grid X, snapPoint=(%.1f, %.1f)",
snapPoint.x, snapPoint.y );
}
else
{
// Diagonal line: find nearest grid intersection along the line
VECTOR2D gridOriginD( aGridOrigin );
VECTOR2D relProjection = projection - gridOriginD;
// Find nearby grid points (check 3x3 grid around projection)
double bestGridScore = std::numeric_limits<double>::max();
VECTOR2D bestGridPoint = projection;
for( int dx = -1; dx <= 1; ++dx )
{
for( int dy = -1; dy <= 1; ++dy )
{
double gridX = std::round( relProjection.x / aGridSize.x ) * aGridSize.x + dx * aGridSize.x;
double gridY = std::round( relProjection.y / aGridSize.y ) * aGridSize.y + dy * aGridSize.y;
VECTOR2D gridPt( gridX + gridOriginD.x, gridY + gridOriginD.y );
// Calculate perpendicular distance from grid point to construction line
VECTOR2D gridDelta = gridPt - origin;
double gridDistAlong = gridDelta.Dot( dirUnit );
VECTOR2D gridProjection = origin + dirUnit * gridDistAlong;
double gridPerpDist = ( gridPt - gridProjection ).EuclideanNorm();
// Also consider distance from cursor
double distFromCursor = ( gridPt - cursor ).EuclideanNorm();
// Prefer grid points that are close to the line and close to cursor
double score = gridPerpDist + distFromCursor * 0.1;
if( score < bestGridScore )
{
bestGridScore = score;
bestGridPoint = gridPt;
}
}
}
snapPoint = bestGridPoint;
wxLogTrace( traceSnap, " Diagonal line: snapping to grid intersection, snapPoint=(%.1f, %.1f)",
snapPoint.x, snapPoint.y );
}
}
else
{
wxLogTrace( traceSnap, " Grid not active, using projection" );
}
if( perpDistance < bestPerpDistance )
{
bestPerpDistance = perpDistance;
bestSnapPoint = VECTOR2I( KiROUND( projection.x ), KiROUND( projection.y ) );
bestSnapPoint = VECTOR2I( KiROUND( snapPoint.x ), KiROUND( snapPoint.y ) );
wxLogTrace( traceSnap, " NEW BEST: perpDist=%.1f, snapPoint=(%d, %d)",
bestPerpDistance, bestSnapPoint->x, bestSnapPoint->y );
}
else
{
wxLogTrace( traceSnap, " Not updating (perpDist=%.1f >= bestPerp=%.1f)",
perpDistance, bestPerpDistance );
}
}
if( bestSnapPoint )
{
wxLogTrace( traceSnap, " RETURNING bestSnapPoint=(%d, %d)", bestSnapPoint->x, bestSnapPoint->y );
return *bestSnapPoint;
}
wxLogTrace( traceSnap, " RETURNING nullopt (no valid snap found)" );
return std::nullopt;
}
@@ -743,3 +865,22 @@ SNAP_MANAGER::GetConstructionItems() const
return batches;
}
void CONSTRUCTION_MANAGER::Clear()
{
std::lock_guard<std::mutex> lock( m_batchesMutex );
m_persistentConstructionBatch.reset();
m_temporaryConstructionBatches.clear();
m_involvedItems.clear();
CancelProposal();
}
void SNAP_MANAGER::Clear()
{
m_snapLineManager.ClearSnapLine();
m_constructionManager.Clear();
UpdateSnapGuides();
}
+1 -1
View File
@@ -61,7 +61,7 @@ void EC_45DEGREE::Apply( EDIT_POINT& aHandle, const GRID_HELPER& aGrid )
VECTOR2I lineVector( aHandle.GetPosition() - m_constrainer.GetPosition() );
VECTOR2I newLineVector = GetVectorSnapped45( lineVector );
if( aHandle.GetGridConstraint() == SNAP_TO_GRID
if( aHandle.GetGridConstraint() == SNAP_TO_GRID && !aGrid.GetSnappedPoint()
&& ( newLineVector.x == 0 || newLineVector.y == 0 ) )
{
VECTOR2I snap = aGrid.AlignGrid( m_constrainer.GetPosition() + newLineVector );
+101 -5
View File
@@ -28,6 +28,8 @@
#include <limits>
#include <advanced_config.h>
#include <trace_helpers.h>
#include <wx/log.h>
#include <gal/graphics_abstraction_layer.h>
#include <math/util.h> // for KiROUND
#include <math/vector2d.h>
@@ -157,14 +159,26 @@ std::optional<VECTOR2I> GRID_HELPER::SnapToConstructionLines( const VECTOR2I& aP
const SNAP_LINE_MANAGER& snapLineManager = m_snapManager.GetSnapLineManager();
const OPT_VECTOR2I& snapOrigin = snapLineManager.GetSnapLineOrigin();
wxLogTrace( traceSnap, "SnapToConstructionLines: aPoint=(%d, %d), nearestGrid=(%d, %d), snapRange=%.1f",
aPoint.x, aPoint.y, aNearestGrid.x, aNearestGrid.y, aSnapRange );
if( !snapOrigin || snapLineManager.GetDirections().empty() )
{
wxLogTrace( traceSnap, " No snap origin or no directions, returning nullopt" );
return std::nullopt;
}
const VECTOR2I& origin = *snapOrigin;
wxLogTrace( traceSnap, " snapOrigin=(%d, %d), directions count=%zu",
origin.x, origin.y, snapLineManager.GetDirections().size() );
const std::vector<VECTOR2I>& directions = snapLineManager.GetDirections();
const std::optional<int> activeDirection = snapLineManager.GetActiveDirection();
if( activeDirection )
wxLogTrace( traceSnap, " activeDirection=%d", *activeDirection );
const VECTOR2D originVec( origin );
const VECTOR2D cursorVec( aPoint );
const VECTOR2D delta = cursorVec - originVec;
@@ -180,7 +194,10 @@ std::optional<VECTOR2I> GRID_HELPER::SnapToConstructionLines( const VECTOR2I& aP
double dirLength = dirVector.EuclideanNorm();
if( dirLength == 0.0 )
{
wxLogTrace( traceSnap, " Direction %zu: zero length, skipping", ii );
continue;
}
VECTOR2D dirUnit = dirVector / dirLength;
@@ -192,10 +209,19 @@ std::optional<VECTOR2I> GRID_HELPER::SnapToConstructionLines( const VECTOR2I& aP
double snapThreshold = aSnapRange;
if( activeDirection && *activeDirection == static_cast<int>( ii ) )
{
snapThreshold *= 1.5;
wxLogTrace( traceSnap, " Direction %zu: ACTIVE, increased snapThreshold=%.1f", ii, snapThreshold );
}
wxLogTrace( traceSnap, " Direction %zu: dir=(%d, %d), perpDist=%.1f, threshold=%.1f",
ii, dir.x, dir.y, perpDistance, snapThreshold );
if( perpDistance > snapThreshold )
{
wxLogTrace( traceSnap, " perpDistance > threshold, skipping" );
continue;
}
VECTOR2D candidate = projection;
@@ -203,43 +229,113 @@ std::optional<VECTOR2I> GRID_HELPER::SnapToConstructionLines( const VECTOR2I& aP
{
if( dir.x == 0 && dir.y != 0 )
{
// Vertical construction line: snap to grid intersection
candidate.x = origin.x;
candidate.y = aNearestGrid.y;
wxLogTrace( traceSnap, " Vertical snap: candidate=(%d, %d)",
(int)candidate.x, (int)candidate.y );
}
else if( dir.y == 0 && dir.x != 0 )
{
// Horizontal construction line: snap to grid intersection
candidate.x = aNearestGrid.x;
candidate.y = origin.y;
wxLogTrace( traceSnap, " Horizontal snap: candidate=(%d, %d)",
(int)candidate.x, (int)candidate.y );
}
else
{
double stepDistance = std::sqrt( aGrid.x * aGrid.x + aGrid.y * aGrid.y );
// Diagonal construction line: find nearest grid intersection along the line
// We need to find grid points near the projection point and pick the closest
// one that lies on the construction line
if( stepDistance == 0.0 )
continue;
// Get the grid origin for proper alignment
VECTOR2D gridOrigin( GetOrigin() );
double steps = std::round( distanceAlong / stepDistance );
candidate = originVec + dirUnit * ( steps * stepDistance );
// Calculate the projection point relative to grid
VECTOR2D relProjection = projection - gridOrigin;
// Find nearby grid points (check 9 points in a 3x3 grid around the projection)
std::vector<VECTOR2D> gridPoints;
for( int dx = -1; dx <= 1; ++dx )
{
for( int dy = -1; dy <= 1; ++dy )
{
double gridX = std::round( relProjection.x / aGrid.x ) * aGrid.x + dx * aGrid.x;
double gridY = std::round( relProjection.y / aGrid.y ) * aGrid.y + dy * aGrid.y;
gridPoints.push_back( VECTOR2D( gridX + gridOrigin.x, gridY + gridOrigin.y ) );
}
}
// Find the grid point closest to the construction line
double bestGridDist = std::numeric_limits<double>::max();
VECTOR2D bestGridPt = projection;
for( const VECTOR2D& gridPt : gridPoints )
{
// Calculate perpendicular distance from grid point to construction line
VECTOR2D gridDelta = gridPt - originVec;
double gridDistAlong = gridDelta.Dot( dirUnit );
VECTOR2D gridProjection = originVec + dirUnit * gridDistAlong;
double gridPerpDist = ( gridPt - gridProjection ).EuclideanNorm();
// Also consider distance from cursor
double distFromCursor = ( gridPt - cursorVec ).EuclideanNorm();
// Prefer grid points that are close to the line and close to cursor
double score = gridPerpDist + distFromCursor * 0.1;
if( score < bestGridDist )
{
bestGridDist = score;
bestGridPt = gridPt;
}
}
candidate = bestGridPt;
wxLogTrace( traceSnap, " Diagonal snap: candidate=(%.1f, %.1f), perpDist=%.1f",
candidate.x, candidate.y, bestGridDist );
}
}
else
{
wxLogTrace( traceSnap, " Grid disabled, using projection candidate=(%.1f, %.1f)",
candidate.x, candidate.y );
}
VECTOR2I candidateInt( KiROUND( candidate.x ), KiROUND( candidate.y ) );
if( candidateInt == m_skipPoint )
{
wxLogTrace( traceSnap, " candidateInt matches m_skipPoint, skipping" );
continue;
}
VECTOR2D candidateDelta( candidateInt.x - aPoint.x, candidateInt.y - aPoint.y );
double candidateDistance = candidateDelta.EuclideanNorm();
wxLogTrace( traceSnap, " candidateInt=(%d, %d), candidateDist=%.1f",
candidateInt.x, candidateInt.y, candidateDistance );
if( perpDistance < bestPerp
|| ( std::abs( perpDistance - bestPerp ) < 1e-9 && candidateDistance < bestDistance ) )
{
wxLogTrace( traceSnap, " NEW BEST: perpDist=%.1f, candDist=%.1f", perpDistance, candidateDistance );
bestPerp = perpDistance;
bestDistance = candidateDistance;
bestPoint = candidateInt;
}
}
if( bestPoint )
{
wxLogTrace( traceSnap, " RETURNING bestPoint=(%d, %d)", bestPoint->x, bestPoint->y );
}
else
{
wxLogTrace( traceSnap, " RETURNING nullopt (no valid snap found)" );
}
return bestPoint;
}
+7 -8
View File
@@ -59,12 +59,12 @@ void GRID_MENU::UpdateTitle()
void GRID_MENU::update()
{
APP_SETTINGS_BASE* settings = m_parent->config();
unsigned int current = settings->m_Window.grid.last_size_idx + ID_POPUP_GRID_START;
wxArrayString gridsList;
int i = ID_POPUP_GRID_START;
WINDOW_SETTINGS* cfg = m_parent->GetWindowSettings( m_parent->config() );
unsigned int current = cfg->grid.last_size_idx + ID_POPUP_GRID_START;
wxArrayString gridsList;
int i = ID_POPUP_GRID_START;
GRID_MENU::BuildChoiceList( &gridsList, settings, m_parent );
GRID_MENU::BuildChoiceList( &gridsList, cfg, m_parent );
while( GetMenuItemCount() > 0 )
Delete( FindItemByPosition( 0 ) );
@@ -80,8 +80,7 @@ void GRID_MENU::update()
}
void GRID_MENU::BuildChoiceList( wxArrayString* aGridsList, APP_SETTINGS_BASE* aCfg,
EDA_DRAW_FRAME* aParent )
void GRID_MENU::BuildChoiceList( wxArrayString* aGridsList, WINDOW_SETTINGS* aCfg, EDA_DRAW_FRAME* aParent )
{
wxString msg;
EDA_IU_SCALE scale = aParent->GetIuScale();
@@ -90,7 +89,7 @@ void GRID_MENU::BuildChoiceList( wxArrayString* aGridsList, APP_SETTINGS_BASE* a
aParent->GetUnitPair( primaryUnit, secondaryUnit );
for( GRID& gridSize : aCfg->m_Window.grid.grids )
for( GRID& gridSize : aCfg->grid.grids )
{
wxString name;
+28
View File
@@ -425,6 +425,28 @@ std::optional<TOOL_EVENT> TOOL_DISPATCHER::GetToolEvent( wxKeyEvent* aKeyEvent,
}
void TOOL_DISPATCHER::flushPendingClicks()
{
// When an escape key event arrives, keyboard events can be processed before mouse button
// events due to wxWidgets event queue ordering. If a mouse button was pressed and has since
// been released (detected via polling), we need to process that click before handling the
// escape to maintain proper event ordering.
for( BUTTON_STATE* st : m_buttons )
{
if( st->pressed && !st->GetState() )
{
st->pressed = false;
TOOL_EVENT clickEvt( TC_MOUSE, TA_MOUSE_CLICK, st->button );
clickEvt.SetMousePosition( st->downPosition );
m_toolMgr->ProcessEvent( clickEvt );
st->dragging = false;
}
}
}
void TOOL_DISPATCHER::DispatchWxEvent( wxEvent& aEvent )
{
bool motion = false;
@@ -543,6 +565,12 @@ void TOOL_DISPATCHER::DispatchWxEvent( wxEvent& aEvent )
keyIsEscape = ( ke->GetKeyCode() == WXK_ESCAPE );
// When escape is pressed shortly after a mouse click, the keyboard event can be
// processed before the mouse button release event. Flush any pending clicks first
// to ensure proper event ordering.
if( keyIsEscape )
flushPendingClicks();
if( KIUI::IsInputControlFocused( focus ) )
{
bool enabled = KIUI::IsInputControlEditable( focus );
+1
View File
@@ -60,6 +60,7 @@ const wxChar* const traceGit = wxT( "KICAD_GIT" );
const wxChar* const traceEagleIo = wxT( "KICAD_EAGLE_IO" );
const wxChar* const traceDesignBlocks = wxT( "KICAD_DESIGN_BLOCK" );
const wxChar* const traceLibFieldTable = wxT( "KICAD_LIB_FIELD_TABLE" );
const wxChar* const traceSnap = wxT( "KICAD_SNAP" );
wxString dump( const wxArrayString& aArray )
+16
View File
@@ -214,6 +214,22 @@ void WX_VIEW_CONTROLS::onMotion( wxMouseEvent& aEvent )
int y = mouseRel.y;
VECTOR2D mousePos( x, y );
// Clear keyboard cursor position flag when actual mouse motion is detected
// (i.e., not from cursor warping and position has changed)
if( !m_cursorWarped && m_settings.m_lastKeyboardCursorPositionValid )
{
VECTOR2I screenPos( x, y );
VECTOR2I keyboardScreenPos = m_view->ToScreen( m_settings.m_lastKeyboardCursorPosition );
// If mouse has moved to a different position than the keyboard cursor position,
// clear the keyboard position flag to allow mouse control
if( screenPos != keyboardScreenPos )
{
m_settings.m_lastKeyboardCursorPositionValid = false;
m_settings.m_lastKeyboardCursorPosition = { 0.0, 0.0 };
}
}
// Automatic focus switching between SCH and PCB windows on canvas mouse motion
if( m_settings.m_focusFollowSchPcb )
{
+6 -1
View File
@@ -22,9 +22,9 @@
*/
#include <wx/version.h>
#include <wx/sizer.h>
#include <widgets/app_progress_dialog.h>
APP_PROGRESS_DIALOG::APP_PROGRESS_DIALOG( const wxString& aTitle, const wxString& aMessage,
int aMaximum, wxWindow* aParent,
bool aIndeterminateTaskBarStatus, int aStyle )
@@ -39,6 +39,11 @@ APP_PROGRESS_DIALOG::APP_PROGRESS_DIALOG( const wxString& aTitle, const wxString
{
m_appProgressIndicator.Pulse();
}
Layout();
if( GetSizer() )
GetSizer()->Fit( this );
}
+10 -20
View File
@@ -208,11 +208,7 @@ void COLOR_SWATCH::setupEvents( bool aTriggerWithSingleClick )
{
if( dynamic_cast<DIALOG_SHIM*>( wxGetTopLevelParent( this ) ) )
{
m_swatch->Bind( wxEVT_LEFT_DOWN,
[this] ( wxMouseEvent& aEvt )
{
GetNewSwatchColor();
} );
m_swatch->Bind( wxEVT_LEFT_DOWN, &COLOR_SWATCH::onMouseEvent, this );
}
else
{
@@ -220,27 +216,15 @@ void COLOR_SWATCH::setupEvents( bool aTriggerWithSingleClick )
m_swatch->Bind( wxEVT_LEFT_DOWN, &COLOR_SWATCH::rePostEvent, this );
// bind the events that trigger the dialog
m_swatch->Bind( wxEVT_LEFT_DCLICK,
[this] ( wxMouseEvent& aEvt )
{
GetNewSwatchColor();
} );
m_swatch->Bind( wxEVT_LEFT_DCLICK, &COLOR_SWATCH::onMouseEvent, this );
if( aTriggerWithSingleClick )
{
m_swatch->Bind( wxEVT_LEFT_UP,
[this] ( wxMouseEvent& aEvt )
{
GetNewSwatchColor();
} );
m_swatch->Bind( wxEVT_LEFT_UP, &COLOR_SWATCH::onMouseEvent, this );
}
}
m_swatch->Bind( wxEVT_MIDDLE_DOWN,
[this] ( wxMouseEvent& aEvt )
{
GetNewSwatchColor();
} );
m_swatch->Bind( wxEVT_MIDDLE_DOWN, &COLOR_SWATCH::onMouseEvent, this );
m_swatch->Bind( wxEVT_RIGHT_DOWN, &COLOR_SWATCH::rePostEvent, this );
}
@@ -252,6 +236,12 @@ void COLOR_SWATCH::rePostEvent( wxEvent& aEvent )
}
void COLOR_SWATCH::onMouseEvent( wxEvent& )
{
GetNewSwatchColor();
}
static void sendSwatchChangeEvent( COLOR_SWATCH& aSender )
{
wxCommandEvent changeEvt( COLOR_SWATCH_CHANGED, aSender.GetId() );
+6 -1
View File
@@ -193,7 +193,12 @@ void KISTATUSBAR::HideBackgroundProgressBar()
void KISTATUSBAR::SetBackgroundProgress( int aAmount )
{
m_backgroundProgressBar->SetValue( aAmount );
int value = m_backgroundProgressBar->GetRange();
if( value <= aAmount )
value = aAmount;
m_backgroundProgressBar->SetValue( value );
}
+10 -4
View File
@@ -624,7 +624,11 @@ void mpFXY::Plot( wxDC& dc, mpWindow& w )
#else
int chunkSize = 100000;
#endif
if( dc.GetPen().GetStyle() == wxPENSTYLE_DOT )
wxPenStyle penStyle = dc.GetPen().GetStyle();
bool isSolidPen = ( penStyle == wxPENSTYLE_SOLID
|| penStyle == wxPENSTYLE_TRANSPARENT );
if( !isSolidPen )
chunkSize /= 500;
drawPoints.push_back( pointList[0] ); // push the first point in list
@@ -632,9 +636,11 @@ void mpFXY::Plot( wxDC& dc, mpWindow& w )
for( size_t ii = 1; ii < pointList.size()-1; ii++ )
{
// Skip intermediate points between the first point and the last point of the
// segment candidate
if( drawPoints.back().y == pointList[ii].y &&
drawPoints.back().y == pointList[ii+1].y )
// segment candidate. This optimization merges horizontal line segments, which
// breaks non-solid pen styles by altering segment lengths.
if( isSolidPen
&& drawPoints.back().y == pointList[ii].y
&& drawPoints.back().y == pointList[ii+1].y )
{
continue;
}
+53
View File
@@ -0,0 +1,53 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright The KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <widgets/report_severity.h>
#include <wx/intl.h>
#include <i18n_utility.h>
#include <vector>
wxString formatSeverities( int aSeverities )
{
wxString result;
std::vector<wxString> items;
if( aSeverities & RPT_SEVERITY_ERROR )
items.push_back( _( "Errors" ) );
if( aSeverities & RPT_SEVERITY_WARNING )
items.push_back( _( "Warnings" ) );
if( aSeverities & RPT_SEVERITY_EXCLUSION )
items.push_back( _( "Exclusions" ) );
if( items.empty() )
return _( "None" );
for( size_t i = 0; i < items.size(); i++ )
{
result += items[i];
if( i < items.size() - 1 )
result += wxS( ", " );
}
return result;
}
+6 -15
View File
@@ -513,16 +513,11 @@ bool WIDGET_HOTKEY_LIST::resolveKeyConflicts( TOOL_ACTION* aAction, long aKey )
}
WIDGET_HOTKEY_LIST::WIDGET_HOTKEY_LIST( wxWindow* aParent, HOTKEY_STORE& aHotkeyStore,
bool aReadOnly ) :
WIDGET_HOTKEY_LIST::WIDGET_HOTKEY_LIST( wxWindow* aParent, HOTKEY_STORE& aHotkeyStore ) :
wxTreeListCtrl( aParent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTL_SINGLE ),
m_hk_store( aHotkeyStore ),
m_readOnly( aReadOnly )
m_hk_store( aHotkeyStore )
{
wxString command_header = _( "Command" );
if( !m_readOnly )
command_header << wxS( " " ) << _( "(double-click to edit)" );
wxString command_header = _( "Command (double-click to edit)" );
AppendColumn( command_header, 450, wxALIGN_LEFT, wxCOL_RESIZABLE | wxCOL_SORTABLE );
AppendColumn( _( "Hotkey" ), 120, wxALIGN_LEFT, wxCOL_RESIZABLE | wxCOL_SORTABLE );
@@ -568,13 +563,9 @@ WIDGET_HOTKEY_LIST::WIDGET_HOTKEY_LIST( wxWindow* aParent, HOTKEY_STORE& aHotkey
GetDataView()->SetIndent( 10 );
if( !m_readOnly )
{
// The event only apply if the widget is in editable mode
Bind( wxEVT_TREELIST_ITEM_ACTIVATED, &WIDGET_HOTKEY_LIST::onActivated, this );
Bind( wxEVT_TREELIST_ITEM_CONTEXT_MENU, &WIDGET_HOTKEY_LIST::onContextMenu, this );
Bind( wxEVT_MENU, &WIDGET_HOTKEY_LIST::onMenu, this );
}
Bind( wxEVT_TREELIST_ITEM_ACTIVATED, &WIDGET_HOTKEY_LIST::onActivated, this );
Bind( wxEVT_TREELIST_ITEM_CONTEXT_MENU, &WIDGET_HOTKEY_LIST::onContextMenu, this );
Bind( wxEVT_MENU, &WIDGET_HOTKEY_LIST::onMenu, this );
}
+50 -18
View File
@@ -30,6 +30,7 @@
#include <wx/sizer.h>
#include <wx/stattext.h>
#include <wx/timer.h>
#include <wx/dcclient.h>
#include <eda_base_frame.h>
#ifdef __WXMSW__
@@ -236,11 +237,28 @@ void WX_INFOBAR::onSize( wxSizeEvent& aEvent )
if( !sizer )
return;
wxSizerItem* text = sizer->GetItem( 1 );
// wx3.3 moved the sizer we previously wanted deeper into sizers...
// do we actually still need this for wx3.3?
#if wxCHECK_VERSION( 3, 3, 0 )
wxSizerItem* outerSizer = sizer->GetItem( (size_t) 0 );
wxSizerItem* textSizer = nullptr;
if( text )
if (outerSizer->IsSizer())
{
if( auto textCtrl = dynamic_cast<wxStaticText*>( text->GetWindow() ) )
wxBoxSizer* innerSizer1 = dynamic_cast<wxBoxSizer*>( outerSizer->GetSizer() );
wxBoxSizer* innerSizer2 =
dynamic_cast<wxBoxSizer*>( innerSizer1->GetItem((size_t)0)->GetSizer() );
if( innerSizer2 )
textSizer = innerSizer2->GetItem( 1 );
}
#else
wxSizerItem* textSizer = sizer->GetItem( 1 );
#endif
if( textSizer )
{
if( wxStaticText* textCtrl = dynamic_cast<wxStaticText*>( textSizer->GetWindow() ) )
textCtrl->SetLabelText( m_message );
}
@@ -257,9 +275,9 @@ void WX_INFOBAR::onSize( wxSizeEvent& aEvent )
if( barWidth != parentWidth )
SetSize( parentWidth, GetSize().GetHeight() );
if( text )
if( textSizer )
{
if( auto textCtrl = dynamic_cast<wxStaticText*>( text->GetWindow() ) )
if( wxStaticText* textCtrl = dynamic_cast<wxStaticText*>( textSizer->GetWindow() ) )
{
// Re-wrap the text (this is done automatically later but we need it now)
// And count how many lines we need. If we have embedded newlines, then
@@ -267,10 +285,18 @@ void WX_INFOBAR::onSize( wxSizeEvent& aEvent )
// min height for the control. The min height of the text control will be the size
// of a single line of text. This assumes that two lines of text are larger
// than the height of the icon for the bar.
textCtrl->Wrap( text->GetSize().GetWidth() );
wxString new_text = textCtrl->GetLabel();
int height = ( new_text.Freq( '\n' ) + 1 ) * text->GetMinSize().GetHeight();
SetMinSize( wxSize( GetSize().GetWidth(), height ) );
textCtrl->Wrap( -1 );
wxString wrapped_text = textCtrl->GetLabel();
int line_count = wrapped_text.Freq( '\n' ) + 1;
int txt_h, txt_v;
wxWindowDC dc( textCtrl );
dc.GetTextExtent( wxT( "Xp" ), &txt_h, &txt_v );
int height = txt_v * line_count;
int margins = txt_v - 1;
SetMinSize( wxSize( GetSize().GetWidth(), height + margins ) );
textCtrl->Wrap( -1 );
}
}
@@ -323,7 +349,10 @@ void WX_INFOBAR::AddButton( wxButton* aButton )
element->SetFlag( wxSTRETCH_MASK );
if( IsShownOnScreen() )
sizer->Layout();
{
Layout();
sizer->Fit( this );
}
}
@@ -336,7 +365,10 @@ void WX_INFOBAR::AddButton( wxHyperlinkCtrl* aHypertextButton )
sizer->Add( aHypertextButton, wxSizerFlags().Centre().Border( wxRIGHT ).Shaped() );
if( IsShownOnScreen() )
sizer->Layout();
{
Layout();
sizer->Fit( this );
}
}
@@ -498,13 +530,13 @@ void INFOBAR_REPORTER::Finalize()
switch( m_severity )
{
case RPT_SEVERITY_UNDEFINED: icon = wxICON_INFORMATION; break;
case RPT_SEVERITY_INFO: icon = wxICON_INFORMATION; break;
case RPT_SEVERITY_EXCLUSION: icon = wxICON_WARNING; break;
case RPT_SEVERITY_ACTION: icon = wxICON_WARNING; break;
case RPT_SEVERITY_WARNING: icon = wxICON_WARNING; break;
case RPT_SEVERITY_ERROR: icon = wxICON_ERROR; break;
case RPT_SEVERITY_IGNORE: icon = wxICON_INFORMATION; break;
case RPT_SEVERITY_DEBUG: icon = wxICON_INFORMATION; break;
case RPT_SEVERITY_INFO: icon = wxICON_INFORMATION; break;
case RPT_SEVERITY_EXCLUSION: icon = wxICON_WARNING; break;
case RPT_SEVERITY_ACTION: icon = wxICON_WARNING; break;
case RPT_SEVERITY_WARNING: icon = wxICON_WARNING; break;
case RPT_SEVERITY_ERROR: icon = wxICON_ERROR; break;
case RPT_SEVERITY_IGNORE: icon = wxICON_INFORMATION; break;
case RPT_SEVERITY_DEBUG: icon = wxICON_INFORMATION; break;
}
if( m_message->EndsWith( wxS( "\n" ) ) )
-2
View File
@@ -32,7 +32,6 @@ include_directories( BEFORE ${INC_BEFORE} )
include_directories(
${CMAKE_SOURCE_DIR}/common
${CMAKE_SOURCE_DIR}/common/dialogs
${CMAKE_SOURCE_DIR}/libs/sexpr/include
${INC_AFTER}
./dialogs
./libview
@@ -609,7 +608,6 @@ target_link_libraries( eeschema_kiface
eeschema_kiface_objects
markdown_lib
scripting
sexpr
core
Boost::headers
${wxWidgets_LIBRARIES}
+26 -3
View File
@@ -45,11 +45,34 @@ public:
return std::make_shared<BUS_ALIAS>( *this );
}
wxString GetName() { return m_name; }
void SetName( const wxString& aName ) { m_name = aName; }
wxString GetName() const { return m_name; }
void SetName( const wxString& aName ) { m_name = aName.Strip( wxString::both ); }
const std::vector<wxString>& Members() const { return m_members; }
std::vector<wxString>& Members() { return m_members; }
void SetMembers( const std::vector<wxString>& aMembers )
{
m_members.clear();
for( const wxString& member : aMembers )
{
wxString trimmed = member.Strip( wxString::both );
if( !trimmed.IsEmpty() )
m_members.push_back( trimmed );
}
}
void AddMember( const wxString& aMember )
{
wxString trimmed = aMember.Strip( wxString::both );
if( !trimmed.IsEmpty() )
m_members.push_back( trimmed );
}
void ClearMembers() { m_members.clear(); }
SCH_SCREEN* GetParent() { return m_parent; }
void SetParent( SCH_SCREEN* aParent ) { m_parent = aParent; }
+107 -18
View File
@@ -151,8 +151,8 @@ bool CONNECTION_SUBGRAPH::ResolveDrivers( bool aCheckMultipleDrivers )
SCH_PIN* pa = static_cast<SCH_PIN*>( a );
SCH_PIN* pb = static_cast<SCH_PIN*>( b );
bool aPower = pa->GetLibPin()->GetParentSymbol()->IsPower();
bool bPower = pb->GetLibPin()->GetParentSymbol()->IsPower();
bool aPower = pa->IsOnPowerSymbol();
bool bPower = pb->IsOnPowerSymbol();
if( aPower && !bPower )
return true;
@@ -327,6 +327,7 @@ std::vector<SCH_ITEM*> CONNECTION_SUBGRAPH::GetAllBusLabels() const
{
case SCH_LABEL_T:
case SCH_GLOBAL_LABEL_T:
case SCH_HIER_LABEL_T:
{
CONNECTION_TYPE type = item->Connection( &m_sheet )->Type();
@@ -356,6 +357,7 @@ std::vector<SCH_ITEM*> CONNECTION_SUBGRAPH::GetVectorBusLabels() const
{
case SCH_LABEL_T:
case SCH_GLOBAL_LABEL_T:
case SCH_HIER_LABEL_T:
{
SCH_CONNECTION* label_conn = item->Connection( &m_sheet );
@@ -441,13 +443,13 @@ CONNECTION_SUBGRAPH::GetNetclassesForDriver( SCH_ITEM* aItem ) const
// Get netclasses on attached rule areas
for( SCH_RULE_AREA* ruleArea : ruleAreaCache )
{
const std::vector<std::pair<wxString, SCH_ITEM*>> ruleNetclasses =
ruleArea->GetResolvedNetclasses();
const std::vector<std::pair<wxString, SCH_ITEM*>> ruleAreaNetclasses =
ruleArea->GetResolvedNetclasses( &m_sheet );
if( ruleNetclasses.size() > 0 )
if( ruleAreaNetclasses.size() > 0 )
{
foundNetclasses.insert( foundNetclasses.end(), ruleNetclasses.begin(),
ruleNetclasses.end() );
foundNetclasses.insert( foundNetclasses.end(), ruleAreaNetclasses.begin(),
ruleAreaNetclasses.end() );
}
}
@@ -1638,6 +1640,10 @@ void CONNECTION_GRAPH::generateBusAliasMembers()
for( const auto& conn : dummy.Members() )
{
// Only create subgraphs for NET members, not nested buses
if( !conn->IsNet() )
continue;
wxString name = conn->FullLocalName();
CONNECTION_SUBGRAPH* new_sg = new CONNECTION_SUBGRAPH( this );
@@ -1684,6 +1690,32 @@ void CONNECTION_GRAPH::generateGlobalPowerPinSubGraphs()
// These are NOT limited to power symbols, we support legacy invisible + power-in pins
// on non-power symbols.
// Sort power pins for deterministic processing order. This ensures that when multiple
// power pins share the same net name, the same pin consistently creates the subgraph
// across different ERC runs.
std::sort( m_global_power_pins.begin(), m_global_power_pins.end(),
[]( const std::pair<SCH_SHEET_PATH, SCH_PIN*>& a,
const std::pair<SCH_SHEET_PATH, SCH_PIN*>& b )
{
int pathCmp = a.first.Cmp( b.first );
if( pathCmp != 0 )
return pathCmp < 0;
const SCH_SYMBOL* symA = static_cast<const SCH_SYMBOL*>( a.second->GetParentSymbol() );
const SCH_SYMBOL* symB = static_cast<const SCH_SYMBOL*>( b.second->GetParentSymbol() );
wxString refA = symA ? symA->GetRef( &a.first, false ) : wxString();
wxString refB = symB ? symB->GetRef( &b.first, false ) : wxString();
int refCmp = refA.Cmp( refB );
if( refCmp != 0 )
return refCmp < 0;
return a.second->GetNumber().Cmp( b.second->GetNumber() ) < 0;
} );
std::unordered_map<int, CONNECTION_SUBGRAPH*> global_power_pin_subgraphs;
for( const auto& it : m_global_power_pins )
@@ -1692,7 +1724,7 @@ void CONNECTION_GRAPH::generateGlobalPowerPinSubGraphs()
SCH_PIN* pin = it.second;
if( !pin->ConnectedItems( sheet ).empty()
&& !pin->GetLibPin()->GetParentSymbol()->IsPower() )
&& !pin->IsOnPowerSymbol() )
{
// ERC will warn about this: user has wired up an invisible pin
continue;
@@ -1707,7 +1739,7 @@ void CONNECTION_GRAPH::generateGlobalPowerPinSubGraphs()
// Proper modern power symbols get their net name from the value field
// in the symbol, but we support legacy non-power symbols with global
// power connections based on invisible, power-in, pin's names.
if( pin->GetLibPin()->GetParentSymbol()->IsPower() )
if( pin->IsOnPowerSymbol() )
connection->SetName( pin->GetParentSymbol()->GetValue( true, &sheet, false ) );
else
connection->SetName( pin->GetShownName() );
@@ -2316,12 +2348,19 @@ void CONNECTION_GRAPH::buildConnectionGraph( std::function<void( SCH_ITEM* )>* a
if( jj == m_net_name_to_subgraphs_map.end() )
continue;
for( CONNECTION_SUBGRAPH* old_sg : jj->second )
// Copy the vector to avoid iterator invalidation when recaching
std::vector<CONNECTION_SUBGRAPH*> old_subgraphs = jj->second;
for( CONNECTION_SUBGRAPH* old_sg : old_subgraphs )
{
while( old_sg->m_absorbed )
old_sg = old_sg->m_absorbed_by;
wxString old_sg_name = old_sg->m_driver_connection->Name();
old_sg->m_driver_connection->Clone( *conn );
if( old_sg_name != old_sg->m_driver_connection->Name() )
recacheSubgraphName( old_sg, old_sg_name );
}
}
}
@@ -2692,9 +2731,30 @@ void CONNECTION_GRAPH::propagateToNeighbors( CONNECTION_SUBGRAPH* aSubgraph, boo
auto propagate_bus_neighbors = [&]( CONNECTION_SUBGRAPH* aParentGraph )
{
// Sort bus neighbors by name to ensure deterministic processing order.
// When multiple bus members (e.g., A0, A1, A2, A3) all connect to the same
// shorted net in a child sheet, the first one processed "wins" and sets
// the net name. Sorting ensures the alphabetically-first name is chosen.
std::vector<std::shared_ptr<SCH_CONNECTION>> sortedMembers;
for( const auto& kv : aParentGraph->m_bus_neighbors )
sortedMembers.push_back( kv.first );
std::sort( sortedMembers.begin(), sortedMembers.end(),
[]( const std::shared_ptr<SCH_CONNECTION>& a,
const std::shared_ptr<SCH_CONNECTION>& b )
{
return a->Name() < b->Name();
} );
for( const std::shared_ptr<SCH_CONNECTION>& member_conn : sortedMembers )
{
for( CONNECTION_SUBGRAPH* neighbor : kv.second )
const auto& kv_it = aParentGraph->m_bus_neighbors.find( member_conn );
if( kv_it == aParentGraph->m_bus_neighbors.end() )
continue;
for( CONNECTION_SUBGRAPH* neighbor : kv_it->second )
{
// May have been absorbed but won't have been deleted
while( neighbor->m_absorbed )
@@ -2705,12 +2765,12 @@ void CONNECTION_GRAPH::propagateToNeighbors( CONNECTION_SUBGRAPH* aSubgraph, boo
// Now member may be out of date, since we just cloned the
// connection from higher up in the hierarchy. We need to
// figure out what the actual new connection is.
SCH_CONNECTION* member = matchBusMember( parent, kv.first.get() );
SCH_CONNECTION* member = matchBusMember( parent, member_conn.get() );
if( !member )
{
// Try harder: we might match on a secondary driver
for( CONNECTION_SUBGRAPH* sg : kv.second )
for( CONNECTION_SUBGRAPH* sg : kv_it->second )
{
if( sg->m_multiple_drivers )
{
@@ -2735,7 +2795,7 @@ void CONNECTION_GRAPH::propagateToNeighbors( CONNECTION_SUBGRAPH* aSubgraph, boo
if( !member )
{
wxLogTrace( ConnTrace, wxS( "Could not match bus member %s in %s" ),
kv.first->Name(), parent->Name() );
member_conn->Name(), parent->Name() );
continue;
}
@@ -2749,9 +2809,27 @@ void CONNECTION_GRAPH::propagateToNeighbors( CONNECTION_SUBGRAPH* aSubgraph, boo
if( neighbor_name == member->Name() )
continue;
// Was this neighbor already updated from a different sheet? Don't rename it again
// Was this neighbor already updated from a different sheet? Don't rename it again,
// unless this same parent bus updated it and the bus member name has since changed
// (which can happen when a bus member is renamed via stale member update, issue #18299).
if( neighbor_conn->Sheet() != neighbor->m_sheet )
continue;
{
// If the neighbor's connection sheet doesn't match this parent bus's sheet,
// it was updated by a different bus entirely. Don't override.
if( neighbor_conn->Sheet() != parent->Sheet() )
continue;
// If the neighbor's connection sheet matches this parent bus's sheet but
// the names differ, check if the neighbor's current name still matches
// a member of this bus. If it does, the neighbor was updated by a different
// member of this same bus and we should preserve that (determinism).
// If it doesn't match any member, the bus member was renamed and we should update.
SCH_CONNECTION temp( nullptr, neighbor->m_sheet );
temp.ConfigureFromLabel( neighbor_name );
if( matchBusMember( parent, &temp ) )
continue;
}
// Safety check against infinite recursion
wxCHECK2_MSG( neighbor_conn->IsNet(), continue,
@@ -2776,6 +2854,17 @@ void CONNECTION_GRAPH::propagateToNeighbors( CONNECTION_SUBGRAPH* aSubgraph, boo
// Recurse onto this neighbor in case it needs to re-propagate
neighbor->m_dirty = true;
propagateToNeighbors( neighbor, aForce );
// After hierarchy propagation, the neighbor's connection may have been
// updated to a higher-priority driver (e.g., a power symbol discovered
// through hierarchical sheet pins). If so, update the bus member to match.
// This ensures that net names propagate correctly through bus connections
// that span hierarchical boundaries (issue #18119).
if( neighbor_conn->Name() != member->Name() )
{
member->Clone( *neighbor_conn );
stale_bus_members.insert( member );
}
}
}
}
@@ -3775,7 +3864,7 @@ bool CONNECTION_GRAPH::ercCheckNoConnects( const CONNECTION_SUBGRAPH* aSubgraph
// net items by name, because usually failing to connect them graphically is a mistake
if( pin && !has_other_connections
&& !pin->IsGlobalPower()
&& !pin->GetLibPin()->GetParentSymbol()->IsPower() )
&& !pin->IsOnPowerSymbol() )
{
wxString name = pin->Connection( &sheet )->Name();
wxString local_name = pin->Connection( &sheet )->Name( true );
@@ -3814,7 +3903,7 @@ bool CONNECTION_GRAPH::ercCheckNoConnects( const CONNECTION_SUBGRAPH* aSubgraph
// We only apply this test to power symbols, because other symbols have
// pins that are meant to be dangling, but the power symbols have pins
// that are *not* meant to be dangling.
if( testPin->GetLibPin()->GetParentSymbol()->IsPower()
if( testPin->IsOnPowerSymbol()
&& testPin->ConnectedItems( sheet ).empty()
&& settings.IsTestEnabled( ERCE_PIN_NOT_CONNECTED ) )
{
+21
View File
@@ -1058,6 +1058,27 @@ void SCH_EDIT_FRAME::KiwayMailIn( KIWAY_EXPRESS& mail )
SyncView();
break;
case MAIL_SCH_NAVIGATE_TO_SHEET:
{
wxString targetFile( payload );
for( SCH_SHEET_PATH& sheetPath : Schematic().Hierarchy() )
{
SCH_SCREEN* screen = sheetPath.LastScreen();
if( screen && screen->GetFileName() == targetFile )
{
m_toolManager->RunAction<SCH_SHEET_PATH*>( SCH_ACTIONS::changeSheet, &sheetPath );
payload = "success";
Raise();
return;
}
}
payload.clear();
break;
}
default:;
}
@@ -640,15 +640,6 @@ int DIALOG_CHANGE_SYMBOLS::processSymbols( SCH_COMMIT* aCommit,
screen->Remove( symbol );
SCH_SYMBOL* symbol_copy = static_cast<SCH_SYMBOL*>( symbol->Clone() );
aCommit->Modified( symbol, symbol_copy, screen );
CONNECTION_GRAPH* connectionGraph = screen->Schematic()->ConnectionGraph();
// When we replace the lib symbol below, we free the associated pins if the new symbol has
// fewer than the original. This will cause the connection graph to be out of date unless
// we replace references in the graph to the old symbol/pins with references to the ones
// stored in the undo stack.
if( connectionGraph )
connectionGraph->ExchangeItem( symbol, symbol_copy );
}
for( const auto& [ symbol, symbol_change_info ] : symbols )
+12 -5
View File
@@ -49,7 +49,7 @@
#include <wx/filedlg.h>
#include <wx/hyperlink.h>
#include <wx/msgdlg.h>
#include <wx/wupdlock.h>
#include <sch_edit_tool.h>
wxDEFINE_EVENT( EDA_EVT_CLOSE_ERC_DIALOG, wxCommandEvent );
@@ -93,6 +93,10 @@ DIALOG_ERC::DIALOG_ERC( SCH_EDIT_FRAME* parent ) :
m_markerDataView->AssociateModel( m_markerTreeModel );
m_markerTreeModel->Update( m_markerProvider, m_severities );
// Prevent RTL locales from mirroring the text in the data views
m_markerDataView->SetLayoutDirection( wxLayout_LeftToRight );
m_ignoredList->SetLayoutDirection( wxLayout_LeftToRight );
m_ignoredList->InsertColumn( 0, wxEmptyString, wxLIST_FORMAT_LEFT, DEFAULT_SINGLE_COL_WIDTH );
if( m_currentSchematic == g_lastERCSchematic )
@@ -124,13 +128,14 @@ DIALOG_ERC::DIALOG_ERC( SCH_EDIT_FRAME* parent ) :
UpdateAnnotationWarning();
Layout();
SetFocus();
syncCheckboxes();
updateDisplayedCounts();
Layout();
GetSizer()->Fit( this );
// Now all widgets have the size fixed, call FinishDialogSettings
finishDialogSettings();
}
@@ -1041,7 +1046,7 @@ void DIALOG_ERC::deleteAllMarkers( bool aIncludeExclusions )
// Clear current selection list to avoid selection of deleted items
// Freeze to avoid repainting the dialog, which can cause a RePaint()
// of the screen as well
wxWindowUpdateLocker updateLock( this );
Freeze();
m_parent->GetToolManager()->RunAction( SCH_ACTIONS::clearSelection );
@@ -1049,6 +1054,8 @@ void DIALOG_ERC::deleteAllMarkers( bool aIncludeExclusions )
SCH_SCREENS screens( m_parent->Schematic().Root() );
screens.DeleteAllMarkers( MARKER_BASE::MARKER_ERC, aIncludeExclusions );
Thaw();
}
@@ -1074,7 +1081,7 @@ void DIALOG_ERC::OnSaveReport( wxCommandEvent& aEvent )
fn.MakeAbsolute( prj_path );
}
ERC_REPORT reportWriter( &m_parent->Schematic(), m_parent->GetUserUnits() );
ERC_REPORT reportWriter( &m_parent->Schematic(), m_parent->GetUserUnits(), m_markerProvider );
bool success = false;
if( fn.GetExt() == FILEEXT::JsonFileExtension )
+4 -1
View File
@@ -683,6 +683,7 @@ bool DIALOG_LABEL_PROPERTIES::TransferDataFromWindow()
case SCH_GLOBAL_LABEL_T:
{
SCH_GLOBALLABEL* label = new SCH_GLOBALLABEL( *static_cast<SCH_GLOBALLABEL*>( m_currentLabel ) );
const_cast<KIID&>( label->m_Uuid ) = KIID(); // Gives a new UUID to the copy
label->SetText( text );
m_labelList->push_back( std::unique_ptr<SCH_LABEL_BASE>( label ) );
break;
@@ -690,6 +691,7 @@ bool DIALOG_LABEL_PROPERTIES::TransferDataFromWindow()
case SCH_HIER_LABEL_T:
{
SCH_HIERLABEL* label = new SCH_HIERLABEL( *static_cast<SCH_HIERLABEL*>( m_currentLabel ) );
const_cast<KIID&>( label->m_Uuid ) = KIID();
label->SetText( text );
m_labelList->push_back( std::unique_ptr<SCH_LABEL_BASE>( label ) );
break;
@@ -697,6 +699,7 @@ bool DIALOG_LABEL_PROPERTIES::TransferDataFromWindow()
case SCH_LABEL_T:
{
SCH_LABEL* label = new SCH_LABEL( *static_cast<SCH_LABEL*>( m_currentLabel ) );
const_cast<KIID&>( label->m_Uuid ) = KIID();
label->SetText( text );
m_labelList->push_back( std::unique_ptr<SCH_LABEL_BASE>( label ) );
break;
@@ -956,7 +959,7 @@ void DIALOG_LABEL_PROPERTIES::onMultiLabelCheck( wxCommandEvent& event )
wxString multiText = m_valueMultiLine->GetValue();
m_valueCombo->SetValue( multiText.BeforeFirst( '\n' ) );
m_activeTextEntry = m_valueCombo;
SetInitialFocus( m_valueCombo );
SetInitialFocus( m_valueCombo->GetTextCtrl() );
}
}
else if( m_currentLabel->Type() == SCH_HIER_LABEL_T )
@@ -963,6 +963,7 @@ void DIALOG_LIB_EDIT_PIN_TABLE::OnAddRow( wxCommandEvent& event )
newPin->SetType( last->GetType() );
newPin->SetShape( last->GetShape() );
newPin->SetUnit( last->GetUnit() );
newPin->SetBodyStyle( last->GetBodyStyle() );
VECTOR2I pos = last->GetPosition();
+34 -22
View File
@@ -399,39 +399,37 @@ void DIALOG_LIB_FIELDS::loadSymbols( const wxArrayString& aSymbolNames )
// Clear any existing data
m_symbolsList.clear();
try
wxString libName = m_parent->GetTreeLIBID().GetLibNickname();
if( aSymbolNames.IsEmpty() )
{
if( aSymbolNames.IsEmpty() )
wxMessageBox( wxString::Format( _( "No symbols found in library %s." ), m_libId ) );
return;
}
// Load each symbol from the library manager and add it to our list
for( const wxString& symbolName : aSymbolNames )
{
LIB_SYMBOL* canvasSymbol = m_parent->GetCurSymbol();
if( canvasSymbol && canvasSymbol->GetLibraryName() == libName && canvasSymbol->GetName() == symbolName )
{
wxMessageBox( wxString::Format( _( "No symbols found in library %s." ), m_libId ) );
return;
m_symbolsList.push_back( canvasSymbol );
}
// Load each symbol from the library manager and add it to our list
for( const wxString& symbolName : aSymbolNames )
else
{
LIB_SYMBOL* symbol = nullptr;
try
{
symbol = m_parent->GetLibManager().GetAlias( symbolName, m_libId );
if( symbol )
if( LIB_SYMBOL* symbol = m_parent->GetLibManager().GetAlias( symbolName, libName ) )
m_symbolsList.push_back( symbol );
}
catch( const IO_ERROR& ioe )
{
// Log the error and continue
wxLogWarning( wxString::Format( _( "Error loading symbol %s: %s" ), symbolName, ioe.What() ) );
wxLogWarning( wxString::Format( _( "Error loading symbol '%s': %s" ), symbolName, ioe.What() ) );
}
}
}
catch( const IO_ERROR& ioe )
{
wxString msg = wxString::Format( _( "Error accessing library %s.\n\n%s" ), m_libId, ioe.What() );
DisplayErrorMessage( this, msg );
return;
}
if( m_symbolsList.empty() )
{
@@ -484,10 +482,15 @@ bool DIALOG_LIB_FIELDS::TransferDataFromWindow()
if( !wxDialog::TransferDataFromWindow() )
return false;
bool updateCanvas = false;
m_dataModel->ApplyData(
[&]( LIB_SYMBOL* )
[&]( LIB_SYMBOL* symb )
{
m_parent->OnModify();
m_parent->GetLibManager().UpdateSymbol( symb, symb->GetLibNickname() );
if( m_parent->GetCurSymbol() == symb )
updateCanvas = true;
},
[&]()
{
@@ -551,6 +554,15 @@ bool DIALOG_LIB_FIELDS::TransferDataFromWindow()
wxLogTrace( traceLibFieldTable, "About to rebuild grid rows to include new symbols" );
RegroupSymbols();
wxLogTrace( traceLibFieldTable, "Grid rebuild completed" );
m_parent->RefreshLibraryTree();
if( updateCanvas )
{
m_parent->OnModify();
m_parent->HardRedraw();
}
return true;
}
@@ -907,7 +919,6 @@ void DIALOG_LIB_FIELDS::UpdateFieldList()
AddField( wxS( "${EXCLUDE_FROM_BOARD}" ), _( "Exclude From Board" ), true, false, false, true );
AddField( wxS( "Power" ), _( "Power Symbol" ), true, false, false, true );
AddField( wxS( "LocalPower" ), _( "Local Power Symbol" ), true, false, false, true );
// User fields next
std::set<wxString> userFieldNames;
@@ -1067,6 +1078,7 @@ void DIALOG_LIB_FIELDS::SetupColumnProperties( int aCol )
{
// Create symbol netlist for footprint picker
wxString symbolNetlist;
if( !m_symbolsList.empty() )
{
// Use the first symbol's netlist (all symbols in lib should have similar pin structure)
@@ -41,6 +41,7 @@
#include <project_sch.h>
#include <refdes_utils.h>
#include <dialog_sim_model.h>
#include <vector>
#include <panel_embedded_files.h>
#include <settings/settings_manager.h>
@@ -69,7 +70,19 @@ DIALOG_LIB_SYMBOL_PROPERTIES::DIALOG_LIB_SYMBOL_PROPERTIES( SYMBOL_EDIT_FRAME* a
m_delayedFocusPage( -1 ),
m_fpFilterTricks( std::make_unique<LISTBOX_TRICKS>( *this, *m_FootprintFilterListBox ) )
{
m_embeddedFiles = new PANEL_EMBEDDED_FILES( m_NoteBook, m_libEntry );
std::vector<const EMBEDDED_FILES*> inheritedEmbeddedFiles;
if( std::shared_ptr<LIB_SYMBOL> parent = m_libEntry->GetParent().lock() )
{
while( parent )
{
inheritedEmbeddedFiles.push_back( parent->GetEmbeddedFiles() );
parent = parent->GetParent().lock();
}
}
m_embeddedFiles = new PANEL_EMBEDDED_FILES( m_NoteBook, m_libEntry, 0,
std::move( inheritedEmbeddedFiles ) );
m_NoteBook->AddPage( m_embeddedFiles, _( "Embedded Files" ) );
// Give a bit more room for combobox editors
@@ -197,7 +210,7 @@ bool DIALOG_LIB_SYMBOL_PROPERTIES::TransferDataToWindow()
// and mark any matching names as inherited rather than duplicating them.
if( m_libEntry->IsAlias() )
{
if( LIB_SYMBOL_SPTR parent = m_libEntry->GetParent().lock() )
if( std::shared_ptr<LIB_SYMBOL> parent = m_libEntry->GetParent().lock() )
{
std::vector<SCH_FIELD*> parentFields;
parent->GetFields( parentFields );
@@ -330,7 +343,7 @@ bool DIALOG_LIB_SYMBOL_PROPERTIES::TransferDataToWindow()
m_inheritanceSelectCombo->Append( symbolNames );
if( LIB_SYMBOL_SPTR rootSymbol = m_libEntry->GetParent().lock() )
if( std::shared_ptr<LIB_SYMBOL> rootSymbol = m_libEntry->GetParent().lock() )
{
wxString parentName = UnescapeString( rootSymbol->GetName() );
int selection = m_inheritanceSelectCombo->FindString( parentName );
@@ -436,7 +449,7 @@ bool DIALOG_LIB_SYMBOL_PROPERTIES::TransferDataFromWindow()
if( !wxDialog::TransferDataFromWindow() )
return false;
if( !m_grid->CommitPendingChanges() )
if( !m_grid->CommitPendingChanges() || !m_embeddedFiles->TransferDataFromWindow() )
return false;
wxString newName = EscapeString( m_SymbolNameCtrl->GetValue(), CTX_LIBID );
+4 -1
View File
@@ -129,7 +129,10 @@ bool DIALOG_LINE_PROPERTIES::TransferDataFromWindow()
for( SCH_LINE* line : m_lines )
{
commit.Modify( line, m_frame->GetScreen() );
// Commit the change only if the line is not new. If new this is useless
// and can create dangling pointers if the line creation is aborted
if( !line->HasFlag( IS_NEW ) )
commit.Modify( line, m_frame->GetScreen() );
if( !m_width.IsIndeterminate() )
line->SetLineWidth( std::max( 0, m_width.GetIntValue() ) );
@@ -59,8 +59,7 @@ void DIALOG_SCH_IMPORT_SETTINGS::OnBrowseClicked( wxCommandEvent& event )
fn.SetExt( FILEEXT::ProjectFileExtension );
wxFileDialog dlg( this, _( "Import Settings From" ), fn.GetPath(), fn.GetFullName(),
FILEEXT::ProjectFileWildcard(),
wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_CHANGE_DIR );
FILEEXT::ProjectFileWildcard(), wxFD_OPEN | wxFD_FILE_MUST_EXIST );
if( dlg.ShowModal() == wxID_OK )
m_filePathCtrl->SetValue( dlg.GetPath() );
@@ -85,6 +85,28 @@ DIALOG_SCH_FIND::DIALOG_SCH_FIND( SCH_EDIT_FRAME* aParent, SCH_SEARCH_DATA* aDat
GetSizer()->Fit( this ); // Needed on Ubuntu/Unity to display the dialog
Connect( wxEVT_CHAR, wxKeyEventHandler( DIALOG_SCH_FIND::OnChar ), nullptr, this );
// Set up tab order for proper keyboard navigation.
// This is needed because wxComboBox on GTK has issues with Tab key navigation.
m_tabOrder = {
m_comboFind,
m_comboReplace,
m_radioForward,
m_radioBackward,
m_checkMatchCase,
m_checkWholeWord,
m_checkRegexMatch,
m_checkAllPins,
m_checkAllFields,
m_checkCurrentSheetOnly,
m_checkSelectedOnly,
m_checkReplaceReferences,
m_checkConnections,
m_buttonFind,
m_buttonReplace,
m_buttonReplaceAll,
m_buttonCancel
};
}
+38 -2
View File
@@ -89,8 +89,21 @@ DIALOG_SIM_MODEL<T>::DIALOG_SIM_MODEL( wxWindow* aParent, EDA_BASE_FRAME* aFrame
}
if( EMBEDDED_FILES* symbolEmbeddedFiles = aSymbol.GetEmbeddedFiles() )
{
m_filesStack.push_back( symbolEmbeddedFiles );
if constexpr (std::is_same_v<T, SCH_SYMBOL>)
{
SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( &aSymbol );
symbol->GetLibSymbolRef()->AppendParentEmbeddedFiles( m_filesStack );
}
else if constexpr (std::is_same_v<T, LIB_SYMBOL>)
{
LIB_SYMBOL* symbol = static_cast<LIB_SYMBOL*>( &aSymbol );
symbol->AppendParentEmbeddedFiles( m_filesStack );
}
}
m_libraryModelsMgr.SetFilesStack( m_filesStack );
m_builtinModelsMgr.SetFilesStack( m_filesStack );
@@ -387,7 +400,7 @@ bool DIALOG_SIM_MODEL<T>::TransferDataFromWindow()
SIM_MODEL::SetFieldValue( m_fields, SIM_LIBRARY::LIBRARY_FIELD, path, false );
SIM_MODEL::SetFieldValue( m_fields, SIM_LIBRARY::NAME_FIELD, name, false );
if( isIbisLoaded() )
if( isIbisLoaded() && !m_libraryModelsMgr.GetModels().empty() )
{
int idx = 0;
wxString sel = m_modelListBox->GetStringSelection();
@@ -839,7 +852,25 @@ bool DIALOG_SIM_MODEL<T>::loadLibrary( const wxString& aLibraryPath, REPORTER& a
m_libraryModelsMgr.SetLibrary( aLibraryPath, aReporter );
if( aReporter.HasMessageOfSeverity( RPT_SEVERITY_UNDEFINED | RPT_SEVERITY_ERROR ) )
{
m_libraryModelsMgr.Clear();
if( m_modelListBox->GetSelection() != wxNOT_FOUND )
m_modelListBox->SetSelection( wxNOT_FOUND );
if( m_modelListBox->GetCount() )
m_modelListBox->Clear();
wxArrayString emptyArray;
m_pinModelCombobox->Set( emptyArray );
m_pinCombobox->Set( emptyArray );
m_pinModelCombobox->SetSelection( -1 );
m_pinCombobox->SetSelection( -1 );
m_waveformChoice->Clear();
m_prevLibrary.Clear();
return false;
}
std::string modelName = SIM_MODEL::GetFieldValue( &m_fields, SIM_LIBRARY::NAME_FIELD );
@@ -1124,7 +1155,12 @@ SIM_MODEL& DIALOG_SIM_MODEL<T>::curModel() const
wxString sel = m_modelListBox->GetStringSelection();
if( m_modelListBoxEntryToLibraryIdx.contains( sel ) )
return m_libraryModelsMgr.GetModels().at( m_modelListBoxEntryToLibraryIdx.at( sel ) ).get();
{
int idx = m_modelListBoxEntryToLibraryIdx.at( sel );
if( idx >= 0 && idx < (int) m_libraryModelsMgr.GetModels().size() )
return m_libraryModelsMgr.GetModels().at( idx ).get();
}
}
else
{

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