diff --git a/.github/scripts/install-macos.sh b/.github/scripts/install-macos.sh
index be4b13ac..bb39bcd4 100755
--- a/.github/scripts/install-macos.sh
+++ b/.github/scripts/install-macos.sh
@@ -13,4 +13,4 @@ else
brew install libomp
fi
-git submodule update --init extlib/cairo extlib/freetype extlib/libdxfrw extlib/libpng extlib/mimalloc extlib/pixman extlib/zlib
+git submodule update --init extlib/cairo extlib/freetype extlib/libdxfrw extlib/libpng extlib/mimalloc extlib/pixman extlib/zlib extlib/eigen
diff --git a/.github/scripts/install-ubuntu.sh b/.github/scripts/install-ubuntu.sh
index 53f88b27..6033f735 100755
--- a/.github/scripts/install-ubuntu.sh
+++ b/.github/scripts/install-ubuntu.sh
@@ -5,6 +5,6 @@ sudo apt-get update -qq
sudo apt-get install -q -y \
zlib1g-dev libpng-dev libcairo2-dev libfreetype6-dev libjson-c-dev \
libfontconfig1-dev libgtkmm-3.0-dev libpangomm-1.4-dev libgl-dev \
- libgl-dev libglu-dev libspnav-dev
+ libgl-dev libglu-dev libspnav-dev
-git submodule update --init extlib/libdxfrw extlib/mimalloc
+git submodule update --init extlib/libdxfrw extlib/mimalloc extlib/eigen
diff --git a/.github/workflows/source-tarball.yml b/.github/workflows/source-tarball.yml
new file mode 100644
index 00000000..8bc06221
--- /dev/null
+++ b/.github/workflows/source-tarball.yml
@@ -0,0 +1,51 @@
+name: Source Tarball
+
+on:
+ release:
+ types:
+ - created
+
+jobs:
+ create_tarball:
+ name: Create & Upload Tarball
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ with:
+ submodules: true
+ fetch-depth: 0
+ - name: Pack Tarball
+ id: pack_tarball
+ run: |
+ version="${GITHUB_REF#refs/tags/v}"
+ dir_name="solvespace-${version}"
+ archive_name="${dir_name}.tar.xz"
+ archive_path="${HOME}/${archive_name}"
+
+ echo "::set-output name=archive_name::${archive_name}"
+ echo "::set-output name=archive_path::${archive_path}"
+
+ cd ..
+ tar \
+ --exclude-vcs \
+ --transform "s:^solvespace:${dir_name}:" \
+ -cvaf \
+ ${archive_path} \
+ solvespace
+ - name: Get Release Upload URL
+ id: get_upload_url
+ env:
+ event: ${{ toJson(github.event) }}
+ run: |
+ upload_url=$(echo "$event" | jq -r ".release.upload_url")
+ echo "::set-output name=upload_url::$upload_url"
+ echo "Upload URL: $upload_url"
+ - name: Upload Tarball
+ uses: actions/upload-release-asset@v1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ upload_url: ${{ steps.get_upload_url.outputs.upload_url }}
+ asset_path: ${{ steps.pack_tarball.outputs.archive_path }}
+ asset_name: ${{ steps.pack_tarball.outputs.archive_name }}
+ asset_content_type: binary/octet-stream
diff --git a/.gitignore b/.gitignore
index 4f76b266..59755d77 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,8 @@
/obj-*/
/*.slvs
.vscode/
+
+# Visual Studio
+out/
+.vs/
+CMakeSettings.json
diff --git a/.gitmodules b/.gitmodules
index 71384a1a..cf428974 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -23,3 +23,6 @@
[submodule "extlib/mimalloc"]
path = extlib/mimalloc
url = https://github.com/microsoft/mimalloc
+[submodule "extlib/eigen"]
+ path = extlib/eigen
+ url = https://gitlab.com/libeigen/eigen.git
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 76eb5283..7f6a4af0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -23,6 +23,17 @@ Sketching:
MISC:
+* Add a link to the GitHub commit from which SolveSpace was built in the Help
+ menu.
+* Make all points, vectors and normals shown in the Property Browser into
+ active links. This makes them explorable and selectable.
+* Load 16bit PNG images correctly by re-scaling to 8bit.
+* Fixed hang when trying to display characters missing from the embedded font.
+* The main window vertical size can be as small as the toolbar.
+* Configurable "SafeHeight" parameter instead of the fixed 5mm for G-code export.
+* Add Spanish / Argentina translation.
+* Move "perspective factor", "lighting direction" and "explode distance" from
+ the "configuration" screen to the "view" screen.
* Add a "∆" suffix to groups which have "force to triangle mesh" ticked
* Gray the group name in the text window for groups with suppressed solid model.
* Added the ability to Link STL files.
@@ -30,6 +41,10 @@ MISC:
Performance:
+* Speed up sketches with many constraints by roughly 8x by using the Eigen
+ library in the solver. The maximum unknowns increased from 1024 to 2048.
+* Add a "suppress dof calculation" setting to groups - increases performance for
+ complex sketches.
* More changes to the ID list implementation.
3.0
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 38e1bcf7..ecef9c5b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -8,10 +8,9 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
" mkdir build && cd build && cmake ..")
endif()
-set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
+list(APPEND CMAKE_MODULE_PATH
"${CMAKE_SOURCE_DIR}/cmake/")
-cmake_policy(SET CMP0048 OLD)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED YES)
@@ -39,10 +38,10 @@ include(GetGitCommitHash)
# and instead uncomment the following, adding the complete git hash of the checkout you are using:
# set(GIT_COMMIT_HASH 0000000000000000000000000000000000000000)
-set(solvespace_VERSION_MAJOR 3)
-set(solvespace_VERSION_MINOR 0)
string(SUBSTRING "${GIT_COMMIT_HASH}" 0 8 solvespace_GIT_HASH)
-project(solvespace LANGUAGES C CXX ASM)
+project(solvespace
+ VERSION 3.0
+ LANGUAGES C CXX ASM)
set(ENABLE_GUI ON CACHE BOOL
"Whether the graphical interface is enabled")
@@ -56,8 +55,11 @@ set(ENABLE_SANITIZERS OFF CACHE BOOL
"Whether to enable Clang's AddressSanitizer and UndefinedBehaviorSanitizer")
set(ENABLE_OPENMP OFF CACHE BOOL
"Whether geometric operations will be parallelized using OpenMP")
-set(ENABLE_LTO OFF CACHE BOOL
+set(ENABLE_LTO OFF CACHE BOOL
"Whether interprocedural (global) optimizations are enabled")
+option(FORCE_VENDORED_Eigen3
+ "Whether we should use our bundled Eigen even in the presence of a system copy"
+ OFF)
set(OPENGL 3 CACHE STRING "OpenGL version to use (one of: 1 3)")
@@ -114,7 +116,12 @@ endif()
if(ENABLE_OPENMP)
find_package( OpenMP REQUIRED )
if(OPENMP_FOUND)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
+ add_library(slvs_openmp INTERFACE)
+ target_compile_options(slvs_openmp INTERFACE ${OpenMP_CXX_FLAGS})
+ target_link_libraries(slvs_openmp INTERFACE
+ ${OpenMP_CXX_LIBRARIES})
+ target_include_directories(slvs_openmp INTERFACE SYSTEM
+ ${OpenMP_CXX_INCLUDE_DIRS})
message(STATUS "found OpenMP, compiling with flags: " ${OpenMP_CXX_FLAGS} )
endif()
endif()
@@ -178,6 +185,9 @@ endif()
message(STATUS "Using in-tree libdxfrw")
add_subdirectory(extlib/libdxfrw)
+message(STATUS "Using in-tree eigen")
+include_directories(extlib/eigen)
+
message(STATUS "Using in-tree mimalloc")
set(MI_OVERRIDE OFF CACHE BOOL "")
set(MI_BUILD_SHARED OFF CACHE BOOL "")
@@ -186,6 +196,18 @@ set(MI_BUILD_TESTS OFF CACHE BOOL "")
add_subdirectory(extlib/mimalloc EXCLUDE_FROM_ALL)
set(MIMALLOC_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/extlib/mimalloc/include)
+if(NOT FORCE_VENDORED_Eigen3)
+ find_package(Eigen3 CONFIG)
+endif()
+if(FORCE_VENDORED_Eigen3 OR NOT EIGEN3_FOUND)
+ message(STATUS "Using in-tree Eigen")
+ set(EIGEN3_FOUND YES)
+ set(EIGEN3_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/extlib/eigen)
+else()
+ message(STATUS "Using system Eigen: ${EIGEN3_INCLUDE_DIRS}")
+endif()
+
+
if(WIN32 OR APPLE)
# On Win32 and macOS we use vendored packages, since there is little to no benefit
# to trying to find system versions. In particular, trying to link to libraries from
@@ -281,7 +303,6 @@ if(ENABLE_GUI)
elseif(APPLE)
find_package(OpenGL REQUIRED)
find_library(APPKIT_LIBRARY AppKit REQUIRED)
- set(util_LIBRARIES ${APPKIT_LIBRARY})
else()
find_package(OpenGL REQUIRED)
find_package(SpaceWare)
diff --git a/README.md b/README.md
index 554e4fca..14bb49ff 100644
--- a/README.md
+++ b/README.md
@@ -25,9 +25,9 @@ IRC channel [#solvespace at web.libera.chat][ssirc].
## Installation
-### Via official binary packages
+### Via Official Packages
-_Official_ release binary packages for macOS (>=10.6 64-bit) and Windows
+_Official_ release packages for macOS (>=10.6 64-bit) and Windows
(>=Vista 32-bit) are available via [GitHub releases][rel]. These packages are
automatically built by the SolveSpace maintainers for each stable release.
@@ -53,15 +53,6 @@ snap install solvespace
snap install solvespace --edge
```
-### Via third-party binary packages
-
-_Third-party_ nightly binary packages for Debian and Ubuntu are available via
-[notesalexp.org][notesalexp]. These packages are automatically built from
-non-released source code. The SolveSpace maintainers do not control the contents
-of these packages and cannot guarantee their functionality.
-
-[notesalexp]: https://notesalexp.org/packages/en/source/solvespace/
-
### Via automated edge builds
> :warning: **Edge builds might be unstable or contain severe bugs!**
@@ -77,6 +68,15 @@ from the following links:
Extract the downloaded archive and install or execute the contained file as is
appropriate for your platform.
+### Via third-party packages
+
+_Third-party_ nightly binary packages for Debian and Ubuntu are available via
+[notesalexp.org][notesalexp]. These packages are automatically built from
+non-released source code. The SolveSpace maintainers do not control the contents
+of these packages and cannot guarantee their functionality.
+
+[notesalexp]: https://notesalexp.org/packages/en/source/solvespace/
+
### Via source code
See below.
@@ -111,7 +111,7 @@ Before building, check out the project and the necessary submodules:
```sh
git clone https://github.com/solvespace/solvespace
cd solvespace
-git submodule update --init extlib/libdxfrw extlib/mimalloc
+git submodule update --init extlib/libdxfrw extlib/mimalloc extlib/eigen
```
After that, build SolveSpace as following:
@@ -171,11 +171,11 @@ Space Navigator support will not be available.
## Building on macOS
-You will need git, XCode tools and CMake. Git and CMake can be installed
+You will need git, XCode tools, CMake and libomp. Git, CMake and libomp can be installed
via [Homebrew][]:
```sh
-brew install git cmake
+brew install git cmake libomp
```
XCode has to be installed via AppStore or [the Apple website][appledeveloper];
@@ -230,7 +230,7 @@ Before building, check out the project and the necessary submodules:
```sh
git clone https://github.com/solvespace/solvespace
cd solvespace
-git submodule update --init extlib/libdxfrw extlib/mimalloc
+git submodule update --init extlib/libdxfrw extlib/mimalloc extlib/eigen
```
After that, build SolveSpace as following:
diff --git a/cmake/FindSpaceWare.cmake b/cmake/FindSpaceWare.cmake
index fb6073c3..451063c6 100644
--- a/cmake/FindSpaceWare.cmake
+++ b/cmake/FindSpaceWare.cmake
@@ -16,7 +16,7 @@ if(UNIX)
# Support the REQUIRED and QUIET arguments, and set SPACEWARE_FOUND if found.
include(FindPackageHandleStandardArgs)
- FIND_PACKAGE_HANDLE_STANDARD_ARGS(SPACEWARE DEFAULT_MSG
+ find_package_handle_standard_args(SpaceWare DEFAULT_MSG
SPACEWARE_LIBRARY SPACEWARE_INCLUDE_DIR)
if(SPACEWARE_FOUND)
diff --git a/cmake/MacOSXBundleInfo.plist.in b/cmake/MacOSXBundleInfo.plist.in
index 668d1f7e..b39a9e21 100644
--- a/cmake/MacOSXBundleInfo.plist.in
+++ b/cmake/MacOSXBundleInfo.plist.in
@@ -15,11 +15,11 @@
CFBundlePackageType
APPL
CFBundleVersion
- ${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR}~${solvespace_GIT_HASH}
+ ${PROJECT_VERSION}~${solvespace_GIT_HASH}
CFBundleShortVersionString
- ${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR}
+ ${PROJECT_VERSION}
NSHumanReadableCopyright
- © 2008-2016 Jonathan Westhues and other authors
+ © 2008-2022 Jonathan Westhues and other authors
NSPrincipalClass
NSApplication
NSMainNibFile
diff --git a/extlib/eigen b/extlib/eigen
new file mode 160000
index 00000000..3147391d
--- /dev/null
+++ b/extlib/eigen
@@ -0,0 +1 @@
+Subproject commit 3147391d946bb4b6c68edd901f2add6ac1f31f8c
diff --git a/pkg/snap/snap/snapcraft.yaml b/pkg/snap/snap/snapcraft.yaml
index 5fe5f7be..b01b25cf 100644
--- a/pkg/snap/snap/snapcraft.yaml
+++ b/pkg/snap/snap/snapcraft.yaml
@@ -1,5 +1,5 @@
name: solvespace
-base: core18
+base: core20
summary: Parametric 2d/3d CAD
adopt-info: solvespace
description: |
@@ -14,6 +14,7 @@ description: |
confinement: strict
license: GPL-3.0
+compression: lzo
layout:
/usr/share/solvespace:
@@ -23,13 +24,11 @@ apps:
solvespace:
command: usr/bin/solvespace
desktop: solvespace.desktop
- extensions: [gnome-3-34]
+ extensions: [gnome-3-38]
plugs: [opengl, unity7, home, removable-media, gsettings, network]
- environment:
- __EGL_VENDOR_LIBRARY_DIRS: $SNAP/gnome-platform/usr/share/glvnd/egl_vendor.d:$SNAP/usr/share/glvnd/egl_vendor.d
cli:
command: usr/bin/solvespace-cli
- extensions: [gnome-3-34]
+ extensions: [gnome-3-38]
plugs: [home, removable-media, network]
parts:
@@ -39,23 +38,28 @@ parts:
source-type: local
override-pull: |
snapcraftctl pull
- version_major=$(grep "solvespace_VERSION_MAJOR" CMakeLists.txt | tr -d "()" | cut -d" " -f2)
- version_minor=$(grep "solvespace_VERSION_MINOR" CMakeLists.txt | tr -d "()" | cut -d" " -f2)
- version="$version_major.$version_minor~$(git rev-parse --short=8 HEAD)"
+ git submodule update --init extlib/libdxfrw extlib/mimalloc extlib/eigen
+ override-build: |
+ snapcraftctl build
+ project_version=$(grep CMAKE_PROJECT_VERSION:STATIC CMakeCache.txt | cut -d "=" -f2)
+ cd $SNAPCRAFT_PART_SRC
+ version="$project_version~$(git rev-parse --short=8 HEAD)"
snapcraftctl set-version "$version"
git describe --exact-match HEAD && grade="stable" || grade="devel"
snapcraftctl set-grade "$grade"
- git submodule update --init extlib/libdxfrw extlib/mimalloc
- configflags:
+ cmake-parameters:
- -DCMAKE_INSTALL_PREFIX=/usr
- -DCMAKE_BUILD_TYPE=Release
- -DENABLE_TESTS=OFF
- -DSNAP=ON
- -DENABLE_OPENMP=ON
- -DENABLE_LTO=ON
+ build-snaps:
+ - gnome-3-38-2004-sdk
build-packages:
- zlib1g-dev
- libpng-dev
+ - libcairo2-dev
- libfreetype6-dev
- libjson-c-dev
- libgl-dev
@@ -70,11 +74,14 @@ parts:
cleanup:
after: [solvespace]
plugin: nil
- build-snaps: [core18, gnome-3-34-1804]
+ build-snaps: [gnome-3-38-2004]
override-prime: |
- # Remove all files from snap that are already included in the base snap or in
- # any connected content snaps
set -eux
- for snap in "core18" "gnome-3-34-1804"; do # List all content-snaps and base snaps you're using here
- cd "/snap/$snap/current" && find . -type f,l -exec rm -f "$SNAPCRAFT_PRIME/{}" \;
+ for snap in "gnome-3-38-2004"; do # List all content-snaps you're using here
+ cd "/snap/$snap/current" && find . -type f,l -exec rm -f "$SNAPCRAFT_PRIME/{}" "$SNAPCRAFT_PRIME/usr/{}" \;
done
+ for cruft in bug lintian man; do
+ rm -rf $SNAPCRAFT_PRIME/usr/share/$cruft
+ done
+ find $SNAPCRAFT_PRIME/usr/share/doc/ -type f -not -name 'copyright' -delete
+ find $SNAPCRAFT_PRIME/usr/share -type d -empty -delete
diff --git a/res/locales/de_DE.po b/res/locales/de_DE.po
index 4a5ccb57..9791a538 100644
--- a/res/locales/de_DE.po
+++ b/res/locales/de_DE.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: SolveSpace 3.0\n"
"Report-Msgid-Bugs-To: whitequark@whitequark.org\n"
-"POT-Creation-Date: 2021-09-26 16:25-0400\n"
+"POT-Creation-Date: 2022-02-01 16:24+0200\n"
"PO-Revision-Date: 2018-07-19 06:55+0000\n"
"Last-Translator: Reini Urban \n"
"Language-Team: none\n"
@@ -36,7 +36,7 @@ msgstr "Zwischenablage ist leer; es gibt nichts einzufügen."
msgid "Number of copies to paste must be at least one."
msgstr "Die Anzahl der einzufügenden Kopien muss mind. 1 sein."
-#: clipboard.cpp:389 textscreens.cpp:827
+#: clipboard.cpp:389 textscreens.cpp:833
msgid "Scale cannot be zero."
msgstr "Maßstab kann nicht Null sein."
@@ -66,15 +66,15 @@ msgstr ""
msgid "No workplane active."
msgstr "Es ist keine Arbeitsebene aktiv."
-#: confscreen.cpp:376
+#: confscreen.cpp:381
msgid "Bad format: specify coordinates as x, y, z"
msgstr "Ungültiges Format: geben Sie Koordinaten als x, y, z an"
-#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858
+#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864
msgid "Bad format: specify color as r, g, b"
msgstr "Ungültiges Format: geben Sie Farben als r, g, b an"
-#: confscreen.cpp:412
+#: confscreen.cpp:417
msgid ""
"The perspective factor will have no effect until you enable View -> Use "
"Perspective Projection."
@@ -82,25 +82,25 @@ msgstr ""
"Der Perspektivfaktor wird sich nicht auswirken, bis Sie Ansicht -> "
"Perspektive Projektion aktivieren."
-#: confscreen.cpp:430 confscreen.cpp:440
+#: confscreen.cpp:435 confscreen.cpp:445
#, c-format
msgid "Specify between 0 and %d digits after the decimal."
msgstr "Geben Sie 0 bis %d Ziffern nach dem Dezimalzeichen an."
-#: confscreen.cpp:452
+#: confscreen.cpp:457
msgid "Export scale must not be zero!"
msgstr "Der Exportmaßstab darf nicht Null sein!"
-#: confscreen.cpp:464
+#: confscreen.cpp:469
msgid "Cutter radius offset must not be negative!"
msgstr "Der Werkzeugradialabstand darf nicht negativ sein!"
-#: confscreen.cpp:518
+#: confscreen.cpp:528
msgid "Bad value: autosave interval should be positive"
msgstr ""
"Ungültiger Wert: Interval für automatisches Speichern muss positiv sein"
-#: confscreen.cpp:521
+#: confscreen.cpp:531
msgid "Bad format: specify interval in integral minutes"
msgstr "Ungültiges Format: geben Sie das Interval in ganzen Minuten an"
@@ -684,7 +684,7 @@ msgctxt "button"
msgid "&No"
msgstr "&Nein"
-#: file.cpp:877 solvespace.cpp:610
+#: file.cpp:877 solvespace.cpp:611
msgctxt "button"
msgid "&Cancel"
msgstr "&Abbrechen"
@@ -1137,25 +1137,29 @@ msgstr "Sprache"
msgid "&Website / Manual"
msgstr "&Website / Anleitung"
-#: graphicswin.cpp:187
+#: graphicswin.cpp:186
+msgid "&Go to GitHub commit"
+msgstr ""
+
+#: graphicswin.cpp:188
msgid "&About"
msgstr "Über"
-#: graphicswin.cpp:361
+#: graphicswin.cpp:362
msgid "(no recent files)"
msgstr "(keine vorhergehenden Dateien)"
-#: graphicswin.cpp:369
+#: graphicswin.cpp:370
#, c-format
msgid "File '%s' does not exist."
msgstr "Datei '%s' existiert nicht."
-#: graphicswin.cpp:736
+#: graphicswin.cpp:737
msgid "No workplane is active, so the grid will not appear."
msgstr ""
"Das Raster wird nicht angezeigt, weil keine Arbeitsebene ausgewählt ist."
-#: graphicswin.cpp:751
+#: graphicswin.cpp:752
msgid ""
"The perspective factor is set to zero, so the view will always be a parallel "
"projection.\n"
@@ -1169,20 +1173,20 @@ msgstr ""
"Ändern Sie den Faktor für die Perspektivprojektion in der "
"Konfigurationsmaske. Ein typischer Wert ist ca. 0,3."
-#: graphicswin.cpp:836
+#: graphicswin.cpp:837
msgid ""
"Select a point; this point will become the center of the view on screen."
msgstr ""
"Wählen Sie einen Punkt aus; dieser Punkt wird im Mittelpunkt der "
"Bildschirmansicht sein."
-#: graphicswin.cpp:1136
+#: graphicswin.cpp:1137
msgid "No additional entities share endpoints with the selected entities."
msgstr ""
"Die ausgewählten Objekte teilen keine gemeinsamen Endpunkte mit anderen "
"Objekten."
-#: graphicswin.cpp:1154
+#: graphicswin.cpp:1155
msgid ""
"To use this command, select a point or other entity from an linked part, or "
"make a link group the active group."
@@ -1190,7 +1194,7 @@ msgstr ""
"Für diesen Befehl wählen Sie einen Punkt oder ein anderes Objekt von einem "
"verknüpften Teil aus, oder aktivieren Sie eine verknüpfte Gruppe."
-#: graphicswin.cpp:1177
+#: graphicswin.cpp:1178
msgid ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) "
"to define the plane for the snap grid."
@@ -1199,7 +1203,7 @@ msgstr ""
"(mit Skizze -> In Arbeitsebene), um die Ebene für das Gitterraster zu "
"definieren."
-#: graphicswin.cpp:1184
+#: graphicswin.cpp:1185
msgid ""
"Can't snap these items to grid; select points, text comments, or constraints "
"with a label. To snap a line, select its endpoints."
@@ -1208,13 +1212,13 @@ msgstr ""
"für Punkte, Textkommentare, oder Einschränkungen mit einer Bezeichnung. Um "
"eine Linie auf das Raster auszurichten, wählen Sie deren Endpunkte aus."
-#: graphicswin.cpp:1269
+#: graphicswin.cpp:1270
msgid "No workplane selected. Activating default workplane for this group."
msgstr ""
"Es wurde keine Arbeitsebene ausgewählt. Die Standard-Arbeitsebene für diese "
"Gruppe wird aktiviert."
-#: graphicswin.cpp:1272
+#: graphicswin.cpp:1273
msgid ""
"No workplane is selected, and the active group does not have a default "
"workplane. Try selecting a workplane, or activating a sketch-in-new-"
@@ -1224,7 +1228,7 @@ msgstr ""
"standardmäßige Arbeitsebene. Wählen Sie eine Arbeitsebene aus, oder "
"erstellen Sie eine Gruppe in einer neuen Arbeitsebene."
-#: graphicswin.cpp:1293
+#: graphicswin.cpp:1294
msgid ""
"Bad selection for tangent arc at point. Select a single point, or select "
"nothing to set up arc parameters."
@@ -1232,48 +1236,48 @@ msgstr ""
"Ungültige Auswahl für Bogentangente an Punkt. Wählen Sie einen einzelnen "
"Punkt. Um die Bogenparameter anzugeben, wählen Sie nichts aus."
-#: graphicswin.cpp:1304
+#: graphicswin.cpp:1305
msgid "click point on arc (draws anti-clockwise)"
msgstr ""
"Erstellen Sie einen Punkt auf dem Bogen (zeichnet im Gegenuhrzeigersinn)"
-#: graphicswin.cpp:1305
+#: graphicswin.cpp:1306
msgid "click to place datum point"
msgstr "Klicken Sie, um einen Bezugspunkt zu platzieren"
-#: graphicswin.cpp:1306
+#: graphicswin.cpp:1307
msgid "click first point of line segment"
msgstr "Klicken Sie auf den ersten Punkt des Liniensegments"
-#: graphicswin.cpp:1308
+#: graphicswin.cpp:1309
msgid "click first point of construction line segment"
msgstr "Klicken Sie auf den ersten Punkt der Konstruktionslinie"
-#: graphicswin.cpp:1309
+#: graphicswin.cpp:1310
msgid "click first point of cubic segment"
msgstr "Klicken Sie auf den ersten Punkt der kubischen Linie"
-#: graphicswin.cpp:1310
+#: graphicswin.cpp:1311
msgid "click center of circle"
msgstr "Klicken Sie auf den Kreismittelpunkt"
-#: graphicswin.cpp:1311
+#: graphicswin.cpp:1312
msgid "click origin of workplane"
msgstr "Klicken Sie auf den Ursprungspunkt der Arbeitsebene"
-#: graphicswin.cpp:1312
+#: graphicswin.cpp:1313
msgid "click one corner of rectangle"
msgstr "Klicken Sie auf eine Ecke des Rechtecks"
-#: graphicswin.cpp:1313
+#: graphicswin.cpp:1314
msgid "click top left of text"
msgstr "Klicken Sie auf die obere linke Ecke des Texts"
-#: graphicswin.cpp:1319
+#: graphicswin.cpp:1320
msgid "click top left of image"
msgstr "Klicken Sie auf die obere linke Ecke des Bilds"
-#: graphicswin.cpp:1345
+#: graphicswin.cpp:1346
msgid ""
"No entities are selected. Select entities before trying to toggle their "
"construction state."
@@ -1428,6 +1432,10 @@ msgstr "Kontur überschneidet sich selbst!"
msgid "zero-length edge!"
msgstr "Kante mit Länge Null!"
+#: importmesh.cpp:136
+msgid "Text-formated STL files are not currently supported"
+msgstr ""
+
#: modify.cpp:252
msgid "Must be sketching in workplane to create tangent arc."
msgstr "Eine Bogentangente kann nur in einer Arbeitsebene erstellt werden."
@@ -1630,7 +1638,7 @@ msgstr ""
"Das Bild kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine "
"Arbeitsebene mit \"Skizze -> In Arbeitsebene\"."
-#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552
+#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553
msgctxt "file-type"
msgid "SolveSpace models"
msgstr "SolveSpace-Modelle"
@@ -1725,105 +1733,105 @@ msgctxt "file-type"
msgid "Comma-separated values"
msgstr "Werte durch Komma getrennt (CSV)"
-#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641
+#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641
msgid "untitled"
msgstr "unbenannt"
-#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445
+#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467
#: platform/guiwin.cpp:1639
msgctxt "title"
msgid "Save File"
msgstr "Datei speichern"
-#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428
+#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450
#: platform/guiwin.cpp:1645
msgctxt "title"
msgid "Open File"
msgstr "Datei öffnen"
-#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418
+#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433
msgctxt "button"
msgid "_Cancel"
msgstr "_Abbrechen"
-#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416
+#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431
msgctxt "button"
msgid "_Save"
msgstr "_Speichern"
-#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417
+#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432
msgctxt "button"
msgid "_Open"
msgstr "_Öffnen"
-#: solvespace.cpp:170
+#: solvespace.cpp:171
msgctxt "title"
msgid "Autosave Available"
msgstr "Automatische Sicherungsdatei verfügbar"
-#: solvespace.cpp:171
+#: solvespace.cpp:172
msgctxt "dialog"
msgid "An autosave file is available for this sketch."
msgstr "Eine automatische Sicherung ist für diese Skizze verfügbar."
-#: solvespace.cpp:172
+#: solvespace.cpp:173
msgctxt "dialog"
msgid "Do you want to load the autosave file instead?"
msgstr "Wollen Sie die automatische Sicherungsdatei stattdessen laden?"
-#: solvespace.cpp:173
+#: solvespace.cpp:174
msgctxt "button"
msgid "&Load autosave"
msgstr "AutoDatei &öffnen"
-#: solvespace.cpp:175
+#: solvespace.cpp:176
msgctxt "button"
msgid "Do&n't Load"
msgstr "&Nicht laden"
-#: solvespace.cpp:598
+#: solvespace.cpp:599
msgctxt "title"
msgid "Modified File"
msgstr "Geänderte Datei"
-#: solvespace.cpp:600
+#: solvespace.cpp:601
#, c-format
msgctxt "dialog"
msgid "Do you want to save the changes you made to the sketch “%s”?"
msgstr "Wollen Sie die Änderungen an der Skizze “%s” sichern?"
-#: solvespace.cpp:603
+#: solvespace.cpp:604
msgctxt "dialog"
msgid "Do you want to save the changes you made to the new sketch?"
msgstr "Wollen Sie die Änderungen an der Skizze sichern?"
-#: solvespace.cpp:606
+#: solvespace.cpp:607
msgctxt "dialog"
msgid "Your changes will be lost if you don't save them."
msgstr "Ihre Änderungen werden verworfen, wenn sie nicht abgespeichert werden."
-#: solvespace.cpp:607
+#: solvespace.cpp:608
msgctxt "button"
msgid "&Save"
msgstr "&Sichern"
-#: solvespace.cpp:609
+#: solvespace.cpp:610
msgctxt "button"
msgid "Do&n't Save"
msgstr "&Verwerfen"
# solvespace.cpp:557
-#: solvespace.cpp:630
+#: solvespace.cpp:631
msgctxt "title"
msgid "(new sketch)"
msgstr "(Neue Skizze)"
-#: solvespace.cpp:637
+#: solvespace.cpp:638
msgctxt "title"
msgid "Property Browser"
msgstr "Attribut-Browser"
-#: solvespace.cpp:699
+#: solvespace.cpp:700
msgid ""
"Constraints are currently shown, and will be exported in the toolpath. This "
"is probably not what you want; hide them by clicking the link at the top of "
@@ -1833,7 +1841,7 @@ msgstr ""
"wahrscheinlich nicht. Verstecken Sie sie in dem auf den Link oben im "
"Textfenster klicken."
-#: solvespace.cpp:771
+#: solvespace.cpp:772
#, c-format
msgid ""
"Can't identify file type from file extension of filename '%s'; try .dxf or ."
@@ -1842,23 +1850,23 @@ msgstr ""
"Kann den Dateityp der Datei '%s' nicht auf Grund der Dateierweiterung "
"erkennen. Versuchen Sie .dxf oder .dwg."
-#: solvespace.cpp:823
+#: solvespace.cpp:824
msgid "Constraint must have a label, and must not be a reference dimension."
msgstr ""
"Die Einschränkung muss einen Namen haben, und darf keine "
"Referenzdimensionierung sein."
-#: solvespace.cpp:827
+#: solvespace.cpp:828
msgid "Bad selection for step dimension; select a constraint."
msgstr ""
"Falsche Auswahl für die Schrittdimensionierung. Wählen Sie eine "
"Einschränkung."
-#: solvespace.cpp:851
+#: solvespace.cpp:852
msgid "The assembly does not interfere, good."
msgstr "Der Zusammenbau funktioniert, gut."
-#: solvespace.cpp:867
+#: solvespace.cpp:868
#, c-format
msgid ""
"The volume of the solid model is:\n"
@@ -1869,7 +1877,7 @@ msgstr ""
"\n"
" %s"
-#: solvespace.cpp:876
+#: solvespace.cpp:877
#, c-format
msgid ""
"\n"
@@ -1882,7 +1890,7 @@ msgstr ""
"\n"
" %s"
-#: solvespace.cpp:881
+#: solvespace.cpp:882
msgid ""
"\n"
"\n"
@@ -1894,7 +1902,7 @@ msgstr ""
"Gekrümmte Flächen wurden als Dreiecksnetz angenähert.\n"
"Das verursacht Fehler, typischerweise um 1%."
-#: solvespace.cpp:896
+#: solvespace.cpp:897
#, c-format
msgid ""
"The surface area of the selected faces is:\n"
@@ -1911,7 +1919,7 @@ msgstr ""
"Kurven wurden als gerade Linienstücke angenähert.\n"
"Das verursacht Fehler, typischerweise um 1%%."
-#: solvespace.cpp:905
+#: solvespace.cpp:906
msgid ""
"This group does not contain a correctly-formed 2d closed area. It is open, "
"not coplanar, or self-intersecting."
@@ -1919,7 +1927,7 @@ msgstr ""
"Diese Gruppe beinhaltet keine korrekt geschlossene 2D Fläche. Sie ist offen, "
"nicht koplanar, oder überschneidet sich selbst."
-#: solvespace.cpp:917
+#: solvespace.cpp:918
#, c-format
msgid ""
"The area of the region sketched in this group is:\n"
@@ -1936,7 +1944,7 @@ msgstr ""
"Kurven wurden als gerade Linienstücke angenähert.\n"
"Das verursacht Fehler, typischerweise um 1%%."
-#: solvespace.cpp:937
+#: solvespace.cpp:938
#, c-format
msgid ""
"The total length of the selected entities is:\n"
@@ -1953,36 +1961,36 @@ msgstr ""
"Kurven wurden als gerade Linienstücke angenähert.\n"
"Das verursacht Fehler, typischerweise um 1%%."
-#: solvespace.cpp:943
+#: solvespace.cpp:944
msgid "Bad selection for perimeter; select line segments, arcs, and curves."
msgstr "Falsche Auswahl für Umfang. Wähle Liniensegmente, Bögen und Kurven."
-#: solvespace.cpp:959
+#: solvespace.cpp:960
msgid "Bad selection for trace; select a single point."
msgstr "Falsche Auswahl für Punkt nachzeichnen. Wähle einen einzelnen Punkt."
-#: solvespace.cpp:986
+#: solvespace.cpp:987
#, c-format
msgid "Couldn't write to '%s'"
msgstr "Konnte '%s' nicht schreiben"
-#: solvespace.cpp:1016
+#: solvespace.cpp:1017
msgid "The mesh is self-intersecting (NOT okay, invalid)."
msgstr "Das Netz schneidet sich selbst: Falsch, ungültig."
-#: solvespace.cpp:1017
+#: solvespace.cpp:1018
msgid "The mesh is not self-intersecting (okay, valid)."
msgstr "Das Netz schneidet sich nicht: Gut, gültig."
-#: solvespace.cpp:1019
+#: solvespace.cpp:1020
msgid "The mesh has naked edges (NOT okay, invalid)."
msgstr "Das Netz hat lose Kanten: Falsch, ungültig."
-#: solvespace.cpp:1020
+#: solvespace.cpp:1021
msgid "The mesh is watertight (okay, valid)."
msgstr "Das Netz hat keine lose Kanten: Gut, gültig."
-#: solvespace.cpp:1023
+#: solvespace.cpp:1024
#, c-format
msgid ""
"\n"
@@ -1993,7 +2001,7 @@ msgstr ""
"\n"
"Das Modell hat %d Dreiecke, von %d Flächen."
-#: solvespace.cpp:1027
+#: solvespace.cpp:1028
#, c-format
msgid ""
"%s\n"
@@ -2008,7 +2016,7 @@ msgstr ""
"\n"
"Keine problematischen Kanten, gut.%s"
-#: solvespace.cpp:1030
+#: solvespace.cpp:1031
#, c-format
msgid ""
"%s\n"
@@ -2023,7 +2031,7 @@ msgstr ""
"\n"
"%d problematische Kanten, schlecht.%s"
-#: solvespace.cpp:1043
+#: solvespace.cpp:1044
#, c-format
msgid ""
"This is SolveSpace version %s.\n"
@@ -2066,23 +2074,23 @@ msgstr ""
msgid "Style name cannot be empty"
msgstr "Name des Linientyps kann nicht leer sein."
-#: textscreens.cpp:785
+#: textscreens.cpp:791
msgid "Can't repeat fewer than 1 time."
msgstr "Nicht weniger als 1 Wiederholung möglich."
-#: textscreens.cpp:789
+#: textscreens.cpp:795
msgid "Can't repeat more than 999 times."
msgstr "Nicht mehr als 999 Wiederholungen möglich."
-#: textscreens.cpp:814
+#: textscreens.cpp:820
msgid "Group name cannot be empty"
msgstr "Der Name der Gruppe darf nicht leer sein."
-#: textscreens.cpp:866
+#: textscreens.cpp:872
msgid "Opacity must be between zero and one."
msgstr "Durchsichtigkeit muss zwischen Null und Eins sein."
-#: textscreens.cpp:901
+#: textscreens.cpp:907
msgid "Radius cannot be zero or negative."
msgstr "Radius darf nicht null oder negativ sein."
diff --git a/res/locales/en_US.po b/res/locales/en_US.po
index 385d8d76..1d00755e 100644
--- a/res/locales/en_US.po
+++ b/res/locales/en_US.po
@@ -2,12 +2,12 @@
# Copyright (C) 2017 the SolveSpace authors
# This file is distributed under the same license as the SolveSpace package.
# Automatically generated, 2017.
-#
+#
msgid ""
msgstr ""
"Project-Id-Version: SolveSpace 3.0\n"
"Report-Msgid-Bugs-To: whitequark@whitequark.org\n"
-"POT-Creation-Date: 2021-09-26 16:25-0400\n"
+"POT-Creation-Date: 2022-02-01 16:24+0200\n"
"PO-Revision-Date: 2017-01-05 10:30+0000\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -35,7 +35,7 @@ msgstr "Clipboard is empty; nothing to paste."
msgid "Number of copies to paste must be at least one."
msgstr "Number of copies to paste must be at least one."
-#: clipboard.cpp:389 textscreens.cpp:827
+#: clipboard.cpp:389 textscreens.cpp:833
msgid "Scale cannot be zero."
msgstr "Scale cannot be zero."
@@ -63,15 +63,15 @@ msgstr "Too many items to paste; split this into smaller pastes."
msgid "No workplane active."
msgstr "No workplane active."
-#: confscreen.cpp:376
+#: confscreen.cpp:381
msgid "Bad format: specify coordinates as x, y, z"
msgstr "Bad format: specify coordinates as x, y, z"
-#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858
+#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864
msgid "Bad format: specify color as r, g, b"
msgstr "Bad format: specify color as r, g, b"
-#: confscreen.cpp:412
+#: confscreen.cpp:417
msgid ""
"The perspective factor will have no effect until you enable View -> Use "
"Perspective Projection."
@@ -79,24 +79,24 @@ msgstr ""
"The perspective factor will have no effect until you enable View -> Use "
"Perspective Projection."
-#: confscreen.cpp:430 confscreen.cpp:440
+#: confscreen.cpp:435 confscreen.cpp:445
#, c-format
msgid "Specify between 0 and %d digits after the decimal."
msgstr "Specify between 0 and %d digits after the decimal."
-#: confscreen.cpp:452
+#: confscreen.cpp:457
msgid "Export scale must not be zero!"
msgstr "Export scale must not be zero!"
-#: confscreen.cpp:464
+#: confscreen.cpp:469
msgid "Cutter radius offset must not be negative!"
msgstr "Cutter radius offset must not be negative!"
-#: confscreen.cpp:518
+#: confscreen.cpp:528
msgid "Bad value: autosave interval should be positive"
msgstr "Bad value: autosave interval should be positive"
-#: confscreen.cpp:521
+#: confscreen.cpp:531
msgid "Bad format: specify interval in integral minutes"
msgstr "Bad format: specify interval in integral minutes"
@@ -677,7 +677,7 @@ msgctxt "button"
msgid "&No"
msgstr "&No"
-#: file.cpp:877 solvespace.cpp:610
+#: file.cpp:877 solvespace.cpp:611
msgctxt "button"
msgid "&Cancel"
msgstr "&Cancel"
@@ -1130,24 +1130,28 @@ msgstr "&Language"
msgid "&Website / Manual"
msgstr "&Website / Manual"
-#: graphicswin.cpp:187
+#: graphicswin.cpp:186
+msgid "&Go to GitHub commit"
+msgstr "&Go to GitHub commit"
+
+#: graphicswin.cpp:188
msgid "&About"
msgstr "&About"
-#: graphicswin.cpp:361
+#: graphicswin.cpp:362
msgid "(no recent files)"
msgstr "(no recent files)"
-#: graphicswin.cpp:369
+#: graphicswin.cpp:370
#, c-format
msgid "File '%s' does not exist."
msgstr "File '%s' does not exist."
-#: graphicswin.cpp:736
+#: graphicswin.cpp:737
msgid "No workplane is active, so the grid will not appear."
msgstr "No workplane is active, so the grid will not appear."
-#: graphicswin.cpp:751
+#: graphicswin.cpp:752
msgid ""
"The perspective factor is set to zero, so the view will always be a parallel "
"projection.\n"
@@ -1161,17 +1165,17 @@ msgstr ""
"For a perspective projection, modify the perspective factor in the "
"configuration screen. A value around 0.3 is typical."
-#: graphicswin.cpp:836
+#: graphicswin.cpp:837
msgid ""
"Select a point; this point will become the center of the view on screen."
msgstr ""
"Select a point; this point will become the center of the view on screen."
-#: graphicswin.cpp:1136
+#: graphicswin.cpp:1137
msgid "No additional entities share endpoints with the selected entities."
msgstr "No additional entities share endpoints with the selected entities."
-#: graphicswin.cpp:1154
+#: graphicswin.cpp:1155
msgid ""
"To use this command, select a point or other entity from an linked part, or "
"make a link group the active group."
@@ -1179,7 +1183,7 @@ msgstr ""
"To use this command, select a point or other entity from an linked part, or "
"make a link group the active group."
-#: graphicswin.cpp:1177
+#: graphicswin.cpp:1178
msgid ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) "
"to define the plane for the snap grid."
@@ -1187,7 +1191,7 @@ msgstr ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) "
"to define the plane for the snap grid."
-#: graphicswin.cpp:1184
+#: graphicswin.cpp:1185
msgid ""
"Can't snap these items to grid; select points, text comments, or constraints "
"with a label. To snap a line, select its endpoints."
@@ -1195,11 +1199,11 @@ msgstr ""
"Can't snap these items to grid; select points, text comments, or constraints "
"with a label. To snap a line, select its endpoints."
-#: graphicswin.cpp:1269
+#: graphicswin.cpp:1270
msgid "No workplane selected. Activating default workplane for this group."
msgstr "No workplane selected. Activating default workplane for this group."
-#: graphicswin.cpp:1272
+#: graphicswin.cpp:1273
msgid ""
"No workplane is selected, and the active group does not have a default "
"workplane. Try selecting a workplane, or activating a sketch-in-new-"
@@ -1209,7 +1213,7 @@ msgstr ""
"workplane. Try selecting a workplane, or activating a sketch-in-new-"
"workplane group."
-#: graphicswin.cpp:1293
+#: graphicswin.cpp:1294
msgid ""
"Bad selection for tangent arc at point. Select a single point, or select "
"nothing to set up arc parameters."
@@ -1217,47 +1221,47 @@ msgstr ""
"Bad selection for tangent arc at point. Select a single point, or select "
"nothing to set up arc parameters."
-#: graphicswin.cpp:1304
+#: graphicswin.cpp:1305
msgid "click point on arc (draws anti-clockwise)"
msgstr "click point on arc (draws anti-clockwise)"
-#: graphicswin.cpp:1305
+#: graphicswin.cpp:1306
msgid "click to place datum point"
msgstr "click to place datum point"
-#: graphicswin.cpp:1306
+#: graphicswin.cpp:1307
msgid "click first point of line segment"
msgstr "click first point of line segment"
-#: graphicswin.cpp:1308
+#: graphicswin.cpp:1309
msgid "click first point of construction line segment"
msgstr "click first point of construction line segment"
-#: graphicswin.cpp:1309
+#: graphicswin.cpp:1310
msgid "click first point of cubic segment"
msgstr "click first point of cubic segment"
-#: graphicswin.cpp:1310
+#: graphicswin.cpp:1311
msgid "click center of circle"
msgstr "click center of circle"
-#: graphicswin.cpp:1311
+#: graphicswin.cpp:1312
msgid "click origin of workplane"
msgstr "click origin of workplane"
-#: graphicswin.cpp:1312
+#: graphicswin.cpp:1313
msgid "click one corner of rectangle"
msgstr "click one corner of rectangle"
-#: graphicswin.cpp:1313
+#: graphicswin.cpp:1314
msgid "click top left of text"
msgstr "click top left of text"
-#: graphicswin.cpp:1319
+#: graphicswin.cpp:1320
msgid "click top left of image"
msgstr "click top left of image"
-#: graphicswin.cpp:1345
+#: graphicswin.cpp:1346
msgid ""
"No entities are selected. Select entities before trying to toggle their "
"construction state."
@@ -1416,6 +1420,10 @@ msgstr "contour is self-intersecting!"
msgid "zero-length edge!"
msgstr "zero-length edge!"
+#: importmesh.cpp:136
+msgid "Text-formated STL files are not currently supported"
+msgstr "Text-formated STL files are not currently supported"
+
#: modify.cpp:252
msgid "Must be sketching in workplane to create tangent arc."
msgstr "Must be sketching in workplane to create tangent arc."
@@ -1610,7 +1618,7 @@ msgstr ""
"Can't draw image in 3d; first, activate a workplane with Sketch -> In "
"Workplane."
-#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552
+#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553
msgctxt "file-type"
msgid "SolveSpace models"
msgstr "SolveSpace models"
@@ -1705,104 +1713,104 @@ msgctxt "file-type"
msgid "Comma-separated values"
msgstr "Comma-separated values"
-#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641
+#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641
msgid "untitled"
msgstr "untitled"
-#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445
+#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467
#: platform/guiwin.cpp:1639
msgctxt "title"
msgid "Save File"
msgstr "Save File"
-#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428
+#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450
#: platform/guiwin.cpp:1645
msgctxt "title"
msgid "Open File"
msgstr "Open File"
-#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418
+#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433
msgctxt "button"
msgid "_Cancel"
msgstr "_Cancel"
-#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416
+#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431
msgctxt "button"
msgid "_Save"
msgstr "_Save"
-#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417
+#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432
msgctxt "button"
msgid "_Open"
msgstr "_Open"
-#: solvespace.cpp:170
+#: solvespace.cpp:171
msgctxt "title"
msgid "Autosave Available"
msgstr "Autosave Available"
-#: solvespace.cpp:171
+#: solvespace.cpp:172
msgctxt "dialog"
msgid "An autosave file is available for this sketch."
msgstr "An autosave file is available for this sketch."
-#: solvespace.cpp:172
+#: solvespace.cpp:173
msgctxt "dialog"
msgid "Do you want to load the autosave file instead?"
msgstr "Do you want to load the autosave file instead?"
-#: solvespace.cpp:173
+#: solvespace.cpp:174
msgctxt "button"
msgid "&Load autosave"
msgstr "&Load autosave"
-#: solvespace.cpp:175
+#: solvespace.cpp:176
msgctxt "button"
msgid "Do&n't Load"
msgstr "Do&n't Load"
-#: solvespace.cpp:598
+#: solvespace.cpp:599
msgctxt "title"
msgid "Modified File"
msgstr "Modified File"
-#: solvespace.cpp:600
+#: solvespace.cpp:601
#, c-format
msgctxt "dialog"
msgid "Do you want to save the changes you made to the sketch “%s”?"
msgstr "Do you want to save the changes you made to the sketch “%s”?"
-#: solvespace.cpp:603
+#: solvespace.cpp:604
msgctxt "dialog"
msgid "Do you want to save the changes you made to the new sketch?"
msgstr "Do you want to save the changes you made to the new sketch?"
-#: solvespace.cpp:606
+#: solvespace.cpp:607
msgctxt "dialog"
msgid "Your changes will be lost if you don't save them."
msgstr "Your changes will be lost if you don't save them."
-#: solvespace.cpp:607
+#: solvespace.cpp:608
msgctxt "button"
msgid "&Save"
msgstr "&Save"
-#: solvespace.cpp:609
+#: solvespace.cpp:610
msgctxt "button"
msgid "Do&n't Save"
msgstr "Do&n't Save"
-#: solvespace.cpp:630
+#: solvespace.cpp:631
msgctxt "title"
msgid "(new sketch)"
msgstr "(new sketch)"
-#: solvespace.cpp:637
+#: solvespace.cpp:638
msgctxt "title"
msgid "Property Browser"
msgstr "Property Browser"
-#: solvespace.cpp:699
+#: solvespace.cpp:700
msgid ""
"Constraints are currently shown, and will be exported in the toolpath. This "
"is probably not what you want; hide them by clicking the link at the top of "
@@ -1812,7 +1820,7 @@ msgstr ""
"is probably not what you want; hide them by clicking the link at the top of "
"the text window."
-#: solvespace.cpp:771
+#: solvespace.cpp:772
#, c-format
msgid ""
"Can't identify file type from file extension of filename '%s'; try .dxf or ."
@@ -1821,19 +1829,19 @@ msgstr ""
"Can't identify file type from file extension of filename '%s'; try .dxf or ."
"dwg."
-#: solvespace.cpp:823
+#: solvespace.cpp:824
msgid "Constraint must have a label, and must not be a reference dimension."
msgstr "Constraint must have a label, and must not be a reference dimension."
-#: solvespace.cpp:827
+#: solvespace.cpp:828
msgid "Bad selection for step dimension; select a constraint."
msgstr "Bad selection for step dimension; select a constraint."
-#: solvespace.cpp:851
+#: solvespace.cpp:852
msgid "The assembly does not interfere, good."
msgstr "The assembly does not interfere, good."
-#: solvespace.cpp:867
+#: solvespace.cpp:868
#, c-format
msgid ""
"The volume of the solid model is:\n"
@@ -1844,7 +1852,7 @@ msgstr ""
"\n"
" %s"
-#: solvespace.cpp:876
+#: solvespace.cpp:877
#, c-format
msgid ""
"\n"
@@ -1857,7 +1865,7 @@ msgstr ""
"\n"
" %s"
-#: solvespace.cpp:881
+#: solvespace.cpp:882
msgid ""
"\n"
"\n"
@@ -1869,7 +1877,7 @@ msgstr ""
"Curved surfaces have been approximated as triangles.\n"
"This introduces error, typically of around 1%."
-#: solvespace.cpp:896
+#: solvespace.cpp:897
#, c-format
msgid ""
"The surface area of the selected faces is:\n"
@@ -1886,7 +1894,7 @@ msgstr ""
"Curves have been approximated as piecewise linear.\n"
"This introduces error, typically of around 1%%."
-#: solvespace.cpp:905
+#: solvespace.cpp:906
msgid ""
"This group does not contain a correctly-formed 2d closed area. It is open, "
"not coplanar, or self-intersecting."
@@ -1894,7 +1902,7 @@ msgstr ""
"This group does not contain a correctly-formed 2d closed area. It is open, "
"not coplanar, or self-intersecting."
-#: solvespace.cpp:917
+#: solvespace.cpp:918
#, c-format
msgid ""
"The area of the region sketched in this group is:\n"
@@ -1911,7 +1919,7 @@ msgstr ""
"Curves have been approximated as piecewise linear.\n"
"This introduces error, typically of around 1%%."
-#: solvespace.cpp:937
+#: solvespace.cpp:938
#, c-format
msgid ""
"The total length of the selected entities is:\n"
@@ -1928,36 +1936,36 @@ msgstr ""
"Curves have been approximated as piecewise linear.\n"
"This introduces error, typically of around 1%%."
-#: solvespace.cpp:943
+#: solvespace.cpp:944
msgid "Bad selection for perimeter; select line segments, arcs, and curves."
msgstr "Bad selection for perimeter; select line segments, arcs, and curves."
-#: solvespace.cpp:959
+#: solvespace.cpp:960
msgid "Bad selection for trace; select a single point."
msgstr "Bad selection for trace; select a single point."
-#: solvespace.cpp:986
+#: solvespace.cpp:987
#, c-format
msgid "Couldn't write to '%s'"
msgstr "Couldn't write to '%s'"
-#: solvespace.cpp:1016
+#: solvespace.cpp:1017
msgid "The mesh is self-intersecting (NOT okay, invalid)."
msgstr "The mesh is self-intersecting (NOT okay, invalid)."
-#: solvespace.cpp:1017
+#: solvespace.cpp:1018
msgid "The mesh is not self-intersecting (okay, valid)."
msgstr "The mesh is not self-intersecting (okay, valid)."
-#: solvespace.cpp:1019
+#: solvespace.cpp:1020
msgid "The mesh has naked edges (NOT okay, invalid)."
msgstr "The mesh has naked edges (NOT okay, invalid)."
-#: solvespace.cpp:1020
+#: solvespace.cpp:1021
msgid "The mesh is watertight (okay, valid)."
msgstr "The mesh is watertight (okay, valid)."
-#: solvespace.cpp:1023
+#: solvespace.cpp:1024
#, c-format
msgid ""
"\n"
@@ -1968,7 +1976,7 @@ msgstr ""
"\n"
"The model contains %d triangles, from %d surfaces."
-#: solvespace.cpp:1027
+#: solvespace.cpp:1028
#, c-format
msgid ""
"%s\n"
@@ -1983,7 +1991,7 @@ msgstr ""
"\n"
"Zero problematic edges, good.%s"
-#: solvespace.cpp:1030
+#: solvespace.cpp:1031
#, c-format
msgid ""
"%s\n"
@@ -1998,7 +2006,7 @@ msgstr ""
"\n"
"%d problematic edges, bad.%s"
-#: solvespace.cpp:1043
+#: solvespace.cpp:1044
#, c-format
msgid ""
"This is SolveSpace version %s.\n"
@@ -2039,23 +2047,23 @@ msgstr ""
msgid "Style name cannot be empty"
msgstr "Style name cannot be empty"
-#: textscreens.cpp:785
+#: textscreens.cpp:791
msgid "Can't repeat fewer than 1 time."
msgstr "Can't repeat fewer than 1 time."
-#: textscreens.cpp:789
+#: textscreens.cpp:795
msgid "Can't repeat more than 999 times."
msgstr "Can't repeat more than 999 times."
-#: textscreens.cpp:814
+#: textscreens.cpp:820
msgid "Group name cannot be empty"
msgstr "Group name cannot be empty"
-#: textscreens.cpp:866
+#: textscreens.cpp:872
msgid "Opacity must be between zero and one."
msgstr "Opacity must be between zero and one."
-#: textscreens.cpp:901
+#: textscreens.cpp:907
msgid "Radius cannot be zero or negative."
msgstr "Radius cannot be zero or negative."
diff --git a/res/locales/es_AR.po b/res/locales/es_AR.po
index 74638f0a..ac9052f9 100644
--- a/res/locales/es_AR.po
+++ b/res/locales/es_AR.po
@@ -2,12 +2,12 @@
# Copyright (C) 2017 the SolveSpace authors
# This file is distributed under the same license as the SolveSpace package.
# Maxi , 2021.
-#
+#
msgid ""
msgstr ""
"Project-Id-Version: SolveSpace 3.0\n"
"Report-Msgid-Bugs-To: whitequark@whitequark.org\n"
-"POT-Creation-Date: 2021-09-26 16:25-0400\n"
+"POT-Creation-Date: 2022-02-01 16:24+0200\n"
"PO-Revision-Date: 2021-09-17 \n"
"Last-Translator: andesfreedesign@gmail.com\n"
"Language-Team: AndesFreeDesign\n"
@@ -35,7 +35,7 @@ msgstr "El portapapeles está vacío; nada que pegar."
msgid "Number of copies to paste must be at least one."
msgstr "El número de copias para pegar debe ser al menos una."
-#: clipboard.cpp:389 textscreens.cpp:827
+#: clipboard.cpp:389 textscreens.cpp:833
msgid "Scale cannot be zero."
msgstr "La escala no puede ser cero."
@@ -63,15 +63,15 @@ msgstr "Demasiados elementos para pegar; divida esto en partes más pequeñas."
msgid "No workplane active."
msgstr "Ningún plano de trabajo activo."
-#: confscreen.cpp:376
+#: confscreen.cpp:381
msgid "Bad format: specify coordinates as x, y, z"
msgstr "Formato incorrecto: especifique las coordenadas como x, y, z"
-#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858
+#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864
msgid "Bad format: specify color as r, g, b"
msgstr "Formato incorrecto: especifique color como r, g, b"
-#: confscreen.cpp:412
+#: confscreen.cpp:417
msgid ""
"The perspective factor will have no effect until you enable View -> Use "
"Perspective Projection."
@@ -79,24 +79,24 @@ msgstr ""
"El factor de perspectiva no tendrá ningún efecto hasta que habilite Ver -> "
"UsarProyección Perspectiva."
-#: confscreen.cpp:430 confscreen.cpp:440
+#: confscreen.cpp:435 confscreen.cpp:445
#, c-format
msgid "Specify between 0 and %d digits after the decimal."
msgstr "Especifique entre 0 y %d dígitos después del decimal."
-#: confscreen.cpp:452
+#: confscreen.cpp:457
msgid "Export scale must not be zero!"
msgstr "¡La escala de exportación no debe ser cero!"
-#: confscreen.cpp:464
+#: confscreen.cpp:469
msgid "Cutter radius offset must not be negative!"
msgstr "¡El desfase del radio de corte no debe ser negativo!"
-#: confscreen.cpp:518
+#: confscreen.cpp:528
msgid "Bad value: autosave interval should be positive"
msgstr "Valor incorrecto: el intervalo de autoguardado debe ser positivo"
-#: confscreen.cpp:521
+#: confscreen.cpp:531
msgid "Bad format: specify interval in integral minutes"
msgstr "Formato incorrecto: especifique el intervalo en minutos integrales"
@@ -676,7 +676,7 @@ msgctxt "button"
msgid "&No"
msgstr "&No"
-#: file.cpp:877 solvespace.cpp:610
+#: file.cpp:877 solvespace.cpp:611
msgctxt "button"
msgid "&Cancel"
msgstr "&Cancelar"
@@ -1129,25 +1129,29 @@ msgstr "&Lenguaje"
msgid "&Website / Manual"
msgstr "&Sitio Web / Manual"
-#: graphicswin.cpp:187
+#: graphicswin.cpp:186
+msgid "&Go to GitHub commit"
+msgstr ""
+
+#: graphicswin.cpp:188
msgid "&About"
msgstr "&Acerca"
-#: graphicswin.cpp:361
+#: graphicswin.cpp:362
msgid "(no recent files)"
msgstr "(no hay archivos recientes)"
-#: graphicswin.cpp:369
+#: graphicswin.cpp:370
#, c-format
msgid "File '%s' does not exist."
msgstr "El archivo '%s' no existe."
-#: graphicswin.cpp:736
+#: graphicswin.cpp:737
msgid "No workplane is active, so the grid will not appear."
msgstr ""
"No hay ningún plano de trabajo activo, por lo que la cuadrícula no aparecerá."
-#: graphicswin.cpp:751
+#: graphicswin.cpp:752
msgid ""
"The perspective factor is set to zero, so the view will always be a parallel "
"projection.\n"
@@ -1161,20 +1165,20 @@ msgstr ""
"Para una proyección en perspectiva, modifique el factor de perspectiva en la "
"pantalla de configuración. Un valor de alrededor de 0,3 es típico."
-#: graphicswin.cpp:836
+#: graphicswin.cpp:837
msgid ""
"Select a point; this point will become the center of the view on screen."
msgstr ""
"Seleccione un punto; este punto se convertirá en el centro de la vista en "
"pantalla."
-#: graphicswin.cpp:1136
+#: graphicswin.cpp:1137
msgid "No additional entities share endpoints with the selected entities."
msgstr ""
"Ninguna entidad adicional comparte puntos finales con las entidades "
"seleccionadas."
-#: graphicswin.cpp:1154
+#: graphicswin.cpp:1155
msgid ""
"To use this command, select a point or other entity from an linked part, or "
"make a link group the active group."
@@ -1182,7 +1186,7 @@ msgstr ""
"Para usar este comando, seleccione un punto u otra entidad de una parte "
"vinculada, o convertir un grupo de enlaces en el grupo activo."
-#: graphicswin.cpp:1177
+#: graphicswin.cpp:1178
msgid ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) "
"to define the plane for the snap grid."
@@ -1191,7 +1195,7 @@ msgstr ""
"Croquis -> En plano de trabajo) para definir el plano para el enganche a la "
"cuadrícula."
-#: graphicswin.cpp:1184
+#: graphicswin.cpp:1185
msgid ""
"Can't snap these items to grid; select points, text comments, or constraints "
"with a label. To snap a line, select its endpoints."
@@ -1200,13 +1204,13 @@ msgstr ""
"comentarios de texto o restricciones con una etiqueta. Para enganchar una "
"línea, seleccione sus puntos finales."
-#: graphicswin.cpp:1269
+#: graphicswin.cpp:1270
msgid "No workplane selected. Activating default workplane for this group."
msgstr ""
"No se seleccionó ningún plano de trabajo. Activando el plano de trabajo "
"predeterminado para este grupo."
-#: graphicswin.cpp:1272
+#: graphicswin.cpp:1273
msgid ""
"No workplane is selected, and the active group does not have a default "
"workplane. Try selecting a workplane, or activating a sketch-in-new-"
@@ -1216,7 +1220,7 @@ msgstr ""
"de trabajo. Intente seleccionar un plano de trabajo o activar un croquis-en-"
"nuevo-grupo de plano de trabajo."
-#: graphicswin.cpp:1293
+#: graphicswin.cpp:1294
msgid ""
"Bad selection for tangent arc at point. Select a single point, or select "
"nothing to set up arc parameters."
@@ -1224,47 +1228,47 @@ msgstr ""
"Mala selección de arco tangente en el punto. Seleccione un solo punto o no "
"seleccione nada para configurar los parámetros del arco."
-#: graphicswin.cpp:1304
+#: graphicswin.cpp:1305
msgid "click point on arc (draws anti-clockwise)"
msgstr "clic en el punto en el arco (dibuja en sentido antihorario)"
-#: graphicswin.cpp:1305
+#: graphicswin.cpp:1306
msgid "click to place datum point"
msgstr "clic para colocar el punto de referencia"
-#: graphicswin.cpp:1306
+#: graphicswin.cpp:1307
msgid "click first point of line segment"
msgstr "clic en el primer punto del segmento de línea"
-#: graphicswin.cpp:1308
+#: graphicswin.cpp:1309
msgid "click first point of construction line segment"
msgstr "clic en el primer punto del segmento de línea de construcción"
-#: graphicswin.cpp:1309
+#: graphicswin.cpp:1310
msgid "click first point of cubic segment"
msgstr "clic en el primer punto del segmento cúbico"
-#: graphicswin.cpp:1310
+#: graphicswin.cpp:1311
msgid "click center of circle"
msgstr "clic en el centro del círculo"
-#: graphicswin.cpp:1311
+#: graphicswin.cpp:1312
msgid "click origin of workplane"
msgstr "clic en origen del plano de trabajo"
-#: graphicswin.cpp:1312
+#: graphicswin.cpp:1313
msgid "click one corner of rectangle"
msgstr "clic en una esquina del rectángulo"
-#: graphicswin.cpp:1313
+#: graphicswin.cpp:1314
msgid "click top left of text"
msgstr "clic en la parte superior izquierda del texto"
-#: graphicswin.cpp:1319
+#: graphicswin.cpp:1320
msgid "click top left of image"
msgstr "clic en la parte superior izquierda de la imagen"
-#: graphicswin.cpp:1345
+#: graphicswin.cpp:1346
msgid ""
"No entities are selected. Select entities before trying to toggle their "
"construction state."
@@ -1418,6 +1422,10 @@ msgstr "¡El contorno se intersecta a sí mismo!"
msgid "zero-length edge!"
msgstr "¡arista de longitud cero!"
+#: importmesh.cpp:136
+msgid "Text-formated STL files are not currently supported"
+msgstr ""
+
#: modify.cpp:252
msgid "Must be sketching in workplane to create tangent arc."
msgstr ""
@@ -1617,7 +1625,7 @@ msgstr ""
"No se puede dibujar una imagen en 3D; primero, active un plano de trabajo "
"con Croquis -> En Plano de Trabajo."
-#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552
+#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553
msgctxt "file-type"
msgid "SolveSpace models"
msgstr "SolveSpace modelos"
@@ -1712,104 +1720,104 @@ msgctxt "file-type"
msgid "Comma-separated values"
msgstr "Valores separados por comas"
-#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641
+#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641
msgid "untitled"
msgstr "sin título"
-#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445
+#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467
#: platform/guiwin.cpp:1639
msgctxt "title"
msgid "Save File"
msgstr "Guardar Archivo"
-#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428
+#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450
#: platform/guiwin.cpp:1645
msgctxt "title"
msgid "Open File"
msgstr "Abrir Archivo"
-#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418
+#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433
msgctxt "button"
msgid "_Cancel"
msgstr "_Cancelar"
-#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416
+#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431
msgctxt "button"
msgid "_Save"
msgstr "_Guardar"
-#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417
+#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432
msgctxt "button"
msgid "_Open"
msgstr "_Abrir"
-#: solvespace.cpp:170
+#: solvespace.cpp:171
msgctxt "title"
msgid "Autosave Available"
msgstr "Autoguardado Disponible"
-#: solvespace.cpp:171
+#: solvespace.cpp:172
msgctxt "dialog"
msgid "An autosave file is available for this sketch."
msgstr "Un archivo de autoguardado está disponible para este croquis."
-#: solvespace.cpp:172
+#: solvespace.cpp:173
msgctxt "dialog"
msgid "Do you want to load the autosave file instead?"
msgstr "¿Desea cargar el archivo de autoguardado en su lugar?"
-#: solvespace.cpp:173
+#: solvespace.cpp:174
msgctxt "button"
msgid "&Load autosave"
msgstr "&Cargar autoguardado"
-#: solvespace.cpp:175
+#: solvespace.cpp:176
msgctxt "button"
msgid "Do&n't Load"
msgstr "No Cargar"
-#: solvespace.cpp:598
+#: solvespace.cpp:599
msgctxt "title"
msgid "Modified File"
msgstr "Archivo Modificado"
-#: solvespace.cpp:600
+#: solvespace.cpp:601
#, c-format
msgctxt "dialog"
msgid "Do you want to save the changes you made to the sketch “%s”?"
msgstr "¿Desea guardar los cambios que realizó en el croquis “%s”?"
-#: solvespace.cpp:603
+#: solvespace.cpp:604
msgctxt "dialog"
msgid "Do you want to save the changes you made to the new sketch?"
msgstr "¿Desea guardar los cambios que realizó en el nuevo croquis?"
-#: solvespace.cpp:606
+#: solvespace.cpp:607
msgctxt "dialog"
msgid "Your changes will be lost if you don't save them."
msgstr "Sus cambios se perderán si no los guarda."
-#: solvespace.cpp:607
+#: solvespace.cpp:608
msgctxt "button"
msgid "&Save"
msgstr "&Guardar"
-#: solvespace.cpp:609
+#: solvespace.cpp:610
msgctxt "button"
msgid "Do&n't Save"
msgstr "No& Guardar"
-#: solvespace.cpp:630
+#: solvespace.cpp:631
msgctxt "title"
msgid "(new sketch)"
msgstr "(nuevo croquis)"
-#: solvespace.cpp:637
+#: solvespace.cpp:638
msgctxt "title"
msgid "Property Browser"
msgstr "Explorador de Propiedades"
-#: solvespace.cpp:699
+#: solvespace.cpp:700
msgid ""
"Constraints are currently shown, and will be exported in the toolpath. This "
"is probably not what you want; hide them by clicking the link at the top of "
@@ -1819,7 +1827,7 @@ msgstr ""
"Probablemente esto no sea lo que quieres; ocultarlos haciendo clic en el "
"enlace en la parte superior de la ventana de texto."
-#: solvespace.cpp:771
+#: solvespace.cpp:772
#, c-format
msgid ""
"Can't identify file type from file extension of filename '%s'; try .dxf or ."
@@ -1828,20 +1836,20 @@ msgstr ""
"No se puede identificar el tipo de archivo a partir de la extensión del "
"nombre del archivo '%s'; intente .dxf o .dwg."
-#: solvespace.cpp:823
+#: solvespace.cpp:824
msgid "Constraint must have a label, and must not be a reference dimension."
msgstr ""
"La restricción debe tener una etiqueta y no debe ser una cota de referencia."
-#: solvespace.cpp:827
+#: solvespace.cpp:828
msgid "Bad selection for step dimension; select a constraint."
msgstr "Mala selección para la cota del paso; seleccione una restricción."
-#: solvespace.cpp:851
+#: solvespace.cpp:852
msgid "The assembly does not interfere, good."
msgstr "El ensamble no interfiere, bien."
-#: solvespace.cpp:867
+#: solvespace.cpp:868
#, c-format
msgid ""
"The volume of the solid model is:\n"
@@ -1852,7 +1860,7 @@ msgstr ""
"\n"
" %s"
-#: solvespace.cpp:876
+#: solvespace.cpp:877
#, c-format
msgid ""
"\n"
@@ -1865,7 +1873,7 @@ msgstr ""
"\n"
" %s"
-#: solvespace.cpp:881
+#: solvespace.cpp:882
msgid ""
"\n"
"\n"
@@ -1877,7 +1885,7 @@ msgstr ""
"Las superficies curvas se han aproximado como triángulos.\n"
"Esto introduce un error, normalmente alrededor del 1%."
-#: solvespace.cpp:896
+#: solvespace.cpp:897
#, c-format
msgid ""
"The surface area of the selected faces is:\n"
@@ -1894,7 +1902,7 @@ msgstr ""
"Las curvas se han aproximado como lineales por partes.\n"
"Esto introduce un error, normalmente alrededor del 1%%."
-#: solvespace.cpp:905
+#: solvespace.cpp:906
msgid ""
"This group does not contain a correctly-formed 2d closed area. It is open, "
"not coplanar, or self-intersecting."
@@ -1902,7 +1910,7 @@ msgstr ""
"Este grupo no contiene un área cerrada 2d correctamente formada. Está "
"abierta, no coplanares, ni auto-intersectantes."
-#: solvespace.cpp:917
+#: solvespace.cpp:918
#, c-format
msgid ""
"The area of the region sketched in this group is:\n"
@@ -1919,7 +1927,7 @@ msgstr ""
"Las curvas se han aproximado como lineales por partes.\n"
"Esto introduce un error, normalmente alrededor del 1%%."
-#: solvespace.cpp:937
+#: solvespace.cpp:938
#, c-format
msgid ""
"The total length of the selected entities is:\n"
@@ -1936,37 +1944,37 @@ msgstr ""
"Las curvas se han aproximado como lineales por partes.\n"
"Esto introduce un error, normalmente alrededor del 1%%."
-#: solvespace.cpp:943
+#: solvespace.cpp:944
msgid "Bad selection for perimeter; select line segments, arcs, and curves."
msgstr ""
"Mala selección de perímetro; seleccione segmentos de línea, arcos y curvas."
-#: solvespace.cpp:959
+#: solvespace.cpp:960
msgid "Bad selection for trace; select a single point."
msgstr "Mala selección de rastreo; seleccione un solo punto."
-#: solvespace.cpp:986
+#: solvespace.cpp:987
#, c-format
msgid "Couldn't write to '%s'"
msgstr "No pude escribir a '%s'"
-#: solvespace.cpp:1016
+#: solvespace.cpp:1017
msgid "The mesh is self-intersecting (NOT okay, invalid)."
msgstr "La malla se intersecta a si misma (NO está bien, no es válida)."
-#: solvespace.cpp:1017
+#: solvespace.cpp:1018
msgid "The mesh is not self-intersecting (okay, valid)."
msgstr "La malla no se intersecta (está bien, es válida)."
-#: solvespace.cpp:1019
+#: solvespace.cpp:1020
msgid "The mesh has naked edges (NOT okay, invalid)."
msgstr "La malla tiene bordes desnudos (NO está bien, no es válida)."
-#: solvespace.cpp:1020
+#: solvespace.cpp:1021
msgid "The mesh is watertight (okay, valid)."
msgstr "La malla es estanca (está bien, es válida)."
-#: solvespace.cpp:1023
+#: solvespace.cpp:1024
#, c-format
msgid ""
"\n"
@@ -1977,7 +1985,7 @@ msgstr ""
"\n"
"El modelo contiene %d triángulos, desde %d superficies."
-#: solvespace.cpp:1027
+#: solvespace.cpp:1028
#, c-format
msgid ""
"%s\n"
@@ -1992,7 +2000,7 @@ msgstr ""
"\n"
"Cero aristas problemáticas, bien.%s"
-#: solvespace.cpp:1030
+#: solvespace.cpp:1031
#, c-format
msgid ""
"%s\n"
@@ -2007,7 +2015,7 @@ msgstr ""
"\n"
"%d aristas problemáticas, mal.%s"
-#: solvespace.cpp:1043
+#: solvespace.cpp:1044
#, c-format
msgid ""
"This is SolveSpace version %s.\n"
@@ -2048,23 +2056,23 @@ msgstr ""
msgid "Style name cannot be empty"
msgstr "El nombre del estilo no puede estar vacío"
-#: textscreens.cpp:785
+#: textscreens.cpp:791
msgid "Can't repeat fewer than 1 time."
msgstr "No se puede repetir menos de 1 vez."
-#: textscreens.cpp:789
+#: textscreens.cpp:795
msgid "Can't repeat more than 999 times."
msgstr "No se puede repetir más de 999 veces."
-#: textscreens.cpp:814
+#: textscreens.cpp:820
msgid "Group name cannot be empty"
msgstr "El nombre del grupo no puede estar vacío"
-#: textscreens.cpp:866
+#: textscreens.cpp:872
msgid "Opacity must be between zero and one."
msgstr "La opacidad debe estar entre cero y uno."
-#: textscreens.cpp:901
+#: textscreens.cpp:907
msgid "Radius cannot be zero or negative."
msgstr "El radio no puede ser cero o negativo."
diff --git a/res/locales/fr_FR.po b/res/locales/fr_FR.po
index 6b5845a7..ec6d3bac 100644
--- a/res/locales/fr_FR.po
+++ b/res/locales/fr_FR.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: SolveSpace 3.0\n"
"Report-Msgid-Bugs-To: whitequark@whitequark.org\n"
-"POT-Creation-Date: 2021-09-26 16:25-0400\n"
+"POT-Creation-Date: 2022-02-01 16:24+0200\n"
"PO-Revision-Date: 2018-07-14 06:12+0000\n"
"Last-Translator: whitequark \n"
"Language-Team: none\n"
@@ -35,7 +35,7 @@ msgstr "Presse papier vide; rien à coller."
msgid "Number of copies to paste must be at least one."
msgstr "Le nombre de copies à coller doit être d'au moins un."
-#: clipboard.cpp:389 textscreens.cpp:827
+#: clipboard.cpp:389 textscreens.cpp:833
msgid "Scale cannot be zero."
msgstr "L'échelle ne peut pas être zéro."
@@ -63,15 +63,15 @@ msgstr "Trop d'éléments à coller; Divisez-les en plus petits groupes."
msgid "No workplane active."
msgstr "Pas d'espace de travail actif."
-#: confscreen.cpp:376
+#: confscreen.cpp:381
msgid "Bad format: specify coordinates as x, y, z"
msgstr "Mauvais format: spécifiez les coordonnées comme x, y, z"
-#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858
+#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864
msgid "Bad format: specify color as r, g, b"
msgstr "Mauvais format; spécifiez la couleur comme r, v, b"
-#: confscreen.cpp:412
+#: confscreen.cpp:417
msgid ""
"The perspective factor will have no effect until you enable View -> Use "
"Perspective Projection."
@@ -79,26 +79,26 @@ msgstr ""
"Le facteur de perspective n'aura aucun effet tant que vous n'aurez pas "
"activé \"Affichage -> Utiliser la projection de perspective\"."
-#: confscreen.cpp:430 confscreen.cpp:440
+#: confscreen.cpp:435 confscreen.cpp:445
#, c-format
msgid "Specify between 0 and %d digits after the decimal."
msgstr ""
-#: confscreen.cpp:452
+#: confscreen.cpp:457
msgid "Export scale must not be zero!"
msgstr "L'échelle d'export ne doit pas être zéro!"
-#: confscreen.cpp:464
+#: confscreen.cpp:469
msgid "Cutter radius offset must not be negative!"
msgstr "Le décalage du rayon de coupe ne doit pas être négatif!"
-#: confscreen.cpp:518
+#: confscreen.cpp:528
msgid "Bad value: autosave interval should be positive"
msgstr ""
"Mauvaise valeur: l'intervalle d'enregistrement automatique devrait être "
"positif"
-#: confscreen.cpp:521
+#: confscreen.cpp:531
msgid "Bad format: specify interval in integral minutes"
msgstr "Mauvais format: spécifiez un nombre entier de minutes"
@@ -678,7 +678,7 @@ msgctxt "button"
msgid "&No"
msgstr ""
-#: file.cpp:877 solvespace.cpp:610
+#: file.cpp:877 solvespace.cpp:611
msgctxt "button"
msgid "&Cancel"
msgstr ""
@@ -1131,24 +1131,28 @@ msgstr "&Langue"
msgid "&Website / Manual"
msgstr "&Site web / Manuel"
-#: graphicswin.cpp:187
+#: graphicswin.cpp:186
+msgid "&Go to GitHub commit"
+msgstr ""
+
+#: graphicswin.cpp:188
msgid "&About"
msgstr "&A propos"
-#: graphicswin.cpp:361
+#: graphicswin.cpp:362
msgid "(no recent files)"
msgstr "(pas de fichier récent)"
-#: graphicswin.cpp:369
+#: graphicswin.cpp:370
#, c-format
msgid "File '%s' does not exist."
msgstr ""
-#: graphicswin.cpp:736
+#: graphicswin.cpp:737
msgid "No workplane is active, so the grid will not appear."
msgstr "Pas de plan de travail actif, donc la grille ne va pas apparaître."
-#: graphicswin.cpp:751
+#: graphicswin.cpp:752
msgid ""
"The perspective factor is set to zero, so the view will always be a parallel "
"projection.\n"
@@ -1162,19 +1166,19 @@ msgstr ""
"Pour une projection en perspective, modifiez le facteur de perspective dans "
"l'écran de configuration. Une valeur d'environ 0,3 est typique."
-#: graphicswin.cpp:836
+#: graphicswin.cpp:837
msgid ""
"Select a point; this point will become the center of the view on screen."
msgstr ""
"Sélectionnez un point. Ce point deviendra le centre de la vue à l'écran."
-#: graphicswin.cpp:1136
+#: graphicswin.cpp:1137
msgid "No additional entities share endpoints with the selected entities."
msgstr ""
"Aucune entité supplémentaire ne partage des points d'extrémité avec les "
"entités sélectionnées."
-#: graphicswin.cpp:1154
+#: graphicswin.cpp:1155
msgid ""
"To use this command, select a point or other entity from an linked part, or "
"make a link group the active group."
@@ -1182,7 +1186,7 @@ msgstr ""
"Pour utiliser cette commande, sélectionnez un point ou une autre entité à "
"partir d'une pièce liée ou créez un groupe de liens dans le groupe actif."
-#: graphicswin.cpp:1177
+#: graphicswin.cpp:1178
msgid ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) "
"to define the plane for the snap grid."
@@ -1190,7 +1194,7 @@ msgstr ""
"Aucun plan de travail n'est actif. Activez un plan de travail (avec Dessin -"
"> Dans plan de travail) pour définir le plan pour la grille d'accrochage."
-#: graphicswin.cpp:1184
+#: graphicswin.cpp:1185
msgid ""
"Can't snap these items to grid; select points, text comments, or constraints "
"with a label. To snap a line, select its endpoints."
@@ -1199,13 +1203,13 @@ msgstr ""
"des textes de commentaires ou des contraintes avec une étiquette. Pour "
"accrocher une ligne, sélectionnez ses points d'extrémité."
-#: graphicswin.cpp:1269
+#: graphicswin.cpp:1270
msgid "No workplane selected. Activating default workplane for this group."
msgstr ""
"Aucun plan de travail sélectionné. Activation du plan de travail par défaut "
"pour ce groupe."
-#: graphicswin.cpp:1272
+#: graphicswin.cpp:1273
msgid ""
"No workplane is selected, and the active group does not have a default "
"workplane. Try selecting a workplane, or activating a sketch-in-new-"
@@ -1215,7 +1219,7 @@ msgstr ""
"de travail par défaut. Essayez de sélectionner un plan de travail ou "
"d'activer un groupe de \"Dessin dans nouveau plan travail\"."
-#: graphicswin.cpp:1293
+#: graphicswin.cpp:1294
msgid ""
"Bad selection for tangent arc at point. Select a single point, or select "
"nothing to set up arc parameters."
@@ -1223,49 +1227,49 @@ msgstr ""
"Mauvaise sélection pour l'arc tangent au point. Sélectionnez un seul point, "
"ou ne sélectionnez rien pour configurer les paramètres de l'arc."
-#: graphicswin.cpp:1304
+#: graphicswin.cpp:1305
msgid "click point on arc (draws anti-clockwise)"
msgstr ""
"cliquez un point sur l'arc (dessine dans le sens inverse des aiguilles d'une "
"montre)"
-#: graphicswin.cpp:1305
+#: graphicswin.cpp:1306
msgid "click to place datum point"
msgstr "cliquez pour placer un point"
-#: graphicswin.cpp:1306
+#: graphicswin.cpp:1307
msgid "click first point of line segment"
msgstr "cliquez le premier point du segment de ligne"
-#: graphicswin.cpp:1308
+#: graphicswin.cpp:1309
msgid "click first point of construction line segment"
msgstr "cliquez le premier point de la ligne de construction"
-#: graphicswin.cpp:1309
+#: graphicswin.cpp:1310
msgid "click first point of cubic segment"
msgstr "cliquez le premier point du segment cubique"
-#: graphicswin.cpp:1310
+#: graphicswin.cpp:1311
msgid "click center of circle"
msgstr "cliquez pour placer le centre du cercle"
-#: graphicswin.cpp:1311
+#: graphicswin.cpp:1312
msgid "click origin of workplane"
msgstr "cliquez pour placer l'origine du plan de travail"
-#: graphicswin.cpp:1312
+#: graphicswin.cpp:1313
msgid "click one corner of rectangle"
msgstr "cliquez un coin du rectangle"
-#: graphicswin.cpp:1313
+#: graphicswin.cpp:1314
msgid "click top left of text"
msgstr "cliquez le haut à gauche du texte"
-#: graphicswin.cpp:1319
+#: graphicswin.cpp:1320
msgid "click top left of image"
msgstr "cliquez le haut à gauche de l'image"
-#: graphicswin.cpp:1345
+#: graphicswin.cpp:1346
msgid ""
"No entities are selected. Select entities before trying to toggle their "
"construction state."
@@ -1409,6 +1413,10 @@ msgstr "le contour s'entrecroise!"
msgid "zero-length edge!"
msgstr "arête de longueur nulle!"
+#: importmesh.cpp:136
+msgid "Text-formated STL files are not currently supported"
+msgstr ""
+
#: modify.cpp:252
msgid "Must be sketching in workplane to create tangent arc."
msgstr "Vous devez dessiner dans un plan pour créer un arc tangent."
@@ -1604,7 +1612,7 @@ msgstr ""
"Impossible de dessiner l'image en 3d; D'abord, activez un plan de travail "
"avec \"Dessin -> Dans plan de travail\"."
-#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552
+#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553
msgctxt "file-type"
msgid "SolveSpace models"
msgstr ""
@@ -1699,130 +1707,130 @@ msgctxt "file-type"
msgid "Comma-separated values"
msgstr ""
-#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641
+#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641
msgid "untitled"
msgstr "sans nom"
-#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445
+#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467
#: platform/guiwin.cpp:1639
msgctxt "title"
msgid "Save File"
msgstr "Sauver fichier"
-#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428
+#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450
#: platform/guiwin.cpp:1645
msgctxt "title"
msgid "Open File"
msgstr "Ouvrir Fichier"
-#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418
+#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433
msgctxt "button"
msgid "_Cancel"
msgstr "_Annuler"
-#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416
+#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431
msgctxt "button"
msgid "_Save"
msgstr "_Sauver"
-#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417
+#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432
msgctxt "button"
msgid "_Open"
msgstr ""
-#: solvespace.cpp:170
+#: solvespace.cpp:171
msgctxt "title"
msgid "Autosave Available"
msgstr "Sauvegarde automatique existante"
-#: solvespace.cpp:171
+#: solvespace.cpp:172
msgctxt "dialog"
msgid "An autosave file is available for this sketch."
msgstr ""
-#: solvespace.cpp:172
+#: solvespace.cpp:173
msgctxt "dialog"
msgid "Do you want to load the autosave file instead?"
msgstr ""
-#: solvespace.cpp:173
+#: solvespace.cpp:174
msgctxt "button"
msgid "&Load autosave"
msgstr ""
-#: solvespace.cpp:175
+#: solvespace.cpp:176
msgctxt "button"
msgid "Do&n't Load"
msgstr ""
-#: solvespace.cpp:598
+#: solvespace.cpp:599
msgctxt "title"
msgid "Modified File"
msgstr "Fichier modifié"
-#: solvespace.cpp:600
+#: solvespace.cpp:601
#, c-format
msgctxt "dialog"
msgid "Do you want to save the changes you made to the sketch “%s”?"
msgstr ""
-#: solvespace.cpp:603
+#: solvespace.cpp:604
msgctxt "dialog"
msgid "Do you want to save the changes you made to the new sketch?"
msgstr ""
-#: solvespace.cpp:606
+#: solvespace.cpp:607
msgctxt "dialog"
msgid "Your changes will be lost if you don't save them."
msgstr ""
-#: solvespace.cpp:607
+#: solvespace.cpp:608
msgctxt "button"
msgid "&Save"
msgstr ""
-#: solvespace.cpp:609
+#: solvespace.cpp:610
msgctxt "button"
msgid "Do&n't Save"
msgstr ""
-#: solvespace.cpp:630
+#: solvespace.cpp:631
msgctxt "title"
msgid "(new sketch)"
msgstr "(nouveau dessin)"
-#: solvespace.cpp:637
+#: solvespace.cpp:638
msgctxt "title"
msgid "Property Browser"
msgstr "Navigateur de propriété"
-#: solvespace.cpp:699
+#: solvespace.cpp:700
msgid ""
"Constraints are currently shown, and will be exported in the toolpath. This "
"is probably not what you want; hide them by clicking the link at the top of "
"the text window."
msgstr ""
-#: solvespace.cpp:771
+#: solvespace.cpp:772
#, c-format
msgid ""
"Can't identify file type from file extension of filename '%s'; try .dxf or ."
"dwg."
msgstr ""
-#: solvespace.cpp:823
+#: solvespace.cpp:824
msgid "Constraint must have a label, and must not be a reference dimension."
msgstr ""
-#: solvespace.cpp:827
+#: solvespace.cpp:828
msgid "Bad selection for step dimension; select a constraint."
msgstr ""
-#: solvespace.cpp:851
+#: solvespace.cpp:852
msgid "The assembly does not interfere, good."
msgstr ""
-#: solvespace.cpp:867
+#: solvespace.cpp:868
#, c-format
msgid ""
"The volume of the solid model is:\n"
@@ -1830,7 +1838,7 @@ msgid ""
" %s"
msgstr ""
-#: solvespace.cpp:876
+#: solvespace.cpp:877
#, c-format
msgid ""
"\n"
@@ -1839,7 +1847,7 @@ msgid ""
" %s"
msgstr ""
-#: solvespace.cpp:881
+#: solvespace.cpp:882
msgid ""
"\n"
"\n"
@@ -1847,7 +1855,7 @@ msgid ""
"This introduces error, typically of around 1%."
msgstr ""
-#: solvespace.cpp:896
+#: solvespace.cpp:897
#, c-format
msgid ""
"The surface area of the selected faces is:\n"
@@ -1858,13 +1866,13 @@ msgid ""
"This introduces error, typically of around 1%%."
msgstr ""
-#: solvespace.cpp:905
+#: solvespace.cpp:906
msgid ""
"This group does not contain a correctly-formed 2d closed area. It is open, "
"not coplanar, or self-intersecting."
msgstr ""
-#: solvespace.cpp:917
+#: solvespace.cpp:918
#, c-format
msgid ""
"The area of the region sketched in this group is:\n"
@@ -1875,7 +1883,7 @@ msgid ""
"This introduces error, typically of around 1%%."
msgstr ""
-#: solvespace.cpp:937
+#: solvespace.cpp:938
#, c-format
msgid ""
"The total length of the selected entities is:\n"
@@ -1886,36 +1894,36 @@ msgid ""
"This introduces error, typically of around 1%%."
msgstr ""
-#: solvespace.cpp:943
+#: solvespace.cpp:944
msgid "Bad selection for perimeter; select line segments, arcs, and curves."
msgstr ""
-#: solvespace.cpp:959
+#: solvespace.cpp:960
msgid "Bad selection for trace; select a single point."
msgstr ""
-#: solvespace.cpp:986
+#: solvespace.cpp:987
#, c-format
msgid "Couldn't write to '%s'"
msgstr ""
-#: solvespace.cpp:1016
+#: solvespace.cpp:1017
msgid "The mesh is self-intersecting (NOT okay, invalid)."
msgstr ""
-#: solvespace.cpp:1017
+#: solvespace.cpp:1018
msgid "The mesh is not self-intersecting (okay, valid)."
msgstr ""
-#: solvespace.cpp:1019
+#: solvespace.cpp:1020
msgid "The mesh has naked edges (NOT okay, invalid)."
msgstr ""
-#: solvespace.cpp:1020
+#: solvespace.cpp:1021
msgid "The mesh is watertight (okay, valid)."
msgstr ""
-#: solvespace.cpp:1023
+#: solvespace.cpp:1024
#, c-format
msgid ""
"\n"
@@ -1923,7 +1931,7 @@ msgid ""
"The model contains %d triangles, from %d surfaces."
msgstr ""
-#: solvespace.cpp:1027
+#: solvespace.cpp:1028
#, c-format
msgid ""
"%s\n"
@@ -1933,7 +1941,7 @@ msgid ""
"Zero problematic edges, good.%s"
msgstr ""
-#: solvespace.cpp:1030
+#: solvespace.cpp:1031
#, c-format
msgid ""
"%s\n"
@@ -1943,7 +1951,7 @@ msgid ""
"%d problematic edges, bad.%s"
msgstr ""
-#: solvespace.cpp:1043
+#: solvespace.cpp:1044
#, c-format
msgid ""
"This is SolveSpace version %s.\n"
@@ -1972,23 +1980,23 @@ msgstr ""
msgid "Style name cannot be empty"
msgstr "Le nom d'un style ne peut pas être vide"
-#: textscreens.cpp:785
+#: textscreens.cpp:791
msgid "Can't repeat fewer than 1 time."
msgstr "Je ne peux pas répéter moins de 1 fois."
-#: textscreens.cpp:789
+#: textscreens.cpp:795
msgid "Can't repeat more than 999 times."
msgstr "Je ne peux pas répéter plus de 999 fois."
-#: textscreens.cpp:814
+#: textscreens.cpp:820
msgid "Group name cannot be empty"
msgstr "Un nom de groupe ne peut pas être vide"
-#: textscreens.cpp:866
+#: textscreens.cpp:872
msgid "Opacity must be between zero and one."
msgstr "L'opacité doit être entre 0 et 1."
-#: textscreens.cpp:901
+#: textscreens.cpp:907
msgid "Radius cannot be zero or negative."
msgstr "Le rayon ne peut pas être zéro ou négatif."
diff --git a/res/locales/ru_RU.po b/res/locales/ru_RU.po
index d688a75c..bf9bbfbb 100644
--- a/res/locales/ru_RU.po
+++ b/res/locales/ru_RU.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: SolveSpace 3.0\n"
"Report-Msgid-Bugs-To: whitequark@whitequark.org\n"
-"POT-Creation-Date: 2021-09-26 16:25-0400\n"
+"POT-Creation-Date: 2022-02-01 16:24+0200\n"
"PO-Revision-Date: 2021-10-04 15:33+0300\n"
"Last-Translator: Olesya Gerasimenko \n"
"Language-Team: Basealt Translation Team\n"
@@ -36,7 +36,7 @@ msgstr "Буфер обмена пуст; нечего вставлять."
msgid "Number of copies to paste must be at least one."
msgstr "Укажите в поле 'количество' хотя бы одну копию для вставки."
-#: clipboard.cpp:389 textscreens.cpp:827
+#: clipboard.cpp:389 textscreens.cpp:833
msgid "Scale cannot be zero."
msgstr "Масштабный коэффициент не может быть нулевым."
@@ -63,15 +63,15 @@ msgstr "Слишком много элементов для вставки; ра
msgid "No workplane active."
msgstr "Рабочая плоскость не активна"
-#: confscreen.cpp:376
+#: confscreen.cpp:381
msgid "Bad format: specify coordinates as x, y, z"
msgstr "Неверный формат: введите координаты как x, y, z"
-#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858
+#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864
msgid "Bad format: specify color as r, g, b"
msgstr "Неверный формат: введите цвет как r, g, b"
-#: confscreen.cpp:412
+#: confscreen.cpp:417
msgid ""
"The perspective factor will have no effect until you enable View -> Use "
"Perspective Projection."
@@ -79,25 +79,25 @@ msgstr ""
"Коэффициент перспективы не будет иметь эффект, пока вы не включите Вид-"
">Перспективная Проекция."
-#: confscreen.cpp:430 confscreen.cpp:440
+#: confscreen.cpp:435 confscreen.cpp:445
#, c-format
msgid "Specify between 0 and %d digits after the decimal."
msgstr "Введите число от 0 до %d."
-#: confscreen.cpp:452
+#: confscreen.cpp:457
msgid "Export scale must not be zero!"
msgstr "Масштабный коэффициент не может быть нулевым!"
-#: confscreen.cpp:464
+#: confscreen.cpp:469
msgid "Cutter radius offset must not be negative!"
msgstr "Радиус режущего инструмента не может быть отрицательным!"
-#: confscreen.cpp:518
+#: confscreen.cpp:528
msgid "Bad value: autosave interval should be positive"
msgstr ""
"Неверное значение: интервал автосохранения должен быть положительным числом"
-#: confscreen.cpp:521
+#: confscreen.cpp:531
msgid "Bad format: specify interval in integral minutes"
msgstr ""
"Неверный формат: введите целое число, чтобы задать интервал автосохранения"
@@ -405,8 +405,8 @@ msgid ""
" * two arcs\n"
" * one arc and one line segment\n"
msgstr ""
-"Неправильное выделение для ограничения 'отношение длин'. Ограничение может"
-" принимать в качестве выделения следующие примитивы:\n"
+"Неправильное выделение для ограничения 'отношение длин'. Ограничение может "
+"принимать в качестве выделения следующие примитивы:\n"
"\n"
" * два отрезка\n"
" * две дуги\n"
@@ -421,8 +421,8 @@ msgid ""
" * two arcs\n"
" * one arc and one line segment\n"
msgstr ""
-"Неправильное выделение для ограничения 'разность длин'. Ограничение может"
-" принимать в качестве выделения следующие примитивы:\n"
+"Неправильное выделение для ограничения 'разность длин'. Ограничение может "
+"принимать в качестве выделения следующие примитивы:\n"
"\n"
" * два отрезка\n"
" * две дуги\n"
@@ -693,7 +693,7 @@ msgctxt "button"
msgid "&No"
msgstr "Нет"
-#: file.cpp:877 solvespace.cpp:610
+#: file.cpp:877 solvespace.cpp:611
msgctxt "button"
msgid "&Cancel"
msgstr "Отменить"
@@ -1146,24 +1146,28 @@ msgstr "&Язык"
msgid "&Website / Manual"
msgstr "Вебсайт / &Справка"
-#: graphicswin.cpp:187
+#: graphicswin.cpp:186
+msgid "&Go to GitHub commit"
+msgstr ""
+
+#: graphicswin.cpp:188
msgid "&About"
msgstr "О &Программе"
-#: graphicswin.cpp:361
+#: graphicswin.cpp:362
msgid "(no recent files)"
msgstr "(пусто)"
-#: graphicswin.cpp:369
+#: graphicswin.cpp:370
#, c-format
msgid "File '%s' does not exist."
msgstr "Файл '%s' не существует."
-#: graphicswin.cpp:736
+#: graphicswin.cpp:737
msgid "No workplane is active, so the grid will not appear."
msgstr "Сетку не будет видно, пока рабочая плоскость не активирована."
-#: graphicswin.cpp:751
+#: graphicswin.cpp:752
msgid ""
"The perspective factor is set to zero, so the view will always be a parallel "
"projection.\n"
@@ -1177,16 +1181,16 @@ msgstr ""
"перспективы на конфигурационной странице браузера.\n"
"Значение по умолчанию 0.3."
-#: graphicswin.cpp:836
+#: graphicswin.cpp:837
msgid ""
"Select a point; this point will become the center of the view on screen."
msgstr "Выделите точку. Вид будет отцентрован по этой точке."
-#: graphicswin.cpp:1136
+#: graphicswin.cpp:1137
msgid "No additional entities share endpoints with the selected entities."
msgstr "Нет дополнительных объектов, соединенных с выбранными примитивами."
-#: graphicswin.cpp:1154
+#: graphicswin.cpp:1155
msgid ""
"To use this command, select a point or other entity from an linked part, or "
"make a link group the active group."
@@ -1195,7 +1199,7 @@ msgstr ""
"принадлежащий импортированной детали, или активируйте группу импортированной "
"детали."
-#: graphicswin.cpp:1177
+#: graphicswin.cpp:1178
msgid ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) "
"to define the plane for the snap grid."
@@ -1203,7 +1207,7 @@ msgstr ""
"Рабочая плоскость не активна. Активируйте ее через Эскиз -> В Рабочей "
"Плоскости чтобы определить плоскость для сетки."
-#: graphicswin.cpp:1184
+#: graphicswin.cpp:1185
msgid ""
"Can't snap these items to grid; select points, text comments, or constraints "
"with a label. To snap a line, select its endpoints."
@@ -1212,13 +1216,13 @@ msgstr ""
"текстовые комментарии или ограничения с размерными значениями. Чтобы "
"привязать отрезок или другой примитив, выбирайте его точки."
-#: graphicswin.cpp:1269
+#: graphicswin.cpp:1270
msgid "No workplane selected. Activating default workplane for this group."
msgstr ""
"Рабочая плоскость не активна. Активирована рабочая плоскость по умолчанию "
"для данной группы."
-#: graphicswin.cpp:1272
+#: graphicswin.cpp:1273
msgid ""
"No workplane is selected, and the active group does not have a default "
"workplane. Try selecting a workplane, or activating a sketch-in-new-"
@@ -1228,7 +1232,7 @@ msgstr ""
"по умолчанию. Попробуйте выделить рабочую плоскость или создать новую с "
"помощью Группа -> Создать Эскиз в Новой Рабочей Плоскости."
-#: graphicswin.cpp:1293
+#: graphicswin.cpp:1294
msgid ""
"Bad selection for tangent arc at point. Select a single point, or select "
"nothing to set up arc parameters."
@@ -1237,54 +1241,54 @@ msgstr ""
"точку, либо запустите команду без выделения, чтобы перейти к окну настроек "
"этой команды."
-#: graphicswin.cpp:1304
+#: graphicswin.cpp:1305
msgid "click point on arc (draws anti-clockwise)"
msgstr ""
"кликните мышью там, где хотите создать дугу окружности (дуга будет "
"нарисована против часовой стрелки)"
-#: graphicswin.cpp:1305
+#: graphicswin.cpp:1306
msgid "click to place datum point"
msgstr "кликните мышью там, где хотите создать опорную точку"
-#: graphicswin.cpp:1306
+#: graphicswin.cpp:1307
msgid "click first point of line segment"
msgstr "кликните мышью там, где хотите создать первую точку отрезка"
-#: graphicswin.cpp:1308
+#: graphicswin.cpp:1309
msgid "click first point of construction line segment"
msgstr ""
"кликните мышью там, где хотите создать первую точку вспомогательного отрезка"
-#: graphicswin.cpp:1309
+#: graphicswin.cpp:1310
msgid "click first point of cubic segment"
msgstr ""
"кликните мышью там, где хотите создать первую точку кубического сплайна Безье"
-#: graphicswin.cpp:1310
+#: graphicswin.cpp:1311
msgid "click center of circle"
msgstr "кликните мышью там, где будет находиться центр окружности"
-#: graphicswin.cpp:1311
+#: graphicswin.cpp:1312
msgid "click origin of workplane"
msgstr ""
"кликните мышью там, где будет находиться точка, через которую будет "
"построена рабочая плоскость"
-#: graphicswin.cpp:1312
+#: graphicswin.cpp:1313
msgid "click one corner of rectangle"
msgstr "кликните мышью там, где будет находиться один из углов прямоугольника"
-#: graphicswin.cpp:1313
+#: graphicswin.cpp:1314
msgid "click top left of text"
msgstr "кликните мышью там, где хотите создать текст"
-#: graphicswin.cpp:1319
+#: graphicswin.cpp:1320
msgid "click top left of image"
msgstr ""
"кликните мышью там, где будет расположен левый верхний угол изображения"
-#: graphicswin.cpp:1345
+#: graphicswin.cpp:1346
msgid ""
"No entities are selected. Select entities before trying to toggle their "
"construction state."
@@ -1307,9 +1311,8 @@ msgid ""
" * a point and a normal (through the point, orthogonal to the normal)\n"
" * a workplane (copy of the workplane)\n"
msgstr ""
-"Неправильное выделение для создания эскиза в рабочей плоскости. Группа может"
-" быть создана, используя в качестве выделения следующие "
-"примитивы:\n"
+"Неправильное выделение для создания эскиза в рабочей плоскости. Группа может "
+"быть создана, используя в качестве выделения следующие примитивы:\n"
"\n"
" * точку (через точку, ортогонально осям координат)\n"
" * точку и два отрезка (через точку, параллельно отрезкам)\n"
@@ -1462,6 +1465,10 @@ msgstr "контур имеет самопересечения!"
msgid "zero-length edge!"
msgstr "вырожденный отрезок!"
+#: importmesh.cpp:136
+msgid "Text-formated STL files are not currently supported"
+msgstr ""
+
#: modify.cpp:252
msgid "Must be sketching in workplane to create tangent arc."
msgstr ""
@@ -1659,7 +1666,7 @@ msgid ""
"Workplane."
msgstr "Невозможно создать изображение. Активируйте рабочую плоскость."
-#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552
+#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553
msgctxt "file-type"
msgid "SolveSpace models"
msgstr "проекты SolveSpace"
@@ -1754,104 +1761,104 @@ msgctxt "file-type"
msgid "Comma-separated values"
msgstr "CSV файлы (значения, разделенные запятой)"
-#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641
+#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641
msgid "untitled"
msgstr "без имени"
-#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445
+#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467
#: platform/guiwin.cpp:1639
msgctxt "title"
msgid "Save File"
msgstr "Сохранить Файл"
-#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428
+#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450
#: platform/guiwin.cpp:1645
msgctxt "title"
msgid "Open File"
msgstr "Открыть Файл"
-#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418
+#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433
msgctxt "button"
msgid "_Cancel"
msgstr "Отменить"
-#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416
+#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431
msgctxt "button"
msgid "_Save"
msgstr "Сохранить"
-#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417
+#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432
msgctxt "button"
msgid "_Open"
msgstr "_Открыть"
-#: solvespace.cpp:170
+#: solvespace.cpp:171
msgctxt "title"
msgid "Autosave Available"
msgstr "Автосохранение Доступно"
-#: solvespace.cpp:171
+#: solvespace.cpp:172
msgctxt "dialog"
msgid "An autosave file is available for this sketch."
msgstr "Автоматически сохраненный файл доступен для данного проекта."
-#: solvespace.cpp:172
+#: solvespace.cpp:173
msgctxt "dialog"
msgid "Do you want to load the autosave file instead?"
msgstr "Хотите загрузить автосохраненный файл вместо исходного?"
-#: solvespace.cpp:173
+#: solvespace.cpp:174
msgctxt "button"
msgid "&Load autosave"
msgstr "&Загрузить Автосохранение"
-#: solvespace.cpp:175
+#: solvespace.cpp:176
msgctxt "button"
msgid "Do&n't Load"
msgstr "&Не Загружать"
-#: solvespace.cpp:598
+#: solvespace.cpp:599
msgctxt "title"
msgid "Modified File"
msgstr "Измененный Файл"
-#: solvespace.cpp:600
+#: solvespace.cpp:601
#, c-format
msgctxt "dialog"
msgid "Do you want to save the changes you made to the sketch “%s”?"
msgstr "Сохранить изменения, сделанные в файле “%s”?"
-#: solvespace.cpp:603
+#: solvespace.cpp:604
msgctxt "dialog"
msgid "Do you want to save the changes you made to the new sketch?"
msgstr "Сохранить изменения, сделанные в новом проекте?"
-#: solvespace.cpp:606
+#: solvespace.cpp:607
msgctxt "dialog"
msgid "Your changes will be lost if you don't save them."
msgstr "Изменения будут утеряны, если их не сохранить."
-#: solvespace.cpp:607
+#: solvespace.cpp:608
msgctxt "button"
msgid "&Save"
msgstr "&Сохранить"
-#: solvespace.cpp:609
+#: solvespace.cpp:610
msgctxt "button"
msgid "Do&n't Save"
msgstr "&Не Сохранять"
-#: solvespace.cpp:630
+#: solvespace.cpp:631
msgctxt "title"
msgid "(new sketch)"
msgstr "(новый проект)"
-#: solvespace.cpp:637
+#: solvespace.cpp:638
msgctxt "title"
msgid "Property Browser"
msgstr "Браузер"
-#: solvespace.cpp:699
+#: solvespace.cpp:700
msgid ""
"Constraints are currently shown, and will be exported in the toolpath. This "
"is probably not what you want; hide them by clicking the link at the top of "
@@ -1861,7 +1868,7 @@ msgstr ""
"это не то, что требуется, если так, необходимо спрятать их, нажав ссылку "
"вверху окна Браузера."
-#: solvespace.cpp:771
+#: solvespace.cpp:772
#, c-format
msgid ""
"Can't identify file type from file extension of filename '%s'; try .dxf or ."
@@ -1870,21 +1877,21 @@ msgstr ""
"Неподдерживаемый тип файла '%s'. Поддерживаются файлы с расширением .dxf и ."
"dwg."
-#: solvespace.cpp:823
+#: solvespace.cpp:824
msgid "Constraint must have a label, and must not be a reference dimension."
msgstr "У ограничения должно быть значение и оно не должно быть справочным."
-#: solvespace.cpp:827
+#: solvespace.cpp:828
msgid "Bad selection for step dimension; select a constraint."
msgstr ""
"Неправильное выделение для операции изменения значения с заданным шагом; "
"необходимо выбрать ограничение со значением."
-#: solvespace.cpp:851
+#: solvespace.cpp:852
msgid "The assembly does not interfere, good."
msgstr "Сборка не содержит пересечения деталей - это хорошо."
-#: solvespace.cpp:867
+#: solvespace.cpp:868
#, c-format
msgid ""
"The volume of the solid model is:\n"
@@ -1895,7 +1902,7 @@ msgstr ""
"\n"
" %s"
-#: solvespace.cpp:876
+#: solvespace.cpp:877
#, c-format
msgid ""
"\n"
@@ -1908,7 +1915,7 @@ msgstr ""
"\n"
" %s"
-#: solvespace.cpp:881
+#: solvespace.cpp:882
msgid ""
"\n"
"\n"
@@ -1920,7 +1927,7 @@ msgstr ""
"Кривые аппроксимированы кусочно-линейными функциями.\n"
"Это приводит к ошибке в расчетах, обычно в пределах 1%."
-#: solvespace.cpp:896
+#: solvespace.cpp:897
#, c-format
msgid ""
"The surface area of the selected faces is:\n"
@@ -1937,7 +1944,7 @@ msgstr ""
"Кривые аппроксимированы кусочно-линейными функциями.\n"
"Это приводит к ошибке в расчетах, обычно в пределах 1%%."
-#: solvespace.cpp:905
+#: solvespace.cpp:906
msgid ""
"This group does not contain a correctly-formed 2d closed area. It is open, "
"not coplanar, or self-intersecting."
@@ -1945,7 +1952,7 @@ msgstr ""
"Эта группа не содержит замкнутых областей. В ней нет замкнутых контуров, "
"примитивы не лежат в одной плоскости или самопересекаются."
-#: solvespace.cpp:917
+#: solvespace.cpp:918
#, c-format
msgid ""
"The area of the region sketched in this group is:\n"
@@ -1962,7 +1969,7 @@ msgstr ""
"Кривые аппроксимированы кусочно-линейными функциями.\n"
"Это приводит к ошибке в расчетах, обычно в пределах 1%%."
-#: solvespace.cpp:937
+#: solvespace.cpp:938
#, c-format
msgid ""
"The total length of the selected entities is:\n"
@@ -1979,38 +1986,38 @@ msgstr ""
"Кривые аппроксимированы кусочно-линейными функциями.\n"
"Это приводит к ошибке в расчетах, обычно в пределах 1%%."
-#: solvespace.cpp:943
+#: solvespace.cpp:944
msgid "Bad selection for perimeter; select line segments, arcs, and curves."
msgstr ""
"Неправильное выделение для расчета периметра; необходимо выбирать только "
"отрезки, дуги и кривые в качестве исходных данных"
-#: solvespace.cpp:959
+#: solvespace.cpp:960
msgid "Bad selection for trace; select a single point."
msgstr "Неправильное выделение для трассировки; необходимо выбрать одну точку."
-#: solvespace.cpp:986
+#: solvespace.cpp:987
#, c-format
msgid "Couldn't write to '%s'"
msgstr "Невозможно записать в '%s'"
-#: solvespace.cpp:1016
+#: solvespace.cpp:1017
msgid "The mesh is self-intersecting (NOT okay, invalid)."
msgstr "Полигональная сетка содержит самопересечения (это плохо)"
-#: solvespace.cpp:1017
+#: solvespace.cpp:1018
msgid "The mesh is not self-intersecting (okay, valid)."
msgstr "Полигональная сетка не содержит самопересечений (это хорошо)"
-#: solvespace.cpp:1019
+#: solvespace.cpp:1020
msgid "The mesh has naked edges (NOT okay, invalid)."
msgstr "Полигональная сетка содержит \"оголенные\" ребра (это плохо)"
-#: solvespace.cpp:1020
+#: solvespace.cpp:1021
msgid "The mesh is watertight (okay, valid)."
msgstr "Полигональная сетка герметична (это хорошо)"
-#: solvespace.cpp:1023
+#: solvespace.cpp:1024
#, c-format
msgid ""
"\n"
@@ -2021,7 +2028,7 @@ msgstr ""
"\n"
"Модель содержит %d треугольников, содержащихся в %d поверхностях."
-#: solvespace.cpp:1027
+#: solvespace.cpp:1028
#, c-format
msgid ""
"%s\n"
@@ -2036,7 +2043,7 @@ msgstr ""
"\n"
"Нет проблемных ребер - это хорошо.%s"
-#: solvespace.cpp:1030
+#: solvespace.cpp:1031
#, c-format
msgid ""
"%s\n"
@@ -2051,7 +2058,7 @@ msgstr ""
"\n"
"%d найдены проблемные ребра - это плохо.%s"
-#: solvespace.cpp:1043
+#: solvespace.cpp:1044
#, c-format
msgid ""
"This is SolveSpace version %s.\n"
@@ -2094,23 +2101,23 @@ msgstr ""
msgid "Style name cannot be empty"
msgstr "Имя стиля не может быть пустым."
-#: textscreens.cpp:785
+#: textscreens.cpp:791
msgid "Can't repeat fewer than 1 time."
msgstr "Невозможно сделать повторение меньше, чем 1 раз."
-#: textscreens.cpp:789
+#: textscreens.cpp:795
msgid "Can't repeat more than 999 times."
msgstr "Невозможно сделать повтор больше, чем 999 раз."
-#: textscreens.cpp:814
+#: textscreens.cpp:820
msgid "Group name cannot be empty"
msgstr "Имя группы не может быть пустым."
-#: textscreens.cpp:866
+#: textscreens.cpp:872
msgid "Opacity must be between zero and one."
msgstr "Прозрачность должна быть числом от нуля до единицы."
-#: textscreens.cpp:901
+#: textscreens.cpp:907
msgid "Radius cannot be zero or negative."
msgstr "Радиус не может быть нулевым или отрицательным."
diff --git a/res/locales/tr_TR.po b/res/locales/tr_TR.po
index de82270f..71558fce 100644
--- a/res/locales/tr_TR.po
+++ b/res/locales/tr_TR.po
@@ -2,13 +2,13 @@
# Copyright (C) 2017 the SolveSpace authors
# This file is distributed under the same license as the SolveSpace package.
# Automatically generated, 2017.
-#
+#
msgid ""
msgstr ""
"Project-Id-Version: SolveSpace 3.0\n"
"Report-Msgid-Bugs-To: whitequark@whitequark.org\n"
-"POT-Creation-Date: 2021-09-26 16:25-0400\n"
-"PO-Revision-Date: 2021-03-09 22:58+0300\n"
+"POT-Creation-Date: 2022-02-01 16:24+0200\n"
+"PO-Revision-Date: 2022-02-01 23:02+0300\n"
"Last-Translator: Mustafa Halil GÖRENTAŞ \n"
"Language-Team: app4soft\n"
"Language: tr\n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 2.4.2\n"
+"X-Generator: Poedit 3.0\n"
"X-Poedit-SourceCharset: UTF-8\n"
#: clipboard.cpp:309
@@ -25,7 +25,7 @@ msgid ""
"\n"
"Activate one with Sketch -> In Workplane."
msgstr ""
-"İşi yalnızca bir çalışma düzleminde kesin, yapıştır ve kopyalayın.\n"
+"Çalışmayı yalnızca bir çalışma düzleminde kesin, yapıştırın ve kopyalayın.\n"
"\n"
"Çizim -> Çalışma Düzleminde menüsü ile bir düzlemi etkinleştirin."
@@ -37,17 +37,17 @@ msgstr "Pano boş; yapıştırılacak bir şey yok."
msgid "Number of copies to paste must be at least one."
msgstr "Yapıştırılacak kopya sayısı en az bir olmalıdır."
-#: clipboard.cpp:389 textscreens.cpp:827
+#: clipboard.cpp:389 textscreens.cpp:833
msgid "Scale cannot be zero."
msgstr "Ölçek sıfır olamaz."
#: clipboard.cpp:431
msgid "Select one point to define origin of rotation."
-msgstr "Dönüşün başlangıç noktasını tanımlamak için bir nokta seçin."
+msgstr "Çevirme merkezini tanımlamak için bir nokta seçin."
#: clipboard.cpp:443
msgid "Select two points to define translation vector."
-msgstr "Öteleme vektörünü tanımlamak için iki nokta seçin."
+msgstr "Doğrusal kopyalama vektörünü tanımlamak için iki nokta seçin."
#: clipboard.cpp:453
msgid ""
@@ -57,53 +57,54 @@ msgstr "Dönüşüm özdeştir. Yani tüm kopyalar tam olarak üst üste gelecek
#: clipboard.cpp:457
msgid "Too many items to paste; split this into smaller pastes."
-msgstr "Yapıştırılamayacak kadar çok öğe; bunu daha küçük yapıştımalara bölün."
+msgstr ""
+"Yapıştırılamayacak kadar çok öğe; bunu daha küçük yapıştıma şeklinde bölün."
#: clipboard.cpp:462
msgid "No workplane active."
-msgstr "Etkin Çalışma Düzlemi yok."
+msgstr "Etkin çalışma düzlemi yok."
-#: confscreen.cpp:376
+#: confscreen.cpp:381
msgid "Bad format: specify coordinates as x, y, z"
msgstr "Hatalı biçim: koordinatları x, y, z olarak belirtin"
-#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858
+#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864
msgid "Bad format: specify color as r, g, b"
msgstr "Hatalı biçim: rengi r, g, b olarak belirtin"
-#: confscreen.cpp:412
+#: confscreen.cpp:417
msgid ""
"The perspective factor will have no effect until you enable View -> Use "
"Perspective Projection."
msgstr ""
"Görünüm -> Perspektif Projeksiyonu Kullan'ı etkinleştirene kadar perspektif "
-"çarpanının hiçbir etkisi olmayacaktır."
+"katsayısının hiçbir etkisi olmayacaktır."
-#: confscreen.cpp:430 confscreen.cpp:440
+#: confscreen.cpp:435 confscreen.cpp:445
#, c-format
msgid "Specify between 0 and %d digits after the decimal."
-msgstr "Ondalık basamak sonra 0 ile %d arasında basamak belirtin."
+msgstr "Ondalık basamak sonrası 0 ile %d arasında rakam belirtin."
-#: confscreen.cpp:452
+#: confscreen.cpp:457
msgid "Export scale must not be zero!"
msgstr "Dışa aktarma ölçeği sıfır olmamalıdır!"
-#: confscreen.cpp:464
+#: confscreen.cpp:469
msgid "Cutter radius offset must not be negative!"
msgstr "Kesici yarıçap ofseti negatif olmamalıdır!"
-#: confscreen.cpp:518
+#: confscreen.cpp:528
msgid "Bad value: autosave interval should be positive"
msgstr "Hatalı değer: otomatik kaydetme süresi pozitif olmalıdır"
-#: confscreen.cpp:521
+#: confscreen.cpp:531
msgid "Bad format: specify interval in integral minutes"
msgstr "Hatalı biçim: süre aralığını dakika cinsinden belirtin"
#: constraint.cpp:12
msgctxt "constr-name"
msgid "pts-coincident"
-msgstr "nktlar-kesişen"
+msgstr "çakışık-nktlar"
#: constraint.cpp:13
msgctxt "constr-name"
@@ -138,7 +139,7 @@ msgstr "düzlemde-nkt"
#: constraint.cpp:19
msgctxt "constr-name"
msgid "pt-on-line"
-msgstr "nkt-çizgide"
+msgstr "çizgide-nkt"
#: constraint.cpp:20
msgctxt "constr-name"
@@ -148,17 +149,17 @@ msgstr "yüzeyde-nkt"
#: constraint.cpp:21
msgctxt "constr-name"
msgid "eq-length"
-msgstr "eş-uzunluk"
+msgstr "eşit-uzunluk"
#: constraint.cpp:22
msgctxt "constr-name"
msgid "eq-length-and-pt-ln-dist"
-msgstr "eş-uzunluk-ve-çzg-nkt-mesafesi"
+msgstr "eşit-uzunluk-ve-çzg-nkt-mesafesi"
#: constraint.cpp:23
msgctxt "constr-name"
msgid "eq-pt-line-distances"
-msgstr "eş-nkt-çizgi-mesafesi"
+msgstr "eşit-nkt-çizgi-mesafesi"
#: constraint.cpp:24
msgctxt "constr-name"
@@ -168,12 +169,12 @@ msgstr "uzunluk-oranı"
#: constraint.cpp:25
msgctxt "constr-name"
msgid "arc-arc-length-ratio"
-msgstr ""
+msgstr "yay-yay-uzunluk-oranı"
#: constraint.cpp:26
msgctxt "constr-name"
msgid "arc-line-length-ratio"
-msgstr ""
+msgstr "yay-çizgi-uzunluk-oranı"
#: constraint.cpp:27
msgctxt "constr-name"
@@ -183,12 +184,12 @@ msgstr "uzunluk-farkı"
#: constraint.cpp:28
msgctxt "constr-name"
msgid "arc-arc-len-difference"
-msgstr ""
+msgstr "yay-yay-uzunluk-farkı"
#: constraint.cpp:29
msgctxt "constr-name"
msgid "arc-line-len-difference"
-msgstr ""
+msgstr "yay-çizgi-uzunluk-farkı"
#: constraint.cpp:30
msgctxt "constr-name"
@@ -233,7 +234,7 @@ msgstr "çap"
#: constraint.cpp:38
msgctxt "constr-name"
msgid "pt-on-circle"
-msgstr "nkt-çemberde"
+msgstr "çemberde-nkt"
#: constraint.cpp:39
msgctxt "constr-name"
@@ -258,7 +259,7 @@ msgstr "yay-çizgi-teğet"
#: constraint.cpp:43
msgctxt "constr-name"
msgid "cubic-line-tangent"
-msgstr "kubik-çizgi-teğet"
+msgstr "k.eğri-çizgi-teğet"
#: constraint.cpp:44
msgctxt "constr-name"
@@ -273,17 +274,17 @@ msgstr "dik"
#: constraint.cpp:46
msgctxt "constr-name"
msgid "eq-radius"
-msgstr "eş-yarıçap"
+msgstr "eşit-yarıçap"
#: constraint.cpp:47
msgctxt "constr-name"
msgid "eq-angle"
-msgstr "eş-açı"
+msgstr "eşit-açı"
#: constraint.cpp:48
msgctxt "constr-name"
msgid "eq-line-len-arc-len"
-msgstr "eş-çizgi-uzn-yay-uzn"
+msgstr "eşit-çizgi-uzn-yay-uzn"
#: constraint.cpp:49
msgctxt "constr-name"
@@ -300,24 +301,24 @@ msgid ""
"The tangent arc and line segment must share an endpoint. Constrain them with "
"Constrain -> On Point before constraining tangent."
msgstr ""
-"Teğet, yay ve çizgi parçası bir uç noktayı paylaşmalıdır. Teğeti "
-"sınırlandırmadan önce bunları Sınırlandır -> Noktada ile sınırlandırın."
+"Teğet için yay ve çizgi parçası bir uç noktayı paylaşmalıdır. Teğet "
+"kısıtlamasından önce bunları Kısıtla -> Noktada ile kısıtlayın."
#: constraint.cpp:163
msgid ""
"The tangent cubic and line segment must share an endpoint. Constrain them "
"with Constrain -> On Point before constraining tangent."
msgstr ""
-"Teğet kübik ve çizgi parçası bir uç noktayı paylaşmalıdır. Teğeti "
-"sınırlandırmadan önce onları Sınırlandır -> Noktada ile sınırlandırın."
+"Teğet için eğri ve çizgi parçası bir uç noktayı paylaşmalıdır. Teğet "
+"kısıtlamasından önce onları Kısıtla -> Noktada ile kısıtlayın."
#: constraint.cpp:189
msgid ""
"The curves must share an endpoint. Constrain them with Constrain -> On Point "
"before constraining tangent."
msgstr ""
-"Eğriler bir uç noktayı paylaşmalıdır. Teğeti sınırlandırmadan önce onları "
-"Sınırlandır -> Noktada ile sınırlandırın."
+"Eğriler bir uç noktayı paylaşmalıdır. Teğet kısıtlamasından önce onları "
+"Kısıtla -> Noktada ile kısıtlayın."
#: constraint.cpp:238
msgid ""
@@ -332,16 +333,16 @@ msgid ""
" * a plane face and a point (minimum distance)\n"
" * a circle or an arc (diameter)\n"
msgstr ""
-"Mesafe / çap sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara "
+"Mesafe / çap kısıtlaması oluşturmak için hatalı seçim. Bu kısıtlama şunlara "
"uygulanabilir:\n"
"\n"
-" * iki nokta (noktalar arasındaki mesafe)\n"
-" * bir çizgi parçası (uzunluk)\n"
-" * iki nokta ve bir çizgi parçası veya normal (öngörülen mesafe)\n"
-" * bir çalışma düzlemi ve bir nokta (minimum mesafe)\n"
-" * bir çizgi parçası ve bir nokta (minimum mesafe)\n"
-" * bir düzlem yüzeyi ve bir nokta (minimum mesafe)\n"
-" * bir daire veya yay (çap)\n"
+" * iki nokta (noktalar arası mesafe)\n"
+" * bir çizgi parçası (uzunluk)\n"
+" * iki nokta ve bir çizgi parçası veya normal (izdüşüm mesafesi)\n"
+" * bir çalışma düzlemi ve bir nokta (minimum mesafe)\n"
+" * bir çizgi parçası ve bir nokta (minimum mesafe)\n"
+" * bir düzlem yüzeyi ve bir nokta (minimum mesafe)\n"
+" * bir daire veya yay (çap)\n"
#: constraint.cpp:291
msgid ""
@@ -354,14 +355,14 @@ msgid ""
" * a point and a circle or arc (point on curve)\n"
" * a point and a plane face (point on face)\n"
msgstr ""
-"Nokta / eğri / düzlem sınırlandırması için hatalı seçim. Bu sınırlandırma "
-"şunlara uygulanabilir:\n"
+"Noktada / Eğride / Düzlemde kısıtlaması oluşturmak için hatalı seçim. Bu "
+"kısıtlama şunlara uygulanabilir:\n"
"\n"
-" * iki nokta (çakışan noktalar)\n"
-" * bir nokta ve bir çalışma düzlemi (düzlemdeki nokta)\n"
-" * bir nokta ve bir çizgi parçası (çizgi üzerinde nokta)\n"
-" * bir nokta ve bir daire veya yay (eğri üzerinde nokta)\n"
-" * bir nokta ve bir düzlem yüzeyi (yüzeyin üzerine gelin)\n"
+" * iki nokta (çakışan noktalar)\n"
+" * bir nokta ve bir çalışma düzlemi (nokta ile düzlem çakışır)\n"
+" * bir nokta ve bir çizgi parçası (nokta ile çizgi çakışır)\n"
+" * bir nokta ve bir daire veya yay (nokta ile eğri çakışır)\n"
+" * bir nokta ve bir düzlem yüzeyi (nokta ile yüzey çakışır)\n"
#: constraint.cpp:353
msgid ""
@@ -378,19 +379,19 @@ msgid ""
" * two circles or arcs (equal radius)\n"
" * a line segment and an arc (line segment length equals arc length)\n"
msgstr ""
-"Eşit uzunluk / yarıçap sınırlandırması için hatalı seçim. Bu sınırlandırma "
-"şunlara uygulanabilir:\n"
+"Eşit uzunluk / yarıçap kısıtlaması oluşturmak için hatalı seçim. Bu "
+"kısıtlama şunlara uygulanabilir:\n"
"\n"
-" * iki çizgi parçası (eşit uzunluk)\n"
-" * iki çizgi parçası ve iki nokta (eşit nokta-çizgi mesafeleri)\n"
-" * bir çizgi parçası ve iki nokta (eşit nokta-çizgi mesafeleri)\n"
-" * bir çizgi parçası ve bir nokta ve çizgi parçası (nokta-çizgi mesafesi "
-"uzunluğa eşittir)\n"
-" * dört çizgi parçası veya normal (A, B ve C, D arasında eşit açı)\n"
-" * üç çizgi parçası veya normal (A, B ve B, C arasında eşit açı)\n"
-" * iki daire veya yay (eşit yarıçap)\n"
-" * bir çizgi parçası ve bir yay (çizgi parçası uzunluğu yay uzunluğuna "
-"eşittir)\n"
+" * iki çizgi parçası (eşit uzunluk)\n"
+" * iki çizgi parçası ve iki nokta (eşit nokta-çizgi arası mesafeler)\n"
+" * bir çizgi parçası ve iki nokta (eşit nokta-çizgi arası mesafeler)\n"
+" * bir çizgi parçası ve bir nokta ve çizgi parçası (nokta-çizgi arası "
+"mesafe, çizgi uzunluğa eşittir)\n"
+" * dört çizgi parçası veya normal (A, B ve C, D arasında eşit açı)\n"
+" * üç çizgi parçası veya normal (A, B ve B, C arasında eşit açı)\n"
+" * iki daire veya yay (eşit yarıçap)\n"
+" * bir çizgi parçası ve bir yay (çizgi parçasının uzunluğu, yayın "
+"uzunluğuna eşittir)\n"
#: constraint.cpp:407
msgid ""
@@ -400,6 +401,12 @@ msgid ""
" * two arcs\n"
" * one arc and one line segment\n"
msgstr ""
+"Uzunluk oranı kısıtlaması oluşturmak için hatalı seçim. Bu kısıtlama "
+"aşağıdakiler için geçerli olabilir:\n"
+"\n"
+" * iki çizgi parçası\n"
+" * iki yay\n"
+" * bir yay ve bir çizgi parçası\n"
#: constraint.cpp:441
msgid ""
@@ -410,6 +417,12 @@ msgid ""
" * two arcs\n"
" * one arc and one line segment\n"
msgstr ""
+"Uzunluk farkı kısıtlaması oluşturmak için hatalı seçim. Bu kısıtlama "
+"aşağıdakiler için geçerli olabilir:\n"
+"\n"
+" * iki çizgi parçası\n"
+" * iki yay\n"
+" * bir yay ve bir çizgi parçası\n"
#: constraint.cpp:472
msgid ""
@@ -418,12 +431,12 @@ msgid ""
" * a line segment and a point (point at midpoint)\n"
" * a line segment and a workplane (line's midpoint on plane)\n"
msgstr ""
-"Orta nokta sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara "
+"Orta nokta kısıtlaması oluşturmak için hatalı seçim. Bu kısıtlama şunlara "
"uygulanabilir:\n"
"\n"
-" * bir çizgi parçası ve bir nokta (orta noktayı işaret edin)\n"
-" * bir çizgi parçası ve bir çalışma düzlemi (düzlemdeki çizginin orta "
-"noktası)\n"
+" * bir çizgi parçası ve bir nokta (nokta çizgi ortasında)\n"
+" * bir çizgi parçası ve bir çalışma düzlemi (çizgi düzlemin ortasına "
+"taşınır )\n"
#: constraint.cpp:530
msgid ""
@@ -436,22 +449,22 @@ msgid ""
" * workplane, and two points or a line segment (symmetric about "
"workplane)\n"
msgstr ""
-"Simetrik sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara "
+"Simetri kısıtlaması oluşturmak için hatalı seçim. Bu kısıtlama şunlara "
"uygulanabilir:\n"
"\n"
-" * iki nokta veya bir çizgi parçası (çalışma düzleminin koordinat ekseni "
-"etrafında simetrik)\n"
-" * çizgi parçası ve iki nokta veya bir çizgi parçası (çizgi parçası "
-"etrafında simetrik)\n"
-" * çalışma düzlemi ve iki nokta veya bir çizgi parçası (çalışma düzlemi "
+" * iki nokta veya bir çizgi parçası (çalışma düzleminin koordinat "
+"eksenine göre simetrik)\n"
+" * çizgi parçası ve iki nokta veya bir çizgi parçası (çizgi parçası "
"etrafında simetrik)\n"
+" * çalışma düzlemi ve iki nokta veya bir çizgi parçası (çalışma düzlemine "
+"göre simetrik)\n"
#: constraint.cpp:545
msgid ""
"A workplane must be active when constraining symmetric without an explicit "
"symmetry plane."
msgstr ""
-"Açık bir simetri düzlemi olmadan simetriyi sınırlandırırken bir çalışma "
+"Simetri kısıtlamasında simetri düzlemini olarak kullanılacak bir çalışma "
"düzlemi etkin olmalıdır."
#: constraint.cpp:579
@@ -459,8 +472,8 @@ msgid ""
"Activate a workplane (with Sketch -> In Workplane) before applying a "
"horizontal or vertical constraint."
msgstr ""
-"Yatay veya dikey bir sınırlandırma uygulamadan önce bir çalışma düzlemini "
-"(Çizim -> Çalışma Düzleminde menüsü) etkinleştirin."
+"Yatay veya dikey bir kısıtlama uygulamadan önce bir çalışma düzlemini (Çizim "
+"-> Çalışma Düzleminde menüsü ile) etkinleştirin."
#: constraint.cpp:592
msgid ""
@@ -470,11 +483,11 @@ msgid ""
" * two points\n"
" * a line segment\n"
msgstr ""
-"Yatay / dikey sınırlandırma için hatalı seçim. Bu sınırlandırma şunlara "
+"Yatay / Dikey kısıtlama oluşturmak için hatalı seçim. Bu kısıtlama şunlara "
"uygulanabilir:\n"
"\n"
-" * iki nokta\n"
-" * bir çizgi parçası\n"
+" * iki nokta\n"
+" * bir çizgi parçası\n"
#: constraint.cpp:613
msgid ""
@@ -483,18 +496,18 @@ msgid ""
"\n"
" * two normals\n"
msgstr ""
-"Aynı yön sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara "
+"Aynı yön kısıtlaması oluşturmak için hatalı seçim. Bu kısıtlama şunlara "
"uygulanabilir:\n"
"\n"
-" * iki normal\n"
+" * iki normal\n"
#: constraint.cpp:663
msgid "Must select an angle constraint."
-msgstr "Bir açı sınırlaması seçilmelidir."
+msgstr "Bir açı kısıtlaması seçilmelidir."
#: constraint.cpp:676
msgid "Must select a constraint with associated label."
-msgstr "İlişkili etikete sahip bir sınırlama seçilmelidir."
+msgstr "İlgili etikete sahip bir kısıtlama seçilmelidir."
#: constraint.cpp:687
msgid ""
@@ -504,11 +517,12 @@ msgid ""
" * a line segment and a normal\n"
" * two normals\n"
msgstr ""
-"Açı sınırlaması için hatalı seçim. Bu sınırlandırma şunlara uygulanabilir:\n"
+"Açı kısıtlaması oluşturmak için hatalı seçim. Bu kısıtlama şunlara "
+"uygulanabilir:\n"
"\n"
-" * iki çizgi parçası\n"
-" * bir çizgi parçası ve normal\n"
-" * iki normal\n"
+" * iki çizgi parçası\n"
+" * bir çizgi parçası ve normal\n"
+" * iki normal\n"
#: constraint.cpp:754
msgid "Curve-curve tangency must apply in workplane."
@@ -524,14 +538,13 @@ msgid ""
" * two normals (parallel)\n"
" * two line segments, arcs, or beziers, that share an endpoint (tangent)\n"
msgstr ""
-"Paralel / teğet sınırlaması için hatalı seçim. Bu sınırlandırma şunlara "
-"uygulanabilir:\n"
+"Paralel / Teğet kısıtlaması oluşturmak için hatalı seçim. Bu kısıtlama "
+"şunlara uygulanabilir:\n"
"\n"
-" * iki çizgi parçası (paralel)\n"
-" * bir çizgi parçası ve normal (paralel)\n"
-" * iki normal (paralel)\n"
-" * bir uç noktayı paylaşan(teğet) iki çizgi parçası, yay veya "
-"bezier'ler\n"
+" * iki çizgi parçası (paralel)\n"
+" * bir çizgi parçası ve normal (paralel)\n"
+" * iki normal (paralel)\n"
+" * bir uç noktayı paylaşan(teğet) iki çizgi parçası, yay veya bezier'ler\n"
#: constraint.cpp:784
msgid ""
@@ -541,7 +554,8 @@ msgid ""
" * a line segment and a normal\n"
" * two normals\n"
msgstr ""
-"Dikey sınırlama için hatalı seçim. Bu sınırlandırma şunlara uygulanabilir:\n"
+"Dikey kısıtlama oluşturmak için hatalı seçim. Bu kısıtlama şunlara "
+"uygulanabilir:\n"
"\n"
" * iki çizgi parçası\n"
" * bir çizgi parçası ve normal\n"
@@ -554,18 +568,18 @@ msgid ""
"\n"
" * a point\n"
msgstr ""
-"Sürüklendiği yerde noktayı sınırlandırmak için hatalı seçim. Bu "
-"sınırlandırma şunlara uygulanabilir:\n"
+"Sürüklendiği yerde noktayı kısıtlamak için hatalı seçim. Bu kısıtlama "
+"şunlara uygulanabilir:\n"
"\n"
"* bir nokta\n"
#: constraint.cpp:813 mouse.cpp:1158
msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT"
-msgstr "YENİ YORUM - DÜZENLEMEK İÇİN ÇİFT TIKLAYIN"
+msgstr "YENI YORUM -- DÜZENLEMEK ICIN CIFT-TIKLAYIN"
#: constraint.cpp:818
msgid "click center of comment text"
-msgstr "yorum metninin merkezine tıklayın"
+msgstr "yorum metninin ortasını tıklatın"
#: export.cpp:19
msgid ""
@@ -590,12 +604,12 @@ msgstr ""
" * aktif bir çalışma düzleminde iken hiçbir şey seçmeyin (çalışma "
"düzlemi, kesit düzlemidir)\n"
" * bir yüzey (yüzeyden kesit düzlemi)\n"
-" * bir nokta ve iki çizgi parçası (nokta boyunca düzlem ve çizgilere "
-"paralel)\n"
+" * bir nokta ve iki çizgi parçası (nokta ve paralel çizgiler boyunca "
+"düzlem)\n"
#: export.cpp:818
msgid "Active group mesh is empty; nothing to export."
-msgstr "Etkin Mesh grubu boş; dışa aktarılacak bir şey yok."
+msgstr "Etkin grup ağı boş; dışa aktarılacak bir şey yok."
#: exportvector.cpp:336
msgid "freehand lines were replaced with continuous lines"
@@ -642,7 +656,7 @@ msgstr ""
#: file.cpp:867
msgctxt "title"
msgid "Missing File"
-msgstr "Eksik Dosya"
+msgstr "Kayıp Dosya"
#: file.cpp:868
#, c-format
@@ -658,7 +672,7 @@ msgid ""
"If you decline, any geometry that depends on the missing file will be "
"permanently removed."
msgstr ""
-"Yerini manuel olarak mı bulmak istiyorsunuz?\n"
+"Konumu El ile bulmak istiyor musunuz?\n"
"\n"
"Reddederseniz, eksik dosyaya bağlı olan geometri kalıcı olarak "
"kaldırılacaktır."
@@ -673,7 +687,7 @@ msgctxt "button"
msgid "&No"
msgstr "&Hayır"
-#: file.cpp:877 solvespace.cpp:610
+#: file.cpp:877 solvespace.cpp:611
msgctxt "button"
msgid "&Cancel"
msgstr "&İptal"
@@ -720,7 +734,7 @@ msgstr "3d &TelKafes olarak dışa aktar..."
#: graphicswin.cpp:52
msgid "Export Triangle &Mesh..."
-msgstr "&Üçgensel Mesh olarak dışa aktar..."
+msgstr "&Üçgensel Ağ olarak dışa aktar..."
#: graphicswin.cpp:53
msgid "Export &Surfaces..."
@@ -780,7 +794,7 @@ msgstr "&Sil"
#: graphicswin.cpp:74
msgid "Select &Edge Chain"
-msgstr "Kenar &Zincirini Seçin"
+msgstr "Kenar &Zincirini Seç"
#: graphicswin.cpp:75
msgid "Select &All"
@@ -824,7 +838,7 @@ msgstr "Görünümü &Çalışma Düzlemine Hizala"
#: graphicswin.cpp:90
msgid "Nearest &Ortho View"
-msgstr "En Yakın &Orto Görünüm"
+msgstr "En Yakın &Dik Görünüm"
#: graphicswin.cpp:91
msgid "Nearest &Isometric View"
@@ -836,7 +850,7 @@ msgstr "&Noktayı Merkezde Görüntüle"
#: graphicswin.cpp:94
msgid "Show Snap &Grid"
-msgstr "&Izgarayı Göster"
+msgstr "Yakalama &Izgarasını Göster"
#: graphicswin.cpp:95
msgid "Darken Inactive Solids"
@@ -844,11 +858,11 @@ msgstr "Aktif Olmayan Katıları &Koyulaştır"
#: graphicswin.cpp:96
msgid "Use &Perspective Projection"
-msgstr "&Perspektif Projeksiyonu Kullanın"
+msgstr "&Perspektif Projeksiyonu Kullan"
#: graphicswin.cpp:97
msgid "Show E&xploded View"
-msgstr ""
+msgstr "Pat&latılmış Görünümü Göster"
#: graphicswin.cpp:98
msgid "Dimension &Units"
@@ -868,7 +882,7 @@ msgstr "&İnç cinsinden ölçü"
#: graphicswin.cpp:102
msgid "Dimensions in &Feet and Inches"
-msgstr ""
+msgstr "&Fit ve İnç cinsinden ölçü"
#: graphicswin.cpp:104
msgid "Show &Toolbar"
@@ -876,7 +890,7 @@ msgstr "&Araç Çubuğunu Göster"
#: graphicswin.cpp:105
msgid "Show Property Bro&wser"
-msgstr "&Özellik Tarayıcısını Göster"
+msgstr "&Özellik Penceresini Göster"
#: graphicswin.cpp:107
msgid "&Full Screen"
@@ -896,15 +910,15 @@ msgstr "&Yeni Çalışma Düzleminde Çizim Yap"
#: graphicswin.cpp:113
msgid "Step &Translating"
-msgstr "Adım &Ötele"
+msgstr "&Doğrusal Kopya"
#: graphicswin.cpp:114
msgid "Step &Rotating"
-msgstr "Adım &Döndür"
+msgstr "D&airesel Kopya"
#: graphicswin.cpp:116
msgid "E&xtrude"
-msgstr "&Katıla"
+msgstr "&Uzatarak Katıla"
#: graphicswin.cpp:117
msgid "&Helix"
@@ -912,11 +926,11 @@ msgstr "&Helis"
#: graphicswin.cpp:118
msgid "&Lathe"
-msgstr "&Çark"
+msgstr "&Tam döndürerek katıla"
#: graphicswin.cpp:119
msgid "Re&volve"
-msgstr "Dö&ndür"
+msgstr "&Kısmen döndürerek katıla"
#: graphicswin.cpp:121
msgid "Link / Assemble..."
@@ -948,11 +962,11 @@ msgstr "Ça&lışma Düzlemi"
#: graphicswin.cpp:131
msgid "Line &Segment"
-msgstr "Çizgi &Parçası"
+msgstr "Ç&izgi"
#: graphicswin.cpp:132
msgid "C&onstruction Line Segment"
-msgstr "&Yapı Çizgisi Parçası"
+msgstr "&Yardımcı Çizgi"
#: graphicswin.cpp:133
msgid "&Rectangle"
@@ -960,7 +974,7 @@ msgstr "&Dikdörtgen"
#: graphicswin.cpp:134
msgid "&Circle"
-msgstr "&Çember"
+msgstr "D&aire"
#: graphicswin.cpp:135
msgid "&Arc of a Circle"
@@ -976,7 +990,7 @@ msgstr "TrueType Yazı Tipinde &Metin"
#: graphicswin.cpp:139
msgid "&Image"
-msgstr "&Resim"
+msgstr "&Resim / Görüntü"
#: graphicswin.cpp:141
msgid "To&ggle Construction"
@@ -984,15 +998,15 @@ msgstr "Yap&ıyı Değiştir"
#: graphicswin.cpp:142
msgid "Tangent &Arc at Point"
-msgstr "Noktada &Teğet Yay"
+msgstr "&Yuvarlat (Radyus)"
#: graphicswin.cpp:143
msgid "Split Curves at &Intersection"
-msgstr "Kesişim yerinde Eğrileri &Böl"
+msgstr "Eğrileri Kesişim Yerinden &Böl"
#: graphicswin.cpp:145
msgid "&Constrain"
-msgstr "&Sınırlandır"
+msgstr "&Kısıtla"
#: graphicswin.cpp:146
msgid "&Distance / Diameter"
@@ -1036,11 +1050,11 @@ msgstr "&Eşit Uzunluk / Yarıçap / Açı"
#: graphicswin.cpp:158
msgid "Length / Arc Ra&tio"
-msgstr ""
+msgstr "&Uzunluk / Yay Oranı"
#: graphicswin.cpp:159
msgid "Length / Arc Diff&erence"
-msgstr ""
+msgstr "Uzunluk / Yay &Farkı"
#: graphicswin.cpp:160
msgid "At &Midpoint"
@@ -1072,23 +1086,23 @@ msgstr "Y&orum"
#: graphicswin.cpp:169
msgid "&Analyze"
-msgstr "&Analiz Et"
+msgstr "&Analiz"
#: graphicswin.cpp:170
msgid "Measure &Volume"
-msgstr "&Hacmi Ölçün"
+msgstr "&Hacmi Hesapla"
#: graphicswin.cpp:171
msgid "Measure A&rea"
-msgstr "&Alanı Ölçün"
+msgstr "&Alanı Hesapla"
#: graphicswin.cpp:172
msgid "Measure &Perimeter"
-msgstr "&Çevre Uzunluğunu Ölçün"
+msgstr "&Çevre Uzunluğunu Hesapla"
#: graphicswin.cpp:173
msgid "Show &Interfering Parts"
-msgstr "&Engelleyen Parçaları Göster"
+msgstr "&Engelleyici Parçaları Göster"
#: graphicswin.cpp:174
msgid "Show &Naked Edges"
@@ -1100,19 +1114,19 @@ msgstr "&Kütle Merkezini Göster"
#: graphicswin.cpp:177
msgid "Show &Underconstrained Points"
-msgstr "&Sınırlanmamış Noktaları Göster"
+msgstr "Kı&sıtlanmamış Noktaları Göster"
#: graphicswin.cpp:179
msgid "&Trace Point"
-msgstr "&Noktayı İzle"
+msgstr "&İzlenecek Nokta"
#: graphicswin.cpp:180
msgid "&Stop Tracing..."
-msgstr "&İzlemeyi &Durdur..."
+msgstr "&İzlemeyi Durdur..."
#: graphicswin.cpp:181
msgid "Step &Dimension..."
-msgstr "Adım &Ölçüsü..."
+msgstr "Adım &Ölçüsünü Ayarla..."
#: graphicswin.cpp:183
msgid "&Help"
@@ -1126,24 +1140,28 @@ msgstr "&Dil"
msgid "&Website / Manual"
msgstr "&Web sitesi / Kılavuz"
-#: graphicswin.cpp:187
+#: graphicswin.cpp:186
+msgid "&Go to GitHub commit"
+msgstr "GitHub Commitlere git"
+
+#: graphicswin.cpp:188
msgid "&About"
msgstr "&Hakkında"
-#: graphicswin.cpp:361
+#: graphicswin.cpp:362
msgid "(no recent files)"
-msgstr "(yeni dosyalar yok)"
+msgstr "(son dosyalar yok)"
-#: graphicswin.cpp:369
+#: graphicswin.cpp:370
#, c-format
msgid "File '%s' does not exist."
msgstr "'%s' dosyası mevcut değil."
-#: graphicswin.cpp:736
+#: graphicswin.cpp:737
msgid "No workplane is active, so the grid will not appear."
msgstr "Etkin çalışma düzlemi yok, bu nedenle ızgara görünmeyecektir."
-#: graphicswin.cpp:751
+#: graphicswin.cpp:752
msgid ""
"The perspective factor is set to zero, so the view will always be a parallel "
"projection.\n"
@@ -1151,23 +1169,22 @@ msgid ""
"For a perspective projection, modify the perspective factor in the "
"configuration screen. A value around 0.3 is typical."
msgstr ""
-"Perspektif çarpanı sıfıra ayarlanmıştır, bu nedenle görünüm her zaman "
+"Perspektif katsayısı sıfıra ayarlanmıştır, bu nedenle görünüm her zaman "
"paralel bir projeksiyon olacaktır.\n"
"\n"
-"Perspektif bir projeksiyon için, konfigürasyon ekranındaki perspektif "
-"çarpanını değiştirin. 0,3 civarında bir değer tipiktir."
+"Perspektif bir projeksiyon için, yapılandırma ekranındaki perspektif "
+"katsayısını değiştirin. 0.3 civarında bir değer normaldir."
-#: graphicswin.cpp:836
+#: graphicswin.cpp:837
msgid ""
"Select a point; this point will become the center of the view on screen."
-msgstr ""
-"Bir nokta seçin; bu nokta ekrandaki görüntünün merkezi haline gelecektir."
+msgstr "Bir nokta seçin; bu nokta ekrandaki görüntünün merkezi olacaktır."
-#: graphicswin.cpp:1136
+#: graphicswin.cpp:1137
msgid "No additional entities share endpoints with the selected entities."
-msgstr "Hiçbir ek öğe, seçili öğeler ile uç noktaları paylaşmaz."
+msgstr "Hiçbir ek öğe, seçili öğeler ile uç noktaları paylaşmıyor."
-#: graphicswin.cpp:1154
+#: graphicswin.cpp:1155
msgid ""
"To use this command, select a point or other entity from an linked part, or "
"make a link group the active group."
@@ -1175,99 +1192,99 @@ msgstr ""
"Bu komutu kullanmak için, bağlantılı bir parçadan bir nokta veya başka bir "
"öğe seçin veya bir bağlantı grubunu etkin grup haline getirin."
-#: graphicswin.cpp:1177
+#: graphicswin.cpp:1178
msgid ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) "
"to define the plane for the snap grid."
msgstr ""
-"Etkin çalışma düzlemi yok. Tutturma ızgarasının düzlemini tanımlamak için "
-"bir çalışma düzlemini (Çizim -> Çalışma Düzleminde menüsü ile) etkinleştirin."
+"Hiçbir çalışma düzlemi etkin değil. Izgaranın yakalanacağı düzlemini "
+"tanımlamak için bir çalışma düzlemini (Çizim -> Çalışma Düzleminde ile) "
+"etkinleştirin."
-#: graphicswin.cpp:1184
+#: graphicswin.cpp:1185
msgid ""
"Can't snap these items to grid; select points, text comments, or constraints "
"with a label. To snap a line, select its endpoints."
msgstr ""
-"Bu öğeleri ızgaraya tutturamazsınız; noktaları, metin yorumlarını veya "
-"sınırlamaları bir etiketle seçin. Bir çizgiyi tutturmak için uç noktalarını "
-"seçin."
+"Bu öğeler ızgaraya tutturulamıyor; etiketli noktaları, metin yorumlarını "
+"veya kısıtlamaları seçin. Bir çizgiyi tutturmak için uç noktalarını seçin."
-#: graphicswin.cpp:1269
+#: graphicswin.cpp:1270
msgid "No workplane selected. Activating default workplane for this group."
msgstr ""
"Çalışma düzlemi seçilmedi. Bu grup için varsayılan çalışma düzlemi "
"etkinleştiriliyor."
-#: graphicswin.cpp:1272
+#: graphicswin.cpp:1273
msgid ""
"No workplane is selected, and the active group does not have a default "
"workplane. Try selecting a workplane, or activating a sketch-in-new-"
"workplane group."
msgstr ""
-"Hiçbir çalışma düzlemi seçilmemiştir ve aktif grubun varsayılan bir çalışma "
-"düzlemi yoktur. Bir çalışma düzlemi seçmeyi veya yeni çalışma düzleminde "
+"Hiçbir çalışma düzlemi seçilmedi ve aktif grubun varsayılan bir çalışma "
+"düzlemi yok. Bir çalışma düzlemi seçmeyi veya bir yeni çalışma düzleminde "
"çizim grubunu etkinleştirmeyi deneyin."
-#: graphicswin.cpp:1293
+#: graphicswin.cpp:1294
msgid ""
"Bad selection for tangent arc at point. Select a single point, or select "
"nothing to set up arc parameters."
msgstr ""
-"Noktada teğet yay oluşturmak için hatalı seçim. Tek bir nokta seçin veya yay "
-"parametrelerini ayarlamak için hiçbir şey seçmeyin."
+"Noktada teğet yay (radyus) oluşturmak için hatalı seçim. Tek bir nokta seçin "
+"veya yay parametrelerini ayarlamak için hiçbir şey seçmeyin."
-#: graphicswin.cpp:1304
+#: graphicswin.cpp:1305
msgid "click point on arc (draws anti-clockwise)"
msgstr "yayın ilk noktası için tıklayın (saat yönünün tersine çizilir)"
-#: graphicswin.cpp:1305
-msgid "click to place datum point"
-msgstr "referans noktasını yerleştirmek için tıklayın"
-
#: graphicswin.cpp:1306
+msgid "click to place datum point"
+msgstr "referans noktayı yerleştirmek için tıklayın"
+
+#: graphicswin.cpp:1307
msgid "click first point of line segment"
msgstr "çizgi parçasının ilk noktası için tıklayın"
-#: graphicswin.cpp:1308
-msgid "click first point of construction line segment"
-msgstr "yapı çizgisinin ilk noktası için tıklayın"
-
#: graphicswin.cpp:1309
-msgid "click first point of cubic segment"
-msgstr "kübik segmentin ilk noktası için tıklayın"
+msgid "click first point of construction line segment"
+msgstr "yardımcı çizginin ilk noktası için tıklayın"
#: graphicswin.cpp:1310
-msgid "click center of circle"
-msgstr "çemberin merkezi için tıklayın"
+msgid "click first point of cubic segment"
+msgstr "kübik eğri parçanın ilk noktası için tıklayın"
#: graphicswin.cpp:1311
-msgid "click origin of workplane"
-msgstr "çalışma düzleminin merkezi için tıklayın"
+msgid "click center of circle"
+msgstr "dairenin merkez konumu için tıklayın"
#: graphicswin.cpp:1312
-msgid "click one corner of rectangle"
-msgstr "dikdörtgenin bir köşesi için tıklayın"
+msgid "click origin of workplane"
+msgstr "çalışma düzleminin merkez konumu için tıklayın"
#: graphicswin.cpp:1313
+msgid "click one corner of rectangle"
+msgstr "dikdörtgenin bir köşe noktası için tıklayın"
+
+#: graphicswin.cpp:1314
msgid "click top left of text"
-msgstr "metnin sol üst köşesi için tıklayın"
+msgstr "metnin sol üst köşe konumu için tıklayın"
-#: graphicswin.cpp:1319
+#: graphicswin.cpp:1320
msgid "click top left of image"
-msgstr "resmin sol üst köşesi için tıklayın"
+msgstr "görüntünün sol üst köşe konumu için tıklayın"
-#: graphicswin.cpp:1345
+#: graphicswin.cpp:1346
msgid ""
"No entities are selected. Select entities before trying to toggle their "
"construction state."
msgstr ""
-"Hiçbir öğe seçilmedi. Yapı durumlarını geçiş yapmaya çalışmadan önce öğeleri "
+"Hiçbir öğe seçilmedi. Yapı durumlarını değiştirmeye çalışmadan önce öğeleri "
"seçin."
#: group.cpp:86
msgctxt "group-name"
msgid "sketch-in-3d"
-msgstr "3d-içinde-çizim"
+msgstr "3d-de-çizim"
#: group.cpp:150
msgid ""
@@ -1279,24 +1296,32 @@ msgid ""
" * a point and a normal (through the point, orthogonal to the normal)\n"
" * a workplane (copy of the workplane)\n"
msgstr ""
+"Çalışma düzleminde yeni çizim oluşturmak için hatalı seçim. Bu grup "
+"aşağıdakilerle oluşturulabilir:\n"
+"\n"
+" * bir nokta (noktadan geçen, koordinat eksenine dik)\n"
+" * bir nokta ve iki doğru parçası (noktadan geçen, doğrulara paralel)\n"
+" * bir nokta ve bir normal (noktadan normale dik)\n"
+" * bir çalışma düzlemi (çalışma düzleminin kopyası)\n"
#: group.cpp:166
msgid ""
"Activate a workplane (Sketch -> In Workplane) before extruding. The sketch "
"will be extruded normal to the workplane."
msgstr ""
-"Katılama işleminden önce bir çalışma düzlemini etkinleştirin (Çizim -> "
-"Çalışma Düzleminde menüsü). Çizim, çalışma düzlemine dik olarak "
-"katılanacaktır."
+"Katılama işleminden önce bir çalışma düzlemini etkinleştirin. Çizim, "
+"çalışma düzlemine dik olarak katılanacaktır."
#: group.cpp:175
msgctxt "group-name"
msgid "extrude"
-msgstr "katıla"
+msgstr "doğrusal katıla"
#: group.cpp:180
msgid "Lathe operation can only be applied to planar sketches."
-msgstr "Çark işlemi yalnızca düzlemsel çizimlere uygulanabilir."
+msgstr ""
+"Tam tur döndürerek katılama işlemi, yalnızca düzlemsel çizimlere "
+"uygulanabilir."
#: group.cpp:191
msgid ""
@@ -1306,20 +1331,23 @@ msgid ""
"to line / normal, through point)\n"
" * a line segment (revolved about line segment)\n"
msgstr ""
-"Yeni çark grubu için hatalı seçim. Bu grup şu şekilde oluşturulabilir:\n"
+"Tamamen döndürerek yeni katılama grubu oluşturmak için hatalı seçim. Bu grup "
+"şu şekilde oluşturulabilir:\n"
"\n"
-" * bir nokta ve bir çizgi parçası veya normal (çizgiye / normale paralel "
+" * bir nokta ve bir çizgi parçası veya normal (çizgiye / normale paralel "
"bir eksen etrafında, nokta boyunca döndürülür )\n"
-" * bir çizgi parçası (çizgi parçası etrafında döndürülür)\n"
+" * bir çizgi parçası (çizgi parçası etrafında döndürülür)\n"
#: group.cpp:201
msgctxt "group-name"
msgid "lathe"
-msgstr "çark"
+msgstr "tamamen döndürerek katıla"
#: group.cpp:206
msgid "Revolve operation can only be applied to planar sketches."
-msgstr "Döndürme işlemi yalnızca düzlemsel çizimlere uygulanabilir."
+msgstr ""
+"Kısmen döndürerek katılama işlemi, yalnızca düzlemsel çizimlere "
+"uygulanabilir."
#: group.cpp:217
msgid ""
@@ -1329,7 +1357,9 @@ msgid ""
"to line / normal, through point)\n"
" * a line segment (revolved about line segment)\n"
msgstr ""
-"Yeni döndürme grup için hatalı seçim. Bu grup şunlarla oluşturulabilir:\n"
+"Kısmen döndürerek yeni katılama grubu oluşturmak için hatalı seçim. Bu grup "
+"şu şekilde oluşturulabilir:\n"
+"\n"
"\n"
" * bir nokta ve bir çizgi parçası veya normal (çizgiye / normale paralel, "
"noktadan geçen bir eksen etrafında döndürülür)\n"
@@ -1338,7 +1368,7 @@ msgstr ""
#: group.cpp:229
msgctxt "group-name"
msgid "revolve"
-msgstr "döndür"
+msgstr "kısmen döndürerek katıla"
#: group.cpp:234
msgid "Helix operation can only be applied to planar sketches."
@@ -1352,7 +1382,8 @@ msgid ""
"to line / normal, through point)\n"
" * a line segment (revolved about line segment)\n"
msgstr ""
-"Yeni helis grubu için hatalı seçim. Bu grup şunlarla oluşturulabilir:\n"
+"Yeni helis grubu oluşturmak için hatalı seçim. Bu grup şunlarla "
+"oluşturulabilir:\n"
"\n"
" * bir nokta ve bir çizgi parçası veya normal (çizgiye / normale paralel, "
"noktadan geçen bir eksen etrafında döndürülür)\n"
@@ -1372,22 +1403,23 @@ msgid ""
" * a point and a line or a normal (rotate about an axis through the "
"point, and parallel to line / normal)\n"
msgstr ""
-"Yeni çevirme için hatalı seçim. Bu grup şunlarla oluşturulabilir:\n"
+"Yeni dairesel kopyalama/çoğaltma oluşturmak için hatalı seçim. Bu grup "
+"şunlarla oluşturulabilir:\n"
"\n"
-" * çalışma düzleminde bir nokta, kilitli olduğu sürece (düzlemde o nokta "
+" * bir nokta, çalışma düzleminde kilitli olduğu sürece (düzlemde o nokta "
"etrafında çevirin)\n"
-" * bir nokta ve bir çizgi veya bir normal (nokta boyunca bir eksen "
-"etrafında ve çizgiye / normale paralel çevirin)\n"
+" * bir nokta ve bir çizgi veya bir normal ( çizgiye / normale paralel ve "
+"noktadan geçen bir eksen etrafında çevirin)\n"
#: group.cpp:283
msgctxt "group-name"
msgid "rotate"
-msgstr "çevir"
+msgstr "dairesel kopya"
#: group.cpp:294
msgctxt "group-name"
msgid "translate"
-msgstr "ötele"
+msgstr "doğrusal kopya"
#: group.cpp:416
msgid "(unnamed)"
@@ -1395,7 +1427,7 @@ msgstr "(isimsiz)"
#: groupmesh.cpp:707
msgid "not closed contour, or not all same style!"
-msgstr "kapalı olmayan kontur veya tümü aynı biçimde değil!"
+msgstr "kapali olmayan kontur veya tümü ayni bicimde degil!"
#: groupmesh.cpp:720
msgid "points not all coplanar!"
@@ -1403,11 +1435,15 @@ msgstr "noktaların hepsi aynı düzlemde değil!"
#: groupmesh.cpp:722
msgid "contour is self-intersecting!"
-msgstr "kontur kendisiyle kesişiyor!"
+msgstr "kontur kendisiyle kesisiyor!"
#: groupmesh.cpp:724
msgid "zero-length edge!"
-msgstr "sıfır-uzunlukta kenar!"
+msgstr "sıfır-uzunluklu kenar!"
+
+#: importmesh.cpp:136
+msgid "Text-formated STL files are not currently supported"
+msgstr "Metin-biçimli STL dosyaları şu anda desteklenmiyor"
#: modify.cpp:252
msgid "Must be sketching in workplane to create tangent arc."
@@ -1418,8 +1454,8 @@ msgid ""
"To create a tangent arc, select a point where two non-construction lines or "
"circles in this group and workplane join."
msgstr ""
-"Bir teğet yay oluşturmak için, bu gruptaki iki yapı-dışı çizginin veya "
-"dairenin ve çalışma düzleminin birleştiği bir nokta seçin."
+"Bir teğet yay oluşturmak için, bu gruptaki iki (yardımcı) referans-olmayan "
+"çizginin veya dairenin ve çalışma düzleminin birleştiği bir nokta seçin."
#: modify.cpp:386
msgid ""
@@ -1427,23 +1463,25 @@ msgid ""
"desired geometry by hand with tangency constraints."
msgstr ""
"Bu köşe yuvarlatılamadı. Daha küçük bir yarıçap deneyin veya teğet "
-"sınırlamaları ile istenen geometriyi elle oluşturmayı deneyin."
+"kısıtlamaları ile istenen geometriyi elle oluşturmayı deneyin."
#: modify.cpp:595
msgid "Couldn't split this entity; lines, circles, or cubics only."
-msgstr "Bu öğeler bölünemedi; yalnızca çizgiler, çemberler veya küpler."
+msgstr ""
+"Bu öğe bölünemedi; yalnızca çizgiler, daireler veya kübik eğriler "
+"bölünebilir."
#: modify.cpp:622
msgid "Must be sketching in workplane to split."
-msgstr "Bölmek için çalışma düzleminde çizim olmalı."
+msgstr "Bölmek için çalışma düzleminde çizim yapılıyor olmalı."
#: modify.cpp:629
msgid ""
"Select two entities that intersect each other (e.g. two lines/circles/arcs "
"or a line/circle/arc and a point)."
msgstr ""
-"Birbiriyle kesişen iki öğe seçin (örneğin iki çizgi / çember / yay veya bir "
-"çizgi / çember / yay ve bir nokta)."
+"Birbiriyle kesişen iki öğe seçin (örneğin iki çizgi / daire / yay veya bir "
+"çizgi / daire / yay ve bir nokta)."
#: modify.cpp:734
msgid "Can't split; no intersection found."
@@ -1451,7 +1489,7 @@ msgstr "Bölünemez; kesişim bulunamadı."
#: mouse.cpp:557
msgid "Assign to Style"
-msgstr "Biçime Ata"
+msgstr "Biçim Ata"
#: mouse.cpp:573
msgid "No Style"
@@ -1471,11 +1509,11 @@ msgstr "Biçim Bİlgisi"
#: mouse.cpp:623
msgid "Select Edge Chain"
-msgstr "Kenar Zinciri Seçin"
+msgstr "Kenar Zinciri Seç"
#: mouse.cpp:629
msgid "Toggle Reference Dimension"
-msgstr "Ölçü Referansını Değiştir"
+msgstr "Referans Ölçüyü Değiştir"
#: mouse.cpp:635
msgid "Other Supplementary Angle"
@@ -1503,7 +1541,7 @@ msgstr "Yapıyı değiştir"
#: mouse.cpp:729
msgid "Delete Point-Coincident Constraint"
-msgstr "Çakışan-Nokta Sınırlamasını Sil"
+msgstr "Çakışık-Nokta Kısıtlamasını Sil"
#: mouse.cpp:747
msgid "Cut"
@@ -1535,7 +1573,7 @@ msgstr "Tüm Seçimi Kaldır"
#: mouse.cpp:775
msgid "Unselect Hovered"
-msgstr "Fareyle Üzerine Gelinen Seçimi Kaldır"
+msgstr "Üzerine Gelinen Seçimi Kaldır"
#: mouse.cpp:784
msgid "Zoom to Fit"
@@ -1555,7 +1593,7 @@ msgstr ""
#: mouse.cpp:1026
msgid "click to place other corner of rectangle"
-msgstr "dikdörtgenin diğer köşesini yerleştirmek için tıklayın"
+msgstr "dikdörtgenin diğer köşesini belirtmek için tıklayın"
#: mouse.cpp:1047
msgid "click to set radius"
@@ -1575,7 +1613,7 @@ msgstr "noktayı yerleştirmek için tıklayın"
#: mouse.cpp:1087
msgid "click next point of cubic, or press Esc"
-msgstr "sonraki kübik noktayı tıklayın veya Esc tuşuna basın"
+msgstr "sonraki kübik eğri noktasını tıklayın veya Esc tuşuna basın"
#: mouse.cpp:1092
msgid ""
@@ -1594,17 +1632,17 @@ msgstr ""
#: mouse.cpp:1125
msgid "click to place bottom right of text"
-msgstr "metnin sağ alt konumunu yerleştirmek için tıklayın"
+msgstr "metnin sağ alt konumunu belirtmek için tıklayın"
#: mouse.cpp:1131
msgid ""
"Can't draw image in 3d; first, activate a workplane with Sketch -> In "
"Workplane."
msgstr ""
-"3d'de resim eklenemez; önce Çizim -> Çalışma Düzleminde menüsü ile bir "
-"çalışma düzlemini etkinleştirin."
+"3d'de görüntü/resim eklenemez; önce Çizim -> Çalışma Düzleminde menüsü ile "
+"bir çalışma düzlemini etkinleştirin."
-#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552
+#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553
msgctxt "file-type"
msgid "SolveSpace models"
msgstr "SolveSpace Modelleri"
@@ -1612,7 +1650,7 @@ msgstr "SolveSpace Modelleri"
#: platform/gui.cpp:89
msgctxt "file-type"
msgid "ALL"
-msgstr ""
+msgstr "TÜMÜ"
#: platform/gui.cpp:91
msgctxt "file-type"
@@ -1622,32 +1660,32 @@ msgstr "IDF devre kartı"
#: platform/gui.cpp:92
msgctxt "file-type"
msgid "STL triangle mesh"
-msgstr ""
+msgstr "STL üçgensel mesh (ağ/kafes)"
#: platform/gui.cpp:96
msgctxt "file-type"
msgid "PNG image"
-msgstr "PNG Resmi"
+msgstr "PNG Görüntüsü"
#: platform/gui.cpp:100
msgctxt "file-type"
msgid "STL mesh"
-msgstr "STL mesh"
+msgstr "STL mesh (ağ/kafes)"
#: platform/gui.cpp:101
msgctxt "file-type"
msgid "Wavefront OBJ mesh"
-msgstr "Wavefront OBJ mesh"
+msgstr "Wavefront OBJ mesh (ağ/kafes)"
#: platform/gui.cpp:102
msgctxt "file-type"
msgid "Three.js-compatible mesh, with viewer"
-msgstr "Görüntüleyicili, Three.js-uyumlu mesh"
+msgstr "Görüntüleyicili, Three.js-uyumlu mesh (ağ/kafes)"
#: platform/gui.cpp:103
msgctxt "file-type"
msgid "Three.js-compatible mesh, mesh only"
-msgstr "Three.js-uyumlu mesh, yalnızca mesh"
+msgstr "Three.js-uyumlu mesh, sadece mesh (ağ/kafes)"
#: platform/gui.cpp:104
msgctxt "file-type"
@@ -1667,7 +1705,7 @@ msgstr "PDF dosyası"
#: platform/gui.cpp:113
msgctxt "file-type"
msgid "Encapsulated PostScript"
-msgstr "Kapsüllenmiş PostScript"
+msgstr "Encapsulated PostScript (EPS)"
#: platform/gui.cpp:114
msgctxt "file-type"
@@ -1699,136 +1737,135 @@ msgctxt "file-type"
msgid "Comma-separated values"
msgstr "Virgülle ayrılmış değerler (CSV)"
-#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641
+#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641
msgid "untitled"
msgstr "isimsiz"
-#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445
+#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467
#: platform/guiwin.cpp:1639
msgctxt "title"
msgid "Save File"
msgstr "Dosyayı Kaydet"
-#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428
+#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450
#: platform/guiwin.cpp:1645
msgctxt "title"
msgid "Open File"
msgstr "Dosyayı Aç"
-#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418
+#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433
msgctxt "button"
msgid "_Cancel"
msgstr "_İptal"
-#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416
+#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431
msgctxt "button"
msgid "_Save"
msgstr "_Kaydet"
-#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417
+#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432
msgctxt "button"
msgid "_Open"
msgstr "_Aç"
-#: solvespace.cpp:170
+#: solvespace.cpp:171
msgctxt "title"
msgid "Autosave Available"
msgstr "Otomatik Kaydetme Kullanılabilir"
-#: solvespace.cpp:171
+#: solvespace.cpp:172
msgctxt "dialog"
msgid "An autosave file is available for this sketch."
msgstr "Bu çizim için otomatik kaydetme dosyası kullanılabilir."
-#: solvespace.cpp:172
+#: solvespace.cpp:173
msgctxt "dialog"
msgid "Do you want to load the autosave file instead?"
msgstr "Bunun yerine otomatik kaydetme dosyasını yüklemek istiyor musunuz?"
-#: solvespace.cpp:173
+#: solvespace.cpp:174
msgctxt "button"
msgid "&Load autosave"
-msgstr "&Otomatik kaydetmeyi yükle"
+msgstr "&Otomatik kaydı yükle"
-#: solvespace.cpp:175
+#: solvespace.cpp:176
msgctxt "button"
msgid "Do&n't Load"
msgstr "&Yükleme"
-#: solvespace.cpp:598
+#: solvespace.cpp:599
msgctxt "title"
msgid "Modified File"
msgstr "Değiştirilen Dosya"
-#: solvespace.cpp:600
+#: solvespace.cpp:601
#, c-format
msgctxt "dialog"
msgid "Do you want to save the changes you made to the sketch “%s”?"
msgstr "\"%s\" çiziminde yaptığınız değişiklikleri kaydetmek istiyor musunuz?"
-#: solvespace.cpp:603
+#: solvespace.cpp:604
msgctxt "dialog"
msgid "Do you want to save the changes you made to the new sketch?"
msgstr "Yeni çizimde yaptığınız değişiklikleri kaydetmek istiyor musunuz?"
-#: solvespace.cpp:606
+#: solvespace.cpp:607
msgctxt "dialog"
msgid "Your changes will be lost if you don't save them."
msgstr "Bunları kaydetmezseniz değişiklikleriniz kaybolur."
-#: solvespace.cpp:607
+#: solvespace.cpp:608
msgctxt "button"
msgid "&Save"
msgstr "&Kaydet"
-#: solvespace.cpp:609
+#: solvespace.cpp:610
msgctxt "button"
msgid "Do&n't Save"
msgstr "K&aydetme"
-#: solvespace.cpp:630
+#: solvespace.cpp:631
msgctxt "title"
msgid "(new sketch)"
msgstr "(yeni çizim)"
-#: solvespace.cpp:637
+#: solvespace.cpp:638
msgctxt "title"
msgid "Property Browser"
-msgstr "Özellik Tarayıcısı"
+msgstr "Özellik Penceresi"
-#: solvespace.cpp:699
+#: solvespace.cpp:700
msgid ""
"Constraints are currently shown, and will be exported in the toolpath. This "
"is probably not what you want; hide them by clicking the link at the top of "
"the text window."
msgstr ""
-"Sınırlamalar şu anda gösterilmektedir ve takım yolunda dışa aktarılacaktır. "
-"Muhtemelen istediğiniz bu değil; metin penceresinin üst kısmındaki "
+"Kısıtlamalar şu anda gösterilmektedir ve takım yolunda dışa aktarılacaktır. "
+"Muhtemelen istediğiniz bu değil; Özellik Penceresinin üst kısmındaki "
"bağlantıya tıklayarak bunları gizleyin."
-#: solvespace.cpp:771
+#: solvespace.cpp:772
#, c-format
msgid ""
"Can't identify file type from file extension of filename '%s'; try .dxf or ."
"dwg."
msgstr ""
-"Dosya türü '%s' dosya uzantısından tanımlanamıyor; .dxf veya .dwg'yi deneyin."
+"'%s' dosya adının dosya uzantısından dosya türü belirlenemiyor; .dxf veya ."
+"dwg'yi deneyin."
-#: solvespace.cpp:823
+#: solvespace.cpp:824
msgid "Constraint must have a label, and must not be a reference dimension."
-msgstr "Sınırlamanın bir etiketi olmalı ve bir referans ölçüsü olmamalıdır."
+msgstr "Kısıtlamanın bir etiketi olmalı ve bir referans ölçüsü olmamalıdır."
-#: solvespace.cpp:827
+#: solvespace.cpp:828
msgid "Bad selection for step dimension; select a constraint."
-msgstr ""
-"Adım ölçüsü için hatalı seçim; bir nokta boyunca, eksenleri koordine etmek "
-"için ortogonal seçin."
+msgstr "Adım ölçüsü ayarlamak için hatalı seçim; bir kısıtlama seçin."
-#: solvespace.cpp:851
+#: solvespace.cpp:852
msgid "The assembly does not interfere, good."
-msgstr "Montaj engel değil, iyi."
+msgstr "Montajda engel oluşturan parça yok, iyi."
-#: solvespace.cpp:867
+#: solvespace.cpp:868
#, c-format
msgid ""
"The volume of the solid model is:\n"
@@ -1837,9 +1874,9 @@ msgid ""
msgstr ""
"Katı modelin hacmi:\n"
"\n"
-" % s"
+" % s"
-#: solvespace.cpp:876
+#: solvespace.cpp:877
#, c-format
msgid ""
"\n"
@@ -1848,11 +1885,11 @@ msgid ""
" %s"
msgstr ""
"\n"
-"Mevcut mesh grubunun hacmi:\n"
+"Mevcut ağ (kafes) grubunun hacmi:\n"
"\n"
" %s"
-#: solvespace.cpp:881
+#: solvespace.cpp:882
msgid ""
"\n"
"\n"
@@ -1861,10 +1898,10 @@ msgid ""
msgstr ""
"\n"
"\n"
-"Eğri yüzeyler, üçgenler olarak yaklaştırılmıştır.\n"
-"Bu, tipik olarak yaklaşık 1% hataya neden olur."
+"Kavisli (Eğri) yüzeyler üçgenler olarak yaklaştırılmıştır.\n"
+"Bu, genel olarak yaklaşık 1% hataya neden olur."
-#: solvespace.cpp:896
+#: solvespace.cpp:897
#, c-format
msgid ""
"The surface area of the selected faces is:\n"
@@ -1874,22 +1911,22 @@ msgid ""
"Curves have been approximated as piecewise linear.\n"
"This introduces error, typically of around 1%%."
msgstr ""
-"Seçilen yüzlerin yüzey alanı:\n"
+"Seçili yüzlerin yüzey alanı:\n"
"\n"
" %s\n"
"\n"
-"Eğriler, parçalı doğrusal olarak yaklaştırıldı.\n"
-"Bu, tipik olarak yaklaşık 1%% hataya neden olur."
+"Eğriler, doğrusal parçalı olarak yaklaştırılmıştır.\n"
+"Bu, genel olarak yaklaşık 1%% hataya neden olur."
-#: solvespace.cpp:905
+#: solvespace.cpp:906
msgid ""
"This group does not contain a correctly-formed 2d closed area. It is open, "
"not coplanar, or self-intersecting."
msgstr ""
-"Bu grup, doğru biçimlendirilmiş 2d kapalı alan içermiyor. Açık, eş düzlemli "
+"Bu grup, doğru biçimlendirilmiş 2d kapalı alan içermiyor. Açık, eş-düzlemli "
"değil veya kendisiyle kesişiyor."
-#: solvespace.cpp:917
+#: solvespace.cpp:918
#, c-format
msgid ""
"The area of the region sketched in this group is:\n"
@@ -1903,10 +1940,10 @@ msgstr ""
"\n"
" %s\n"
"\n"
-"Eğriler, parçalı doğrusal olarak yaklaştırıldı.\n"
-"Bu, tipik olarak yaklaşık 1%% hataya neden olur."
+"Eğriler, doğrusal parçalı olarak yaklaştırılmıştır.\n"
+"Bu, genel olarak yaklaşık 1%% hataya neden olur."
-#: solvespace.cpp:937
+#: solvespace.cpp:938
#, c-format
msgid ""
"The total length of the selected entities is:\n"
@@ -1921,40 +1958,40 @@ msgstr ""
" %s\n"
"\n"
"Eğriler, parçalı doğrusal olarak yaklaştırıldı.\n"
-"Bu, tipik olarak yaklaşık 1%% hataya neden olur."
+"Bu, genel olarak yaklaşık 1%% hataya neden olur."
-#: solvespace.cpp:943
+#: solvespace.cpp:944
msgid "Bad selection for perimeter; select line segments, arcs, and curves."
msgstr ""
-"Çevre uzunluğu için hatalı seçim; çizgi parçalarını, yayları ve eğrileri "
-"seçin."
+"Çevre uzunluğunu hesabı için hatalı seçim; çizgi parçalarını, yayları ve "
+"eğrileri seçin."
-#: solvespace.cpp:959
+#: solvespace.cpp:960
msgid "Bad selection for trace; select a single point."
-msgstr "İzleme için hatalı seçim; tek bir nokta seçin."
+msgstr "Nokta izleme işlemi için hatalı seçim; tek bir nokta seçin."
-#: solvespace.cpp:986
+#: solvespace.cpp:987
#, c-format
msgid "Couldn't write to '%s'"
-msgstr "\"%s\" ye yazılamadı"
-
-#: solvespace.cpp:1016
-msgid "The mesh is self-intersecting (NOT okay, invalid)."
-msgstr "Mesh kendisiyle kesişiyor (TAMAM değil, geçersiz)."
+msgstr "\"%s\" öğesine yazılamadı"
#: solvespace.cpp:1017
-msgid "The mesh is not self-intersecting (okay, valid)."
-msgstr "Mesh kendi kendine kesişmiyor (tamam, geçerli)."
+msgid "The mesh is self-intersecting (NOT okay, invalid)."
+msgstr "Ağ (Kafes) kendisiyle kesişiyor (İyi DEĞİL, geçersiz)."
-#: solvespace.cpp:1019
-msgid "The mesh has naked edges (NOT okay, invalid)."
-msgstr "Mesh'in açık kenarları var (tamam DEĞİL, geçersiz)."
+#: solvespace.cpp:1018
+msgid "The mesh is not self-intersecting (okay, valid)."
+msgstr "Ağ (Kafes) kendisi ile kesişmiyor (iyi, geçerli)."
#: solvespace.cpp:1020
-msgid "The mesh is watertight (okay, valid)."
-msgstr "Mesh çok sıkı (tamam, geçerli)"
+msgid "The mesh has naked edges (NOT okay, invalid)."
+msgstr "Ağın (Kafesin) açık kenarları var (iyi DEĞİL, geçersiz)."
-#: solvespace.cpp:1023
+#: solvespace.cpp:1021
+msgid "The mesh is watertight (okay, valid)."
+msgstr "Ağ (Kafes) çok sıkı (iyi, geçerli)"
+
+#: solvespace.cpp:1024
#, c-format
msgid ""
"\n"
@@ -1963,9 +2000,9 @@ msgid ""
msgstr ""
"\n"
"\n"
-"Model, %d yüzeylerden %d üçgen içerir."
+"Model, %d yüzeyden %d üçgen içeriyor."
-#: solvespace.cpp:1027
+#: solvespace.cpp:1028
#, c-format
msgid ""
"%s\n"
@@ -1980,7 +2017,7 @@ msgstr ""
"\n"
"Sıfır sorunlu kenar, iyi.%s"
-#: solvespace.cpp:1030
+#: solvespace.cpp:1031
#, c-format
msgid ""
"%s\n"
@@ -1995,7 +2032,7 @@ msgstr ""
"\n"
"%d sorunlu kenar, kötü.%s"
-#: solvespace.cpp:1043
+#: solvespace.cpp:1044
#, c-format
msgid ""
"This is SolveSpace version %s.\n"
@@ -2013,10 +2050,10 @@ msgid ""
msgstr ""
"Bu SolveSpace'in %s sürümüdür.\n"
"\n"
-"Daha fazla bilgi için, http://solvespace.com/ bkz.\n"
+"Daha fazla bilgi için bkz., http://solvespace.com/\n"
"\n"
"SolveSpace ücretsiz bir yazılımdır: GNU Genel Kamu \n"
-"Lisansı (GPL) sürüm 3 veya daha sonraki hükümler altında \n"
+"Lisansı (GPL) sürüm 3 veya daha sonraki hükümleri altında \n"
"onu değiştirmekte ve / veya yeniden dağıtmakta özgürsünüz.\n"
"\n"
"Yasaların izin verdiği ölçüde GARANTİ YOKTUR. \n"
@@ -2036,109 +2073,109 @@ msgstr ""
msgid "Style name cannot be empty"
msgstr "Biçim adı boş olamaz"
-#: textscreens.cpp:785
+#: textscreens.cpp:791
msgid "Can't repeat fewer than 1 time."
-msgstr "1 defadan az tekrar edilemez."
+msgstr "1 defadan az tekrarlanamaz."
-#: textscreens.cpp:789
+#: textscreens.cpp:795
msgid "Can't repeat more than 999 times."
-msgstr "999 defadan fazla tekrar edilemez."
+msgstr "999 defadan fazla tekrarlanamaz."
-#: textscreens.cpp:814
+#: textscreens.cpp:820
msgid "Group name cannot be empty"
msgstr "Grup adı boş olamaz"
-#: textscreens.cpp:866
+#: textscreens.cpp:872
msgid "Opacity must be between zero and one."
msgstr "Şeffaflık değeri sıfır ile bir arasında olmalıdır."
-#: textscreens.cpp:901
+#: textscreens.cpp:907
msgid "Radius cannot be zero or negative."
msgstr "Yarıçap sıfır veya negatif değer olamaz."
#: toolbar.cpp:18
msgid "Sketch line segment"
-msgstr "Çizgi parçası ile taslak çizin"
+msgstr "Çizgi parçası çiz"
#: toolbar.cpp:20
msgid "Sketch rectangle"
-msgstr "Dikdörtgen çizin"
+msgstr "Dikdörtgen çiz"
#: toolbar.cpp:22
msgid "Sketch circle"
-msgstr "Çember çizin"
+msgstr "Daire çiz"
#: toolbar.cpp:24
msgid "Sketch arc of a circle"
-msgstr "Bir çember yayı çizin"
+msgstr "Bir çember yayı çiz"
#: toolbar.cpp:26
msgid "Sketch curves from text in a TrueType font"
-msgstr "TrueType yazı tipindeki metinden eğriler çizin"
+msgstr "TrueType yazı tipindeki metinden eğriler çiz"
#: toolbar.cpp:28
msgid "Sketch image from a file"
-msgstr "Bir dosyadan resim ekleyin"
+msgstr "Bir dosyadan görüntü (resim) ekle"
#: toolbar.cpp:30
msgid "Create tangent arc at selected point"
-msgstr "Seçilen noktada teğet yay oluşturun"
+msgstr "Seçilen noktada radyus (teğet yay) oluştur"
#: toolbar.cpp:32
msgid "Sketch cubic Bezier spline"
-msgstr "Kübik Bezier Eğri Çizin"
+msgstr "Kübik Bezier Eğri Çiz"
#: toolbar.cpp:34
msgid "Sketch datum point"
-msgstr "Referans Nokta Ekleyin"
+msgstr "Referans Nokta Ekle"
#: toolbar.cpp:36
msgid "Toggle construction"
-msgstr "Yapıyı değiştirin"
+msgstr "Yapıyı değiştir"
#: toolbar.cpp:38
msgid "Split lines / curves where they intersect"
-msgstr "Çizgileri / eğrileri kesiştikleri yerde bölün"
+msgstr "Çizgileri / eğrileri kesiştikleri yerden böl"
#: toolbar.cpp:42
msgid "Constrain distance / diameter / length"
-msgstr "Mesafeyi / çapı / uzunluğu sınırlandırın"
+msgstr "Mesafeyi / çapı / uzunluğu kısıtla"
#: toolbar.cpp:44
msgid "Constrain angle"
-msgstr "Açıyı sınırlandırın"
+msgstr "Açıyı kısıtla"
#: toolbar.cpp:46
msgid "Constrain to be horizontal"
-msgstr "Yatay olarak sınırlandırın"
+msgstr "Yatay olarak kısıtla"
#: toolbar.cpp:48
msgid "Constrain to be vertical"
-msgstr "Dikey olarak sınırlandırın"
+msgstr "Dikey olarak kısıtla"
#: toolbar.cpp:50
msgid "Constrain to be parallel or tangent"
-msgstr "Paralel veya teğet olarak sınırlandırın"
+msgstr "Paralel veya teğet olarak kısıtla"
#: toolbar.cpp:52
msgid "Constrain to be perpendicular"
-msgstr "Dik olarak sınırlandırın"
+msgstr "Dik olarak kısıtla"
#: toolbar.cpp:54
msgid "Constrain point on line / curve / plane / point"
-msgstr "Noktayı çizgi / eğri / düzlem / nokta ile çakıştırarak sınırlandırın"
+msgstr "Noktayı çizgi / eğri / düzlem / nokta ile çakıştırarak kısıtla"
#: toolbar.cpp:56
msgid "Constrain symmetric"
-msgstr "Simetrik olarak sınırlandırın"
+msgstr "Simetrik olarak kısıtla"
#: toolbar.cpp:58
msgid "Constrain equal length / radius / angle"
-msgstr "Eşit uzunluk / yarıçap / açı olarak sınırlandırın"
+msgstr "Eşit uzunluk / yarıçap / açı olarak kısıtla"
#: toolbar.cpp:60
msgid "Constrain normals in same orientation"
-msgstr "Normalleri aynı yönde sınırlandırın"
+msgstr "Normalleri aynı yönde kısıtla"
#: toolbar.cpp:62
msgid "Other supplementary angle"
@@ -2150,11 +2187,11 @@ msgstr "Ölçüyü Referans Yap / Yapma"
#: toolbar.cpp:68
msgid "New group extruding active sketch"
-msgstr "Etkin çizimi katılayarak yeni grup oluşturun"
+msgstr "Etkin çizimi uzatıp katılayarak yeni grup oluştur"
#: toolbar.cpp:70
msgid "New group rotating active sketch"
-msgstr "Etkin çizimi döndürerek yeni grup oluşturun"
+msgstr "Etkin çizimi tam döndürerek yeni grup oluştur"
#: toolbar.cpp:72
msgid "New group helix from active sketch"
@@ -2162,28 +2199,28 @@ msgstr "Etkin çizimden sarmal yeni grup oluştur"
#: toolbar.cpp:74
msgid "New group revolve active sketch"
-msgstr "Etkin çizimi döndürülür yeni grup oluşturun"
+msgstr "Etkin çizimi kısmen döndürerek yeni grup oluştur"
#: toolbar.cpp:76
msgid "New group step and repeat rotating"
-msgstr "Adımlayarak ve tekrarlayarak yeni dönüş grup oluşturun"
+msgstr "Adım ve tekrar değeri belirterek dairesel kopya grubu oluştur"
#: toolbar.cpp:78
msgid "New group step and repeat translating"
-msgstr "Adımlayarak ve tekrarlayarak yeni öteleme grup oluşturun"
+msgstr "Adım ve tekrar değeri belirterek yeni doğrusal kopyalama grup oluştur"
#: toolbar.cpp:80
msgid "New group in new workplane (thru given entities)"
msgstr ""
-"Yeni çalışma düzleminde yeni grup oluşturun (verilen öğeler aracılığıyla)"
+"Yeni çalışma düzleminde yeni grup oluştur (verilen öğeler aracılığıyla)"
#: toolbar.cpp:82
msgid "New group in 3d"
-msgstr "3d'de yeni grup oluşturun"
+msgstr "3d'de yeni grup oluştur"
#: toolbar.cpp:84
msgid "New group linking / assembling file"
-msgstr "Bağlantı / Montaj dosyası ile yeni grup oluşturun"
+msgstr "Bağlantı / Montaj dosyası ile yeni grup oluştur"
#: toolbar.cpp:88
msgid "Nearest isometric view"
@@ -2191,7 +2228,7 @@ msgstr "En yakın izometrik görünüm"
#: toolbar.cpp:90
msgid "Align view to active workplane"
-msgstr "Görünümü etkin çalışma düzlemine hizalayın"
+msgstr "Görünümü etkin çalışma düzlemine hizala"
#: util.cpp:165
msgctxt "title"
diff --git a/res/locales/uk_UA.po b/res/locales/uk_UA.po
index 8192a6b6..ee4c8fb2 100644
--- a/res/locales/uk_UA.po
+++ b/res/locales/uk_UA.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: SolveSpace 3.0\n"
"Report-Msgid-Bugs-To: whitequark@whitequark.org\n"
-"POT-Creation-Date: 2021-09-26 16:25-0400\n"
+"POT-Creation-Date: 2022-02-01 16:24+0200\n"
"PO-Revision-Date: 2021-04-14 01:42+0300\n"
"Last-Translator: https://github.com/Symbian9\n"
"Language-Team: app4soft\n"
@@ -35,7 +35,7 @@ msgstr "Буфер обміну порожній; немає чого встав
msgid "Number of copies to paste must be at least one."
msgstr "Кількість копій для вставки має бути не менше одної."
-#: clipboard.cpp:389 textscreens.cpp:827
+#: clipboard.cpp:389 textscreens.cpp:833
msgid "Scale cannot be zero."
msgstr "Масштаб не може бути нульовим."
@@ -62,15 +62,15 @@ msgstr "Забагато об'єктів для вставки; рзділіть
msgid "No workplane active."
msgstr "Немає активної площини."
-#: confscreen.cpp:376
+#: confscreen.cpp:381
msgid "Bad format: specify coordinates as x, y, z"
msgstr "Некоректний формат: визначте координати X, Y, Z"
-#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858
+#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864
msgid "Bad format: specify color as r, g, b"
msgstr "Некоректний формат: визначте колір як R, G, B"
-#: confscreen.cpp:412
+#: confscreen.cpp:417
#, fuzzy
msgid ""
"The perspective factor will have no effect until you enable View -> Use "
@@ -79,24 +79,24 @@ msgstr ""
"Значення перспективи не матиме ефекту допоки не ввімкнено Вигляд -> "
"Використовувати Перспективну проєкцію."
-#: confscreen.cpp:430 confscreen.cpp:440
+#: confscreen.cpp:435 confscreen.cpp:445
#, c-format
msgid "Specify between 0 and %d digits after the decimal."
msgstr "Визначте кількість десяткових знаків від 0 до %d."
-#: confscreen.cpp:452
+#: confscreen.cpp:457
msgid "Export scale must not be zero!"
msgstr "Масштаб експорту не може бути нульовим!"
-#: confscreen.cpp:464
+#: confscreen.cpp:469
msgid "Cutter radius offset must not be negative!"
msgstr "Радіус відступу різання не може бути від'ємним!"
-#: confscreen.cpp:518
+#: confscreen.cpp:528
msgid "Bad value: autosave interval should be positive"
msgstr "Некоректне значення: інтервал автозбереження має бути додатнім"
-#: confscreen.cpp:521
+#: confscreen.cpp:531
#, fuzzy
msgid "Bad format: specify interval in integral minutes"
msgstr "Некоректний формат: визначте цілим числом інтервал у хвилинах"
@@ -579,7 +579,7 @@ msgctxt "button"
msgid "&No"
msgstr "&Ні"
-#: file.cpp:877 solvespace.cpp:610
+#: file.cpp:877 solvespace.cpp:611
msgctxt "button"
msgid "&Cancel"
msgstr "&Відмінити"
@@ -1032,24 +1032,28 @@ msgstr "&Мова"
msgid "&Website / Manual"
msgstr "&Вебсайт / Посібник"
-#: graphicswin.cpp:187
+#: graphicswin.cpp:186
+msgid "&Go to GitHub commit"
+msgstr ""
+
+#: graphicswin.cpp:188
msgid "&About"
msgstr "&Про програму"
-#: graphicswin.cpp:361
+#: graphicswin.cpp:362
msgid "(no recent files)"
msgstr "(нємає нещодавніх файлів)"
-#: graphicswin.cpp:369
+#: graphicswin.cpp:370
#, c-format
msgid "File '%s' does not exist."
msgstr "Файл '%s' відсутній."
-#: graphicswin.cpp:736
+#: graphicswin.cpp:737
msgid "No workplane is active, so the grid will not appear."
msgstr "Відсутня активна площина - сітка не відображатиметься."
-#: graphicswin.cpp:751
+#: graphicswin.cpp:752
msgid ""
"The perspective factor is set to zero, so the view will always be a parallel "
"projection.\n"
@@ -1058,91 +1062,91 @@ msgid ""
"configuration screen. A value around 0.3 is typical."
msgstr ""
-#: graphicswin.cpp:836
+#: graphicswin.cpp:837
msgid ""
"Select a point; this point will become the center of the view on screen."
msgstr ""
-#: graphicswin.cpp:1136
+#: graphicswin.cpp:1137
msgid "No additional entities share endpoints with the selected entities."
msgstr ""
-#: graphicswin.cpp:1154
+#: graphicswin.cpp:1155
msgid ""
"To use this command, select a point or other entity from an linked part, or "
"make a link group the active group."
msgstr ""
-#: graphicswin.cpp:1177
+#: graphicswin.cpp:1178
msgid ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) "
"to define the plane for the snap grid."
msgstr ""
-#: graphicswin.cpp:1184
+#: graphicswin.cpp:1185
msgid ""
"Can't snap these items to grid; select points, text comments, or constraints "
"with a label. To snap a line, select its endpoints."
msgstr ""
-#: graphicswin.cpp:1269
+#: graphicswin.cpp:1270
msgid "No workplane selected. Activating default workplane for this group."
msgstr ""
-#: graphicswin.cpp:1272
+#: graphicswin.cpp:1273
msgid ""
"No workplane is selected, and the active group does not have a default "
"workplane. Try selecting a workplane, or activating a sketch-in-new-"
"workplane group."
msgstr ""
-#: graphicswin.cpp:1293
+#: graphicswin.cpp:1294
msgid ""
"Bad selection for tangent arc at point. Select a single point, or select "
"nothing to set up arc parameters."
msgstr ""
-#: graphicswin.cpp:1304
+#: graphicswin.cpp:1305
msgid "click point on arc (draws anti-clockwise)"
msgstr ""
-#: graphicswin.cpp:1305
+#: graphicswin.cpp:1306
msgid "click to place datum point"
msgstr "клікніть для встановлення вихідної точки"
-#: graphicswin.cpp:1306
+#: graphicswin.cpp:1307
msgid "click first point of line segment"
msgstr "клікніть першу точку прямої лінії"
-#: graphicswin.cpp:1308
+#: graphicswin.cpp:1309
msgid "click first point of construction line segment"
msgstr "клікніть першу точку конструктивної прямої лінії"
-#: graphicswin.cpp:1309
+#: graphicswin.cpp:1310
msgid "click first point of cubic segment"
msgstr "клікніть першу точку кривої"
-#: graphicswin.cpp:1310
+#: graphicswin.cpp:1311
msgid "click center of circle"
msgstr "клікніть в місце де буде центр коментаря"
-#: graphicswin.cpp:1311
+#: graphicswin.cpp:1312
msgid "click origin of workplane"
msgstr "клікніть в центр відліку площини"
-#: graphicswin.cpp:1312
+#: graphicswin.cpp:1313
msgid "click one corner of rectangle"
msgstr "клікніть для встановлення першого кута прямокутника"
-#: graphicswin.cpp:1313
+#: graphicswin.cpp:1314
msgid "click top left of text"
msgstr "клікніть для встановлення верхньої лівої межі тексту"
-#: graphicswin.cpp:1319
+#: graphicswin.cpp:1320
msgid "click top left of image"
msgstr "клікніть для встановлення верхньої лівої межі зображення"
-#: graphicswin.cpp:1345
+#: graphicswin.cpp:1346
msgid ""
"No entities are selected. Select entities before trying to toggle their "
"construction state."
@@ -1271,6 +1275,10 @@ msgstr "контур самоперетинається!"
msgid "zero-length edge!"
msgstr "ребро нульової довжини!"
+#: importmesh.cpp:136
+msgid "Text-formated STL files are not currently supported"
+msgstr ""
+
#: modify.cpp:252
msgid "Must be sketching in workplane to create tangent arc."
msgstr ""
@@ -1452,7 +1460,7 @@ msgid ""
"Workplane."
msgstr ""
-#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552
+#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553
msgctxt "file-type"
msgid "SolveSpace models"
msgstr "SolveSpace модель"
@@ -1547,130 +1555,130 @@ msgctxt "file-type"
msgid "Comma-separated values"
msgstr "Comma-separated values"
-#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641
+#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641
msgid "untitled"
msgstr "без імені"
-#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445
+#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467
#: platform/guiwin.cpp:1639
msgctxt "title"
msgid "Save File"
msgstr "Зберегти Файл"
-#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428
+#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450
#: platform/guiwin.cpp:1645
msgctxt "title"
msgid "Open File"
msgstr "Відкрити Файл"
-#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418
+#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433
msgctxt "button"
msgid "_Cancel"
msgstr "_Скасувати"
-#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416
+#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431
msgctxt "button"
msgid "_Save"
msgstr "_Зберегти"
-#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417
+#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432
msgctxt "button"
msgid "_Open"
msgstr "_Відкрити"
-#: solvespace.cpp:170
+#: solvespace.cpp:171
msgctxt "title"
msgid "Autosave Available"
msgstr "Наявні автозбереження"
-#: solvespace.cpp:171
+#: solvespace.cpp:172
msgctxt "dialog"
msgid "An autosave file is available for this sketch."
msgstr "Наявні автозбереження для цього креслення."
-#: solvespace.cpp:172
+#: solvespace.cpp:173
msgctxt "dialog"
msgid "Do you want to load the autosave file instead?"
msgstr "Завантажити файл автозбереження?"
-#: solvespace.cpp:173
+#: solvespace.cpp:174
msgctxt "button"
msgid "&Load autosave"
msgstr "&Завантажити автозбереження"
-#: solvespace.cpp:175
+#: solvespace.cpp:176
msgctxt "button"
msgid "Do&n't Load"
msgstr "&Не Завантажувати"
-#: solvespace.cpp:598
+#: solvespace.cpp:599
msgctxt "title"
msgid "Modified File"
msgstr "Файл Змінено"
-#: solvespace.cpp:600
+#: solvespace.cpp:601
#, c-format
msgctxt "dialog"
msgid "Do you want to save the changes you made to the sketch “%s”?"
msgstr "Чи хочете ви зберегти зміни зроблені вами у ескізі “%s”?"
-#: solvespace.cpp:603
+#: solvespace.cpp:604
msgctxt "dialog"
msgid "Do you want to save the changes you made to the new sketch?"
msgstr "Чи хочете ви зберегти зміни зроблені вами у новому ескізі?"
-#: solvespace.cpp:606
+#: solvespace.cpp:607
msgctxt "dialog"
msgid "Your changes will be lost if you don't save them."
msgstr "Ваші зміни буде втрачено якщо ви не збережете їх."
-#: solvespace.cpp:607
+#: solvespace.cpp:608
msgctxt "button"
msgid "&Save"
msgstr "&Зберегти"
-#: solvespace.cpp:609
+#: solvespace.cpp:610
msgctxt "button"
msgid "Do&n't Save"
msgstr "&Не Зберігати"
-#: solvespace.cpp:630
+#: solvespace.cpp:631
msgctxt "title"
msgid "(new sketch)"
msgstr "(нове креслення)"
-#: solvespace.cpp:637
+#: solvespace.cpp:638
msgctxt "title"
msgid "Property Browser"
msgstr "Браузер Властивостей"
-#: solvespace.cpp:699
+#: solvespace.cpp:700
msgid ""
"Constraints are currently shown, and will be exported in the toolpath. This "
"is probably not what you want; hide them by clicking the link at the top of "
"the text window."
msgstr ""
-#: solvespace.cpp:771
+#: solvespace.cpp:772
#, c-format
msgid ""
"Can't identify file type from file extension of filename '%s'; try .dxf or ."
"dwg."
msgstr ""
-#: solvespace.cpp:823
+#: solvespace.cpp:824
msgid "Constraint must have a label, and must not be a reference dimension."
msgstr "Обмежувач має містити мітку і бути не відносним розміром."
-#: solvespace.cpp:827
+#: solvespace.cpp:828
msgid "Bad selection for step dimension; select a constraint."
msgstr "Поганий вибір для крокової зміни розміру; оберіть обмежувач."
-#: solvespace.cpp:851
+#: solvespace.cpp:852
msgid "The assembly does not interfere, good."
msgstr ""
-#: solvespace.cpp:867
+#: solvespace.cpp:868
#, c-format
msgid ""
"The volume of the solid model is:\n"
@@ -1681,7 +1689,7 @@ msgstr ""
"\n"
" %s"
-#: solvespace.cpp:876
+#: solvespace.cpp:877
#, c-format
msgid ""
"\n"
@@ -1694,7 +1702,7 @@ msgstr ""
"\n"
" %s"
-#: solvespace.cpp:881
+#: solvespace.cpp:882
msgid ""
"\n"
"\n"
@@ -1702,7 +1710,7 @@ msgid ""
"This introduces error, typically of around 1%."
msgstr ""
-#: solvespace.cpp:896
+#: solvespace.cpp:897
#, c-format
msgid ""
"The surface area of the selected faces is:\n"
@@ -1713,7 +1721,7 @@ msgid ""
"This introduces error, typically of around 1%%."
msgstr ""
-#: solvespace.cpp:905
+#: solvespace.cpp:906
msgid ""
"This group does not contain a correctly-formed 2d closed area. It is open, "
"not coplanar, or self-intersecting."
@@ -1721,7 +1729,7 @@ msgstr ""
"Ця група не місить коректно сформованого замкненої 2D площини. Вона "
"відкрита, не компланарна, або ж самоперетинається."
-#: solvespace.cpp:917
+#: solvespace.cpp:918
#, c-format
msgid ""
"The area of the region sketched in this group is:\n"
@@ -1738,7 +1746,7 @@ msgstr ""
"Криві наближено до ламаних ліній.\n"
"Це вносить похибку, зазвичай близько 1%%."
-#: solvespace.cpp:937
+#: solvespace.cpp:938
#, c-format
msgid ""
"The total length of the selected entities is:\n"
@@ -1755,36 +1763,36 @@ msgstr ""
"Криві наближено до ламаних ліній.\n"
"Це вносить похибку, зазвичай близько 1%%."
-#: solvespace.cpp:943
+#: solvespace.cpp:944
msgid "Bad selection for perimeter; select line segments, arcs, and curves."
msgstr "Поганий вибір для периметру; оберіть відрізки, дуги та криві."
-#: solvespace.cpp:959
+#: solvespace.cpp:960
msgid "Bad selection for trace; select a single point."
msgstr "Поганий вибір для вістежування шляху; оберіть одну точку."
-#: solvespace.cpp:986
+#: solvespace.cpp:987
#, c-format
msgid "Couldn't write to '%s'"
msgstr "Неможливо записати у '%s'"
-#: solvespace.cpp:1016
+#: solvespace.cpp:1017
msgid "The mesh is self-intersecting (NOT okay, invalid)."
msgstr "Меш самоперетинається (НЕ добре, недійсний)."
-#: solvespace.cpp:1017
+#: solvespace.cpp:1018
msgid "The mesh is not self-intersecting (okay, valid)."
msgstr "Меш самоперетинається (добре, дійсний)."
-#: solvespace.cpp:1019
+#: solvespace.cpp:1020
msgid "The mesh has naked edges (NOT okay, invalid)."
msgstr "Меш містить оголені ребра (НЕ добре, недійсний)."
-#: solvespace.cpp:1020
+#: solvespace.cpp:1021
msgid "The mesh is watertight (okay, valid)."
msgstr "Меш водонепроникний (добре, дійсний)."
-#: solvespace.cpp:1023
+#: solvespace.cpp:1024
#, c-format
msgid ""
"\n"
@@ -1792,7 +1800,7 @@ msgid ""
"The model contains %d triangles, from %d surfaces."
msgstr ""
-#: solvespace.cpp:1027
+#: solvespace.cpp:1028
#, c-format
msgid ""
"%s\n"
@@ -1807,7 +1815,7 @@ msgstr ""
"\n"
"Відсутні проблемні ребра, добре.%s"
-#: solvespace.cpp:1030
+#: solvespace.cpp:1031
#, c-format
msgid ""
"%s\n"
@@ -1822,7 +1830,7 @@ msgstr ""
"\n"
"%d проблемних ребер, погано.%s"
-#: solvespace.cpp:1043
+#: solvespace.cpp:1044
#, c-format
msgid ""
"This is SolveSpace version %s.\n"
@@ -1863,23 +1871,23 @@ msgstr ""
msgid "Style name cannot be empty"
msgstr "Стиль не може містити порожнє ім'я"
-#: textscreens.cpp:785
+#: textscreens.cpp:791
msgid "Can't repeat fewer than 1 time."
msgstr "Не можливо повторити менше 1 разу."
-#: textscreens.cpp:789
+#: textscreens.cpp:795
msgid "Can't repeat more than 999 times."
msgstr "Не можливо повторити понад 999 разів."
-#: textscreens.cpp:814
+#: textscreens.cpp:820
msgid "Group name cannot be empty"
msgstr "Група не може містити порожнє ім'я"
-#: textscreens.cpp:866
+#: textscreens.cpp:872
msgid "Opacity must be between zero and one."
msgstr "Непрозорість має бути між 0 та 1."
-#: textscreens.cpp:901
+#: textscreens.cpp:907
msgid "Radius cannot be zero or negative."
msgstr "Радіус не може бути нульовим чи від'ємним."
diff --git a/res/locales/zh_CN.po b/res/locales/zh_CN.po
index 7768124e..5cbf6997 100644
--- a/res/locales/zh_CN.po
+++ b/res/locales/zh_CN.po
@@ -2,12 +2,12 @@
# Copyright (C) 2020 the PACKAGE authors
# This file is distributed under the same license as the SolveSpace package.
# , 2020.
-#
+#
msgid ""
msgstr ""
"Project-Id-Version: SolveSpace 3.0\n"
"Report-Msgid-Bugs-To: whitequark@whitequark.org\n"
-"POT-Creation-Date: 2021-09-26 16:25-0400\n"
+"POT-Creation-Date: 2022-02-01 16:24+0200\n"
"PO-Revision-Date: 2021-04-03 13:10-0400\n"
"Last-Translator: lomatus@163.com\n"
"Language-Team: none\n"
@@ -35,7 +35,7 @@ msgstr "剪贴板为空;没有要粘贴的内容。"
msgid "Number of copies to paste must be at least one."
msgstr "要粘贴的副本数必须至少为 1 个。"
-#: clipboard.cpp:389 textscreens.cpp:827
+#: clipboard.cpp:389 textscreens.cpp:833
msgid "Scale cannot be zero."
msgstr "缩放不能为零。"
@@ -61,38 +61,38 @@ msgstr "要粘贴的项目太多; 请把他们拆分。"
msgid "No workplane active."
msgstr "没有工作平面处于活动状态。"
-#: confscreen.cpp:376
+#: confscreen.cpp:381
msgid "Bad format: specify coordinates as x, y, z"
msgstr "格式错误:将坐标指定为 x、y、z"
-#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858
+#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864
msgid "Bad format: specify color as r, g, b"
msgstr "格式错误:将颜色指定为 r、g、b"
-#: confscreen.cpp:412
+#: confscreen.cpp:417
msgid ""
"The perspective factor will have no effect until you enable View -> Use "
"Perspective Projection."
msgstr "在启用\"视图 -= 使用透视投影\"之前,透视因子将不起作用。"
-#: confscreen.cpp:430 confscreen.cpp:440
+#: confscreen.cpp:435 confscreen.cpp:445
#, c-format
msgid "Specify between 0 and %d digits after the decimal."
msgstr "在十进制之后指定 0 和 %d 数字之间。"
-#: confscreen.cpp:452
+#: confscreen.cpp:457
msgid "Export scale must not be zero!"
msgstr "输出比例不能为零!"
-#: confscreen.cpp:464
+#: confscreen.cpp:469
msgid "Cutter radius offset must not be negative!"
msgstr "刀具半径偏移不能为负数!"
-#: confscreen.cpp:518
+#: confscreen.cpp:528
msgid "Bad value: autosave interval should be positive"
msgstr "坏值:自动保存间隔应为正"
-#: confscreen.cpp:521
+#: confscreen.cpp:531
msgid "Bad format: specify interval in integral minutes"
msgstr "格式错误:以整数分钟为单位指定间隔"
@@ -632,7 +632,7 @@ msgctxt "button"
msgid "&No"
msgstr "否(&N)"
-#: file.cpp:877 solvespace.cpp:610
+#: file.cpp:877 solvespace.cpp:611
msgctxt "button"
msgid "&Cancel"
msgstr "取消(&C)"
@@ -1085,24 +1085,28 @@ msgstr "语言(&L)"
msgid "&Website / Manual"
msgstr "网页/手册(&W)"
-#: graphicswin.cpp:187
+#: graphicswin.cpp:186
+msgid "&Go to GitHub commit"
+msgstr ""
+
+#: graphicswin.cpp:188
msgid "&About"
msgstr "关于(&A)"
-#: graphicswin.cpp:361
+#: graphicswin.cpp:362
msgid "(no recent files)"
msgstr "(无文件)"
-#: graphicswin.cpp:369
+#: graphicswin.cpp:370
#, c-format
msgid "File '%s' does not exist."
msgstr "文件不存在: \"%s\"。"
-#: graphicswin.cpp:736
+#: graphicswin.cpp:737
msgid "No workplane is active, so the grid will not appear."
msgstr "没有激活的工作面,因此无法显示轴网。"
-#: graphicswin.cpp:751
+#: graphicswin.cpp:752
msgid ""
"The perspective factor is set to zero, so the view will always be a parallel "
"projection.\n"
@@ -1111,91 +1115,91 @@ msgid ""
"configuration screen. A value around 0.3 is typical."
msgstr ""
-#: graphicswin.cpp:836
+#: graphicswin.cpp:837
msgid ""
"Select a point; this point will become the center of the view on screen."
msgstr ""
-#: graphicswin.cpp:1136
+#: graphicswin.cpp:1137
msgid "No additional entities share endpoints with the selected entities."
msgstr ""
-#: graphicswin.cpp:1154
+#: graphicswin.cpp:1155
msgid ""
"To use this command, select a point or other entity from an linked part, or "
"make a link group the active group."
msgstr ""
-#: graphicswin.cpp:1177
+#: graphicswin.cpp:1178
msgid ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) "
"to define the plane for the snap grid."
msgstr ""
-#: graphicswin.cpp:1184
+#: graphicswin.cpp:1185
msgid ""
"Can't snap these items to grid; select points, text comments, or constraints "
"with a label. To snap a line, select its endpoints."
msgstr ""
-#: graphicswin.cpp:1269
+#: graphicswin.cpp:1270
msgid "No workplane selected. Activating default workplane for this group."
msgstr ""
-#: graphicswin.cpp:1272
+#: graphicswin.cpp:1273
msgid ""
"No workplane is selected, and the active group does not have a default "
"workplane. Try selecting a workplane, or activating a sketch-in-new-"
"workplane group."
msgstr ""
-#: graphicswin.cpp:1293
+#: graphicswin.cpp:1294
msgid ""
"Bad selection for tangent arc at point. Select a single point, or select "
"nothing to set up arc parameters."
msgstr ""
-#: graphicswin.cpp:1304
+#: graphicswin.cpp:1305
msgid "click point on arc (draws anti-clockwise)"
msgstr "点击弧线的点(逆时针方向绘制)"
-#: graphicswin.cpp:1305
+#: graphicswin.cpp:1306
msgid "click to place datum point"
msgstr "点击放置基准点"
-#: graphicswin.cpp:1306
+#: graphicswin.cpp:1307
msgid "click first point of line segment"
msgstr "点击线条的起点"
-#: graphicswin.cpp:1308
+#: graphicswin.cpp:1309
msgid "click first point of construction line segment"
msgstr "点击构造线的起点"
-#: graphicswin.cpp:1309
+#: graphicswin.cpp:1310
msgid "click first point of cubic segment"
msgstr "点击立方体的起点"
-#: graphicswin.cpp:1310
+#: graphicswin.cpp:1311
msgid "click center of circle"
msgstr "点击圆弧的中心"
-#: graphicswin.cpp:1311
+#: graphicswin.cpp:1312
msgid "click origin of workplane"
msgstr "点击工作面的原点"
-#: graphicswin.cpp:1312
+#: graphicswin.cpp:1313
msgid "click one corner of rectangle"
msgstr "点击一个矩形倒角"
-#: graphicswin.cpp:1313
+#: graphicswin.cpp:1314
msgid "click top left of text"
msgstr "点击文字左上角"
-#: graphicswin.cpp:1319
+#: graphicswin.cpp:1320
msgid "click top left of image"
msgstr "点击图片左上角"
-#: graphicswin.cpp:1345
+#: graphicswin.cpp:1346
msgid ""
"No entities are selected. Select entities before trying to toggle their "
"construction state."
@@ -1326,6 +1330,10 @@ msgstr "轮廓自相交!"
msgid "zero-length edge!"
msgstr "边缘长度为零!"
+#: importmesh.cpp:136
+msgid "Text-formated STL files are not currently supported"
+msgstr ""
+
#: modify.cpp:252
msgid "Must be sketching in workplane to create tangent arc."
msgstr ""
@@ -1505,7 +1513,7 @@ msgid ""
"Workplane."
msgstr "无法在三维空间内绘制图片,可使用 草图->在工作面 激活工作面。"
-#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552
+#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553
msgctxt "file-type"
msgid "SolveSpace models"
msgstr "SolveSpace模型"
@@ -1600,130 +1608,130 @@ msgctxt "file-type"
msgid "Comma-separated values"
msgstr "逗号分隔数据"
-#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641
+#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641
msgid "untitled"
msgstr "未命名"
-#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445
+#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467
#: platform/guiwin.cpp:1639
msgctxt "title"
msgid "Save File"
msgstr "保存文件"
-#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428
+#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450
#: platform/guiwin.cpp:1645
msgctxt "title"
msgid "Open File"
msgstr "打开文件"
-#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418
+#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433
msgctxt "button"
msgid "_Cancel"
msgstr "取消_C"
-#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416
+#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431
msgctxt "button"
msgid "_Save"
msgstr "保存_S"
-#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417
+#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432
msgctxt "button"
msgid "_Open"
msgstr "打开_O"
-#: solvespace.cpp:170
+#: solvespace.cpp:171
msgctxt "title"
msgid "Autosave Available"
msgstr ""
-#: solvespace.cpp:171
+#: solvespace.cpp:172
msgctxt "dialog"
msgid "An autosave file is available for this sketch."
msgstr ""
-#: solvespace.cpp:172
+#: solvespace.cpp:173
msgctxt "dialog"
msgid "Do you want to load the autosave file instead?"
msgstr ""
-#: solvespace.cpp:173
+#: solvespace.cpp:174
msgctxt "button"
msgid "&Load autosave"
msgstr ""
-#: solvespace.cpp:175
+#: solvespace.cpp:176
msgctxt "button"
msgid "Do&n't Load"
msgstr ""
-#: solvespace.cpp:598
+#: solvespace.cpp:599
msgctxt "title"
msgid "Modified File"
msgstr ""
-#: solvespace.cpp:600
+#: solvespace.cpp:601
#, c-format
msgctxt "dialog"
msgid "Do you want to save the changes you made to the sketch “%s”?"
msgstr ""
-#: solvespace.cpp:603
+#: solvespace.cpp:604
msgctxt "dialog"
msgid "Do you want to save the changes you made to the new sketch?"
msgstr ""
-#: solvespace.cpp:606
+#: solvespace.cpp:607
msgctxt "dialog"
msgid "Your changes will be lost if you don't save them."
msgstr ""
-#: solvespace.cpp:607
+#: solvespace.cpp:608
msgctxt "button"
msgid "&Save"
msgstr ""
-#: solvespace.cpp:609
+#: solvespace.cpp:610
msgctxt "button"
msgid "Do&n't Save"
msgstr ""
-#: solvespace.cpp:630
+#: solvespace.cpp:631
msgctxt "title"
msgid "(new sketch)"
msgstr ""
-#: solvespace.cpp:637
+#: solvespace.cpp:638
msgctxt "title"
msgid "Property Browser"
msgstr ""
-#: solvespace.cpp:699
+#: solvespace.cpp:700
msgid ""
"Constraints are currently shown, and will be exported in the toolpath. This "
"is probably not what you want; hide them by clicking the link at the top of "
"the text window."
msgstr ""
-#: solvespace.cpp:771
+#: solvespace.cpp:772
#, c-format
msgid ""
"Can't identify file type from file extension of filename '%s'; try .dxf or ."
"dwg."
msgstr ""
-#: solvespace.cpp:823
+#: solvespace.cpp:824
msgid "Constraint must have a label, and must not be a reference dimension."
msgstr ""
-#: solvespace.cpp:827
+#: solvespace.cpp:828
msgid "Bad selection for step dimension; select a constraint."
msgstr ""
-#: solvespace.cpp:851
+#: solvespace.cpp:852
msgid "The assembly does not interfere, good."
msgstr ""
-#: solvespace.cpp:867
+#: solvespace.cpp:868
#, c-format
msgid ""
"The volume of the solid model is:\n"
@@ -1731,7 +1739,7 @@ msgid ""
" %s"
msgstr ""
-#: solvespace.cpp:876
+#: solvespace.cpp:877
#, c-format
msgid ""
"\n"
@@ -1740,7 +1748,7 @@ msgid ""
" %s"
msgstr ""
-#: solvespace.cpp:881
+#: solvespace.cpp:882
msgid ""
"\n"
"\n"
@@ -1748,7 +1756,7 @@ msgid ""
"This introduces error, typically of around 1%."
msgstr ""
-#: solvespace.cpp:896
+#: solvespace.cpp:897
#, c-format
msgid ""
"The surface area of the selected faces is:\n"
@@ -1759,13 +1767,13 @@ msgid ""
"This introduces error, typically of around 1%%."
msgstr ""
-#: solvespace.cpp:905
+#: solvespace.cpp:906
msgid ""
"This group does not contain a correctly-formed 2d closed area. It is open, "
"not coplanar, or self-intersecting."
msgstr ""
-#: solvespace.cpp:917
+#: solvespace.cpp:918
#, c-format
msgid ""
"The area of the region sketched in this group is:\n"
@@ -1776,7 +1784,7 @@ msgid ""
"This introduces error, typically of around 1%%."
msgstr ""
-#: solvespace.cpp:937
+#: solvespace.cpp:938
#, c-format
msgid ""
"The total length of the selected entities is:\n"
@@ -1787,36 +1795,36 @@ msgid ""
"This introduces error, typically of around 1%%."
msgstr ""
-#: solvespace.cpp:943
+#: solvespace.cpp:944
msgid "Bad selection for perimeter; select line segments, arcs, and curves."
msgstr ""
-#: solvespace.cpp:959
+#: solvespace.cpp:960
msgid "Bad selection for trace; select a single point."
msgstr ""
-#: solvespace.cpp:986
+#: solvespace.cpp:987
#, c-format
msgid "Couldn't write to '%s'"
msgstr ""
-#: solvespace.cpp:1016
+#: solvespace.cpp:1017
msgid "The mesh is self-intersecting (NOT okay, invalid)."
msgstr ""
-#: solvespace.cpp:1017
+#: solvespace.cpp:1018
msgid "The mesh is not self-intersecting (okay, valid)."
msgstr ""
-#: solvespace.cpp:1019
+#: solvespace.cpp:1020
msgid "The mesh has naked edges (NOT okay, invalid)."
msgstr ""
-#: solvespace.cpp:1020
+#: solvespace.cpp:1021
msgid "The mesh is watertight (okay, valid)."
msgstr ""
-#: solvespace.cpp:1023
+#: solvespace.cpp:1024
#, c-format
msgid ""
"\n"
@@ -1824,7 +1832,7 @@ msgid ""
"The model contains %d triangles, from %d surfaces."
msgstr ""
-#: solvespace.cpp:1027
+#: solvespace.cpp:1028
#, c-format
msgid ""
"%s\n"
@@ -1834,7 +1842,7 @@ msgid ""
"Zero problematic edges, good.%s"
msgstr ""
-#: solvespace.cpp:1030
+#: solvespace.cpp:1031
#, c-format
msgid ""
"%s\n"
@@ -1844,7 +1852,7 @@ msgid ""
"%d problematic edges, bad.%s"
msgstr ""
-#: solvespace.cpp:1043
+#: solvespace.cpp:1044
#, c-format
msgid ""
"This is SolveSpace version %s.\n"
@@ -1871,23 +1879,23 @@ msgstr "无法将样式分配给派生自其他实体的实体;尝试将样式
msgid "Style name cannot be empty"
msgstr "样式名称不能为空"
-#: textscreens.cpp:785
+#: textscreens.cpp:791
msgid "Can't repeat fewer than 1 time."
msgstr "不能重复少于 1 次。"
-#: textscreens.cpp:789
+#: textscreens.cpp:795
msgid "Can't repeat more than 999 times."
msgstr "重复不超过 999 次。"
-#: textscreens.cpp:814
+#: textscreens.cpp:820
msgid "Group name cannot be empty"
msgstr "组名称不能为空"
-#: textscreens.cpp:866
+#: textscreens.cpp:872
msgid "Opacity must be between zero and one."
msgstr "不透明度必须在零和 1 之间。"
-#: textscreens.cpp:901
+#: textscreens.cpp:907
msgid "Radius cannot be zero or negative."
msgstr "半径偏移不能为负数。"
diff --git a/res/messages.pot b/res/messages.pot
index 25a6c1cf..bf8c9803 100644
--- a/res/messages.pot
+++ b/res/messages.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: SolveSpace 3.0\n"
"Report-Msgid-Bugs-To: whitequark@whitequark.org\n"
-"POT-Creation-Date: 2021-09-26 16:25-0400\n"
+"POT-Creation-Date: 2022-02-01 16:24+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -32,7 +32,7 @@ msgstr ""
msgid "Number of copies to paste must be at least one."
msgstr ""
-#: clipboard.cpp:389 textscreens.cpp:827
+#: clipboard.cpp:389 textscreens.cpp:833
msgid "Scale cannot be zero."
msgstr ""
@@ -56,37 +56,37 @@ msgstr ""
msgid "No workplane active."
msgstr ""
-#: confscreen.cpp:376
+#: confscreen.cpp:381
msgid "Bad format: specify coordinates as x, y, z"
msgstr ""
-#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858
+#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864
msgid "Bad format: specify color as r, g, b"
msgstr ""
-#: confscreen.cpp:412
+#: confscreen.cpp:417
msgid ""
"The perspective factor will have no effect until you enable View -> Use Perspective Projection."
msgstr ""
-#: confscreen.cpp:430 confscreen.cpp:440
+#: confscreen.cpp:435 confscreen.cpp:445
#, c-format
msgid "Specify between 0 and %d digits after the decimal."
msgstr ""
-#: confscreen.cpp:452
+#: confscreen.cpp:457
msgid "Export scale must not be zero!"
msgstr ""
-#: confscreen.cpp:464
+#: confscreen.cpp:469
msgid "Cutter radius offset must not be negative!"
msgstr ""
-#: confscreen.cpp:518
+#: confscreen.cpp:528
msgid "Bad value: autosave interval should be positive"
msgstr ""
-#: confscreen.cpp:521
+#: confscreen.cpp:531
msgid "Bad format: specify interval in integral minutes"
msgstr ""
@@ -538,7 +538,7 @@ msgctxt "button"
msgid "&No"
msgstr ""
-#: file.cpp:877 solvespace.cpp:610
+#: file.cpp:877 solvespace.cpp:611
msgctxt "button"
msgid "&Cancel"
msgstr ""
@@ -991,24 +991,28 @@ msgstr ""
msgid "&Website / Manual"
msgstr ""
-#: graphicswin.cpp:187
+#: graphicswin.cpp:186
+msgid "&Go to GitHub commit"
+msgstr ""
+
+#: graphicswin.cpp:188
msgid "&About"
msgstr ""
-#: graphicswin.cpp:361
+#: graphicswin.cpp:362
msgid "(no recent files)"
msgstr ""
-#: graphicswin.cpp:369
+#: graphicswin.cpp:370
#, c-format
msgid "File '%s' does not exist."
msgstr ""
-#: graphicswin.cpp:736
+#: graphicswin.cpp:737
msgid "No workplane is active, so the grid will not appear."
msgstr ""
-#: graphicswin.cpp:751
+#: graphicswin.cpp:752
msgid ""
"The perspective factor is set to zero, so the view will always be a parallel projection.\n"
"\n"
@@ -1016,89 +1020,89 @@ msgid ""
"around 0.3 is typical."
msgstr ""
-#: graphicswin.cpp:836
+#: graphicswin.cpp:837
msgid "Select a point; this point will become the center of the view on screen."
msgstr ""
-#: graphicswin.cpp:1136
+#: graphicswin.cpp:1137
msgid "No additional entities share endpoints with the selected entities."
msgstr ""
-#: graphicswin.cpp:1154
+#: graphicswin.cpp:1155
msgid ""
"To use this command, select a point or other entity from an linked part, or make a link group the "
"active group."
msgstr ""
-#: graphicswin.cpp:1177
+#: graphicswin.cpp:1178
msgid ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) to define the plane "
"for the snap grid."
msgstr ""
-#: graphicswin.cpp:1184
+#: graphicswin.cpp:1185
msgid ""
"Can't snap these items to grid; select points, text comments, or constraints with a label. To "
"snap a line, select its endpoints."
msgstr ""
-#: graphicswin.cpp:1269
+#: graphicswin.cpp:1270
msgid "No workplane selected. Activating default workplane for this group."
msgstr ""
-#: graphicswin.cpp:1272
+#: graphicswin.cpp:1273
msgid ""
"No workplane is selected, and the active group does not have a default workplane. Try selecting a "
"workplane, or activating a sketch-in-new-workplane group."
msgstr ""
-#: graphicswin.cpp:1293
+#: graphicswin.cpp:1294
msgid ""
"Bad selection for tangent arc at point. Select a single point, or select nothing to set up arc "
"parameters."
msgstr ""
-#: graphicswin.cpp:1304
+#: graphicswin.cpp:1305
msgid "click point on arc (draws anti-clockwise)"
msgstr ""
-#: graphicswin.cpp:1305
+#: graphicswin.cpp:1306
msgid "click to place datum point"
msgstr ""
-#: graphicswin.cpp:1306
+#: graphicswin.cpp:1307
msgid "click first point of line segment"
msgstr ""
-#: graphicswin.cpp:1308
+#: graphicswin.cpp:1309
msgid "click first point of construction line segment"
msgstr ""
-#: graphicswin.cpp:1309
+#: graphicswin.cpp:1310
msgid "click first point of cubic segment"
msgstr ""
-#: graphicswin.cpp:1310
+#: graphicswin.cpp:1311
msgid "click center of circle"
msgstr ""
-#: graphicswin.cpp:1311
+#: graphicswin.cpp:1312
msgid "click origin of workplane"
msgstr ""
-#: graphicswin.cpp:1312
+#: graphicswin.cpp:1313
msgid "click one corner of rectangle"
msgstr ""
-#: graphicswin.cpp:1313
+#: graphicswin.cpp:1314
msgid "click top left of text"
msgstr ""
-#: graphicswin.cpp:1319
+#: graphicswin.cpp:1320
msgid "click top left of image"
msgstr ""
-#: graphicswin.cpp:1345
+#: graphicswin.cpp:1346
msgid "No entities are selected. Select entities before trying to toggle their construction state."
msgstr ""
@@ -1221,6 +1225,10 @@ msgstr ""
msgid "zero-length edge!"
msgstr ""
+#: importmesh.cpp:136
+msgid "Text-formated STL files are not currently supported"
+msgstr ""
+
#: modify.cpp:252
msgid "Must be sketching in workplane to create tangent arc."
msgstr ""
@@ -1391,7 +1399,7 @@ msgstr ""
msgid "Can't draw image in 3d; first, activate a workplane with Sketch -> In Workplane."
msgstr ""
-#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552
+#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553
msgctxt "file-type"
msgid "SolveSpace models"
msgstr ""
@@ -1486,127 +1494,127 @@ msgctxt "file-type"
msgid "Comma-separated values"
msgstr ""
-#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641
+#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641
msgid "untitled"
msgstr ""
-#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445
+#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467
#: platform/guiwin.cpp:1639
msgctxt "title"
msgid "Save File"
msgstr ""
-#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428
+#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450
#: platform/guiwin.cpp:1645
msgctxt "title"
msgid "Open File"
msgstr ""
-#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418
+#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433
msgctxt "button"
msgid "_Cancel"
msgstr ""
-#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416
+#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431
msgctxt "button"
msgid "_Save"
msgstr ""
-#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417
+#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432
msgctxt "button"
msgid "_Open"
msgstr ""
-#: solvespace.cpp:170
+#: solvespace.cpp:171
msgctxt "title"
msgid "Autosave Available"
msgstr ""
-#: solvespace.cpp:171
+#: solvespace.cpp:172
msgctxt "dialog"
msgid "An autosave file is available for this sketch."
msgstr ""
-#: solvespace.cpp:172
+#: solvespace.cpp:173
msgctxt "dialog"
msgid "Do you want to load the autosave file instead?"
msgstr ""
-#: solvespace.cpp:173
+#: solvespace.cpp:174
msgctxt "button"
msgid "&Load autosave"
msgstr ""
-#: solvespace.cpp:175
+#: solvespace.cpp:176
msgctxt "button"
msgid "Do&n't Load"
msgstr ""
-#: solvespace.cpp:598
+#: solvespace.cpp:599
msgctxt "title"
msgid "Modified File"
msgstr ""
-#: solvespace.cpp:600
+#: solvespace.cpp:601
#, c-format
msgctxt "dialog"
msgid "Do you want to save the changes you made to the sketch “%s”?"
msgstr ""
-#: solvespace.cpp:603
+#: solvespace.cpp:604
msgctxt "dialog"
msgid "Do you want to save the changes you made to the new sketch?"
msgstr ""
-#: solvespace.cpp:606
+#: solvespace.cpp:607
msgctxt "dialog"
msgid "Your changes will be lost if you don't save them."
msgstr ""
-#: solvespace.cpp:607
+#: solvespace.cpp:608
msgctxt "button"
msgid "&Save"
msgstr ""
-#: solvespace.cpp:609
+#: solvespace.cpp:610
msgctxt "button"
msgid "Do&n't Save"
msgstr ""
-#: solvespace.cpp:630
+#: solvespace.cpp:631
msgctxt "title"
msgid "(new sketch)"
msgstr ""
-#: solvespace.cpp:637
+#: solvespace.cpp:638
msgctxt "title"
msgid "Property Browser"
msgstr ""
-#: solvespace.cpp:699
+#: solvespace.cpp:700
msgid ""
"Constraints are currently shown, and will be exported in the toolpath. This is probably not what "
"you want; hide them by clicking the link at the top of the text window."
msgstr ""
-#: solvespace.cpp:771
+#: solvespace.cpp:772
#, c-format
msgid "Can't identify file type from file extension of filename '%s'; try .dxf or .dwg."
msgstr ""
-#: solvespace.cpp:823
+#: solvespace.cpp:824
msgid "Constraint must have a label, and must not be a reference dimension."
msgstr ""
-#: solvespace.cpp:827
+#: solvespace.cpp:828
msgid "Bad selection for step dimension; select a constraint."
msgstr ""
-#: solvespace.cpp:851
+#: solvespace.cpp:852
msgid "The assembly does not interfere, good."
msgstr ""
-#: solvespace.cpp:867
+#: solvespace.cpp:868
#, c-format
msgid ""
"The volume of the solid model is:\n"
@@ -1614,7 +1622,7 @@ msgid ""
" %s"
msgstr ""
-#: solvespace.cpp:876
+#: solvespace.cpp:877
#, c-format
msgid ""
"\n"
@@ -1623,7 +1631,7 @@ msgid ""
" %s"
msgstr ""
-#: solvespace.cpp:881
+#: solvespace.cpp:882
msgid ""
"\n"
"\n"
@@ -1631,7 +1639,7 @@ msgid ""
"This introduces error, typically of around 1%."
msgstr ""
-#: solvespace.cpp:896
+#: solvespace.cpp:897
#, c-format
msgid ""
"The surface area of the selected faces is:\n"
@@ -1642,13 +1650,13 @@ msgid ""
"This introduces error, typically of around 1%%."
msgstr ""
-#: solvespace.cpp:905
+#: solvespace.cpp:906
msgid ""
"This group does not contain a correctly-formed 2d closed area. It is open, not coplanar, or self-"
"intersecting."
msgstr ""
-#: solvespace.cpp:917
+#: solvespace.cpp:918
#, c-format
msgid ""
"The area of the region sketched in this group is:\n"
@@ -1659,7 +1667,7 @@ msgid ""
"This introduces error, typically of around 1%%."
msgstr ""
-#: solvespace.cpp:937
+#: solvespace.cpp:938
#, c-format
msgid ""
"The total length of the selected entities is:\n"
@@ -1670,36 +1678,36 @@ msgid ""
"This introduces error, typically of around 1%%."
msgstr ""
-#: solvespace.cpp:943
+#: solvespace.cpp:944
msgid "Bad selection for perimeter; select line segments, arcs, and curves."
msgstr ""
-#: solvespace.cpp:959
+#: solvespace.cpp:960
msgid "Bad selection for trace; select a single point."
msgstr ""
-#: solvespace.cpp:986
+#: solvespace.cpp:987
#, c-format
msgid "Couldn't write to '%s'"
msgstr ""
-#: solvespace.cpp:1016
+#: solvespace.cpp:1017
msgid "The mesh is self-intersecting (NOT okay, invalid)."
msgstr ""
-#: solvespace.cpp:1017
+#: solvespace.cpp:1018
msgid "The mesh is not self-intersecting (okay, valid)."
msgstr ""
-#: solvespace.cpp:1019
+#: solvespace.cpp:1020
msgid "The mesh has naked edges (NOT okay, invalid)."
msgstr ""
-#: solvespace.cpp:1020
+#: solvespace.cpp:1021
msgid "The mesh is watertight (okay, valid)."
msgstr ""
-#: solvespace.cpp:1023
+#: solvespace.cpp:1024
#, c-format
msgid ""
"\n"
@@ -1707,7 +1715,7 @@ msgid ""
"The model contains %d triangles, from %d surfaces."
msgstr ""
-#: solvespace.cpp:1027
+#: solvespace.cpp:1028
#, c-format
msgid ""
"%s\n"
@@ -1717,7 +1725,7 @@ msgid ""
"Zero problematic edges, good.%s"
msgstr ""
-#: solvespace.cpp:1030
+#: solvespace.cpp:1031
#, c-format
msgid ""
"%s\n"
@@ -1727,7 +1735,7 @@ msgid ""
"%d problematic edges, bad.%s"
msgstr ""
-#: solvespace.cpp:1043
+#: solvespace.cpp:1044
#, c-format
msgid ""
"This is SolveSpace version %s.\n"
@@ -1754,23 +1762,23 @@ msgstr ""
msgid "Style name cannot be empty"
msgstr ""
-#: textscreens.cpp:785
+#: textscreens.cpp:791
msgid "Can't repeat fewer than 1 time."
msgstr ""
-#: textscreens.cpp:789
+#: textscreens.cpp:795
msgid "Can't repeat more than 999 times."
msgstr ""
-#: textscreens.cpp:814
+#: textscreens.cpp:820
msgid "Group name cannot be empty"
msgstr ""
-#: textscreens.cpp:866
+#: textscreens.cpp:872
msgid "Opacity must be between zero and one."
msgstr ""
-#: textscreens.cpp:901
+#: textscreens.cpp:907
msgid "Radius cannot be zero or negative."
msgstr ""
diff --git a/res/win32/versioninfo.rc.in b/res/win32/versioninfo.rc.in
index e6e90056..1aba0522 100644
--- a/res/win32/versioninfo.rc.in
+++ b/res/win32/versioninfo.rc.in
@@ -1,6 +1,6 @@
1 VERSIONINFO
-FILEVERSION ${solvespace_VERSION_MAJOR},${solvespace_VERSION_MINOR},0,0
-PRODUCTVERSION ${solvespace_VERSION_MAJOR},${solvespace_VERSION_MINOR},0,0
+FILEVERSION ${PROJECT_VERSION_MAJOR},${PROJECT_VERSION_MINOR},0,0
+PRODUCTVERSION ${PROJECT_VERSION_MAJOR},${PROJECT_VERSION_MINOR},0,0
FILEFLAGSMASK 0
FILEFLAGS 0
FILEOS VOS_NT_WINDOWS32
@@ -13,12 +13,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "The SolveSpace authors"
VALUE "ProductName", "SolveSpace"
- VALUE "ProductVersion", "${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR}~${solvespace_GIT_HASH}"
+ VALUE "ProductVersion", "${PROJECT_VERSION}~${solvespace_GIT_HASH}"
VALUE "FileDescription", "SolveSpace, a parametric 2d/3d CAD"
- VALUE "FileVersion", "${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR}~${solvespace_GIT_HASH}"
+ VALUE "FileVersion", "${PROJECT_VERSION}~${solvespace_GIT_HASH}"
VALUE "OriginalFilename", "solvespace.exe"
VALUE "InternalName", "solvespace"
- VALUE "LegalCopyright", "(c) 2008-2021 Jonathan Westhues and other authors"
+ VALUE "LegalCopyright", "(c) 2008-2022 Jonathan Westhues and other authors"
END
END
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 7bc5a7cd..a6af09a9 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -19,32 +19,63 @@ endif()
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
${CMAKE_CURRENT_BINARY_DIR}/config.h)
+# solvespace dependencies
+add_library(slvs_deps INTERFACE)
+target_include_directories(slvs_deps INTERFACE SYSTEM
+ ${OPENGL_INCLUDE_DIR}
+ ${ZLIB_INCLUDE_DIR}
+ ${PNG_PNG_INCLUDE_DIR}
+ ${FREETYPE_INCLUDE_DIRS}
+ ${CAIRO_INCLUDE_DIRS}
+ ${MIMALLOC_INCLUDE_DIR}
+ ${EIGEN3_INCLUDE_DIRS})
+target_link_libraries(slvs_deps INTERFACE
+ dxfrw
+ ${ZLIB_LIBRARY}
+ ${PNG_LIBRARY}
+ ${FREETYPE_LIBRARY}
+ ${CAIRO_LIBRARIES}
+ mimalloc-static)
+
+if(Backtrace_FOUND)
+ target_include_directories(slvs_deps INTERFACE SYSTEM
+ ${Backtrace_INCLUDE_DIRS})
+ target_link_libraries(slvs_deps INTERFACE
+ ${Backtrace_LIBRARY})
+endif()
+
+if(SPACEWARE_FOUND)
+ target_include_directories(slvs_deps INTERFACE SYSTEM
+ ${SPACEWARE_INCLUDE_DIR})
+ target_link_libraries(slvs_deps INTERFACE
+ ${SPACEWARE_LIBRARIES})
+endif()
+
+if(ENABLE_OPENMP)
+ target_link_libraries(slvs_deps INTERFACE slvs_openmp)
+endif()
+
+target_compile_options(slvs_deps
+ INTERFACE ${COVERAGE_FLAGS})
+
# platform utilities
if(APPLE)
- set(util_LIBRARIES
+ target_link_libraries(slvs_deps INTERFACE
${APPKIT_LIBRARY})
endif()
# libslvs
-
-set(libslvs_SOURCES
+add_library(slvs SHARED
+ solvespace.h
+ platform/platform.h
util.cpp
entity.cpp
expr.cpp
constraint.cpp
constrainteq.cpp
system.cpp
- platform/platform.cpp)
-
-set(libslvs_HEADERS
- solvespace.h
- platform/platform.h)
-
-add_library(slvs SHARED
- ${libslvs_SOURCES}
- ${libslvs_HEADERS}
- ${util_SOURCES}
+ platform/platform.cpp
lib.cpp)
target_compile_definitions(slvs
@@ -53,16 +84,11 @@ target_compile_definitions(slvs
target_include_directories(slvs
PUBLIC ${CMAKE_SOURCE_DIR}/include)
-target_link_libraries(slvs
- ${util_LIBRARIES}
- mimalloc-static)
-
-add_dependencies(slvs
- mimalloc-static)
+target_link_libraries(slvs PRIVATE slvs_deps)
set_target_properties(slvs PROPERTIES
PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/slvs.h
- VERSION ${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR}
+ VERSION ${PROJECT_VERSION}
SOVERSION 1)
if(NOT WIN32)
@@ -72,70 +98,6 @@ if(NOT WIN32)
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
endif()
-# solvespace dependencies
-
-include_directories(
- ${OPENGL_INCLUDE_DIR}
- ${ZLIB_INCLUDE_DIR}
- ${PNG_PNG_INCLUDE_DIR}
- ${FREETYPE_INCLUDE_DIRS}
- ${CAIRO_INCLUDE_DIRS}
- ${MIMALLOC_INCLUDE_DIR}
- ${OpenMP_CXX_INCLUDE_DIRS})
-
-if(Backtrace_FOUND)
- include_directories(
- ${Backtrace_INCLUDE_DIRS})
-endif()
-
-if(SPACEWARE_FOUND)
- include_directories(
- ${SPACEWARE_INCLUDE_DIR})
-endif()
-
-if(OPENGL STREQUAL 3)
- set(gl_SOURCES
- render/gl3shader.cpp
- render/rendergl3.cpp)
-elseif(OPENGL STREQUAL 1)
- set(gl_SOURCES
- render/rendergl1.cpp)
-else()
- message(FATAL_ERROR "Unsupported OpenGL version ${OPENGL}")
-endif()
-
-set(platform_SOURCES
- ${gl_SOURCES}
- platform/entrygui.cpp)
-
-if(WIN32)
- list(APPEND platform_SOURCES
- platform/guiwin.cpp)
-
- set(platform_LIBRARIES
- comctl32
- ${SPACEWARE_LIBRARIES})
-elseif(APPLE)
- add_compile_options(
- -DGL_SILENCE_DEPRECATION
- -fobjc-arc)
-
- list(APPEND platform_SOURCES
- platform/guimac.mm)
-else()
- list(APPEND platform_SOURCES
- platform/guigtk.cpp)
-
- set(platform_LIBRARIES
- ${SPACEWARE_LIBRARIES})
-
- foreach(pkg_config_lib GTKMM JSONC FONTCONFIG)
- include_directories(${${pkg_config_lib}_INCLUDE_DIRS})
- link_directories(${${pkg_config_lib}_LIBRARY_DIRS})
- list(APPEND platform_LIBRARIES ${${pkg_config_lib}_LIBRARIES})
- endforeach()
-endif()
-
set(every_platform_SOURCES
platform/guiwin.cpp
platform/guigtk.cpp
@@ -143,7 +105,10 @@ set(every_platform_SOURCES
# solvespace library
-set(solvespace_core_HEADERS
+set(solvespace_core_gl_SOURCES
+ solvespace.cpp)
+
+add_library(solvespace-core STATIC
dsc.h
expr.h
polygon.h
@@ -153,9 +118,7 @@ set(solvespace_core_HEADERS
platform/platform.h
render/render.h
render/gl3shader.h
- srf/surface.h)
-
-set(solvespace_core_SOURCES
+ srf/surface.h
bsp.cpp
clipboard.cpp
confscreen.cpp
@@ -207,40 +170,14 @@ set(solvespace_core_SOURCES
srf/surfinter.cpp
srf/triangulate.cpp)
-set(solvespace_core_gl_SOURCES
- solvespace.cpp)
-
-add_library(solvespace-core STATIC
- ${util_SOURCES}
- ${solvespace_core_HEADERS}
- ${solvespace_core_SOURCES})
-
-add_dependencies(solvespace-core
- mimalloc-static)
-
-target_link_libraries(solvespace-core
- ${OpenMP_CXX_LIBRARIES}
- dxfrw
- ${util_LIBRARIES}
- ${ZLIB_LIBRARY}
- ${PNG_LIBRARY}
- ${FREETYPE_LIBRARY}
- mimalloc-static)
-
-if(Backtrace_FOUND)
- target_link_libraries(solvespace-core
- ${Backtrace_LIBRARY})
-endif()
-
-target_compile_options(solvespace-core
- PRIVATE ${COVERAGE_FLAGS})
+target_link_libraries(solvespace-core PUBLIC slvs_deps)
# solvespace translations
if(HAVE_GETTEXT)
+ get_target_property(solvespace_core_SOURCES solvespace-core SOURCES)
set(inputs
${solvespace_core_SOURCES}
- ${solvespace_core_HEADERS}
${every_platform_SOURCES}
${solvespace_core_gl_SOURCES})
@@ -267,7 +204,7 @@ if(HAVE_GETTEXT)
--keyword --keyword=_ --keyword=N_ --keyword=C_:2,1c --keyword=CN_:2,1c
--force-po --width=100 --sort-by-file
--package-name=SolveSpace
- --package-version=${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR}
+ --package-version=${PROJECT_VERSION}
"--copyright-holder=the PACKAGE authors"
--msgid-bugs-address=whitequark@whitequark.org
--from-code=utf-8 --output=${gen_output_pot} ${inputs}
@@ -323,52 +260,86 @@ endif()
if(ENABLE_GUI)
add_executable(solvespace WIN32 MACOSX_BUNDLE
${solvespace_core_gl_SOURCES}
- ${platform_SOURCES}
+ platform/entrygui.cpp
$)
add_dependencies(solvespace
resources)
target_link_libraries(solvespace
+ PRIVATE
solvespace-core
- ${OPENGL_LIBRARIES}
- ${platform_LIBRARIES}
- ${COVERAGE_LIBRARY})
+ ${OPENGL_LIBRARIES})
- if(MSVC)
- set_target_properties(solvespace PROPERTIES
- LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /INCREMENTAL:NO /OPT:REF")
+ # OpenGL version
+ if(OPENGL STREQUAL 3)
+ target_sources(solvespace PRIVATE
+ render/gl3shader.cpp
+ render/rendergl3.cpp)
+ elseif(OPENGL STREQUAL 1)
+ target_sources(solvespace PRIVATE
+ render/rendergl1.cpp)
+ else()
+ message(FATAL_ERROR "Unsupported OpenGL version ${OPENGL}")
+ endif()
+
+ # Platform-specific
+ if(WIN32)
+ target_sources(solvespace PRIVATE
+ platform/guiwin.cpp)
+
+ target_link_libraries(solvespace PRIVATE comctl32)
elseif(APPLE)
+ target_compile_options(solvespace PRIVATE -fobjc-arc)
+ target_compile_definitions(solvespace PRIVATE GL_SILENCE_DEPRECATION)
+
+ target_sources(solvespace PRIVATE
+ platform/guimac.mm)
set_target_properties(solvespace PROPERTIES
OUTPUT_NAME SolveSpace
XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME "YES"
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.solvespace"
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
+ else()
+ target_sources(solvespace PRIVATE
+ platform/guigtk.cpp)
+
+ target_include_directories(solvespace PRIVATE SYSTEM
+ ${GTKMM_INCLUDE_DIRS}
+ ${JSONC_INCLUDE_DIRS}
+ ${FONTCONFIG_INCLUDE_DIRS})
+ target_link_directories(solvespace PRIVATE
+ ${GTKMM_LIBRARY_DIRS}
+ ${JSONC_LIBRARY_DIRS}
+ ${FONTCONFIG_LIBRARY_DIRS})
+ target_link_libraries(solvespace PRIVATE
+ ${GTKMM_LIBRARIES}
+ ${JSONC_LIBRARIES}
+ ${FONTCONFIG_LIBRARIES})
+ endif()
+
+ if(MSVC)
+ set_target_properties(solvespace PROPERTIES
+ LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /INCREMENTAL:NO /OPT:REF")
endif()
endif()
# solvespace headless library
-set(headless_SOURCES
+add_library(solvespace-headless STATIC EXCLUDE_FROM_ALL
+ ${solvespace_core_gl_SOURCES}
platform/guinone.cpp
render/rendercairo.cpp)
-add_library(solvespace-headless STATIC EXCLUDE_FROM_ALL
- ${solvespace_core_gl_SOURCES}
- ${headless_SOURCES})
-
target_compile_definitions(solvespace-headless
- PRIVATE -DHEADLESS)
+ PRIVATE HEADLESS)
target_include_directories(solvespace-headless
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(solvespace-headless
- solvespace-core
- ${CAIRO_LIBRARIES})
-
-target_compile_options(solvespace-headless
- PRIVATE ${COVERAGE_FLAGS})
+ PRIVATE
+ solvespace-core)
# solvespace command-line executable
@@ -432,4 +403,4 @@ if(APPLE)
COMMENT "Bundling executable solvespace-cli"
VERBATIM)
endif()
-endif()
\ No newline at end of file
+endif()
diff --git a/src/config.h.in b/src/config.h.in
index 144c46d0..187b9cbc 100644
--- a/src/config.h.in
+++ b/src/config.h.in
@@ -1,7 +1,8 @@
#ifndef SOLVESPACE_CONFIG_H
#define SOLVESPACE_CONFIG_H
-#define PACKAGE_VERSION "@solvespace_VERSION_MAJOR@.@solvespace_VERSION_MINOR@~@solvespace_GIT_HASH@"
+#define PACKAGE_VERSION "@PROJECT_VERSION@~@solvespace_GIT_HASH@"
+#define GIT_HASH_URL "https://github.com/solvespace/solvespace/commit/@solvespace_GIT_HASH@"
/* Non-OS X *nix only */
#define UNIX_DATADIR "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_DATAROOTDIR@/solvespace"
diff --git a/src/describescreen.cpp b/src/describescreen.cpp
index 2c36d988..d2f94503 100644
--- a/src/describescreen.cpp
+++ b/src/describescreen.cpp
@@ -69,12 +69,19 @@ void TextWindow::DescribeSelection() {
Entity *e = SK.GetEntity(gs.points == 1 ? gs.point[0] : gs.entity[0]);
Vector p;
-#define COSTR(p) \
+#define COSTR_NO_LINK(p) \
SS.MmToString((p).x).c_str(), \
SS.MmToString((p).y).c_str(), \
SS.MmToString((p).z).c_str()
-#define PT_AS_STR "(%Fi%s%E, %Fi%s%E, %Fi%s%E)"
-#define PT_AS_NUM "(%Fi%3%E, %Fi%3%E, %Fi%3%E)"
+#define PT_AS_STR_NO_LINK "(%Fi%s%Fd, %Fi%s%Fd, %Fi%s%Fd)"
+#define PT_AS_NUM "(%Fi%3%Fd, %Fi%3%Fd, %Fi%3%Fd)"
+#define COSTR(e, p) \
+ e->h, (&TextWindow::ScreenSelectEntity), (&TextWindow::ScreenHoverEntity), \
+ COSTR_NO_LINK(p)
+#define PT_AS_STR "%Ll%D%f%h" PT_AS_STR_NO_LINK "%E"
+#define CO_LINK(e, p) e->h, (&TextWindow::ScreenSelectEntity), (&TextWindow::ScreenHoverEntity), CO(p)
+#define PT_AS_NUM_LINK "%Ll%D%f%h" PT_AS_NUM "%E"
+
switch(e->type) {
case Entity::Type::POINT_IN_3D:
case Entity::Type::POINT_IN_2D:
@@ -83,7 +90,7 @@ void TextWindow::DescribeSelection() {
case Entity::Type::POINT_N_COPY:
case Entity::Type::POINT_N_ROT_AA:
p = e->PointGetNum();
- Printf(false, "%FtPOINT%E at " PT_AS_STR, COSTR(p));
+ Printf(false, "%FtPOINT%E at " PT_AS_STR, COSTR(e, p));
break;
case Entity::Type::NORMAL_IN_3D:
@@ -104,20 +111,20 @@ void TextWindow::DescribeSelection() {
case Entity::Type::WORKPLANE: {
p = SK.GetEntity(e->point[0])->PointGetNum();
Printf(false, "%FtWORKPLANE%E");
- Printf(true, " origin = " PT_AS_STR, COSTR(p));
+ Printf(true, " origin = " PT_AS_STR, COSTR(SK.GetEntity(e->point[0]), p));
Quaternion q = e->Normal()->NormalGetNum();
p = q.RotationN();
- Printf(true, " normal = " PT_AS_NUM, CO(p));
+ Printf(true, " normal = " PT_AS_NUM_LINK, CO_LINK(e->Normal(), p));
break;
}
case Entity::Type::LINE_SEGMENT: {
Vector p0 = SK.GetEntity(e->point[0])->PointGetNum();
p = p0;
Printf(false, "%FtLINE SEGMENT%E");
- Printf(true, " thru " PT_AS_STR, COSTR(p));
+ Printf(true, " thru " PT_AS_STR, COSTR(SK.GetEntity(e->point[0]), p));
Vector p1 = SK.GetEntity(e->point[1])->PointGetNum();
p = p1;
- Printf(false, " " PT_AS_STR, COSTR(p));
+ Printf(false, " " PT_AS_STR, COSTR(SK.GetEntity(e->point[1]), p));
Printf(true, " len = %Fi%s%E",
SS.MmToString((p1.Minus(p0).Magnitude())).c_str());
break;
@@ -137,18 +144,18 @@ void TextWindow::DescribeSelection() {
}
for(int i = 0; i < pts; i++) {
p = SK.GetEntity(e->point[i])->PointGetNum();
- Printf((i==0), " p%d = " PT_AS_STR, i, COSTR(p));
+ Printf((i==0), " p%d = " PT_AS_STR, i, COSTR(SK.GetEntity(e->point[i]), p));
}
break;
case Entity::Type::ARC_OF_CIRCLE: {
Printf(false, "%FtARC OF A CIRCLE%E");
p = SK.GetEntity(e->point[0])->PointGetNum();
- Printf(true, " center = " PT_AS_STR, COSTR(p));
+ Printf(true, " center = " PT_AS_STR, COSTR(SK.GetEntity(e->point[0]), p));
p = SK.GetEntity(e->point[1])->PointGetNum();
- Printf(true, " endpoints = " PT_AS_STR, COSTR(p));
+ Printf(true, " endpoints = " PT_AS_STR, COSTR(SK.GetEntity(e->point[1]), p));
p = SK.GetEntity(e->point[2])->PointGetNum();
- Printf(false, " " PT_AS_STR, COSTR(p));
+ Printf(false, " " PT_AS_STR, COSTR(SK.GetEntity(e->point[2]), p));
double r = e->CircleGetRadiusNum();
Printf(true, " diameter = %Fi%s", SS.MmToString(r*2).c_str());
Printf(false, " radius = %Fi%s", SS.MmToString(r).c_str());
@@ -160,7 +167,7 @@ void TextWindow::DescribeSelection() {
case Entity::Type::CIRCLE: {
Printf(false, "%FtCIRCLE%E");
p = SK.GetEntity(e->point[0])->PointGetNum();
- Printf(true, " center = " PT_AS_STR, COSTR(p));
+ Printf(true, " center = " PT_AS_STR, COSTR(SK.GetEntity(e->point[0]), p));
double r = e->CircleGetRadiusNum();
Printf(true, " diameter = %Fi%s", SS.MmToString(r*2).c_str());
Printf(false, " radius = %Fi%s", SS.MmToString(r).c_str());
@@ -175,7 +182,7 @@ void TextWindow::DescribeSelection() {
p = e->FaceGetNormalNum();
Printf(true, " normal = " PT_AS_NUM, CO(p));
p = e->FaceGetPointNum();
- Printf(false, " thru = " PT_AS_STR, COSTR(p));
+ Printf(false, " thru = " PT_AS_STR, COSTR(e, p));
break;
case Entity::Type::TTF_TEXT: {
@@ -315,12 +322,12 @@ void TextWindow::DescribeSelection() {
} else if(gs.n == 2 && gs.points == 2) {
Printf(false, "%FtTWO POINTS");
Vector p0 = SK.GetEntity(gs.point[0])->PointGetNum();
- Printf(true, " at " PT_AS_STR, COSTR(p0));
+ Printf(true, " at " PT_AS_STR, COSTR(SK.GetEntity(gs.point[0]), p0));
Vector p1 = SK.GetEntity(gs.point[1])->PointGetNum();
- Printf(false, " " PT_AS_STR, COSTR(p1));
+ Printf(false, " " PT_AS_STR, COSTR(SK.GetEntity(gs.point[1]), p1));
Vector dv = p1.Minus(p0);
Printf(true, " d = %Fi%s", SS.MmToString(dv.Magnitude()).c_str());
- Printf(false, " d(x, y, z) = " PT_AS_STR, COSTR(dv));
+ Printf(false, " d(x, y, z) = " PT_AS_STR_NO_LINK, COSTR_NO_LINK(dv));
} else if(gs.n == 2 && gs.points == 1 && gs.circlesOrArcs == 1) {
Entity *ec = SK.GetEntity(gs.entity[0]);
if(ec->type == Entity::Type::CIRCLE) {
@@ -329,9 +336,9 @@ void TextWindow::DescribeSelection() {
Printf(false, "%FtPOINT AND AN ARC");
} else ssassert(false, "Unexpected entity type");
Vector p = SK.GetEntity(gs.point[0])->PointGetNum();
- Printf(true, " pt at " PT_AS_STR, COSTR(p));
+ Printf(true, " pt at " PT_AS_STR, COSTR(SK.GetEntity(gs.point[0]), p));
Vector c = SK.GetEntity(ec->point[0])->PointGetNum();
- Printf(true, " center = " PT_AS_STR, COSTR(c));
+ Printf(true, " center = " PT_AS_STR, COSTR(SK.GetEntity(ec->point[0]), c));
double r = ec->CircleGetRadiusNum();
Printf(false, " diameter = %Fi%s", SS.MmToString(r*2).c_str());
Printf(false, " radius = %Fi%s", SS.MmToString(r).c_str());
@@ -340,22 +347,22 @@ void TextWindow::DescribeSelection() {
} else if(gs.n == 2 && gs.faces == 1 && gs.points == 1) {
Printf(false, "%FtA POINT AND A PLANE FACE");
Vector pt = SK.GetEntity(gs.point[0])->PointGetNum();
- Printf(true, " point = " PT_AS_STR, COSTR(pt));
+ Printf(true, " point = " PT_AS_STR, COSTR(SK.GetEntity(gs.point[0]), pt));
Vector n = SK.GetEntity(gs.face[0])->FaceGetNormalNum();
Printf(true, " plane normal = " PT_AS_NUM, CO(n));
Vector pl = SK.GetEntity(gs.face[0])->FaceGetPointNum();
- Printf(false, " plane thru = " PT_AS_STR, COSTR(pl));
+ Printf(false, " plane thru = " PT_AS_STR, COSTR(SK.GetEntity(gs.face[0]), pl));
double dd = n.Dot(pl) - n.Dot(pt);
Printf(true, " distance = %Fi%s", SS.MmToString(dd).c_str());
} else if(gs.n == 3 && gs.points == 2 && gs.vectors == 1) {
Printf(false, "%FtTWO POINTS AND A VECTOR");
Vector p0 = SK.GetEntity(gs.point[0])->PointGetNum();
- Printf(true, " pointA = " PT_AS_STR, COSTR(p0));
+ Printf(true, " pointA = " PT_AS_STR, COSTR(SK.GetEntity(gs.point[0]), p0));
Vector p1 = SK.GetEntity(gs.point[1])->PointGetNum();
- Printf(false, " pointB = " PT_AS_STR, COSTR(p1));
+ Printf(false, " pointB = " PT_AS_STR, COSTR(SK.GetEntity(gs.point[1]), p1));
Vector v = SK.GetEntity(gs.vector[0])->VectorGetNum();
v = v.WithMagnitude(1);
- Printf(true, " vector = " PT_AS_NUM, CO(v));
+ Printf(true, " vector = " PT_AS_NUM_LINK, CO_LINK(SK.GetEntity(gs.vector[0]), v));
double d = (p1.Minus(p0)).Dot(v);
Printf(true, " proj_d = %Fi%s", SS.MmToString(d).c_str());
} else if(gs.n == 2 && gs.lineSegments == 1 && gs.points == 1) {
@@ -363,11 +370,11 @@ void TextWindow::DescribeSelection() {
Vector lp0 = SK.GetEntity(ln->point[0])->PointGetNum(),
lp1 = SK.GetEntity(ln->point[1])->PointGetNum();
Printf(false, "%FtLINE SEGMENT AND POINT%E");
- Printf(true, " ln thru " PT_AS_STR, COSTR(lp0));
- Printf(false, " " PT_AS_STR, COSTR(lp1));
+ Printf(true, " ln thru " PT_AS_STR, COSTR(SK.GetEntity(ln->point[0]), lp0));
+ Printf(false, " " PT_AS_STR, COSTR(SK.GetEntity(ln->point[1]), lp1));
Entity *p = SK.GetEntity(gs.point[0]);
Vector pp = p->PointGetNum();
- Printf(true, " point " PT_AS_STR, COSTR(pp));
+ Printf(true, " point " PT_AS_STR, COSTR(p, pp));
Printf(true, " pt-ln distance = %Fi%s%E",
SS.MmToString(pp.DistanceToLine(lp0, lp1.Minus(lp0))).c_str());
hEntity wrkpl = SS.GW.ActiveWorkplane();
@@ -386,8 +393,8 @@ void TextWindow::DescribeSelection() {
v0 = v0.WithMagnitude(1);
v1 = v1.WithMagnitude(1);
- Printf(true, " vectorA = " PT_AS_NUM, CO(v0));
- Printf(false, " vectorB = " PT_AS_NUM, CO(v1));
+ Printf(true, " vectorA = " PT_AS_NUM_LINK, CO_LINK(SK.GetEntity(gs.entity[0]), v0));
+ Printf(false, " vectorB = " PT_AS_NUM_LINK, CO_LINK(SK.GetEntity(gs.entity[1]), v1));
double theta = acos(v0.Dot(v1));
Printf(true, " angle = %Fi%2%E degrees", theta*180/PI);
@@ -400,12 +407,12 @@ void TextWindow::DescribeSelection() {
Vector n0 = SK.GetEntity(gs.face[0])->FaceGetNormalNum();
Printf(true, " planeA normal = " PT_AS_NUM, CO(n0));
Vector p0 = SK.GetEntity(gs.face[0])->FaceGetPointNum();
- Printf(false, " planeA thru = " PT_AS_STR, COSTR(p0));
+ Printf(false, " planeA thru = " PT_AS_STR, COSTR(SK.GetEntity(gs.face[0]), p0));
Vector n1 = SK.GetEntity(gs.face[1])->FaceGetNormalNum();
Printf(true, " planeB normal = " PT_AS_NUM, CO(n1));
Vector p1 = SK.GetEntity(gs.face[1])->FaceGetPointNum();
- Printf(false, " planeB thru = " PT_AS_STR, COSTR(p1));
+ Printf(false, " planeB thru = " PT_AS_STR, COSTR(SK.GetEntity(gs.face[1]), p1));
double theta = acos(n0.Dot(n1));
Printf(true, " angle = %Fi%2%E degrees", theta*180/PI);
diff --git a/src/expr.cpp b/src/expr.cpp
index 99d68ec4..d5ed87b5 100644
--- a/src/expr.cpp
+++ b/src/expr.cpp
@@ -400,15 +400,24 @@ Expr *Expr::PartialWrt(hParam p) const {
ssassert(false, "Unexpected operation");
}
-uint64_t Expr::ParamsUsed() const {
- uint64_t r = 0;
- if(op == Op::PARAM) r |= ((uint64_t)1 << (parh.v % 61));
- if(op == Op::PARAM_PTR) r |= ((uint64_t)1 << (parp->h.v % 61));
+void Expr::ParamsUsedList(std::vector *list) const {
+ if(op == Op::PARAM || op == Op::PARAM_PTR) {
+ // leaf: just add ourselves if we aren't already there
+ hParam param = (op == Op::PARAM) ? parh : parp->h;
+ if(list->end() != std::find_if(list->begin(), list->end(),
+ [=](const hParam &p) { return p.v == param.v; })) {
+ // We found ourselves in the list already, early out.
+ return;
+ }
+ list->push_back(param);
+ return;
+ }
int c = Children();
- if(c >= 1) r |= a->ParamsUsed();
- if(c >= 2) r |= b->ParamsUsed();
- return r;
+ if(c >= 1) {
+ a->ParamsUsedList(list);
+ if(c >= 2) b->ParamsUsedList(list);
+ }
}
bool Expr::DependsOn(hParam p) const {
@@ -424,6 +433,11 @@ bool Expr::DependsOn(hParam p) const {
bool Expr::Tol(double a, double b) {
return fabs(a - b) < 0.001;
}
+
+bool Expr::IsZeroConst() const {
+ return op == Op::CONSTANT && EXACT(v == 0.0);
+}
+
Expr *Expr::FoldConstants() {
Expr *n = AllocExpr();
*n = *this;
diff --git a/src/expr.h b/src/expr.h
index 7109cf65..7eef4e00 100644
--- a/src/expr.h
+++ b/src/expr.h
@@ -70,9 +70,10 @@ public:
Expr *PartialWrt(hParam p) const;
double Eval() const;
- uint64_t ParamsUsed() const;
+ void ParamsUsedList(std::vector *list) const;
bool DependsOn(hParam p) const;
static bool Tol(double a, double b);
+ bool IsZeroConst() const;
Expr *FoldConstants();
void Substitute(hParam oldh, hParam newh);
diff --git a/src/generate.cpp b/src/generate.cpp
index ec8f82eb..fdb19b80 100644
--- a/src/generate.cpp
+++ b/src/generate.cpp
@@ -550,8 +550,11 @@ void SolveSpaceUI::SolveGroup(hGroup hg, bool andFindFree) {
}
SolveResult SolveSpaceUI::TestRankForGroup(hGroup hg, int *rank) {
- WriteEqSystemForGroup(hg);
Group *g = SK.GetGroup(hg);
+ // If we don't calculate dof or redundant is allowed, there is
+ // no point to solve rank because this result is not meaningful
+ if(g->suppressDofCalculation || g->allowRedundant) return SolveResult::OKAY;
+ WriteEqSystemForGroup(hg);
SolveResult result = sys.SolveRank(g, rank);
FreeAllTemporary();
return result;
diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp
index cac542ae..c7c74d98 100644
--- a/src/graphicswin.cpp
+++ b/src/graphicswin.cpp
@@ -183,6 +183,7 @@ const MenuEntry Menu[] = {
{ 0, N_("&Help"), Command::NONE, 0, KN, mHelp },
{ 1, N_("&Language"), Command::LOCALE, 0, KN, mHelp },
{ 1, N_("&Website / Manual"), Command::WEBSITE, 0, KN, mHelp },
+{ 1, N_("&Go to GitHub commit"), Command::GITHUB, 0, KN, mHelp },
#ifndef __APPLE__
{ 1, N_("&About"), Command::ABOUT, 0, KN, mHelp },
#endif
diff --git a/src/group.cpp b/src/group.cpp
index 1cb1a1b8..529fce64 100644
--- a/src/group.cpp
+++ b/src/group.cpp
@@ -136,10 +136,14 @@ void Group::MenuGroup(Command id, Platform::Path linkFile) {
g.predef.negateV = wrkplg->predef.negateV;
} else if(wrkplg->subtype == Subtype::WORKPLANE_BY_POINT_ORTHO) {
g.predef.q = wrkplg->predef.q;
+ } else if(wrkplg->subtype == Subtype::WORKPLANE_BY_POINT_NORMAL) {
+ g.predef.q = wrkplg->predef.q;
+ g.predef.entityB = wrkplg->predef.entityB;
} else ssassert(false, "Unexpected workplane subtype");
}
} else if(gs.anyNormals == 1 && gs.points == 1 && gs.n == 2) {
g.subtype = Subtype::WORKPLANE_BY_POINT_NORMAL;
+ g.predef.entityB = gs.anyNormal[0];
g.predef.q = SK.GetEntity(gs.anyNormal[0])->NormalGetNum();
g.predef.origin = gs.point[0];
//} else if(gs.faces == 1 && gs.points == 1 && gs.n == 2) {
@@ -455,9 +459,11 @@ void Group::Generate(IdList *entity,
if(predef.negateU) u = u.ScaledBy(-1);
if(predef.negateV) v = v.ScaledBy(-1);
q = Quaternion::From(u, v);
- } else if(subtype == Subtype::WORKPLANE_BY_POINT_ORTHO || subtype == Subtype::WORKPLANE_BY_POINT_NORMAL /*|| subtype == Subtype::WORKPLANE_BY_POINT_FACE*/) {
+ } else if(subtype == Subtype::WORKPLANE_BY_POINT_ORTHO) {
// Already given, numerically.
q = predef.q;
+ } else if(subtype == Subtype::WORKPLANE_BY_POINT_NORMAL) {
+ q = SK.GetEntity(predef.entityB)->NormalGetNum();
} else ssassert(false, "Unexpected workplane subtype");
Entity normal = {};
diff --git a/src/importmesh.cpp b/src/importmesh.cpp
index df9a65bf..f06a8f1b 100644
--- a/src/importmesh.cpp
+++ b/src/importmesh.cpp
@@ -10,7 +10,7 @@
#define MIN_POINT_DISTANCE 0.001
-// we will check for duplicate verticies and keep all their normals
+// we will check for duplicate vertices and keep all their normals
class vertex {
public:
Vector p;
@@ -47,7 +47,7 @@ static void addUnique(std::vector &lv, Vector &p, Vector &n) {
};
// Make a new point - type doesn't matter since we will make a copy later
-static hEntity newPoint(EntityList *el, int id, Vector p) {
+static hEntity newPoint(EntityList *el, int *id, Vector p) {
Entity en = {};
en.type = Entity::Type::POINT_N_COPY;
en.extraPoints = 0;
@@ -59,7 +59,8 @@ static hEntity newPoint(EntityList *el, int id, Vector p) {
en.actVisible = true;
en.forceHidden = false;
- en.h.v = id + en.group.v*65536;
+ en.h.v = *id + en.group.v*65536;
+ *id = *id+1;
el->Add(&en);
return en.h;
}
@@ -67,12 +68,34 @@ static hEntity newPoint(EntityList *el, int id, Vector p) {
// check if a vertex is unique and add it via newPoint if it is.
static void addVertex(EntityList *el, Vector v) {
if(el->n < 15000) {
- int id = el->n+2;
- newPoint(el, id, v);
+ int id = el->n;
+ newPoint(el, &id, v);
}
}
-static hEntity newLine(EntityList *el, int id, hEntity p0, hEntity p1) {
+static hEntity newNormal(EntityList *el, int *id, Quaternion normal, hEntity p) {
+ // normals have parameters, but we don't need them to make a NORMAL_N_COPY from this
+ Entity en = {};
+ en.type = Entity::Type::NORMAL_N_COPY;
+ en.extraPoints = 0;
+ en.timesApplied = 0;
+ en.group.v = 472;
+ en.actNormal = normal;
+ en.construction = false;
+ en.style.v = Style::NORMALS;
+ // to be visible we need to add a point.
+// en.point[0] = newPoint(el, id, Vector::From(0,0,0));
+ en.point[0] = p;
+ en.actVisible = true;
+ en.forceHidden = false;
+
+ *id = *id+1;
+ en.h.v = *id + en.group.v*65536;
+ el->Add(&en);
+ return en.h;
+}
+
+static hEntity newLine(EntityList *el, int *id, hEntity p0, hEntity p1) {
Entity en = {};
en.type = Entity::Type::LINE_SEGMENT;
en.point[0] = p0;
@@ -85,7 +108,8 @@ static hEntity newLine(EntityList *el, int id, hEntity p0, hEntity p1) {
en.actVisible = true;
en.forceHidden = false;
- en.h.v = id + en.group.v*65536;
+ en.h.v = *id + en.group.v*65536;
+ *id = *id + 1;
el->Add(&en);
return en.h;
}
@@ -106,6 +130,13 @@ bool LinkStl(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s
char str[80] = {};
f.read(str, 80);
+ if(0==memcmp("solid", str, 5)) {
+ // just returning false will trigger the warning that linked file is not present
+ // best solution is to add an importer for text STL.
+ Message(_("Text-formated STL files are not currently supported"));
+ return false;
+ }
+
uint32_t n;
uint32_t color;
@@ -115,9 +146,6 @@ bool LinkStl(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s
float x,y,z;
float xn,yn,zn;
- //add the STL origin as an entity
- addVertex(el, Vector::From(0.0, 0.0, 0.0));
-
std::vector verts = {};
for(uint32_t i = 0; in+2;
- p[0] = newPoint(el, id++, Vector::From(box.minp.x, box.minp.y, box.minp.z));
- p[1] = newPoint(el, id++, Vector::From(box.maxp.x, box.minp.y, box.minp.z));
- p[2] = newPoint(el, id++, Vector::From(box.minp.x, box.maxp.y, box.minp.z));
- p[3] = newPoint(el, id++, Vector::From(box.maxp.x, box.maxp.y, box.minp.z));
- p[4] = newPoint(el, id++, Vector::From(box.minp.x, box.minp.y, box.maxp.z));
- p[5] = newPoint(el, id++, Vector::From(box.maxp.x, box.minp.y, box.maxp.z));
- p[6] = newPoint(el, id++, Vector::From(box.minp.x, box.maxp.y, box.maxp.z));
- p[7] = newPoint(el, id++, Vector::From(box.maxp.x, box.maxp.y, box.maxp.z));
+ p[0] = newPoint(el, &id, Vector::From(box.minp.x, box.minp.y, box.minp.z));
+ p[1] = newPoint(el, &id, Vector::From(box.maxp.x, box.minp.y, box.minp.z));
+ p[2] = newPoint(el, &id, Vector::From(box.minp.x, box.maxp.y, box.minp.z));
+ p[3] = newPoint(el, &id, Vector::From(box.maxp.x, box.maxp.y, box.minp.z));
+ p[4] = newPoint(el, &id, Vector::From(box.minp.x, box.minp.y, box.maxp.z));
+ p[5] = newPoint(el, &id, Vector::From(box.maxp.x, box.minp.y, box.maxp.z));
+ p[6] = newPoint(el, &id, Vector::From(box.minp.x, box.maxp.y, box.maxp.z));
+ p[7] = newPoint(el, &id, Vector::From(box.maxp.x, box.maxp.y, box.maxp.z));
- newLine(el, id++, p[0], p[1]);
- newLine(el, id++, p[0], p[2]);
- newLine(el, id++, p[3], p[1]);
- newLine(el, id++, p[3], p[2]);
+ newLine(el, &id, p[0], p[1]);
+ newLine(el, &id, p[0], p[2]);
+ newLine(el, &id, p[3], p[1]);
+ newLine(el, &id, p[3], p[2]);
- newLine(el, id++, p[4], p[5]);
- newLine(el, id++, p[4], p[6]);
- newLine(el, id++, p[7], p[5]);
- newLine(el, id++, p[7], p[6]);
+ newLine(el, &id, p[4], p[5]);
+ newLine(el, &id, p[4], p[6]);
+ newLine(el, &id, p[7], p[5]);
+ newLine(el, &id, p[7], p[6]);
- newLine(el, id++, p[0], p[4]);
- newLine(el, id++, p[1], p[5]);
- newLine(el, id++, p[2], p[6]);
- newLine(el, id++, p[3], p[7]);
+ newLine(el, &id, p[0], p[4]);
+ newLine(el, &id, p[1], p[5]);
+ newLine(el, &id, p[2], p[6]);
+ newLine(el, &id, p[3], p[7]);
for(unsigned int i=0; i ReadPngIntoPixmap(png_struct *png_ptr, png_info *info_ptr,
bool flip) {
- png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND | PNG_TRANSFORM_GRAY_TO_RGB, NULL);
+ png_read_png(png_ptr, info_ptr,
+ PNG_TRANSFORM_EXPAND | PNG_TRANSFORM_GRAY_TO_RGB | PNG_TRANSFORM_SCALE_16, NULL);
std::shared_ptr pixmap = std::make_shared();
pixmap->width = png_get_image_width(png_ptr, info_ptr);
diff --git a/src/sketch.h b/src/sketch.h
index 812375f4..33853d96 100644
--- a/src/sketch.h
+++ b/src/sketch.h
@@ -175,6 +175,7 @@ public:
bool suppress;
bool relaxConstraints;
bool allowRedundant;
+ bool suppressDofCalculation;
bool allDimsReference;
double scale;
@@ -622,7 +623,7 @@ public:
bool free;
// Used only in the solver
- hParam substd;
+ Param *substd;
static const hParam NO_PARAM;
diff --git a/src/solvespace.cpp b/src/solvespace.cpp
index 78768871..a8d1a151 100644
--- a/src/solvespace.cpp
+++ b/src/solvespace.cpp
@@ -1053,7 +1053,11 @@ void SolveSpaceUI::MenuHelp(Command id) {
"law. For details, visit http://gnu.org/licenses/\n"
"\n"
"© 2008-%d Jonathan Westhues and other authors.\n"),
-PACKAGE_VERSION, 2021);
+PACKAGE_VERSION, 2022);
+ break;
+
+ case Command::GITHUB:
+ Platform::OpenInBrowser(GIT_HASH_URL);
break;
default: ssassert(false, "Unexpected menu ID");
diff --git a/src/solvespace.h b/src/solvespace.h
index 7305b8a8..1c22db62 100644
--- a/src/solvespace.h
+++ b/src/solvespace.h
@@ -34,6 +34,10 @@
#include
#include
+#define EIGEN_NO_DEBUG
+#undef Success
+#include
+
// We declare these in advance instead of simply using FT_Library
// (defined as typedef FT_LibraryRec_* FT_Library) because including
// freetype.h invokes indescribable horrors and we would like to avoid
@@ -211,7 +215,7 @@ void Error(const char *fmt, ...);
class System {
public:
- enum { MAX_UNKNOWNS = 1024 };
+ enum { MAX_UNKNOWNS = 2048 };
EntityList entity;
ParamList param;
@@ -233,37 +237,34 @@ public:
// The system Jacobian matrix
struct {
// The corresponding equation for each row
- hEquation eq[MAX_UNKNOWNS];
+ std::vector eq;
// The corresponding parameter for each column
- hParam param[MAX_UNKNOWNS];
+ std::vector param;
// We're solving AX = B
int m, n;
struct {
- Expr *sym[MAX_UNKNOWNS][MAX_UNKNOWNS];
- double num[MAX_UNKNOWNS][MAX_UNKNOWNS];
- } A;
+ // This only observes the Expr - does not own them!
+ Eigen::SparseMatrix sym;
+ Eigen::SparseMatrix num;
+ } A;
- double scale[MAX_UNKNOWNS];
-
- // Some helpers for the least squares solve
- double AAt[MAX_UNKNOWNS][MAX_UNKNOWNS];
- double Z[MAX_UNKNOWNS];
-
- double X[MAX_UNKNOWNS];
+ Eigen::VectorXd scale;
+ Eigen::VectorXd X;
struct {
- Expr *sym[MAX_UNKNOWNS];
- double num[MAX_UNKNOWNS];
- } B;
+ // This only observes the Expr - does not own them!
+ std::vector sym;
+ Eigen::VectorXd num;
+ } B;
} mat;
- static const double RANK_MAG_TOLERANCE, CONVERGE_TOLERANCE;
+ static const double CONVERGE_TOLERANCE;
int CalculateRank();
- bool TestRank(int *rank = NULL);
- static bool SolveLinearSystem(double X[], double A[][MAX_UNKNOWNS],
- double B[], int N);
+ bool TestRank(int *dof = NULL);
+ static bool SolveLinearSystem(const Eigen::SparseMatrix &A,
+ const Eigen::VectorXd &B, Eigen::VectorXd *X);
bool SolveLeastSquares();
bool WriteJacobian(int tag);
@@ -279,7 +280,6 @@ public:
bool NewtonSolve(int tag);
void MarkParamsFree(bool findFree);
- int CalculateDof();
SolveResult Solve(Group *g, int *rank = NULL, int *dof = NULL,
List *bad = NULL,
@@ -291,6 +291,9 @@ public:
bool andFindBad = false, bool andFindFree = false);
void Clear();
+ Param *GetLastParamSubstitution(Param *p);
+ void SubstituteParamsByLast(Expr *e);
+ void SortSubstitutionByDragged(Param *p);
};
#include "ttf.h"
diff --git a/src/system.cpp b/src/system.cpp
index 1119c343..c513796f 100644
--- a/src/system.cpp
+++ b/src/system.cpp
@@ -8,81 +8,152 @@
//-----------------------------------------------------------------------------
#include "solvespace.h"
-// This tolerance is used to determine whether two (linearized) constraints
-// are linearly dependent. If this is too small, then we will attempt to
-// solve truly inconsistent systems and fail. But if it's too large, then
-// we will give up on legitimate systems like a skinny right angle triangle by
-// its hypotenuse and long side.
-const double System::RANK_MAG_TOLERANCE = 1e-4;
+#include
+#include
// The solver will converge all unknowns to within this tolerance. This must
// always be much less than LENGTH_EPS, and in practice should be much less.
const double System::CONVERGE_TOLERANCE = (LENGTH_EPS/(1e2));
+constexpr size_t LikelyPartialCountPerEq = 10;
+
bool System::WriteJacobian(int tag) {
+ // Clear all
+ mat.param.clear();
+ mat.eq.clear();
+ mat.A.sym.setZero();
+ mat.B.sym.clear();
- int j = 0;
- for(auto &p : param) {
- if(j >= MAX_UNKNOWNS)
- return false;
-
- if(p.tag != tag)
- continue;
- mat.param[j] = p.h;
- j++;
+ for(Param &p : param) {
+ if(p.tag != tag) continue;
+ mat.param.push_back(p.h);
}
- mat.n = j;
+ mat.n = mat.param.size();
- int i = 0;
+ for(Equation &e : eq) {
+ if(e.tag != tag) continue;
+ mat.eq.push_back(&e);
+ }
+ mat.m = mat.eq.size();
+ mat.A.sym.resize(mat.m, mat.n);
+ mat.A.sym.reserve(Eigen::VectorXi::Constant(mat.n, LikelyPartialCountPerEq));
- for(auto &e : eq) {
- if(i >= MAX_UNKNOWNS) return false;
+ // Fill the param id to index map
+ std::map paramToIndex;
+ for(int j = 0; j < mat.n; j++) {
+ paramToIndex[mat.param[j].v] = j;
+ }
- if(e.tag != tag)
- continue;
+ if(mat.eq.size() >= MAX_UNKNOWNS) {
+ return false;
+ }
+ std::vector paramsUsed;
+ // In some experimenting, this is almost always the right size.
+ // Value is usually between 0 and 20, comes from number of constraints?
+ mat.B.sym.reserve(mat.eq.size());
+ for(size_t i = 0; i < mat.eq.size(); i++) {
+ Equation *e = mat.eq[i];
+ if(e->tag != tag) continue;
+ // Simplify (fold) then deep-copy the current equation.
+ Expr *f = e->e->FoldConstants();
+ f = f->DeepCopyWithParamsAsPointers(¶m, &(SK.param));
- mat.eq[i] = e.h;
- Expr *f = e.e->DeepCopyWithParamsAsPointers(¶m, &(SK.param));
- f = f->FoldConstants();
+ paramsUsed.clear();
+ f->ParamsUsedList(¶msUsed);
- // Hash table (61 bits) to accelerate generation of zero partials.
- uint64_t scoreboard = f->ParamsUsed();
- for(j = 0; j < mat.n; j++) {
- Expr *pd;
- if(scoreboard & ((uint64_t)1 << (mat.param[j].v % 61)) &&
- f->DependsOn(mat.param[j]))
- {
- pd = f->PartialWrt(mat.param[j]);
- pd = pd->FoldConstants();
- pd = pd->DeepCopyWithParamsAsPointers(¶m, &(SK.param));
- } else {
- pd = Expr::From(0.0);
- }
- mat.A.sym[i][j] = pd;
+ for(hParam &p : paramsUsed) {
+ // Find the index of this parameter
+ auto it = paramToIndex.find(p.v);
+ if(it == paramToIndex.end()) continue;
+ // this is the parameter index
+ const int j = it->second;
+ // compute partial derivative of f
+ Expr *pd = f->PartialWrt(p);
+ pd = pd->FoldConstants();
+ if(pd->IsZeroConst())
+ continue;
+ mat.A.sym.insert(i, j) = pd;
}
- mat.B.sym[i] = f;
- i++;
+ paramsUsed.clear();
+ mat.B.sym.push_back(f);
}
- mat.m = i;
-
return true;
}
void System::EvalJacobian() {
- int i, j;
- for(i = 0; i < mat.m; i++) {
- for(j = 0; j < mat.n; j++) {
- mat.A.num[i][j] = (mat.A.sym[i][j])->Eval();
+ using namespace Eigen;
+ mat.A.num.setZero();
+ mat.A.num.resize(mat.m, mat.n);
+ const int size = mat.A.sym.outerSize();
+
+ for(int k = 0; k < size; k++) {
+ for(SparseMatrix ::InnerIterator it(mat.A.sym, k); it; ++it) {
+ double value = it.value()->Eval();
+ if(EXACT(value == 0.0)) continue;
+ mat.A.num.insert(it.row(), it.col()) = value;
}
}
+ mat.A.num.makeCompressed();
}
bool System::IsDragged(hParam p) {
- hParam *pp;
- for(pp = dragged.First(); pp; pp = dragged.NextAfter(pp)) {
- if(p == *pp) return true;
+ const auto b = dragged.begin();
+ const auto e = dragged.end();
+ return e != std::find(b, e, p);
+}
+
+Param *System::GetLastParamSubstitution(Param *p) {
+ Param *current = p;
+ while(current->substd != NULL) {
+ current = current->substd;
+ if(current == p) {
+ // Break the loop
+ current->substd = NULL;
+ break;
+ }
+ }
+ return current;
+}
+
+void System::SortSubstitutionByDragged(Param *p) {
+ std::vector subsParams;
+ Param *by = NULL;
+ Param *current = p;
+ while(current != NULL) {
+ subsParams.push_back(current);
+ if(IsDragged(current->h)) {
+ by = current;
+ }
+ current = current->substd;
+ }
+ if(by == NULL) by = p;
+ for(Param *p : subsParams) {
+ if(p == by) continue;
+ p->substd = by;
+ p->tag = VAR_SUBSTITUTED;
+ }
+ by->substd = NULL;
+ by->tag = 0;
+}
+
+void System::SubstituteParamsByLast(Expr *e) {
+ ssassert(e->op != Expr::Op::PARAM_PTR, "Expected an expression that refer to params via handles");
+
+ if(e->op == Expr::Op::PARAM) {
+ Param *p = param.FindByIdNoOops(e->parh);
+ if(p != NULL) {
+ Param *s = GetLastParamSubstitution(p);
+ if(s != NULL) {
+ e->parh = s->h;
+ }
+ }
+ } else {
+ int c = e->Children();
+ if(c >= 1) {
+ SubstituteParamsByLast(e->a);
+ if(c >= 2) SubstituteParamsByLast(e->b);
+ }
}
- return false;
}
void System::SolveBySubstitution() {
@@ -102,172 +173,114 @@ void System::SolveBySubstitution() {
continue;
}
- if(IsDragged(a)) {
- // A is being dragged, so A should stay, and B should go
- std::swap(a, b);
+ if(a.v == b.v) {
+ teq.tag = EQ_SUBSTITUTED;
+ continue;
}
- for(auto &req : eq) {
- req.e->Substitute(a, b); // A becomes B, B unchanged
- }
- for(auto &rp : param) {
- if(rp.substd == a) {
- rp.substd = b;
+ Param *pa = param.FindById(a);
+ Param *pb = param.FindById(b);
+
+ // Take the last substitution of parameter a
+ // This resulted in creation of substitution chains
+ Param *last = GetLastParamSubstitution(pa);
+ last->substd = pb;
+ last->tag = VAR_SUBSTITUTED;
+
+ if(pb->substd != NULL) {
+ // Break the loops
+ GetLastParamSubstitution(pb);
+ // if b loop was broken
+ if(pb->substd == NULL) {
+ // Clear substitution
+ pb->tag = 0;
}
}
- Param *ptr = param.FindById(a);
- ptr->tag = VAR_SUBSTITUTED;
- ptr->substd = b;
-
teq.tag = EQ_SUBSTITUTED;
}
}
-}
-//-----------------------------------------------------------------------------
-// Calculate the rank of the Jacobian matrix, by Gram-Schimdt orthogonalization
-// in place. A row (~equation) is considered to be all zeros if its magnitude
-// is less than the tolerance RANK_MAG_TOLERANCE.
-//-----------------------------------------------------------------------------
-int System::CalculateRank() {
- // Actually work with magnitudes squared, not the magnitudes
- double rowMag[MAX_UNKNOWNS] = {};
- double tol = RANK_MAG_TOLERANCE*RANK_MAG_TOLERANCE;
-
- int i, iprev, j;
- int rank = 0;
-
- for(i = 0; i < mat.m; i++) {
- // Subtract off this row's component in the direction of any
- // previous rows
- for(iprev = 0; iprev < i; iprev++) {
- if(rowMag[iprev] <= tol) continue; // ignore zero rows
-
- double dot = 0;
- for(j = 0; j < mat.n; j++) {
- dot += (mat.A.num[iprev][j]) * (mat.A.num[i][j]);
- }
- for(j = 0; j < mat.n; j++) {
- mat.A.num[i][j] -= (dot/rowMag[iprev])*mat.A.num[iprev][j];
- }
- }
- // Our row is now normal to all previous rows; calculate the
- // magnitude of what's left
- double mag = 0;
- for(j = 0; j < mat.n; j++) {
- mag += (mat.A.num[i][j]) * (mat.A.num[i][j]);
- }
- if(mag > tol) {
- rank++;
- }
- rowMag[i] = mag;
+ //
+ for(Param &p : param) {
+ SortSubstitutionByDragged(&p);
}
- return rank;
+ // Substitute all the equations
+ for(auto &req : eq) {
+ SubstituteParamsByLast(req.e);
+ }
+
+ // Substitute all the parameters with last substitutions
+ for(auto &p : param) {
+ if(p.substd == NULL) continue;
+ p.substd = GetLastParamSubstitution(p.substd);
+ }
}
-bool System::TestRank(int *rank) {
+//-----------------------------------------------------------------------------
+// Calculate the rank of the Jacobian matrix
+//-----------------------------------------------------------------------------
+int System::CalculateRank() {
+ using namespace Eigen;
+ if(mat.n == 0 || mat.m == 0) return 0;
+ SparseQR , COLAMDOrdering> solver;
+ solver.compute(mat.A.num);
+ int result = solver.rank();
+ return result;
+}
+
+bool System::TestRank(int *dof) {
EvalJacobian();
int jacobianRank = CalculateRank();
- if(rank) *rank = jacobianRank;
+ // We are calculating dof based on real rank, not mat.m.
+ // Using this approach we can calculate real dof even when redundant is allowed.
+ if(dof != NULL) *dof = mat.n - jacobianRank;
return jacobianRank == mat.m;
}
-bool System::SolveLinearSystem(double X[], double A[][MAX_UNKNOWNS],
- double B[], int n)
+bool System::SolveLinearSystem(const Eigen::SparseMatrix &A,
+ const Eigen::VectorXd &B, Eigen::VectorXd *X)
{
- // Gaussian elimination, with partial pivoting. It's an error if the
- // matrix is singular, because that means two constraints are
- // equivalent.
- int i, j, ip, jp, imax = 0;
- double max, temp;
-
- for(i = 0; i < n; i++) {
- // We are trying eliminate the term in column i, for rows i+1 and
- // greater. First, find a pivot (between rows i and N-1).
- max = 0;
- for(ip = i; ip < n; ip++) {
- if(fabs(A[ip][i]) > max) {
- imax = ip;
- max = fabs(A[ip][i]);
- }
- }
- // Don't give up on a singular matrix unless it's really bad; the
- // assumption code is responsible for identifying that condition,
- // so we're not responsible for reporting that error.
- if(fabs(max) < 1e-20) continue;
-
- // Swap row imax with row i
- for(jp = 0; jp < n; jp++) {
- swap(A[i][jp], A[imax][jp]);
- }
- swap(B[i], B[imax]);
-
- // For rows i+1 and greater, eliminate the term in column i.
- for(ip = i+1; ip < n; ip++) {
- temp = A[ip][i]/A[i][i];
-
- for(jp = i; jp < n; jp++) {
- A[ip][jp] -= temp*(A[i][jp]);
- }
- B[ip] -= temp*B[i];
- }
- }
-
- // We've put the matrix in upper triangular form, so at this point we
- // can solve by back-substitution.
- for(i = n - 1; i >= 0; i--) {
- if(fabs(A[i][i]) < 1e-20) continue;
-
- temp = B[i];
- for(j = n - 1; j > i; j--) {
- temp -= X[j]*A[i][j];
- }
- X[i] = temp / A[i][i];
- }
-
- return true;
+ if(A.outerSize() == 0) return true;
+ using namespace Eigen;
+ SparseQR, COLAMDOrdering> solver;
+ //SimplicialLDLT> solver;
+ solver.compute(A);
+ *X = solver.solve(B);
+ return (solver.info() == Success);
}
bool System::SolveLeastSquares() {
- int r, c, i;
-
+ using namespace Eigen;
// Scale the columns; this scale weights the parameters for the least
// squares solve, so that we can encourage the solver to make bigger
// changes in some parameters, and smaller in others.
- for(c = 0; c < mat.n; c++) {
+ mat.scale = VectorXd::Ones(mat.n);
+ for(int c = 0; c < mat.n; c++) {
if(IsDragged(mat.param[c])) {
// It's least squares, so this parameter doesn't need to be all
// that big to get a large effect.
- mat.scale[c] = 1/20.0;
- } else {
- mat.scale[c] = 1;
- }
- for(r = 0; r < mat.m; r++) {
- mat.A.num[r][c] *= mat.scale[c];
+ mat.scale[c] = 1 / 20.0;
}
}
- // Write A*A'
- for(r = 0; r < mat.m; r++) {
- for(c = 0; c < mat.m; c++) { // yes, AAt is square
- double sum = 0;
- for(i = 0; i < mat.n; i++) {
- sum += mat.A.num[r][i]*mat.A.num[c][i];
- }
- mat.AAt[r][c] = sum;
+ const int size = mat.A.num.outerSize();
+ for(int k = 0; k < size; k++) {
+ for(SparseMatrix::InnerIterator it(mat.A.num, k); it; ++it) {
+ it.valueRef() *= mat.scale[it.col()];
}
}
- if(!SolveLinearSystem(mat.Z, mat.AAt, mat.B.num, mat.m)) return false;
+ SparseMatrix AAt = mat.A.num * mat.A.num.transpose();
+ AAt.makeCompressed();
+ VectorXd z(mat.n);
- // And multiply that by A' to get our solution.
- for(c = 0; c < mat.n; c++) {
- double sum = 0;
- for(i = 0; i < mat.m; i++) {
- sum += mat.A.num[i][c]*mat.Z[i];
- }
- mat.X[c] = sum * mat.scale[c];
+ if(!SolveLinearSystem(AAt, mat.B.num, &z)) return false;
+
+ mat.X = mat.A.num.transpose() * z;
+
+ for(int c = 0; c < mat.n; c++) {
+ mat.X[c] *= mat.scale[c];
}
return true;
}
@@ -279,6 +292,7 @@ bool System::NewtonSolve(int tag) {
int i;
// Evaluate the functions at our operating point.
+ mat.B.num = Eigen::VectorXd(mat.m);
for(i = 0; i < mat.m; i++) {
mat.B.num[i] = (mat.B.sym[i])->Eval();
}
@@ -405,26 +419,26 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List *bad,
{
WriteEquationsExceptFor(Constraint::NO_CONSTRAINT, g);
- int i;
bool rankOk;
/*
+ int x;
dbp("%d equations", eq.n);
- for(i = 0; i < eq.n; i++) {
- dbp(" %.3f = %s = 0", eq[i].e->Eval(), eq[i].e->Print());
+ for(x = 0; x < eq.n; x++) {
+ dbp(" %.3f = %s = 0", eq[x].e->Eval(), eq[x].e->Print());
}
dbp("%d parameters", param.n);
- for(i = 0; i < param.n; i++) {
- dbp(" param %08x at %.3f", param[i].h.v, param[i].val);
+ for(x = 0; x < param.n; x++) {
+ dbp(" param %08x at %.3f", param[x].h.v, param[x].val);
} */
// All params and equations are assigned to group zero.
param.ClearTags();
eq.ClearTags();
- // Solving by substitution eliminates duplicate e.g. H/V constraints, which can cause rank test
- // to succeed even on overdefined systems, which will fail later.
- if(!forceDofCheck) {
+ // Since we are suppressing dof calculation or allowing redundant, we
+ // can't / don't want to catch result of dof checking without substitution
+ if(g->suppressDofCalculation || g->allowRedundant || !forceDofCheck) {
SolveBySubstitution();
}
@@ -462,22 +476,21 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List *bad,
if(!WriteJacobian(0)) {
return SolveResult::TOO_MANY_UNKNOWNS;
}
-
- rankOk = TestRank(rank);
+ // Clear dof value in order to have indication when dof is actually not calculated
+ if(dof != NULL) *dof = -1;
+ // We are suppressing or allowing redundant, so we no need to catch unsolveable + redundant
+ rankOk = (!g->suppressDofCalculation && !g->allowRedundant) ? TestRank(dof) : true;
// And do the leftovers as one big system
if(!NewtonSolve(0)) {
goto didnt_converge;
}
- rankOk = TestRank(rank);
+ // Here we are want to calculate dof even when redundant is allowed, so just handle suppressing
+ rankOk = (!g->suppressDofCalculation) ? TestRank(dof) : true;
if(!rankOk) {
if(andFindBad) FindWhichToRemoveToFixJacobian(g, bad, forceDofCheck);
} else {
- // This is not the full Jacobian, but any substitutions or single-eq
- // solves removed one equation and one unknown, therefore no effect
- // on the number of DOF.
- if(dof) *dof = CalculateDof();
MarkParamsFree(andFindFree);
}
// System solved correctly, so write the new values back in to the
@@ -485,7 +498,7 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List *bad,
for(auto &p : param) {
double val;
if(p.tag == VAR_SUBSTITUTED) {
- val = param.FindById(p.substd)->val;
+ val = p.substd->val;
} else {
val = p.val;
}
@@ -499,12 +512,12 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List *bad,
didnt_converge:
SK.constraint.ClearTags();
// Not using range-for here because index is used in additional ways
- for(i = 0; i < eq.n; i++) {
+ for(size_t i = 0; i < mat.eq.size(); i++) {
if(fabs(mat.B.num[i]) > CONVERGE_TOLERANCE || IsReasonable(mat.B.num[i])) {
// This constraint is unsatisfied.
- if(!mat.eq[i].isFromConstraint()) continue;
+ if(!mat.eq[i]->h.isFromConstraint()) continue;
- hConstraint hc = mat.eq[i].constraint();
+ hConstraint hc = mat.eq[i]->h.constraint();
ConstraintBase *c = SK.constraint.FindByIdNoOops(hc);
if(!c) continue;
// Don't double-show constraints that generated multiple
@@ -534,11 +547,14 @@ SolveResult System::SolveRank(Group *g, int *rank, int *dof, List *
return SolveResult::TOO_MANY_UNKNOWNS;
}
- bool rankOk = TestRank(rank);
+ bool rankOk = TestRank(dof);
if(!rankOk) {
- if(andFindBad) FindWhichToRemoveToFixJacobian(g, bad, /*forceDofCheck=*/true);
+ // When we are testing with redundant allowed, we don't want to have additional info
+ // about redundants since this test is working only for single redundant constraint
+ if(!g->suppressDofCalculation && !g->allowRedundant) {
+ if(andFindBad) FindWhichToRemoveToFixJacobian(g, bad, true);
+ }
} else {
- if(dof) *dof = CalculateDof();
MarkParamsFree(andFindFree);
}
return rankOk ? SolveResult::OKAY : SolveResult::REDUNDANT_OKAY;
@@ -549,6 +565,8 @@ void System::Clear() {
param.Clear();
eq.Clear();
dragged.Clear();
+ mat.A.num.setZero();
+ mat.A.sym.setZero();
}
void System::MarkParamsFree(bool find) {
@@ -573,7 +591,3 @@ void System::MarkParamsFree(bool find) {
}
}
-int System::CalculateDof() {
- return mat.n - mat.m;
-}
-
diff --git a/src/textscreens.cpp b/src/textscreens.cpp
index 22553827..ba5d977c 100644
--- a/src/textscreens.cpp
+++ b/src/textscreens.cpp
@@ -261,6 +261,8 @@ void TextWindow::ScreenChangeGroupOption(int link, uint32_t v) {
case 'e': g->allowRedundant = !(g->allowRedundant); break;
+ case 'D': g->suppressDofCalculation = !(g->suppressDofCalculation); break;
+
case 'v': g->visible = !(g->visible); break;
case 'd': g->allDimsReference = !(g->allDimsReference); break;
@@ -511,6 +513,10 @@ void TextWindow::ShowGroupInfo() {
&TextWindow::ScreenChangeGroupOption,
g->allowRedundant ? CHECK_TRUE : CHECK_FALSE);
+ Printf(false, " %f%LD%Fd%s suppress dof calculation (improves solver performance)",
+ &TextWindow::ScreenChangeGroupOption,
+ g->suppressDofCalculation ? CHECK_TRUE : CHECK_FALSE);
+
Printf(false, " %f%Ld%Fd%s treat all dimensions as reference",
&TextWindow::ScreenChangeGroupOption,
g->allDimsReference ? CHECK_TRUE : CHECK_FALSE);
diff --git a/src/textwin.cpp b/src/textwin.cpp
index d0755b07..b68c0680 100644
--- a/src/textwin.cpp
+++ b/src/textwin.cpp
@@ -235,6 +235,7 @@ void TextWindow::Init() {
using namespace std::placeholders;
window->onClose = []() {
+ SS.TW.HideEditControl();
SS.GW.showTextWindow = false;
SS.GW.EnsureValidActives();
};
diff --git a/src/ttf.cpp b/src/ttf.cpp
index ddb2aa17..e39afc79 100644
--- a/src/ttf.cpp
+++ b/src/ttf.cpp
@@ -11,7 +11,7 @@
#include FT_ADVANCES_H
/* Yecch. Irritatingly, you need to do this nonsense to get the error string table,
- since nobody thought to put this exact function into FreeType itsself. */
+ since nobody thought to put this exact function into FreeType itself. */
#undef __FTERRORS_H__
#define FT_ERRORDEF(e, v, s) { (e), (s) },
#define FT_ERROR_START_LIST
diff --git a/src/ui.h b/src/ui.h
index 21b00cd4..0d121b64 100644
--- a/src/ui.h
+++ b/src/ui.h
@@ -172,6 +172,7 @@ enum class Command : uint32_t {
// Help
LOCALE,
WEBSITE,
+ GITHUB,
ABOUT,
};