Merge branch 'solvespace:master' into master

pull/493/head
Yuan Chang 2022-02-08 14:44:48 +08:00 committed by GitHub
commit ab7d77d58d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
40 changed files with 1795 additions and 1522 deletions

View File

@ -13,4 +13,4 @@ else
brew install libomp brew install libomp
fi 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

View File

@ -5,6 +5,6 @@ sudo apt-get update -qq
sudo apt-get install -q -y \ sudo apt-get install -q -y \
zlib1g-dev libpng-dev libcairo2-dev libfreetype6-dev libjson-c-dev \ zlib1g-dev libpng-dev libcairo2-dev libfreetype6-dev libjson-c-dev \
libfontconfig1-dev libgtkmm-3.0-dev libpangomm-1.4-dev libgl-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

51
.github/workflows/source-tarball.yml vendored Normal file
View File

@ -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

5
.gitignore vendored
View File

@ -14,3 +14,8 @@
/obj-*/ /obj-*/
/*.slvs /*.slvs
.vscode/ .vscode/
# Visual Studio
out/
.vs/
CMakeSettings.json

3
.gitmodules vendored
View File

@ -23,3 +23,6 @@
[submodule "extlib/mimalloc"] [submodule "extlib/mimalloc"]
path = extlib/mimalloc path = extlib/mimalloc
url = https://github.com/microsoft/mimalloc url = https://github.com/microsoft/mimalloc
[submodule "extlib/eigen"]
path = extlib/eigen
url = https://gitlab.com/libeigen/eigen.git

View File

@ -23,6 +23,17 @@ Sketching:
MISC: 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 * 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. * Gray the group name in the text window for groups with suppressed solid model.
* Added the ability to Link STL files. * Added the ability to Link STL files.
@ -30,6 +41,10 @@ MISC:
Performance: 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. * More changes to the ID list implementation.
3.0 3.0

View File

@ -8,10 +8,9 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
" mkdir build && cd build && cmake ..") " mkdir build && cd build && cmake ..")
endif() endif()
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} list(APPEND CMAKE_MODULE_PATH
"${CMAKE_SOURCE_DIR}/cmake/") "${CMAKE_SOURCE_DIR}/cmake/")
cmake_policy(SET CMP0048 OLD)
set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED YES) 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: # and instead uncomment the following, adding the complete git hash of the checkout you are using:
# set(GIT_COMMIT_HASH 0000000000000000000000000000000000000000) # 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) 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 set(ENABLE_GUI ON CACHE BOOL
"Whether the graphical interface is enabled") "Whether the graphical interface is enabled")
@ -56,8 +55,11 @@ set(ENABLE_SANITIZERS OFF CACHE BOOL
"Whether to enable Clang's AddressSanitizer and UndefinedBehaviorSanitizer") "Whether to enable Clang's AddressSanitizer and UndefinedBehaviorSanitizer")
set(ENABLE_OPENMP OFF CACHE BOOL set(ENABLE_OPENMP OFF CACHE BOOL
"Whether geometric operations will be parallelized using OpenMP") "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") "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)") set(OPENGL 3 CACHE STRING "OpenGL version to use (one of: 1 3)")
@ -114,7 +116,12 @@ endif()
if(ENABLE_OPENMP) if(ENABLE_OPENMP)
find_package( OpenMP REQUIRED ) find_package( OpenMP REQUIRED )
if(OPENMP_FOUND) 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} ) message(STATUS "found OpenMP, compiling with flags: " ${OpenMP_CXX_FLAGS} )
endif() endif()
endif() endif()
@ -178,6 +185,9 @@ endif()
message(STATUS "Using in-tree libdxfrw") message(STATUS "Using in-tree libdxfrw")
add_subdirectory(extlib/libdxfrw) add_subdirectory(extlib/libdxfrw)
message(STATUS "Using in-tree eigen")
include_directories(extlib/eigen)
message(STATUS "Using in-tree mimalloc") message(STATUS "Using in-tree mimalloc")
set(MI_OVERRIDE OFF CACHE BOOL "") set(MI_OVERRIDE OFF CACHE BOOL "")
set(MI_BUILD_SHARED 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) add_subdirectory(extlib/mimalloc EXCLUDE_FROM_ALL)
set(MIMALLOC_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/extlib/mimalloc/include) 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) if(WIN32 OR APPLE)
# On Win32 and macOS we use vendored packages, since there is little to no benefit # 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 # to trying to find system versions. In particular, trying to link to libraries from
@ -281,7 +303,6 @@ if(ENABLE_GUI)
elseif(APPLE) elseif(APPLE)
find_package(OpenGL REQUIRED) find_package(OpenGL REQUIRED)
find_library(APPKIT_LIBRARY AppKit REQUIRED) find_library(APPKIT_LIBRARY AppKit REQUIRED)
set(util_LIBRARIES ${APPKIT_LIBRARY})
else() else()
find_package(OpenGL REQUIRED) find_package(OpenGL REQUIRED)
find_package(SpaceWare) find_package(SpaceWare)

View File

@ -25,9 +25,9 @@ IRC channel [#solvespace at web.libera.chat][ssirc].
## Installation ## 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 (>=Vista 32-bit) are available via [GitHub releases][rel]. These packages are
automatically built by the SolveSpace maintainers for each stable release. automatically built by the SolveSpace maintainers for each stable release.
@ -53,15 +53,6 @@ snap install solvespace
snap install solvespace --edge 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 ### Via automated edge builds
> :warning: **Edge builds might be unstable or contain severe bugs!** > :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 Extract the downloaded archive and install or execute the contained file as is
appropriate for your platform. 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 ### Via source code
See below. See below.
@ -111,7 +111,7 @@ Before building, check out the project and the necessary submodules:
```sh ```sh
git clone https://github.com/solvespace/solvespace git clone https://github.com/solvespace/solvespace
cd 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: After that, build SolveSpace as following:
@ -171,11 +171,11 @@ Space Navigator support will not be available.
## Building on macOS ## 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][]: via [Homebrew][]:
```sh ```sh
brew install git cmake brew install git cmake libomp
``` ```
XCode has to be installed via AppStore or [the Apple website][appledeveloper]; 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 ```sh
git clone https://github.com/solvespace/solvespace git clone https://github.com/solvespace/solvespace
cd 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: After that, build SolveSpace as following:

View File

@ -16,7 +16,7 @@ if(UNIX)
# Support the REQUIRED and QUIET arguments, and set SPACEWARE_FOUND if found. # Support the REQUIRED and QUIET arguments, and set SPACEWARE_FOUND if found.
include(FindPackageHandleStandardArgs) include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(SPACEWARE DEFAULT_MSG find_package_handle_standard_args(SpaceWare DEFAULT_MSG
SPACEWARE_LIBRARY SPACEWARE_INCLUDE_DIR) SPACEWARE_LIBRARY SPACEWARE_INCLUDE_DIR)
if(SPACEWARE_FOUND) if(SPACEWARE_FOUND)

View File

@ -15,11 +15,11 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR}~${solvespace_GIT_HASH}</string> <string>${PROJECT_VERSION}~${solvespace_GIT_HASH}</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR}</string> <string>${PROJECT_VERSION}</string>
<key>NSHumanReadableCopyright</key> <key>NSHumanReadableCopyright</key>
<string>© 2008-2016 Jonathan Westhues and other authors</string> <string>© 2008-2022 Jonathan Westhues and other authors</string>
<key>NSPrincipalClass</key> <key>NSPrincipalClass</key>
<string>NSApplication</string> <string>NSApplication</string>
<key>NSMainNibFile</key> <key>NSMainNibFile</key>

1
extlib/eigen Submodule

@ -0,0 +1 @@
Subproject commit 3147391d946bb4b6c68edd901f2add6ac1f31f8c

View File

@ -1,5 +1,5 @@
name: solvespace name: solvespace
base: core18 base: core20
summary: Parametric 2d/3d CAD summary: Parametric 2d/3d CAD
adopt-info: solvespace adopt-info: solvespace
description: | description: |
@ -14,6 +14,7 @@ description: |
confinement: strict confinement: strict
license: GPL-3.0 license: GPL-3.0
compression: lzo
layout: layout:
/usr/share/solvespace: /usr/share/solvespace:
@ -23,13 +24,11 @@ apps:
solvespace: solvespace:
command: usr/bin/solvespace command: usr/bin/solvespace
desktop: solvespace.desktop desktop: solvespace.desktop
extensions: [gnome-3-34] extensions: [gnome-3-38]
plugs: [opengl, unity7, home, removable-media, gsettings, network] 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: cli:
command: usr/bin/solvespace-cli command: usr/bin/solvespace-cli
extensions: [gnome-3-34] extensions: [gnome-3-38]
plugs: [home, removable-media, network] plugs: [home, removable-media, network]
parts: parts:
@ -39,23 +38,28 @@ parts:
source-type: local source-type: local
override-pull: | override-pull: |
snapcraftctl pull snapcraftctl pull
version_major=$(grep "solvespace_VERSION_MAJOR" CMakeLists.txt | tr -d "()" | cut -d" " -f2) git submodule update --init extlib/libdxfrw extlib/mimalloc extlib/eigen
version_minor=$(grep "solvespace_VERSION_MINOR" CMakeLists.txt | tr -d "()" | cut -d" " -f2) override-build: |
version="$version_major.$version_minor~$(git rev-parse --short=8 HEAD)" 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" snapcraftctl set-version "$version"
git describe --exact-match HEAD && grade="stable" || grade="devel" git describe --exact-match HEAD && grade="stable" || grade="devel"
snapcraftctl set-grade "$grade" snapcraftctl set-grade "$grade"
git submodule update --init extlib/libdxfrw extlib/mimalloc cmake-parameters:
configflags:
- -DCMAKE_INSTALL_PREFIX=/usr - -DCMAKE_INSTALL_PREFIX=/usr
- -DCMAKE_BUILD_TYPE=Release - -DCMAKE_BUILD_TYPE=Release
- -DENABLE_TESTS=OFF - -DENABLE_TESTS=OFF
- -DSNAP=ON - -DSNAP=ON
- -DENABLE_OPENMP=ON - -DENABLE_OPENMP=ON
- -DENABLE_LTO=ON - -DENABLE_LTO=ON
build-snaps:
- gnome-3-38-2004-sdk
build-packages: build-packages:
- zlib1g-dev - zlib1g-dev
- libpng-dev - libpng-dev
- libcairo2-dev
- libfreetype6-dev - libfreetype6-dev
- libjson-c-dev - libjson-c-dev
- libgl-dev - libgl-dev
@ -70,11 +74,14 @@ parts:
cleanup: cleanup:
after: [solvespace] after: [solvespace]
plugin: nil plugin: nil
build-snaps: [core18, gnome-3-34-1804] build-snaps: [gnome-3-38-2004]
override-prime: | override-prime: |
# Remove all files from snap that are already included in the base snap or in
# any connected content snaps
set -eux set -eux
for snap in "core18" "gnome-3-34-1804"; do # List all content-snaps and base snaps you're using here 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/{}" \; cd "/snap/$snap/current" && find . -type f,l -exec rm -f "$SNAPCRAFT_PRIME/{}" "$SNAPCRAFT_PRIME/usr/{}" \;
done 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

View File

@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: SolveSpace 3.0\n" "Project-Id-Version: SolveSpace 3.0\n"
"Report-Msgid-Bugs-To: whitequark@whitequark.org\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" "PO-Revision-Date: 2018-07-19 06:55+0000\n"
"Last-Translator: Reini Urban <rurban@cpan.org>\n" "Last-Translator: Reini Urban <rurban@cpan.org>\n"
"Language-Team: none\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." msgid "Number of copies to paste must be at least one."
msgstr "Die Anzahl der einzufügenden Kopien muss mind. 1 sein." 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." msgid "Scale cannot be zero."
msgstr "Maßstab kann nicht Null sein." msgstr "Maßstab kann nicht Null sein."
@ -66,15 +66,15 @@ msgstr ""
msgid "No workplane active." msgid "No workplane active."
msgstr "Es ist keine Arbeitsebene aktiv." msgstr "Es ist keine Arbeitsebene aktiv."
#: confscreen.cpp:376 #: confscreen.cpp:381
msgid "Bad format: specify coordinates as x, y, z" msgid "Bad format: specify coordinates as x, y, z"
msgstr "Ungültiges Format: geben Sie Koordinaten als x, y, z an" 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" msgid "Bad format: specify color as r, g, b"
msgstr "Ungültiges Format: geben Sie Farben als r, g, b an" msgstr "Ungültiges Format: geben Sie Farben als r, g, b an"
#: confscreen.cpp:412 #: confscreen.cpp:417
msgid "" msgid ""
"The perspective factor will have no effect until you enable View -> Use " "The perspective factor will have no effect until you enable View -> Use "
"Perspective Projection." "Perspective Projection."
@ -82,25 +82,25 @@ msgstr ""
"Der Perspektivfaktor wird sich nicht auswirken, bis Sie Ansicht -> " "Der Perspektivfaktor wird sich nicht auswirken, bis Sie Ansicht -> "
"Perspektive Projektion aktivieren." "Perspektive Projektion aktivieren."
#: confscreen.cpp:430 confscreen.cpp:440 #: confscreen.cpp:435 confscreen.cpp:445
#, c-format #, c-format
msgid "Specify between 0 and %d digits after the decimal." msgid "Specify between 0 and %d digits after the decimal."
msgstr "Geben Sie 0 bis %d Ziffern nach dem Dezimalzeichen an." msgstr "Geben Sie 0 bis %d Ziffern nach dem Dezimalzeichen an."
#: confscreen.cpp:452 #: confscreen.cpp:457
msgid "Export scale must not be zero!" msgid "Export scale must not be zero!"
msgstr "Der Exportmaßstab darf nicht Null sein!" msgstr "Der Exportmaßstab darf nicht Null sein!"
#: confscreen.cpp:464 #: confscreen.cpp:469
msgid "Cutter radius offset must not be negative!" msgid "Cutter radius offset must not be negative!"
msgstr "Der Werkzeugradialabstand darf nicht negativ sein!" msgstr "Der Werkzeugradialabstand darf nicht negativ sein!"
#: confscreen.cpp:518 #: confscreen.cpp:528
msgid "Bad value: autosave interval should be positive" msgid "Bad value: autosave interval should be positive"
msgstr "" msgstr ""
"Ungültiger Wert: Interval für automatisches Speichern muss positiv sein" "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" msgid "Bad format: specify interval in integral minutes"
msgstr "Ungültiges Format: geben Sie das Interval in ganzen Minuten an" msgstr "Ungültiges Format: geben Sie das Interval in ganzen Minuten an"
@ -684,7 +684,7 @@ msgctxt "button"
msgid "&No" msgid "&No"
msgstr "&Nein" msgstr "&Nein"
#: file.cpp:877 solvespace.cpp:610 #: file.cpp:877 solvespace.cpp:611
msgctxt "button" msgctxt "button"
msgid "&Cancel" msgid "&Cancel"
msgstr "&Abbrechen" msgstr "&Abbrechen"
@ -1137,25 +1137,29 @@ msgstr "Sprache"
msgid "&Website / Manual" msgid "&Website / Manual"
msgstr "&Website / Anleitung" msgstr "&Website / Anleitung"
#: graphicswin.cpp:187 #: graphicswin.cpp:186
msgid "&Go to GitHub commit"
msgstr ""
#: graphicswin.cpp:188
msgid "&About" msgid "&About"
msgstr "Über" msgstr "Über"
#: graphicswin.cpp:361 #: graphicswin.cpp:362
msgid "(no recent files)" msgid "(no recent files)"
msgstr "(keine vorhergehenden Dateien)" msgstr "(keine vorhergehenden Dateien)"
#: graphicswin.cpp:369 #: graphicswin.cpp:370
#, c-format #, c-format
msgid "File '%s' does not exist." msgid "File '%s' does not exist."
msgstr "Datei '%s' existiert nicht." msgstr "Datei '%s' existiert nicht."
#: graphicswin.cpp:736 #: graphicswin.cpp:737
msgid "No workplane is active, so the grid will not appear." msgid "No workplane is active, so the grid will not appear."
msgstr "" msgstr ""
"Das Raster wird nicht angezeigt, weil keine Arbeitsebene ausgewählt ist." "Das Raster wird nicht angezeigt, weil keine Arbeitsebene ausgewählt ist."
#: graphicswin.cpp:751 #: graphicswin.cpp:752
msgid "" msgid ""
"The perspective factor is set to zero, so the view will always be a parallel " "The perspective factor is set to zero, so the view will always be a parallel "
"projection.\n" "projection.\n"
@ -1169,20 +1173,20 @@ msgstr ""
"Ändern Sie den Faktor für die Perspektivprojektion in der " "Ändern Sie den Faktor für die Perspektivprojektion in der "
"Konfigurationsmaske. Ein typischer Wert ist ca. 0,3." "Konfigurationsmaske. Ein typischer Wert ist ca. 0,3."
#: graphicswin.cpp:836 #: graphicswin.cpp:837
msgid "" msgid ""
"Select a point; this point will become the center of the view on screen." "Select a point; this point will become the center of the view on screen."
msgstr "" msgstr ""
"Wählen Sie einen Punkt aus; dieser Punkt wird im Mittelpunkt der " "Wählen Sie einen Punkt aus; dieser Punkt wird im Mittelpunkt der "
"Bildschirmansicht sein." "Bildschirmansicht sein."
#: graphicswin.cpp:1136 #: graphicswin.cpp:1137
msgid "No additional entities share endpoints with the selected entities." msgid "No additional entities share endpoints with the selected entities."
msgstr "" msgstr ""
"Die ausgewählten Objekte teilen keine gemeinsamen Endpunkte mit anderen " "Die ausgewählten Objekte teilen keine gemeinsamen Endpunkte mit anderen "
"Objekten." "Objekten."
#: graphicswin.cpp:1154 #: graphicswin.cpp:1155
msgid "" msgid ""
"To use this command, select a point or other entity from an linked part, or " "To use this command, select a point or other entity from an linked part, or "
"make a link group the active group." "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 " "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." "verknüpften Teil aus, oder aktivieren Sie eine verknüpfte Gruppe."
#: graphicswin.cpp:1177 #: graphicswin.cpp:1178
msgid "" msgid ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "No workplane is active. Activate a workplane (with Sketch -> In Workplane) "
"to define the plane for the snap grid." "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 " "(mit Skizze -> In Arbeitsebene), um die Ebene für das Gitterraster zu "
"definieren." "definieren."
#: graphicswin.cpp:1184 #: graphicswin.cpp:1185
msgid "" msgid ""
"Can't snap these items to grid; select points, text comments, or constraints " "Can't snap these items to grid; select points, text comments, or constraints "
"with a label. To snap a line, select its endpoints." "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 " "für Punkte, Textkommentare, oder Einschränkungen mit einer Bezeichnung. Um "
"eine Linie auf das Raster auszurichten, wählen Sie deren Endpunkte aus." "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." msgid "No workplane selected. Activating default workplane for this group."
msgstr "" msgstr ""
"Es wurde keine Arbeitsebene ausgewählt. Die Standard-Arbeitsebene für diese " "Es wurde keine Arbeitsebene ausgewählt. Die Standard-Arbeitsebene für diese "
"Gruppe wird aktiviert." "Gruppe wird aktiviert."
#: graphicswin.cpp:1272 #: graphicswin.cpp:1273
msgid "" msgid ""
"No workplane is selected, and the active group does not have a default " "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. 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 " "standardmäßige Arbeitsebene. Wählen Sie eine Arbeitsebene aus, oder "
"erstellen Sie eine Gruppe in einer neuen Arbeitsebene." "erstellen Sie eine Gruppe in einer neuen Arbeitsebene."
#: graphicswin.cpp:1293 #: graphicswin.cpp:1294
msgid "" msgid ""
"Bad selection for tangent arc at point. Select a single point, or select " "Bad selection for tangent arc at point. Select a single point, or select "
"nothing to set up arc parameters." "nothing to set up arc parameters."
@ -1232,48 +1236,48 @@ msgstr ""
"Ungültige Auswahl für Bogentangente an Punkt. Wählen Sie einen einzelnen " "Ungültige Auswahl für Bogentangente an Punkt. Wählen Sie einen einzelnen "
"Punkt. Um die Bogenparameter anzugeben, wählen Sie nichts aus." "Punkt. Um die Bogenparameter anzugeben, wählen Sie nichts aus."
#: graphicswin.cpp:1304 #: graphicswin.cpp:1305
msgid "click point on arc (draws anti-clockwise)" msgid "click point on arc (draws anti-clockwise)"
msgstr "" msgstr ""
"Erstellen Sie einen Punkt auf dem Bogen (zeichnet im Gegenuhrzeigersinn)" "Erstellen Sie einen Punkt auf dem Bogen (zeichnet im Gegenuhrzeigersinn)"
#: graphicswin.cpp:1305 #: graphicswin.cpp:1306
msgid "click to place datum point" msgid "click to place datum point"
msgstr "Klicken Sie, um einen Bezugspunkt zu platzieren" msgstr "Klicken Sie, um einen Bezugspunkt zu platzieren"
#: graphicswin.cpp:1306 #: graphicswin.cpp:1307
msgid "click first point of line segment" msgid "click first point of line segment"
msgstr "Klicken Sie auf den ersten Punkt des Liniensegments" msgstr "Klicken Sie auf den ersten Punkt des Liniensegments"
#: graphicswin.cpp:1308 #: graphicswin.cpp:1309
msgid "click first point of construction line segment" msgid "click first point of construction line segment"
msgstr "Klicken Sie auf den ersten Punkt der Konstruktionslinie" msgstr "Klicken Sie auf den ersten Punkt der Konstruktionslinie"
#: graphicswin.cpp:1309 #: graphicswin.cpp:1310
msgid "click first point of cubic segment" msgid "click first point of cubic segment"
msgstr "Klicken Sie auf den ersten Punkt der kubischen Linie" msgstr "Klicken Sie auf den ersten Punkt der kubischen Linie"
#: graphicswin.cpp:1310 #: graphicswin.cpp:1311
msgid "click center of circle" msgid "click center of circle"
msgstr "Klicken Sie auf den Kreismittelpunkt" msgstr "Klicken Sie auf den Kreismittelpunkt"
#: graphicswin.cpp:1311 #: graphicswin.cpp:1312
msgid "click origin of workplane" msgid "click origin of workplane"
msgstr "Klicken Sie auf den Ursprungspunkt der Arbeitsebene" msgstr "Klicken Sie auf den Ursprungspunkt der Arbeitsebene"
#: graphicswin.cpp:1312 #: graphicswin.cpp:1313
msgid "click one corner of rectangle" msgid "click one corner of rectangle"
msgstr "Klicken Sie auf eine Ecke des Rechtecks" msgstr "Klicken Sie auf eine Ecke des Rechtecks"
#: graphicswin.cpp:1313 #: graphicswin.cpp:1314
msgid "click top left of text" msgid "click top left of text"
msgstr "Klicken Sie auf die obere linke Ecke des Texts" msgstr "Klicken Sie auf die obere linke Ecke des Texts"
#: graphicswin.cpp:1319 #: graphicswin.cpp:1320
msgid "click top left of image" msgid "click top left of image"
msgstr "Klicken Sie auf die obere linke Ecke des Bilds" msgstr "Klicken Sie auf die obere linke Ecke des Bilds"
#: graphicswin.cpp:1345 #: graphicswin.cpp:1346
msgid "" msgid ""
"No entities are selected. Select entities before trying to toggle their " "No entities are selected. Select entities before trying to toggle their "
"construction state." "construction state."
@ -1428,6 +1432,10 @@ msgstr "Kontur überschneidet sich selbst!"
msgid "zero-length edge!" msgid "zero-length edge!"
msgstr "Kante mit Länge Null!" msgstr "Kante mit Länge Null!"
#: importmesh.cpp:136
msgid "Text-formated STL files are not currently supported"
msgstr ""
#: modify.cpp:252 #: modify.cpp:252
msgid "Must be sketching in workplane to create tangent arc." msgid "Must be sketching in workplane to create tangent arc."
msgstr "Eine Bogentangente kann nur in einer Arbeitsebene erstellt werden." 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 " "Das Bild kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine "
"Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." "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" msgctxt "file-type"
msgid "SolveSpace models" msgid "SolveSpace models"
msgstr "SolveSpace-Modelle" msgstr "SolveSpace-Modelle"
@ -1725,105 +1733,105 @@ msgctxt "file-type"
msgid "Comma-separated values" msgid "Comma-separated values"
msgstr "Werte durch Komma getrennt (CSV)" 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" msgid "untitled"
msgstr "unbenannt" 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 #: platform/guiwin.cpp:1639
msgctxt "title" msgctxt "title"
msgid "Save File" msgid "Save File"
msgstr "Datei speichern" 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 #: platform/guiwin.cpp:1645
msgctxt "title" msgctxt "title"
msgid "Open File" msgid "Open File"
msgstr "Datei öffnen" msgstr "Datei öffnen"
#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 #: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433
msgctxt "button" msgctxt "button"
msgid "_Cancel" msgid "_Cancel"
msgstr "_Abbrechen" msgstr "_Abbrechen"
#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 #: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431
msgctxt "button" msgctxt "button"
msgid "_Save" msgid "_Save"
msgstr "_Speichern" msgstr "_Speichern"
#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 #: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432
msgctxt "button" msgctxt "button"
msgid "_Open" msgid "_Open"
msgstr "_Öffnen" msgstr "_Öffnen"
#: solvespace.cpp:170 #: solvespace.cpp:171
msgctxt "title" msgctxt "title"
msgid "Autosave Available" msgid "Autosave Available"
msgstr "Automatische Sicherungsdatei verfügbar" msgstr "Automatische Sicherungsdatei verfügbar"
#: solvespace.cpp:171 #: solvespace.cpp:172
msgctxt "dialog" msgctxt "dialog"
msgid "An autosave file is available for this sketch." msgid "An autosave file is available for this sketch."
msgstr "Eine automatische Sicherung ist für diese Skizze verfügbar." msgstr "Eine automatische Sicherung ist für diese Skizze verfügbar."
#: solvespace.cpp:172 #: solvespace.cpp:173
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to load the autosave file instead?" msgid "Do you want to load the autosave file instead?"
msgstr "Wollen Sie die automatische Sicherungsdatei stattdessen laden?" msgstr "Wollen Sie die automatische Sicherungsdatei stattdessen laden?"
#: solvespace.cpp:173 #: solvespace.cpp:174
msgctxt "button" msgctxt "button"
msgid "&Load autosave" msgid "&Load autosave"
msgstr "AutoDatei &öffnen" msgstr "AutoDatei &öffnen"
#: solvespace.cpp:175 #: solvespace.cpp:176
msgctxt "button" msgctxt "button"
msgid "Do&n't Load" msgid "Do&n't Load"
msgstr "&Nicht laden" msgstr "&Nicht laden"
#: solvespace.cpp:598 #: solvespace.cpp:599
msgctxt "title" msgctxt "title"
msgid "Modified File" msgid "Modified File"
msgstr "Geänderte Datei" msgstr "Geänderte Datei"
#: solvespace.cpp:600 #: solvespace.cpp:601
#, c-format #, c-format
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to save the changes you made to the sketch “%s”?" msgid "Do you want to save the changes you made to the sketch “%s”?"
msgstr "Wollen Sie die Änderungen an der Skizze “%s” sichern?" msgstr "Wollen Sie die Änderungen an der Skizze “%s” sichern?"
#: solvespace.cpp:603 #: solvespace.cpp:604
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to save the changes you made to the new sketch?" msgid "Do you want to save the changes you made to the new sketch?"
msgstr "Wollen Sie die Änderungen an der Skizze sichern?" msgstr "Wollen Sie die Änderungen an der Skizze sichern?"
#: solvespace.cpp:606 #: solvespace.cpp:607
msgctxt "dialog" msgctxt "dialog"
msgid "Your changes will be lost if you don't save them." msgid "Your changes will be lost if you don't save them."
msgstr "Ihre Änderungen werden verworfen, wenn sie nicht abgespeichert werden." msgstr "Ihre Änderungen werden verworfen, wenn sie nicht abgespeichert werden."
#: solvespace.cpp:607 #: solvespace.cpp:608
msgctxt "button" msgctxt "button"
msgid "&Save" msgid "&Save"
msgstr "&Sichern" msgstr "&Sichern"
#: solvespace.cpp:609 #: solvespace.cpp:610
msgctxt "button" msgctxt "button"
msgid "Do&n't Save" msgid "Do&n't Save"
msgstr "&Verwerfen" msgstr "&Verwerfen"
# solvespace.cpp:557 # solvespace.cpp:557
#: solvespace.cpp:630 #: solvespace.cpp:631
msgctxt "title" msgctxt "title"
msgid "(new sketch)" msgid "(new sketch)"
msgstr "(Neue Skizze)" msgstr "(Neue Skizze)"
#: solvespace.cpp:637 #: solvespace.cpp:638
msgctxt "title" msgctxt "title"
msgid "Property Browser" msgid "Property Browser"
msgstr "Attribut-Browser" msgstr "Attribut-Browser"
#: solvespace.cpp:699 #: solvespace.cpp:700
msgid "" msgid ""
"Constraints are currently shown, and will be exported in the toolpath. This " "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 " "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 " "wahrscheinlich nicht. Verstecken Sie sie in dem auf den Link oben im "
"Textfenster klicken." "Textfenster klicken."
#: solvespace.cpp:771 #: solvespace.cpp:772
#, c-format #, c-format
msgid "" msgid ""
"Can't identify file type from file extension of filename '%s'; try .dxf or ." "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 " "Kann den Dateityp der Datei '%s' nicht auf Grund der Dateierweiterung "
"erkennen. Versuchen Sie .dxf oder .dwg." "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." msgid "Constraint must have a label, and must not be a reference dimension."
msgstr "" msgstr ""
"Die Einschränkung muss einen Namen haben, und darf keine " "Die Einschränkung muss einen Namen haben, und darf keine "
"Referenzdimensionierung sein." "Referenzdimensionierung sein."
#: solvespace.cpp:827 #: solvespace.cpp:828
msgid "Bad selection for step dimension; select a constraint." msgid "Bad selection for step dimension; select a constraint."
msgstr "" msgstr ""
"Falsche Auswahl für die Schrittdimensionierung. Wählen Sie eine " "Falsche Auswahl für die Schrittdimensionierung. Wählen Sie eine "
"Einschränkung." "Einschränkung."
#: solvespace.cpp:851 #: solvespace.cpp:852
msgid "The assembly does not interfere, good." msgid "The assembly does not interfere, good."
msgstr "Der Zusammenbau funktioniert, gut." msgstr "Der Zusammenbau funktioniert, gut."
#: solvespace.cpp:867 #: solvespace.cpp:868
#, c-format #, c-format
msgid "" msgid ""
"The volume of the solid model is:\n" "The volume of the solid model is:\n"
@ -1869,7 +1877,7 @@ msgstr ""
"\n" "\n"
" %s" " %s"
#: solvespace.cpp:876 #: solvespace.cpp:877
#, c-format #, c-format
msgid "" msgid ""
"\n" "\n"
@ -1882,7 +1890,7 @@ msgstr ""
"\n" "\n"
" %s" " %s"
#: solvespace.cpp:881 #: solvespace.cpp:882
msgid "" msgid ""
"\n" "\n"
"\n" "\n"
@ -1894,7 +1902,7 @@ msgstr ""
"Gekrümmte Flächen wurden als Dreiecksnetz angenähert.\n" "Gekrümmte Flächen wurden als Dreiecksnetz angenähert.\n"
"Das verursacht Fehler, typischerweise um 1%." "Das verursacht Fehler, typischerweise um 1%."
#: solvespace.cpp:896 #: solvespace.cpp:897
#, c-format #, c-format
msgid "" msgid ""
"The surface area of the selected faces is:\n" "The surface area of the selected faces is:\n"
@ -1911,7 +1919,7 @@ msgstr ""
"Kurven wurden als gerade Linienstücke angenähert.\n" "Kurven wurden als gerade Linienstücke angenähert.\n"
"Das verursacht Fehler, typischerweise um 1%%." "Das verursacht Fehler, typischerweise um 1%%."
#: solvespace.cpp:905 #: solvespace.cpp:906
msgid "" msgid ""
"This group does not contain a correctly-formed 2d closed area. It is open, " "This group does not contain a correctly-formed 2d closed area. It is open, "
"not coplanar, or self-intersecting." "not coplanar, or self-intersecting."
@ -1919,7 +1927,7 @@ msgstr ""
"Diese Gruppe beinhaltet keine korrekt geschlossene 2D Fläche. Sie ist offen, " "Diese Gruppe beinhaltet keine korrekt geschlossene 2D Fläche. Sie ist offen, "
"nicht koplanar, oder überschneidet sich selbst." "nicht koplanar, oder überschneidet sich selbst."
#: solvespace.cpp:917 #: solvespace.cpp:918
#, c-format #, c-format
msgid "" msgid ""
"The area of the region sketched in this group is:\n" "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" "Kurven wurden als gerade Linienstücke angenähert.\n"
"Das verursacht Fehler, typischerweise um 1%%." "Das verursacht Fehler, typischerweise um 1%%."
#: solvespace.cpp:937 #: solvespace.cpp:938
#, c-format #, c-format
msgid "" msgid ""
"The total length of the selected entities is:\n" "The total length of the selected entities is:\n"
@ -1953,36 +1961,36 @@ msgstr ""
"Kurven wurden als gerade Linienstücke angenähert.\n" "Kurven wurden als gerade Linienstücke angenähert.\n"
"Das verursacht Fehler, typischerweise um 1%%." "Das verursacht Fehler, typischerweise um 1%%."
#: solvespace.cpp:943 #: solvespace.cpp:944
msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgid "Bad selection for perimeter; select line segments, arcs, and curves."
msgstr "Falsche Auswahl für Umfang. Wähle Liniensegmente, Bögen und Kurven." 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." msgid "Bad selection for trace; select a single point."
msgstr "Falsche Auswahl für Punkt nachzeichnen. Wähle einen einzelnen Punkt." msgstr "Falsche Auswahl für Punkt nachzeichnen. Wähle einen einzelnen Punkt."
#: solvespace.cpp:986 #: solvespace.cpp:987
#, c-format #, c-format
msgid "Couldn't write to '%s'" msgid "Couldn't write to '%s'"
msgstr "Konnte '%s' nicht schreiben" msgstr "Konnte '%s' nicht schreiben"
#: solvespace.cpp:1016 #: solvespace.cpp:1017
msgid "The mesh is self-intersecting (NOT okay, invalid)." msgid "The mesh is self-intersecting (NOT okay, invalid)."
msgstr "Das Netz schneidet sich selbst: Falsch, ungültig." msgstr "Das Netz schneidet sich selbst: Falsch, ungültig."
#: solvespace.cpp:1017 #: solvespace.cpp:1018
msgid "The mesh is not self-intersecting (okay, valid)." msgid "The mesh is not self-intersecting (okay, valid)."
msgstr "Das Netz schneidet sich nicht: Gut, gültig." msgstr "Das Netz schneidet sich nicht: Gut, gültig."
#: solvespace.cpp:1019 #: solvespace.cpp:1020
msgid "The mesh has naked edges (NOT okay, invalid)." msgid "The mesh has naked edges (NOT okay, invalid)."
msgstr "Das Netz hat lose Kanten: Falsch, ungültig." msgstr "Das Netz hat lose Kanten: Falsch, ungültig."
#: solvespace.cpp:1020 #: solvespace.cpp:1021
msgid "The mesh is watertight (okay, valid)." msgid "The mesh is watertight (okay, valid)."
msgstr "Das Netz hat keine lose Kanten: Gut, gültig." msgstr "Das Netz hat keine lose Kanten: Gut, gültig."
#: solvespace.cpp:1023 #: solvespace.cpp:1024
#, c-format #, c-format
msgid "" msgid ""
"\n" "\n"
@ -1993,7 +2001,7 @@ msgstr ""
"\n" "\n"
"Das Modell hat %d Dreiecke, von %d Flächen." "Das Modell hat %d Dreiecke, von %d Flächen."
#: solvespace.cpp:1027 #: solvespace.cpp:1028
#, c-format #, c-format
msgid "" msgid ""
"%s\n" "%s\n"
@ -2008,7 +2016,7 @@ msgstr ""
"\n" "\n"
"Keine problematischen Kanten, gut.%s" "Keine problematischen Kanten, gut.%s"
#: solvespace.cpp:1030 #: solvespace.cpp:1031
#, c-format #, c-format
msgid "" msgid ""
"%s\n" "%s\n"
@ -2023,7 +2031,7 @@ msgstr ""
"\n" "\n"
"%d problematische Kanten, schlecht.%s" "%d problematische Kanten, schlecht.%s"
#: solvespace.cpp:1043 #: solvespace.cpp:1044
#, c-format #, c-format
msgid "" msgid ""
"This is SolveSpace version %s.\n" "This is SolveSpace version %s.\n"
@ -2066,23 +2074,23 @@ msgstr ""
msgid "Style name cannot be empty" msgid "Style name cannot be empty"
msgstr "Name des Linientyps kann nicht leer sein." msgstr "Name des Linientyps kann nicht leer sein."
#: textscreens.cpp:785 #: textscreens.cpp:791
msgid "Can't repeat fewer than 1 time." msgid "Can't repeat fewer than 1 time."
msgstr "Nicht weniger als 1 Wiederholung möglich." msgstr "Nicht weniger als 1 Wiederholung möglich."
#: textscreens.cpp:789 #: textscreens.cpp:795
msgid "Can't repeat more than 999 times." msgid "Can't repeat more than 999 times."
msgstr "Nicht mehr als 999 Wiederholungen möglich." msgstr "Nicht mehr als 999 Wiederholungen möglich."
#: textscreens.cpp:814 #: textscreens.cpp:820
msgid "Group name cannot be empty" msgid "Group name cannot be empty"
msgstr "Der Name der Gruppe darf nicht leer sein." msgstr "Der Name der Gruppe darf nicht leer sein."
#: textscreens.cpp:866 #: textscreens.cpp:872
msgid "Opacity must be between zero and one." msgid "Opacity must be between zero and one."
msgstr "Durchsichtigkeit muss zwischen Null und Eins sein." msgstr "Durchsichtigkeit muss zwischen Null und Eins sein."
#: textscreens.cpp:901 #: textscreens.cpp:907
msgid "Radius cannot be zero or negative." msgid "Radius cannot be zero or negative."
msgstr "Radius darf nicht null oder negativ sein." msgstr "Radius darf nicht null oder negativ sein."

View File

@ -2,12 +2,12 @@
# Copyright (C) 2017 the SolveSpace authors # Copyright (C) 2017 the SolveSpace authors
# This file is distributed under the same license as the SolveSpace package. # This file is distributed under the same license as the SolveSpace package.
# Automatically generated, 2017. # Automatically generated, 2017.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: SolveSpace 3.0\n" "Project-Id-Version: SolveSpace 3.0\n"
"Report-Msgid-Bugs-To: whitequark@whitequark.org\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" "PO-Revision-Date: 2017-01-05 10:30+0000\n"
"Last-Translator: Automatically generated\n" "Last-Translator: Automatically generated\n"
"Language-Team: none\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." msgid "Number of copies to paste must be at least one."
msgstr "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." msgid "Scale cannot be zero."
msgstr "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." msgid "No workplane active."
msgstr "No workplane active." msgstr "No workplane active."
#: confscreen.cpp:376 #: confscreen.cpp:381
msgid "Bad format: specify coordinates as x, y, z" msgid "Bad format: specify coordinates as x, y, z"
msgstr "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" msgid "Bad format: specify color as r, g, b"
msgstr "Bad format: specify color as r, g, b" msgstr "Bad format: specify color as r, g, b"
#: confscreen.cpp:412 #: confscreen.cpp:417
msgid "" msgid ""
"The perspective factor will have no effect until you enable View -> Use " "The perspective factor will have no effect until you enable View -> Use "
"Perspective Projection." "Perspective Projection."
@ -79,24 +79,24 @@ msgstr ""
"The perspective factor will have no effect until you enable View -> Use " "The perspective factor will have no effect until you enable View -> Use "
"Perspective Projection." "Perspective Projection."
#: confscreen.cpp:430 confscreen.cpp:440 #: confscreen.cpp:435 confscreen.cpp:445
#, c-format #, c-format
msgid "Specify between 0 and %d digits after the decimal." msgid "Specify between 0 and %d digits after the decimal."
msgstr "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!" msgid "Export scale must not be zero!"
msgstr "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!" msgid "Cutter radius offset must not be negative!"
msgstr "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" msgid "Bad value: autosave interval should be positive"
msgstr "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" msgid "Bad format: specify interval in integral minutes"
msgstr "Bad format: specify interval in integral minutes" msgstr "Bad format: specify interval in integral minutes"
@ -677,7 +677,7 @@ msgctxt "button"
msgid "&No" msgid "&No"
msgstr "&No" msgstr "&No"
#: file.cpp:877 solvespace.cpp:610 #: file.cpp:877 solvespace.cpp:611
msgctxt "button" msgctxt "button"
msgid "&Cancel" msgid "&Cancel"
msgstr "&Cancel" msgstr "&Cancel"
@ -1130,24 +1130,28 @@ msgstr "&Language"
msgid "&Website / Manual" msgid "&Website / Manual"
msgstr "&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" msgid "&About"
msgstr "&About" msgstr "&About"
#: graphicswin.cpp:361 #: graphicswin.cpp:362
msgid "(no recent files)" msgid "(no recent files)"
msgstr "(no recent files)" msgstr "(no recent files)"
#: graphicswin.cpp:369 #: graphicswin.cpp:370
#, c-format #, c-format
msgid "File '%s' does not exist." msgid "File '%s' does not exist."
msgstr "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." msgid "No workplane is active, so the grid will not appear."
msgstr "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 "" msgid ""
"The perspective factor is set to zero, so the view will always be a parallel " "The perspective factor is set to zero, so the view will always be a parallel "
"projection.\n" "projection.\n"
@ -1161,17 +1165,17 @@ msgstr ""
"For a perspective projection, modify the perspective factor in the " "For a perspective projection, modify the perspective factor in the "
"configuration screen. A value around 0.3 is typical." "configuration screen. A value around 0.3 is typical."
#: graphicswin.cpp:836 #: graphicswin.cpp:837
msgid "" msgid ""
"Select a point; this point will become the center of the view on screen." "Select a point; this point will become the center of the view on screen."
msgstr "" msgstr ""
"Select a point; this point will become the center of the view on screen." "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." msgid "No additional entities share endpoints with the selected entities."
msgstr "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 "" msgid ""
"To use this command, select a point or other entity from an linked part, or " "To use this command, select a point or other entity from an linked part, or "
"make a link group the active group." "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 " "To use this command, select a point or other entity from an linked part, or "
"make a link group the active group." "make a link group the active group."
#: graphicswin.cpp:1177 #: graphicswin.cpp:1178
msgid "" msgid ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "No workplane is active. Activate a workplane (with Sketch -> In Workplane) "
"to define the plane for the snap grid." "to define the plane for the snap grid."
@ -1187,7 +1191,7 @@ msgstr ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "No workplane is active. Activate a workplane (with Sketch -> In Workplane) "
"to define the plane for the snap grid." "to define the plane for the snap grid."
#: graphicswin.cpp:1184 #: graphicswin.cpp:1185
msgid "" msgid ""
"Can't snap these items to grid; select points, text comments, or constraints " "Can't snap these items to grid; select points, text comments, or constraints "
"with a label. To snap a line, select its endpoints." "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 " "Can't snap these items to grid; select points, text comments, or constraints "
"with a label. To snap a line, select its endpoints." "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." msgid "No workplane selected. Activating default workplane for this group."
msgstr "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 "" msgid ""
"No workplane is selected, and the active group does not have a default " "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. 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. Try selecting a workplane, or activating a sketch-in-new-"
"workplane group." "workplane group."
#: graphicswin.cpp:1293 #: graphicswin.cpp:1294
msgid "" msgid ""
"Bad selection for tangent arc at point. Select a single point, or select " "Bad selection for tangent arc at point. Select a single point, or select "
"nothing to set up arc parameters." "nothing to set up arc parameters."
@ -1217,47 +1221,47 @@ msgstr ""
"Bad selection for tangent arc at point. Select a single point, or select " "Bad selection for tangent arc at point. Select a single point, or select "
"nothing to set up arc parameters." "nothing to set up arc parameters."
#: graphicswin.cpp:1304 #: graphicswin.cpp:1305
msgid "click point on arc (draws anti-clockwise)" msgid "click point on arc (draws anti-clockwise)"
msgstr "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" msgid "click to place datum point"
msgstr "click to place datum point" msgstr "click to place datum point"
#: graphicswin.cpp:1306 #: graphicswin.cpp:1307
msgid "click first point of line segment" msgid "click first point of line segment"
msgstr "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" msgid "click first point of construction line segment"
msgstr "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" msgid "click first point of cubic segment"
msgstr "click first point of cubic segment" msgstr "click first point of cubic segment"
#: graphicswin.cpp:1310 #: graphicswin.cpp:1311
msgid "click center of circle" msgid "click center of circle"
msgstr "click center of circle" msgstr "click center of circle"
#: graphicswin.cpp:1311 #: graphicswin.cpp:1312
msgid "click origin of workplane" msgid "click origin of workplane"
msgstr "click origin of workplane" msgstr "click origin of workplane"
#: graphicswin.cpp:1312 #: graphicswin.cpp:1313
msgid "click one corner of rectangle" msgid "click one corner of rectangle"
msgstr "click one corner of rectangle" msgstr "click one corner of rectangle"
#: graphicswin.cpp:1313 #: graphicswin.cpp:1314
msgid "click top left of text" msgid "click top left of text"
msgstr "click top left of text" msgstr "click top left of text"
#: graphicswin.cpp:1319 #: graphicswin.cpp:1320
msgid "click top left of image" msgid "click top left of image"
msgstr "click top left of image" msgstr "click top left of image"
#: graphicswin.cpp:1345 #: graphicswin.cpp:1346
msgid "" msgid ""
"No entities are selected. Select entities before trying to toggle their " "No entities are selected. Select entities before trying to toggle their "
"construction state." "construction state."
@ -1416,6 +1420,10 @@ msgstr "contour is self-intersecting!"
msgid "zero-length edge!" msgid "zero-length edge!"
msgstr "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 #: modify.cpp:252
msgid "Must be sketching in workplane to create tangent arc." msgid "Must be sketching in workplane to create tangent arc."
msgstr "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 " "Can't draw image in 3d; first, activate a workplane with Sketch -> In "
"Workplane." "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" msgctxt "file-type"
msgid "SolveSpace models" msgid "SolveSpace models"
msgstr "SolveSpace models" msgstr "SolveSpace models"
@ -1705,104 +1713,104 @@ msgctxt "file-type"
msgid "Comma-separated values" msgid "Comma-separated values"
msgstr "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" msgid "untitled"
msgstr "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 #: platform/guiwin.cpp:1639
msgctxt "title" msgctxt "title"
msgid "Save File" msgid "Save File"
msgstr "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 #: platform/guiwin.cpp:1645
msgctxt "title" msgctxt "title"
msgid "Open File" msgid "Open File"
msgstr "Open File" msgstr "Open File"
#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 #: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433
msgctxt "button" msgctxt "button"
msgid "_Cancel" msgid "_Cancel"
msgstr "_Cancel" msgstr "_Cancel"
#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 #: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431
msgctxt "button" msgctxt "button"
msgid "_Save" msgid "_Save"
msgstr "_Save" msgstr "_Save"
#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 #: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432
msgctxt "button" msgctxt "button"
msgid "_Open" msgid "_Open"
msgstr "_Open" msgstr "_Open"
#: solvespace.cpp:170 #: solvespace.cpp:171
msgctxt "title" msgctxt "title"
msgid "Autosave Available" msgid "Autosave Available"
msgstr "Autosave Available" msgstr "Autosave Available"
#: solvespace.cpp:171 #: solvespace.cpp:172
msgctxt "dialog" msgctxt "dialog"
msgid "An autosave file is available for this sketch." msgid "An autosave file is available for this sketch."
msgstr "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" msgctxt "dialog"
msgid "Do you want to load the autosave file instead?" msgid "Do you want to load the autosave file instead?"
msgstr "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" msgctxt "button"
msgid "&Load autosave" msgid "&Load autosave"
msgstr "&Load autosave" msgstr "&Load autosave"
#: solvespace.cpp:175 #: solvespace.cpp:176
msgctxt "button" msgctxt "button"
msgid "Do&n't Load" msgid "Do&n't Load"
msgstr "Do&n't Load" msgstr "Do&n't Load"
#: solvespace.cpp:598 #: solvespace.cpp:599
msgctxt "title" msgctxt "title"
msgid "Modified File" msgid "Modified File"
msgstr "Modified File" msgstr "Modified File"
#: solvespace.cpp:600 #: solvespace.cpp:601
#, c-format #, c-format
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to save the changes you made to the sketch “%s”?" 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”?" msgstr "Do you want to save the changes you made to the sketch “%s”?"
#: solvespace.cpp:603 #: solvespace.cpp:604
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to save the changes you made to the new sketch?" 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?" msgstr "Do you want to save the changes you made to the new sketch?"
#: solvespace.cpp:606 #: solvespace.cpp:607
msgctxt "dialog" msgctxt "dialog"
msgid "Your changes will be lost if you don't save them." msgid "Your changes will be lost if you don't save them."
msgstr "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" msgctxt "button"
msgid "&Save" msgid "&Save"
msgstr "&Save" msgstr "&Save"
#: solvespace.cpp:609 #: solvespace.cpp:610
msgctxt "button" msgctxt "button"
msgid "Do&n't Save" msgid "Do&n't Save"
msgstr "Do&n't Save" msgstr "Do&n't Save"
#: solvespace.cpp:630 #: solvespace.cpp:631
msgctxt "title" msgctxt "title"
msgid "(new sketch)" msgid "(new sketch)"
msgstr "(new sketch)" msgstr "(new sketch)"
#: solvespace.cpp:637 #: solvespace.cpp:638
msgctxt "title" msgctxt "title"
msgid "Property Browser" msgid "Property Browser"
msgstr "Property Browser" msgstr "Property Browser"
#: solvespace.cpp:699 #: solvespace.cpp:700
msgid "" msgid ""
"Constraints are currently shown, and will be exported in the toolpath. This " "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 " "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 " "is probably not what you want; hide them by clicking the link at the top of "
"the text window." "the text window."
#: solvespace.cpp:771 #: solvespace.cpp:772
#, c-format #, c-format
msgid "" msgid ""
"Can't identify file type from file extension of filename '%s'; try .dxf or ." "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 ." "Can't identify file type from file extension of filename '%s'; try .dxf or ."
"dwg." "dwg."
#: solvespace.cpp:823 #: solvespace.cpp:824
msgid "Constraint must have a label, and must not be a reference dimension." 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." 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." msgid "Bad selection for step dimension; select a constraint."
msgstr "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." msgid "The assembly does not interfere, good."
msgstr "The assembly does not interfere, good." msgstr "The assembly does not interfere, good."
#: solvespace.cpp:867 #: solvespace.cpp:868
#, c-format #, c-format
msgid "" msgid ""
"The volume of the solid model is:\n" "The volume of the solid model is:\n"
@ -1844,7 +1852,7 @@ msgstr ""
"\n" "\n"
" %s" " %s"
#: solvespace.cpp:876 #: solvespace.cpp:877
#, c-format #, c-format
msgid "" msgid ""
"\n" "\n"
@ -1857,7 +1865,7 @@ msgstr ""
"\n" "\n"
" %s" " %s"
#: solvespace.cpp:881 #: solvespace.cpp:882
msgid "" msgid ""
"\n" "\n"
"\n" "\n"
@ -1869,7 +1877,7 @@ msgstr ""
"Curved surfaces have been approximated as triangles.\n" "Curved surfaces have been approximated as triangles.\n"
"This introduces error, typically of around 1%." "This introduces error, typically of around 1%."
#: solvespace.cpp:896 #: solvespace.cpp:897
#, c-format #, c-format
msgid "" msgid ""
"The surface area of the selected faces is:\n" "The surface area of the selected faces is:\n"
@ -1886,7 +1894,7 @@ msgstr ""
"Curves have been approximated as piecewise linear.\n" "Curves have been approximated as piecewise linear.\n"
"This introduces error, typically of around 1%%." "This introduces error, typically of around 1%%."
#: solvespace.cpp:905 #: solvespace.cpp:906
msgid "" msgid ""
"This group does not contain a correctly-formed 2d closed area. It is open, " "This group does not contain a correctly-formed 2d closed area. It is open, "
"not coplanar, or self-intersecting." "not coplanar, or self-intersecting."
@ -1894,7 +1902,7 @@ msgstr ""
"This group does not contain a correctly-formed 2d closed area. It is open, " "This group does not contain a correctly-formed 2d closed area. It is open, "
"not coplanar, or self-intersecting." "not coplanar, or self-intersecting."
#: solvespace.cpp:917 #: solvespace.cpp:918
#, c-format #, c-format
msgid "" msgid ""
"The area of the region sketched in this group is:\n" "The area of the region sketched in this group is:\n"
@ -1911,7 +1919,7 @@ msgstr ""
"Curves have been approximated as piecewise linear.\n" "Curves have been approximated as piecewise linear.\n"
"This introduces error, typically of around 1%%." "This introduces error, typically of around 1%%."
#: solvespace.cpp:937 #: solvespace.cpp:938
#, c-format #, c-format
msgid "" msgid ""
"The total length of the selected entities is:\n" "The total length of the selected entities is:\n"
@ -1928,36 +1936,36 @@ msgstr ""
"Curves have been approximated as piecewise linear.\n" "Curves have been approximated as piecewise linear.\n"
"This introduces error, typically of around 1%%." "This introduces error, typically of around 1%%."
#: solvespace.cpp:943 #: solvespace.cpp:944
msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgid "Bad selection for perimeter; select line segments, arcs, and curves."
msgstr "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." msgid "Bad selection for trace; select a single point."
msgstr "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 #, c-format
msgid "Couldn't write to '%s'" msgid "Couldn't write to '%s'"
msgstr "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)." msgid "The mesh is self-intersecting (NOT okay, invalid)."
msgstr "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)." msgid "The mesh is not self-intersecting (okay, valid)."
msgstr "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)." msgid "The mesh has naked edges (NOT okay, invalid)."
msgstr "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)." msgid "The mesh is watertight (okay, valid)."
msgstr "The mesh is watertight (okay, valid)." msgstr "The mesh is watertight (okay, valid)."
#: solvespace.cpp:1023 #: solvespace.cpp:1024
#, c-format #, c-format
msgid "" msgid ""
"\n" "\n"
@ -1968,7 +1976,7 @@ msgstr ""
"\n" "\n"
"The model contains %d triangles, from %d surfaces." "The model contains %d triangles, from %d surfaces."
#: solvespace.cpp:1027 #: solvespace.cpp:1028
#, c-format #, c-format
msgid "" msgid ""
"%s\n" "%s\n"
@ -1983,7 +1991,7 @@ msgstr ""
"\n" "\n"
"Zero problematic edges, good.%s" "Zero problematic edges, good.%s"
#: solvespace.cpp:1030 #: solvespace.cpp:1031
#, c-format #, c-format
msgid "" msgid ""
"%s\n" "%s\n"
@ -1998,7 +2006,7 @@ msgstr ""
"\n" "\n"
"%d problematic edges, bad.%s" "%d problematic edges, bad.%s"
#: solvespace.cpp:1043 #: solvespace.cpp:1044
#, c-format #, c-format
msgid "" msgid ""
"This is SolveSpace version %s.\n" "This is SolveSpace version %s.\n"
@ -2039,23 +2047,23 @@ msgstr ""
msgid "Style name cannot be empty" msgid "Style name cannot be empty"
msgstr "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." msgid "Can't repeat fewer than 1 time."
msgstr "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." msgid "Can't repeat more than 999 times."
msgstr "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" msgid "Group name cannot be empty"
msgstr "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." msgid "Opacity must be between zero and one."
msgstr "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." msgid "Radius cannot be zero or negative."
msgstr "Radius cannot be zero or negative." msgstr "Radius cannot be zero or negative."

View File

@ -2,12 +2,12 @@
# Copyright (C) 2017 the SolveSpace authors # Copyright (C) 2017 the SolveSpace authors
# This file is distributed under the same license as the SolveSpace package. # This file is distributed under the same license as the SolveSpace package.
# Maxi <andesfreedesign@gmail.com>, 2021. # Maxi <andesfreedesign@gmail.com>, 2021.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: SolveSpace 3.0\n" "Project-Id-Version: SolveSpace 3.0\n"
"Report-Msgid-Bugs-To: whitequark@whitequark.org\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" "PO-Revision-Date: 2021-09-17 \n"
"Last-Translator: andesfreedesign@gmail.com\n" "Last-Translator: andesfreedesign@gmail.com\n"
"Language-Team: AndesFreeDesign\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." msgid "Number of copies to paste must be at least one."
msgstr "El número de copias para pegar debe ser al menos una." 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." msgid "Scale cannot be zero."
msgstr "La escala no puede ser cero." 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." msgid "No workplane active."
msgstr "Ningún plano de trabajo activo." msgstr "Ningún plano de trabajo activo."
#: confscreen.cpp:376 #: confscreen.cpp:381
msgid "Bad format: specify coordinates as x, y, z" msgid "Bad format: specify coordinates as x, y, z"
msgstr "Formato incorrecto: especifique las coordenadas como 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" msgid "Bad format: specify color as r, g, b"
msgstr "Formato incorrecto: especifique color como r, g, b" msgstr "Formato incorrecto: especifique color como r, g, b"
#: confscreen.cpp:412 #: confscreen.cpp:417
msgid "" msgid ""
"The perspective factor will have no effect until you enable View -> Use " "The perspective factor will have no effect until you enable View -> Use "
"Perspective Projection." "Perspective Projection."
@ -79,24 +79,24 @@ msgstr ""
"El factor de perspectiva no tendrá ningún efecto hasta que habilite Ver -> " "El factor de perspectiva no tendrá ningún efecto hasta que habilite Ver -> "
"UsarProyección Perspectiva." "UsarProyección Perspectiva."
#: confscreen.cpp:430 confscreen.cpp:440 #: confscreen.cpp:435 confscreen.cpp:445
#, c-format #, c-format
msgid "Specify between 0 and %d digits after the decimal." msgid "Specify between 0 and %d digits after the decimal."
msgstr "Especifique entre 0 y %d dígitos después del 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!" msgid "Export scale must not be zero!"
msgstr "¡La escala de exportación no debe ser cero!" msgstr "¡La escala de exportación no debe ser cero!"
#: confscreen.cpp:464 #: confscreen.cpp:469
msgid "Cutter radius offset must not be negative!" msgid "Cutter radius offset must not be negative!"
msgstr "¡El desfase del radio de corte no debe ser negativo!" 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" msgid "Bad value: autosave interval should be positive"
msgstr "Valor incorrecto: el intervalo de autoguardado debe ser positivo" msgstr "Valor incorrecto: el intervalo de autoguardado debe ser positivo"
#: confscreen.cpp:521 #: confscreen.cpp:531
msgid "Bad format: specify interval in integral minutes" msgid "Bad format: specify interval in integral minutes"
msgstr "Formato incorrecto: especifique el intervalo en minutos integrales" msgstr "Formato incorrecto: especifique el intervalo en minutos integrales"
@ -676,7 +676,7 @@ msgctxt "button"
msgid "&No" msgid "&No"
msgstr "&No" msgstr "&No"
#: file.cpp:877 solvespace.cpp:610 #: file.cpp:877 solvespace.cpp:611
msgctxt "button" msgctxt "button"
msgid "&Cancel" msgid "&Cancel"
msgstr "&Cancelar" msgstr "&Cancelar"
@ -1129,25 +1129,29 @@ msgstr "&Lenguaje"
msgid "&Website / Manual" msgid "&Website / Manual"
msgstr "&Sitio Web / Manual" msgstr "&Sitio Web / Manual"
#: graphicswin.cpp:187 #: graphicswin.cpp:186
msgid "&Go to GitHub commit"
msgstr ""
#: graphicswin.cpp:188
msgid "&About" msgid "&About"
msgstr "&Acerca" msgstr "&Acerca"
#: graphicswin.cpp:361 #: graphicswin.cpp:362
msgid "(no recent files)" msgid "(no recent files)"
msgstr "(no hay archivos recientes)" msgstr "(no hay archivos recientes)"
#: graphicswin.cpp:369 #: graphicswin.cpp:370
#, c-format #, c-format
msgid "File '%s' does not exist." msgid "File '%s' does not exist."
msgstr "El archivo '%s' no existe." msgstr "El archivo '%s' no existe."
#: graphicswin.cpp:736 #: graphicswin.cpp:737
msgid "No workplane is active, so the grid will not appear." msgid "No workplane is active, so the grid will not appear."
msgstr "" msgstr ""
"No hay ningún plano de trabajo activo, por lo que la cuadrícula no aparecerá." "No hay ningún plano de trabajo activo, por lo que la cuadrícula no aparecerá."
#: graphicswin.cpp:751 #: graphicswin.cpp:752
msgid "" msgid ""
"The perspective factor is set to zero, so the view will always be a parallel " "The perspective factor is set to zero, so the view will always be a parallel "
"projection.\n" "projection.\n"
@ -1161,20 +1165,20 @@ msgstr ""
"Para una proyección en perspectiva, modifique el factor de perspectiva en la " "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." "pantalla de configuración. Un valor de alrededor de 0,3 es típico."
#: graphicswin.cpp:836 #: graphicswin.cpp:837
msgid "" msgid ""
"Select a point; this point will become the center of the view on screen." "Select a point; this point will become the center of the view on screen."
msgstr "" msgstr ""
"Seleccione un punto; este punto se convertirá en el centro de la vista en " "Seleccione un punto; este punto se convertirá en el centro de la vista en "
"pantalla." "pantalla."
#: graphicswin.cpp:1136 #: graphicswin.cpp:1137
msgid "No additional entities share endpoints with the selected entities." msgid "No additional entities share endpoints with the selected entities."
msgstr "" msgstr ""
"Ninguna entidad adicional comparte puntos finales con las entidades " "Ninguna entidad adicional comparte puntos finales con las entidades "
"seleccionadas." "seleccionadas."
#: graphicswin.cpp:1154 #: graphicswin.cpp:1155
msgid "" msgid ""
"To use this command, select a point or other entity from an linked part, or " "To use this command, select a point or other entity from an linked part, or "
"make a link group the active group." "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 " "Para usar este comando, seleccione un punto u otra entidad de una parte "
"vinculada, o convertir un grupo de enlaces en el grupo activo." "vinculada, o convertir un grupo de enlaces en el grupo activo."
#: graphicswin.cpp:1177 #: graphicswin.cpp:1178
msgid "" msgid ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "No workplane is active. Activate a workplane (with Sketch -> In Workplane) "
"to define the plane for the snap grid." "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 " "Croquis -> En plano de trabajo) para definir el plano para el enganche a la "
"cuadrícula." "cuadrícula."
#: graphicswin.cpp:1184 #: graphicswin.cpp:1185
msgid "" msgid ""
"Can't snap these items to grid; select points, text comments, or constraints " "Can't snap these items to grid; select points, text comments, or constraints "
"with a label. To snap a line, select its endpoints." "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 " "comentarios de texto o restricciones con una etiqueta. Para enganchar una "
"línea, seleccione sus puntos finales." "línea, seleccione sus puntos finales."
#: graphicswin.cpp:1269 #: graphicswin.cpp:1270
msgid "No workplane selected. Activating default workplane for this group." msgid "No workplane selected. Activating default workplane for this group."
msgstr "" msgstr ""
"No se seleccionó ningún plano de trabajo. Activando el plano de trabajo " "No se seleccionó ningún plano de trabajo. Activando el plano de trabajo "
"predeterminado para este grupo." "predeterminado para este grupo."
#: graphicswin.cpp:1272 #: graphicswin.cpp:1273
msgid "" msgid ""
"No workplane is selected, and the active group does not have a default " "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. 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-" "de trabajo. Intente seleccionar un plano de trabajo o activar un croquis-en-"
"nuevo-grupo de plano de trabajo." "nuevo-grupo de plano de trabajo."
#: graphicswin.cpp:1293 #: graphicswin.cpp:1294
msgid "" msgid ""
"Bad selection for tangent arc at point. Select a single point, or select " "Bad selection for tangent arc at point. Select a single point, or select "
"nothing to set up arc parameters." "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 " "Mala selección de arco tangente en el punto. Seleccione un solo punto o no "
"seleccione nada para configurar los parámetros del arco." "seleccione nada para configurar los parámetros del arco."
#: graphicswin.cpp:1304 #: graphicswin.cpp:1305
msgid "click point on arc (draws anti-clockwise)" msgid "click point on arc (draws anti-clockwise)"
msgstr "clic en el punto en el arco (dibuja en sentido antihorario)" msgstr "clic en el punto en el arco (dibuja en sentido antihorario)"
#: graphicswin.cpp:1305 #: graphicswin.cpp:1306
msgid "click to place datum point" msgid "click to place datum point"
msgstr "clic para colocar el punto de referencia" msgstr "clic para colocar el punto de referencia"
#: graphicswin.cpp:1306 #: graphicswin.cpp:1307
msgid "click first point of line segment" msgid "click first point of line segment"
msgstr "clic en el primer punto del segmento de línea" 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" msgid "click first point of construction line segment"
msgstr "clic en el primer punto del segmento de línea de construcción" 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" msgid "click first point of cubic segment"
msgstr "clic en el primer punto del segmento cúbico" msgstr "clic en el primer punto del segmento cúbico"
#: graphicswin.cpp:1310 #: graphicswin.cpp:1311
msgid "click center of circle" msgid "click center of circle"
msgstr "clic en el centro del círculo" msgstr "clic en el centro del círculo"
#: graphicswin.cpp:1311 #: graphicswin.cpp:1312
msgid "click origin of workplane" msgid "click origin of workplane"
msgstr "clic en origen del plano de trabajo" msgstr "clic en origen del plano de trabajo"
#: graphicswin.cpp:1312 #: graphicswin.cpp:1313
msgid "click one corner of rectangle" msgid "click one corner of rectangle"
msgstr "clic en una esquina del rectángulo" msgstr "clic en una esquina del rectángulo"
#: graphicswin.cpp:1313 #: graphicswin.cpp:1314
msgid "click top left of text" msgid "click top left of text"
msgstr "clic en la parte superior izquierda del texto" msgstr "clic en la parte superior izquierda del texto"
#: graphicswin.cpp:1319 #: graphicswin.cpp:1320
msgid "click top left of image" msgid "click top left of image"
msgstr "clic en la parte superior izquierda de la imagen" msgstr "clic en la parte superior izquierda de la imagen"
#: graphicswin.cpp:1345 #: graphicswin.cpp:1346
msgid "" msgid ""
"No entities are selected. Select entities before trying to toggle their " "No entities are selected. Select entities before trying to toggle their "
"construction state." "construction state."
@ -1418,6 +1422,10 @@ msgstr "¡El contorno se intersecta a sí mismo!"
msgid "zero-length edge!" msgid "zero-length edge!"
msgstr "¡arista de longitud cero!" msgstr "¡arista de longitud cero!"
#: importmesh.cpp:136
msgid "Text-formated STL files are not currently supported"
msgstr ""
#: modify.cpp:252 #: modify.cpp:252
msgid "Must be sketching in workplane to create tangent arc." msgid "Must be sketching in workplane to create tangent arc."
msgstr "" msgstr ""
@ -1617,7 +1625,7 @@ msgstr ""
"No se puede dibujar una imagen en 3D; primero, active un plano de trabajo " "No se puede dibujar una imagen en 3D; primero, active un plano de trabajo "
"con Croquis -> En 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" msgctxt "file-type"
msgid "SolveSpace models" msgid "SolveSpace models"
msgstr "SolveSpace modelos" msgstr "SolveSpace modelos"
@ -1712,104 +1720,104 @@ msgctxt "file-type"
msgid "Comma-separated values" msgid "Comma-separated values"
msgstr "Valores separados por comas" 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" msgid "untitled"
msgstr "sin título" 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 #: platform/guiwin.cpp:1639
msgctxt "title" msgctxt "title"
msgid "Save File" msgid "Save File"
msgstr "Guardar Archivo" 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 #: platform/guiwin.cpp:1645
msgctxt "title" msgctxt "title"
msgid "Open File" msgid "Open File"
msgstr "Abrir Archivo" msgstr "Abrir Archivo"
#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 #: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433
msgctxt "button" msgctxt "button"
msgid "_Cancel" msgid "_Cancel"
msgstr "_Cancelar" msgstr "_Cancelar"
#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 #: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431
msgctxt "button" msgctxt "button"
msgid "_Save" msgid "_Save"
msgstr "_Guardar" msgstr "_Guardar"
#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 #: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432
msgctxt "button" msgctxt "button"
msgid "_Open" msgid "_Open"
msgstr "_Abrir" msgstr "_Abrir"
#: solvespace.cpp:170 #: solvespace.cpp:171
msgctxt "title" msgctxt "title"
msgid "Autosave Available" msgid "Autosave Available"
msgstr "Autoguardado Disponible" msgstr "Autoguardado Disponible"
#: solvespace.cpp:171 #: solvespace.cpp:172
msgctxt "dialog" msgctxt "dialog"
msgid "An autosave file is available for this sketch." msgid "An autosave file is available for this sketch."
msgstr "Un archivo de autoguardado está disponible para este croquis." msgstr "Un archivo de autoguardado está disponible para este croquis."
#: solvespace.cpp:172 #: solvespace.cpp:173
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to load the autosave file instead?" msgid "Do you want to load the autosave file instead?"
msgstr "¿Desea cargar el archivo de autoguardado en su lugar?" msgstr "¿Desea cargar el archivo de autoguardado en su lugar?"
#: solvespace.cpp:173 #: solvespace.cpp:174
msgctxt "button" msgctxt "button"
msgid "&Load autosave" msgid "&Load autosave"
msgstr "&Cargar autoguardado" msgstr "&Cargar autoguardado"
#: solvespace.cpp:175 #: solvespace.cpp:176
msgctxt "button" msgctxt "button"
msgid "Do&n't Load" msgid "Do&n't Load"
msgstr "No Cargar" msgstr "No Cargar"
#: solvespace.cpp:598 #: solvespace.cpp:599
msgctxt "title" msgctxt "title"
msgid "Modified File" msgid "Modified File"
msgstr "Archivo Modificado" msgstr "Archivo Modificado"
#: solvespace.cpp:600 #: solvespace.cpp:601
#, c-format #, c-format
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to save the changes you made to the sketch “%s”?" 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”?" msgstr "¿Desea guardar los cambios que realizó en el croquis “%s”?"
#: solvespace.cpp:603 #: solvespace.cpp:604
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to save the changes you made to the new sketch?" 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?" msgstr "¿Desea guardar los cambios que realizó en el nuevo croquis?"
#: solvespace.cpp:606 #: solvespace.cpp:607
msgctxt "dialog" msgctxt "dialog"
msgid "Your changes will be lost if you don't save them." msgid "Your changes will be lost if you don't save them."
msgstr "Sus cambios se perderán si no los guarda." msgstr "Sus cambios se perderán si no los guarda."
#: solvespace.cpp:607 #: solvespace.cpp:608
msgctxt "button" msgctxt "button"
msgid "&Save" msgid "&Save"
msgstr "&Guardar" msgstr "&Guardar"
#: solvespace.cpp:609 #: solvespace.cpp:610
msgctxt "button" msgctxt "button"
msgid "Do&n't Save" msgid "Do&n't Save"
msgstr "No& Guardar" msgstr "No& Guardar"
#: solvespace.cpp:630 #: solvespace.cpp:631
msgctxt "title" msgctxt "title"
msgid "(new sketch)" msgid "(new sketch)"
msgstr "(nuevo croquis)" msgstr "(nuevo croquis)"
#: solvespace.cpp:637 #: solvespace.cpp:638
msgctxt "title" msgctxt "title"
msgid "Property Browser" msgid "Property Browser"
msgstr "Explorador de Propiedades" msgstr "Explorador de Propiedades"
#: solvespace.cpp:699 #: solvespace.cpp:700
msgid "" msgid ""
"Constraints are currently shown, and will be exported in the toolpath. This " "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 " "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 " "Probablemente esto no sea lo que quieres; ocultarlos haciendo clic en el "
"enlace en la parte superior de la ventana de texto." "enlace en la parte superior de la ventana de texto."
#: solvespace.cpp:771 #: solvespace.cpp:772
#, c-format #, c-format
msgid "" msgid ""
"Can't identify file type from file extension of filename '%s'; try .dxf or ." "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 " "No se puede identificar el tipo de archivo a partir de la extensión del "
"nombre del archivo '%s'; intente .dxf o .dwg." "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." msgid "Constraint must have a label, and must not be a reference dimension."
msgstr "" msgstr ""
"La restricción debe tener una etiqueta y no debe ser una cota de referencia." "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." msgid "Bad selection for step dimension; select a constraint."
msgstr "Mala selección para la cota del paso; seleccione una restricción." 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." msgid "The assembly does not interfere, good."
msgstr "El ensamble no interfiere, bien." msgstr "El ensamble no interfiere, bien."
#: solvespace.cpp:867 #: solvespace.cpp:868
#, c-format #, c-format
msgid "" msgid ""
"The volume of the solid model is:\n" "The volume of the solid model is:\n"
@ -1852,7 +1860,7 @@ msgstr ""
"\n" "\n"
" %s" " %s"
#: solvespace.cpp:876 #: solvespace.cpp:877
#, c-format #, c-format
msgid "" msgid ""
"\n" "\n"
@ -1865,7 +1873,7 @@ msgstr ""
"\n" "\n"
" %s" " %s"
#: solvespace.cpp:881 #: solvespace.cpp:882
msgid "" msgid ""
"\n" "\n"
"\n" "\n"
@ -1877,7 +1885,7 @@ msgstr ""
"Las superficies curvas se han aproximado como triángulos.\n" "Las superficies curvas se han aproximado como triángulos.\n"
"Esto introduce un error, normalmente alrededor del 1%." "Esto introduce un error, normalmente alrededor del 1%."
#: solvespace.cpp:896 #: solvespace.cpp:897
#, c-format #, c-format
msgid "" msgid ""
"The surface area of the selected faces is:\n" "The surface area of the selected faces is:\n"
@ -1894,7 +1902,7 @@ msgstr ""
"Las curvas se han aproximado como lineales por partes.\n" "Las curvas se han aproximado como lineales por partes.\n"
"Esto introduce un error, normalmente alrededor del 1%%." "Esto introduce un error, normalmente alrededor del 1%%."
#: solvespace.cpp:905 #: solvespace.cpp:906
msgid "" msgid ""
"This group does not contain a correctly-formed 2d closed area. It is open, " "This group does not contain a correctly-formed 2d closed area. It is open, "
"not coplanar, or self-intersecting." "not coplanar, or self-intersecting."
@ -1902,7 +1910,7 @@ msgstr ""
"Este grupo no contiene un área cerrada 2d correctamente formada. Está " "Este grupo no contiene un área cerrada 2d correctamente formada. Está "
"abierta, no coplanares, ni auto-intersectantes." "abierta, no coplanares, ni auto-intersectantes."
#: solvespace.cpp:917 #: solvespace.cpp:918
#, c-format #, c-format
msgid "" msgid ""
"The area of the region sketched in this group is:\n" "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" "Las curvas se han aproximado como lineales por partes.\n"
"Esto introduce un error, normalmente alrededor del 1%%." "Esto introduce un error, normalmente alrededor del 1%%."
#: solvespace.cpp:937 #: solvespace.cpp:938
#, c-format #, c-format
msgid "" msgid ""
"The total length of the selected entities is:\n" "The total length of the selected entities is:\n"
@ -1936,37 +1944,37 @@ msgstr ""
"Las curvas se han aproximado como lineales por partes.\n" "Las curvas se han aproximado como lineales por partes.\n"
"Esto introduce un error, normalmente alrededor del 1%%." "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." msgid "Bad selection for perimeter; select line segments, arcs, and curves."
msgstr "" msgstr ""
"Mala selección de perímetro; seleccione segmentos de línea, arcos y curvas." "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." msgid "Bad selection for trace; select a single point."
msgstr "Mala selección de rastreo; seleccione un solo punto." msgstr "Mala selección de rastreo; seleccione un solo punto."
#: solvespace.cpp:986 #: solvespace.cpp:987
#, c-format #, c-format
msgid "Couldn't write to '%s'" msgid "Couldn't write to '%s'"
msgstr "No pude escribir a '%s'" msgstr "No pude escribir a '%s'"
#: solvespace.cpp:1016 #: solvespace.cpp:1017
msgid "The mesh is self-intersecting (NOT okay, invalid)." msgid "The mesh is self-intersecting (NOT okay, invalid)."
msgstr "La malla se intersecta a si misma (NO está bien, no es válida)." 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)." msgid "The mesh is not self-intersecting (okay, valid)."
msgstr "La malla no se intersecta (está bien, es válida)." 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)." msgid "The mesh has naked edges (NOT okay, invalid)."
msgstr "La malla tiene bordes desnudos (NO está bien, no es válida)." 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)." msgid "The mesh is watertight (okay, valid)."
msgstr "La malla es estanca (está bien, es válida)." msgstr "La malla es estanca (está bien, es válida)."
#: solvespace.cpp:1023 #: solvespace.cpp:1024
#, c-format #, c-format
msgid "" msgid ""
"\n" "\n"
@ -1977,7 +1985,7 @@ msgstr ""
"\n" "\n"
"El modelo contiene %d triángulos, desde %d superficies." "El modelo contiene %d triángulos, desde %d superficies."
#: solvespace.cpp:1027 #: solvespace.cpp:1028
#, c-format #, c-format
msgid "" msgid ""
"%s\n" "%s\n"
@ -1992,7 +2000,7 @@ msgstr ""
"\n" "\n"
"Cero aristas problemáticas, bien.%s" "Cero aristas problemáticas, bien.%s"
#: solvespace.cpp:1030 #: solvespace.cpp:1031
#, c-format #, c-format
msgid "" msgid ""
"%s\n" "%s\n"
@ -2007,7 +2015,7 @@ msgstr ""
"\n" "\n"
"%d aristas problemáticas, mal.%s" "%d aristas problemáticas, mal.%s"
#: solvespace.cpp:1043 #: solvespace.cpp:1044
#, c-format #, c-format
msgid "" msgid ""
"This is SolveSpace version %s.\n" "This is SolveSpace version %s.\n"
@ -2048,23 +2056,23 @@ msgstr ""
msgid "Style name cannot be empty" msgid "Style name cannot be empty"
msgstr "El nombre del estilo no puede estar vacío" msgstr "El nombre del estilo no puede estar vacío"
#: textscreens.cpp:785 #: textscreens.cpp:791
msgid "Can't repeat fewer than 1 time." msgid "Can't repeat fewer than 1 time."
msgstr "No se puede repetir menos de 1 vez." msgstr "No se puede repetir menos de 1 vez."
#: textscreens.cpp:789 #: textscreens.cpp:795
msgid "Can't repeat more than 999 times." msgid "Can't repeat more than 999 times."
msgstr "No se puede repetir más de 999 veces." msgstr "No se puede repetir más de 999 veces."
#: textscreens.cpp:814 #: textscreens.cpp:820
msgid "Group name cannot be empty" msgid "Group name cannot be empty"
msgstr "El nombre del grupo no puede estar vacío" msgstr "El nombre del grupo no puede estar vacío"
#: textscreens.cpp:866 #: textscreens.cpp:872
msgid "Opacity must be between zero and one." msgid "Opacity must be between zero and one."
msgstr "La opacidad debe estar entre cero y uno." msgstr "La opacidad debe estar entre cero y uno."
#: textscreens.cpp:901 #: textscreens.cpp:907
msgid "Radius cannot be zero or negative." msgid "Radius cannot be zero or negative."
msgstr "El radio no puede ser cero o negativo." msgstr "El radio no puede ser cero o negativo."

View File

@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: SolveSpace 3.0\n" "Project-Id-Version: SolveSpace 3.0\n"
"Report-Msgid-Bugs-To: whitequark@whitequark.org\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" "PO-Revision-Date: 2018-07-14 06:12+0000\n"
"Last-Translator: whitequark <whitequark@whitequark.org>\n" "Last-Translator: whitequark <whitequark@whitequark.org>\n"
"Language-Team: none\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." msgid "Number of copies to paste must be at least one."
msgstr "Le nombre de copies à coller doit être d'au moins un." 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." msgid "Scale cannot be zero."
msgstr "L'échelle ne peut pas être zéro." 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." msgid "No workplane active."
msgstr "Pas d'espace de travail actif." msgstr "Pas d'espace de travail actif."
#: confscreen.cpp:376 #: confscreen.cpp:381
msgid "Bad format: specify coordinates as x, y, z" msgid "Bad format: specify coordinates as x, y, z"
msgstr "Mauvais format: spécifiez les coordonnées comme 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" msgid "Bad format: specify color as r, g, b"
msgstr "Mauvais format; spécifiez la couleur comme r, v, b" msgstr "Mauvais format; spécifiez la couleur comme r, v, b"
#: confscreen.cpp:412 #: confscreen.cpp:417
msgid "" msgid ""
"The perspective factor will have no effect until you enable View -> Use " "The perspective factor will have no effect until you enable View -> Use "
"Perspective Projection." "Perspective Projection."
@ -79,26 +79,26 @@ msgstr ""
"Le facteur de perspective n'aura aucun effet tant que vous n'aurez pas " "Le facteur de perspective n'aura aucun effet tant que vous n'aurez pas "
"activé \"Affichage -> Utiliser la projection de perspective\"." "activé \"Affichage -> Utiliser la projection de perspective\"."
#: confscreen.cpp:430 confscreen.cpp:440 #: confscreen.cpp:435 confscreen.cpp:445
#, c-format #, c-format
msgid "Specify between 0 and %d digits after the decimal." msgid "Specify between 0 and %d digits after the decimal."
msgstr "" msgstr ""
#: confscreen.cpp:452 #: confscreen.cpp:457
msgid "Export scale must not be zero!" msgid "Export scale must not be zero!"
msgstr "L'échelle d'export ne doit pas être zéro!" 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!" msgid "Cutter radius offset must not be negative!"
msgstr "Le décalage du rayon de coupe ne doit pas être négatif!" 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" msgid "Bad value: autosave interval should be positive"
msgstr "" msgstr ""
"Mauvaise valeur: l'intervalle d'enregistrement automatique devrait être " "Mauvaise valeur: l'intervalle d'enregistrement automatique devrait être "
"positif" "positif"
#: confscreen.cpp:521 #: confscreen.cpp:531
msgid "Bad format: specify interval in integral minutes" msgid "Bad format: specify interval in integral minutes"
msgstr "Mauvais format: spécifiez un nombre entier de minutes" msgstr "Mauvais format: spécifiez un nombre entier de minutes"
@ -678,7 +678,7 @@ msgctxt "button"
msgid "&No" msgid "&No"
msgstr "" msgstr ""
#: file.cpp:877 solvespace.cpp:610 #: file.cpp:877 solvespace.cpp:611
msgctxt "button" msgctxt "button"
msgid "&Cancel" msgid "&Cancel"
msgstr "" msgstr ""
@ -1131,24 +1131,28 @@ msgstr "&Langue"
msgid "&Website / Manual" msgid "&Website / Manual"
msgstr "&Site web / Manuel" msgstr "&Site web / Manuel"
#: graphicswin.cpp:187 #: graphicswin.cpp:186
msgid "&Go to GitHub commit"
msgstr ""
#: graphicswin.cpp:188
msgid "&About" msgid "&About"
msgstr "&A propos" msgstr "&A propos"
#: graphicswin.cpp:361 #: graphicswin.cpp:362
msgid "(no recent files)" msgid "(no recent files)"
msgstr "(pas de fichier récent)" msgstr "(pas de fichier récent)"
#: graphicswin.cpp:369 #: graphicswin.cpp:370
#, c-format #, c-format
msgid "File '%s' does not exist." msgid "File '%s' does not exist."
msgstr "" msgstr ""
#: graphicswin.cpp:736 #: graphicswin.cpp:737
msgid "No workplane is active, so the grid will not appear." 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." msgstr "Pas de plan de travail actif, donc la grille ne va pas apparaître."
#: graphicswin.cpp:751 #: graphicswin.cpp:752
msgid "" msgid ""
"The perspective factor is set to zero, so the view will always be a parallel " "The perspective factor is set to zero, so the view will always be a parallel "
"projection.\n" "projection.\n"
@ -1162,19 +1166,19 @@ msgstr ""
"Pour une projection en perspective, modifiez le facteur de perspective dans " "Pour une projection en perspective, modifiez le facteur de perspective dans "
"l'écran de configuration. Une valeur d'environ 0,3 est typique." "l'écran de configuration. Une valeur d'environ 0,3 est typique."
#: graphicswin.cpp:836 #: graphicswin.cpp:837
msgid "" msgid ""
"Select a point; this point will become the center of the view on screen." "Select a point; this point will become the center of the view on screen."
msgstr "" msgstr ""
"Sélectionnez un point. Ce point deviendra le centre de la vue à l'écran." "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." msgid "No additional entities share endpoints with the selected entities."
msgstr "" msgstr ""
"Aucune entité supplémentaire ne partage des points d'extrémité avec les " "Aucune entité supplémentaire ne partage des points d'extrémité avec les "
"entités sélectionnées." "entités sélectionnées."
#: graphicswin.cpp:1154 #: graphicswin.cpp:1155
msgid "" msgid ""
"To use this command, select a point or other entity from an linked part, or " "To use this command, select a point or other entity from an linked part, or "
"make a link group the active group." "make a link group the active group."
@ -1182,7 +1186,7 @@ msgstr ""
"Pour utiliser cette commande, sélectionnez un point ou une autre entité à " "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." "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 "" msgid ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "No workplane is active. Activate a workplane (with Sketch -> In Workplane) "
"to define the plane for the snap grid." "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 -" "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." "> Dans plan de travail) pour définir le plan pour la grille d'accrochage."
#: graphicswin.cpp:1184 #: graphicswin.cpp:1185
msgid "" msgid ""
"Can't snap these items to grid; select points, text comments, or constraints " "Can't snap these items to grid; select points, text comments, or constraints "
"with a label. To snap a line, select its endpoints." "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 " "des textes de commentaires ou des contraintes avec une étiquette. Pour "
"accrocher une ligne, sélectionnez ses points d'extrémité." "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." msgid "No workplane selected. Activating default workplane for this group."
msgstr "" msgstr ""
"Aucun plan de travail sélectionné. Activation du plan de travail par défaut " "Aucun plan de travail sélectionné. Activation du plan de travail par défaut "
"pour ce groupe." "pour ce groupe."
#: graphicswin.cpp:1272 #: graphicswin.cpp:1273
msgid "" msgid ""
"No workplane is selected, and the active group does not have a default " "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. 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 " "de travail par défaut. Essayez de sélectionner un plan de travail ou "
"d'activer un groupe de \"Dessin dans nouveau plan travail\"." "d'activer un groupe de \"Dessin dans nouveau plan travail\"."
#: graphicswin.cpp:1293 #: graphicswin.cpp:1294
msgid "" msgid ""
"Bad selection for tangent arc at point. Select a single point, or select " "Bad selection for tangent arc at point. Select a single point, or select "
"nothing to set up arc parameters." "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, " "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." "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)" msgid "click point on arc (draws anti-clockwise)"
msgstr "" msgstr ""
"cliquez un point sur l'arc (dessine dans le sens inverse des aiguilles d'une " "cliquez un point sur l'arc (dessine dans le sens inverse des aiguilles d'une "
"montre)" "montre)"
#: graphicswin.cpp:1305 #: graphicswin.cpp:1306
msgid "click to place datum point" msgid "click to place datum point"
msgstr "cliquez pour placer un point" msgstr "cliquez pour placer un point"
#: graphicswin.cpp:1306 #: graphicswin.cpp:1307
msgid "click first point of line segment" msgid "click first point of line segment"
msgstr "cliquez le premier point du segment de ligne" msgstr "cliquez le premier point du segment de ligne"
#: graphicswin.cpp:1308 #: graphicswin.cpp:1309
msgid "click first point of construction line segment" msgid "click first point of construction line segment"
msgstr "cliquez le premier point de la ligne de construction" msgstr "cliquez le premier point de la ligne de construction"
#: graphicswin.cpp:1309 #: graphicswin.cpp:1310
msgid "click first point of cubic segment" msgid "click first point of cubic segment"
msgstr "cliquez le premier point du segment cubique" msgstr "cliquez le premier point du segment cubique"
#: graphicswin.cpp:1310 #: graphicswin.cpp:1311
msgid "click center of circle" msgid "click center of circle"
msgstr "cliquez pour placer le centre du cercle" msgstr "cliquez pour placer le centre du cercle"
#: graphicswin.cpp:1311 #: graphicswin.cpp:1312
msgid "click origin of workplane" msgid "click origin of workplane"
msgstr "cliquez pour placer l'origine du plan de travail" msgstr "cliquez pour placer l'origine du plan de travail"
#: graphicswin.cpp:1312 #: graphicswin.cpp:1313
msgid "click one corner of rectangle" msgid "click one corner of rectangle"
msgstr "cliquez un coin du rectangle" msgstr "cliquez un coin du rectangle"
#: graphicswin.cpp:1313 #: graphicswin.cpp:1314
msgid "click top left of text" msgid "click top left of text"
msgstr "cliquez le haut à gauche du texte" msgstr "cliquez le haut à gauche du texte"
#: graphicswin.cpp:1319 #: graphicswin.cpp:1320
msgid "click top left of image" msgid "click top left of image"
msgstr "cliquez le haut à gauche de l'image" msgstr "cliquez le haut à gauche de l'image"
#: graphicswin.cpp:1345 #: graphicswin.cpp:1346
msgid "" msgid ""
"No entities are selected. Select entities before trying to toggle their " "No entities are selected. Select entities before trying to toggle their "
"construction state." "construction state."
@ -1409,6 +1413,10 @@ msgstr "le contour s'entrecroise!"
msgid "zero-length edge!" msgid "zero-length edge!"
msgstr "arête de longueur nulle!" msgstr "arête de longueur nulle!"
#: importmesh.cpp:136
msgid "Text-formated STL files are not currently supported"
msgstr ""
#: modify.cpp:252 #: modify.cpp:252
msgid "Must be sketching in workplane to create tangent arc." msgid "Must be sketching in workplane to create tangent arc."
msgstr "Vous devez dessiner dans un plan pour créer un arc tangent." 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 " "Impossible de dessiner l'image en 3d; D'abord, activez un plan de travail "
"avec \"Dessin -> Dans 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" msgctxt "file-type"
msgid "SolveSpace models" msgid "SolveSpace models"
msgstr "" msgstr ""
@ -1699,130 +1707,130 @@ msgctxt "file-type"
msgid "Comma-separated values" msgid "Comma-separated values"
msgstr "" 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" msgid "untitled"
msgstr "sans nom" 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 #: platform/guiwin.cpp:1639
msgctxt "title" msgctxt "title"
msgid "Save File" msgid "Save File"
msgstr "Sauver fichier" 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 #: platform/guiwin.cpp:1645
msgctxt "title" msgctxt "title"
msgid "Open File" msgid "Open File"
msgstr "Ouvrir Fichier" msgstr "Ouvrir Fichier"
#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 #: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433
msgctxt "button" msgctxt "button"
msgid "_Cancel" msgid "_Cancel"
msgstr "_Annuler" msgstr "_Annuler"
#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 #: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431
msgctxt "button" msgctxt "button"
msgid "_Save" msgid "_Save"
msgstr "_Sauver" msgstr "_Sauver"
#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 #: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432
msgctxt "button" msgctxt "button"
msgid "_Open" msgid "_Open"
msgstr "" msgstr ""
#: solvespace.cpp:170 #: solvespace.cpp:171
msgctxt "title" msgctxt "title"
msgid "Autosave Available" msgid "Autosave Available"
msgstr "Sauvegarde automatique existante" msgstr "Sauvegarde automatique existante"
#: solvespace.cpp:171 #: solvespace.cpp:172
msgctxt "dialog" msgctxt "dialog"
msgid "An autosave file is available for this sketch." msgid "An autosave file is available for this sketch."
msgstr "" msgstr ""
#: solvespace.cpp:172 #: solvespace.cpp:173
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to load the autosave file instead?" msgid "Do you want to load the autosave file instead?"
msgstr "" msgstr ""
#: solvespace.cpp:173 #: solvespace.cpp:174
msgctxt "button" msgctxt "button"
msgid "&Load autosave" msgid "&Load autosave"
msgstr "" msgstr ""
#: solvespace.cpp:175 #: solvespace.cpp:176
msgctxt "button" msgctxt "button"
msgid "Do&n't Load" msgid "Do&n't Load"
msgstr "" msgstr ""
#: solvespace.cpp:598 #: solvespace.cpp:599
msgctxt "title" msgctxt "title"
msgid "Modified File" msgid "Modified File"
msgstr "Fichier modifié" msgstr "Fichier modifié"
#: solvespace.cpp:600 #: solvespace.cpp:601
#, c-format #, c-format
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to save the changes you made to the sketch “%s”?" msgid "Do you want to save the changes you made to the sketch “%s”?"
msgstr "" msgstr ""
#: solvespace.cpp:603 #: solvespace.cpp:604
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to save the changes you made to the new sketch?" msgid "Do you want to save the changes you made to the new sketch?"
msgstr "" msgstr ""
#: solvespace.cpp:606 #: solvespace.cpp:607
msgctxt "dialog" msgctxt "dialog"
msgid "Your changes will be lost if you don't save them." msgid "Your changes will be lost if you don't save them."
msgstr "" msgstr ""
#: solvespace.cpp:607 #: solvespace.cpp:608
msgctxt "button" msgctxt "button"
msgid "&Save" msgid "&Save"
msgstr "" msgstr ""
#: solvespace.cpp:609 #: solvespace.cpp:610
msgctxt "button" msgctxt "button"
msgid "Do&n't Save" msgid "Do&n't Save"
msgstr "" msgstr ""
#: solvespace.cpp:630 #: solvespace.cpp:631
msgctxt "title" msgctxt "title"
msgid "(new sketch)" msgid "(new sketch)"
msgstr "(nouveau dessin)" msgstr "(nouveau dessin)"
#: solvespace.cpp:637 #: solvespace.cpp:638
msgctxt "title" msgctxt "title"
msgid "Property Browser" msgid "Property Browser"
msgstr "Navigateur de propriété" msgstr "Navigateur de propriété"
#: solvespace.cpp:699 #: solvespace.cpp:700
msgid "" msgid ""
"Constraints are currently shown, and will be exported in the toolpath. This " "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 " "is probably not what you want; hide them by clicking the link at the top of "
"the text window." "the text window."
msgstr "" msgstr ""
#: solvespace.cpp:771 #: solvespace.cpp:772
#, c-format #, c-format
msgid "" msgid ""
"Can't identify file type from file extension of filename '%s'; try .dxf or ." "Can't identify file type from file extension of filename '%s'; try .dxf or ."
"dwg." "dwg."
msgstr "" msgstr ""
#: solvespace.cpp:823 #: solvespace.cpp:824
msgid "Constraint must have a label, and must not be a reference dimension." msgid "Constraint must have a label, and must not be a reference dimension."
msgstr "" msgstr ""
#: solvespace.cpp:827 #: solvespace.cpp:828
msgid "Bad selection for step dimension; select a constraint." msgid "Bad selection for step dimension; select a constraint."
msgstr "" msgstr ""
#: solvespace.cpp:851 #: solvespace.cpp:852
msgid "The assembly does not interfere, good." msgid "The assembly does not interfere, good."
msgstr "" msgstr ""
#: solvespace.cpp:867 #: solvespace.cpp:868
#, c-format #, c-format
msgid "" msgid ""
"The volume of the solid model is:\n" "The volume of the solid model is:\n"
@ -1830,7 +1838,7 @@ msgid ""
" %s" " %s"
msgstr "" msgstr ""
#: solvespace.cpp:876 #: solvespace.cpp:877
#, c-format #, c-format
msgid "" msgid ""
"\n" "\n"
@ -1839,7 +1847,7 @@ msgid ""
" %s" " %s"
msgstr "" msgstr ""
#: solvespace.cpp:881 #: solvespace.cpp:882
msgid "" msgid ""
"\n" "\n"
"\n" "\n"
@ -1847,7 +1855,7 @@ msgid ""
"This introduces error, typically of around 1%." "This introduces error, typically of around 1%."
msgstr "" msgstr ""
#: solvespace.cpp:896 #: solvespace.cpp:897
#, c-format #, c-format
msgid "" msgid ""
"The surface area of the selected faces is:\n" "The surface area of the selected faces is:\n"
@ -1858,13 +1866,13 @@ msgid ""
"This introduces error, typically of around 1%%." "This introduces error, typically of around 1%%."
msgstr "" msgstr ""
#: solvespace.cpp:905 #: solvespace.cpp:906
msgid "" msgid ""
"This group does not contain a correctly-formed 2d closed area. It is open, " "This group does not contain a correctly-formed 2d closed area. It is open, "
"not coplanar, or self-intersecting." "not coplanar, or self-intersecting."
msgstr "" msgstr ""
#: solvespace.cpp:917 #: solvespace.cpp:918
#, c-format #, c-format
msgid "" msgid ""
"The area of the region sketched in this group is:\n" "The area of the region sketched in this group is:\n"
@ -1875,7 +1883,7 @@ msgid ""
"This introduces error, typically of around 1%%." "This introduces error, typically of around 1%%."
msgstr "" msgstr ""
#: solvespace.cpp:937 #: solvespace.cpp:938
#, c-format #, c-format
msgid "" msgid ""
"The total length of the selected entities is:\n" "The total length of the selected entities is:\n"
@ -1886,36 +1894,36 @@ msgid ""
"This introduces error, typically of around 1%%." "This introduces error, typically of around 1%%."
msgstr "" msgstr ""
#: solvespace.cpp:943 #: solvespace.cpp:944
msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgid "Bad selection for perimeter; select line segments, arcs, and curves."
msgstr "" msgstr ""
#: solvespace.cpp:959 #: solvespace.cpp:960
msgid "Bad selection for trace; select a single point." msgid "Bad selection for trace; select a single point."
msgstr "" msgstr ""
#: solvespace.cpp:986 #: solvespace.cpp:987
#, c-format #, c-format
msgid "Couldn't write to '%s'" msgid "Couldn't write to '%s'"
msgstr "" msgstr ""
#: solvespace.cpp:1016 #: solvespace.cpp:1017
msgid "The mesh is self-intersecting (NOT okay, invalid)." msgid "The mesh is self-intersecting (NOT okay, invalid)."
msgstr "" msgstr ""
#: solvespace.cpp:1017 #: solvespace.cpp:1018
msgid "The mesh is not self-intersecting (okay, valid)." msgid "The mesh is not self-intersecting (okay, valid)."
msgstr "" msgstr ""
#: solvespace.cpp:1019 #: solvespace.cpp:1020
msgid "The mesh has naked edges (NOT okay, invalid)." msgid "The mesh has naked edges (NOT okay, invalid)."
msgstr "" msgstr ""
#: solvespace.cpp:1020 #: solvespace.cpp:1021
msgid "The mesh is watertight (okay, valid)." msgid "The mesh is watertight (okay, valid)."
msgstr "" msgstr ""
#: solvespace.cpp:1023 #: solvespace.cpp:1024
#, c-format #, c-format
msgid "" msgid ""
"\n" "\n"
@ -1923,7 +1931,7 @@ msgid ""
"The model contains %d triangles, from %d surfaces." "The model contains %d triangles, from %d surfaces."
msgstr "" msgstr ""
#: solvespace.cpp:1027 #: solvespace.cpp:1028
#, c-format #, c-format
msgid "" msgid ""
"%s\n" "%s\n"
@ -1933,7 +1941,7 @@ msgid ""
"Zero problematic edges, good.%s" "Zero problematic edges, good.%s"
msgstr "" msgstr ""
#: solvespace.cpp:1030 #: solvespace.cpp:1031
#, c-format #, c-format
msgid "" msgid ""
"%s\n" "%s\n"
@ -1943,7 +1951,7 @@ msgid ""
"%d problematic edges, bad.%s" "%d problematic edges, bad.%s"
msgstr "" msgstr ""
#: solvespace.cpp:1043 #: solvespace.cpp:1044
#, c-format #, c-format
msgid "" msgid ""
"This is SolveSpace version %s.\n" "This is SolveSpace version %s.\n"
@ -1972,23 +1980,23 @@ msgstr ""
msgid "Style name cannot be empty" msgid "Style name cannot be empty"
msgstr "Le nom d'un style ne peut pas être vide" 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." msgid "Can't repeat fewer than 1 time."
msgstr "Je ne peux pas répéter moins de 1 fois." 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." msgid "Can't repeat more than 999 times."
msgstr "Je ne peux pas répéter plus de 999 fois." msgstr "Je ne peux pas répéter plus de 999 fois."
#: textscreens.cpp:814 #: textscreens.cpp:820
msgid "Group name cannot be empty" msgid "Group name cannot be empty"
msgstr "Un nom de groupe ne peut pas être vide" msgstr "Un nom de groupe ne peut pas être vide"
#: textscreens.cpp:866 #: textscreens.cpp:872
msgid "Opacity must be between zero and one." msgid "Opacity must be between zero and one."
msgstr "L'opacité doit être entre 0 et 1." msgstr "L'opacité doit être entre 0 et 1."
#: textscreens.cpp:901 #: textscreens.cpp:907
msgid "Radius cannot be zero or negative." msgid "Radius cannot be zero or negative."
msgstr "Le rayon ne peut pas être zéro ou négatif." msgstr "Le rayon ne peut pas être zéro ou négatif."

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: SolveSpace 3.0\n" "Project-Id-Version: SolveSpace 3.0\n"
"Report-Msgid-Bugs-To: whitequark@whitequark.org\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" "PO-Revision-Date: 2021-10-04 15:33+0300\n"
"Last-Translator: Olesya Gerasimenko <translation-team@basealt.ru>\n" "Last-Translator: Olesya Gerasimenko <translation-team@basealt.ru>\n"
"Language-Team: Basealt Translation Team\n" "Language-Team: Basealt Translation Team\n"
@ -36,7 +36,7 @@ msgstr "Буфер обмена пуст; нечего вставлять."
msgid "Number of copies to paste must be at least one." msgid "Number of copies to paste must be at least one."
msgstr "Укажите в поле 'количество' хотя бы одну копию для вставки." msgstr "Укажите в поле 'количество' хотя бы одну копию для вставки."
#: clipboard.cpp:389 textscreens.cpp:827 #: clipboard.cpp:389 textscreens.cpp:833
msgid "Scale cannot be zero." msgid "Scale cannot be zero."
msgstr "Масштабный коэффициент не может быть нулевым." msgstr "Масштабный коэффициент не может быть нулевым."
@ -63,15 +63,15 @@ msgstr "Слишком много элементов для вставки; ра
msgid "No workplane active." msgid "No workplane active."
msgstr "Рабочая плоскость не активна" msgstr "Рабочая плоскость не активна"
#: confscreen.cpp:376 #: confscreen.cpp:381
msgid "Bad format: specify coordinates as x, y, z" msgid "Bad format: specify coordinates as x, y, z"
msgstr "Неверный формат: введите координаты как 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" msgid "Bad format: specify color as r, g, b"
msgstr "Неверный формат: введите цвет как r, g, b" msgstr "Неверный формат: введите цвет как r, g, b"
#: confscreen.cpp:412 #: confscreen.cpp:417
msgid "" msgid ""
"The perspective factor will have no effect until you enable View -> Use " "The perspective factor will have no effect until you enable View -> Use "
"Perspective Projection." "Perspective Projection."
@ -79,25 +79,25 @@ msgstr ""
"Коэффициент перспективы не будет иметь эффект, пока вы не включите Вид-" "Коэффициент перспективы не будет иметь эффект, пока вы не включите Вид-"
">Перспективная Проекция." ">Перспективная Проекция."
#: confscreen.cpp:430 confscreen.cpp:440 #: confscreen.cpp:435 confscreen.cpp:445
#, c-format #, c-format
msgid "Specify between 0 and %d digits after the decimal." msgid "Specify between 0 and %d digits after the decimal."
msgstr "Введите число от 0 до %d." msgstr "Введите число от 0 до %d."
#: confscreen.cpp:452 #: confscreen.cpp:457
msgid "Export scale must not be zero!" msgid "Export scale must not be zero!"
msgstr "Масштабный коэффициент не может быть нулевым!" msgstr "Масштабный коэффициент не может быть нулевым!"
#: confscreen.cpp:464 #: confscreen.cpp:469
msgid "Cutter radius offset must not be negative!" msgid "Cutter radius offset must not be negative!"
msgstr "Радиус режущего инструмента не может быть отрицательным!" msgstr "Радиус режущего инструмента не может быть отрицательным!"
#: confscreen.cpp:518 #: confscreen.cpp:528
msgid "Bad value: autosave interval should be positive" msgid "Bad value: autosave interval should be positive"
msgstr "" msgstr ""
"Неверное значение: интервал автосохранения должен быть положительным числом" "Неверное значение: интервал автосохранения должен быть положительным числом"
#: confscreen.cpp:521 #: confscreen.cpp:531
msgid "Bad format: specify interval in integral minutes" msgid "Bad format: specify interval in integral minutes"
msgstr "" msgstr ""
"Неверный формат: введите целое число, чтобы задать интервал автосохранения" "Неверный формат: введите целое число, чтобы задать интервал автосохранения"
@ -405,8 +405,8 @@ msgid ""
" * two arcs\n" " * two arcs\n"
" * one arc and one line segment\n" " * one arc and one line segment\n"
msgstr "" msgstr ""
"Неправильное выделение для ограничения 'отношение длин'. Ограничение может" "Неправильное выделение для ограничения 'отношение длин'. Ограничение может "
" принимать в качестве выделения следующие примитивы:\n" "принимать в качестве выделения следующие примитивы:\n"
"\n" "\n"
" * два отрезка\n" " * два отрезка\n"
" * две дуги\n" " * две дуги\n"
@ -421,8 +421,8 @@ msgid ""
" * two arcs\n" " * two arcs\n"
" * one arc and one line segment\n" " * one arc and one line segment\n"
msgstr "" msgstr ""
"Неправильное выделение для ограничения 'разность длин'. Ограничение может" "Неправильное выделение для ограничения 'разность длин'. Ограничение может "
" принимать в качестве выделения следующие примитивы:\n" "принимать в качестве выделения следующие примитивы:\n"
"\n" "\n"
" * два отрезка\n" " * два отрезка\n"
" * две дуги\n" " * две дуги\n"
@ -693,7 +693,7 @@ msgctxt "button"
msgid "&No" msgid "&No"
msgstr "Нет" msgstr "Нет"
#: file.cpp:877 solvespace.cpp:610 #: file.cpp:877 solvespace.cpp:611
msgctxt "button" msgctxt "button"
msgid "&Cancel" msgid "&Cancel"
msgstr "Отменить" msgstr "Отменить"
@ -1146,24 +1146,28 @@ msgstr "&Язык"
msgid "&Website / Manual" msgid "&Website / Manual"
msgstr "Вебсайт / &Справка" msgstr "Вебсайт / &Справка"
#: graphicswin.cpp:187 #: graphicswin.cpp:186
msgid "&Go to GitHub commit"
msgstr ""
#: graphicswin.cpp:188
msgid "&About" msgid "&About"
msgstr "О &Программе" msgstr "О &Программе"
#: graphicswin.cpp:361 #: graphicswin.cpp:362
msgid "(no recent files)" msgid "(no recent files)"
msgstr "(пусто)" msgstr "(пусто)"
#: graphicswin.cpp:369 #: graphicswin.cpp:370
#, c-format #, c-format
msgid "File '%s' does not exist." msgid "File '%s' does not exist."
msgstr "Файл '%s' не существует." msgstr "Файл '%s' не существует."
#: graphicswin.cpp:736 #: graphicswin.cpp:737
msgid "No workplane is active, so the grid will not appear." msgid "No workplane is active, so the grid will not appear."
msgstr "Сетку не будет видно, пока рабочая плоскость не активирована." msgstr "Сетку не будет видно, пока рабочая плоскость не активирована."
#: graphicswin.cpp:751 #: graphicswin.cpp:752
msgid "" msgid ""
"The perspective factor is set to zero, so the view will always be a parallel " "The perspective factor is set to zero, so the view will always be a parallel "
"projection.\n" "projection.\n"
@ -1177,16 +1181,16 @@ msgstr ""
"перспективы на конфигурационной странице браузера.\n" "перспективы на конфигурационной странице браузера.\n"
"Значение по умолчанию 0.3." "Значение по умолчанию 0.3."
#: graphicswin.cpp:836 #: graphicswin.cpp:837
msgid "" msgid ""
"Select a point; this point will become the center of the view on screen." "Select a point; this point will become the center of the view on screen."
msgstr "Выделите точку. Вид будет отцентрован по этой точке." msgstr "Выделите точку. Вид будет отцентрован по этой точке."
#: graphicswin.cpp:1136 #: graphicswin.cpp:1137
msgid "No additional entities share endpoints with the selected entities." msgid "No additional entities share endpoints with the selected entities."
msgstr "Нет дополнительных объектов, соединенных с выбранными примитивами." msgstr "Нет дополнительных объектов, соединенных с выбранными примитивами."
#: graphicswin.cpp:1154 #: graphicswin.cpp:1155
msgid "" msgid ""
"To use this command, select a point or other entity from an linked part, or " "To use this command, select a point or other entity from an linked part, or "
"make a link group the active group." "make a link group the active group."
@ -1195,7 +1199,7 @@ msgstr ""
"принадлежащий импортированной детали, или активируйте группу импортированной " "принадлежащий импортированной детали, или активируйте группу импортированной "
"детали." "детали."
#: graphicswin.cpp:1177 #: graphicswin.cpp:1178
msgid "" msgid ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "No workplane is active. Activate a workplane (with Sketch -> In Workplane) "
"to define the plane for the snap grid." "to define the plane for the snap grid."
@ -1203,7 +1207,7 @@ msgstr ""
"Рабочая плоскость не активна. Активируйте ее через Эскиз -> В Рабочей " "Рабочая плоскость не активна. Активируйте ее через Эскиз -> В Рабочей "
"Плоскости чтобы определить плоскость для сетки." "Плоскости чтобы определить плоскость для сетки."
#: graphicswin.cpp:1184 #: graphicswin.cpp:1185
msgid "" msgid ""
"Can't snap these items to grid; select points, text comments, or constraints " "Can't snap these items to grid; select points, text comments, or constraints "
"with a label. To snap a line, select its endpoints." "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." msgid "No workplane selected. Activating default workplane for this group."
msgstr "" msgstr ""
"Рабочая плоскость не активна. Активирована рабочая плоскость по умолчанию " "Рабочая плоскость не активна. Активирована рабочая плоскость по умолчанию "
"для данной группы." "для данной группы."
#: graphicswin.cpp:1272 #: graphicswin.cpp:1273
msgid "" msgid ""
"No workplane is selected, and the active group does not have a default " "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. Try selecting a workplane, or activating a sketch-in-new-"
@ -1228,7 +1232,7 @@ msgstr ""
"по умолчанию. Попробуйте выделить рабочую плоскость или создать новую с " "по умолчанию. Попробуйте выделить рабочую плоскость или создать новую с "
"помощью Группа -> Создать Эскиз в Новой Рабочей Плоскости." "помощью Группа -> Создать Эскиз в Новой Рабочей Плоскости."
#: graphicswin.cpp:1293 #: graphicswin.cpp:1294
msgid "" msgid ""
"Bad selection for tangent arc at point. Select a single point, or select " "Bad selection for tangent arc at point. Select a single point, or select "
"nothing to set up arc parameters." "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)" msgid "click point on arc (draws anti-clockwise)"
msgstr "" msgstr ""
"кликните мышью там, где хотите создать дугу окружности (дуга будет " "кликните мышью там, где хотите создать дугу окружности (дуга будет "
"нарисована против часовой стрелки)" "нарисована против часовой стрелки)"
#: graphicswin.cpp:1305 #: graphicswin.cpp:1306
msgid "click to place datum point" msgid "click to place datum point"
msgstr "кликните мышью там, где хотите создать опорную точку" msgstr "кликните мышью там, где хотите создать опорную точку"
#: graphicswin.cpp:1306 #: graphicswin.cpp:1307
msgid "click first point of line segment" msgid "click first point of line segment"
msgstr "кликните мышью там, где хотите создать первую точку отрезка" msgstr "кликните мышью там, где хотите создать первую точку отрезка"
#: graphicswin.cpp:1308 #: graphicswin.cpp:1309
msgid "click first point of construction line segment" msgid "click first point of construction line segment"
msgstr "" msgstr ""
"кликните мышью там, где хотите создать первую точку вспомогательного отрезка" "кликните мышью там, где хотите создать первую точку вспомогательного отрезка"
#: graphicswin.cpp:1309 #: graphicswin.cpp:1310
msgid "click first point of cubic segment" msgid "click first point of cubic segment"
msgstr "" msgstr ""
"кликните мышью там, где хотите создать первую точку кубического сплайна Безье" "кликните мышью там, где хотите создать первую точку кубического сплайна Безье"
#: graphicswin.cpp:1310 #: graphicswin.cpp:1311
msgid "click center of circle" msgid "click center of circle"
msgstr "кликните мышью там, где будет находиться центр окружности" msgstr "кликните мышью там, где будет находиться центр окружности"
#: graphicswin.cpp:1311 #: graphicswin.cpp:1312
msgid "click origin of workplane" msgid "click origin of workplane"
msgstr "" msgstr ""
"кликните мышью там, где будет находиться точка, через которую будет " "кликните мышью там, где будет находиться точка, через которую будет "
"построена рабочая плоскость" "построена рабочая плоскость"
#: graphicswin.cpp:1312 #: graphicswin.cpp:1313
msgid "click one corner of rectangle" msgid "click one corner of rectangle"
msgstr "кликните мышью там, где будет находиться один из углов прямоугольника" msgstr "кликните мышью там, где будет находиться один из углов прямоугольника"
#: graphicswin.cpp:1313 #: graphicswin.cpp:1314
msgid "click top left of text" msgid "click top left of text"
msgstr "кликните мышью там, где хотите создать текст" msgstr "кликните мышью там, где хотите создать текст"
#: graphicswin.cpp:1319 #: graphicswin.cpp:1320
msgid "click top left of image" msgid "click top left of image"
msgstr "" msgstr ""
"кликните мышью там, где будет расположен левый верхний угол изображения" "кликните мышью там, где будет расположен левый верхний угол изображения"
#: graphicswin.cpp:1345 #: graphicswin.cpp:1346
msgid "" msgid ""
"No entities are selected. Select entities before trying to toggle their " "No entities are selected. Select entities before trying to toggle their "
"construction state." "construction state."
@ -1307,9 +1311,8 @@ msgid ""
" * a point and a normal (through the point, orthogonal to the normal)\n" " * a point and a normal (through the point, orthogonal to the normal)\n"
" * a workplane (copy of the workplane)\n" " * a workplane (copy of the workplane)\n"
msgstr "" msgstr ""
"Неправильное выделение для создания эскиза в рабочей плоскости. Группа может" "Неправильное выделение для создания эскиза в рабочей плоскости. Группа может "
" быть создана, используя в качестве выделения следующие " "быть создана, используя в качестве выделения следующие примитивы:\n"
"примитивы:\n"
"\n" "\n"
" * точку (через точку, ортогонально осям координат)\n" " * точку (через точку, ортогонально осям координат)\n"
" * точку и два отрезка (через точку, параллельно отрезкам)\n" " * точку и два отрезка (через точку, параллельно отрезкам)\n"
@ -1462,6 +1465,10 @@ msgstr "контур имеет самопересечения!"
msgid "zero-length edge!" msgid "zero-length edge!"
msgstr "вырожденный отрезок!" msgstr "вырожденный отрезок!"
#: importmesh.cpp:136
msgid "Text-formated STL files are not currently supported"
msgstr ""
#: modify.cpp:252 #: modify.cpp:252
msgid "Must be sketching in workplane to create tangent arc." msgid "Must be sketching in workplane to create tangent arc."
msgstr "" msgstr ""
@ -1659,7 +1666,7 @@ msgid ""
"Workplane." "Workplane."
msgstr "Невозможно создать изображение. Активируйте рабочую плоскость." 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" msgctxt "file-type"
msgid "SolveSpace models" msgid "SolveSpace models"
msgstr "проекты SolveSpace" msgstr "проекты SolveSpace"
@ -1754,104 +1761,104 @@ msgctxt "file-type"
msgid "Comma-separated values" msgid "Comma-separated values"
msgstr "CSV файлы (значения, разделенные запятой)" 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" msgid "untitled"
msgstr "без имени" 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 #: platform/guiwin.cpp:1639
msgctxt "title" msgctxt "title"
msgid "Save File" msgid "Save File"
msgstr "Сохранить Файл" 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 #: platform/guiwin.cpp:1645
msgctxt "title" msgctxt "title"
msgid "Open File" msgid "Open File"
msgstr "Открыть Файл" msgstr "Открыть Файл"
#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 #: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433
msgctxt "button" msgctxt "button"
msgid "_Cancel" msgid "_Cancel"
msgstr "Отменить" msgstr "Отменить"
#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 #: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431
msgctxt "button" msgctxt "button"
msgid "_Save" msgid "_Save"
msgstr "Сохранить" msgstr "Сохранить"
#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 #: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432
msgctxt "button" msgctxt "button"
msgid "_Open" msgid "_Open"
msgstr "_Открыть" msgstr "_Открыть"
#: solvespace.cpp:170 #: solvespace.cpp:171
msgctxt "title" msgctxt "title"
msgid "Autosave Available" msgid "Autosave Available"
msgstr "Автосохранение Доступно" msgstr "Автосохранение Доступно"
#: solvespace.cpp:171 #: solvespace.cpp:172
msgctxt "dialog" msgctxt "dialog"
msgid "An autosave file is available for this sketch." msgid "An autosave file is available for this sketch."
msgstr "Автоматически сохраненный файл доступен для данного проекта." msgstr "Автоматически сохраненный файл доступен для данного проекта."
#: solvespace.cpp:172 #: solvespace.cpp:173
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to load the autosave file instead?" msgid "Do you want to load the autosave file instead?"
msgstr "Хотите загрузить автосохраненный файл вместо исходного?" msgstr "Хотите загрузить автосохраненный файл вместо исходного?"
#: solvespace.cpp:173 #: solvespace.cpp:174
msgctxt "button" msgctxt "button"
msgid "&Load autosave" msgid "&Load autosave"
msgstr "&Загрузить Автосохранение" msgstr "&Загрузить Автосохранение"
#: solvespace.cpp:175 #: solvespace.cpp:176
msgctxt "button" msgctxt "button"
msgid "Do&n't Load" msgid "Do&n't Load"
msgstr "&Не Загружать" msgstr "&Не Загружать"
#: solvespace.cpp:598 #: solvespace.cpp:599
msgctxt "title" msgctxt "title"
msgid "Modified File" msgid "Modified File"
msgstr "Измененный Файл" msgstr "Измененный Файл"
#: solvespace.cpp:600 #: solvespace.cpp:601
#, c-format #, c-format
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to save the changes you made to the sketch “%s”?" msgid "Do you want to save the changes you made to the sketch “%s”?"
msgstr "Сохранить изменения, сделанные в файле “%s”?" msgstr "Сохранить изменения, сделанные в файле “%s”?"
#: solvespace.cpp:603 #: solvespace.cpp:604
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to save the changes you made to the new sketch?" msgid "Do you want to save the changes you made to the new sketch?"
msgstr "Сохранить изменения, сделанные в новом проекте?" msgstr "Сохранить изменения, сделанные в новом проекте?"
#: solvespace.cpp:606 #: solvespace.cpp:607
msgctxt "dialog" msgctxt "dialog"
msgid "Your changes will be lost if you don't save them." msgid "Your changes will be lost if you don't save them."
msgstr "Изменения будут утеряны, если их не сохранить." msgstr "Изменения будут утеряны, если их не сохранить."
#: solvespace.cpp:607 #: solvespace.cpp:608
msgctxt "button" msgctxt "button"
msgid "&Save" msgid "&Save"
msgstr "&Сохранить" msgstr "&Сохранить"
#: solvespace.cpp:609 #: solvespace.cpp:610
msgctxt "button" msgctxt "button"
msgid "Do&n't Save" msgid "Do&n't Save"
msgstr "&Не Сохранять" msgstr "&Не Сохранять"
#: solvespace.cpp:630 #: solvespace.cpp:631
msgctxt "title" msgctxt "title"
msgid "(new sketch)" msgid "(new sketch)"
msgstr "(новый проект)" msgstr "(новый проект)"
#: solvespace.cpp:637 #: solvespace.cpp:638
msgctxt "title" msgctxt "title"
msgid "Property Browser" msgid "Property Browser"
msgstr "Браузер" msgstr "Браузер"
#: solvespace.cpp:699 #: solvespace.cpp:700
msgid "" msgid ""
"Constraints are currently shown, and will be exported in the toolpath. This " "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 " "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 #, c-format
msgid "" msgid ""
"Can't identify file type from file extension of filename '%s'; try .dxf or ." "Can't identify file type from file extension of filename '%s'; try .dxf or ."
@ -1870,21 +1877,21 @@ msgstr ""
"Неподдерживаемый тип файла '%s'. Поддерживаются файлы с расширением .dxf и ." "Неподдерживаемый тип файла '%s'. Поддерживаются файлы с расширением .dxf и ."
"dwg." "dwg."
#: solvespace.cpp:823 #: solvespace.cpp:824
msgid "Constraint must have a label, and must not be a reference dimension." msgid "Constraint must have a label, and must not be a reference dimension."
msgstr "У ограничения должно быть значение и оно не должно быть справочным." msgstr "У ограничения должно быть значение и оно не должно быть справочным."
#: solvespace.cpp:827 #: solvespace.cpp:828
msgid "Bad selection for step dimension; select a constraint." msgid "Bad selection for step dimension; select a constraint."
msgstr "" msgstr ""
"Неправильное выделение для операции изменения значения с заданным шагом; " "Неправильное выделение для операции изменения значения с заданным шагом; "
"необходимо выбрать ограничение со значением." "необходимо выбрать ограничение со значением."
#: solvespace.cpp:851 #: solvespace.cpp:852
msgid "The assembly does not interfere, good." msgid "The assembly does not interfere, good."
msgstr "Сборка не содержит пересечения деталей - это хорошо." msgstr "Сборка не содержит пересечения деталей - это хорошо."
#: solvespace.cpp:867 #: solvespace.cpp:868
#, c-format #, c-format
msgid "" msgid ""
"The volume of the solid model is:\n" "The volume of the solid model is:\n"
@ -1895,7 +1902,7 @@ msgstr ""
"\n" "\n"
" %s" " %s"
#: solvespace.cpp:876 #: solvespace.cpp:877
#, c-format #, c-format
msgid "" msgid ""
"\n" "\n"
@ -1908,7 +1915,7 @@ msgstr ""
"\n" "\n"
" %s" " %s"
#: solvespace.cpp:881 #: solvespace.cpp:882
msgid "" msgid ""
"\n" "\n"
"\n" "\n"
@ -1920,7 +1927,7 @@ msgstr ""
"Кривые аппроксимированы кусочно-линейными функциями.\n" "Кривые аппроксимированы кусочно-линейными функциями.\n"
"Это приводит к ошибке в расчетах, обычно в пределах 1%." "Это приводит к ошибке в расчетах, обычно в пределах 1%."
#: solvespace.cpp:896 #: solvespace.cpp:897
#, c-format #, c-format
msgid "" msgid ""
"The surface area of the selected faces is:\n" "The surface area of the selected faces is:\n"
@ -1937,7 +1944,7 @@ msgstr ""
"Кривые аппроксимированы кусочно-линейными функциями.\n" "Кривые аппроксимированы кусочно-линейными функциями.\n"
"Это приводит к ошибке в расчетах, обычно в пределах 1%%." "Это приводит к ошибке в расчетах, обычно в пределах 1%%."
#: solvespace.cpp:905 #: solvespace.cpp:906
msgid "" msgid ""
"This group does not contain a correctly-formed 2d closed area. It is open, " "This group does not contain a correctly-formed 2d closed area. It is open, "
"not coplanar, or self-intersecting." "not coplanar, or self-intersecting."
@ -1945,7 +1952,7 @@ msgstr ""
"Эта группа не содержит замкнутых областей. В ней нет замкнутых контуров, " "Эта группа не содержит замкнутых областей. В ней нет замкнутых контуров, "
"примитивы не лежат в одной плоскости или самопересекаются." "примитивы не лежат в одной плоскости или самопересекаются."
#: solvespace.cpp:917 #: solvespace.cpp:918
#, c-format #, c-format
msgid "" msgid ""
"The area of the region sketched in this group is:\n" "The area of the region sketched in this group is:\n"
@ -1962,7 +1969,7 @@ msgstr ""
"Кривые аппроксимированы кусочно-линейными функциями.\n" "Кривые аппроксимированы кусочно-линейными функциями.\n"
"Это приводит к ошибке в расчетах, обычно в пределах 1%%." "Это приводит к ошибке в расчетах, обычно в пределах 1%%."
#: solvespace.cpp:937 #: solvespace.cpp:938
#, c-format #, c-format
msgid "" msgid ""
"The total length of the selected entities is:\n" "The total length of the selected entities is:\n"
@ -1979,38 +1986,38 @@ msgstr ""
"Кривые аппроксимированы кусочно-линейными функциями.\n" "Кривые аппроксимированы кусочно-линейными функциями.\n"
"Это приводит к ошибке в расчетах, обычно в пределах 1%%." "Это приводит к ошибке в расчетах, обычно в пределах 1%%."
#: solvespace.cpp:943 #: solvespace.cpp:944
msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgid "Bad selection for perimeter; select line segments, arcs, and curves."
msgstr "" msgstr ""
"Неправильное выделение для расчета периметра; необходимо выбирать только " "Неправильное выделение для расчета периметра; необходимо выбирать только "
"отрезки, дуги и кривые в качестве исходных данных" "отрезки, дуги и кривые в качестве исходных данных"
#: solvespace.cpp:959 #: solvespace.cpp:960
msgid "Bad selection for trace; select a single point." msgid "Bad selection for trace; select a single point."
msgstr "Неправильное выделение для трассировки; необходимо выбрать одну точку." msgstr "Неправильное выделение для трассировки; необходимо выбрать одну точку."
#: solvespace.cpp:986 #: solvespace.cpp:987
#, c-format #, c-format
msgid "Couldn't write to '%s'" msgid "Couldn't write to '%s'"
msgstr "Невозможно записать в '%s'" msgstr "Невозможно записать в '%s'"
#: solvespace.cpp:1016 #: solvespace.cpp:1017
msgid "The mesh is self-intersecting (NOT okay, invalid)." msgid "The mesh is self-intersecting (NOT okay, invalid)."
msgstr "Полигональная сетка содержит самопересечения (это плохо)" msgstr "Полигональная сетка содержит самопересечения (это плохо)"
#: solvespace.cpp:1017 #: solvespace.cpp:1018
msgid "The mesh is not self-intersecting (okay, valid)." msgid "The mesh is not self-intersecting (okay, valid)."
msgstr "Полигональная сетка не содержит самопересечений (это хорошо)" msgstr "Полигональная сетка не содержит самопересечений (это хорошо)"
#: solvespace.cpp:1019 #: solvespace.cpp:1020
msgid "The mesh has naked edges (NOT okay, invalid)." msgid "The mesh has naked edges (NOT okay, invalid)."
msgstr "Полигональная сетка содержит \"оголенные\" ребра (это плохо)" msgstr "Полигональная сетка содержит \"оголенные\" ребра (это плохо)"
#: solvespace.cpp:1020 #: solvespace.cpp:1021
msgid "The mesh is watertight (okay, valid)." msgid "The mesh is watertight (okay, valid)."
msgstr "Полигональная сетка герметична (это хорошо)" msgstr "Полигональная сетка герметична (это хорошо)"
#: solvespace.cpp:1023 #: solvespace.cpp:1024
#, c-format #, c-format
msgid "" msgid ""
"\n" "\n"
@ -2021,7 +2028,7 @@ msgstr ""
"\n" "\n"
"Модель содержит %d треугольников, содержащихся в %d поверхностях." "Модель содержит %d треугольников, содержащихся в %d поверхностях."
#: solvespace.cpp:1027 #: solvespace.cpp:1028
#, c-format #, c-format
msgid "" msgid ""
"%s\n" "%s\n"
@ -2036,7 +2043,7 @@ msgstr ""
"\n" "\n"
"Нет проблемных ребер - это хорошо.%s" "Нет проблемных ребер - это хорошо.%s"
#: solvespace.cpp:1030 #: solvespace.cpp:1031
#, c-format #, c-format
msgid "" msgid ""
"%s\n" "%s\n"
@ -2051,7 +2058,7 @@ msgstr ""
"\n" "\n"
"%d найдены проблемные ребра - это плохо.%s" "%d найдены проблемные ребра - это плохо.%s"
#: solvespace.cpp:1043 #: solvespace.cpp:1044
#, c-format #, c-format
msgid "" msgid ""
"This is SolveSpace version %s.\n" "This is SolveSpace version %s.\n"
@ -2094,23 +2101,23 @@ msgstr ""
msgid "Style name cannot be empty" msgid "Style name cannot be empty"
msgstr "Имя стиля не может быть пустым." msgstr "Имя стиля не может быть пустым."
#: textscreens.cpp:785 #: textscreens.cpp:791
msgid "Can't repeat fewer than 1 time." msgid "Can't repeat fewer than 1 time."
msgstr "Невозможно сделать повторение меньше, чем 1 раз." msgstr "Невозможно сделать повторение меньше, чем 1 раз."
#: textscreens.cpp:789 #: textscreens.cpp:795
msgid "Can't repeat more than 999 times." msgid "Can't repeat more than 999 times."
msgstr "Невозможно сделать повтор больше, чем 999 раз." msgstr "Невозможно сделать повтор больше, чем 999 раз."
#: textscreens.cpp:814 #: textscreens.cpp:820
msgid "Group name cannot be empty" msgid "Group name cannot be empty"
msgstr "Имя группы не может быть пустым." msgstr "Имя группы не может быть пустым."
#: textscreens.cpp:866 #: textscreens.cpp:872
msgid "Opacity must be between zero and one." msgid "Opacity must be between zero and one."
msgstr "Прозрачность должна быть числом от нуля до единицы." msgstr "Прозрачность должна быть числом от нуля до единицы."
#: textscreens.cpp:901 #: textscreens.cpp:907
msgid "Radius cannot be zero or negative." msgid "Radius cannot be zero or negative."
msgstr "Радиус не может быть нулевым или отрицательным." msgstr "Радиус не может быть нулевым или отрицательным."

File diff suppressed because it is too large Load Diff

View File

@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: SolveSpace 3.0\n" "Project-Id-Version: SolveSpace 3.0\n"
"Report-Msgid-Bugs-To: whitequark@whitequark.org\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" "PO-Revision-Date: 2021-04-14 01:42+0300\n"
"Last-Translator: https://github.com/Symbian9\n" "Last-Translator: https://github.com/Symbian9\n"
"Language-Team: app4soft\n" "Language-Team: app4soft\n"
@ -35,7 +35,7 @@ msgstr "Буфер обміну порожній; немає чого встав
msgid "Number of copies to paste must be at least one." msgid "Number of copies to paste must be at least one."
msgstr "Кількість копій для вставки має бути не менше одної." msgstr "Кількість копій для вставки має бути не менше одної."
#: clipboard.cpp:389 textscreens.cpp:827 #: clipboard.cpp:389 textscreens.cpp:833
msgid "Scale cannot be zero." msgid "Scale cannot be zero."
msgstr "Масштаб не може бути нульовим." msgstr "Масштаб не може бути нульовим."
@ -62,15 +62,15 @@ msgstr "Забагато об'єктів для вставки; рзділіть
msgid "No workplane active." msgid "No workplane active."
msgstr "Немає активної площини." msgstr "Немає активної площини."
#: confscreen.cpp:376 #: confscreen.cpp:381
msgid "Bad format: specify coordinates as x, y, z" msgid "Bad format: specify coordinates as x, y, z"
msgstr "Некоректний формат: визначте координати 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" msgid "Bad format: specify color as r, g, b"
msgstr "Некоректний формат: визначте колір як R, G, B" msgstr "Некоректний формат: визначте колір як R, G, B"
#: confscreen.cpp:412 #: confscreen.cpp:417
#, fuzzy #, fuzzy
msgid "" msgid ""
"The perspective factor will have no effect until you enable View -> Use " "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 #, c-format
msgid "Specify between 0 and %d digits after the decimal." msgid "Specify between 0 and %d digits after the decimal."
msgstr "Визначте кількість десяткових знаків від 0 до %d." msgstr "Визначте кількість десяткових знаків від 0 до %d."
#: confscreen.cpp:452 #: confscreen.cpp:457
msgid "Export scale must not be zero!" msgid "Export scale must not be zero!"
msgstr "Масштаб експорту не може бути нульовим!" msgstr "Масштаб експорту не може бути нульовим!"
#: confscreen.cpp:464 #: confscreen.cpp:469
msgid "Cutter radius offset must not be negative!" msgid "Cutter radius offset must not be negative!"
msgstr "Радіус відступу різання не може бути від'ємним!" msgstr "Радіус відступу різання не може бути від'ємним!"
#: confscreen.cpp:518 #: confscreen.cpp:528
msgid "Bad value: autosave interval should be positive" msgid "Bad value: autosave interval should be positive"
msgstr "Некоректне значення: інтервал автозбереження має бути додатнім" msgstr "Некоректне значення: інтервал автозбереження має бути додатнім"
#: confscreen.cpp:521 #: confscreen.cpp:531
#, fuzzy #, fuzzy
msgid "Bad format: specify interval in integral minutes" msgid "Bad format: specify interval in integral minutes"
msgstr "Некоректний формат: визначте цілим числом інтервал у хвилинах" msgstr "Некоректний формат: визначте цілим числом інтервал у хвилинах"
@ -579,7 +579,7 @@ msgctxt "button"
msgid "&No" msgid "&No"
msgstr "&Ні" msgstr "&Ні"
#: file.cpp:877 solvespace.cpp:610 #: file.cpp:877 solvespace.cpp:611
msgctxt "button" msgctxt "button"
msgid "&Cancel" msgid "&Cancel"
msgstr "&Відмінити" msgstr "&Відмінити"
@ -1032,24 +1032,28 @@ msgstr "&Мова"
msgid "&Website / Manual" msgid "&Website / Manual"
msgstr "&Вебсайт / Посібник" msgstr "&Вебсайт / Посібник"
#: graphicswin.cpp:187 #: graphicswin.cpp:186
msgid "&Go to GitHub commit"
msgstr ""
#: graphicswin.cpp:188
msgid "&About" msgid "&About"
msgstr "&Про програму" msgstr "&Про програму"
#: graphicswin.cpp:361 #: graphicswin.cpp:362
msgid "(no recent files)" msgid "(no recent files)"
msgstr "(нємає нещодавніх файлів)" msgstr "(нємає нещодавніх файлів)"
#: graphicswin.cpp:369 #: graphicswin.cpp:370
#, c-format #, c-format
msgid "File '%s' does not exist." msgid "File '%s' does not exist."
msgstr "Файл '%s' відсутній." msgstr "Файл '%s' відсутній."
#: graphicswin.cpp:736 #: graphicswin.cpp:737
msgid "No workplane is active, so the grid will not appear." msgid "No workplane is active, so the grid will not appear."
msgstr "Відсутня активна площина - сітка не відображатиметься." msgstr "Відсутня активна площина - сітка не відображатиметься."
#: graphicswin.cpp:751 #: graphicswin.cpp:752
msgid "" msgid ""
"The perspective factor is set to zero, so the view will always be a parallel " "The perspective factor is set to zero, so the view will always be a parallel "
"projection.\n" "projection.\n"
@ -1058,91 +1062,91 @@ msgid ""
"configuration screen. A value around 0.3 is typical." "configuration screen. A value around 0.3 is typical."
msgstr "" msgstr ""
#: graphicswin.cpp:836 #: graphicswin.cpp:837
msgid "" msgid ""
"Select a point; this point will become the center of the view on screen." "Select a point; this point will become the center of the view on screen."
msgstr "" msgstr ""
#: graphicswin.cpp:1136 #: graphicswin.cpp:1137
msgid "No additional entities share endpoints with the selected entities." msgid "No additional entities share endpoints with the selected entities."
msgstr "" msgstr ""
#: graphicswin.cpp:1154 #: graphicswin.cpp:1155
msgid "" msgid ""
"To use this command, select a point or other entity from an linked part, or " "To use this command, select a point or other entity from an linked part, or "
"make a link group the active group." "make a link group the active group."
msgstr "" msgstr ""
#: graphicswin.cpp:1177 #: graphicswin.cpp:1178
msgid "" msgid ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "No workplane is active. Activate a workplane (with Sketch -> In Workplane) "
"to define the plane for the snap grid." "to define the plane for the snap grid."
msgstr "" msgstr ""
#: graphicswin.cpp:1184 #: graphicswin.cpp:1185
msgid "" msgid ""
"Can't snap these items to grid; select points, text comments, or constraints " "Can't snap these items to grid; select points, text comments, or constraints "
"with a label. To snap a line, select its endpoints." "with a label. To snap a line, select its endpoints."
msgstr "" msgstr ""
#: graphicswin.cpp:1269 #: graphicswin.cpp:1270
msgid "No workplane selected. Activating default workplane for this group." msgid "No workplane selected. Activating default workplane for this group."
msgstr "" msgstr ""
#: graphicswin.cpp:1272 #: graphicswin.cpp:1273
msgid "" msgid ""
"No workplane is selected, and the active group does not have a default " "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. Try selecting a workplane, or activating a sketch-in-new-"
"workplane group." "workplane group."
msgstr "" msgstr ""
#: graphicswin.cpp:1293 #: graphicswin.cpp:1294
msgid "" msgid ""
"Bad selection for tangent arc at point. Select a single point, or select " "Bad selection for tangent arc at point. Select a single point, or select "
"nothing to set up arc parameters." "nothing to set up arc parameters."
msgstr "" msgstr ""
#: graphicswin.cpp:1304 #: graphicswin.cpp:1305
msgid "click point on arc (draws anti-clockwise)" msgid "click point on arc (draws anti-clockwise)"
msgstr "" msgstr ""
#: graphicswin.cpp:1305 #: graphicswin.cpp:1306
msgid "click to place datum point" msgid "click to place datum point"
msgstr "клікніть для встановлення вихідної точки" msgstr "клікніть для встановлення вихідної точки"
#: graphicswin.cpp:1306 #: graphicswin.cpp:1307
msgid "click first point of line segment" msgid "click first point of line segment"
msgstr "клікніть першу точку прямої лінії" msgstr "клікніть першу точку прямої лінії"
#: graphicswin.cpp:1308 #: graphicswin.cpp:1309
msgid "click first point of construction line segment" msgid "click first point of construction line segment"
msgstr "клікніть першу точку конструктивної прямої лінії" msgstr "клікніть першу точку конструктивної прямої лінії"
#: graphicswin.cpp:1309 #: graphicswin.cpp:1310
msgid "click first point of cubic segment" msgid "click first point of cubic segment"
msgstr "клікніть першу точку кривої" msgstr "клікніть першу точку кривої"
#: graphicswin.cpp:1310 #: graphicswin.cpp:1311
msgid "click center of circle" msgid "click center of circle"
msgstr "клікніть в місце де буде центр коментаря" msgstr "клікніть в місце де буде центр коментаря"
#: graphicswin.cpp:1311 #: graphicswin.cpp:1312
msgid "click origin of workplane" msgid "click origin of workplane"
msgstr "клікніть в центр відліку площини" msgstr "клікніть в центр відліку площини"
#: graphicswin.cpp:1312 #: graphicswin.cpp:1313
msgid "click one corner of rectangle" msgid "click one corner of rectangle"
msgstr "клікніть для встановлення першого кута прямокутника" msgstr "клікніть для встановлення першого кута прямокутника"
#: graphicswin.cpp:1313 #: graphicswin.cpp:1314
msgid "click top left of text" msgid "click top left of text"
msgstr "клікніть для встановлення верхньої лівої межі тексту" msgstr "клікніть для встановлення верхньої лівої межі тексту"
#: graphicswin.cpp:1319 #: graphicswin.cpp:1320
msgid "click top left of image" msgid "click top left of image"
msgstr "клікніть для встановлення верхньої лівої межі зображення" msgstr "клікніть для встановлення верхньої лівої межі зображення"
#: graphicswin.cpp:1345 #: graphicswin.cpp:1346
msgid "" msgid ""
"No entities are selected. Select entities before trying to toggle their " "No entities are selected. Select entities before trying to toggle their "
"construction state." "construction state."
@ -1271,6 +1275,10 @@ msgstr "контур самоперетинається!"
msgid "zero-length edge!" msgid "zero-length edge!"
msgstr "ребро нульової довжини!" msgstr "ребро нульової довжини!"
#: importmesh.cpp:136
msgid "Text-formated STL files are not currently supported"
msgstr ""
#: modify.cpp:252 #: modify.cpp:252
msgid "Must be sketching in workplane to create tangent arc." msgid "Must be sketching in workplane to create tangent arc."
msgstr "" msgstr ""
@ -1452,7 +1460,7 @@ msgid ""
"Workplane." "Workplane."
msgstr "" 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" msgctxt "file-type"
msgid "SolveSpace models" msgid "SolveSpace models"
msgstr "SolveSpace модель" msgstr "SolveSpace модель"
@ -1547,130 +1555,130 @@ msgctxt "file-type"
msgid "Comma-separated values" msgid "Comma-separated values"
msgstr "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" msgid "untitled"
msgstr "без імені" 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 #: platform/guiwin.cpp:1639
msgctxt "title" msgctxt "title"
msgid "Save File" msgid "Save File"
msgstr "Зберегти Файл" 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 #: platform/guiwin.cpp:1645
msgctxt "title" msgctxt "title"
msgid "Open File" msgid "Open File"
msgstr "Відкрити Файл" msgstr "Відкрити Файл"
#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 #: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433
msgctxt "button" msgctxt "button"
msgid "_Cancel" msgid "_Cancel"
msgstr "_Скасувати" msgstr "_Скасувати"
#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 #: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431
msgctxt "button" msgctxt "button"
msgid "_Save" msgid "_Save"
msgstr "_Зберегти" msgstr "_Зберегти"
#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 #: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432
msgctxt "button" msgctxt "button"
msgid "_Open" msgid "_Open"
msgstr "_Відкрити" msgstr "_Відкрити"
#: solvespace.cpp:170 #: solvespace.cpp:171
msgctxt "title" msgctxt "title"
msgid "Autosave Available" msgid "Autosave Available"
msgstr "Наявні автозбереження" msgstr "Наявні автозбереження"
#: solvespace.cpp:171 #: solvespace.cpp:172
msgctxt "dialog" msgctxt "dialog"
msgid "An autosave file is available for this sketch." msgid "An autosave file is available for this sketch."
msgstr "Наявні автозбереження для цього креслення." msgstr "Наявні автозбереження для цього креслення."
#: solvespace.cpp:172 #: solvespace.cpp:173
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to load the autosave file instead?" msgid "Do you want to load the autosave file instead?"
msgstr "Завантажити файл автозбереження?" msgstr "Завантажити файл автозбереження?"
#: solvespace.cpp:173 #: solvespace.cpp:174
msgctxt "button" msgctxt "button"
msgid "&Load autosave" msgid "&Load autosave"
msgstr "&Завантажити автозбереження" msgstr "&Завантажити автозбереження"
#: solvespace.cpp:175 #: solvespace.cpp:176
msgctxt "button" msgctxt "button"
msgid "Do&n't Load" msgid "Do&n't Load"
msgstr "&Не Завантажувати" msgstr "&Не Завантажувати"
#: solvespace.cpp:598 #: solvespace.cpp:599
msgctxt "title" msgctxt "title"
msgid "Modified File" msgid "Modified File"
msgstr "Файл Змінено" msgstr "Файл Змінено"
#: solvespace.cpp:600 #: solvespace.cpp:601
#, c-format #, c-format
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to save the changes you made to the sketch “%s”?" msgid "Do you want to save the changes you made to the sketch “%s”?"
msgstr "Чи хочете ви зберегти зміни зроблені вами у ескізі “%s”?" msgstr "Чи хочете ви зберегти зміни зроблені вами у ескізі “%s”?"
#: solvespace.cpp:603 #: solvespace.cpp:604
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to save the changes you made to the new sketch?" msgid "Do you want to save the changes you made to the new sketch?"
msgstr "Чи хочете ви зберегти зміни зроблені вами у новому ескізі?" msgstr "Чи хочете ви зберегти зміни зроблені вами у новому ескізі?"
#: solvespace.cpp:606 #: solvespace.cpp:607
msgctxt "dialog" msgctxt "dialog"
msgid "Your changes will be lost if you don't save them." msgid "Your changes will be lost if you don't save them."
msgstr "Ваші зміни буде втрачено якщо ви не збережете їх." msgstr "Ваші зміни буде втрачено якщо ви не збережете їх."
#: solvespace.cpp:607 #: solvespace.cpp:608
msgctxt "button" msgctxt "button"
msgid "&Save" msgid "&Save"
msgstr "&Зберегти" msgstr "&Зберегти"
#: solvespace.cpp:609 #: solvespace.cpp:610
msgctxt "button" msgctxt "button"
msgid "Do&n't Save" msgid "Do&n't Save"
msgstr "&Не Зберігати" msgstr "&Не Зберігати"
#: solvespace.cpp:630 #: solvespace.cpp:631
msgctxt "title" msgctxt "title"
msgid "(new sketch)" msgid "(new sketch)"
msgstr "(нове креслення)" msgstr "(нове креслення)"
#: solvespace.cpp:637 #: solvespace.cpp:638
msgctxt "title" msgctxt "title"
msgid "Property Browser" msgid "Property Browser"
msgstr "Браузер Властивостей" msgstr "Браузер Властивостей"
#: solvespace.cpp:699 #: solvespace.cpp:700
msgid "" msgid ""
"Constraints are currently shown, and will be exported in the toolpath. This " "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 " "is probably not what you want; hide them by clicking the link at the top of "
"the text window." "the text window."
msgstr "" msgstr ""
#: solvespace.cpp:771 #: solvespace.cpp:772
#, c-format #, c-format
msgid "" msgid ""
"Can't identify file type from file extension of filename '%s'; try .dxf or ." "Can't identify file type from file extension of filename '%s'; try .dxf or ."
"dwg." "dwg."
msgstr "" msgstr ""
#: solvespace.cpp:823 #: solvespace.cpp:824
msgid "Constraint must have a label, and must not be a reference dimension." msgid "Constraint must have a label, and must not be a reference dimension."
msgstr "Обмежувач має містити мітку і бути не відносним розміром." msgstr "Обмежувач має містити мітку і бути не відносним розміром."
#: solvespace.cpp:827 #: solvespace.cpp:828
msgid "Bad selection for step dimension; select a constraint." msgid "Bad selection for step dimension; select a constraint."
msgstr "Поганий вибір для крокової зміни розміру; оберіть обмежувач." msgstr "Поганий вибір для крокової зміни розміру; оберіть обмежувач."
#: solvespace.cpp:851 #: solvespace.cpp:852
msgid "The assembly does not interfere, good." msgid "The assembly does not interfere, good."
msgstr "" msgstr ""
#: solvespace.cpp:867 #: solvespace.cpp:868
#, c-format #, c-format
msgid "" msgid ""
"The volume of the solid model is:\n" "The volume of the solid model is:\n"
@ -1681,7 +1689,7 @@ msgstr ""
"\n" "\n"
" %s" " %s"
#: solvespace.cpp:876 #: solvespace.cpp:877
#, c-format #, c-format
msgid "" msgid ""
"\n" "\n"
@ -1694,7 +1702,7 @@ msgstr ""
"\n" "\n"
" %s" " %s"
#: solvespace.cpp:881 #: solvespace.cpp:882
msgid "" msgid ""
"\n" "\n"
"\n" "\n"
@ -1702,7 +1710,7 @@ msgid ""
"This introduces error, typically of around 1%." "This introduces error, typically of around 1%."
msgstr "" msgstr ""
#: solvespace.cpp:896 #: solvespace.cpp:897
#, c-format #, c-format
msgid "" msgid ""
"The surface area of the selected faces is:\n" "The surface area of the selected faces is:\n"
@ -1713,7 +1721,7 @@ msgid ""
"This introduces error, typically of around 1%%." "This introduces error, typically of around 1%%."
msgstr "" msgstr ""
#: solvespace.cpp:905 #: solvespace.cpp:906
msgid "" msgid ""
"This group does not contain a correctly-formed 2d closed area. It is open, " "This group does not contain a correctly-formed 2d closed area. It is open, "
"not coplanar, or self-intersecting." "not coplanar, or self-intersecting."
@ -1721,7 +1729,7 @@ msgstr ""
"Ця група не місить коректно сформованого замкненої 2D площини. Вона " "Ця група не місить коректно сформованого замкненої 2D площини. Вона "
"відкрита, не компланарна, або ж самоперетинається." "відкрита, не компланарна, або ж самоперетинається."
#: solvespace.cpp:917 #: solvespace.cpp:918
#, c-format #, c-format
msgid "" msgid ""
"The area of the region sketched in this group is:\n" "The area of the region sketched in this group is:\n"
@ -1738,7 +1746,7 @@ msgstr ""
"Криві наближено до ламаних ліній.\n" "Криві наближено до ламаних ліній.\n"
"Це вносить похибку, зазвичай близько 1%%." "Це вносить похибку, зазвичай близько 1%%."
#: solvespace.cpp:937 #: solvespace.cpp:938
#, c-format #, c-format
msgid "" msgid ""
"The total length of the selected entities is:\n" "The total length of the selected entities is:\n"
@ -1755,36 +1763,36 @@ msgstr ""
"Криві наближено до ламаних ліній.\n" "Криві наближено до ламаних ліній.\n"
"Це вносить похибку, зазвичай близько 1%%." "Це вносить похибку, зазвичай близько 1%%."
#: solvespace.cpp:943 #: solvespace.cpp:944
msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgid "Bad selection for perimeter; select line segments, arcs, and curves."
msgstr "Поганий вибір для периметру; оберіть відрізки, дуги та криві." msgstr "Поганий вибір для периметру; оберіть відрізки, дуги та криві."
#: solvespace.cpp:959 #: solvespace.cpp:960
msgid "Bad selection for trace; select a single point." msgid "Bad selection for trace; select a single point."
msgstr "Поганий вибір для вістежування шляху; оберіть одну точку." msgstr "Поганий вибір для вістежування шляху; оберіть одну точку."
#: solvespace.cpp:986 #: solvespace.cpp:987
#, c-format #, c-format
msgid "Couldn't write to '%s'" msgid "Couldn't write to '%s'"
msgstr "Неможливо записати у '%s'" msgstr "Неможливо записати у '%s'"
#: solvespace.cpp:1016 #: solvespace.cpp:1017
msgid "The mesh is self-intersecting (NOT okay, invalid)." msgid "The mesh is self-intersecting (NOT okay, invalid)."
msgstr "Меш самоперетинається (НЕ добре, недійсний)." msgstr "Меш самоперетинається (НЕ добре, недійсний)."
#: solvespace.cpp:1017 #: solvespace.cpp:1018
msgid "The mesh is not self-intersecting (okay, valid)." msgid "The mesh is not self-intersecting (okay, valid)."
msgstr "Меш самоперетинається (добре, дійсний)." msgstr "Меш самоперетинається (добре, дійсний)."
#: solvespace.cpp:1019 #: solvespace.cpp:1020
msgid "The mesh has naked edges (NOT okay, invalid)." msgid "The mesh has naked edges (NOT okay, invalid)."
msgstr "Меш містить оголені ребра (НЕ добре, недійсний)." msgstr "Меш містить оголені ребра (НЕ добре, недійсний)."
#: solvespace.cpp:1020 #: solvespace.cpp:1021
msgid "The mesh is watertight (okay, valid)." msgid "The mesh is watertight (okay, valid)."
msgstr "Меш водонепроникний (добре, дійсний)." msgstr "Меш водонепроникний (добре, дійсний)."
#: solvespace.cpp:1023 #: solvespace.cpp:1024
#, c-format #, c-format
msgid "" msgid ""
"\n" "\n"
@ -1792,7 +1800,7 @@ msgid ""
"The model contains %d triangles, from %d surfaces." "The model contains %d triangles, from %d surfaces."
msgstr "" msgstr ""
#: solvespace.cpp:1027 #: solvespace.cpp:1028
#, c-format #, c-format
msgid "" msgid ""
"%s\n" "%s\n"
@ -1807,7 +1815,7 @@ msgstr ""
"\n" "\n"
"Відсутні проблемні ребра, добре.%s" "Відсутні проблемні ребра, добре.%s"
#: solvespace.cpp:1030 #: solvespace.cpp:1031
#, c-format #, c-format
msgid "" msgid ""
"%s\n" "%s\n"
@ -1822,7 +1830,7 @@ msgstr ""
"\n" "\n"
"%d проблемних ребер, погано.%s" "%d проблемних ребер, погано.%s"
#: solvespace.cpp:1043 #: solvespace.cpp:1044
#, c-format #, c-format
msgid "" msgid ""
"This is SolveSpace version %s.\n" "This is SolveSpace version %s.\n"
@ -1863,23 +1871,23 @@ msgstr ""
msgid "Style name cannot be empty" msgid "Style name cannot be empty"
msgstr "Стиль не може містити порожнє ім'я" msgstr "Стиль не може містити порожнє ім'я"
#: textscreens.cpp:785 #: textscreens.cpp:791
msgid "Can't repeat fewer than 1 time." msgid "Can't repeat fewer than 1 time."
msgstr "Не можливо повторити менше 1 разу." msgstr "Не можливо повторити менше 1 разу."
#: textscreens.cpp:789 #: textscreens.cpp:795
msgid "Can't repeat more than 999 times." msgid "Can't repeat more than 999 times."
msgstr "Не можливо повторити понад 999 разів." msgstr "Не можливо повторити понад 999 разів."
#: textscreens.cpp:814 #: textscreens.cpp:820
msgid "Group name cannot be empty" msgid "Group name cannot be empty"
msgstr "Група не може містити порожнє ім'я" msgstr "Група не може містити порожнє ім'я"
#: textscreens.cpp:866 #: textscreens.cpp:872
msgid "Opacity must be between zero and one." msgid "Opacity must be between zero and one."
msgstr "Непрозорість має бути між 0 та 1." msgstr "Непрозорість має бути між 0 та 1."
#: textscreens.cpp:901 #: textscreens.cpp:907
msgid "Radius cannot be zero or negative." msgid "Radius cannot be zero or negative."
msgstr "Радіус не може бути нульовим чи від'ємним." msgstr "Радіус не може бути нульовим чи від'ємним."

View File

@ -2,12 +2,12 @@
# Copyright (C) 2020 the PACKAGE authors # Copyright (C) 2020 the PACKAGE authors
# This file is distributed under the same license as the SolveSpace package. # This file is distributed under the same license as the SolveSpace package.
# <lomatus@163.com>, 2020. # <lomatus@163.com>, 2020.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: SolveSpace 3.0\n" "Project-Id-Version: SolveSpace 3.0\n"
"Report-Msgid-Bugs-To: whitequark@whitequark.org\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" "PO-Revision-Date: 2021-04-03 13:10-0400\n"
"Last-Translator: lomatus@163.com\n" "Last-Translator: lomatus@163.com\n"
"Language-Team: none\n" "Language-Team: none\n"
@ -35,7 +35,7 @@ msgstr "剪贴板为空;没有要粘贴的内容。"
msgid "Number of copies to paste must be at least one." msgid "Number of copies to paste must be at least one."
msgstr "要粘贴的副本数必须至少为 1 个。" msgstr "要粘贴的副本数必须至少为 1 个。"
#: clipboard.cpp:389 textscreens.cpp:827 #: clipboard.cpp:389 textscreens.cpp:833
msgid "Scale cannot be zero." msgid "Scale cannot be zero."
msgstr "缩放不能为零。" msgstr "缩放不能为零。"
@ -61,38 +61,38 @@ msgstr "要粘贴的项目太多; 请把他们拆分。"
msgid "No workplane active." msgid "No workplane active."
msgstr "没有工作平面处于活动状态。" msgstr "没有工作平面处于活动状态。"
#: confscreen.cpp:376 #: confscreen.cpp:381
msgid "Bad format: specify coordinates as x, y, z" msgid "Bad format: specify coordinates as x, y, z"
msgstr "格式错误:将坐标指定为 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" msgid "Bad format: specify color as r, g, b"
msgstr "格式错误:将颜色指定为 r、g、b" msgstr "格式错误:将颜色指定为 r、g、b"
#: confscreen.cpp:412 #: confscreen.cpp:417
msgid "" msgid ""
"The perspective factor will have no effect until you enable View -> Use " "The perspective factor will have no effect until you enable View -> Use "
"Perspective Projection." "Perspective Projection."
msgstr "在启用\"视图 -= 使用透视投影\"之前,透视因子将不起作用。" msgstr "在启用\"视图 -= 使用透视投影\"之前,透视因子将不起作用。"
#: confscreen.cpp:430 confscreen.cpp:440 #: confscreen.cpp:435 confscreen.cpp:445
#, c-format #, c-format
msgid "Specify between 0 and %d digits after the decimal." msgid "Specify between 0 and %d digits after the decimal."
msgstr "在十进制之后指定 0 和 %d 数字之间。" msgstr "在十进制之后指定 0 和 %d 数字之间。"
#: confscreen.cpp:452 #: confscreen.cpp:457
msgid "Export scale must not be zero!" msgid "Export scale must not be zero!"
msgstr "输出比例不能为零!" msgstr "输出比例不能为零!"
#: confscreen.cpp:464 #: confscreen.cpp:469
msgid "Cutter radius offset must not be negative!" msgid "Cutter radius offset must not be negative!"
msgstr "刀具半径偏移不能为负数!" msgstr "刀具半径偏移不能为负数!"
#: confscreen.cpp:518 #: confscreen.cpp:528
msgid "Bad value: autosave interval should be positive" msgid "Bad value: autosave interval should be positive"
msgstr "坏值:自动保存间隔应为正" msgstr "坏值:自动保存间隔应为正"
#: confscreen.cpp:521 #: confscreen.cpp:531
msgid "Bad format: specify interval in integral minutes" msgid "Bad format: specify interval in integral minutes"
msgstr "格式错误:以整数分钟为单位指定间隔" msgstr "格式错误:以整数分钟为单位指定间隔"
@ -632,7 +632,7 @@ msgctxt "button"
msgid "&No" msgid "&No"
msgstr "否(&N)" msgstr "否(&N)"
#: file.cpp:877 solvespace.cpp:610 #: file.cpp:877 solvespace.cpp:611
msgctxt "button" msgctxt "button"
msgid "&Cancel" msgid "&Cancel"
msgstr "取消(&C)" msgstr "取消(&C)"
@ -1085,24 +1085,28 @@ msgstr "语言(&L)"
msgid "&Website / Manual" msgid "&Website / Manual"
msgstr "网页/手册(&W)" msgstr "网页/手册(&W)"
#: graphicswin.cpp:187 #: graphicswin.cpp:186
msgid "&Go to GitHub commit"
msgstr ""
#: graphicswin.cpp:188
msgid "&About" msgid "&About"
msgstr "关于(&A)" msgstr "关于(&A)"
#: graphicswin.cpp:361 #: graphicswin.cpp:362
msgid "(no recent files)" msgid "(no recent files)"
msgstr "(无文件)" msgstr "(无文件)"
#: graphicswin.cpp:369 #: graphicswin.cpp:370
#, c-format #, c-format
msgid "File '%s' does not exist." msgid "File '%s' does not exist."
msgstr "文件不存在: \"%s\"。" msgstr "文件不存在: \"%s\"。"
#: graphicswin.cpp:736 #: graphicswin.cpp:737
msgid "No workplane is active, so the grid will not appear." msgid "No workplane is active, so the grid will not appear."
msgstr "没有激活的工作面,因此无法显示轴网。" msgstr "没有激活的工作面,因此无法显示轴网。"
#: graphicswin.cpp:751 #: graphicswin.cpp:752
msgid "" msgid ""
"The perspective factor is set to zero, so the view will always be a parallel " "The perspective factor is set to zero, so the view will always be a parallel "
"projection.\n" "projection.\n"
@ -1111,91 +1115,91 @@ msgid ""
"configuration screen. A value around 0.3 is typical." "configuration screen. A value around 0.3 is typical."
msgstr "" msgstr ""
#: graphicswin.cpp:836 #: graphicswin.cpp:837
msgid "" msgid ""
"Select a point; this point will become the center of the view on screen." "Select a point; this point will become the center of the view on screen."
msgstr "" msgstr ""
#: graphicswin.cpp:1136 #: graphicswin.cpp:1137
msgid "No additional entities share endpoints with the selected entities." msgid "No additional entities share endpoints with the selected entities."
msgstr "" msgstr ""
#: graphicswin.cpp:1154 #: graphicswin.cpp:1155
msgid "" msgid ""
"To use this command, select a point or other entity from an linked part, or " "To use this command, select a point or other entity from an linked part, or "
"make a link group the active group." "make a link group the active group."
msgstr "" msgstr ""
#: graphicswin.cpp:1177 #: graphicswin.cpp:1178
msgid "" msgid ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "No workplane is active. Activate a workplane (with Sketch -> In Workplane) "
"to define the plane for the snap grid." "to define the plane for the snap grid."
msgstr "" msgstr ""
#: graphicswin.cpp:1184 #: graphicswin.cpp:1185
msgid "" msgid ""
"Can't snap these items to grid; select points, text comments, or constraints " "Can't snap these items to grid; select points, text comments, or constraints "
"with a label. To snap a line, select its endpoints." "with a label. To snap a line, select its endpoints."
msgstr "" msgstr ""
#: graphicswin.cpp:1269 #: graphicswin.cpp:1270
msgid "No workplane selected. Activating default workplane for this group." msgid "No workplane selected. Activating default workplane for this group."
msgstr "" msgstr ""
#: graphicswin.cpp:1272 #: graphicswin.cpp:1273
msgid "" msgid ""
"No workplane is selected, and the active group does not have a default " "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. Try selecting a workplane, or activating a sketch-in-new-"
"workplane group." "workplane group."
msgstr "" msgstr ""
#: graphicswin.cpp:1293 #: graphicswin.cpp:1294
msgid "" msgid ""
"Bad selection for tangent arc at point. Select a single point, or select " "Bad selection for tangent arc at point. Select a single point, or select "
"nothing to set up arc parameters." "nothing to set up arc parameters."
msgstr "" msgstr ""
#: graphicswin.cpp:1304 #: graphicswin.cpp:1305
msgid "click point on arc (draws anti-clockwise)" msgid "click point on arc (draws anti-clockwise)"
msgstr "点击弧线的点(逆时针方向绘制)" msgstr "点击弧线的点(逆时针方向绘制)"
#: graphicswin.cpp:1305 #: graphicswin.cpp:1306
msgid "click to place datum point" msgid "click to place datum point"
msgstr "点击放置基准点" msgstr "点击放置基准点"
#: graphicswin.cpp:1306 #: graphicswin.cpp:1307
msgid "click first point of line segment" msgid "click first point of line segment"
msgstr "点击线条的起点" msgstr "点击线条的起点"
#: graphicswin.cpp:1308 #: graphicswin.cpp:1309
msgid "click first point of construction line segment" msgid "click first point of construction line segment"
msgstr "点击构造线的起点" msgstr "点击构造线的起点"
#: graphicswin.cpp:1309 #: graphicswin.cpp:1310
msgid "click first point of cubic segment" msgid "click first point of cubic segment"
msgstr "点击立方体的起点" msgstr "点击立方体的起点"
#: graphicswin.cpp:1310 #: graphicswin.cpp:1311
msgid "click center of circle" msgid "click center of circle"
msgstr "点击圆弧的中心" msgstr "点击圆弧的中心"
#: graphicswin.cpp:1311 #: graphicswin.cpp:1312
msgid "click origin of workplane" msgid "click origin of workplane"
msgstr "点击工作面的原点" msgstr "点击工作面的原点"
#: graphicswin.cpp:1312 #: graphicswin.cpp:1313
msgid "click one corner of rectangle" msgid "click one corner of rectangle"
msgstr "点击一个矩形倒角" msgstr "点击一个矩形倒角"
#: graphicswin.cpp:1313 #: graphicswin.cpp:1314
msgid "click top left of text" msgid "click top left of text"
msgstr "点击文字左上角" msgstr "点击文字左上角"
#: graphicswin.cpp:1319 #: graphicswin.cpp:1320
msgid "click top left of image" msgid "click top left of image"
msgstr "点击图片左上角" msgstr "点击图片左上角"
#: graphicswin.cpp:1345 #: graphicswin.cpp:1346
msgid "" msgid ""
"No entities are selected. Select entities before trying to toggle their " "No entities are selected. Select entities before trying to toggle their "
"construction state." "construction state."
@ -1326,6 +1330,10 @@ msgstr "轮廓自相交!"
msgid "zero-length edge!" msgid "zero-length edge!"
msgstr "边缘长度为零!" msgstr "边缘长度为零!"
#: importmesh.cpp:136
msgid "Text-formated STL files are not currently supported"
msgstr ""
#: modify.cpp:252 #: modify.cpp:252
msgid "Must be sketching in workplane to create tangent arc." msgid "Must be sketching in workplane to create tangent arc."
msgstr "" msgstr ""
@ -1505,7 +1513,7 @@ msgid ""
"Workplane." "Workplane."
msgstr "无法在三维空间内绘制图片,可使用 草图->在工作面 激活工作面。" 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" msgctxt "file-type"
msgid "SolveSpace models" msgid "SolveSpace models"
msgstr "SolveSpace模型" msgstr "SolveSpace模型"
@ -1600,130 +1608,130 @@ msgctxt "file-type"
msgid "Comma-separated values" msgid "Comma-separated values"
msgstr "逗号分隔数据" 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" msgid "untitled"
msgstr "未命名" 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 #: platform/guiwin.cpp:1639
msgctxt "title" msgctxt "title"
msgid "Save File" msgid "Save File"
msgstr "保存文件" 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 #: platform/guiwin.cpp:1645
msgctxt "title" msgctxt "title"
msgid "Open File" msgid "Open File"
msgstr "打开文件" msgstr "打开文件"
#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 #: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433
msgctxt "button" msgctxt "button"
msgid "_Cancel" msgid "_Cancel"
msgstr "取消_C" msgstr "取消_C"
#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 #: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431
msgctxt "button" msgctxt "button"
msgid "_Save" msgid "_Save"
msgstr "保存_S" msgstr "保存_S"
#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 #: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432
msgctxt "button" msgctxt "button"
msgid "_Open" msgid "_Open"
msgstr "打开_O" msgstr "打开_O"
#: solvespace.cpp:170 #: solvespace.cpp:171
msgctxt "title" msgctxt "title"
msgid "Autosave Available" msgid "Autosave Available"
msgstr "" msgstr ""
#: solvespace.cpp:171 #: solvespace.cpp:172
msgctxt "dialog" msgctxt "dialog"
msgid "An autosave file is available for this sketch." msgid "An autosave file is available for this sketch."
msgstr "" msgstr ""
#: solvespace.cpp:172 #: solvespace.cpp:173
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to load the autosave file instead?" msgid "Do you want to load the autosave file instead?"
msgstr "" msgstr ""
#: solvespace.cpp:173 #: solvespace.cpp:174
msgctxt "button" msgctxt "button"
msgid "&Load autosave" msgid "&Load autosave"
msgstr "" msgstr ""
#: solvespace.cpp:175 #: solvespace.cpp:176
msgctxt "button" msgctxt "button"
msgid "Do&n't Load" msgid "Do&n't Load"
msgstr "" msgstr ""
#: solvespace.cpp:598 #: solvespace.cpp:599
msgctxt "title" msgctxt "title"
msgid "Modified File" msgid "Modified File"
msgstr "" msgstr ""
#: solvespace.cpp:600 #: solvespace.cpp:601
#, c-format #, c-format
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to save the changes you made to the sketch “%s”?" msgid "Do you want to save the changes you made to the sketch “%s”?"
msgstr "" msgstr ""
#: solvespace.cpp:603 #: solvespace.cpp:604
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to save the changes you made to the new sketch?" msgid "Do you want to save the changes you made to the new sketch?"
msgstr "" msgstr ""
#: solvespace.cpp:606 #: solvespace.cpp:607
msgctxt "dialog" msgctxt "dialog"
msgid "Your changes will be lost if you don't save them." msgid "Your changes will be lost if you don't save them."
msgstr "" msgstr ""
#: solvespace.cpp:607 #: solvespace.cpp:608
msgctxt "button" msgctxt "button"
msgid "&Save" msgid "&Save"
msgstr "" msgstr ""
#: solvespace.cpp:609 #: solvespace.cpp:610
msgctxt "button" msgctxt "button"
msgid "Do&n't Save" msgid "Do&n't Save"
msgstr "" msgstr ""
#: solvespace.cpp:630 #: solvespace.cpp:631
msgctxt "title" msgctxt "title"
msgid "(new sketch)" msgid "(new sketch)"
msgstr "" msgstr ""
#: solvespace.cpp:637 #: solvespace.cpp:638
msgctxt "title" msgctxt "title"
msgid "Property Browser" msgid "Property Browser"
msgstr "" msgstr ""
#: solvespace.cpp:699 #: solvespace.cpp:700
msgid "" msgid ""
"Constraints are currently shown, and will be exported in the toolpath. This " "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 " "is probably not what you want; hide them by clicking the link at the top of "
"the text window." "the text window."
msgstr "" msgstr ""
#: solvespace.cpp:771 #: solvespace.cpp:772
#, c-format #, c-format
msgid "" msgid ""
"Can't identify file type from file extension of filename '%s'; try .dxf or ." "Can't identify file type from file extension of filename '%s'; try .dxf or ."
"dwg." "dwg."
msgstr "" msgstr ""
#: solvespace.cpp:823 #: solvespace.cpp:824
msgid "Constraint must have a label, and must not be a reference dimension." msgid "Constraint must have a label, and must not be a reference dimension."
msgstr "" msgstr ""
#: solvespace.cpp:827 #: solvespace.cpp:828
msgid "Bad selection for step dimension; select a constraint." msgid "Bad selection for step dimension; select a constraint."
msgstr "" msgstr ""
#: solvespace.cpp:851 #: solvespace.cpp:852
msgid "The assembly does not interfere, good." msgid "The assembly does not interfere, good."
msgstr "" msgstr ""
#: solvespace.cpp:867 #: solvespace.cpp:868
#, c-format #, c-format
msgid "" msgid ""
"The volume of the solid model is:\n" "The volume of the solid model is:\n"
@ -1731,7 +1739,7 @@ msgid ""
" %s" " %s"
msgstr "" msgstr ""
#: solvespace.cpp:876 #: solvespace.cpp:877
#, c-format #, c-format
msgid "" msgid ""
"\n" "\n"
@ -1740,7 +1748,7 @@ msgid ""
" %s" " %s"
msgstr "" msgstr ""
#: solvespace.cpp:881 #: solvespace.cpp:882
msgid "" msgid ""
"\n" "\n"
"\n" "\n"
@ -1748,7 +1756,7 @@ msgid ""
"This introduces error, typically of around 1%." "This introduces error, typically of around 1%."
msgstr "" msgstr ""
#: solvespace.cpp:896 #: solvespace.cpp:897
#, c-format #, c-format
msgid "" msgid ""
"The surface area of the selected faces is:\n" "The surface area of the selected faces is:\n"
@ -1759,13 +1767,13 @@ msgid ""
"This introduces error, typically of around 1%%." "This introduces error, typically of around 1%%."
msgstr "" msgstr ""
#: solvespace.cpp:905 #: solvespace.cpp:906
msgid "" msgid ""
"This group does not contain a correctly-formed 2d closed area. It is open, " "This group does not contain a correctly-formed 2d closed area. It is open, "
"not coplanar, or self-intersecting." "not coplanar, or self-intersecting."
msgstr "" msgstr ""
#: solvespace.cpp:917 #: solvespace.cpp:918
#, c-format #, c-format
msgid "" msgid ""
"The area of the region sketched in this group is:\n" "The area of the region sketched in this group is:\n"
@ -1776,7 +1784,7 @@ msgid ""
"This introduces error, typically of around 1%%." "This introduces error, typically of around 1%%."
msgstr "" msgstr ""
#: solvespace.cpp:937 #: solvespace.cpp:938
#, c-format #, c-format
msgid "" msgid ""
"The total length of the selected entities is:\n" "The total length of the selected entities is:\n"
@ -1787,36 +1795,36 @@ msgid ""
"This introduces error, typically of around 1%%." "This introduces error, typically of around 1%%."
msgstr "" msgstr ""
#: solvespace.cpp:943 #: solvespace.cpp:944
msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgid "Bad selection for perimeter; select line segments, arcs, and curves."
msgstr "" msgstr ""
#: solvespace.cpp:959 #: solvespace.cpp:960
msgid "Bad selection for trace; select a single point." msgid "Bad selection for trace; select a single point."
msgstr "" msgstr ""
#: solvespace.cpp:986 #: solvespace.cpp:987
#, c-format #, c-format
msgid "Couldn't write to '%s'" msgid "Couldn't write to '%s'"
msgstr "" msgstr ""
#: solvespace.cpp:1016 #: solvespace.cpp:1017
msgid "The mesh is self-intersecting (NOT okay, invalid)." msgid "The mesh is self-intersecting (NOT okay, invalid)."
msgstr "" msgstr ""
#: solvespace.cpp:1017 #: solvespace.cpp:1018
msgid "The mesh is not self-intersecting (okay, valid)." msgid "The mesh is not self-intersecting (okay, valid)."
msgstr "" msgstr ""
#: solvespace.cpp:1019 #: solvespace.cpp:1020
msgid "The mesh has naked edges (NOT okay, invalid)." msgid "The mesh has naked edges (NOT okay, invalid)."
msgstr "" msgstr ""
#: solvespace.cpp:1020 #: solvespace.cpp:1021
msgid "The mesh is watertight (okay, valid)." msgid "The mesh is watertight (okay, valid)."
msgstr "" msgstr ""
#: solvespace.cpp:1023 #: solvespace.cpp:1024
#, c-format #, c-format
msgid "" msgid ""
"\n" "\n"
@ -1824,7 +1832,7 @@ msgid ""
"The model contains %d triangles, from %d surfaces." "The model contains %d triangles, from %d surfaces."
msgstr "" msgstr ""
#: solvespace.cpp:1027 #: solvespace.cpp:1028
#, c-format #, c-format
msgid "" msgid ""
"%s\n" "%s\n"
@ -1834,7 +1842,7 @@ msgid ""
"Zero problematic edges, good.%s" "Zero problematic edges, good.%s"
msgstr "" msgstr ""
#: solvespace.cpp:1030 #: solvespace.cpp:1031
#, c-format #, c-format
msgid "" msgid ""
"%s\n" "%s\n"
@ -1844,7 +1852,7 @@ msgid ""
"%d problematic edges, bad.%s" "%d problematic edges, bad.%s"
msgstr "" msgstr ""
#: solvespace.cpp:1043 #: solvespace.cpp:1044
#, c-format #, c-format
msgid "" msgid ""
"This is SolveSpace version %s.\n" "This is SolveSpace version %s.\n"
@ -1871,23 +1879,23 @@ msgstr "无法将样式分配给派生自其他实体的实体;尝试将样式
msgid "Style name cannot be empty" msgid "Style name cannot be empty"
msgstr "样式名称不能为空" msgstr "样式名称不能为空"
#: textscreens.cpp:785 #: textscreens.cpp:791
msgid "Can't repeat fewer than 1 time." msgid "Can't repeat fewer than 1 time."
msgstr "不能重复少于 1 次。" msgstr "不能重复少于 1 次。"
#: textscreens.cpp:789 #: textscreens.cpp:795
msgid "Can't repeat more than 999 times." msgid "Can't repeat more than 999 times."
msgstr "重复不超过 999 次。" msgstr "重复不超过 999 次。"
#: textscreens.cpp:814 #: textscreens.cpp:820
msgid "Group name cannot be empty" msgid "Group name cannot be empty"
msgstr "组名称不能为空" msgstr "组名称不能为空"
#: textscreens.cpp:866 #: textscreens.cpp:872
msgid "Opacity must be between zero and one." msgid "Opacity must be between zero and one."
msgstr "不透明度必须在零和 1 之间。" msgstr "不透明度必须在零和 1 之间。"
#: textscreens.cpp:901 #: textscreens.cpp:907
msgid "Radius cannot be zero or negative." msgid "Radius cannot be zero or negative."
msgstr "半径偏移不能为负数。" msgstr "半径偏移不能为负数。"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: SolveSpace 3.0\n" "Project-Id-Version: SolveSpace 3.0\n"
"Report-Msgid-Bugs-To: whitequark@whitequark.org\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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -32,7 +32,7 @@ msgstr ""
msgid "Number of copies to paste must be at least one." msgid "Number of copies to paste must be at least one."
msgstr "" msgstr ""
#: clipboard.cpp:389 textscreens.cpp:827 #: clipboard.cpp:389 textscreens.cpp:833
msgid "Scale cannot be zero." msgid "Scale cannot be zero."
msgstr "" msgstr ""
@ -56,37 +56,37 @@ msgstr ""
msgid "No workplane active." msgid "No workplane active."
msgstr "" msgstr ""
#: confscreen.cpp:376 #: confscreen.cpp:381
msgid "Bad format: specify coordinates as x, y, z" msgid "Bad format: specify coordinates as x, y, z"
msgstr "" 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" msgid "Bad format: specify color as r, g, b"
msgstr "" msgstr ""
#: confscreen.cpp:412 #: confscreen.cpp:417
msgid "" msgid ""
"The perspective factor will have no effect until you enable View -> Use Perspective Projection." "The perspective factor will have no effect until you enable View -> Use Perspective Projection."
msgstr "" msgstr ""
#: confscreen.cpp:430 confscreen.cpp:440 #: confscreen.cpp:435 confscreen.cpp:445
#, c-format #, c-format
msgid "Specify between 0 and %d digits after the decimal." msgid "Specify between 0 and %d digits after the decimal."
msgstr "" msgstr ""
#: confscreen.cpp:452 #: confscreen.cpp:457
msgid "Export scale must not be zero!" msgid "Export scale must not be zero!"
msgstr "" msgstr ""
#: confscreen.cpp:464 #: confscreen.cpp:469
msgid "Cutter radius offset must not be negative!" msgid "Cutter radius offset must not be negative!"
msgstr "" msgstr ""
#: confscreen.cpp:518 #: confscreen.cpp:528
msgid "Bad value: autosave interval should be positive" msgid "Bad value: autosave interval should be positive"
msgstr "" msgstr ""
#: confscreen.cpp:521 #: confscreen.cpp:531
msgid "Bad format: specify interval in integral minutes" msgid "Bad format: specify interval in integral minutes"
msgstr "" msgstr ""
@ -538,7 +538,7 @@ msgctxt "button"
msgid "&No" msgid "&No"
msgstr "" msgstr ""
#: file.cpp:877 solvespace.cpp:610 #: file.cpp:877 solvespace.cpp:611
msgctxt "button" msgctxt "button"
msgid "&Cancel" msgid "&Cancel"
msgstr "" msgstr ""
@ -991,24 +991,28 @@ msgstr ""
msgid "&Website / Manual" msgid "&Website / Manual"
msgstr "" msgstr ""
#: graphicswin.cpp:187 #: graphicswin.cpp:186
msgid "&Go to GitHub commit"
msgstr ""
#: graphicswin.cpp:188
msgid "&About" msgid "&About"
msgstr "" msgstr ""
#: graphicswin.cpp:361 #: graphicswin.cpp:362
msgid "(no recent files)" msgid "(no recent files)"
msgstr "" msgstr ""
#: graphicswin.cpp:369 #: graphicswin.cpp:370
#, c-format #, c-format
msgid "File '%s' does not exist." msgid "File '%s' does not exist."
msgstr "" msgstr ""
#: graphicswin.cpp:736 #: graphicswin.cpp:737
msgid "No workplane is active, so the grid will not appear." msgid "No workplane is active, so the grid will not appear."
msgstr "" msgstr ""
#: graphicswin.cpp:751 #: graphicswin.cpp:752
msgid "" msgid ""
"The perspective factor is set to zero, so the view will always be a parallel projection.\n" "The perspective factor is set to zero, so the view will always be a parallel projection.\n"
"\n" "\n"
@ -1016,89 +1020,89 @@ msgid ""
"around 0.3 is typical." "around 0.3 is typical."
msgstr "" msgstr ""
#: graphicswin.cpp:836 #: graphicswin.cpp:837
msgid "Select a point; this point will become the center of the view on screen." msgid "Select a point; this point will become the center of the view on screen."
msgstr "" msgstr ""
#: graphicswin.cpp:1136 #: graphicswin.cpp:1137
msgid "No additional entities share endpoints with the selected entities." msgid "No additional entities share endpoints with the selected entities."
msgstr "" msgstr ""
#: graphicswin.cpp:1154 #: graphicswin.cpp:1155
msgid "" msgid ""
"To use this command, select a point or other entity from an linked part, or make a link group the " "To use this command, select a point or other entity from an linked part, or make a link group the "
"active group." "active group."
msgstr "" msgstr ""
#: graphicswin.cpp:1177 #: graphicswin.cpp:1178
msgid "" msgid ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) to define the plane " "No workplane is active. Activate a workplane (with Sketch -> In Workplane) to define the plane "
"for the snap grid." "for the snap grid."
msgstr "" msgstr ""
#: graphicswin.cpp:1184 #: graphicswin.cpp:1185
msgid "" msgid ""
"Can't snap these items to grid; select points, text comments, or constraints with a label. To " "Can't snap these items to grid; select points, text comments, or constraints with a label. To "
"snap a line, select its endpoints." "snap a line, select its endpoints."
msgstr "" msgstr ""
#: graphicswin.cpp:1269 #: graphicswin.cpp:1270
msgid "No workplane selected. Activating default workplane for this group." msgid "No workplane selected. Activating default workplane for this group."
msgstr "" msgstr ""
#: graphicswin.cpp:1272 #: graphicswin.cpp:1273
msgid "" msgid ""
"No workplane is selected, and the active group does not have a default workplane. Try selecting a " "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." "workplane, or activating a sketch-in-new-workplane group."
msgstr "" msgstr ""
#: graphicswin.cpp:1293 #: graphicswin.cpp:1294
msgid "" msgid ""
"Bad selection for tangent arc at point. Select a single point, or select nothing to set up arc " "Bad selection for tangent arc at point. Select a single point, or select nothing to set up arc "
"parameters." "parameters."
msgstr "" msgstr ""
#: graphicswin.cpp:1304 #: graphicswin.cpp:1305
msgid "click point on arc (draws anti-clockwise)" msgid "click point on arc (draws anti-clockwise)"
msgstr "" msgstr ""
#: graphicswin.cpp:1305 #: graphicswin.cpp:1306
msgid "click to place datum point" msgid "click to place datum point"
msgstr "" msgstr ""
#: graphicswin.cpp:1306 #: graphicswin.cpp:1307
msgid "click first point of line segment" msgid "click first point of line segment"
msgstr "" msgstr ""
#: graphicswin.cpp:1308 #: graphicswin.cpp:1309
msgid "click first point of construction line segment" msgid "click first point of construction line segment"
msgstr "" msgstr ""
#: graphicswin.cpp:1309 #: graphicswin.cpp:1310
msgid "click first point of cubic segment" msgid "click first point of cubic segment"
msgstr "" msgstr ""
#: graphicswin.cpp:1310 #: graphicswin.cpp:1311
msgid "click center of circle" msgid "click center of circle"
msgstr "" msgstr ""
#: graphicswin.cpp:1311 #: graphicswin.cpp:1312
msgid "click origin of workplane" msgid "click origin of workplane"
msgstr "" msgstr ""
#: graphicswin.cpp:1312 #: graphicswin.cpp:1313
msgid "click one corner of rectangle" msgid "click one corner of rectangle"
msgstr "" msgstr ""
#: graphicswin.cpp:1313 #: graphicswin.cpp:1314
msgid "click top left of text" msgid "click top left of text"
msgstr "" msgstr ""
#: graphicswin.cpp:1319 #: graphicswin.cpp:1320
msgid "click top left of image" msgid "click top left of image"
msgstr "" msgstr ""
#: graphicswin.cpp:1345 #: graphicswin.cpp:1346
msgid "No entities are selected. Select entities before trying to toggle their construction state." msgid "No entities are selected. Select entities before trying to toggle their construction state."
msgstr "" msgstr ""
@ -1221,6 +1225,10 @@ msgstr ""
msgid "zero-length edge!" msgid "zero-length edge!"
msgstr "" msgstr ""
#: importmesh.cpp:136
msgid "Text-formated STL files are not currently supported"
msgstr ""
#: modify.cpp:252 #: modify.cpp:252
msgid "Must be sketching in workplane to create tangent arc." msgid "Must be sketching in workplane to create tangent arc."
msgstr "" msgstr ""
@ -1391,7 +1399,7 @@ msgstr ""
msgid "Can't draw image in 3d; first, activate a workplane with Sketch -> In Workplane." msgid "Can't draw image in 3d; first, activate a workplane with Sketch -> In Workplane."
msgstr "" 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" msgctxt "file-type"
msgid "SolveSpace models" msgid "SolveSpace models"
msgstr "" msgstr ""
@ -1486,127 +1494,127 @@ msgctxt "file-type"
msgid "Comma-separated values" msgid "Comma-separated values"
msgstr "" 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" msgid "untitled"
msgstr "" 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 #: platform/guiwin.cpp:1639
msgctxt "title" msgctxt "title"
msgid "Save File" msgid "Save File"
msgstr "" 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 #: platform/guiwin.cpp:1645
msgctxt "title" msgctxt "title"
msgid "Open File" msgid "Open File"
msgstr "" msgstr ""
#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 #: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433
msgctxt "button" msgctxt "button"
msgid "_Cancel" msgid "_Cancel"
msgstr "" msgstr ""
#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 #: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431
msgctxt "button" msgctxt "button"
msgid "_Save" msgid "_Save"
msgstr "" msgstr ""
#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 #: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432
msgctxt "button" msgctxt "button"
msgid "_Open" msgid "_Open"
msgstr "" msgstr ""
#: solvespace.cpp:170 #: solvespace.cpp:171
msgctxt "title" msgctxt "title"
msgid "Autosave Available" msgid "Autosave Available"
msgstr "" msgstr ""
#: solvespace.cpp:171 #: solvespace.cpp:172
msgctxt "dialog" msgctxt "dialog"
msgid "An autosave file is available for this sketch." msgid "An autosave file is available for this sketch."
msgstr "" msgstr ""
#: solvespace.cpp:172 #: solvespace.cpp:173
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to load the autosave file instead?" msgid "Do you want to load the autosave file instead?"
msgstr "" msgstr ""
#: solvespace.cpp:173 #: solvespace.cpp:174
msgctxt "button" msgctxt "button"
msgid "&Load autosave" msgid "&Load autosave"
msgstr "" msgstr ""
#: solvespace.cpp:175 #: solvespace.cpp:176
msgctxt "button" msgctxt "button"
msgid "Do&n't Load" msgid "Do&n't Load"
msgstr "" msgstr ""
#: solvespace.cpp:598 #: solvespace.cpp:599
msgctxt "title" msgctxt "title"
msgid "Modified File" msgid "Modified File"
msgstr "" msgstr ""
#: solvespace.cpp:600 #: solvespace.cpp:601
#, c-format #, c-format
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to save the changes you made to the sketch “%s”?" msgid "Do you want to save the changes you made to the sketch “%s”?"
msgstr "" msgstr ""
#: solvespace.cpp:603 #: solvespace.cpp:604
msgctxt "dialog" msgctxt "dialog"
msgid "Do you want to save the changes you made to the new sketch?" msgid "Do you want to save the changes you made to the new sketch?"
msgstr "" msgstr ""
#: solvespace.cpp:606 #: solvespace.cpp:607
msgctxt "dialog" msgctxt "dialog"
msgid "Your changes will be lost if you don't save them." msgid "Your changes will be lost if you don't save them."
msgstr "" msgstr ""
#: solvespace.cpp:607 #: solvespace.cpp:608
msgctxt "button" msgctxt "button"
msgid "&Save" msgid "&Save"
msgstr "" msgstr ""
#: solvespace.cpp:609 #: solvespace.cpp:610
msgctxt "button" msgctxt "button"
msgid "Do&n't Save" msgid "Do&n't Save"
msgstr "" msgstr ""
#: solvespace.cpp:630 #: solvespace.cpp:631
msgctxt "title" msgctxt "title"
msgid "(new sketch)" msgid "(new sketch)"
msgstr "" msgstr ""
#: solvespace.cpp:637 #: solvespace.cpp:638
msgctxt "title" msgctxt "title"
msgid "Property Browser" msgid "Property Browser"
msgstr "" msgstr ""
#: solvespace.cpp:699 #: solvespace.cpp:700
msgid "" msgid ""
"Constraints are currently shown, and will be exported in the toolpath. This is probably not what " "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." "you want; hide them by clicking the link at the top of the text window."
msgstr "" msgstr ""
#: solvespace.cpp:771 #: solvespace.cpp:772
#, c-format #, c-format
msgid "Can't identify file type from file extension of filename '%s'; try .dxf or .dwg." msgid "Can't identify file type from file extension of filename '%s'; try .dxf or .dwg."
msgstr "" msgstr ""
#: solvespace.cpp:823 #: solvespace.cpp:824
msgid "Constraint must have a label, and must not be a reference dimension." msgid "Constraint must have a label, and must not be a reference dimension."
msgstr "" msgstr ""
#: solvespace.cpp:827 #: solvespace.cpp:828
msgid "Bad selection for step dimension; select a constraint." msgid "Bad selection for step dimension; select a constraint."
msgstr "" msgstr ""
#: solvespace.cpp:851 #: solvespace.cpp:852
msgid "The assembly does not interfere, good." msgid "The assembly does not interfere, good."
msgstr "" msgstr ""
#: solvespace.cpp:867 #: solvespace.cpp:868
#, c-format #, c-format
msgid "" msgid ""
"The volume of the solid model is:\n" "The volume of the solid model is:\n"
@ -1614,7 +1622,7 @@ msgid ""
" %s" " %s"
msgstr "" msgstr ""
#: solvespace.cpp:876 #: solvespace.cpp:877
#, c-format #, c-format
msgid "" msgid ""
"\n" "\n"
@ -1623,7 +1631,7 @@ msgid ""
" %s" " %s"
msgstr "" msgstr ""
#: solvespace.cpp:881 #: solvespace.cpp:882
msgid "" msgid ""
"\n" "\n"
"\n" "\n"
@ -1631,7 +1639,7 @@ msgid ""
"This introduces error, typically of around 1%." "This introduces error, typically of around 1%."
msgstr "" msgstr ""
#: solvespace.cpp:896 #: solvespace.cpp:897
#, c-format #, c-format
msgid "" msgid ""
"The surface area of the selected faces is:\n" "The surface area of the selected faces is:\n"
@ -1642,13 +1650,13 @@ msgid ""
"This introduces error, typically of around 1%%." "This introduces error, typically of around 1%%."
msgstr "" msgstr ""
#: solvespace.cpp:905 #: solvespace.cpp:906
msgid "" msgid ""
"This group does not contain a correctly-formed 2d closed area. It is open, not coplanar, or self-" "This group does not contain a correctly-formed 2d closed area. It is open, not coplanar, or self-"
"intersecting." "intersecting."
msgstr "" msgstr ""
#: solvespace.cpp:917 #: solvespace.cpp:918
#, c-format #, c-format
msgid "" msgid ""
"The area of the region sketched in this group is:\n" "The area of the region sketched in this group is:\n"
@ -1659,7 +1667,7 @@ msgid ""
"This introduces error, typically of around 1%%." "This introduces error, typically of around 1%%."
msgstr "" msgstr ""
#: solvespace.cpp:937 #: solvespace.cpp:938
#, c-format #, c-format
msgid "" msgid ""
"The total length of the selected entities is:\n" "The total length of the selected entities is:\n"
@ -1670,36 +1678,36 @@ msgid ""
"This introduces error, typically of around 1%%." "This introduces error, typically of around 1%%."
msgstr "" msgstr ""
#: solvespace.cpp:943 #: solvespace.cpp:944
msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgid "Bad selection for perimeter; select line segments, arcs, and curves."
msgstr "" msgstr ""
#: solvespace.cpp:959 #: solvespace.cpp:960
msgid "Bad selection for trace; select a single point." msgid "Bad selection for trace; select a single point."
msgstr "" msgstr ""
#: solvespace.cpp:986 #: solvespace.cpp:987
#, c-format #, c-format
msgid "Couldn't write to '%s'" msgid "Couldn't write to '%s'"
msgstr "" msgstr ""
#: solvespace.cpp:1016 #: solvespace.cpp:1017
msgid "The mesh is self-intersecting (NOT okay, invalid)." msgid "The mesh is self-intersecting (NOT okay, invalid)."
msgstr "" msgstr ""
#: solvespace.cpp:1017 #: solvespace.cpp:1018
msgid "The mesh is not self-intersecting (okay, valid)." msgid "The mesh is not self-intersecting (okay, valid)."
msgstr "" msgstr ""
#: solvespace.cpp:1019 #: solvespace.cpp:1020
msgid "The mesh has naked edges (NOT okay, invalid)." msgid "The mesh has naked edges (NOT okay, invalid)."
msgstr "" msgstr ""
#: solvespace.cpp:1020 #: solvespace.cpp:1021
msgid "The mesh is watertight (okay, valid)." msgid "The mesh is watertight (okay, valid)."
msgstr "" msgstr ""
#: solvespace.cpp:1023 #: solvespace.cpp:1024
#, c-format #, c-format
msgid "" msgid ""
"\n" "\n"
@ -1707,7 +1715,7 @@ msgid ""
"The model contains %d triangles, from %d surfaces." "The model contains %d triangles, from %d surfaces."
msgstr "" msgstr ""
#: solvespace.cpp:1027 #: solvespace.cpp:1028
#, c-format #, c-format
msgid "" msgid ""
"%s\n" "%s\n"
@ -1717,7 +1725,7 @@ msgid ""
"Zero problematic edges, good.%s" "Zero problematic edges, good.%s"
msgstr "" msgstr ""
#: solvespace.cpp:1030 #: solvespace.cpp:1031
#, c-format #, c-format
msgid "" msgid ""
"%s\n" "%s\n"
@ -1727,7 +1735,7 @@ msgid ""
"%d problematic edges, bad.%s" "%d problematic edges, bad.%s"
msgstr "" msgstr ""
#: solvespace.cpp:1043 #: solvespace.cpp:1044
#, c-format #, c-format
msgid "" msgid ""
"This is SolveSpace version %s.\n" "This is SolveSpace version %s.\n"
@ -1754,23 +1762,23 @@ msgstr ""
msgid "Style name cannot be empty" msgid "Style name cannot be empty"
msgstr "" msgstr ""
#: textscreens.cpp:785 #: textscreens.cpp:791
msgid "Can't repeat fewer than 1 time." msgid "Can't repeat fewer than 1 time."
msgstr "" msgstr ""
#: textscreens.cpp:789 #: textscreens.cpp:795
msgid "Can't repeat more than 999 times." msgid "Can't repeat more than 999 times."
msgstr "" msgstr ""
#: textscreens.cpp:814 #: textscreens.cpp:820
msgid "Group name cannot be empty" msgid "Group name cannot be empty"
msgstr "" msgstr ""
#: textscreens.cpp:866 #: textscreens.cpp:872
msgid "Opacity must be between zero and one." msgid "Opacity must be between zero and one."
msgstr "" msgstr ""
#: textscreens.cpp:901 #: textscreens.cpp:907
msgid "Radius cannot be zero or negative." msgid "Radius cannot be zero or negative."
msgstr "" msgstr ""

View File

@ -1,6 +1,6 @@
1 VERSIONINFO 1 VERSIONINFO
FILEVERSION ${solvespace_VERSION_MAJOR},${solvespace_VERSION_MINOR},0,0 FILEVERSION ${PROJECT_VERSION_MAJOR},${PROJECT_VERSION_MINOR},0,0
PRODUCTVERSION ${solvespace_VERSION_MAJOR},${solvespace_VERSION_MINOR},0,0 PRODUCTVERSION ${PROJECT_VERSION_MAJOR},${PROJECT_VERSION_MINOR},0,0
FILEFLAGSMASK 0 FILEFLAGSMASK 0
FILEFLAGS 0 FILEFLAGS 0
FILEOS VOS_NT_WINDOWS32 FILEOS VOS_NT_WINDOWS32
@ -13,12 +13,12 @@ BEGIN
BEGIN BEGIN
VALUE "CompanyName", "The SolveSpace authors" VALUE "CompanyName", "The SolveSpace authors"
VALUE "ProductName", "SolveSpace" 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 "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 "OriginalFilename", "solvespace.exe"
VALUE "InternalName", "solvespace" 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
END END

View File

@ -19,32 +19,63 @@ endif()
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
${CMAKE_CURRENT_BINARY_DIR}/config.h) ${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 # platform utilities
if(APPLE) if(APPLE)
set(util_LIBRARIES target_link_libraries(slvs_deps INTERFACE
${APPKIT_LIBRARY}) ${APPKIT_LIBRARY})
endif() endif()
# libslvs # libslvs
add_library(slvs SHARED
set(libslvs_SOURCES solvespace.h
platform/platform.h
util.cpp util.cpp
entity.cpp entity.cpp
expr.cpp expr.cpp
constraint.cpp constraint.cpp
constrainteq.cpp constrainteq.cpp
system.cpp system.cpp
platform/platform.cpp) platform/platform.cpp
set(libslvs_HEADERS
solvespace.h
platform/platform.h)
add_library(slvs SHARED
${libslvs_SOURCES}
${libslvs_HEADERS}
${util_SOURCES}
lib.cpp) lib.cpp)
target_compile_definitions(slvs target_compile_definitions(slvs
@ -53,16 +84,11 @@ target_compile_definitions(slvs
target_include_directories(slvs target_include_directories(slvs
PUBLIC ${CMAKE_SOURCE_DIR}/include) PUBLIC ${CMAKE_SOURCE_DIR}/include)
target_link_libraries(slvs target_link_libraries(slvs PRIVATE slvs_deps)
${util_LIBRARIES}
mimalloc-static)
add_dependencies(slvs
mimalloc-static)
set_target_properties(slvs PROPERTIES set_target_properties(slvs PROPERTIES
PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/slvs.h PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/slvs.h
VERSION ${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR} VERSION ${PROJECT_VERSION}
SOVERSION 1) SOVERSION 1)
if(NOT WIN32) if(NOT WIN32)
@ -72,70 +98,6 @@ if(NOT WIN32)
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
endif() 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 set(every_platform_SOURCES
platform/guiwin.cpp platform/guiwin.cpp
platform/guigtk.cpp platform/guigtk.cpp
@ -143,7 +105,10 @@ set(every_platform_SOURCES
# solvespace library # solvespace library
set(solvespace_core_HEADERS set(solvespace_core_gl_SOURCES
solvespace.cpp)
add_library(solvespace-core STATIC
dsc.h dsc.h
expr.h expr.h
polygon.h polygon.h
@ -153,9 +118,7 @@ set(solvespace_core_HEADERS
platform/platform.h platform/platform.h
render/render.h render/render.h
render/gl3shader.h render/gl3shader.h
srf/surface.h) srf/surface.h
set(solvespace_core_SOURCES
bsp.cpp bsp.cpp
clipboard.cpp clipboard.cpp
confscreen.cpp confscreen.cpp
@ -207,40 +170,14 @@ set(solvespace_core_SOURCES
srf/surfinter.cpp srf/surfinter.cpp
srf/triangulate.cpp) srf/triangulate.cpp)
set(solvespace_core_gl_SOURCES target_link_libraries(solvespace-core PUBLIC slvs_deps)
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})
# solvespace translations # solvespace translations
if(HAVE_GETTEXT) if(HAVE_GETTEXT)
get_target_property(solvespace_core_SOURCES solvespace-core SOURCES)
set(inputs set(inputs
${solvespace_core_SOURCES} ${solvespace_core_SOURCES}
${solvespace_core_HEADERS}
${every_platform_SOURCES} ${every_platform_SOURCES}
${solvespace_core_gl_SOURCES}) ${solvespace_core_gl_SOURCES})
@ -267,7 +204,7 @@ if(HAVE_GETTEXT)
--keyword --keyword=_ --keyword=N_ --keyword=C_:2,1c --keyword=CN_:2,1c --keyword --keyword=_ --keyword=N_ --keyword=C_:2,1c --keyword=CN_:2,1c
--force-po --width=100 --sort-by-file --force-po --width=100 --sort-by-file
--package-name=SolveSpace --package-name=SolveSpace
--package-version=${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR} --package-version=${PROJECT_VERSION}
"--copyright-holder=the PACKAGE authors" "--copyright-holder=the PACKAGE authors"
--msgid-bugs-address=whitequark@whitequark.org --msgid-bugs-address=whitequark@whitequark.org
--from-code=utf-8 --output=${gen_output_pot} ${inputs} --from-code=utf-8 --output=${gen_output_pot} ${inputs}
@ -323,52 +260,86 @@ endif()
if(ENABLE_GUI) if(ENABLE_GUI)
add_executable(solvespace WIN32 MACOSX_BUNDLE add_executable(solvespace WIN32 MACOSX_BUNDLE
${solvespace_core_gl_SOURCES} ${solvespace_core_gl_SOURCES}
${platform_SOURCES} platform/entrygui.cpp
$<TARGET_PROPERTY:resources,EXTRA_SOURCES>) $<TARGET_PROPERTY:resources,EXTRA_SOURCES>)
add_dependencies(solvespace add_dependencies(solvespace
resources) resources)
target_link_libraries(solvespace target_link_libraries(solvespace
PRIVATE
solvespace-core solvespace-core
${OPENGL_LIBRARIES} ${OPENGL_LIBRARIES})
${platform_LIBRARIES}
${COVERAGE_LIBRARY})
if(MSVC) # OpenGL version
set_target_properties(solvespace PROPERTIES if(OPENGL STREQUAL 3)
LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /INCREMENTAL:NO /OPT:REF") 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) 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 set_target_properties(solvespace PROPERTIES
OUTPUT_NAME SolveSpace OUTPUT_NAME SolveSpace
XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME "YES" XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME "YES"
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.solvespace" XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.solvespace"
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") 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()
endif() endif()
# solvespace headless library # solvespace headless library
set(headless_SOURCES add_library(solvespace-headless STATIC EXCLUDE_FROM_ALL
${solvespace_core_gl_SOURCES}
platform/guinone.cpp platform/guinone.cpp
render/rendercairo.cpp) render/rendercairo.cpp)
add_library(solvespace-headless STATIC EXCLUDE_FROM_ALL
${solvespace_core_gl_SOURCES}
${headless_SOURCES})
target_compile_definitions(solvespace-headless target_compile_definitions(solvespace-headless
PRIVATE -DHEADLESS) PRIVATE HEADLESS)
target_include_directories(solvespace-headless target_include_directories(solvespace-headless
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(solvespace-headless target_link_libraries(solvespace-headless
solvespace-core PRIVATE
${CAIRO_LIBRARIES}) solvespace-core)
target_compile_options(solvespace-headless
PRIVATE ${COVERAGE_FLAGS})
# solvespace command-line executable # solvespace command-line executable
@ -432,4 +403,4 @@ if(APPLE)
COMMENT "Bundling executable solvespace-cli" COMMENT "Bundling executable solvespace-cli"
VERBATIM) VERBATIM)
endif() endif()
endif() endif()

View File

@ -1,7 +1,8 @@
#ifndef SOLVESPACE_CONFIG_H #ifndef SOLVESPACE_CONFIG_H
#define 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 */ /* Non-OS X *nix only */
#define UNIX_DATADIR "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_DATAROOTDIR@/solvespace" #define UNIX_DATADIR "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_DATAROOTDIR@/solvespace"

View File

@ -69,12 +69,19 @@ void TextWindow::DescribeSelection() {
Entity *e = SK.GetEntity(gs.points == 1 ? gs.point[0] : gs.entity[0]); Entity *e = SK.GetEntity(gs.points == 1 ? gs.point[0] : gs.entity[0]);
Vector p; Vector p;
#define COSTR(p) \ #define COSTR_NO_LINK(p) \
SS.MmToString((p).x).c_str(), \ SS.MmToString((p).x).c_str(), \
SS.MmToString((p).y).c_str(), \ SS.MmToString((p).y).c_str(), \
SS.MmToString((p).z).c_str() SS.MmToString((p).z).c_str()
#define PT_AS_STR "(%Fi%s%E, %Fi%s%E, %Fi%s%E)" #define PT_AS_STR_NO_LINK "(%Fi%s%Fd, %Fi%s%Fd, %Fi%s%Fd)"
#define PT_AS_NUM "(%Fi%3%E, %Fi%3%E, %Fi%3%E)" #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) { switch(e->type) {
case Entity::Type::POINT_IN_3D: case Entity::Type::POINT_IN_3D:
case Entity::Type::POINT_IN_2D: case Entity::Type::POINT_IN_2D:
@ -83,7 +90,7 @@ void TextWindow::DescribeSelection() {
case Entity::Type::POINT_N_COPY: case Entity::Type::POINT_N_COPY:
case Entity::Type::POINT_N_ROT_AA: case Entity::Type::POINT_N_ROT_AA:
p = e->PointGetNum(); 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; break;
case Entity::Type::NORMAL_IN_3D: case Entity::Type::NORMAL_IN_3D:
@ -104,20 +111,20 @@ void TextWindow::DescribeSelection() {
case Entity::Type::WORKPLANE: { case Entity::Type::WORKPLANE: {
p = SK.GetEntity(e->point[0])->PointGetNum(); p = SK.GetEntity(e->point[0])->PointGetNum();
Printf(false, "%FtWORKPLANE%E"); 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(); Quaternion q = e->Normal()->NormalGetNum();
p = q.RotationN(); p = q.RotationN();
Printf(true, " normal = " PT_AS_NUM, CO(p)); Printf(true, " normal = " PT_AS_NUM_LINK, CO_LINK(e->Normal(), p));
break; break;
} }
case Entity::Type::LINE_SEGMENT: { case Entity::Type::LINE_SEGMENT: {
Vector p0 = SK.GetEntity(e->point[0])->PointGetNum(); Vector p0 = SK.GetEntity(e->point[0])->PointGetNum();
p = p0; p = p0;
Printf(false, "%FtLINE SEGMENT%E"); 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(); Vector p1 = SK.GetEntity(e->point[1])->PointGetNum();
p = p1; 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", Printf(true, " len = %Fi%s%E",
SS.MmToString((p1.Minus(p0).Magnitude())).c_str()); SS.MmToString((p1.Minus(p0).Magnitude())).c_str());
break; break;
@ -137,18 +144,18 @@ void TextWindow::DescribeSelection() {
} }
for(int i = 0; i < pts; i++) { for(int i = 0; i < pts; i++) {
p = SK.GetEntity(e->point[i])->PointGetNum(); 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; break;
case Entity::Type::ARC_OF_CIRCLE: { case Entity::Type::ARC_OF_CIRCLE: {
Printf(false, "%FtARC OF A CIRCLE%E"); Printf(false, "%FtARC OF A CIRCLE%E");
p = SK.GetEntity(e->point[0])->PointGetNum(); 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(); 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(); 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(); double r = e->CircleGetRadiusNum();
Printf(true, " diameter = %Fi%s", SS.MmToString(r*2).c_str()); Printf(true, " diameter = %Fi%s", SS.MmToString(r*2).c_str());
Printf(false, " radius = %Fi%s", SS.MmToString(r).c_str()); Printf(false, " radius = %Fi%s", SS.MmToString(r).c_str());
@ -160,7 +167,7 @@ void TextWindow::DescribeSelection() {
case Entity::Type::CIRCLE: { case Entity::Type::CIRCLE: {
Printf(false, "%FtCIRCLE%E"); Printf(false, "%FtCIRCLE%E");
p = SK.GetEntity(e->point[0])->PointGetNum(); 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(); double r = e->CircleGetRadiusNum();
Printf(true, " diameter = %Fi%s", SS.MmToString(r*2).c_str()); Printf(true, " diameter = %Fi%s", SS.MmToString(r*2).c_str());
Printf(false, " radius = %Fi%s", SS.MmToString(r).c_str()); Printf(false, " radius = %Fi%s", SS.MmToString(r).c_str());
@ -175,7 +182,7 @@ void TextWindow::DescribeSelection() {
p = e->FaceGetNormalNum(); p = e->FaceGetNormalNum();
Printf(true, " normal = " PT_AS_NUM, CO(p)); Printf(true, " normal = " PT_AS_NUM, CO(p));
p = e->FaceGetPointNum(); p = e->FaceGetPointNum();
Printf(false, " thru = " PT_AS_STR, COSTR(p)); Printf(false, " thru = " PT_AS_STR, COSTR(e, p));
break; break;
case Entity::Type::TTF_TEXT: { case Entity::Type::TTF_TEXT: {
@ -315,12 +322,12 @@ void TextWindow::DescribeSelection() {
} else if(gs.n == 2 && gs.points == 2) { } else if(gs.n == 2 && gs.points == 2) {
Printf(false, "%FtTWO POINTS"); Printf(false, "%FtTWO POINTS");
Vector p0 = SK.GetEntity(gs.point[0])->PointGetNum(); 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(); 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); Vector dv = p1.Minus(p0);
Printf(true, " d = %Fi%s", SS.MmToString(dv.Magnitude()).c_str()); 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) { } else if(gs.n == 2 && gs.points == 1 && gs.circlesOrArcs == 1) {
Entity *ec = SK.GetEntity(gs.entity[0]); Entity *ec = SK.GetEntity(gs.entity[0]);
if(ec->type == Entity::Type::CIRCLE) { if(ec->type == Entity::Type::CIRCLE) {
@ -329,9 +336,9 @@ void TextWindow::DescribeSelection() {
Printf(false, "%FtPOINT AND AN ARC"); Printf(false, "%FtPOINT AND AN ARC");
} else ssassert(false, "Unexpected entity type"); } else ssassert(false, "Unexpected entity type");
Vector p = SK.GetEntity(gs.point[0])->PointGetNum(); 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(); 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(); double r = ec->CircleGetRadiusNum();
Printf(false, " diameter = %Fi%s", SS.MmToString(r*2).c_str()); Printf(false, " diameter = %Fi%s", SS.MmToString(r*2).c_str());
Printf(false, " radius = %Fi%s", SS.MmToString(r).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) { } else if(gs.n == 2 && gs.faces == 1 && gs.points == 1) {
Printf(false, "%FtA POINT AND A PLANE FACE"); Printf(false, "%FtA POINT AND A PLANE FACE");
Vector pt = SK.GetEntity(gs.point[0])->PointGetNum(); 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(); Vector n = SK.GetEntity(gs.face[0])->FaceGetNormalNum();
Printf(true, " plane normal = " PT_AS_NUM, CO(n)); Printf(true, " plane normal = " PT_AS_NUM, CO(n));
Vector pl = SK.GetEntity(gs.face[0])->FaceGetPointNum(); 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); double dd = n.Dot(pl) - n.Dot(pt);
Printf(true, " distance = %Fi%s", SS.MmToString(dd).c_str()); Printf(true, " distance = %Fi%s", SS.MmToString(dd).c_str());
} else if(gs.n == 3 && gs.points == 2 && gs.vectors == 1) { } else if(gs.n == 3 && gs.points == 2 && gs.vectors == 1) {
Printf(false, "%FtTWO POINTS AND A VECTOR"); Printf(false, "%FtTWO POINTS AND A VECTOR");
Vector p0 = SK.GetEntity(gs.point[0])->PointGetNum(); 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(); 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(); Vector v = SK.GetEntity(gs.vector[0])->VectorGetNum();
v = v.WithMagnitude(1); 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); double d = (p1.Minus(p0)).Dot(v);
Printf(true, " proj_d = %Fi%s", SS.MmToString(d).c_str()); Printf(true, " proj_d = %Fi%s", SS.MmToString(d).c_str());
} else if(gs.n == 2 && gs.lineSegments == 1 && gs.points == 1) { } 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(), Vector lp0 = SK.GetEntity(ln->point[0])->PointGetNum(),
lp1 = SK.GetEntity(ln->point[1])->PointGetNum(); lp1 = SK.GetEntity(ln->point[1])->PointGetNum();
Printf(false, "%FtLINE SEGMENT AND POINT%E"); Printf(false, "%FtLINE SEGMENT AND POINT%E");
Printf(true, " ln thru " PT_AS_STR, COSTR(lp0)); Printf(true, " ln thru " PT_AS_STR, COSTR(SK.GetEntity(ln->point[0]), lp0));
Printf(false, " " PT_AS_STR, COSTR(lp1)); Printf(false, " " PT_AS_STR, COSTR(SK.GetEntity(ln->point[1]), lp1));
Entity *p = SK.GetEntity(gs.point[0]); Entity *p = SK.GetEntity(gs.point[0]);
Vector pp = p->PointGetNum(); 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", Printf(true, " pt-ln distance = %Fi%s%E",
SS.MmToString(pp.DistanceToLine(lp0, lp1.Minus(lp0))).c_str()); SS.MmToString(pp.DistanceToLine(lp0, lp1.Minus(lp0))).c_str());
hEntity wrkpl = SS.GW.ActiveWorkplane(); hEntity wrkpl = SS.GW.ActiveWorkplane();
@ -386,8 +393,8 @@ void TextWindow::DescribeSelection() {
v0 = v0.WithMagnitude(1); v0 = v0.WithMagnitude(1);
v1 = v1.WithMagnitude(1); v1 = v1.WithMagnitude(1);
Printf(true, " vectorA = " PT_AS_NUM, CO(v0)); Printf(true, " vectorA = " PT_AS_NUM_LINK, CO_LINK(SK.GetEntity(gs.entity[0]), v0));
Printf(false, " vectorB = " PT_AS_NUM, CO(v1)); Printf(false, " vectorB = " PT_AS_NUM_LINK, CO_LINK(SK.GetEntity(gs.entity[1]), v1));
double theta = acos(v0.Dot(v1)); double theta = acos(v0.Dot(v1));
Printf(true, " angle = %Fi%2%E degrees", theta*180/PI); 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(); Vector n0 = SK.GetEntity(gs.face[0])->FaceGetNormalNum();
Printf(true, " planeA normal = " PT_AS_NUM, CO(n0)); Printf(true, " planeA normal = " PT_AS_NUM, CO(n0));
Vector p0 = SK.GetEntity(gs.face[0])->FaceGetPointNum(); 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(); Vector n1 = SK.GetEntity(gs.face[1])->FaceGetNormalNum();
Printf(true, " planeB normal = " PT_AS_NUM, CO(n1)); Printf(true, " planeB normal = " PT_AS_NUM, CO(n1));
Vector p1 = SK.GetEntity(gs.face[1])->FaceGetPointNum(); 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)); double theta = acos(n0.Dot(n1));
Printf(true, " angle = %Fi%2%E degrees", theta*180/PI); Printf(true, " angle = %Fi%2%E degrees", theta*180/PI);

View File

@ -400,15 +400,24 @@ Expr *Expr::PartialWrt(hParam p) const {
ssassert(false, "Unexpected operation"); ssassert(false, "Unexpected operation");
} }
uint64_t Expr::ParamsUsed() const { void Expr::ParamsUsedList(std::vector<hParam> *list) const {
uint64_t r = 0; if(op == Op::PARAM || op == Op::PARAM_PTR) {
if(op == Op::PARAM) r |= ((uint64_t)1 << (parh.v % 61)); // leaf: just add ourselves if we aren't already there
if(op == Op::PARAM_PTR) r |= ((uint64_t)1 << (parp->h.v % 61)); 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(); int c = Children();
if(c >= 1) r |= a->ParamsUsed(); if(c >= 1) {
if(c >= 2) r |= b->ParamsUsed(); a->ParamsUsedList(list);
return r; if(c >= 2) b->ParamsUsedList(list);
}
} }
bool Expr::DependsOn(hParam p) const { bool Expr::DependsOn(hParam p) const {
@ -424,6 +433,11 @@ bool Expr::DependsOn(hParam p) const {
bool Expr::Tol(double a, double b) { bool Expr::Tol(double a, double b) {
return fabs(a - b) < 0.001; return fabs(a - b) < 0.001;
} }
bool Expr::IsZeroConst() const {
return op == Op::CONSTANT && EXACT(v == 0.0);
}
Expr *Expr::FoldConstants() { Expr *Expr::FoldConstants() {
Expr *n = AllocExpr(); Expr *n = AllocExpr();
*n = *this; *n = *this;

View File

@ -70,9 +70,10 @@ public:
Expr *PartialWrt(hParam p) const; Expr *PartialWrt(hParam p) const;
double Eval() const; double Eval() const;
uint64_t ParamsUsed() const; void ParamsUsedList(std::vector<hParam> *list) const;
bool DependsOn(hParam p) const; bool DependsOn(hParam p) const;
static bool Tol(double a, double b); static bool Tol(double a, double b);
bool IsZeroConst() const;
Expr *FoldConstants(); Expr *FoldConstants();
void Substitute(hParam oldh, hParam newh); void Substitute(hParam oldh, hParam newh);

View File

@ -550,8 +550,11 @@ void SolveSpaceUI::SolveGroup(hGroup hg, bool andFindFree) {
} }
SolveResult SolveSpaceUI::TestRankForGroup(hGroup hg, int *rank) { SolveResult SolveSpaceUI::TestRankForGroup(hGroup hg, int *rank) {
WriteEqSystemForGroup(hg);
Group *g = SK.GetGroup(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); SolveResult result = sys.SolveRank(g, rank);
FreeAllTemporary(); FreeAllTemporary();
return result; return result;

View File

@ -183,6 +183,7 @@ const MenuEntry Menu[] = {
{ 0, N_("&Help"), Command::NONE, 0, KN, mHelp }, { 0, N_("&Help"), Command::NONE, 0, KN, mHelp },
{ 1, N_("&Language"), Command::LOCALE, 0, KN, mHelp }, { 1, N_("&Language"), Command::LOCALE, 0, KN, mHelp },
{ 1, N_("&Website / Manual"), Command::WEBSITE, 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__ #ifndef __APPLE__
{ 1, N_("&About"), Command::ABOUT, 0, KN, mHelp }, { 1, N_("&About"), Command::ABOUT, 0, KN, mHelp },
#endif #endif

View File

@ -136,10 +136,14 @@ void Group::MenuGroup(Command id, Platform::Path linkFile) {
g.predef.negateV = wrkplg->predef.negateV; g.predef.negateV = wrkplg->predef.negateV;
} else if(wrkplg->subtype == Subtype::WORKPLANE_BY_POINT_ORTHO) { } else if(wrkplg->subtype == Subtype::WORKPLANE_BY_POINT_ORTHO) {
g.predef.q = wrkplg->predef.q; 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 ssassert(false, "Unexpected workplane subtype");
} }
} else if(gs.anyNormals == 1 && gs.points == 1 && gs.n == 2) { } else if(gs.anyNormals == 1 && gs.points == 1 && gs.n == 2) {
g.subtype = Subtype::WORKPLANE_BY_POINT_NORMAL; g.subtype = Subtype::WORKPLANE_BY_POINT_NORMAL;
g.predef.entityB = gs.anyNormal[0];
g.predef.q = SK.GetEntity(gs.anyNormal[0])->NormalGetNum(); g.predef.q = SK.GetEntity(gs.anyNormal[0])->NormalGetNum();
g.predef.origin = gs.point[0]; g.predef.origin = gs.point[0];
//} else if(gs.faces == 1 && gs.points == 1 && gs.n == 2) { //} else if(gs.faces == 1 && gs.points == 1 && gs.n == 2) {
@ -455,9 +459,11 @@ void Group::Generate(IdList<Entity,hEntity> *entity,
if(predef.negateU) u = u.ScaledBy(-1); if(predef.negateU) u = u.ScaledBy(-1);
if(predef.negateV) v = v.ScaledBy(-1); if(predef.negateV) v = v.ScaledBy(-1);
q = Quaternion::From(u, v); 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. // Already given, numerically.
q = predef.q; q = predef.q;
} else if(subtype == Subtype::WORKPLANE_BY_POINT_NORMAL) {
q = SK.GetEntity(predef.entityB)->NormalGetNum();
} else ssassert(false, "Unexpected workplane subtype"); } else ssassert(false, "Unexpected workplane subtype");
Entity normal = {}; Entity normal = {};

View File

@ -10,7 +10,7 @@
#define MIN_POINT_DISTANCE 0.001 #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 { class vertex {
public: public:
Vector p; Vector p;
@ -47,7 +47,7 @@ static void addUnique(std::vector<vertex> &lv, Vector &p, Vector &n) {
}; };
// Make a new point - type doesn't matter since we will make a copy later // 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 = {}; Entity en = {};
en.type = Entity::Type::POINT_N_COPY; en.type = Entity::Type::POINT_N_COPY;
en.extraPoints = 0; en.extraPoints = 0;
@ -59,7 +59,8 @@ static hEntity newPoint(EntityList *el, int id, Vector p) {
en.actVisible = true; en.actVisible = true;
en.forceHidden = false; 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); el->Add(&en);
return en.h; 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. // check if a vertex is unique and add it via newPoint if it is.
static void addVertex(EntityList *el, Vector v) { static void addVertex(EntityList *el, Vector v) {
if(el->n < 15000) { if(el->n < 15000) {
int id = el->n+2; int id = el->n;
newPoint(el, id, v); 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 = {}; Entity en = {};
en.type = Entity::Type::LINE_SEGMENT; en.type = Entity::Type::LINE_SEGMENT;
en.point[0] = p0; en.point[0] = p0;
@ -85,7 +108,8 @@ static hEntity newLine(EntityList *el, int id, hEntity p0, hEntity p1) {
en.actVisible = true; en.actVisible = true;
en.forceHidden = false; 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); el->Add(&en);
return en.h; return en.h;
} }
@ -106,6 +130,13 @@ bool LinkStl(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s
char str[80] = {}; char str[80] = {};
f.read(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 n;
uint32_t color; uint32_t color;
@ -115,9 +146,6 @@ bool LinkStl(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s
float x,y,z; float x,y,z;
float xn,yn,zn; float xn,yn,zn;
//add the STL origin as an entity
addVertex(el, Vector::From(0.0, 0.0, 0.0));
std::vector<vertex> verts = {}; std::vector<vertex> verts = {};
for(uint32_t i = 0; i<n; i++) { for(uint32_t i = 0; i<n; i++) {
@ -171,7 +199,15 @@ bool LinkStl(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s
addUnique(verts, tr.b, normal); addUnique(verts, tr.b, normal);
addUnique(verts, tr.c, normal); addUnique(verts, tr.c, normal);
} }
dbp("%d verticies", verts.size()); dbp("%d vertices", verts.size());
int id = 1;
//add the STL origin and normals
hEntity origin = newPoint(el, &id, Vector::From(0.0, 0.0, 0.0));
newNormal(el, &id, Quaternion::From(Vector::From(1,0,0),Vector::From(0,1,0)), origin);
newNormal(el, &id, Quaternion::From(Vector::From(0,1,0),Vector::From(0,0,1)), origin);
newNormal(el, &id, Quaternion::From(Vector::From(0,0,1),Vector::From(1,0,0)), origin);
BBox box = {}; BBox box = {};
box.minp = verts[0].p; box.minp = verts[0].p;
@ -183,35 +219,34 @@ bool LinkStl(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s
} }
hEntity p[8]; hEntity p[8];
int id = el->n+2; p[0] = newPoint(el, &id, Vector::From(box.minp.x, box.minp.y, box.minp.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[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[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[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[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[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[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[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[1]);
newLine(el, id++, p[0], p[2]); newLine(el, &id, p[0], p[2]);
newLine(el, id++, p[3], p[1]); newLine(el, &id, p[3], p[1]);
newLine(el, id++, p[3], p[2]); newLine(el, &id, p[3], p[2]);
newLine(el, id++, p[4], p[5]); newLine(el, &id, p[4], p[5]);
newLine(el, id++, p[4], p[6]); newLine(el, &id, p[4], p[6]);
newLine(el, id++, p[7], p[5]); newLine(el, &id, p[7], p[5]);
newLine(el, id++, p[7], p[6]); newLine(el, &id, p[7], p[6]);
newLine(el, id++, p[0], p[4]); newLine(el, &id, p[0], p[4]);
newLine(el, id++, p[1], p[5]); newLine(el, &id, p[1], p[5]);
newLine(el, id++, p[2], p[6]); newLine(el, &id, p[2], p[6]);
newLine(el, id++, p[3], p[7]); newLine(el, &id, p[3], p[7]);
for(unsigned int i=0; i<verts.size(); i++) { for(unsigned int i=0; i<verts.size(); i++) {
// create point entities for edge vertexes // create point entities for edge vertexes
if(isEdgeVertex(verts[i])) { if(isEdgeVertex(verts[i])) {
addVertex(el, verts[i].p); addVertex(el, verts[i].p);
} }
} }

View File

@ -179,7 +179,8 @@ void Pixmap::ConvertTo(Format newFormat) {
static std::shared_ptr<Pixmap> ReadPngIntoPixmap(png_struct *png_ptr, png_info *info_ptr, static std::shared_ptr<Pixmap> ReadPngIntoPixmap(png_struct *png_ptr, png_info *info_ptr,
bool flip) { 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> pixmap = std::make_shared<Pixmap>(); std::shared_ptr<Pixmap> pixmap = std::make_shared<Pixmap>();
pixmap->width = png_get_image_width(png_ptr, info_ptr); pixmap->width = png_get_image_width(png_ptr, info_ptr);

View File

@ -175,6 +175,7 @@ public:
bool suppress; bool suppress;
bool relaxConstraints; bool relaxConstraints;
bool allowRedundant; bool allowRedundant;
bool suppressDofCalculation;
bool allDimsReference; bool allDimsReference;
double scale; double scale;
@ -622,7 +623,7 @@ public:
bool free; bool free;
// Used only in the solver // Used only in the solver
hParam substd; Param *substd;
static const hParam NO_PARAM; static const hParam NO_PARAM;

View File

@ -1053,7 +1053,11 @@ void SolveSpaceUI::MenuHelp(Command id) {
"law. For details, visit http://gnu.org/licenses/\n" "law. For details, visit http://gnu.org/licenses/\n"
"\n" "\n"
"© 2008-%d Jonathan Westhues and other authors.\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; break;
default: ssassert(false, "Unexpected menu ID"); default: ssassert(false, "Unexpected menu ID");

View File

@ -34,6 +34,10 @@
#include <unordered_set> #include <unordered_set>
#include <vector> #include <vector>
#define EIGEN_NO_DEBUG
#undef Success
#include <Eigen/SparseCore>
// We declare these in advance instead of simply using FT_Library // We declare these in advance instead of simply using FT_Library
// (defined as typedef FT_LibraryRec_* FT_Library) because including // (defined as typedef FT_LibraryRec_* FT_Library) because including
// freetype.h invokes indescribable horrors and we would like to avoid // freetype.h invokes indescribable horrors and we would like to avoid
@ -211,7 +215,7 @@ void Error(const char *fmt, ...);
class System { class System {
public: public:
enum { MAX_UNKNOWNS = 1024 }; enum { MAX_UNKNOWNS = 2048 };
EntityList entity; EntityList entity;
ParamList param; ParamList param;
@ -233,37 +237,34 @@ public:
// The system Jacobian matrix // The system Jacobian matrix
struct { struct {
// The corresponding equation for each row // The corresponding equation for each row
hEquation eq[MAX_UNKNOWNS]; std::vector<Equation *> eq;
// The corresponding parameter for each column // The corresponding parameter for each column
hParam param[MAX_UNKNOWNS]; std::vector<hParam> param;
// We're solving AX = B // We're solving AX = B
int m, n; int m, n;
struct { struct {
Expr *sym[MAX_UNKNOWNS][MAX_UNKNOWNS]; // This only observes the Expr - does not own them!
double num[MAX_UNKNOWNS][MAX_UNKNOWNS]; Eigen::SparseMatrix<Expr *> sym;
} A; Eigen::SparseMatrix<double> num;
} A;
double scale[MAX_UNKNOWNS]; Eigen::VectorXd scale;
Eigen::VectorXd X;
// Some helpers for the least squares solve
double AAt[MAX_UNKNOWNS][MAX_UNKNOWNS];
double Z[MAX_UNKNOWNS];
double X[MAX_UNKNOWNS];
struct { struct {
Expr *sym[MAX_UNKNOWNS]; // This only observes the Expr - does not own them!
double num[MAX_UNKNOWNS]; std::vector<Expr *> sym;
} B; Eigen::VectorXd num;
} B;
} mat; } mat;
static const double RANK_MAG_TOLERANCE, CONVERGE_TOLERANCE; static const double CONVERGE_TOLERANCE;
int CalculateRank(); int CalculateRank();
bool TestRank(int *rank = NULL); bool TestRank(int *dof = NULL);
static bool SolveLinearSystem(double X[], double A[][MAX_UNKNOWNS], static bool SolveLinearSystem(const Eigen::SparseMatrix<double> &A,
double B[], int N); const Eigen::VectorXd &B, Eigen::VectorXd *X);
bool SolveLeastSquares(); bool SolveLeastSquares();
bool WriteJacobian(int tag); bool WriteJacobian(int tag);
@ -279,7 +280,6 @@ public:
bool NewtonSolve(int tag); bool NewtonSolve(int tag);
void MarkParamsFree(bool findFree); void MarkParamsFree(bool findFree);
int CalculateDof();
SolveResult Solve(Group *g, int *rank = NULL, int *dof = NULL, SolveResult Solve(Group *g, int *rank = NULL, int *dof = NULL,
List<hConstraint> *bad = NULL, List<hConstraint> *bad = NULL,
@ -291,6 +291,9 @@ public:
bool andFindBad = false, bool andFindFree = false); bool andFindBad = false, bool andFindFree = false);
void Clear(); void Clear();
Param *GetLastParamSubstitution(Param *p);
void SubstituteParamsByLast(Expr *e);
void SortSubstitutionByDragged(Param *p);
}; };
#include "ttf.h" #include "ttf.h"

View File

@ -8,81 +8,152 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#include "solvespace.h" #include "solvespace.h"
// This tolerance is used to determine whether two (linearized) constraints #include <Eigen/Core>
// are linearly dependent. If this is too small, then we will attempt to #include <Eigen/SparseQR>
// 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;
// The solver will converge all unknowns to within this tolerance. This must // 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. // always be much less than LENGTH_EPS, and in practice should be much less.
const double System::CONVERGE_TOLERANCE = (LENGTH_EPS/(1e2)); const double System::CONVERGE_TOLERANCE = (LENGTH_EPS/(1e2));
constexpr size_t LikelyPartialCountPerEq = 10;
bool System::WriteJacobian(int tag) { 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(Param &p : param) {
for(auto &p : param) { if(p.tag != tag) continue;
if(j >= MAX_UNKNOWNS) mat.param.push_back(p.h);
return false;
if(p.tag != tag)
continue;
mat.param[j] = p.h;
j++;
} }
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) { // Fill the param id to index map
if(i >= MAX_UNKNOWNS) return false; std::map<uint32_t, int> paramToIndex;
for(int j = 0; j < mat.n; j++) {
paramToIndex[mat.param[j].v] = j;
}
if(e.tag != tag) if(mat.eq.size() >= MAX_UNKNOWNS) {
continue; return false;
}
std::vector<hParam> 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(&param, &(SK.param));
mat.eq[i] = e.h; paramsUsed.clear();
Expr *f = e.e->DeepCopyWithParamsAsPointers(&param, &(SK.param)); f->ParamsUsedList(&paramsUsed);
f = f->FoldConstants();
// Hash table (61 bits) to accelerate generation of zero partials. for(hParam &p : paramsUsed) {
uint64_t scoreboard = f->ParamsUsed(); // Find the index of this parameter
for(j = 0; j < mat.n; j++) { auto it = paramToIndex.find(p.v);
Expr *pd; if(it == paramToIndex.end()) continue;
if(scoreboard & ((uint64_t)1 << (mat.param[j].v % 61)) && // this is the parameter index
f->DependsOn(mat.param[j])) const int j = it->second;
{ // compute partial derivative of f
pd = f->PartialWrt(mat.param[j]); Expr *pd = f->PartialWrt(p);
pd = pd->FoldConstants(); pd = pd->FoldConstants();
pd = pd->DeepCopyWithParamsAsPointers(&param, &(SK.param)); if(pd->IsZeroConst())
} else { continue;
pd = Expr::From(0.0); mat.A.sym.insert(i, j) = pd;
}
mat.A.sym[i][j] = pd;
} }
mat.B.sym[i] = f; paramsUsed.clear();
i++; mat.B.sym.push_back(f);
} }
mat.m = i;
return true; return true;
} }
void System::EvalJacobian() { void System::EvalJacobian() {
int i, j; using namespace Eigen;
for(i = 0; i < mat.m; i++) { mat.A.num.setZero();
for(j = 0; j < mat.n; j++) { mat.A.num.resize(mat.m, mat.n);
mat.A.num[i][j] = (mat.A.sym[i][j])->Eval(); const int size = mat.A.sym.outerSize();
for(int k = 0; k < size; k++) {
for(SparseMatrix <Expr *>::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) { bool System::IsDragged(hParam p) {
hParam *pp; const auto b = dragged.begin();
for(pp = dragged.First(); pp; pp = dragged.NextAfter(pp)) { const auto e = dragged.end();
if(p == *pp) return true; 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<Param *> 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() { void System::SolveBySubstitution() {
@ -102,172 +173,114 @@ void System::SolveBySubstitution() {
continue; continue;
} }
if(IsDragged(a)) { if(a.v == b.v) {
// A is being dragged, so A should stay, and B should go teq.tag = EQ_SUBSTITUTED;
std::swap(a, b); continue;
} }
for(auto &req : eq) { Param *pa = param.FindById(a);
req.e->Substitute(a, b); // A becomes B, B unchanged Param *pb = param.FindById(b);
}
for(auto &rp : param) { // Take the last substitution of parameter a
if(rp.substd == a) { // This resulted in creation of substitution chains
rp.substd = b; 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; teq.tag = EQ_SUBSTITUTED;
} }
} }
}
//----------------------------------------------------------------------------- //
// Calculate the rank of the Jacobian matrix, by Gram-Schimdt orthogonalization for(Param &p : param) {
// in place. A row (~equation) is considered to be all zeros if its magnitude SortSubstitutionByDragged(&p);
// 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;
} }
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 <SparseMatrix<double>, COLAMDOrdering<int>> solver;
solver.compute(mat.A.num);
int result = solver.rank();
return result;
}
bool System::TestRank(int *dof) {
EvalJacobian(); EvalJacobian();
int jacobianRank = CalculateRank(); 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; return jacobianRank == mat.m;
} }
bool System::SolveLinearSystem(double X[], double A[][MAX_UNKNOWNS], bool System::SolveLinearSystem(const Eigen::SparseMatrix <double> &A,
double B[], int n) const Eigen::VectorXd &B, Eigen::VectorXd *X)
{ {
// Gaussian elimination, with partial pivoting. It's an error if the if(A.outerSize() == 0) return true;
// matrix is singular, because that means two constraints are using namespace Eigen;
// equivalent. SparseQR<SparseMatrix<double>, COLAMDOrdering<int>> solver;
int i, j, ip, jp, imax = 0; //SimplicialLDLT<SparseMatrix<double>> solver;
double max, temp; solver.compute(A);
*X = solver.solve(B);
for(i = 0; i < n; i++) { return (solver.info() == Success);
// 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;
} }
bool System::SolveLeastSquares() { bool System::SolveLeastSquares() {
int r, c, i; using namespace Eigen;
// Scale the columns; this scale weights the parameters for the least // Scale the columns; this scale weights the parameters for the least
// squares solve, so that we can encourage the solver to make bigger // squares solve, so that we can encourage the solver to make bigger
// changes in some parameters, and smaller in others. // 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])) { if(IsDragged(mat.param[c])) {
// It's least squares, so this parameter doesn't need to be all // It's least squares, so this parameter doesn't need to be all
// that big to get a large effect. // that big to get a large effect.
mat.scale[c] = 1/20.0; 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];
} }
} }
// Write A*A' const int size = mat.A.num.outerSize();
for(r = 0; r < mat.m; r++) { for(int k = 0; k < size; k++) {
for(c = 0; c < mat.m; c++) { // yes, AAt is square for(SparseMatrix<double>::InnerIterator it(mat.A.num, k); it; ++it) {
double sum = 0; it.valueRef() *= mat.scale[it.col()];
for(i = 0; i < mat.n; i++) {
sum += mat.A.num[r][i]*mat.A.num[c][i];
}
mat.AAt[r][c] = sum;
} }
} }
if(!SolveLinearSystem(mat.Z, mat.AAt, mat.B.num, mat.m)) return false; SparseMatrix<double> AAt = mat.A.num * mat.A.num.transpose();
AAt.makeCompressed();
VectorXd z(mat.n);
// And multiply that by A' to get our solution. if(!SolveLinearSystem(AAt, mat.B.num, &z)) return false;
for(c = 0; c < mat.n; c++) {
double sum = 0; mat.X = mat.A.num.transpose() * z;
for(i = 0; i < mat.m; i++) {
sum += mat.A.num[i][c]*mat.Z[i]; for(int c = 0; c < mat.n; c++) {
} mat.X[c] *= mat.scale[c];
mat.X[c] = sum * mat.scale[c];
} }
return true; return true;
} }
@ -279,6 +292,7 @@ bool System::NewtonSolve(int tag) {
int i; int i;
// Evaluate the functions at our operating point. // Evaluate the functions at our operating point.
mat.B.num = Eigen::VectorXd(mat.m);
for(i = 0; i < mat.m; i++) { for(i = 0; i < mat.m; i++) {
mat.B.num[i] = (mat.B.sym[i])->Eval(); mat.B.num[i] = (mat.B.sym[i])->Eval();
} }
@ -405,26 +419,26 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List<hConstraint> *bad,
{ {
WriteEquationsExceptFor(Constraint::NO_CONSTRAINT, g); WriteEquationsExceptFor(Constraint::NO_CONSTRAINT, g);
int i;
bool rankOk; bool rankOk;
/* /*
int x;
dbp("%d equations", eq.n); dbp("%d equations", eq.n);
for(i = 0; i < eq.n; i++) { for(x = 0; x < eq.n; x++) {
dbp(" %.3f = %s = 0", eq[i].e->Eval(), eq[i].e->Print()); dbp(" %.3f = %s = 0", eq[x].e->Eval(), eq[x].e->Print());
} }
dbp("%d parameters", param.n); dbp("%d parameters", param.n);
for(i = 0; i < param.n; i++) { for(x = 0; x < param.n; x++) {
dbp(" param %08x at %.3f", param[i].h.v, param[i].val); dbp(" param %08x at %.3f", param[x].h.v, param[x].val);
} */ } */
// All params and equations are assigned to group zero. // All params and equations are assigned to group zero.
param.ClearTags(); param.ClearTags();
eq.ClearTags(); eq.ClearTags();
// Solving by substitution eliminates duplicate e.g. H/V constraints, which can cause rank test // Since we are suppressing dof calculation or allowing redundant, we
// to succeed even on overdefined systems, which will fail later. // can't / don't want to catch result of dof checking without substitution
if(!forceDofCheck) { if(g->suppressDofCalculation || g->allowRedundant || !forceDofCheck) {
SolveBySubstitution(); SolveBySubstitution();
} }
@ -462,22 +476,21 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List<hConstraint> *bad,
if(!WriteJacobian(0)) { if(!WriteJacobian(0)) {
return SolveResult::TOO_MANY_UNKNOWNS; return SolveResult::TOO_MANY_UNKNOWNS;
} }
// Clear dof value in order to have indication when dof is actually not calculated
rankOk = TestRank(rank); 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 // And do the leftovers as one big system
if(!NewtonSolve(0)) { if(!NewtonSolve(0)) {
goto didnt_converge; 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(!rankOk) {
if(andFindBad) FindWhichToRemoveToFixJacobian(g, bad, forceDofCheck); if(andFindBad) FindWhichToRemoveToFixJacobian(g, bad, forceDofCheck);
} else { } 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); MarkParamsFree(andFindFree);
} }
// System solved correctly, so write the new values back in to the // 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<hConstraint> *bad,
for(auto &p : param) { for(auto &p : param) {
double val; double val;
if(p.tag == VAR_SUBSTITUTED) { if(p.tag == VAR_SUBSTITUTED) {
val = param.FindById(p.substd)->val; val = p.substd->val;
} else { } else {
val = p.val; val = p.val;
} }
@ -499,12 +512,12 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List<hConstraint> *bad,
didnt_converge: didnt_converge:
SK.constraint.ClearTags(); SK.constraint.ClearTags();
// Not using range-for here because index is used in additional ways // 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])) { if(fabs(mat.B.num[i]) > CONVERGE_TOLERANCE || IsReasonable(mat.B.num[i])) {
// This constraint is unsatisfied. // 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); ConstraintBase *c = SK.constraint.FindByIdNoOops(hc);
if(!c) continue; if(!c) continue;
// Don't double-show constraints that generated multiple // Don't double-show constraints that generated multiple
@ -534,11 +547,14 @@ SolveResult System::SolveRank(Group *g, int *rank, int *dof, List<hConstraint> *
return SolveResult::TOO_MANY_UNKNOWNS; return SolveResult::TOO_MANY_UNKNOWNS;
} }
bool rankOk = TestRank(rank); bool rankOk = TestRank(dof);
if(!rankOk) { 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 { } else {
if(dof) *dof = CalculateDof();
MarkParamsFree(andFindFree); MarkParamsFree(andFindFree);
} }
return rankOk ? SolveResult::OKAY : SolveResult::REDUNDANT_OKAY; return rankOk ? SolveResult::OKAY : SolveResult::REDUNDANT_OKAY;
@ -549,6 +565,8 @@ void System::Clear() {
param.Clear(); param.Clear();
eq.Clear(); eq.Clear();
dragged.Clear(); dragged.Clear();
mat.A.num.setZero();
mat.A.sym.setZero();
} }
void System::MarkParamsFree(bool find) { void System::MarkParamsFree(bool find) {
@ -573,7 +591,3 @@ void System::MarkParamsFree(bool find) {
} }
} }
int System::CalculateDof() {
return mat.n - mat.m;
}

View File

@ -261,6 +261,8 @@ void TextWindow::ScreenChangeGroupOption(int link, uint32_t v) {
case 'e': g->allowRedundant = !(g->allowRedundant); break; case 'e': g->allowRedundant = !(g->allowRedundant); break;
case 'D': g->suppressDofCalculation = !(g->suppressDofCalculation); break;
case 'v': g->visible = !(g->visible); break; case 'v': g->visible = !(g->visible); break;
case 'd': g->allDimsReference = !(g->allDimsReference); break; case 'd': g->allDimsReference = !(g->allDimsReference); break;
@ -511,6 +513,10 @@ void TextWindow::ShowGroupInfo() {
&TextWindow::ScreenChangeGroupOption, &TextWindow::ScreenChangeGroupOption,
g->allowRedundant ? CHECK_TRUE : CHECK_FALSE); 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", Printf(false, " %f%Ld%Fd%s treat all dimensions as reference",
&TextWindow::ScreenChangeGroupOption, &TextWindow::ScreenChangeGroupOption,
g->allDimsReference ? CHECK_TRUE : CHECK_FALSE); g->allDimsReference ? CHECK_TRUE : CHECK_FALSE);

View File

@ -235,6 +235,7 @@ void TextWindow::Init() {
using namespace std::placeholders; using namespace std::placeholders;
window->onClose = []() { window->onClose = []() {
SS.TW.HideEditControl();
SS.GW.showTextWindow = false; SS.GW.showTextWindow = false;
SS.GW.EnsureValidActives(); SS.GW.EnsureValidActives();
}; };

View File

@ -11,7 +11,7 @@
#include FT_ADVANCES_H #include FT_ADVANCES_H
/* Yecch. Irritatingly, you need to do this nonsense to get the error string table, /* 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__ #undef __FTERRORS_H__
#define FT_ERRORDEF(e, v, s) { (e), (s) }, #define FT_ERRORDEF(e, v, s) { (e), (s) },
#define FT_ERROR_START_LIST #define FT_ERROR_START_LIST

View File

@ -172,6 +172,7 @@ enum class Command : uint32_t {
// Help // Help
LOCALE, LOCALE,
WEBSITE, WEBSITE,
GITHUB,
ABOUT, ABOUT,
}; };