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
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 \
zlib1g-dev libpng-dev libcairo2-dev libfreetype6-dev libjson-c-dev \
libfontconfig1-dev libgtkmm-3.0-dev libpangomm-1.4-dev libgl-dev \
libgl-dev libglu-dev libspnav-dev
libgl-dev libglu-dev libspnav-dev
git submodule update --init extlib/libdxfrw extlib/mimalloc
git submodule update --init extlib/libdxfrw extlib/mimalloc extlib/eigen

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-*/
/*.slvs
.vscode/
# Visual Studio
out/
.vs/
CMakeSettings.json

3
.gitmodules vendored
View File

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

View File

@ -23,6 +23,17 @@ Sketching:
MISC:
* Add a link to the GitHub commit from which SolveSpace was built in the Help
menu.
* Make all points, vectors and normals shown in the Property Browser into
active links. This makes them explorable and selectable.
* Load 16bit PNG images correctly by re-scaling to 8bit.
* Fixed hang when trying to display characters missing from the embedded font.
* The main window vertical size can be as small as the toolbar.
* Configurable "SafeHeight" parameter instead of the fixed 5mm for G-code export.
* Add Spanish / Argentina translation.
* Move "perspective factor", "lighting direction" and "explode distance" from
the "configuration" screen to the "view" screen.
* Add a "∆" suffix to groups which have "force to triangle mesh" ticked
* Gray the group name in the text window for groups with suppressed solid model.
* Added the ability to Link STL files.
@ -30,6 +41,10 @@ MISC:
Performance:
* Speed up sketches with many constraints by roughly 8x by using the Eigen
library in the solver. The maximum unknowns increased from 1024 to 2048.
* Add a "suppress dof calculation" setting to groups - increases performance for
complex sketches.
* More changes to the ID list implementation.
3.0

View File

@ -8,10 +8,9 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
" mkdir build && cd build && cmake ..")
endif()
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
list(APPEND CMAKE_MODULE_PATH
"${CMAKE_SOURCE_DIR}/cmake/")
cmake_policy(SET CMP0048 OLD)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED YES)
@ -39,10 +38,10 @@ include(GetGitCommitHash)
# and instead uncomment the following, adding the complete git hash of the checkout you are using:
# set(GIT_COMMIT_HASH 0000000000000000000000000000000000000000)
set(solvespace_VERSION_MAJOR 3)
set(solvespace_VERSION_MINOR 0)
string(SUBSTRING "${GIT_COMMIT_HASH}" 0 8 solvespace_GIT_HASH)
project(solvespace LANGUAGES C CXX ASM)
project(solvespace
VERSION 3.0
LANGUAGES C CXX ASM)
set(ENABLE_GUI ON CACHE BOOL
"Whether the graphical interface is enabled")
@ -56,8 +55,11 @@ set(ENABLE_SANITIZERS OFF CACHE BOOL
"Whether to enable Clang's AddressSanitizer and UndefinedBehaviorSanitizer")
set(ENABLE_OPENMP OFF CACHE BOOL
"Whether geometric operations will be parallelized using OpenMP")
set(ENABLE_LTO OFF CACHE BOOL
set(ENABLE_LTO OFF CACHE BOOL
"Whether interprocedural (global) optimizations are enabled")
option(FORCE_VENDORED_Eigen3
"Whether we should use our bundled Eigen even in the presence of a system copy"
OFF)
set(OPENGL 3 CACHE STRING "OpenGL version to use (one of: 1 3)")
@ -114,7 +116,12 @@ endif()
if(ENABLE_OPENMP)
find_package( OpenMP REQUIRED )
if(OPENMP_FOUND)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
add_library(slvs_openmp INTERFACE)
target_compile_options(slvs_openmp INTERFACE ${OpenMP_CXX_FLAGS})
target_link_libraries(slvs_openmp INTERFACE
${OpenMP_CXX_LIBRARIES})
target_include_directories(slvs_openmp INTERFACE SYSTEM
${OpenMP_CXX_INCLUDE_DIRS})
message(STATUS "found OpenMP, compiling with flags: " ${OpenMP_CXX_FLAGS} )
endif()
endif()
@ -178,6 +185,9 @@ endif()
message(STATUS "Using in-tree libdxfrw")
add_subdirectory(extlib/libdxfrw)
message(STATUS "Using in-tree eigen")
include_directories(extlib/eigen)
message(STATUS "Using in-tree mimalloc")
set(MI_OVERRIDE OFF CACHE BOOL "")
set(MI_BUILD_SHARED OFF CACHE BOOL "")
@ -186,6 +196,18 @@ set(MI_BUILD_TESTS OFF CACHE BOOL "")
add_subdirectory(extlib/mimalloc EXCLUDE_FROM_ALL)
set(MIMALLOC_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/extlib/mimalloc/include)
if(NOT FORCE_VENDORED_Eigen3)
find_package(Eigen3 CONFIG)
endif()
if(FORCE_VENDORED_Eigen3 OR NOT EIGEN3_FOUND)
message(STATUS "Using in-tree Eigen")
set(EIGEN3_FOUND YES)
set(EIGEN3_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/extlib/eigen)
else()
message(STATUS "Using system Eigen: ${EIGEN3_INCLUDE_DIRS}")
endif()
if(WIN32 OR APPLE)
# On Win32 and macOS we use vendored packages, since there is little to no benefit
# to trying to find system versions. In particular, trying to link to libraries from
@ -281,7 +303,6 @@ if(ENABLE_GUI)
elseif(APPLE)
find_package(OpenGL REQUIRED)
find_library(APPKIT_LIBRARY AppKit REQUIRED)
set(util_LIBRARIES ${APPKIT_LIBRARY})
else()
find_package(OpenGL REQUIRED)
find_package(SpaceWare)

View File

@ -25,9 +25,9 @@ IRC channel [#solvespace at web.libera.chat][ssirc].
## Installation
### Via official binary packages
### Via Official Packages
_Official_ release binary packages for macOS (>=10.6 64-bit) and Windows
_Official_ release packages for macOS (>=10.6 64-bit) and Windows
(>=Vista 32-bit) are available via [GitHub releases][rel]. These packages are
automatically built by the SolveSpace maintainers for each stable release.
@ -53,15 +53,6 @@ snap install solvespace
snap install solvespace --edge
```
### Via third-party binary packages
_Third-party_ nightly binary packages for Debian and Ubuntu are available via
[notesalexp.org][notesalexp]. These packages are automatically built from
non-released source code. The SolveSpace maintainers do not control the contents
of these packages and cannot guarantee their functionality.
[notesalexp]: https://notesalexp.org/packages/en/source/solvespace/
### Via automated edge builds
> :warning: **Edge builds might be unstable or contain severe bugs!**
@ -77,6 +68,15 @@ from the following links:
Extract the downloaded archive and install or execute the contained file as is
appropriate for your platform.
### Via third-party packages
_Third-party_ nightly binary packages for Debian and Ubuntu are available via
[notesalexp.org][notesalexp]. These packages are automatically built from
non-released source code. The SolveSpace maintainers do not control the contents
of these packages and cannot guarantee their functionality.
[notesalexp]: https://notesalexp.org/packages/en/source/solvespace/
### Via source code
See below.
@ -111,7 +111,7 @@ Before building, check out the project and the necessary submodules:
```sh
git clone https://github.com/solvespace/solvespace
cd solvespace
git submodule update --init extlib/libdxfrw extlib/mimalloc
git submodule update --init extlib/libdxfrw extlib/mimalloc extlib/eigen
```
After that, build SolveSpace as following:
@ -171,11 +171,11 @@ Space Navigator support will not be available.
## Building on macOS
You will need git, XCode tools and CMake. Git and CMake can be installed
You will need git, XCode tools, CMake and libomp. Git, CMake and libomp can be installed
via [Homebrew][]:
```sh
brew install git cmake
brew install git cmake libomp
```
XCode has to be installed via AppStore or [the Apple website][appledeveloper];
@ -230,7 +230,7 @@ Before building, check out the project and the necessary submodules:
```sh
git clone https://github.com/solvespace/solvespace
cd solvespace
git submodule update --init extlib/libdxfrw extlib/mimalloc
git submodule update --init extlib/libdxfrw extlib/mimalloc extlib/eigen
```
After that, build SolveSpace as following:

View File

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

View File

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

1
extlib/eigen Submodule

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

View File

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

View File

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

View File

@ -2,12 +2,12 @@
# Copyright (C) 2017 the SolveSpace authors
# This file is distributed under the same license as the SolveSpace package.
# Automatically generated, 2017.
#
#
msgid ""
msgstr ""
"Project-Id-Version: SolveSpace 3.0\n"
"Report-Msgid-Bugs-To: whitequark@whitequark.org\n"
"POT-Creation-Date: 2021-09-26 16:25-0400\n"
"POT-Creation-Date: 2022-02-01 16:24+0200\n"
"PO-Revision-Date: 2017-01-05 10:30+0000\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@ -35,7 +35,7 @@ msgstr "Clipboard is empty; nothing to paste."
msgid "Number of copies to paste must be at least one."
msgstr "Number of copies to paste must be at least one."
#: clipboard.cpp:389 textscreens.cpp:827
#: clipboard.cpp:389 textscreens.cpp:833
msgid "Scale cannot be zero."
msgstr "Scale cannot be zero."
@ -63,15 +63,15 @@ msgstr "Too many items to paste; split this into smaller pastes."
msgid "No workplane active."
msgstr "No workplane active."
#: confscreen.cpp:376
#: confscreen.cpp:381
msgid "Bad format: specify coordinates as x, y, z"
msgstr "Bad format: specify coordinates as x, y, z"
#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858
#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864
msgid "Bad format: specify color as r, g, b"
msgstr "Bad format: specify color as r, g, b"
#: confscreen.cpp:412
#: confscreen.cpp:417
msgid ""
"The perspective factor will have no effect until you enable View -> Use "
"Perspective Projection."
@ -79,24 +79,24 @@ msgstr ""
"The perspective factor will have no effect until you enable View -> Use "
"Perspective Projection."
#: confscreen.cpp:430 confscreen.cpp:440
#: confscreen.cpp:435 confscreen.cpp:445
#, c-format
msgid "Specify between 0 and %d digits after the decimal."
msgstr "Specify between 0 and %d digits after the decimal."
#: confscreen.cpp:452
#: confscreen.cpp:457
msgid "Export scale must not be zero!"
msgstr "Export scale must not be zero!"
#: confscreen.cpp:464
#: confscreen.cpp:469
msgid "Cutter radius offset must not be negative!"
msgstr "Cutter radius offset must not be negative!"
#: confscreen.cpp:518
#: confscreen.cpp:528
msgid "Bad value: autosave interval should be positive"
msgstr "Bad value: autosave interval should be positive"
#: confscreen.cpp:521
#: confscreen.cpp:531
msgid "Bad format: specify interval in integral minutes"
msgstr "Bad format: specify interval in integral minutes"
@ -677,7 +677,7 @@ msgctxt "button"
msgid "&No"
msgstr "&No"
#: file.cpp:877 solvespace.cpp:610
#: file.cpp:877 solvespace.cpp:611
msgctxt "button"
msgid "&Cancel"
msgstr "&Cancel"
@ -1130,24 +1130,28 @@ msgstr "&Language"
msgid "&Website / Manual"
msgstr "&Website / Manual"
#: graphicswin.cpp:187
#: graphicswin.cpp:186
msgid "&Go to GitHub commit"
msgstr "&Go to GitHub commit"
#: graphicswin.cpp:188
msgid "&About"
msgstr "&About"
#: graphicswin.cpp:361
#: graphicswin.cpp:362
msgid "(no recent files)"
msgstr "(no recent files)"
#: graphicswin.cpp:369
#: graphicswin.cpp:370
#, c-format
msgid "File '%s' does not exist."
msgstr "File '%s' does not exist."
#: graphicswin.cpp:736
#: graphicswin.cpp:737
msgid "No workplane is active, so the grid will not appear."
msgstr "No workplane is active, so the grid will not appear."
#: graphicswin.cpp:751
#: graphicswin.cpp:752
msgid ""
"The perspective factor is set to zero, so the view will always be a parallel "
"projection.\n"
@ -1161,17 +1165,17 @@ msgstr ""
"For a perspective projection, modify the perspective factor in the "
"configuration screen. A value around 0.3 is typical."
#: graphicswin.cpp:836
#: graphicswin.cpp:837
msgid ""
"Select a point; this point will become the center of the view on screen."
msgstr ""
"Select a point; this point will become the center of the view on screen."
#: graphicswin.cpp:1136
#: graphicswin.cpp:1137
msgid "No additional entities share endpoints with the selected entities."
msgstr "No additional entities share endpoints with the selected entities."
#: graphicswin.cpp:1154
#: graphicswin.cpp:1155
msgid ""
"To use this command, select a point or other entity from an linked part, or "
"make a link group the active group."
@ -1179,7 +1183,7 @@ msgstr ""
"To use this command, select a point or other entity from an linked part, or "
"make a link group the active group."
#: graphicswin.cpp:1177
#: graphicswin.cpp:1178
msgid ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) "
"to define the plane for the snap grid."
@ -1187,7 +1191,7 @@ msgstr ""
"No workplane is active. Activate a workplane (with Sketch -> In Workplane) "
"to define the plane for the snap grid."
#: graphicswin.cpp:1184
#: graphicswin.cpp:1185
msgid ""
"Can't snap these items to grid; select points, text comments, or constraints "
"with a label. To snap a line, select its endpoints."
@ -1195,11 +1199,11 @@ msgstr ""
"Can't snap these items to grid; select points, text comments, or constraints "
"with a label. To snap a line, select its endpoints."
#: graphicswin.cpp:1269
#: graphicswin.cpp:1270
msgid "No workplane selected. Activating default workplane for this group."
msgstr "No workplane selected. Activating default workplane for this group."
#: graphicswin.cpp:1272
#: graphicswin.cpp:1273
msgid ""
"No workplane is selected, and the active group does not have a default "
"workplane. Try selecting a workplane, or activating a sketch-in-new-"
@ -1209,7 +1213,7 @@ msgstr ""
"workplane. Try selecting a workplane, or activating a sketch-in-new-"
"workplane group."
#: graphicswin.cpp:1293
#: graphicswin.cpp:1294
msgid ""
"Bad selection for tangent arc at point. Select a single point, or select "
"nothing to set up arc parameters."
@ -1217,47 +1221,47 @@ msgstr ""
"Bad selection for tangent arc at point. Select a single point, or select "
"nothing to set up arc parameters."
#: graphicswin.cpp:1304
#: graphicswin.cpp:1305
msgid "click point on arc (draws anti-clockwise)"
msgstr "click point on arc (draws anti-clockwise)"
#: graphicswin.cpp:1305
#: graphicswin.cpp:1306
msgid "click to place datum point"
msgstr "click to place datum point"
#: graphicswin.cpp:1306
#: graphicswin.cpp:1307
msgid "click first point of line segment"
msgstr "click first point of line segment"
#: graphicswin.cpp:1308
#: graphicswin.cpp:1309
msgid "click first point of construction line segment"
msgstr "click first point of construction line segment"
#: graphicswin.cpp:1309
#: graphicswin.cpp:1310
msgid "click first point of cubic segment"
msgstr "click first point of cubic segment"
#: graphicswin.cpp:1310
#: graphicswin.cpp:1311
msgid "click center of circle"
msgstr "click center of circle"
#: graphicswin.cpp:1311
#: graphicswin.cpp:1312
msgid "click origin of workplane"
msgstr "click origin of workplane"
#: graphicswin.cpp:1312
#: graphicswin.cpp:1313
msgid "click one corner of rectangle"
msgstr "click one corner of rectangle"
#: graphicswin.cpp:1313
#: graphicswin.cpp:1314
msgid "click top left of text"
msgstr "click top left of text"
#: graphicswin.cpp:1319
#: graphicswin.cpp:1320
msgid "click top left of image"
msgstr "click top left of image"
#: graphicswin.cpp:1345
#: graphicswin.cpp:1346
msgid ""
"No entities are selected. Select entities before trying to toggle their "
"construction state."
@ -1416,6 +1420,10 @@ msgstr "contour is self-intersecting!"
msgid "zero-length edge!"
msgstr "zero-length edge!"
#: importmesh.cpp:136
msgid "Text-formated STL files are not currently supported"
msgstr "Text-formated STL files are not currently supported"
#: modify.cpp:252
msgid "Must be sketching in workplane to create tangent arc."
msgstr "Must be sketching in workplane to create tangent arc."
@ -1610,7 +1618,7 @@ msgstr ""
"Can't draw image in 3d; first, activate a workplane with Sketch -> In "
"Workplane."
#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552
#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553
msgctxt "file-type"
msgid "SolveSpace models"
msgstr "SolveSpace models"
@ -1705,104 +1713,104 @@ msgctxt "file-type"
msgid "Comma-separated values"
msgstr "Comma-separated values"
#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641
#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641
msgid "untitled"
msgstr "untitled"
#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445
#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467
#: platform/guiwin.cpp:1639
msgctxt "title"
msgid "Save File"
msgstr "Save File"
#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428
#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450
#: platform/guiwin.cpp:1645
msgctxt "title"
msgid "Open File"
msgstr "Open File"
#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418
#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433
msgctxt "button"
msgid "_Cancel"
msgstr "_Cancel"
#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416
#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431
msgctxt "button"
msgid "_Save"
msgstr "_Save"
#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417
#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432
msgctxt "button"
msgid "_Open"
msgstr "_Open"
#: solvespace.cpp:170
#: solvespace.cpp:171
msgctxt "title"
msgid "Autosave Available"
msgstr "Autosave Available"
#: solvespace.cpp:171
#: solvespace.cpp:172
msgctxt "dialog"
msgid "An autosave file is available for this sketch."
msgstr "An autosave file is available for this sketch."
#: solvespace.cpp:172
#: solvespace.cpp:173
msgctxt "dialog"
msgid "Do you want to load the autosave file instead?"
msgstr "Do you want to load the autosave file instead?"
#: solvespace.cpp:173
#: solvespace.cpp:174
msgctxt "button"
msgid "&Load autosave"
msgstr "&Load autosave"
#: solvespace.cpp:175
#: solvespace.cpp:176
msgctxt "button"
msgid "Do&n't Load"
msgstr "Do&n't Load"
#: solvespace.cpp:598
#: solvespace.cpp:599
msgctxt "title"
msgid "Modified File"
msgstr "Modified File"
#: solvespace.cpp:600
#: solvespace.cpp:601
#, c-format
msgctxt "dialog"
msgid "Do you want to save the changes you made to the sketch “%s”?"
msgstr "Do you want to save the changes you made to the sketch “%s”?"
#: solvespace.cpp:603
#: solvespace.cpp:604
msgctxt "dialog"
msgid "Do you want to save the changes you made to the new sketch?"
msgstr "Do you want to save the changes you made to the new sketch?"
#: solvespace.cpp:606
#: solvespace.cpp:607
msgctxt "dialog"
msgid "Your changes will be lost if you don't save them."
msgstr "Your changes will be lost if you don't save them."
#: solvespace.cpp:607
#: solvespace.cpp:608
msgctxt "button"
msgid "&Save"
msgstr "&Save"
#: solvespace.cpp:609
#: solvespace.cpp:610
msgctxt "button"
msgid "Do&n't Save"
msgstr "Do&n't Save"
#: solvespace.cpp:630
#: solvespace.cpp:631
msgctxt "title"
msgid "(new sketch)"
msgstr "(new sketch)"
#: solvespace.cpp:637
#: solvespace.cpp:638
msgctxt "title"
msgid "Property Browser"
msgstr "Property Browser"
#: solvespace.cpp:699
#: solvespace.cpp:700
msgid ""
"Constraints are currently shown, and will be exported in the toolpath. This "
"is probably not what you want; hide them by clicking the link at the top of "
@ -1812,7 +1820,7 @@ msgstr ""
"is probably not what you want; hide them by clicking the link at the top of "
"the text window."
#: solvespace.cpp:771
#: solvespace.cpp:772
#, c-format
msgid ""
"Can't identify file type from file extension of filename '%s'; try .dxf or ."
@ -1821,19 +1829,19 @@ msgstr ""
"Can't identify file type from file extension of filename '%s'; try .dxf or ."
"dwg."
#: solvespace.cpp:823
#: solvespace.cpp:824
msgid "Constraint must have a label, and must not be a reference dimension."
msgstr "Constraint must have a label, and must not be a reference dimension."
#: solvespace.cpp:827
#: solvespace.cpp:828
msgid "Bad selection for step dimension; select a constraint."
msgstr "Bad selection for step dimension; select a constraint."
#: solvespace.cpp:851
#: solvespace.cpp:852
msgid "The assembly does not interfere, good."
msgstr "The assembly does not interfere, good."
#: solvespace.cpp:867
#: solvespace.cpp:868
#, c-format
msgid ""
"The volume of the solid model is:\n"
@ -1844,7 +1852,7 @@ msgstr ""
"\n"
" %s"
#: solvespace.cpp:876
#: solvespace.cpp:877
#, c-format
msgid ""
"\n"
@ -1857,7 +1865,7 @@ msgstr ""
"\n"
" %s"
#: solvespace.cpp:881
#: solvespace.cpp:882
msgid ""
"\n"
"\n"
@ -1869,7 +1877,7 @@ msgstr ""
"Curved surfaces have been approximated as triangles.\n"
"This introduces error, typically of around 1%."
#: solvespace.cpp:896
#: solvespace.cpp:897
#, c-format
msgid ""
"The surface area of the selected faces is:\n"
@ -1886,7 +1894,7 @@ msgstr ""
"Curves have been approximated as piecewise linear.\n"
"This introduces error, typically of around 1%%."
#: solvespace.cpp:905
#: solvespace.cpp:906
msgid ""
"This group does not contain a correctly-formed 2d closed area. It is open, "
"not coplanar, or self-intersecting."
@ -1894,7 +1902,7 @@ msgstr ""
"This group does not contain a correctly-formed 2d closed area. It is open, "
"not coplanar, or self-intersecting."
#: solvespace.cpp:917
#: solvespace.cpp:918
#, c-format
msgid ""
"The area of the region sketched in this group is:\n"
@ -1911,7 +1919,7 @@ msgstr ""
"Curves have been approximated as piecewise linear.\n"
"This introduces error, typically of around 1%%."
#: solvespace.cpp:937
#: solvespace.cpp:938
#, c-format
msgid ""
"The total length of the selected entities is:\n"
@ -1928,36 +1936,36 @@ msgstr ""
"Curves have been approximated as piecewise linear.\n"
"This introduces error, typically of around 1%%."
#: solvespace.cpp:943
#: solvespace.cpp:944
msgid "Bad selection for perimeter; select line segments, arcs, and curves."
msgstr "Bad selection for perimeter; select line segments, arcs, and curves."
#: solvespace.cpp:959
#: solvespace.cpp:960
msgid "Bad selection for trace; select a single point."
msgstr "Bad selection for trace; select a single point."
#: solvespace.cpp:986
#: solvespace.cpp:987
#, c-format
msgid "Couldn't write to '%s'"
msgstr "Couldn't write to '%s'"
#: solvespace.cpp:1016
#: solvespace.cpp:1017
msgid "The mesh is self-intersecting (NOT okay, invalid)."
msgstr "The mesh is self-intersecting (NOT okay, invalid)."
#: solvespace.cpp:1017
#: solvespace.cpp:1018
msgid "The mesh is not self-intersecting (okay, valid)."
msgstr "The mesh is not self-intersecting (okay, valid)."
#: solvespace.cpp:1019
#: solvespace.cpp:1020
msgid "The mesh has naked edges (NOT okay, invalid)."
msgstr "The mesh has naked edges (NOT okay, invalid)."
#: solvespace.cpp:1020
#: solvespace.cpp:1021
msgid "The mesh is watertight (okay, valid)."
msgstr "The mesh is watertight (okay, valid)."
#: solvespace.cpp:1023
#: solvespace.cpp:1024
#, c-format
msgid ""
"\n"
@ -1968,7 +1976,7 @@ msgstr ""
"\n"
"The model contains %d triangles, from %d surfaces."
#: solvespace.cpp:1027
#: solvespace.cpp:1028
#, c-format
msgid ""
"%s\n"
@ -1983,7 +1991,7 @@ msgstr ""
"\n"
"Zero problematic edges, good.%s"
#: solvespace.cpp:1030
#: solvespace.cpp:1031
#, c-format
msgid ""
"%s\n"
@ -1998,7 +2006,7 @@ msgstr ""
"\n"
"%d problematic edges, bad.%s"
#: solvespace.cpp:1043
#: solvespace.cpp:1044
#, c-format
msgid ""
"This is SolveSpace version %s.\n"
@ -2039,23 +2047,23 @@ msgstr ""
msgid "Style name cannot be empty"
msgstr "Style name cannot be empty"
#: textscreens.cpp:785
#: textscreens.cpp:791
msgid "Can't repeat fewer than 1 time."
msgstr "Can't repeat fewer than 1 time."
#: textscreens.cpp:789
#: textscreens.cpp:795
msgid "Can't repeat more than 999 times."
msgstr "Can't repeat more than 999 times."
#: textscreens.cpp:814
#: textscreens.cpp:820
msgid "Group name cannot be empty"
msgstr "Group name cannot be empty"
#: textscreens.cpp:866
#: textscreens.cpp:872
msgid "Opacity must be between zero and one."
msgstr "Opacity must be between zero and one."
#: textscreens.cpp:901
#: textscreens.cpp:907
msgid "Radius cannot be zero or negative."
msgstr "Radius cannot be zero or negative."

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

@ -1,6 +1,6 @@
1 VERSIONINFO
FILEVERSION ${solvespace_VERSION_MAJOR},${solvespace_VERSION_MINOR},0,0
PRODUCTVERSION ${solvespace_VERSION_MAJOR},${solvespace_VERSION_MINOR},0,0
FILEVERSION ${PROJECT_VERSION_MAJOR},${PROJECT_VERSION_MINOR},0,0
PRODUCTVERSION ${PROJECT_VERSION_MAJOR},${PROJECT_VERSION_MINOR},0,0
FILEFLAGSMASK 0
FILEFLAGS 0
FILEOS VOS_NT_WINDOWS32
@ -13,12 +13,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "The SolveSpace authors"
VALUE "ProductName", "SolveSpace"
VALUE "ProductVersion", "${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR}~${solvespace_GIT_HASH}"
VALUE "ProductVersion", "${PROJECT_VERSION}~${solvespace_GIT_HASH}"
VALUE "FileDescription", "SolveSpace, a parametric 2d/3d CAD"
VALUE "FileVersion", "${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR}~${solvespace_GIT_HASH}"
VALUE "FileVersion", "${PROJECT_VERSION}~${solvespace_GIT_HASH}"
VALUE "OriginalFilename", "solvespace.exe"
VALUE "InternalName", "solvespace"
VALUE "LegalCopyright", "(c) 2008-2021 Jonathan Westhues and other authors"
VALUE "LegalCopyright", "(c) 2008-2022 Jonathan Westhues and other authors"
END
END

View File

@ -19,32 +19,63 @@ endif()
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
${CMAKE_CURRENT_BINARY_DIR}/config.h)
# solvespace dependencies
add_library(slvs_deps INTERFACE)
target_include_directories(slvs_deps INTERFACE SYSTEM
${OPENGL_INCLUDE_DIR}
${ZLIB_INCLUDE_DIR}
${PNG_PNG_INCLUDE_DIR}
${FREETYPE_INCLUDE_DIRS}
${CAIRO_INCLUDE_DIRS}
${MIMALLOC_INCLUDE_DIR}
${EIGEN3_INCLUDE_DIRS})
target_link_libraries(slvs_deps INTERFACE
dxfrw
${ZLIB_LIBRARY}
${PNG_LIBRARY}
${FREETYPE_LIBRARY}
${CAIRO_LIBRARIES}
mimalloc-static)
if(Backtrace_FOUND)
target_include_directories(slvs_deps INTERFACE SYSTEM
${Backtrace_INCLUDE_DIRS})
target_link_libraries(slvs_deps INTERFACE
${Backtrace_LIBRARY})
endif()
if(SPACEWARE_FOUND)
target_include_directories(slvs_deps INTERFACE SYSTEM
${SPACEWARE_INCLUDE_DIR})
target_link_libraries(slvs_deps INTERFACE
${SPACEWARE_LIBRARIES})
endif()
if(ENABLE_OPENMP)
target_link_libraries(slvs_deps INTERFACE slvs_openmp)
endif()
target_compile_options(slvs_deps
INTERFACE ${COVERAGE_FLAGS})
# platform utilities
if(APPLE)
set(util_LIBRARIES
target_link_libraries(slvs_deps INTERFACE
${APPKIT_LIBRARY})
endif()
# libslvs
set(libslvs_SOURCES
add_library(slvs SHARED
solvespace.h
platform/platform.h
util.cpp
entity.cpp
expr.cpp
constraint.cpp
constrainteq.cpp
system.cpp
platform/platform.cpp)
set(libslvs_HEADERS
solvespace.h
platform/platform.h)
add_library(slvs SHARED
${libslvs_SOURCES}
${libslvs_HEADERS}
${util_SOURCES}
platform/platform.cpp
lib.cpp)
target_compile_definitions(slvs
@ -53,16 +84,11 @@ target_compile_definitions(slvs
target_include_directories(slvs
PUBLIC ${CMAKE_SOURCE_DIR}/include)
target_link_libraries(slvs
${util_LIBRARIES}
mimalloc-static)
add_dependencies(slvs
mimalloc-static)
target_link_libraries(slvs PRIVATE slvs_deps)
set_target_properties(slvs PROPERTIES
PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/slvs.h
VERSION ${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR}
VERSION ${PROJECT_VERSION}
SOVERSION 1)
if(NOT WIN32)
@ -72,70 +98,6 @@ if(NOT WIN32)
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
endif()
# solvespace dependencies
include_directories(
${OPENGL_INCLUDE_DIR}
${ZLIB_INCLUDE_DIR}
${PNG_PNG_INCLUDE_DIR}
${FREETYPE_INCLUDE_DIRS}
${CAIRO_INCLUDE_DIRS}
${MIMALLOC_INCLUDE_DIR}
${OpenMP_CXX_INCLUDE_DIRS})
if(Backtrace_FOUND)
include_directories(
${Backtrace_INCLUDE_DIRS})
endif()
if(SPACEWARE_FOUND)
include_directories(
${SPACEWARE_INCLUDE_DIR})
endif()
if(OPENGL STREQUAL 3)
set(gl_SOURCES
render/gl3shader.cpp
render/rendergl3.cpp)
elseif(OPENGL STREQUAL 1)
set(gl_SOURCES
render/rendergl1.cpp)
else()
message(FATAL_ERROR "Unsupported OpenGL version ${OPENGL}")
endif()
set(platform_SOURCES
${gl_SOURCES}
platform/entrygui.cpp)
if(WIN32)
list(APPEND platform_SOURCES
platform/guiwin.cpp)
set(platform_LIBRARIES
comctl32
${SPACEWARE_LIBRARIES})
elseif(APPLE)
add_compile_options(
-DGL_SILENCE_DEPRECATION
-fobjc-arc)
list(APPEND platform_SOURCES
platform/guimac.mm)
else()
list(APPEND platform_SOURCES
platform/guigtk.cpp)
set(platform_LIBRARIES
${SPACEWARE_LIBRARIES})
foreach(pkg_config_lib GTKMM JSONC FONTCONFIG)
include_directories(${${pkg_config_lib}_INCLUDE_DIRS})
link_directories(${${pkg_config_lib}_LIBRARY_DIRS})
list(APPEND platform_LIBRARIES ${${pkg_config_lib}_LIBRARIES})
endforeach()
endif()
set(every_platform_SOURCES
platform/guiwin.cpp
platform/guigtk.cpp
@ -143,7 +105,10 @@ set(every_platform_SOURCES
# solvespace library
set(solvespace_core_HEADERS
set(solvespace_core_gl_SOURCES
solvespace.cpp)
add_library(solvespace-core STATIC
dsc.h
expr.h
polygon.h
@ -153,9 +118,7 @@ set(solvespace_core_HEADERS
platform/platform.h
render/render.h
render/gl3shader.h
srf/surface.h)
set(solvespace_core_SOURCES
srf/surface.h
bsp.cpp
clipboard.cpp
confscreen.cpp
@ -207,40 +170,14 @@ set(solvespace_core_SOURCES
srf/surfinter.cpp
srf/triangulate.cpp)
set(solvespace_core_gl_SOURCES
solvespace.cpp)
add_library(solvespace-core STATIC
${util_SOURCES}
${solvespace_core_HEADERS}
${solvespace_core_SOURCES})
add_dependencies(solvespace-core
mimalloc-static)
target_link_libraries(solvespace-core
${OpenMP_CXX_LIBRARIES}
dxfrw
${util_LIBRARIES}
${ZLIB_LIBRARY}
${PNG_LIBRARY}
${FREETYPE_LIBRARY}
mimalloc-static)
if(Backtrace_FOUND)
target_link_libraries(solvespace-core
${Backtrace_LIBRARY})
endif()
target_compile_options(solvespace-core
PRIVATE ${COVERAGE_FLAGS})
target_link_libraries(solvespace-core PUBLIC slvs_deps)
# solvespace translations
if(HAVE_GETTEXT)
get_target_property(solvespace_core_SOURCES solvespace-core SOURCES)
set(inputs
${solvespace_core_SOURCES}
${solvespace_core_HEADERS}
${every_platform_SOURCES}
${solvespace_core_gl_SOURCES})
@ -267,7 +204,7 @@ if(HAVE_GETTEXT)
--keyword --keyword=_ --keyword=N_ --keyword=C_:2,1c --keyword=CN_:2,1c
--force-po --width=100 --sort-by-file
--package-name=SolveSpace
--package-version=${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR}
--package-version=${PROJECT_VERSION}
"--copyright-holder=the PACKAGE authors"
--msgid-bugs-address=whitequark@whitequark.org
--from-code=utf-8 --output=${gen_output_pot} ${inputs}
@ -323,52 +260,86 @@ endif()
if(ENABLE_GUI)
add_executable(solvespace WIN32 MACOSX_BUNDLE
${solvespace_core_gl_SOURCES}
${platform_SOURCES}
platform/entrygui.cpp
$<TARGET_PROPERTY:resources,EXTRA_SOURCES>)
add_dependencies(solvespace
resources)
target_link_libraries(solvespace
PRIVATE
solvespace-core
${OPENGL_LIBRARIES}
${platform_LIBRARIES}
${COVERAGE_LIBRARY})
${OPENGL_LIBRARIES})
if(MSVC)
set_target_properties(solvespace PROPERTIES
LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /INCREMENTAL:NO /OPT:REF")
# OpenGL version
if(OPENGL STREQUAL 3)
target_sources(solvespace PRIVATE
render/gl3shader.cpp
render/rendergl3.cpp)
elseif(OPENGL STREQUAL 1)
target_sources(solvespace PRIVATE
render/rendergl1.cpp)
else()
message(FATAL_ERROR "Unsupported OpenGL version ${OPENGL}")
endif()
# Platform-specific
if(WIN32)
target_sources(solvespace PRIVATE
platform/guiwin.cpp)
target_link_libraries(solvespace PRIVATE comctl32)
elseif(APPLE)
target_compile_options(solvespace PRIVATE -fobjc-arc)
target_compile_definitions(solvespace PRIVATE GL_SILENCE_DEPRECATION)
target_sources(solvespace PRIVATE
platform/guimac.mm)
set_target_properties(solvespace PROPERTIES
OUTPUT_NAME SolveSpace
XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME "YES"
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.solvespace"
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
else()
target_sources(solvespace PRIVATE
platform/guigtk.cpp)
target_include_directories(solvespace PRIVATE SYSTEM
${GTKMM_INCLUDE_DIRS}
${JSONC_INCLUDE_DIRS}
${FONTCONFIG_INCLUDE_DIRS})
target_link_directories(solvespace PRIVATE
${GTKMM_LIBRARY_DIRS}
${JSONC_LIBRARY_DIRS}
${FONTCONFIG_LIBRARY_DIRS})
target_link_libraries(solvespace PRIVATE
${GTKMM_LIBRARIES}
${JSONC_LIBRARIES}
${FONTCONFIG_LIBRARIES})
endif()
if(MSVC)
set_target_properties(solvespace PROPERTIES
LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /INCREMENTAL:NO /OPT:REF")
endif()
endif()
# solvespace headless library
set(headless_SOURCES
add_library(solvespace-headless STATIC EXCLUDE_FROM_ALL
${solvespace_core_gl_SOURCES}
platform/guinone.cpp
render/rendercairo.cpp)
add_library(solvespace-headless STATIC EXCLUDE_FROM_ALL
${solvespace_core_gl_SOURCES}
${headless_SOURCES})
target_compile_definitions(solvespace-headless
PRIVATE -DHEADLESS)
PRIVATE HEADLESS)
target_include_directories(solvespace-headless
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(solvespace-headless
solvespace-core
${CAIRO_LIBRARIES})
target_compile_options(solvespace-headless
PRIVATE ${COVERAGE_FLAGS})
PRIVATE
solvespace-core)
# solvespace command-line executable
@ -432,4 +403,4 @@ if(APPLE)
COMMENT "Bundling executable solvespace-cli"
VERBATIM)
endif()
endif()
endif()

View File

@ -1,7 +1,8 @@
#ifndef SOLVESPACE_CONFIG_H
#define SOLVESPACE_CONFIG_H
#define PACKAGE_VERSION "@solvespace_VERSION_MAJOR@.@solvespace_VERSION_MINOR@~@solvespace_GIT_HASH@"
#define PACKAGE_VERSION "@PROJECT_VERSION@~@solvespace_GIT_HASH@"
#define GIT_HASH_URL "https://github.com/solvespace/solvespace/commit/@solvespace_GIT_HASH@"
/* Non-OS X *nix only */
#define UNIX_DATADIR "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_DATAROOTDIR@/solvespace"

View File

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

View File

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

View File

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

View File

@ -550,8 +550,11 @@ void SolveSpaceUI::SolveGroup(hGroup hg, bool andFindFree) {
}
SolveResult SolveSpaceUI::TestRankForGroup(hGroup hg, int *rank) {
WriteEqSystemForGroup(hg);
Group *g = SK.GetGroup(hg);
// If we don't calculate dof or redundant is allowed, there is
// no point to solve rank because this result is not meaningful
if(g->suppressDofCalculation || g->allowRedundant) return SolveResult::OKAY;
WriteEqSystemForGroup(hg);
SolveResult result = sys.SolveRank(g, rank);
FreeAllTemporary();
return result;

View File

@ -183,6 +183,7 @@ const MenuEntry Menu[] = {
{ 0, N_("&Help"), Command::NONE, 0, KN, mHelp },
{ 1, N_("&Language"), Command::LOCALE, 0, KN, mHelp },
{ 1, N_("&Website / Manual"), Command::WEBSITE, 0, KN, mHelp },
{ 1, N_("&Go to GitHub commit"), Command::GITHUB, 0, KN, mHelp },
#ifndef __APPLE__
{ 1, N_("&About"), Command::ABOUT, 0, KN, mHelp },
#endif

View File

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

View File

@ -10,7 +10,7 @@
#define MIN_POINT_DISTANCE 0.001
// we will check for duplicate verticies and keep all their normals
// we will check for duplicate vertices and keep all their normals
class vertex {
public:
Vector p;
@ -47,7 +47,7 @@ static void addUnique(std::vector<vertex> &lv, Vector &p, Vector &n) {
};
// Make a new point - type doesn't matter since we will make a copy later
static hEntity newPoint(EntityList *el, int id, Vector p) {
static hEntity newPoint(EntityList *el, int *id, Vector p) {
Entity en = {};
en.type = Entity::Type::POINT_N_COPY;
en.extraPoints = 0;
@ -59,7 +59,8 @@ static hEntity newPoint(EntityList *el, int id, Vector p) {
en.actVisible = true;
en.forceHidden = false;
en.h.v = id + en.group.v*65536;
en.h.v = *id + en.group.v*65536;
*id = *id+1;
el->Add(&en);
return en.h;
}
@ -67,12 +68,34 @@ static hEntity newPoint(EntityList *el, int id, Vector p) {
// check if a vertex is unique and add it via newPoint if it is.
static void addVertex(EntityList *el, Vector v) {
if(el->n < 15000) {
int id = el->n+2;
newPoint(el, id, v);
int id = el->n;
newPoint(el, &id, v);
}
}
static hEntity newLine(EntityList *el, int id, hEntity p0, hEntity p1) {
static hEntity newNormal(EntityList *el, int *id, Quaternion normal, hEntity p) {
// normals have parameters, but we don't need them to make a NORMAL_N_COPY from this
Entity en = {};
en.type = Entity::Type::NORMAL_N_COPY;
en.extraPoints = 0;
en.timesApplied = 0;
en.group.v = 472;
en.actNormal = normal;
en.construction = false;
en.style.v = Style::NORMALS;
// to be visible we need to add a point.
// en.point[0] = newPoint(el, id, Vector::From(0,0,0));
en.point[0] = p;
en.actVisible = true;
en.forceHidden = false;
*id = *id+1;
en.h.v = *id + en.group.v*65536;
el->Add(&en);
return en.h;
}
static hEntity newLine(EntityList *el, int *id, hEntity p0, hEntity p1) {
Entity en = {};
en.type = Entity::Type::LINE_SEGMENT;
en.point[0] = p0;
@ -85,7 +108,8 @@ static hEntity newLine(EntityList *el, int id, hEntity p0, hEntity p1) {
en.actVisible = true;
en.forceHidden = false;
en.h.v = id + en.group.v*65536;
en.h.v = *id + en.group.v*65536;
*id = *id + 1;
el->Add(&en);
return en.h;
}
@ -106,6 +130,13 @@ bool LinkStl(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s
char str[80] = {};
f.read(str, 80);
if(0==memcmp("solid", str, 5)) {
// just returning false will trigger the warning that linked file is not present
// best solution is to add an importer for text STL.
Message(_("Text-formated STL files are not currently supported"));
return false;
}
uint32_t n;
uint32_t color;
@ -115,9 +146,6 @@ bool LinkStl(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s
float x,y,z;
float xn,yn,zn;
//add the STL origin as an entity
addVertex(el, Vector::From(0.0, 0.0, 0.0));
std::vector<vertex> verts = {};
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.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 = {};
box.minp = verts[0].p;
@ -183,35 +219,34 @@ bool LinkStl(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s
}
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[1] = newPoint(el, id++, Vector::From(box.maxp.x, box.minp.y, box.minp.z));
p[2] = newPoint(el, id++, Vector::From(box.minp.x, box.maxp.y, box.minp.z));
p[3] = newPoint(el, id++, Vector::From(box.maxp.x, box.maxp.y, box.minp.z));
p[4] = newPoint(el, id++, Vector::From(box.minp.x, box.minp.y, box.maxp.z));
p[5] = newPoint(el, id++, Vector::From(box.maxp.x, box.minp.y, box.maxp.z));
p[6] = newPoint(el, id++, Vector::From(box.minp.x, box.maxp.y, box.maxp.z));
p[7] = newPoint(el, id++, Vector::From(box.maxp.x, box.maxp.y, box.maxp.z));
p[0] = newPoint(el, &id, Vector::From(box.minp.x, box.minp.y, box.minp.z));
p[1] = newPoint(el, &id, Vector::From(box.maxp.x, box.minp.y, box.minp.z));
p[2] = newPoint(el, &id, Vector::From(box.minp.x, box.maxp.y, box.minp.z));
p[3] = newPoint(el, &id, Vector::From(box.maxp.x, box.maxp.y, box.minp.z));
p[4] = newPoint(el, &id, Vector::From(box.minp.x, box.minp.y, box.maxp.z));
p[5] = newPoint(el, &id, Vector::From(box.maxp.x, box.minp.y, box.maxp.z));
p[6] = newPoint(el, &id, Vector::From(box.minp.x, box.maxp.y, box.maxp.z));
p[7] = newPoint(el, &id, Vector::From(box.maxp.x, box.maxp.y, box.maxp.z));
newLine(el, id++, p[0], p[1]);
newLine(el, id++, p[0], p[2]);
newLine(el, id++, p[3], p[1]);
newLine(el, id++, p[3], p[2]);
newLine(el, &id, p[0], p[1]);
newLine(el, &id, p[0], p[2]);
newLine(el, &id, p[3], p[1]);
newLine(el, &id, p[3], p[2]);
newLine(el, id++, p[4], p[5]);
newLine(el, id++, p[4], p[6]);
newLine(el, id++, p[7], p[5]);
newLine(el, id++, p[7], p[6]);
newLine(el, &id, p[4], p[5]);
newLine(el, &id, p[4], p[6]);
newLine(el, &id, p[7], p[5]);
newLine(el, &id, p[7], p[6]);
newLine(el, id++, p[0], p[4]);
newLine(el, id++, p[1], p[5]);
newLine(el, id++, p[2], p[6]);
newLine(el, id++, p[3], p[7]);
newLine(el, &id, p[0], p[4]);
newLine(el, &id, p[1], p[5]);
newLine(el, &id, p[2], p[6]);
newLine(el, &id, p[3], p[7]);
for(unsigned int i=0; i<verts.size(); i++) {
// create point entities for edge vertexes
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,
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>();
pixmap->width = png_get_image_width(png_ptr, info_ptr);

View File

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

View File

@ -1053,7 +1053,11 @@ void SolveSpaceUI::MenuHelp(Command id) {
"law. For details, visit http://gnu.org/licenses/\n"
"\n"
"© 2008-%d Jonathan Westhues and other authors.\n"),
PACKAGE_VERSION, 2021);
PACKAGE_VERSION, 2022);
break;
case Command::GITHUB:
Platform::OpenInBrowser(GIT_HASH_URL);
break;
default: ssassert(false, "Unexpected menu ID");

View File

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

View File

@ -8,81 +8,152 @@
//-----------------------------------------------------------------------------
#include "solvespace.h"
// This tolerance is used to determine whether two (linearized) constraints
// are linearly dependent. If this is too small, then we will attempt to
// solve truly inconsistent systems and fail. But if it's too large, then
// we will give up on legitimate systems like a skinny right angle triangle by
// its hypotenuse and long side.
const double System::RANK_MAG_TOLERANCE = 1e-4;
#include <Eigen/Core>
#include <Eigen/SparseQR>
// The solver will converge all unknowns to within this tolerance. This must
// always be much less than LENGTH_EPS, and in practice should be much less.
const double System::CONVERGE_TOLERANCE = (LENGTH_EPS/(1e2));
constexpr size_t LikelyPartialCountPerEq = 10;
bool System::WriteJacobian(int tag) {
// Clear all
mat.param.clear();
mat.eq.clear();
mat.A.sym.setZero();
mat.B.sym.clear();
int j = 0;
for(auto &p : param) {
if(j >= MAX_UNKNOWNS)
return false;
if(p.tag != tag)
continue;
mat.param[j] = p.h;
j++;
for(Param &p : param) {
if(p.tag != tag) continue;
mat.param.push_back(p.h);
}
mat.n = j;
mat.n = mat.param.size();
int i = 0;
for(Equation &e : eq) {
if(e.tag != tag) continue;
mat.eq.push_back(&e);
}
mat.m = mat.eq.size();
mat.A.sym.resize(mat.m, mat.n);
mat.A.sym.reserve(Eigen::VectorXi::Constant(mat.n, LikelyPartialCountPerEq));
for(auto &e : eq) {
if(i >= MAX_UNKNOWNS) return false;
// Fill the param id to index map
std::map<uint32_t, int> paramToIndex;
for(int j = 0; j < mat.n; j++) {
paramToIndex[mat.param[j].v] = j;
}
if(e.tag != tag)
continue;
if(mat.eq.size() >= MAX_UNKNOWNS) {
return false;
}
std::vector<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;
Expr *f = e.e->DeepCopyWithParamsAsPointers(&param, &(SK.param));
f = f->FoldConstants();
paramsUsed.clear();
f->ParamsUsedList(&paramsUsed);
// Hash table (61 bits) to accelerate generation of zero partials.
uint64_t scoreboard = f->ParamsUsed();
for(j = 0; j < mat.n; j++) {
Expr *pd;
if(scoreboard & ((uint64_t)1 << (mat.param[j].v % 61)) &&
f->DependsOn(mat.param[j]))
{
pd = f->PartialWrt(mat.param[j]);
pd = pd->FoldConstants();
pd = pd->DeepCopyWithParamsAsPointers(&param, &(SK.param));
} else {
pd = Expr::From(0.0);
}
mat.A.sym[i][j] = pd;
for(hParam &p : paramsUsed) {
// Find the index of this parameter
auto it = paramToIndex.find(p.v);
if(it == paramToIndex.end()) continue;
// this is the parameter index
const int j = it->second;
// compute partial derivative of f
Expr *pd = f->PartialWrt(p);
pd = pd->FoldConstants();
if(pd->IsZeroConst())
continue;
mat.A.sym.insert(i, j) = pd;
}
mat.B.sym[i] = f;
i++;
paramsUsed.clear();
mat.B.sym.push_back(f);
}
mat.m = i;
return true;
}
void System::EvalJacobian() {
int i, j;
for(i = 0; i < mat.m; i++) {
for(j = 0; j < mat.n; j++) {
mat.A.num[i][j] = (mat.A.sym[i][j])->Eval();
using namespace Eigen;
mat.A.num.setZero();
mat.A.num.resize(mat.m, mat.n);
const int size = mat.A.sym.outerSize();
for(int k = 0; k < size; k++) {
for(SparseMatrix <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) {
hParam *pp;
for(pp = dragged.First(); pp; pp = dragged.NextAfter(pp)) {
if(p == *pp) return true;
const auto b = dragged.begin();
const auto e = dragged.end();
return e != std::find(b, e, p);
}
Param *System::GetLastParamSubstitution(Param *p) {
Param *current = p;
while(current->substd != NULL) {
current = current->substd;
if(current == p) {
// Break the loop
current->substd = NULL;
break;
}
}
return current;
}
void System::SortSubstitutionByDragged(Param *p) {
std::vector<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() {
@ -102,172 +173,114 @@ void System::SolveBySubstitution() {
continue;
}
if(IsDragged(a)) {
// A is being dragged, so A should stay, and B should go
std::swap(a, b);
if(a.v == b.v) {
teq.tag = EQ_SUBSTITUTED;
continue;
}
for(auto &req : eq) {
req.e->Substitute(a, b); // A becomes B, B unchanged
}
for(auto &rp : param) {
if(rp.substd == a) {
rp.substd = b;
Param *pa = param.FindById(a);
Param *pb = param.FindById(b);
// Take the last substitution of parameter a
// This resulted in creation of substitution chains
Param *last = GetLastParamSubstitution(pa);
last->substd = pb;
last->tag = VAR_SUBSTITUTED;
if(pb->substd != NULL) {
// Break the loops
GetLastParamSubstitution(pb);
// if b loop was broken
if(pb->substd == NULL) {
// Clear substitution
pb->tag = 0;
}
}
Param *ptr = param.FindById(a);
ptr->tag = VAR_SUBSTITUTED;
ptr->substd = b;
teq.tag = EQ_SUBSTITUTED;
}
}
}
//-----------------------------------------------------------------------------
// Calculate the rank of the Jacobian matrix, by Gram-Schimdt orthogonalization
// in place. A row (~equation) is considered to be all zeros if its magnitude
// is less than the tolerance RANK_MAG_TOLERANCE.
//-----------------------------------------------------------------------------
int System::CalculateRank() {
// Actually work with magnitudes squared, not the magnitudes
double rowMag[MAX_UNKNOWNS] = {};
double tol = RANK_MAG_TOLERANCE*RANK_MAG_TOLERANCE;
int i, iprev, j;
int rank = 0;
for(i = 0; i < mat.m; i++) {
// Subtract off this row's component in the direction of any
// previous rows
for(iprev = 0; iprev < i; iprev++) {
if(rowMag[iprev] <= tol) continue; // ignore zero rows
double dot = 0;
for(j = 0; j < mat.n; j++) {
dot += (mat.A.num[iprev][j]) * (mat.A.num[i][j]);
}
for(j = 0; j < mat.n; j++) {
mat.A.num[i][j] -= (dot/rowMag[iprev])*mat.A.num[iprev][j];
}
}
// Our row is now normal to all previous rows; calculate the
// magnitude of what's left
double mag = 0;
for(j = 0; j < mat.n; j++) {
mag += (mat.A.num[i][j]) * (mat.A.num[i][j]);
}
if(mag > tol) {
rank++;
}
rowMag[i] = mag;
//
for(Param &p : param) {
SortSubstitutionByDragged(&p);
}
return rank;
// Substitute all the equations
for(auto &req : eq) {
SubstituteParamsByLast(req.e);
}
// Substitute all the parameters with last substitutions
for(auto &p : param) {
if(p.substd == NULL) continue;
p.substd = GetLastParamSubstitution(p.substd);
}
}
bool System::TestRank(int *rank) {
//-----------------------------------------------------------------------------
// Calculate the rank of the Jacobian matrix
//-----------------------------------------------------------------------------
int System::CalculateRank() {
using namespace Eigen;
if(mat.n == 0 || mat.m == 0) return 0;
SparseQR <SparseMatrix<double>, COLAMDOrdering<int>> solver;
solver.compute(mat.A.num);
int result = solver.rank();
return result;
}
bool System::TestRank(int *dof) {
EvalJacobian();
int jacobianRank = CalculateRank();
if(rank) *rank = jacobianRank;
// We are calculating dof based on real rank, not mat.m.
// Using this approach we can calculate real dof even when redundant is allowed.
if(dof != NULL) *dof = mat.n - jacobianRank;
return jacobianRank == mat.m;
}
bool System::SolveLinearSystem(double X[], double A[][MAX_UNKNOWNS],
double B[], int n)
bool System::SolveLinearSystem(const Eigen::SparseMatrix <double> &A,
const Eigen::VectorXd &B, Eigen::VectorXd *X)
{
// Gaussian elimination, with partial pivoting. It's an error if the
// matrix is singular, because that means two constraints are
// equivalent.
int i, j, ip, jp, imax = 0;
double max, temp;
for(i = 0; i < n; i++) {
// We are trying eliminate the term in column i, for rows i+1 and
// greater. First, find a pivot (between rows i and N-1).
max = 0;
for(ip = i; ip < n; ip++) {
if(fabs(A[ip][i]) > max) {
imax = ip;
max = fabs(A[ip][i]);
}
}
// Don't give up on a singular matrix unless it's really bad; the
// assumption code is responsible for identifying that condition,
// so we're not responsible for reporting that error.
if(fabs(max) < 1e-20) continue;
// Swap row imax with row i
for(jp = 0; jp < n; jp++) {
swap(A[i][jp], A[imax][jp]);
}
swap(B[i], B[imax]);
// For rows i+1 and greater, eliminate the term in column i.
for(ip = i+1; ip < n; ip++) {
temp = A[ip][i]/A[i][i];
for(jp = i; jp < n; jp++) {
A[ip][jp] -= temp*(A[i][jp]);
}
B[ip] -= temp*B[i];
}
}
// We've put the matrix in upper triangular form, so at this point we
// can solve by back-substitution.
for(i = n - 1; i >= 0; i--) {
if(fabs(A[i][i]) < 1e-20) continue;
temp = B[i];
for(j = n - 1; j > i; j--) {
temp -= X[j]*A[i][j];
}
X[i] = temp / A[i][i];
}
return true;
if(A.outerSize() == 0) return true;
using namespace Eigen;
SparseQR<SparseMatrix<double>, COLAMDOrdering<int>> solver;
//SimplicialLDLT<SparseMatrix<double>> solver;
solver.compute(A);
*X = solver.solve(B);
return (solver.info() == Success);
}
bool System::SolveLeastSquares() {
int r, c, i;
using namespace Eigen;
// Scale the columns; this scale weights the parameters for the least
// squares solve, so that we can encourage the solver to make bigger
// changes in some parameters, and smaller in others.
for(c = 0; c < mat.n; c++) {
mat.scale = VectorXd::Ones(mat.n);
for(int c = 0; c < mat.n; c++) {
if(IsDragged(mat.param[c])) {
// It's least squares, so this parameter doesn't need to be all
// that big to get a large effect.
mat.scale[c] = 1/20.0;
} else {
mat.scale[c] = 1;
}
for(r = 0; r < mat.m; r++) {
mat.A.num[r][c] *= mat.scale[c];
mat.scale[c] = 1 / 20.0;
}
}
// Write A*A'
for(r = 0; r < mat.m; r++) {
for(c = 0; c < mat.m; c++) { // yes, AAt is square
double sum = 0;
for(i = 0; i < mat.n; i++) {
sum += mat.A.num[r][i]*mat.A.num[c][i];
}
mat.AAt[r][c] = sum;
const int size = mat.A.num.outerSize();
for(int k = 0; k < size; k++) {
for(SparseMatrix<double>::InnerIterator it(mat.A.num, k); it; ++it) {
it.valueRef() *= mat.scale[it.col()];
}
}
if(!SolveLinearSystem(mat.Z, mat.AAt, mat.B.num, mat.m)) return false;
SparseMatrix<double> AAt = mat.A.num * mat.A.num.transpose();
AAt.makeCompressed();
VectorXd z(mat.n);
// And multiply that by A' to get our solution.
for(c = 0; c < mat.n; c++) {
double sum = 0;
for(i = 0; i < mat.m; i++) {
sum += mat.A.num[i][c]*mat.Z[i];
}
mat.X[c] = sum * mat.scale[c];
if(!SolveLinearSystem(AAt, mat.B.num, &z)) return false;
mat.X = mat.A.num.transpose() * z;
for(int c = 0; c < mat.n; c++) {
mat.X[c] *= mat.scale[c];
}
return true;
}
@ -279,6 +292,7 @@ bool System::NewtonSolve(int tag) {
int i;
// Evaluate the functions at our operating point.
mat.B.num = Eigen::VectorXd(mat.m);
for(i = 0; i < mat.m; i++) {
mat.B.num[i] = (mat.B.sym[i])->Eval();
}
@ -405,26 +419,26 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List<hConstraint> *bad,
{
WriteEquationsExceptFor(Constraint::NO_CONSTRAINT, g);
int i;
bool rankOk;
/*
int x;
dbp("%d equations", eq.n);
for(i = 0; i < eq.n; i++) {
dbp(" %.3f = %s = 0", eq[i].e->Eval(), eq[i].e->Print());
for(x = 0; x < eq.n; x++) {
dbp(" %.3f = %s = 0", eq[x].e->Eval(), eq[x].e->Print());
}
dbp("%d parameters", param.n);
for(i = 0; i < param.n; i++) {
dbp(" param %08x at %.3f", param[i].h.v, param[i].val);
for(x = 0; x < param.n; x++) {
dbp(" param %08x at %.3f", param[x].h.v, param[x].val);
} */
// All params and equations are assigned to group zero.
param.ClearTags();
eq.ClearTags();
// Solving by substitution eliminates duplicate e.g. H/V constraints, which can cause rank test
// to succeed even on overdefined systems, which will fail later.
if(!forceDofCheck) {
// Since we are suppressing dof calculation or allowing redundant, we
// can't / don't want to catch result of dof checking without substitution
if(g->suppressDofCalculation || g->allowRedundant || !forceDofCheck) {
SolveBySubstitution();
}
@ -462,22 +476,21 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List<hConstraint> *bad,
if(!WriteJacobian(0)) {
return SolveResult::TOO_MANY_UNKNOWNS;
}
rankOk = TestRank(rank);
// Clear dof value in order to have indication when dof is actually not calculated
if(dof != NULL) *dof = -1;
// We are suppressing or allowing redundant, so we no need to catch unsolveable + redundant
rankOk = (!g->suppressDofCalculation && !g->allowRedundant) ? TestRank(dof) : true;
// And do the leftovers as one big system
if(!NewtonSolve(0)) {
goto didnt_converge;
}
rankOk = TestRank(rank);
// Here we are want to calculate dof even when redundant is allowed, so just handle suppressing
rankOk = (!g->suppressDofCalculation) ? TestRank(dof) : true;
if(!rankOk) {
if(andFindBad) FindWhichToRemoveToFixJacobian(g, bad, forceDofCheck);
} else {
// This is not the full Jacobian, but any substitutions or single-eq
// solves removed one equation and one unknown, therefore no effect
// on the number of DOF.
if(dof) *dof = CalculateDof();
MarkParamsFree(andFindFree);
}
// System solved correctly, so write the new values back in to the
@ -485,7 +498,7 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List<hConstraint> *bad,
for(auto &p : param) {
double val;
if(p.tag == VAR_SUBSTITUTED) {
val = param.FindById(p.substd)->val;
val = p.substd->val;
} else {
val = p.val;
}
@ -499,12 +512,12 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List<hConstraint> *bad,
didnt_converge:
SK.constraint.ClearTags();
// Not using range-for here because index is used in additional ways
for(i = 0; i < eq.n; i++) {
for(size_t i = 0; i < mat.eq.size(); i++) {
if(fabs(mat.B.num[i]) > CONVERGE_TOLERANCE || IsReasonable(mat.B.num[i])) {
// This constraint is unsatisfied.
if(!mat.eq[i].isFromConstraint()) continue;
if(!mat.eq[i]->h.isFromConstraint()) continue;
hConstraint hc = mat.eq[i].constraint();
hConstraint hc = mat.eq[i]->h.constraint();
ConstraintBase *c = SK.constraint.FindByIdNoOops(hc);
if(!c) continue;
// Don't double-show constraints that generated multiple
@ -534,11 +547,14 @@ SolveResult System::SolveRank(Group *g, int *rank, int *dof, List<hConstraint> *
return SolveResult::TOO_MANY_UNKNOWNS;
}
bool rankOk = TestRank(rank);
bool rankOk = TestRank(dof);
if(!rankOk) {
if(andFindBad) FindWhichToRemoveToFixJacobian(g, bad, /*forceDofCheck=*/true);
// When we are testing with redundant allowed, we don't want to have additional info
// about redundants since this test is working only for single redundant constraint
if(!g->suppressDofCalculation && !g->allowRedundant) {
if(andFindBad) FindWhichToRemoveToFixJacobian(g, bad, true);
}
} else {
if(dof) *dof = CalculateDof();
MarkParamsFree(andFindFree);
}
return rankOk ? SolveResult::OKAY : SolveResult::REDUNDANT_OKAY;
@ -549,6 +565,8 @@ void System::Clear() {
param.Clear();
eq.Clear();
dragged.Clear();
mat.A.num.setZero();
mat.A.sym.setZero();
}
void System::MarkParamsFree(bool find) {
@ -573,7 +591,3 @@ void System::MarkParamsFree(bool find) {
}
}
int System::CalculateDof() {
return mat.n - mat.m;
}

View File

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

View File

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

View File

@ -11,7 +11,7 @@
#include FT_ADVANCES_H
/* Yecch. Irritatingly, you need to do this nonsense to get the error string table,
since nobody thought to put this exact function into FreeType itsself. */
since nobody thought to put this exact function into FreeType itself. */
#undef __FTERRORS_H__
#define FT_ERRORDEF(e, v, s) { (e), (s) },
#define FT_ERROR_START_LIST

View File

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